Files
breadcrumb-the-shire/web/css/components/app-lookup-field.css
fs a26c106083 feat(helpdesk): add handover protocol management
Implement handover protocols as a new entity in the helpdesk module,
allowing users to create fillable protocol records from admin-defined
software product schemas.

Key additions:
- DB migration (helpdesk_handovers table) with tenant scope
- HandoverService with status workflow (draft/in_progress/completed/archived)
- Three-tier permissions (view/create/manage)
- Two-step creation wizard (Stripe-style assistant)
- Grid.js list page with search and status filter
- Edit/detail page with aside metadata and status controls
- Reusable core autocomplete lookup component (app-lookup-field)
- Debitor lookup data endpoint for autocomplete
- Dynamic form rendering from schema snapshots
- 11 PHPUnit tests for HandoverService
- DE+EN i18n translations (48 keys each)

Also includes: PHPStan fixes (dead code removal, stale baseline cleanup),
software product edit title improvement, fieldset simplification,
and Stripe-style hover for schema preview.

Workflow: HD-HANDOVERS-001 (.agents/runs/HD-HANDOVERS-001/)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 20:42:41 +02:00

148 lines
4.1 KiB
CSS

@layer components {
/*
* Autocomplete lookup field.
*
* A text input with a dropdown list of search results.
* Driven by data attributes via app-lookup-field.js.
*/
.app-lookup-field {
position: relative;
}
/* ── Input wrapper ──────────────────────────────────────────────────── */
.app-lookup-field-input-wrap {
position: relative;
display: flex;
align-items: center;
}
.app-lookup-field-input {
padding-right: 2.5rem;
margin-bottom: 0;
}
.app-lookup-field-input[aria-expanded="true"] {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
border-color: var(--app-primary, #635bff);
}
/* ── Clear / spinner icons ──────────────────────────────────────────── */
.app-lookup-field-indicator {
position: absolute;
right: 0.625rem;
top: 50%;
transform: translateY(-50%);
display: flex;
align-items: center;
justify-content: center;
width: 1.5rem;
height: 1.5rem;
pointer-events: none;
color: var(--app-muted-color);
}
.app-lookup-field-clear {
pointer-events: auto;
cursor: pointer;
background: none;
border: none;
padding: 0;
color: var(--app-muted-color);
font-size: var(--text-base, 1rem);
line-height: var(--leading-none);
transition: color 0.15s ease;
}
.app-lookup-field-clear:hover {
color: var(--app-color);
}
.app-lookup-field-spinner {
width: 1rem;
height: 1rem;
border: 2px solid var(--app-border);
border-top-color: var(--app-primary, #635bff);
border-radius: 50%;
animation: app-lookup-spin 0.6s linear infinite;
}
@keyframes app-lookup-spin {
to { transform: rotate(360deg); }
}
/* ── Dropdown ───────────────────────────────────────────────────────── */
.app-lookup-field-dropdown {
position: absolute;
top: 100%;
left: 0;
right: 0;
z-index: 100;
background: var(--app-card-background-color, #fff);
border: 1px solid var(--app-primary, #635bff);
border-top: none;
border-radius: 0 0 var(--app-border-radius) var(--app-border-radius);
box-shadow: 0 4px 12px rgb(0 0 0 / 0.08);
max-height: 16rem;
overflow-y: auto;
overscroll-behavior: contain;
list-style: none;
margin: 0;
padding: 0.25rem 0;
}
.app-lookup-field-dropdown[hidden] {
display: none;
}
/* ── Option items ───────────────────────────────────────────────────── */
.app-lookup-field-option {
display: flex;
flex-direction: column;
gap: 0.125rem;
padding: 0.5rem 0.75rem;
cursor: pointer;
font-size: var(--text-sm, 0.875rem);
color: var(--app-color);
transition: background-color 0.1s ease;
}
.app-lookup-field-option:hover,
.app-lookup-field-option[aria-selected="true"] {
background: color-mix(in srgb, var(--app-primary, #635bff) 8%, transparent);
}
.app-lookup-field-option[aria-selected="true"] {
color: var(--app-primary, #635bff);
}
.app-lookup-field-option-label {
font-weight: var(--font-medium, 500);
}
.app-lookup-field-option-meta {
font-size: var(--text-xs, 0.75rem);
color: var(--app-muted-color);
}
/* ── Empty / error messages ─────────────────────────────────────────── */
.app-lookup-field-message {
padding: 0.75rem;
font-size: var(--text-sm, 0.875rem);
color: var(--app-muted-color);
text-align: center;
}
/* ── Selected state ─────────────────────────────────────────────────── */
.app-lookup-field-input[data-lookup-selected] {
background: var(--app-card-background-color, #fff);
}
}