Files
fusion/packages/dashboard/app/components/QuickEntryBox.css
gsxdsm ec1a2eafcf fix(dashboard): organize board quick-add composer and expose task actions menu
- Quick-add composer: single divider, option chips grouped left
  (workflow, priority, steps, deps, models, node, agent, GitHub) and
  primary actions right-aligned (attach, fast, Save last).
- Task cards get a visible kebab button (hover on desktop, always on
  mobile) opening the same context menu as right-click, which was
  previously undiscoverable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 18:05:50 -07:00

830 lines
24 KiB
CSS

/* === Quick Entry Box === */
.quick-entry-box {
position: relative;
padding: 8px 10px;
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius);
margin-bottom: var(--space-sm);
}
.quick-entry-box:focus-within {
border-color: var(--todo);
}
/*
FNXC:DashboardTokens 2026-07-08-00:00:
--space-2xs is intentionally undefined (FN-5934 decision); the guard in
app/__tests__/space-token-defined.test.ts asserts it stays undefined. Use the
smallest defined token, --space-xs (4px), instead of reintroducing --space-2xs.
*/
.quick-entry-box--drag-over {
border-color: var(--triage);
box-shadow: 0 0 0 var(--space-xs) color-mix(in srgb, var(--triage) 35%, transparent);
}
.quick-entry-drop-target {
position: absolute;
inset: var(--space-xs);
z-index: 2;
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-xs);
padding: var(--space-sm);
border: var(--space-xs) dashed var(--triage);
border-radius: var(--radius-sm);
background: color-mix(in srgb, var(--card) 86%, var(--triage));
color: var(--text);
font-size: 0.8125rem;
font-weight: 600;
pointer-events: none;
}
.quick-entry-attach-button {
position: relative;
min-width: calc(var(--space-xl) + var(--space-xs));
gap: var(--space-xs);
}
.quick-entry-attach-count {
min-width: var(--space-md);
padding: 0 var(--space-xs);
border-radius: calc(var(--radius) * 4);
background: var(--triage);
color: var(--provider-icon-contrast);
font-size: 0.6875rem;
line-height: 1.2;
font-weight: 700;
}
@media (max-width: 768px) {
.quick-entry-drop-target {
inset: var(--space-xs);
padding: var(--space-xs);
text-align: center;
}
}
.quick-entry-input {
width: 100%;
padding: 6px 8px;
background: transparent;
border: none;
border-bottom: 1px solid var(--border);
color: var(--text);
font-size: 0.8125rem;
line-height: 1.4;
font-family: inherit;
outline: none;
resize: none;
min-height: 36px;
max-height: 200px;
transition: border-color var(--transition-fast), box-shadow var(--transition-fast), min-height 0.2s ease;
}
.quick-entry-input--expanded {
min-height: 80px;
}
/*
FNXC:QuickEntry 2026-06-22-19:25:
List view renders quick-add as a COMPACT single-line input so the box isn't tall.
Clamp the textarea to exactly one line (min-height == max-height == one line), forbid auto-grow/manual resize, and scroll overflow instead of growing.
Tighten container vertical padding so the overall box is just the one-line input height.
Board/columns omit `.quick-entry--single-line`, keeping the tall 80px + auto-grow behavior.
*/
.quick-entry--single-line {
padding-top: var(--space-xs);
padding-bottom: var(--space-xs);
}
.quick-entry-box.quick-entry--single-line .quick-entry-input,
.quick-entry-box.quick-entry--single-line .quick-entry-input--expanded {
min-height: 36px;
max-height: 36px;
overflow-y: auto;
resize: none;
}
@media (max-width: 768px) {
.quick-entry-input--expanded {
min-height: 60px;
}
}
.quick-entry-input:focus {
border-bottom-color: var(--triage);
box-shadow: 0 1px 0 0 var(--triage);
}
.quick-entry-input::placeholder {
color: var(--text-dim);
}
.quick-entry-input:disabled {
opacity: 0.6;
cursor: not-allowed;
}
/* Quick Entry Box textarea wrap for expand button positioning */
.quick-entry-textarea-wrap {
position: relative;
flex: 1;
min-width: 0;
width: 100%;
}
/*
FNXC:QuickEntry 2026-06-24-12:00:
The global `.description-with-refine textarea { padding-right: 70px }` (styles.css) reserves space for a refine button overlaid at the textarea's right edge. QuickEntryBox renders its refine action in the controls panel instead of overlaying the textarea, so inheriting that reserve creates dead right-side text space. Scope the reclaim to the quick-entry input and include the wrapper classes so this rule beats the global description rule by specificity, not source order, while TaskForm/NewTaskModal and fullscreen description textareas keep their overlay padding.
*/
.quick-entry-box .description-with-refine .quick-entry-textarea-wrap .quick-entry-input {
padding-right: var(--space-sm);
}
/* Quick Entry Box expand button - bottom-right of textarea */
.quick-entry-expand-btn {
position: absolute;
bottom: 6px;
right: 32px;
padding: 4px;
opacity: 0.6;
transition: opacity var(--transition-fast);
z-index: 1;
}
.quick-entry-expand-btn:hover {
opacity: 1;
}
/* Quick Entry Box fullscreen mode */
.quick-entry-input--fullscreen {
flex: 1;
padding-right: 70px;
min-height: unset;
resize: none;
border-radius: var(--radius-md);
font-size: 0.9375rem;
line-height: 1.6;
}
/* Quick Entry Box expanded controls */
/*
FNXC:BoardComposer 2026-07-10-12:00:
First-run review flagged TWO stacked divider lines under the composer textarea: the textarea's own
border-bottom (which doubles as the focus indicator) plus this panel's border-top. Keep the textarea
border as the SINGLE divider and drop the panel border-top/padding-top so the chip area reads as one
section under one line.
*/
.quick-entry-controls {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--space-sm);
margin-top: var(--space-sm);
flex-wrap: wrap;
}
/* Consolidated action buttons in disclosure panel */
.quick-entry-actions {
display: flex;
align-items: center;
gap: var(--space-sm);
flex-wrap: wrap;
flex: 1 1 auto;
}
/*
FNXC:BoardComposer 2026-07-10-12:00:
The action row is organized as two logical clusters instead of one undifferentiated wrap of chips:
- `.quick-entry-options-group` — task options (workflow, priority, optional steps, subtask, deps,
models, node, agent, GitHub tracking), wrapping left-to-right with one consistent chip gap.
- `.quick-entry-primary-group` — attach + Fast + Save; margin-left auto keeps it right-aligned so the
distinct Save action always ends the row (and wraps as one unit on narrow columns, never splitting
Save from its neighbors).
Chip HEIGHT consistency is already enforced by the FN-7680/FN-7683 fixed-box rule on
`.quick-entry-actions .btn` above (descendant selector — still applies inside these wrappers); these
rules only own grouping/spacing/alignment.
*/
.quick-entry-options-group {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: var(--space-xs) var(--space-sm);
flex: 1 1 auto;
min-width: 0;
}
.quick-entry-primary-group {
display: flex;
align-items: center;
flex-wrap: nowrap;
gap: var(--space-sm);
flex: 0 0 auto;
margin-left: auto;
}
/*
FNXC:QuickAddActionRow 2026-07-08-00:00:
FN-7680 — Save (`btn btn-task-create btn-sm`) rendered a different box height
than its `.quick-entry-actions` siblings. Root cause is content-height drift
across button variants, not one single property: text buttons (Save, Fast,
Subtask, the workflow/priority/deps `.dep-trigger` triggers) get an 18px line
box from the inherited body line-height at 12px font-size, while icon-only
buttons (Attach, GitHub toggle) collapse to their bare ~14px icon because
`.btn-icon` sets `line-height: 0`; separately, `.dep-trigger` buttons (Priority,
Deps, and — pre-FN-7677 — the workflow trigger) inherit the shared
`.dep-trigger, .inline-create-model-trigger` rule's shorter 3px/8px padding
instead of `.btn-sm`'s 4px/10px. Rather than chase each contributor
individually (padding, line-height, icon size) per button variant, assert one
uniform `min-height` scoped to this row: with the project-wide
`box-sizing: border-box` reset, min-height normalizes every `.btn` variant in
`.quick-entry-actions` (plus the non-`.btn` optional-steps trigger) to the same
total box height regardless of its individual content/padding, without editing
the shared `.btn`, `.btn-sm`, `.btn-icon`, `.btn-task-create`, or `.dep-trigger`
rules in styles.css (those still back InlineCreateCard/NewTaskModal/
TaskDetailModal/TaskForm). This is the desktop-width counterpart to the
existing mobile touch-target min-height block further down this file (the
"max-width: 768px" rule) — that block already applies the same
normalization pattern for mobile; this rule closes the gap for desktop widths
so the invariant holds at both breakpoints (FN-5751 lesson: no mobile-only or
desktop-only fix).
FNXC:QuickAddActionRow 2026-07-08-10:15:
FN-7683 — a bare `min-height` floor is not sufficient: it only guarantees a
button is AT LEAST that tall, it never clamps a variant whose natural content
box (line-height + padding + inline icon) already resolves TALLER than the
floor. Save (`btn btn-task-create btn-sm`) renders text plus an inline
`<Save size={12}>` icon as two separate inline boxes inside the button; that
combination, together with the inherited (non-tokenized) body line-height at
12px font-size, can resolve a content/line box taller than the
`calc(--space-xl + --space-xs)` (28px) floor, so `min-height` alone left Save
measurably taller than shorter siblings (Attach's `.btn-icon`, whose
`line-height: 0` collapses it to its bare icon). A floor cannot shrink an
over-tall variant back down — only a FIXED box height can. Upgrade the
contract: pair `min-height` with an equal `max-height` (a true fixed box, not
just a floor) and set an explicit tokenized `line-height` plus
`align-items: center` so every control's content — text-only, icon-only, or
text+icon — is vertically centered and clipped to the same resolved height
regardless of its natural content box. This keeps `box-sizing: border-box`
working as before (padding/border still absorbed into the declared height)
while guaranteeing IDENTICAL resolved height across Save, workflow trigger,
Attach, GitHub toggle, Fast, Priority, Deps, Subtask, and the optional-steps
trigger — not merely all-at-least-28px. Applies at both this desktop rule and
the mobile touch-target block below (FN-5751: never a breakpoint-only fix).
*/
.quick-entry-actions .btn,
.quick-entry-actions .wf-optional-steps-dropdown-trigger {
min-height: calc(var(--space-xl) + var(--space-xs));
max-height: calc(var(--space-xl) + var(--space-xs));
line-height: var(--line-height-tight);
align-items: center;
overflow: hidden;
}
/*
FNXC:QuickAddWorkflow 2026-06-30-00:00:
Quick-add workflow targeting sits in the action row as a compact existing-button dropdown. Use tokenized sizing/colors so the selector wraps with Save/Plan controls on narrow Board and List surfaces without introducing a separate visual hierarchy.
FNXC:QuickAddWorkflow 2026-06-30-12:38:
Operators need workflow identity at quick-add time. Render shared WorkflowIcon output inline and let no-icon custom workflows collapse without blank icon shells.
FNXC:QuickAddWorkflow 2026-06-30-14:10:
The closed selector should be compact enough to leave room for Save/Fast/Subtask controls, while the opened menu stays wide and viewport-bounded so longer workflow names remain readable.
FNXC:QuickAddWorkflow 2026-06-30-15:05:
Long workflow labels must truncate only in the closed trigger. Menu option text wraps inside the viewport-bounded menu so operators can read the full workflow name and duplicate-id subtitle.
FNXC:QuickAddWorkflow 2026-06-30-16:16:
The wide menu is portaled and fixed-positioned by QuickEntryBox so right-side board columns and mobile wrapped action rows clamp to the viewport instead of overflowing from the compact trigger anchor.
*/
.quick-entry-workflow-wrap {
position: relative;
display: inline-flex;
flex: 0 1 auto;
min-width: 0;
width: fit-content;
max-width: min(calc(var(--space-xl) * 5), 100%);
}
/*
FNXC:QuickAddWorkflow 2026-07-08-00:00:
FN-7677 — the workflow trigger shares `.btn.btn-sm.dep-trigger` classes with other surfaces (InlineCreateCard, NewTaskModal, TaskDetailModal, TaskForm), but the shared `.dep-trigger, .inline-create-model-trigger` rule in styles.css sets `padding: 3px 8px`, overriding `.btn-sm`'s `padding: 4px 10px` and making this trigger ~2px shorter than its Save/Fast/Subtask `.btn.btn-sm` siblings in `.quick-entry-actions`. Re-assert `.btn-sm`'s own padding value scoped to this selector only (do not touch the shared global `.dep-trigger` rule — other surfaces still depend on its 3px/8px sizing) so the quick-add action row reads as one uniform height.
FNXC:QuickAddWorkflow 2026-07-08-09:30:
FN-7682 — the tokenized-CSS test forbids raw px in the workflow-selector rules, so the `4px 10px` literal is replaced with `var(--space-sm) var(--space-md)` (vertical then horizontal). Height parity is unaffected: box height for this trigger is governed by the FN-7680 `.quick-entry-actions .btn, .quick-entry-actions .wf-optional-steps-dropdown-trigger { min-height: calc(var(--space-xl) + var(--space-xs)); }` normalization (desktop and the matching mobile block), not by this element's own padding — the padding only controls internal content spacing and stays at or below that min-height.
*/
.quick-entry-workflow-trigger {
display: inline-flex;
align-items: center;
justify-content: flex-start;
gap: var(--space-xs);
width: auto;
min-width: 0;
max-width: min(calc(var(--space-xl) * 5), calc(100vw - var(--space-lg)));
padding: var(--space-sm) var(--space-md);
}
.quick-entry-workflow-icon {
flex: 0 0 auto;
}
.quick-entry-workflow-label {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.quick-entry-workflow-menu {
position: fixed;
width: min(calc(var(--space-xl) * 16), calc(100vw - var(--space-lg)));
min-width: min(calc(var(--space-xl) * 14), calc(100vw - var(--space-lg)));
max-width: calc(100vw - var(--space-lg));
max-height: min(calc(var(--space-xl) * 10), calc(100vh - var(--space-xl) * 2));
overflow-y: auto;
z-index: 1000;
}
.quick-entry-workflow-option {
width: 100%;
border: 0;
background: transparent;
color: inherit;
text-align: left;
align-items: flex-start;
}
.quick-entry-workflow-option-copy {
display: flex;
flex-direction: column;
gap: var(--space-xs);
min-width: 0;
}
.quick-entry-workflow-option-name,
.quick-entry-workflow-option-id {
min-width: 0;
max-width: 100%;
overflow-wrap: anywhere;
white-space: normal;
}
.quick-entry-workflow-option-id {
color: var(--text-muted);
font-family: var(--font-mono);
}
@media (max-width: 768px) {
.quick-entry-workflow-wrap,
.quick-entry-workflow-trigger {
max-width: 100%;
}
.quick-entry-workflow-menu {
width: min(calc(var(--space-xl) * 14), calc(100vw - var(--space-lg)));
min-width: min(calc(var(--space-xl) * 11), calc(100vw - var(--space-lg)));
}
}
.quick-entry-model-wrap {
position: relative;
}
.node-trigger-wrap,
.priority-trigger-wrap {
position: relative;
display: inline-flex;
}
.priority-picker-dropdown {
border: 1px solid var(--border);
border-radius: var(--radius-md);
box-shadow: var(--shadow-lg);
background: var(--surface);
z-index: 1000;
}
.priority-picker-dropdown--portal {
position: fixed;
}
.node-picker-dropdown {
border: 1px solid var(--border);
border-radius: var(--radius-md);
box-shadow: var(--shadow-lg);
background: var(--surface);
z-index: 1000;
}
.node-picker-dropdown--portal {
position: fixed;
}
.node-picker-item {
display: flex;
align-items: center;
gap: var(--space-sm);
}
.node-picker-item-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.node-picker-item-status {
margin-left: auto;
color: var(--text-muted);
font-size: 0.75rem;
}
.quick-entry-subtasks-toggle {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 0.75rem;
color: var(--text-muted);
cursor: pointer;
margin-left: 8px;
}
.quick-entry-subtasks-toggle input[type="checkbox"] {
width: 14px;
height: 14px;
margin: 0;
accent-color: var(--todo);
cursor: pointer;
}
.quick-entry-model-trigger {
font-size: 0.75rem;
padding: 3px 8px;
}
/* Nested model menu (replaces ModelSelectionModal in quick entry) */
.model-nested-menu {
position: absolute;
top: 100%;
left: 0;
margin-top: var(--space-xs);
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius-md);
box-shadow: var(--shadow-lg);
z-index: 100;
min-width: calc(var(--space-xl) * 12);
max-width: calc(var(--space-xl) * 20);
overflow: hidden;
}
/* Portaled variant — rendered via createPortal to escape column overflow clipping */
.model-nested-menu--portal {
position: fixed;
margin-top: 0;
z-index: 1000;
max-width: calc(var(--space-xl) * 20);
}
/* Mobile: portaled model menu uses wider viewport-clamped width set via inline styles */
.model-menu-items {
display: flex;
flex-direction: column;
padding: 4px;
}
.model-menu-item {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
padding: 8px 12px;
background: none;
border: none;
border-radius: 6px;
color: var(--text);
cursor: pointer;
text-align: left;
font-size: 0.8125rem;
transition: background-color 0.15s;
}
.model-menu-item:hover {
background: var(--surface-hover);
}
.model-menu-item--active {
color: var(--accent);
}
.model-menu-item-label {
display: flex;
align-items: center;
font-weight: 500;
white-space: nowrap;
}
.model-menu-item-value {
flex: 1;
text-align: right;
font-size: 0.6875rem;
color: var(--text-dim);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: min(28ch, 100%);
}
.model-submenu {
display: flex;
flex-direction: column;
padding: 8px;
gap: 8px;
}
.model-submenu-back {
display: flex;
align-items: center;
background: none;
border: none;
color: var(--text-muted);
cursor: pointer;
font-size: 0.75rem;
padding: 4px 0;
width: fit-content;
}
.model-submenu-back:hover {
color: var(--text);
}
.model-submenu-header {
font-size: 0.75rem;
font-weight: 600;
color: var(--text);
padding-bottom: 4px;
border-bottom: 1px solid var(--border);
}
.model-submenu-error {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
font-size: 0.6875rem;
color: var(--color-error);
padding-top: 4px;
}
/* Responsive: model menu on mobile */
@media (max-width: 640px) {
.model-nested-menu {
left: 0;
right: 0;
min-width: unset;
max-width: unset;
width: calc(100vw - 32px);
}
/* Portaled variant on mobile: remove max-width constraint so JS-driven width takes full effect */
.model-nested-menu--portal {
max-width: none;
}
}
/* Responsive layout for quick entry controls */
@media (max-width: 640px) {
.quick-entry-controls {
flex-direction: column;
align-items: flex-start;
gap: 10px;
}
}
/* Quick Entry Box main row with toggle */
.quick-entry-main-row {
display: flex;
align-items: flex-start;
gap: var(--space-sm);
}
.quick-entry-main-row .quick-entry-input {
flex: 1;
min-width: 0;
}
.quick-entry-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 6px;
height: 32px;
width: 32px;
flex-shrink: 0;
background: transparent;
border: 1px solid transparent;
border-radius: var(--radius-sm);
color: var(--text-muted);
cursor: pointer;
transition: all var(--transition-fast);
}
.quick-entry-toggle:hover {
background: var(--card-hover);
border-color: var(--border);
color: var(--text);
}
.quick-entry-toggle:focus-visible {
outline: none;
box-shadow: var(--focus-ring-strong);
}
/* Expanded state - normal padding */
.quick-entry-box--expanded {
padding: 8px 10px;
}
/* Only apply container-level min-height when input is NOT expanded.
This prevents container selectors from overriding the expanded min-height. */
.quick-entry-box--expanded .quick-entry-input:not(.quick-entry-input--expanded) {
min-height: 36px;
}
/* Collapsed state - minimal padding */
.quick-entry-box--collapsed {
padding: 6px 8px;
}
/* Only apply container-level min-height when input is NOT expanded.
When input is expanded (e.g., via focus), use the expanded min-height. */
.quick-entry-box--collapsed .quick-entry-input:not(.quick-entry-input--expanded) {
min-height: 32px;
border-bottom-color: transparent;
}
.quick-entry-box--collapsed .quick-entry-input:focus {
border-bottom-color: var(--triage);
}
/* Responsive adjustments for quick entry */
@media (max-width: 640px) {
.quick-entry-controls {
flex-direction: column;
align-items: flex-start;
gap: 10px;
}
.quick-entry-toggle {
height: 28px;
width: 28px;
padding: var(--space-xs);
}
}
/* === Quick Entry Mobile Touch + Overflow Fixes (FN-1140, FN-6153, FN-6160) === */
@media (max-width: 768px) {
.quick-entry-actions,
.quick-entry-actions * {
touch-action: manipulation;
}
.quick-entry-actions .btn,
.quick-entry-actions .wf-optional-steps-dropdown-trigger {
/* FNXC:WorkflowOptionalSteps 2026-06-25-00:00: The optional-steps trigger is not a `.btn`, so opt it into the same mobile quick-entry touch-target contract as the surrounding action buttons without adding a wrapper that could leave an empty shell for zero-step workflows. */
/* FNXC:QuickAddActionRow 2026-07-08-10:15: FN-7683 — mirror the desktop upgrade: a bare min-height floor cannot equalize a variant (e.g. Save's text+icon content) that naturally resolves taller than the touch-target height. Pair min-height with an equal max-height plus centered, tokenized line-height so every control lands on the SAME resolved touch-target height at this breakpoint, not merely >= it. */
min-height: calc(var(--space-2xl) + var(--space-xs));
max-height: calc(var(--space-2xl) + var(--space-xs));
line-height: var(--line-height-tight);
align-items: center;
overflow: hidden;
}
/*
FNXC:QuickAddActionRow 2026-07-08-11:30:
FN-7683 follow-up (operator feedback) — desktop/tablet parity from the fix
above stays untouched, and so does the shared mobile touch-target contract
applied to every sibling control. On real mobile browsers, Save (`btn
btn-task-create btn-sm`) still renders visibly taller than its shorter
siblings (Fast, the workflow trigger) at this breakpoint: its inline
`<Save size={12}>` icon plus text naturally claims more vertical space than
the fixed box, so the excess was only being silently clipped by the shared
rule's `overflow: hidden` rather than the button shrinking cleanly. Scope a
Save-only correction (via its existing `quick-entry-save` test id, not a new
wrapper) that removes the extra vertical padding and tightens line-height so
Save's natural content fits the SAME fixed box as its siblings without
relying on clipping — mobile-only; desktop/tablet Save sizing is unaffected.
*/
.quick-entry-actions [data-testid="quick-entry-save"] {
padding-top: 0;
padding-bottom: 0;
line-height: 1;
}
.quick-entry-box .dep-dropdown {
max-width: calc(100vw - calc(var(--space-lg) * 2));
}
}
@media (max-width: 640px) {
.quick-entry-toggle {
min-height: 36px;
min-width: 36px;
padding: var(--space-xs);
}
}
@media (max-width: 768px) {
.agent-list-modal {
width: 100%;
max-width: 100%;
max-height: 100vh;
max-height: 100dvh;
border-radius: 0;
}
.agent-list-modal .agent-modal-content {
padding: var(--space-lg);
padding-bottom: max(var(--space-lg), env(safe-area-inset-bottom, 0px));
}
.agent-list-modal .agent-state-filter-select {
font-size: 1rem;
min-height: 44px;
}
.agent-list-modal .agent-board-actions .btn,
.agent-list-modal .view-toggle-btn {
min-height: 44px;
min-width: 44px;
}
.agent-list-modal .modal-header .modal-actions {
flex-wrap: wrap;
gap: var(--space-xs);
}
.agent-list-modal .agent-board {
grid-template-columns: repeat(auto-fill, minmax(calc(var(--space-xl) * 6 + var(--space-lg)), 1fr));
gap: var(--space-md);
}
.agent-list-modal .agent-card-header {
flex-direction: column;
gap: var(--space-sm);
}
.agent-list-modal .agent-badges {
flex-shrink: initial;
}
.agent-list-modal .agent-empty {
padding: var(--space-xl) var(--space-lg);
}
}
@media (max-width: 640px) {
.agent-list-modal .agent-controls {
flex-direction: column;
align-items: stretch;
}
.agent-list-modal .agent-create-form {
flex-direction: column;
align-items: stretch;
}
.agent-list-modal .agent-create-form .input,
.agent-list-modal .agent-create-form .select {
width: 100%;
font-size: 1rem;
min-height: 44px;
}
.agent-list-modal .agent-create-form .btn {
min-height: 44px;
}
.agent-list-modal .agent-board {
grid-template-columns: 1fr;
}
.agent-list-modal .agent-card-actions .btn {
flex: 1;
min-width: 0;
}
}
@media (max-width: 768px) {
/* Quick entry toggle: touch target on mobile */
.quick-entry-toggle {
min-width: 36px;
min-height: 36px;
}
}