cattle-care-ui 0.1.12 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,7 +7,7 @@ Shared, presentational React components extracted from [cc-workers-schedule](../
7
7
  - `src/components/` — presentational components (props in, JSX out, CSS Modules). No app state, no data-layer imports.
8
8
  - `src/styles/tokens.css` — shared color tokens (CSS custom properties: brand, text, surfaces, borders, status).
9
9
  - `src/styles/fonts.css` — shared typography tokens (CSS custom properties: font family, size, weight, line height).
10
- - `src/styles/typography.css` — composable text-style utility classes (`.text-base`, `.text-bold`, `.text-sm`, `.text-lg`, `.text-2-line`) built on the font tokens.
10
+ - `src/styles/typography.css` — composable text-style utility classes (`.text-base`, `.text-medium`, `.text-sm`, `.text-lg`, `.text-2-line`) built on the font tokens.
11
11
  - `src/utils/format.ts` — small formatting helpers.
12
12
  - `src/index.ts` — the package's public entry point (barrel export).
13
13
 
@@ -1,14 +1,22 @@
1
- import { ButtonHTMLAttributes, ReactNode } from 'react';
1
+ import { ButtonHTMLAttributes, ReactNode, Ref } from 'react';
2
2
  type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'dangerous';
3
3
  type ButtonSize = 'sm' | 'base';
4
- interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className'> {
4
+ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
5
5
  variant?: ButtonVariant;
6
6
  size?: ButtonSize;
7
7
  /** Icon shown before the label. Omit `children` to render an icon-only square button — pass `aria-label` in that case. */
8
8
  leadingIcon?: ReactNode;
9
9
  /** Icon shown after the label. */
10
10
  trailingIcon?: ReactNode;
11
+ /** Stretch to the width of the container. */
12
+ fullWidth?: boolean;
11
13
  children?: ReactNode;
14
+ /**
15
+ * Extra classes for layout around the button — responsive visibility,
16
+ * positioning, spacing. Appended after the variant classes.
17
+ */
18
+ className?: string;
19
+ ref?: Ref<HTMLButtonElement>;
12
20
  }
13
- export declare function Button({ variant, size, leadingIcon, trailingIcon, children, ...rest }: ButtonProps): import("react").JSX.Element;
21
+ export declare function Button({ variant, size, leadingIcon, trailingIcon, fullWidth, children, className, ref, ...rest }: ButtonProps): import("react").JSX.Element;
14
22
  export {};
package/dist/index.css CHANGED
@@ -1,2 +1,2 @@
1
- ._primary_1jfxz_1,._secondary_1jfxz_2,._tertiary_1jfxz_3,._dangerous_1jfxz_4{isolation:isolate;letter-spacing:.01em;cursor:pointer;border:none;justify-content:center;align-items:center;gap:8px;font-family:inherit;font-weight:450;transition:color .2s,transform .2s ease-out;display:inline-flex;position:relative;overflow:hidden}._primary_1jfxz_1:active:not(:disabled),._secondary_1jfxz_2:active:not(:disabled),._tertiary_1jfxz_3:active:not(:disabled),._dangerous_1jfxz_4:active:not(:disabled){transform:scale(.95)}._sm_1jfxz_28{height:var(--control-height-sm);border-radius:var(--radius-sm);padding:0 12px;font-size:.9rem}._base_1jfxz_34{height:var(--control-height-base);border-radius:var(--radius-base);padding:0 16px;font-size:.9rem}._icon_1jfxz_40{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:flex}._icon_1jfxz_40:first-child{margin-left:-4px}._icon_1jfxz_40:last-child{margin-right:-4px}._icon_1jfxz_40 svg{width:100%;height:100%}._iconOnly_1jfxz_59{box-sizing:border-box;padding:0}._iconOnly_1jfxz_59._sm_1jfxz_28{width:var(--control-height-sm)}._iconOnly_1jfxz_59._base_1jfxz_34{width:var(--control-height-base)}._primary_1jfxz_1:before,._secondary_1jfxz_2:before,._tertiary_1jfxz_3:before,._dangerous_1jfxz_4:before{content:"";aspect-ratio:1;z-index:-1;pointer-events:none;border-radius:50%;width:24%;transition:transform .3s cubic-bezier(.39,.575,.565,1);position:absolute;bottom:0;left:50%;transform:translate(-50%,100%)scale(1)}._primary_1jfxz_1:hover:before,._secondary_1jfxz_2:hover:before,._tertiary_1jfxz_3:hover:before,._dangerous_1jfxz_4:hover:before{transform:translate(-50%,15%)scale(8)}._primary_1jfxz_1{background:var(--brand-dark);color:#fff;letter-spacing:.02em;font-weight:400}._primary_1jfxz_1:before{background:#ffffff14}._primary_1jfxz_1:active:not(:disabled):before{background:#00000014}._secondary_1jfxz_2{background:var(--ink-5);color:var(--text-primary)}._secondary_1jfxz_2 ._icon_1jfxz_40{color:var(--text-secondary)}._secondary_1jfxz_2:before{background:rgba(var(--brand-main-rgb), .08)}._secondary_1jfxz_2:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._secondary_1jfxz_2:hover ._icon_1jfxz_40,._secondary_1jfxz_2:hover{color:var(--brand-main)}._tertiary_1jfxz_3{color:var(--text-secondary);background:0 0}._tertiary_1jfxz_3:before{background:rgba(var(--brand-main-rgb), .16)}._tertiary_1jfxz_3:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._tertiary_1jfxz_3:hover,._tertiary_1jfxz_3:active:not(:disabled){background:var(--bg)}._tertiary_1jfxz_3:hover{color:var(--brand-main)}._dangerous_1jfxz_4{background:var(--danger-bg);color:var(--danger-text-dark)}._dangerous_1jfxz_4:before{background:rgba(var(--danger-rgb), .16)}._dangerous_1jfxz_4:active:not(:disabled):before{background:rgba(var(--danger-rgb), .28)}._primary_1jfxz_1:disabled,._secondary_1jfxz_2:disabled,._tertiary_1jfxz_3:disabled,._dangerous_1jfxz_4:disabled{background:var(--disabled-bg);color:var(--disabled-text);cursor:not-allowed}._primary_1jfxz_1:disabled:hover,._secondary_1jfxz_2:disabled:hover,._tertiary_1jfxz_3:disabled:hover,._dangerous_1jfxz_4:disabled:hover{color:var(--disabled-text)}._primary_1jfxz_1:disabled:before,._secondary_1jfxz_2:disabled:before,._tertiary_1jfxz_3:disabled:before,._dangerous_1jfxz_4:disabled:before{display:none}._wrap_1spnu_1{flex:0 0 220px;width:220px;position:relative}._wrap_1spnu_1:hover{z-index:10}._fluid_1spnu_9{flex:none;width:100%}._backing_1spnu_14{background:var(--card-surface);height:10px;box-shadow:inset 0 0 0 1px var(--border);z-index:0;border-radius:0 0 14px 14px;position:absolute;bottom:-4px;left:6px;right:6px}._backing_1spnu_14._completed_1spnu_25{background:var(--success-bg);box-shadow:inset 0 0 0 1px #bfe3cc}._card_1spnu_30{z-index:1;box-sizing:border-box;background:var(--card-surface);cursor:default;border-radius:16px;width:100%;padding:12px 14px;transition:box-shadow .2s,transform .1s;position:relative;box-shadow:inset 0 0 0 1px #efefef,0 1px 2px #1018200a}._card_1spnu_30._interactive_1spnu_46{cursor:pointer}._card_1spnu_30._interactive_1spnu_46:active{transform:scale(.98,.95)}._card_1spnu_30._grabbable_1spnu_52{cursor:grab}._card_1spnu_30._grabbable_1spnu_52:active{cursor:grabbing}._card_1spnu_30._dragging_1spnu_58,._card_1spnu_30._dragging_1spnu_58:hover{box-shadow:inset 0 0 0 1px #efefef,0 1px 2px #1018200a}._card_1spnu_30._interactive_1spnu_46:hover{box-shadow:inset 0 0 0 1px #efefef, 0 0 0 2px var(--brand-main)}._card_1spnu_30._completed_1spnu_25{background:var(--success-bg);box-shadow:inset 0 0 0 1px #bfe3cc,0 1px 2px #1018200a,0 2px 8px #1018200f}._neutral_10sg3_1,._pill_10sg3_2,._accent_10sg3_3,._success_10sg3_4,._danger_10sg3_5,._count_10sg3_6{white-space:nowrap;align-items:center;font-weight:500;display:inline-flex}._neutral_10sg3_1{color:var(--text-tertiary);background:var(--ink-5);border-radius:6px;padding:2px 7px;font-size:.75rem}._pill_10sg3_2{background:var(--card-surface);box-shadow:inset 0 0 0 1px var(--border);color:var(--text-tertiary);border-radius:999px;padding:3px 11px;font-size:.8rem}._accent_10sg3_3{background:var(--brand-bg);color:var(--brand-dark);border-radius:999px;padding:3px 11px;font-size:.8rem}._success_10sg3_4{background:var(--success-bg);color:var(--success-text);border-radius:999px;padding:3px 11px;font-size:.8rem}._danger_10sg3_5{color:var(--danger-text);background:var(--danger-bg);border-radius:6px;padding:2px 7px;font-size:.75rem}._count_10sg3_6{background:var(--brand-main);color:#fff;text-align:center;border-radius:999px;justify-content:center;min-width:16px;height:16px;padding:0 4px;font-size:.65rem;line-height:16px}._group_1v2tb_1{flex-wrap:wrap;align-items:center;gap:8px;margin-top:4px;display:inline-flex}._group_1v2tb_1._sm_1v2tb_9{gap:6px}._chip_1v2tb_13{appearance:none;white-space:nowrap;cursor:pointer;background:var(--ink-5);color:var(--text-primary);border:none;border-radius:999px;outline:none;justify-content:center;align-items:center;font-family:inherit;font-weight:500;transition:background-color .15s ease-out,color .15s ease-out,transform .1s ease-out;display:inline-flex}._group_1v2tb_1._base_1v2tb_33 ._chip_1v2tb_13{height:36px;padding:0 14px;font-size:.85rem}._group_1v2tb_1._sm_1v2tb_9 ._chip_1v2tb_13{height:24px;padding:0 9px;font-size:.75rem}._chip_1v2tb_13:hover:not(:disabled){background:var(--surface-muted)}._chip_1v2tb_13:active:not(:disabled){background:var(--surface-muted);transform:scale(.95)}._chip_1v2tb_13:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px}._chip_1v2tb_13._selected_1v2tb_59{background:var(--brand-bg);color:var(--brand-main)}._chip_1v2tb_13._selected_1v2tb_59:hover:not(:disabled){background:var(--brand-main-20)}._chip_1v2tb_13._selected_1v2tb_59:active:not(:disabled){background:var(--brand-main-30)}._chip_1v2tb_13:disabled{background:var(--disabled-bg);color:var(--disabled-text);cursor:not-allowed}._group_16vyf_1{flex-direction:column;gap:0;display:inline-flex}._groupLabel_16vyf_7{margin-bottom:6px}._label_h1zwu_1{color:var(--text-primary);padding-left:4px;font-size:.85rem;font-weight:550}._toolbar_1rsvo_1{background:var(--card-surface);box-shadow:inset 0 0 0 1px var(--border), 0 1px 2px #1018200a, 0 2px 8px #1018200f;border-radius:16px;justify-content:space-between;align-items:center;gap:16px;padding:0 8px;display:flex}._searchWrap_1rsvo_14{flex:1;min-width:0;position:relative}._searchWrap_1rsvo_14:after{content:"";background:var(--brand-main);opacity:0;pointer-events:none;height:2px;position:absolute;bottom:0;left:36px;right:0}._searchWrap_1rsvo_14:focus-within:after{opacity:1}._searchIcon_1rsvo_33{width:16px;height:16px;color:var(--text-tertiary);pointer-events:none;position:absolute;top:50%;left:12px;transform:translateY(-53%)}._searchIcon_1rsvo_33 svg{width:100%;height:100%}._search_1rsvo_14{box-sizing:border-box;width:100%;color:var(--text-primary);box-shadow:inset -1px 0 0 var(--border);background:0 0;border:none;padding:16px 52px 16px 36px;font-family:inherit;font-size:1rem}._search_1rsvo_14:focus{outline:none}._searchShortcut_1rsvo_61{background:var(--bg);color:var(--text-tertiary);letter-spacing:.02em;pointer-events:none;border-radius:6px;justify-content:center;align-items:center;padding:2px 6px;font-size:.75rem;font-weight:600;display:flex;position:absolute;top:50%;right:8px;transform:translateY(-50%)}._controls_1rsvo_78{flex:none;align-items:center;display:flex}._checkbox_v0tpk_1{cursor:pointer;align-items:center;gap:8px;padding:8px 4px;display:inline-flex}._control_v0tpk_8{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex;position:relative}._labelText_v0tpk_17{color:var(--text-primary);font-size:.85rem;transition:color .2s ease-out}._checkbox_v0tpk_1:hover ._labelText_v0tpk_17{color:var(--brand-main)}._input_v0tpk_25{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._box_v0tpk_32{background:var(--ink-5);width:16px;height:16px;box-shadow:inset 0 0 0 1px var(--border);border-radius:6px;justify-content:center;align-items:center;transition:background-color .2s cubic-bezier(0,0,.2,1),box-shadow .2s cubic-bezier(0,0,.2,1),transform .1s cubic-bezier(0,0,.2,1);display:flex}._checkbox_v0tpk_1:hover ._box_v0tpk_32{box-shadow:0 0 0 1px var(--brand-main)}._input_v0tpk_25:focus-visible+._box_v0tpk_32{outline:2px solid var(--brand-main);outline-offset:2px}._input_v0tpk_25:active+._box_v0tpk_32{transform:scale(.88)}._input_v0tpk_25:checked+._box_v0tpk_32{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._checkbox_v0tpk_1:hover ._input_v0tpk_25:checked+._box_v0tpk_32{box-shadow:0 0 0 1px var(--brand-main)}._icon_v0tpk_63{width:10px;height:10px;overflow:visible}._icon_v0tpk_63 polyline{fill:none;stroke:#fff;stroke-width:2.5px;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:22;stroke-dashoffset:22px;transition:stroke-dashoffset .2s cubic-bezier(.4,0,.2,1)}._input_v0tpk_25:checked+._box_v0tpk_32 ._icon_v0tpk_63 polyline{stroke-dashoffset:0}._input_v0tpk_25:disabled{cursor:not-allowed}._checkbox_v0tpk_1:has(._input_v0tpk_25:disabled){cursor:not-allowed}._checkbox_v0tpk_1:has(._input_v0tpk_25:disabled) ._labelText_v0tpk_17{color:var(--disabled-text)}._checkbox_v0tpk_1:has(._input_v0tpk_25:disabled) ._box_v0tpk_32{background:var(--surface-muted);box-shadow:inset 0 0 0 1px var(--border);transform:none}._checkbox_v0tpk_1:has(._input_v0tpk_25:disabled) ._input_v0tpk_25:checked+._box_v0tpk_32{background:var(--disabled-bg);box-shadow:inset 0 0 0 1px var(--disabled-bg)}._radio_1s5sc_1{cursor:pointer;align-items:center;gap:8px;padding:8px 4px;display:inline-flex}._control_1s5sc_8{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex;position:relative}._labelText_1s5sc_17{color:var(--text-primary);font-size:.85rem;transition:color .2s ease-out}._radio_1s5sc_1:hover ._labelText_1s5sc_17{color:var(--brand-main)}._input_1s5sc_25{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._circle_1s5sc_32{background:var(--ink-5);width:16px;height:16px;box-shadow:inset 0 0 0 1px var(--border);border-radius:50%;justify-content:center;align-items:center;transition:background-color .2s cubic-bezier(0,0,.2,1),box-shadow .2s cubic-bezier(0,0,.2,1),transform .1s cubic-bezier(0,0,.2,1);display:flex}._radio_1s5sc_1:hover ._circle_1s5sc_32{box-shadow:0 0 0 1px var(--brand-main)}._input_1s5sc_25:focus-visible+._circle_1s5sc_32{outline:2px solid var(--brand-main);outline-offset:2px}._input_1s5sc_25:active+._circle_1s5sc_32{transform:scale(.88)}._input_1s5sc_25:checked+._circle_1s5sc_32{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._radio_1s5sc_1:hover ._input_1s5sc_25:checked+._circle_1s5sc_32{box-shadow:0 0 0 1px var(--brand-main)}._dot_1s5sc_63{background:#fff;border-radius:50%;width:6px;height:6px;transition:transform .2s cubic-bezier(.4,0,.2,1);transform:scale(0)}._input_1s5sc_25:checked+._circle_1s5sc_32 ._dot_1s5sc_63{transform:scale(1)}._input_1s5sc_25:disabled{cursor:not-allowed}._radio_1s5sc_1:has(._input_1s5sc_25:disabled){cursor:not-allowed}._radio_1s5sc_1:has(._input_1s5sc_25:disabled) ._labelText_1s5sc_17{color:var(--disabled-text)}._radio_1s5sc_1:has(._input_1s5sc_25:disabled) ._circle_1s5sc_32{background:var(--surface-muted);box-shadow:inset 0 0 0 1px var(--border);transform:none}._radio_1s5sc_1:has(._input_1s5sc_25:disabled) ._input_1s5sc_25:checked+._circle_1s5sc_32{background:var(--disabled-bg);box-shadow:inset 0 0 0 1px var(--disabled-bg)}._switch_qbe6p_1{cursor:pointer;align-items:center;gap:8px;display:inline-flex}._switch_qbe6p_1:has(._input_qbe6p_7:disabled){cursor:not-allowed}._control_qbe6p_10{flex-shrink:0;align-items:center;display:inline-flex;position:relative}._input_qbe6p_7{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._input_qbe6p_7:disabled{cursor:not-allowed}._track_qbe6p_26{background:var(--ink-5);width:100%;height:100%;box-shadow:inset 0 0 0 1px var(--border);border-radius:999px;transition:background-color .2s cubic-bezier(0,0,.2,1),box-shadow .2s cubic-bezier(0,0,.2,1);position:relative}._switch_qbe6p_1:hover ._track_qbe6p_26{box-shadow:inset 0 0 0 1px var(--brand-main)}._input_qbe6p_7:focus-visible+._track_qbe6p_26{outline:2px solid var(--brand-main);outline-offset:2px}._input_qbe6p_7:checked+._track_qbe6p_26{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._input_qbe6p_7:disabled+._track_qbe6p_26{background:var(--surface-muted);box-shadow:inset 0 0 0 1px var(--border)}._thumb_qbe6p_52{background:#fff;border-radius:50%;transition:transform .2s cubic-bezier(.4,0,.2,1);position:absolute;top:50%;left:2px;transform:translateY(-50%)}._input_qbe6p_7:checked+._track_qbe6p_26 ._thumb_qbe6p_52{transform:translateY(-50%) translateX(var(--switch-thumb-travel))}._sm_qbe6p_65{--switch-thumb-travel:14px;width:32px;height:18px}._sm_qbe6p_65 ._thumb_qbe6p_52{width:14px;height:14px}._base_qbe6p_74{--switch-thumb-travel:18px;width:40px;height:22px}._base_qbe6p_74 ._thumb_qbe6p_52{width:18px;height:18px}._labelText_qbe6p_84{color:var(--text-primary);font-size:.85rem;transition:color .2s ease-out}._switch_qbe6p_1:hover ._labelText_qbe6p_84{color:var(--brand-main)}._switch_qbe6p_1:has(._input_qbe6p_7:disabled) ._labelText_qbe6p_84{color:var(--disabled-text)}._field_5pblk_1{flex-direction:column;gap:6px;display:flex}._inputWrap_5pblk_6{background:var(--card-surface);box-shadow:inset 0 0 0 1px var(--border-input);align-items:center;transition:box-shadow .2s ease-out;display:flex;position:relative}._inputWrap_5pblk_6:focus-within{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_5pblk_19,._errorWrap_5pblk_19:focus-within{box-shadow:inset 0 0 0 1px var(--danger-text)}._inputWrap_5pblk_6:has(._input_5pblk_6:disabled){background:var(--surface-muted)}._toolbar_5pblk_27{box-shadow:none;background:0 0}._toolbar_5pblk_27:after{content:"";background:var(--brand-main);opacity:0;height:2px;transition:opacity .2s ease-out;position:absolute;bottom:0;left:0;right:0}._toolbar_5pblk_27:focus-within{box-shadow:none}._toolbar_5pblk_27:focus-within:after{opacity:1}._toolbar_5pblk_27._errorWrap_5pblk_19,._toolbar_5pblk_27._errorWrap_5pblk_19:focus-within{box-shadow:none}._toolbar_5pblk_27._errorWrap_5pblk_19:after{background:var(--danger-text);opacity:1}._sm_5pblk_57{height:var(--control-height-sm);border-radius:var(--radius-sm)}._sm_5pblk_57 ._input_5pblk_6{padding:0 12px;font-size:.9rem}._base_5pblk_65{height:var(--control-height-base);border-radius:var(--radius-base)}._base_5pblk_65 ._input_5pblk_6{padding:0 14px;font-size:.9rem}._inputWrap_5pblk_6:has(._icon_5pblk_73) ._input_5pblk_6{padding-left:8px}._icon_5pblk_73{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-left:12px;display:flex}._icon_5pblk_73 svg{width:100%;height:100%}._input_5pblk_6{box-sizing:border-box;min-width:0;color:var(--text-primary);background:0 0;border:none;flex:1;font-family:inherit;font-weight:450}._input_5pblk_6:focus{outline:none}._input_5pblk_6::placeholder{color:var(--text-tertiary)}._input_5pblk_6:disabled{color:var(--disabled-text);cursor:not-allowed}._helperText_5pblk_111{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_5pblk_116{color:var(--danger-text);font-size:.78rem}._field_1vl88_1{flex-direction:column;gap:6px;display:flex}._inputWrap_1vl88_6{background:var(--card-surface);box-shadow:inset 0 0 0 1px var(--border-input);align-items:center;transition:box-shadow .2s ease-out;display:flex;position:relative}._inputWrap_1vl88_6:focus-within{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_1vl88_19,._errorWrap_1vl88_19:focus-within{box-shadow:inset 0 0 0 1px var(--danger-text)}._inputWrap_1vl88_6:has(._input_1vl88_6:disabled){background:var(--surface-muted)}._sm_1vl88_27{height:var(--control-height-sm);border-radius:var(--radius-sm)}._sm_1vl88_27 ._input_1vl88_6{padding:0 8px;font-size:.85rem}._base_1vl88_35{height:var(--control-height-base);border-radius:var(--radius-base)}._base_1vl88_35 ._input_1vl88_6{padding:0 10px;font-size:.9rem}._inputWrap_1vl88_6:has(._prefix_1vl88_43) ._input_1vl88_6{padding-left:4px}._inputWrap_1vl88_6:has(._suffix_1vl88_46) ._input_1vl88_6{padding-right:4px}._prefix_1vl88_43,._suffix_1vl88_46{color:var(--text-tertiary);white-space:nowrap;flex-shrink:0;align-items:center;font-size:.78rem;display:flex}._prefix_1vl88_43{margin-left:10px}._suffix_1vl88_46{margin-right:10px}._input_1vl88_6{box-sizing:border-box;min-width:0;color:var(--text-primary);font-variant-numeric:tabular-nums;appearance:textfield;background:0 0;border:none;flex:1;font-family:inherit;font-weight:450}._input_1vl88_6::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}._input_1vl88_6::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}._input_1vl88_6:focus{outline:none}._input_1vl88_6::placeholder{color:var(--text-tertiary)}._input_1vl88_6:disabled{color:var(--disabled-text);cursor:not-allowed}._helperText_1vl88_94{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_1vl88_99{color:var(--danger-text);font-size:.78rem}._menu_471l2_1{box-sizing:border-box;background:var(--card-surface);width:fit-content;min-width:180px;box-shadow:inset 0 0 0 1px var(--border), 0 8px 24px #0000001f;border-radius:12px;flex-direction:column;gap:2px;padding:4px;display:flex}._divider_471l2_15{background:var(--border);height:1px;margin:4px 6px}._item_1dj12_1{width:100%;min-height:var(--control-height-sm);box-sizing:border-box;color:var(--text-primary);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;padding:8px 12px;font-family:inherit;font-size:.9rem;transition:background .15s ease-out,color .15s ease-out;display:flex}._item_1dj12_1:hover:not(:disabled){background:var(--brand-bg);color:var(--brand-dark)}._item_1dj12_1:hover:not(:disabled) ._icon_1dj12_25,._item_1dj12_1:hover:not(:disabled) ._check_1dj12_26{color:var(--brand-dark)}._item_1dj12_1:active:not(:disabled){background:var(--brand-main-20)}._item_1dj12_1:focus-visible{outline:2px solid var(--brand-main);outline-offset:-2px}._item_1dj12_1:disabled{color:var(--disabled-text);cursor:not-allowed}._icon_1dj12_25{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-left:-4px;display:flex}._icon_1dj12_25 svg{width:100%;height:100%}._label_1dj12_54{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._trailing_1dj12_61{color:var(--text-tertiary);flex-shrink:0;font-size:.8rem}._selected_1dj12_66{color:var(--text-primary);font-weight:550}._selected_1dj12_66 ._icon_1dj12_25{color:var(--text-primary)}._check_1dj12_26{width:16px;height:16px;color:var(--text-primary);flex-shrink:0;justify-content:center;align-items:center;margin-left:8px;display:flex}._check_1dj12_26 svg{width:100%;height:100%}._destructive_1dj12_87,._destructive_1dj12_87 ._icon_1dj12_25{color:var(--danger-text)}._destructive_1dj12_87:hover:not(:disabled){background:var(--danger-bg);color:var(--danger-text)}._destructive_1dj12_87:hover:not(:disabled) ._icon_1dj12_25{color:var(--danger-text)}._field_b12m0_1{flex-direction:column;gap:6px;display:flex;position:relative}._trigger_b12m0_7{box-sizing:border-box;background:var(--card-surface);width:100%;box-shadow:inset 0 0 0 1px var(--border-input);color:var(--text-primary);cursor:pointer;border:none;align-items:center;font-family:inherit;transition:box-shadow .2s ease-out;display:flex}._trigger_b12m0_7:focus-visible{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_b12m0_25{box-shadow:inset 0 0 0 1px var(--danger-text)}._trigger_b12m0_7:disabled{background:var(--surface-muted);color:var(--disabled-text);cursor:not-allowed}._sm_b12m0_34{border-radius:var(--radius-sm)}._sm_b12m0_34._trigger_b12m0_7{height:var(--control-height-sm);padding:0 12px;font-size:.9rem}._base_b12m0_42{border-radius:var(--radius-base)}._base_b12m0_42._trigger_b12m0_7{height:var(--control-height-base);padding:0 14px;font-size:.9rem}._icon_b12m0_51{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-right:8px;display:flex}._icon_b12m0_51 svg{width:100%;height:100%}._value_b12m0_65{text-align:left;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._placeholder_b12m0_73{color:var(--text-tertiary)}._chevron_b12m0_76{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-left:8px;transition:transform .15s ease-out;display:flex}._chevron_b12m0_76 svg{width:100%;height:100%}._chevronOpen_b12m0_91{transform:rotate(180deg)}._menuWrap_b12m0_95{z-index:10;position:absolute;top:calc(100% + 4px);left:0;right:0}._helperText_b12m0_102{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_b12m0_107{color:var(--danger-text);font-size:.78rem}._highlight_1anli_1{background:var(--brand-bg);color:var(--brand-dark);border-radius:3px;padding:0 1px}._group_51gk7_1{position:relative}._btn_51gk7_4{color:var(--text-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:6px;padding:12px;font-family:inherit;font-size:1rem;transition:background .2s ease-out,box-shadow .2s ease-out,transform .2s ease-out;display:flex}._btn_51gk7_4:hover{background:#0a0a0b0a}._btn_51gk7_4:active{background:var(--brand-bg);transform:scale(.95);box-shadow:inset 0 2px 1px #008cd840}._caret_51gk7_29{color:var(--text-tertiary);align-items:center;display:flex}._caret_51gk7_29 svg{width:14px;height:14px}._label_51gk7_38{color:var(--text-secondary)}._badge_51gk7_41{background:var(--brand-main,#0a84d8);color:#fff;text-align:center;border-radius:999px;min-width:16px;height:16px;padding:0 4px;font-size:.65rem;font-weight:600;line-height:16px;position:absolute;top:2px;right:2px}._value_51gk7_56{color:var(--text-primary);font-weight:500}._panel_51gk7_60{width:fit-content;min-width:220px;max-height:280px;box-shadow:inset 0 0 0 1px var(--border), 0 8px 24px #0000001f;z-index:50;background:#fff;border-radius:12px;display:none;position:absolute;top:calc(100% + 6px);left:0;overflow-y:auto}._panel_51gk7_60._open_51gk7_76{display:block}._panelRight_51gk7_79{left:auto;right:0}._panelWide_51gk7_83{min-width:260px;padding-bottom:4px}._sectionHeader_51gk7_87{justify-content:space-between;align-items:center;gap:8px;padding:12px 14px 4px;display:flex}._sectionLabel_51gk7_94{color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.02em;font-size:.75rem;font-weight:600}._allToggle_51gk7_101{color:var(--brand-main,#0a84d8);cursor:pointer;background:0 0;border:none;padding:0;font-family:inherit;font-size:.75rem;font-weight:600}._allToggle_51gk7_101:hover{text-decoration:underline}._divider_51gk7_114{background:var(--border);height:1px;margin:4px 0}._option_51gk7_119{cursor:pointer;border-radius:8px;align-items:center;gap:8px;padding:8px;font-size:1rem;display:flex}._option_51gk7_119:hover{background:var(--bg)}._search_51gk7_131{box-sizing:border-box;width:calc(100% - 16px);box-shadow:inset 0 0 0 1px var(--border-input);border:none;border-radius:8px;margin:8px 8px 0;padding:8px 12px;font-family:inherit;font-size:1rem}._search_51gk7_131:focus{box-shadow:inset 0 0 0 1px var(--brand-main);outline:none}._optionsList_51gk7_147{padding:4px}._empty_51gk7_150{color:var(--text-tertiary);padding:7px 8px;font-size:.85rem}._line_tih91_1,._box_tih91_2{align-items:center;gap:4px;display:inline-flex;position:relative}._indicator_tih91_9{pointer-events:none;transition:translate .25s cubic-bezier(.39,.575,.565,1),width .25s,scale .125s cubic-bezier(.39,.575,.565,1);position:absolute;left:0}._indicator_tih91_9._settling_tih91_17{transition:scale .1s linear}._indicatorLine_tih91_21{background:var(--brand-main);height:2px;bottom:0}._indicatorBox_tih91_27{background:var(--card-surface);box-shadow:0 0 1px .5px var(--border);border-radius:8px;top:4px;bottom:4px}._tab_tih91_35{isolation:isolate;cursor:pointer;white-space:nowrap;border:none;border-radius:8px 8px 0 0;align-items:center;gap:6px;font-family:inherit;font-weight:450;transition:color .15s ease-out,background .15s ease-out,box-shadow .15s ease-out;display:inline-flex;position:relative;overflow:hidden}._tab_tih91_35:before{content:"";aspect-ratio:1;z-index:-1;pointer-events:none;background:rgba(var(--brand-main-rgb), .08);border-radius:50%;width:40%;transition:transform .3s cubic-bezier(.39,.575,.565,1);position:absolute;bottom:0;left:50%;transform:translate(-50%,100%)scale(1)}._tab_tih91_35:hover:not(:disabled):before{transform:translate(-50%,15%)scale(4)}._tab_tih91_35:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._tab_tih91_35:disabled{color:var(--disabled-text);cursor:not-allowed}._tab_tih91_35:disabled:before,._tab_tih91_35._selected_tih91_80:hover:before{display:none}._tab_tih91_35:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px}._icon_tih91_89{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;margin-left:-4px;display:flex}._icon_tih91_89 svg{width:100%;height:100%}._line_tih91_1{box-shadow:inset 0 -1px 0 0 var(--border)}._line_tih91_1 ._tab_tih91_35{color:var(--text-secondary);background:0 0;padding:12px 8px;font-size:1rem}._line_tih91_1 ._tab_tih91_35:hover:not(:disabled){color:var(--brand-main)}._line_tih91_1 ._tab_tih91_35._selected_tih91_80{color:var(--text-primary);font-weight:550}._box_tih91_2{box-sizing:border-box;height:var(--control-height-base);background:var(--ink-5);border-radius:var(--radius-base);gap:4px;padding:4px;box-shadow:inset 0 0 .5px 1px #e3e3e3}._box_tih91_2 ._tab_tih91_35{height:calc(var(--control-height-base) - 8px);color:var(--text-secondary);background:0 0;border-radius:8px;padding:0 14px;font-size:.9rem}._box_tih91_2 ._tab_tih91_35:hover:not(:disabled){color:var(--brand-main)}._box_tih91_2 ._tab_tih91_35._selected_tih91_80{color:var(--text-primary);font-weight:550}._box_tih91_2._sm_tih91_152{height:var(--control-height-sm);border-radius:var(--radius-sm)}._box_tih91_2._sm_tih91_152 ._tab_tih91_35{height:calc(var(--control-height-sm) - 8px);border-radius:6px;padding:0 14px}._box_tih91_2._sm_tih91_152 ._indicatorBox_tih91_27{border-radius:6px}:root{--brand-main:#0090d9;--brand-dark:#007ebd;--brand-bg:#e0f5ff;--brand-main-rgb:0, 144, 217;--brand-main-5:rgba(var(--brand-main-rgb), .05);--brand-main-10:rgba(var(--brand-main-rgb), .1);--brand-main-20:rgba(var(--brand-main-rgb), .2);--brand-main-30:rgba(var(--brand-main-rgb), .3);--brand-main-50:rgba(var(--brand-main-rgb), .5);--brand-main-75:rgba(var(--brand-main-rgb), .75);--text-primary:#090b0b;--text-secondary:#5c5f61;--text-tertiary:#666e73;--bg:#f7f7f7;--card-surface:#fff;--surface-sunken:#f8f9fa;--surface-muted:#e5e7e9;--border:#e0e0e0;--border-input:#e0e0e0;--ink-rgb:16, 24, 32;--ink-5:rgba(var(--ink-rgb), .05);--danger-bg:#fdeaea;--danger-text:#c8281c;--danger-text-dark:#b91c1c;--danger-rgb:200, 40, 28;--success-bg:#e3f6ea;--success-text:#27794a;--warning-bg:#fff1d6;--warning-text:#8f5d00;--disabled-bg:#c4c4c4;--disabled-text:#8a8a8a;--control-height-sm:36px;--control-height-base:44px;--radius-sm:10px;--radius-base:12px;--font-family-base:"Inter", sans-serif;--font-size-sm:.75rem;--font-size-base:.875rem;--font-size-lg:1rem;--font-weight-regular:400;--font-weight-bold:500;--line-height-base:1.5;--line-height-tight:1.25}.text-base{font-family:var(--font-family-base);font-size:var(--font-size-base);font-weight:var(--font-weight-regular);line-height:var(--line-height-base)}.text-bold{font-weight:var(--font-weight-bold)}.text-sm{font-size:var(--font-size-sm)}.text-lg{font-size:var(--font-size-lg)}.text-2-line{line-height:var(--line-height-tight)}
1
+ ._primary_qb0uf_1,._secondary_qb0uf_2,._tertiary_qb0uf_3,._dangerous_qb0uf_4{isolation:isolate;font-family:inherit;font-weight:var(--font-weight-regular);letter-spacing:.01em;cursor:pointer;border:none;justify-content:center;align-items:center;gap:8px;transition:color .2s,transform .2s ease-out;display:inline-flex;position:relative;overflow:hidden}._primary_qb0uf_1:active:not(:disabled),._secondary_qb0uf_2:active:not(:disabled),._tertiary_qb0uf_3:active:not(:disabled),._dangerous_qb0uf_4:active:not(:disabled){transform:scale(.95)}._sm_qb0uf_28{height:var(--control-height-sm);border-radius:var(--radius-sm);padding:0 12px;font-size:.9rem}._base_qb0uf_34{height:var(--control-height-base);border-radius:var(--radius-base);padding:0 16px;font-size:.9rem}._icon_qb0uf_40{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:flex}._icon_qb0uf_40:first-child{margin-left:-4px}._icon_qb0uf_40:last-child{margin-right:-4px}._icon_qb0uf_40 svg{width:100%;height:100%}._iconOnly_qb0uf_59{box-sizing:border-box;padding:0}._iconOnly_qb0uf_59._sm_qb0uf_28{width:var(--control-height-sm)}._iconOnly_qb0uf_59._base_qb0uf_34{width:var(--control-height-base)}._fullWidth_qb0uf_69{width:100%}._primary_qb0uf_1:before,._secondary_qb0uf_2:before,._tertiary_qb0uf_3:before,._dangerous_qb0uf_4:before{content:"";aspect-ratio:1;z-index:-1;pointer-events:none;border-radius:50%;width:24%;transition:transform .3s cubic-bezier(.39,.575,.565,1);position:absolute;bottom:0;left:50%;transform:translate(-50%,100%)scale(1)}._primary_qb0uf_1:hover:before,._secondary_qb0uf_2:hover:before,._tertiary_qb0uf_3:hover:before,._dangerous_qb0uf_4:hover:before{transform:translate(-50%,15%)scale(8)}._primary_qb0uf_1{background:var(--brand-dark);color:#fff;font-weight:var(--font-weight-regular);letter-spacing:.02em}._primary_qb0uf_1:before{background:#ffffff14}._primary_qb0uf_1:active:not(:disabled):before{background:#00000014}._secondary_qb0uf_2{background:var(--ink-5);color:var(--text-primary)}._secondary_qb0uf_2 ._icon_qb0uf_40{color:var(--text-secondary)}._secondary_qb0uf_2:before{background:rgba(var(--brand-main-rgb), .08)}._secondary_qb0uf_2:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._secondary_qb0uf_2:hover ._icon_qb0uf_40,._secondary_qb0uf_2:hover{color:var(--brand-main)}._tertiary_qb0uf_3{color:var(--text-secondary);background:0 0}._tertiary_qb0uf_3:before{background:rgba(var(--brand-main-rgb), .16)}._tertiary_qb0uf_3:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._tertiary_qb0uf_3:hover,._tertiary_qb0uf_3:active:not(:disabled){background:var(--bg)}._tertiary_qb0uf_3:hover{color:var(--brand-main)}._dangerous_qb0uf_4{background:var(--danger-bg);color:var(--danger-text-dark)}._dangerous_qb0uf_4:before{background:rgba(var(--danger-rgb), .16)}._dangerous_qb0uf_4:active:not(:disabled):before{background:rgba(var(--danger-rgb), .28)}._primary_qb0uf_1:disabled,._secondary_qb0uf_2:disabled,._tertiary_qb0uf_3:disabled,._dangerous_qb0uf_4:disabled{background:var(--disabled-bg);color:var(--disabled-text);cursor:not-allowed}._primary_qb0uf_1:disabled:hover,._secondary_qb0uf_2:disabled:hover,._tertiary_qb0uf_3:disabled:hover,._dangerous_qb0uf_4:disabled:hover{color:var(--disabled-text)}._primary_qb0uf_1:disabled:before,._secondary_qb0uf_2:disabled:before,._tertiary_qb0uf_3:disabled:before,._dangerous_qb0uf_4:disabled:before{display:none}._wrap_1spnu_1{flex:0 0 220px;width:220px;position:relative}._wrap_1spnu_1:hover{z-index:10}._fluid_1spnu_9{flex:none;width:100%}._backing_1spnu_14{background:var(--card-surface);height:10px;box-shadow:inset 0 0 0 1px var(--border);z-index:0;border-radius:0 0 14px 14px;position:absolute;bottom:-4px;left:6px;right:6px}._backing_1spnu_14._completed_1spnu_25{background:var(--success-bg);box-shadow:inset 0 0 0 1px #bfe3cc}._card_1spnu_30{z-index:1;box-sizing:border-box;background:var(--card-surface);cursor:default;border-radius:16px;width:100%;padding:12px 14px;transition:box-shadow .2s,transform .1s;position:relative;box-shadow:inset 0 0 0 1px #efefef,0 1px 2px #1018200a}._card_1spnu_30._interactive_1spnu_46{cursor:pointer}._card_1spnu_30._interactive_1spnu_46:active{transform:scale(.98,.95)}._card_1spnu_30._grabbable_1spnu_52{cursor:grab}._card_1spnu_30._grabbable_1spnu_52:active{cursor:grabbing}._card_1spnu_30._dragging_1spnu_58,._card_1spnu_30._dragging_1spnu_58:hover{box-shadow:inset 0 0 0 1px #efefef,0 1px 2px #1018200a}._card_1spnu_30._interactive_1spnu_46:hover{box-shadow:inset 0 0 0 1px #efefef, 0 0 0 2px var(--brand-main)}._card_1spnu_30._completed_1spnu_25{background:var(--success-bg);box-shadow:inset 0 0 0 1px #bfe3cc,0 1px 2px #1018200a,0 2px 8px #1018200f}._neutral_1p1lj_1,._pill_1p1lj_2,._accent_1p1lj_3,._success_1p1lj_4,._danger_1p1lj_5,._count_1p1lj_6{font-weight:var(--font-weight-medium);white-space:nowrap;align-items:center;display:inline-flex}._neutral_1p1lj_1{color:var(--text-tertiary);background:var(--ink-5);border-radius:6px;padding:2px 7px;font-size:.75rem}._pill_1p1lj_2{background:var(--card-surface);box-shadow:inset 0 0 0 1px var(--border);color:var(--text-tertiary);border-radius:999px;padding:3px 11px;font-size:.8rem}._accent_1p1lj_3{background:var(--brand-bg);color:var(--brand-dark);border-radius:999px;padding:3px 11px;font-size:.8rem}._success_1p1lj_4{background:var(--success-bg);color:var(--success-text);border-radius:999px;padding:3px 11px;font-size:.8rem}._danger_1p1lj_5{color:var(--danger-text);background:var(--danger-bg);border-radius:6px;padding:2px 7px;font-size:.75rem}._count_1p1lj_6{background:var(--brand-main);color:#fff;text-align:center;border-radius:999px;justify-content:center;min-width:16px;height:16px;padding:0 4px;font-size:.65rem;line-height:16px}._group_taxgk_1{flex-wrap:wrap;align-items:center;gap:8px;margin-top:4px;display:inline-flex}._group_taxgk_1._sm_taxgk_9{gap:6px}._chip_taxgk_13{appearance:none;font-family:inherit;font-weight:var(--font-weight-medium);white-space:nowrap;cursor:pointer;background:var(--ink-5);color:var(--text-primary);border:none;border-radius:999px;outline:none;justify-content:center;align-items:center;transition:background-color .15s ease-out,color .15s ease-out,transform .1s ease-out;display:inline-flex}._group_taxgk_1._base_taxgk_33 ._chip_taxgk_13{height:36px;padding:0 14px;font-size:.85rem}._group_taxgk_1._sm_taxgk_9 ._chip_taxgk_13{height:24px;padding:0 9px;font-size:.75rem}._chip_taxgk_13:hover:not(:disabled){background:var(--surface-muted)}._chip_taxgk_13:active:not(:disabled){background:var(--surface-muted);transform:scale(.95)}._chip_taxgk_13:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px}._chip_taxgk_13._selected_taxgk_59{background:var(--brand-bg);color:var(--brand-main)}._chip_taxgk_13._selected_taxgk_59:hover:not(:disabled){background:var(--brand-main-20)}._chip_taxgk_13._selected_taxgk_59:active:not(:disabled){background:var(--brand-main-30)}._chip_taxgk_13:disabled{background:var(--disabled-bg);color:var(--disabled-text);cursor:not-allowed}._group_16vyf_1{flex-direction:column;gap:0;display:inline-flex}._groupLabel_16vyf_7{margin-bottom:6px}._label_10zsm_1{font-size:.85rem;font-weight:var(--font-weight-medium);color:var(--text-primary);padding-left:4px}._toolbar_1s82l_1{background:var(--card-surface);box-shadow:inset 0 0 0 1px var(--border), 0 1px 2px #1018200a, 0 2px 8px #1018200f;border-radius:16px;justify-content:space-between;align-items:center;gap:16px;padding:0 8px;display:flex}._searchWrap_1s82l_14{flex:1;min-width:0;position:relative}._searchWrap_1s82l_14:after{content:"";background:var(--brand-main);opacity:0;pointer-events:none;height:2px;position:absolute;bottom:0;left:36px;right:0}._searchWrap_1s82l_14:focus-within:after{opacity:1}._searchIcon_1s82l_33{width:16px;height:16px;color:var(--text-tertiary);pointer-events:none;position:absolute;top:50%;left:12px;transform:translateY(-53%)}._searchIcon_1s82l_33 svg{width:100%;height:100%}._search_1s82l_14{box-sizing:border-box;width:100%;color:var(--text-primary);box-shadow:inset -1px 0 0 var(--border);background:0 0;border:none;padding:16px 52px 16px 36px;font-family:inherit;font-size:1rem}._search_1s82l_14:focus{outline:none}._searchShortcut_1s82l_61{background:var(--bg);color:var(--text-tertiary);font-size:.75rem;font-weight:var(--font-weight-semibold);letter-spacing:.02em;pointer-events:none;border-radius:6px;justify-content:center;align-items:center;padding:2px 6px;display:flex;position:absolute;top:50%;right:8px;transform:translateY(-50%)}._controls_1s82l_78{flex:none;align-items:center;display:flex}._checkbox_v0tpk_1{cursor:pointer;align-items:center;gap:8px;padding:8px 4px;display:inline-flex}._control_v0tpk_8{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex;position:relative}._labelText_v0tpk_17{color:var(--text-primary);font-size:.85rem;transition:color .2s ease-out}._checkbox_v0tpk_1:hover ._labelText_v0tpk_17{color:var(--brand-main)}._input_v0tpk_25{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._box_v0tpk_32{background:var(--ink-5);width:16px;height:16px;box-shadow:inset 0 0 0 1px var(--border);border-radius:6px;justify-content:center;align-items:center;transition:background-color .2s cubic-bezier(0,0,.2,1),box-shadow .2s cubic-bezier(0,0,.2,1),transform .1s cubic-bezier(0,0,.2,1);display:flex}._checkbox_v0tpk_1:hover ._box_v0tpk_32{box-shadow:0 0 0 1px var(--brand-main)}._input_v0tpk_25:focus-visible+._box_v0tpk_32{outline:2px solid var(--brand-main);outline-offset:2px}._input_v0tpk_25:active+._box_v0tpk_32{transform:scale(.88)}._input_v0tpk_25:checked+._box_v0tpk_32{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._checkbox_v0tpk_1:hover ._input_v0tpk_25:checked+._box_v0tpk_32{box-shadow:0 0 0 1px var(--brand-main)}._icon_v0tpk_63{width:10px;height:10px;overflow:visible}._icon_v0tpk_63 polyline{fill:none;stroke:#fff;stroke-width:2.5px;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:22;stroke-dashoffset:22px;transition:stroke-dashoffset .2s cubic-bezier(.4,0,.2,1)}._input_v0tpk_25:checked+._box_v0tpk_32 ._icon_v0tpk_63 polyline{stroke-dashoffset:0}._input_v0tpk_25:disabled{cursor:not-allowed}._checkbox_v0tpk_1:has(._input_v0tpk_25:disabled){cursor:not-allowed}._checkbox_v0tpk_1:has(._input_v0tpk_25:disabled) ._labelText_v0tpk_17{color:var(--disabled-text)}._checkbox_v0tpk_1:has(._input_v0tpk_25:disabled) ._box_v0tpk_32{background:var(--surface-muted);box-shadow:inset 0 0 0 1px var(--border);transform:none}._checkbox_v0tpk_1:has(._input_v0tpk_25:disabled) ._input_v0tpk_25:checked+._box_v0tpk_32{background:var(--disabled-bg);box-shadow:inset 0 0 0 1px var(--disabled-bg)}._radio_1s5sc_1{cursor:pointer;align-items:center;gap:8px;padding:8px 4px;display:inline-flex}._control_1s5sc_8{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex;position:relative}._labelText_1s5sc_17{color:var(--text-primary);font-size:.85rem;transition:color .2s ease-out}._radio_1s5sc_1:hover ._labelText_1s5sc_17{color:var(--brand-main)}._input_1s5sc_25{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._circle_1s5sc_32{background:var(--ink-5);width:16px;height:16px;box-shadow:inset 0 0 0 1px var(--border);border-radius:50%;justify-content:center;align-items:center;transition:background-color .2s cubic-bezier(0,0,.2,1),box-shadow .2s cubic-bezier(0,0,.2,1),transform .1s cubic-bezier(0,0,.2,1);display:flex}._radio_1s5sc_1:hover ._circle_1s5sc_32{box-shadow:0 0 0 1px var(--brand-main)}._input_1s5sc_25:focus-visible+._circle_1s5sc_32{outline:2px solid var(--brand-main);outline-offset:2px}._input_1s5sc_25:active+._circle_1s5sc_32{transform:scale(.88)}._input_1s5sc_25:checked+._circle_1s5sc_32{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._radio_1s5sc_1:hover ._input_1s5sc_25:checked+._circle_1s5sc_32{box-shadow:0 0 0 1px var(--brand-main)}._dot_1s5sc_63{background:#fff;border-radius:50%;width:6px;height:6px;transition:transform .2s cubic-bezier(.4,0,.2,1);transform:scale(0)}._input_1s5sc_25:checked+._circle_1s5sc_32 ._dot_1s5sc_63{transform:scale(1)}._input_1s5sc_25:disabled{cursor:not-allowed}._radio_1s5sc_1:has(._input_1s5sc_25:disabled){cursor:not-allowed}._radio_1s5sc_1:has(._input_1s5sc_25:disabled) ._labelText_1s5sc_17{color:var(--disabled-text)}._radio_1s5sc_1:has(._input_1s5sc_25:disabled) ._circle_1s5sc_32{background:var(--surface-muted);box-shadow:inset 0 0 0 1px var(--border);transform:none}._radio_1s5sc_1:has(._input_1s5sc_25:disabled) ._input_1s5sc_25:checked+._circle_1s5sc_32{background:var(--disabled-bg);box-shadow:inset 0 0 0 1px var(--disabled-bg)}._switch_qbe6p_1{cursor:pointer;align-items:center;gap:8px;display:inline-flex}._switch_qbe6p_1:has(._input_qbe6p_7:disabled){cursor:not-allowed}._control_qbe6p_10{flex-shrink:0;align-items:center;display:inline-flex;position:relative}._input_qbe6p_7{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._input_qbe6p_7:disabled{cursor:not-allowed}._track_qbe6p_26{background:var(--ink-5);width:100%;height:100%;box-shadow:inset 0 0 0 1px var(--border);border-radius:999px;transition:background-color .2s cubic-bezier(0,0,.2,1),box-shadow .2s cubic-bezier(0,0,.2,1);position:relative}._switch_qbe6p_1:hover ._track_qbe6p_26{box-shadow:inset 0 0 0 1px var(--brand-main)}._input_qbe6p_7:focus-visible+._track_qbe6p_26{outline:2px solid var(--brand-main);outline-offset:2px}._input_qbe6p_7:checked+._track_qbe6p_26{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._input_qbe6p_7:disabled+._track_qbe6p_26{background:var(--surface-muted);box-shadow:inset 0 0 0 1px var(--border)}._thumb_qbe6p_52{background:#fff;border-radius:50%;transition:transform .2s cubic-bezier(.4,0,.2,1);position:absolute;top:50%;left:2px;transform:translateY(-50%)}._input_qbe6p_7:checked+._track_qbe6p_26 ._thumb_qbe6p_52{transform:translateY(-50%) translateX(var(--switch-thumb-travel))}._sm_qbe6p_65{--switch-thumb-travel:14px;width:32px;height:18px}._sm_qbe6p_65 ._thumb_qbe6p_52{width:14px;height:14px}._base_qbe6p_74{--switch-thumb-travel:18px;width:40px;height:22px}._base_qbe6p_74 ._thumb_qbe6p_52{width:18px;height:18px}._labelText_qbe6p_84{color:var(--text-primary);font-size:.85rem;transition:color .2s ease-out}._switch_qbe6p_1:hover ._labelText_qbe6p_84{color:var(--brand-main)}._switch_qbe6p_1:has(._input_qbe6p_7:disabled) ._labelText_qbe6p_84{color:var(--disabled-text)}._field_r5pku_1{flex-direction:column;gap:6px;display:flex}._inputWrap_r5pku_6{background:var(--card-surface);box-shadow:inset 0 0 0 1px var(--border-input);align-items:center;transition:box-shadow .2s ease-out;display:flex;position:relative}._inputWrap_r5pku_6:focus-within{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_r5pku_19,._errorWrap_r5pku_19:focus-within{box-shadow:inset 0 0 0 1px var(--danger-text)}._inputWrap_r5pku_6:has(._input_r5pku_6:disabled){background:var(--surface-muted)}._toolbar_r5pku_27{box-shadow:none;background:0 0}._toolbar_r5pku_27:after{content:"";background:var(--brand-main);opacity:0;height:2px;transition:opacity .2s ease-out;position:absolute;bottom:0;left:0;right:0}._toolbar_r5pku_27:focus-within{box-shadow:none}._toolbar_r5pku_27:focus-within:after{opacity:1}._toolbar_r5pku_27._errorWrap_r5pku_19,._toolbar_r5pku_27._errorWrap_r5pku_19:focus-within{box-shadow:none}._toolbar_r5pku_27._errorWrap_r5pku_19:after{background:var(--danger-text);opacity:1}._sm_r5pku_57{height:var(--control-height-sm);border-radius:var(--radius-sm)}._sm_r5pku_57 ._input_r5pku_6{padding:0 12px;font-size:.9rem}._base_r5pku_65{height:var(--control-height-base);border-radius:var(--radius-base)}._base_r5pku_65 ._input_r5pku_6{padding:0 14px;font-size:.9rem}._inputWrap_r5pku_6:has(._icon_r5pku_73) ._input_r5pku_6{padding-left:8px}._icon_r5pku_73{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-left:12px;display:flex}._icon_r5pku_73 svg{width:100%;height:100%}._input_r5pku_6{box-sizing:border-box;min-width:0;color:var(--text-primary);font-family:inherit;font-weight:var(--font-weight-regular);background:0 0;border:none;flex:1}._input_r5pku_6:focus{outline:none}._input_r5pku_6::placeholder{color:var(--text-tertiary)}._input_r5pku_6:disabled{color:var(--disabled-text);cursor:not-allowed}._helperText_r5pku_111{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_r5pku_116{color:var(--danger-text);font-size:.78rem}._field_tr8ir_1{flex-direction:column;gap:6px;display:flex}._inputWrap_tr8ir_6{background:var(--card-surface);box-shadow:inset 0 0 0 1px var(--border-input);align-items:center;transition:box-shadow .2s ease-out;display:flex;position:relative}._inputWrap_tr8ir_6:focus-within{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_tr8ir_19,._errorWrap_tr8ir_19:focus-within{box-shadow:inset 0 0 0 1px var(--danger-text)}._inputWrap_tr8ir_6:has(._input_tr8ir_6:disabled){background:var(--surface-muted)}._sm_tr8ir_27{height:var(--control-height-sm);border-radius:var(--radius-sm)}._sm_tr8ir_27 ._input_tr8ir_6{padding:0 8px;font-size:.85rem}._base_tr8ir_35{height:var(--control-height-base);border-radius:var(--radius-base)}._base_tr8ir_35 ._input_tr8ir_6{padding:0 10px;font-size:.9rem}._inputWrap_tr8ir_6:has(._prefix_tr8ir_43) ._input_tr8ir_6{padding-left:4px}._inputWrap_tr8ir_6:has(._suffix_tr8ir_46) ._input_tr8ir_6{padding-right:4px}._prefix_tr8ir_43,._suffix_tr8ir_46{color:var(--text-tertiary);white-space:nowrap;flex-shrink:0;align-items:center;font-size:.78rem;display:flex}._prefix_tr8ir_43{margin-left:10px}._suffix_tr8ir_46{margin-right:10px}._input_tr8ir_6{box-sizing:border-box;min-width:0;color:var(--text-primary);font-family:inherit;font-weight:var(--font-weight-regular);font-variant-numeric:tabular-nums;appearance:textfield;background:0 0;border:none;flex:1}._input_tr8ir_6::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}._input_tr8ir_6::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}._input_tr8ir_6:focus{outline:none}._input_tr8ir_6::placeholder{color:var(--text-tertiary)}._input_tr8ir_6:disabled{color:var(--disabled-text);cursor:not-allowed}._helperText_tr8ir_94{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_tr8ir_99{color:var(--danger-text);font-size:.78rem}._menu_471l2_1{box-sizing:border-box;background:var(--card-surface);width:fit-content;min-width:180px;box-shadow:inset 0 0 0 1px var(--border), 0 8px 24px #0000001f;border-radius:12px;flex-direction:column;gap:2px;padding:4px;display:flex}._divider_471l2_15{background:var(--border);height:1px;margin:4px 6px}._item_nrbhu_1{width:100%;min-height:var(--control-height-sm);box-sizing:border-box;color:var(--text-primary);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;padding:8px 12px;font-family:inherit;font-size:.9rem;transition:background .15s ease-out,color .15s ease-out;display:flex}._item_nrbhu_1:hover:not(:disabled){background:var(--brand-bg);color:var(--brand-dark)}._item_nrbhu_1:hover:not(:disabled) ._icon_nrbhu_25,._item_nrbhu_1:hover:not(:disabled) ._check_nrbhu_26{color:var(--brand-dark)}._item_nrbhu_1:active:not(:disabled){background:var(--brand-main-20)}._item_nrbhu_1:focus-visible{outline:2px solid var(--brand-main);outline-offset:-2px}._item_nrbhu_1:disabled{color:var(--disabled-text);cursor:not-allowed}._icon_nrbhu_25{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-left:-2px;display:flex}._icon_nrbhu_25 svg{width:100%;height:100%}._label_nrbhu_54{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._trailing_nrbhu_61{color:var(--text-tertiary);flex-shrink:0;margin-right:-2px;font-size:.8rem}._selected_nrbhu_67{color:var(--text-primary);font-weight:var(--font-weight-medium)}._selected_nrbhu_67 ._icon_nrbhu_25{color:var(--text-primary)}._check_nrbhu_26{width:16px;height:16px;color:var(--text-primary);flex-shrink:0;justify-content:center;align-items:center;margin-left:8px;display:flex}._check_nrbhu_26 svg{width:100%;height:100%}._destructive_nrbhu_88,._destructive_nrbhu_88 ._icon_nrbhu_25{color:var(--danger-text)}._destructive_nrbhu_88:hover:not(:disabled){background:var(--danger-bg);color:var(--danger-text)}._destructive_nrbhu_88:hover:not(:disabled) ._icon_nrbhu_25{color:var(--danger-text)}._field_b12m0_1{flex-direction:column;gap:6px;display:flex;position:relative}._trigger_b12m0_7{box-sizing:border-box;background:var(--card-surface);width:100%;box-shadow:inset 0 0 0 1px var(--border-input);color:var(--text-primary);cursor:pointer;border:none;align-items:center;font-family:inherit;transition:box-shadow .2s ease-out;display:flex}._trigger_b12m0_7:focus-visible{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_b12m0_25{box-shadow:inset 0 0 0 1px var(--danger-text)}._trigger_b12m0_7:disabled{background:var(--surface-muted);color:var(--disabled-text);cursor:not-allowed}._sm_b12m0_34{border-radius:var(--radius-sm)}._sm_b12m0_34._trigger_b12m0_7{height:var(--control-height-sm);padding:0 12px;font-size:.9rem}._base_b12m0_42{border-radius:var(--radius-base)}._base_b12m0_42._trigger_b12m0_7{height:var(--control-height-base);padding:0 14px;font-size:.9rem}._icon_b12m0_51{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-right:8px;display:flex}._icon_b12m0_51 svg{width:100%;height:100%}._value_b12m0_65{text-align:left;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._placeholder_b12m0_73{color:var(--text-tertiary)}._chevron_b12m0_76{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-left:8px;transition:transform .15s ease-out;display:flex}._chevron_b12m0_76 svg{width:100%;height:100%}._chevronOpen_b12m0_91{transform:rotate(180deg)}._menuWrap_b12m0_95{z-index:10;position:absolute;top:calc(100% + 4px);left:0;right:0}._helperText_b12m0_102{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_b12m0_107{color:var(--danger-text);font-size:.78rem}._highlight_1anli_1{background:var(--brand-bg);color:var(--brand-dark);border-radius:3px;padding:0 1px}._group_17bb8_1{position:relative}._btn_17bb8_4{color:var(--text-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:6px;padding:12px;font-family:inherit;font-size:1rem;transition:background .2s ease-out,box-shadow .2s ease-out,transform .2s ease-out;display:flex}._btn_17bb8_4:hover{background:#0a0a0b0a}._btn_17bb8_4:active{background:var(--brand-bg);transform:scale(.95);box-shadow:inset 0 2px 1px #008cd840}._caret_17bb8_29{color:var(--text-tertiary);align-items:center;display:flex}._caret_17bb8_29 svg{width:14px;height:14px}._label_17bb8_38{color:var(--text-secondary)}._badge_17bb8_41{background:var(--brand-main,#0a84d8);color:#fff;min-width:16px;height:16px;font-size:.65rem;font-weight:var(--font-weight-semibold);text-align:center;border-radius:999px;padding:0 4px;line-height:16px;position:absolute;top:2px;right:2px}._value_17bb8_56{color:var(--text-primary);font-weight:var(--font-weight-medium)}._panel_17bb8_60{width:fit-content;min-width:220px;max-height:280px;box-shadow:inset 0 0 0 1px var(--border), 0 8px 24px #0000001f;z-index:50;background:#fff;border-radius:12px;display:none;position:absolute;top:calc(100% + 6px);left:0;overflow-y:auto}._panel_17bb8_60._open_17bb8_76{display:block}._panelRight_17bb8_79{left:auto;right:0}._panelWide_17bb8_83{min-width:260px;padding-bottom:4px}._sectionHeader_17bb8_87{justify-content:space-between;align-items:center;gap:8px;padding:12px 14px 4px;display:flex}._sectionLabel_17bb8_94{font-size:.75rem;font-weight:var(--font-weight-semibold);color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.02em}._allToggle_17bb8_101{font-family:inherit;font-size:.75rem;font-weight:var(--font-weight-semibold);color:var(--brand-main,#0a84d8);cursor:pointer;background:0 0;border:none;padding:0}._allToggle_17bb8_101:hover{text-decoration:underline}._divider_17bb8_114{background:var(--border);height:1px;margin:4px 0}._option_17bb8_119{cursor:pointer;border-radius:8px;align-items:center;gap:8px;padding:8px;font-size:1rem;display:flex}._option_17bb8_119:hover{background:var(--bg)}._search_17bb8_131{box-sizing:border-box;width:calc(100% - 16px);box-shadow:inset 0 0 0 1px var(--border-input);border:none;border-radius:8px;margin:8px 8px 0;padding:8px 12px;font-family:inherit;font-size:1rem}._search_17bb8_131:focus{box-shadow:inset 0 0 0 1px var(--brand-main);outline:none}._optionsList_17bb8_147{padding:4px}._empty_17bb8_150{color:var(--text-tertiary);padding:7px 8px;font-size:.85rem}._line_qm5u2_1,._box_qm5u2_2{align-items:center;gap:4px;display:inline-flex;position:relative}._indicator_qm5u2_9{pointer-events:none;transition:translate .25s cubic-bezier(.39,.575,.565,1),width .25s,scale .125s cubic-bezier(.39,.575,.565,1);position:absolute;left:0}._indicator_qm5u2_9._settling_qm5u2_17{transition:scale .1s linear}._indicatorLine_qm5u2_21{background:var(--brand-main);height:2px;bottom:0}._indicatorBox_qm5u2_27{background:var(--card-surface);box-shadow:0 0 1px .5px var(--border);border-radius:8px;top:4px;bottom:4px}._tab_qm5u2_35{isolation:isolate;font-family:inherit;font-weight:var(--font-weight-regular);cursor:pointer;white-space:nowrap;border:none;border-radius:8px 8px 0 0;align-items:center;gap:6px;transition:color .15s ease-out,background .15s ease-out,box-shadow .15s ease-out;display:inline-flex;position:relative;overflow:hidden}._tab_qm5u2_35:before{content:"";aspect-ratio:1;z-index:-1;pointer-events:none;background:rgba(var(--brand-main-rgb), .08);border-radius:50%;width:40%;transition:transform .3s cubic-bezier(.39,.575,.565,1);position:absolute;bottom:0;left:50%;transform:translate(-50%,100%)scale(1)}._tab_qm5u2_35:hover:not(:disabled):before{transform:translate(-50%,15%)scale(4)}._tab_qm5u2_35:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._tab_qm5u2_35:disabled{color:var(--disabled-text);cursor:not-allowed}._tab_qm5u2_35:disabled:before,._tab_qm5u2_35._selected_qm5u2_80:hover:before{display:none}._tab_qm5u2_35:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px}._icon_qm5u2_89{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;margin-left:-4px;display:flex}._icon_qm5u2_89 svg{width:100%;height:100%}._line_qm5u2_1{box-shadow:inset 0 -1px 0 0 var(--border)}._line_qm5u2_1 ._tab_qm5u2_35{color:var(--text-secondary);background:0 0;padding:12px 8px;font-size:1rem}._line_qm5u2_1 ._tab_qm5u2_35:hover:not(:disabled){color:var(--brand-main)}._line_qm5u2_1 ._tab_qm5u2_35._selected_qm5u2_80{color:var(--text-primary);font-weight:var(--font-weight-medium)}._box_qm5u2_2{box-sizing:border-box;height:var(--control-height-base);background:var(--ink-5);border-radius:var(--radius-base);gap:4px;padding:4px;box-shadow:inset 0 0 .5px 1px #e3e3e3}._box_qm5u2_2 ._tab_qm5u2_35{height:calc(var(--control-height-base) - 8px);color:var(--text-secondary);background:0 0;border-radius:8px;padding:0 14px;font-size:.9rem}._box_qm5u2_2 ._tab_qm5u2_35:hover:not(:disabled){color:var(--brand-main)}._box_qm5u2_2 ._tab_qm5u2_35._selected_qm5u2_80{color:var(--text-primary);font-weight:var(--font-weight-medium)}._box_qm5u2_2._sm_qm5u2_152{height:var(--control-height-sm);border-radius:var(--radius-sm)}._box_qm5u2_2._sm_qm5u2_152 ._tab_qm5u2_35{height:calc(var(--control-height-sm) - 8px);border-radius:6px;padding:0 14px}._box_qm5u2_2._sm_qm5u2_152 ._indicatorBox_qm5u2_27{border-radius:6px}:root{--brand-main:#0090d9;--brand-dark:#007ebd;--brand-bg:#e0f5ff;--brand-main-rgb:0, 144, 217;--brand-main-5:rgba(var(--brand-main-rgb), .05);--brand-main-10:rgba(var(--brand-main-rgb), .1);--brand-main-20:rgba(var(--brand-main-rgb), .2);--brand-main-30:rgba(var(--brand-main-rgb), .3);--brand-main-50:rgba(var(--brand-main-rgb), .5);--brand-main-75:rgba(var(--brand-main-rgb), .75);--text-primary:#090b0b;--text-secondary:#5c5f61;--text-tertiary:#666e73;--bg:#f7f7f7;--card-surface:#fff;--surface-sunken:#f8f9fa;--surface-muted:#e5e7e9;--border:#e0e0e0;--border-input:#e0e0e0;--ink-rgb:16, 24, 32;--ink-5:rgba(var(--ink-rgb), .05);--danger-bg:#fdeaea;--danger-text:#c8281c;--danger-text-dark:#b91c1c;--danger-rgb:200, 40, 28;--success-bg:#e3f6ea;--success-text:#27794a;--warning-bg:#fff1d6;--warning-text:#8f5d00;--disabled-bg:#c4c4c4;--disabled-text:#8a8a8a;--control-height-sm:36px;--control-height-base:44px;--radius-sm:10px;--radius-base:12px;--font-family-base:"Inter", sans-serif;--font-size-sm:.75rem;--font-size-base:.875rem;--font-size-lg:1rem;--font-weight-regular:400;--font-weight-medium:500;--font-weight-semibold:600;--line-height-base:1.5;--line-height-tight:1.25}.text-base{font-family:var(--font-family-base);font-size:var(--font-size-base);font-weight:var(--font-weight-regular);line-height:var(--line-height-base)}.text-medium{font-weight:var(--font-weight-medium)}.text-sm{font-size:var(--font-size-sm)}.text-lg{font-size:var(--font-size-lg)}.text-2-line{line-height:var(--line-height-tight)}
2
2
  /*$vite$:1*/
package/dist/index.js CHANGED
@@ -1,29 +1,37 @@
1
1
  import { Fragment as e, jsx as t, jsxs as n } from "react/jsx-runtime";
2
2
  import { Fragment as r, createContext as i, createElement as a, forwardRef as o, useContext as s, useEffect as c, useId as l, useLayoutEffect as u, useRef as d, useState as f } from "react";
3
3
  var p = {
4
- primary: "_primary_1jfxz_1",
5
- secondary: "_secondary_1jfxz_2",
6
- tertiary: "_tertiary_1jfxz_3",
7
- dangerous: "_dangerous_1jfxz_4",
8
- sm: "_sm_1jfxz_28",
9
- base: "_base_1jfxz_34",
10
- icon: "_icon_1jfxz_40",
11
- iconOnly: "_iconOnly_1jfxz_59"
4
+ primary: "_primary_qb0uf_1",
5
+ secondary: "_secondary_qb0uf_2",
6
+ tertiary: "_tertiary_qb0uf_3",
7
+ dangerous: "_dangerous_qb0uf_4",
8
+ sm: "_sm_qb0uf_28",
9
+ base: "_base_qb0uf_34",
10
+ icon: "_icon_qb0uf_40",
11
+ iconOnly: "_iconOnly_qb0uf_59",
12
+ fullWidth: "_fullWidth_qb0uf_69"
12
13
  };
13
14
  //#endregion
14
15
  //#region src/components/Button.tsx
15
- function m({ variant: e = "primary", size: r = "base", leadingIcon: i, trailingIcon: a, children: o, ...s }) {
16
- let c = !o && !!i;
16
+ function m({ variant: e = "primary", size: r = "base", leadingIcon: i, trailingIcon: a, fullWidth: o, children: s, className: c, ref: l, ...u }) {
17
+ let d = !s && !!i, f = [
18
+ p[e],
19
+ p[r],
20
+ d && p.iconOnly,
21
+ o && p.fullWidth,
22
+ c
23
+ ].filter(Boolean).join(" ");
17
24
  return /* @__PURE__ */ n("button", {
25
+ ref: l,
18
26
  type: "button",
19
- className: `${p[e]} ${p[r]}${c ? ` ${p.iconOnly}` : ""}`,
20
- ...s,
27
+ className: f,
28
+ ...u,
21
29
  children: [
22
30
  i && /* @__PURE__ */ t("span", {
23
31
  className: p.icon,
24
32
  children: i
25
33
  }),
26
- o,
34
+ s,
27
35
  a && /* @__PURE__ */ t("span", {
28
36
  className: p.icon,
29
37
  children: a
@@ -60,12 +68,12 @@ function g({ stacked: e, completed: r, interactive: i, draggable: a, dragging: o
60
68
  });
61
69
  }
62
70
  var _ = {
63
- neutral: "_neutral_10sg3_1",
64
- pill: "_pill_10sg3_2",
65
- accent: "_accent_10sg3_3",
66
- success: "_success_10sg3_4",
67
- danger: "_danger_10sg3_5",
68
- count: "_count_10sg3_6"
71
+ neutral: "_neutral_1p1lj_1",
72
+ pill: "_pill_1p1lj_2",
73
+ accent: "_accent_1p1lj_3",
74
+ success: "_success_1p1lj_4",
75
+ danger: "_danger_1p1lj_5",
76
+ count: "_count_1p1lj_6"
69
77
  };
70
78
  //#endregion
71
79
  //#region src/components/Tag.tsx
@@ -77,15 +85,15 @@ function v({ variant: e = "neutral", children: n, ...r }) {
77
85
  });
78
86
  }
79
87
  var y = {
80
- group: "_group_1v2tb_1",
81
- sm: "_sm_1v2tb_9",
82
- chip: "_chip_1v2tb_13",
83
- base: "_base_1v2tb_33",
84
- selected: "_selected_1v2tb_59"
88
+ group: "_group_taxgk_1",
89
+ sm: "_sm_taxgk_9",
90
+ chip: "_chip_taxgk_13",
91
+ base: "_base_taxgk_33",
92
+ selected: "_selected_taxgk_59"
85
93
  }, b = {
86
94
  group: "_group_16vyf_1",
87
95
  groupLabel: "_groupLabel_16vyf_7"
88
- }, x = { label: "_label_h1zwu_1" };
96
+ }, x = { label: "_label_10zsm_1" };
89
97
  //#endregion
90
98
  //#region src/components/FieldLabel.tsx
91
99
  function S({ children: e, htmlFor: n, className: r }) {
@@ -294,12 +302,12 @@ var N = A(M), P = {
294
302
  };
295
303
  P.node;
296
304
  var ce = A(P), F = {
297
- toolbar: "_toolbar_1rsvo_1",
298
- searchWrap: "_searchWrap_1rsvo_14",
299
- searchIcon: "_searchIcon_1rsvo_33",
300
- search: "_search_1rsvo_14",
301
- searchShortcut: "_searchShortcut_1rsvo_61",
302
- controls: "_controls_1rsvo_78"
305
+ toolbar: "_toolbar_1s82l_1",
306
+ searchWrap: "_searchWrap_1s82l_14",
307
+ searchIcon: "_searchIcon_1s82l_33",
308
+ search: "_search_1s82l_14",
309
+ searchShortcut: "_searchShortcut_1s82l_61",
310
+ controls: "_controls_1s82l_78"
303
311
  };
304
312
  //#endregion
305
313
  //#region src/components/Toolbar.tsx
@@ -489,16 +497,16 @@ function U({ checked: e, onChange: r, size: i = "base", label: a, ariaLabel: o,
489
497
  });
490
498
  }
491
499
  var W = {
492
- field: "_field_5pblk_1",
493
- inputWrap: "_inputWrap_5pblk_6",
494
- errorWrap: "_errorWrap_5pblk_19",
495
- input: "_input_5pblk_6",
496
- toolbar: "_toolbar_5pblk_27",
497
- sm: "_sm_5pblk_57",
498
- base: "_base_5pblk_65",
499
- icon: "_icon_5pblk_73",
500
- helperText: "_helperText_5pblk_111",
501
- errorText: "_errorText_5pblk_116"
500
+ field: "_field_r5pku_1",
501
+ inputWrap: "_inputWrap_r5pku_6",
502
+ errorWrap: "_errorWrap_r5pku_19",
503
+ input: "_input_r5pku_6",
504
+ toolbar: "_toolbar_r5pku_27",
505
+ sm: "_sm_r5pku_57",
506
+ base: "_base_r5pku_65",
507
+ icon: "_icon_r5pku_73",
508
+ helperText: "_helperText_r5pku_111",
509
+ errorText: "_errorText_r5pku_116"
502
510
  };
503
511
  //#endregion
504
512
  //#region src/components/TextField.tsx
@@ -533,16 +541,16 @@ function ue({ label: e, helperText: r, error: i, size: a = "base", variant: o =
533
541
  });
534
542
  }
535
543
  var G = {
536
- field: "_field_1vl88_1",
537
- inputWrap: "_inputWrap_1vl88_6",
538
- errorWrap: "_errorWrap_1vl88_19",
539
- input: "_input_1vl88_6",
540
- sm: "_sm_1vl88_27",
541
- base: "_base_1vl88_35",
542
- prefix: "_prefix_1vl88_43",
543
- suffix: "_suffix_1vl88_46",
544
- helperText: "_helperText_1vl88_94",
545
- errorText: "_errorText_1vl88_99"
544
+ field: "_field_tr8ir_1",
545
+ inputWrap: "_inputWrap_tr8ir_6",
546
+ errorWrap: "_errorWrap_tr8ir_19",
547
+ input: "_input_tr8ir_6",
548
+ sm: "_sm_tr8ir_27",
549
+ base: "_base_tr8ir_35",
550
+ prefix: "_prefix_tr8ir_43",
551
+ suffix: "_suffix_tr8ir_46",
552
+ helperText: "_helperText_tr8ir_94",
553
+ errorText: "_errorText_tr8ir_99"
546
554
  };
547
555
  //#endregion
548
556
  //#region src/components/NumberField.tsx
@@ -604,13 +612,13 @@ function fe() {
604
612
  });
605
613
  }
606
614
  var J = {
607
- item: "_item_1dj12_1",
608
- icon: "_icon_1dj12_25",
609
- check: "_check_1dj12_26",
610
- label: "_label_1dj12_54",
611
- trailing: "_trailing_1dj12_61",
612
- selected: "_selected_1dj12_66",
613
- destructive: "_destructive_1dj12_87"
615
+ item: "_item_nrbhu_1",
616
+ icon: "_icon_nrbhu_25",
617
+ check: "_check_nrbhu_26",
618
+ label: "_label_nrbhu_54",
619
+ trailing: "_trailing_nrbhu_61",
620
+ selected: "_selected_nrbhu_67",
621
+ destructive: "_destructive_nrbhu_88"
614
622
  };
615
623
  //#endregion
616
624
  //#region src/components/MenuItem.tsx
@@ -776,24 +784,24 @@ function ge({ text: n, query: i }) {
776
784
  }, n) : /* @__PURE__ */ t(r, { children: e }, n)) });
777
785
  }
778
786
  var Z = {
779
- group: "_group_51gk7_1",
780
- btn: "_btn_51gk7_4",
781
- caret: "_caret_51gk7_29",
782
- label: "_label_51gk7_38",
783
- badge: "_badge_51gk7_41",
784
- value: "_value_51gk7_56",
785
- panel: "_panel_51gk7_60",
786
- open: "_open_51gk7_76",
787
- panelRight: "_panelRight_51gk7_79",
788
- panelWide: "_panelWide_51gk7_83",
789
- sectionHeader: "_sectionHeader_51gk7_87",
790
- sectionLabel: "_sectionLabel_51gk7_94",
791
- allToggle: "_allToggle_51gk7_101",
792
- divider: "_divider_51gk7_114",
793
- option: "_option_51gk7_119",
794
- search: "_search_51gk7_131",
795
- optionsList: "_optionsList_51gk7_147",
796
- empty: "_empty_51gk7_150"
787
+ group: "_group_17bb8_1",
788
+ btn: "_btn_17bb8_4",
789
+ caret: "_caret_17bb8_29",
790
+ label: "_label_17bb8_38",
791
+ badge: "_badge_17bb8_41",
792
+ value: "_value_17bb8_56",
793
+ panel: "_panel_17bb8_60",
794
+ open: "_open_17bb8_76",
795
+ panelRight: "_panelRight_17bb8_79",
796
+ panelWide: "_panelWide_17bb8_83",
797
+ sectionHeader: "_sectionHeader_17bb8_87",
798
+ sectionLabel: "_sectionLabel_17bb8_94",
799
+ allToggle: "_allToggle_17bb8_101",
800
+ divider: "_divider_17bb8_114",
801
+ option: "_option_17bb8_119",
802
+ search: "_search_17bb8_131",
803
+ optionsList: "_optionsList_17bb8_147",
804
+ empty: "_empty_17bb8_150"
797
805
  };
798
806
  //#endregion
799
807
  //#region src/components/FilterSection.tsx
@@ -836,16 +844,16 @@ function Q({ label: e, options: r, optionLabel: i, activeSet: a, onToggle: o, on
836
844
  ] });
837
845
  }
838
846
  var $ = {
839
- line: "_line_tih91_1",
840
- box: "_box_tih91_2",
841
- indicator: "_indicator_tih91_9",
842
- settling: "_settling_tih91_17",
843
- indicatorLine: "_indicatorLine_tih91_21",
844
- indicatorBox: "_indicatorBox_tih91_27",
845
- tab: "_tab_tih91_35",
846
- selected: "_selected_tih91_80",
847
- icon: "_icon_tih91_89",
848
- sm: "_sm_tih91_152"
847
+ line: "_line_qm5u2_1",
848
+ box: "_box_qm5u2_2",
849
+ indicator: "_indicator_qm5u2_9",
850
+ settling: "_settling_qm5u2_17",
851
+ indicatorLine: "_indicatorLine_qm5u2_21",
852
+ indicatorBox: "_indicatorBox_qm5u2_27",
853
+ tab: "_tab_qm5u2_35",
854
+ selected: "_selected_qm5u2_80",
855
+ icon: "_icon_qm5u2_89",
856
+ sm: "_sm_qm5u2_152"
849
857
  };
850
858
  //#endregion
851
859
  //#region src/components/Tabs.tsx
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["__iconData","__iconData"],"sources":["../src/components/Button.module.css","../src/components/Button.tsx","../src/components/Card.module.css","../src/components/Card.tsx","../src/components/Tag.module.css","../src/components/Tag.tsx","../src/components/TagGroup.module.css","../src/components/OptionGroup.module.css","../src/components/FieldLabel.module.css","../src/components/FieldLabel.tsx","../src/components/TagGroup.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toLucideIconData.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs","../node_modules/lucide-react/dist/esm/shared/src/build/defaultAttributes.mjs","../node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconNode.mjs","../node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconForReact.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs","../node_modules/lucide-react/dist/esm/context.mjs","../node_modules/lucide-react/dist/esm/Icon.mjs","../node_modules/lucide-react/dist/esm/createLucideIcon.mjs","../node_modules/lucide-react/dist/esm/icons/check.mjs","../node_modules/lucide-react/dist/esm/icons/chevron-down.mjs","../node_modules/lucide-react/dist/esm/icons/search.mjs","../src/components/Toolbar.module.css","../src/components/Toolbar.tsx","../src/components/Checkbox.module.css","../src/components/Checkbox.tsx","../src/components/RadioButton.module.css","../src/components/RadioButton.tsx","../src/components/Switch.module.css","../src/components/Switch.tsx","../src/components/TextField.module.css","../src/components/TextField.tsx","../src/components/NumberField.module.css","../src/components/NumberField.tsx","../src/components/Menu.module.css","../src/components/Menu.tsx","../src/components/MenuItem.module.css","../src/components/MenuItem.tsx","../src/components/Dropdown.module.css","../src/components/Dropdown.tsx","../src/components/HighlightText.module.css","../src/components/HighlightText.tsx","../src/components/FilterSection.module.css","../src/components/FilterSection.tsx","../src/components/Tabs.module.css","../src/components/Tabs.tsx","../src/utils/format.ts"],"sourcesContent":[".primary,\n.secondary,\n.tertiary,\n.dangerous {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n border: none;\n font-family: inherit;\n font-weight: 450;\n letter-spacing: 0.01em;\n cursor: pointer;\n transition:\n color 0.2s ease,\n transform 0.2s ease-out;\n}\n.primary:active:not(:disabled),\n.secondary:active:not(:disabled),\n.tertiary:active:not(:disabled),\n.dangerous:active:not(:disabled) {\n transform: scale(0.95);\n}\n\n.sm {\n height: var(--control-height-sm);\n border-radius: var(--radius-sm);\n padding: 0 12px;\n font-size: 0.9rem;\n}\n.base {\n height: var(--control-height-base);\n border-radius: var(--radius-base);\n padding: 0 16px;\n font-size: 0.9rem;\n}\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n}\n.icon:first-child {\n margin-left: -4px;\n}\n.icon:last-child {\n margin-right: -4px;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n\n.iconOnly {\n box-sizing: border-box;\n padding: 0;\n}\n.iconOnly.sm {\n width: var(--control-height-sm);\n}\n.iconOnly.base {\n width: var(--control-height-base);\n}\n.primary::before,\n.secondary::before,\n.tertiary::before,\n.dangerous::before {\n content: '';\n position: absolute;\n left: 50%;\n bottom: 0;\n width: 24%;\n aspect-ratio: 1;\n border-radius: 50%;\n transform: translate(-50%, 100%) scale(1);\n transition: transform 0.3s cubic-bezier(0.39, 0.575, 0.565, 1);\n z-index: -1;\n pointer-events: none;\n}\n.primary:hover::before,\n.secondary:hover::before,\n.tertiary:hover::before,\n.dangerous:hover::before {\n transform: translate(-50%, 15%) scale(8);\n}\n\n.primary {\n background: var(--brand-dark);\n color: #fff;\n font-weight: 400;\n letter-spacing: 0.02em;\n}\n.primary::before {\n background: rgba(255, 255, 255, 0.08);\n}\n.primary:active:not(:disabled)::before {\n background: rgba(0, 0, 0, 0.08);\n}\n\n.secondary {\n background: var(--ink-5);\n color: var(--text-primary);\n}\n.secondary .icon {\n color: var(--text-secondary);\n}\n.secondary::before {\n background: rgba(var(--brand-main-rgb), 0.08);\n}\n.secondary:active:not(:disabled)::before {\n background: rgba(var(--brand-main-rgb), 0.28);\n}\n.secondary:hover .icon {\n color: var(--brand-main);\n}\n.secondary:hover {\n color: var(--brand-main);\n}\n\n.tertiary {\n background: transparent;\n color: var(--text-secondary);\n}\n.tertiary::before {\n background: rgba(var(--brand-main-rgb), 0.16);\n}\n.tertiary:active:not(:disabled)::before {\n background: rgba(var(--brand-main-rgb), 0.28);\n}\n.tertiary:hover,\n.tertiary:active:not(:disabled) {\n background: var(--bg);\n}\n.tertiary:hover {\n color: var(--brand-main);\n}\n\n.dangerous {\n background: var(--danger-bg);\n color: var(--danger-text-dark);\n}\n.dangerous::before {\n background: rgba(var(--danger-rgb), 0.16);\n}\n.dangerous:active:not(:disabled)::before {\n background: rgba(var(--danger-rgb), 0.28);\n}\n\n.primary:disabled,\n.secondary:disabled,\n.tertiary:disabled,\n.dangerous:disabled {\n background: var(--disabled-bg);\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.primary:disabled:hover,\n.secondary:disabled:hover,\n.tertiary:disabled:hover,\n.dangerous:disabled:hover {\n color: var(--disabled-text);\n}\n.primary:disabled::before,\n.secondary:disabled::before,\n.tertiary:disabled::before,\n.dangerous:disabled::before {\n display: none;\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport styles from './Button.module.css';\n\ntype ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'dangerous';\ntype ButtonSize = 'sm' | 'base';\n\ninterface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className'> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Icon shown before the label. Omit `children` to render an icon-only square button — pass `aria-label` in that case. */\n leadingIcon?: ReactNode;\n /** Icon shown after the label. */\n trailingIcon?: ReactNode;\n children?: ReactNode;\n}\n\nexport function Button({\n variant = 'primary',\n size = 'base',\n leadingIcon,\n trailingIcon,\n children,\n ...rest\n}: ButtonProps) {\n const iconOnly = !children && Boolean(leadingIcon);\n return (\n <button\n type=\"button\"\n className={`${styles[variant]} ${styles[size]}${iconOnly ? ` ${styles.iconOnly}` : ''}`}\n {...rest}\n >\n {leadingIcon && <span className={styles.icon}>{leadingIcon}</span>}\n {children}\n {trailingIcon && <span className={styles.icon}>{trailingIcon}</span>}\n </button>\n );\n}\n",".wrap {\n position: relative;\n width: 220px;\n flex: 0 0 220px;\n}\n.wrap:hover {\n z-index: 10;\n}\n.fluid {\n width: 100%;\n flex: none;\n}\n\n.backing {\n position: absolute;\n left: 6px;\n right: 6px;\n bottom: -4px;\n height: 10px;\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border);\n border-radius: 0 0 14px 14px;\n z-index: 0;\n}\n.backing.completed {\n background: var(--success-bg);\n box-shadow: inset 0 0 0 1px #bfe3cc;\n}\n\n.card {\n position: relative;\n z-index: 1;\n width: 100%;\n box-sizing: border-box;\n background: var(--card-surface);\n box-shadow:\n inset 0 0 0 1px #efefef,\n 0 1px 2px rgba(16, 24, 32, 0.04);\n border-radius: 16px;\n padding: 12px 14px;\n cursor: default;\n transition:\n box-shadow 0.2s,\n transform 0.1s;\n}\n.card.interactive {\n cursor: pointer;\n}\n.card.interactive:active {\n transform: scale(0.98, 0.95);\n}\n.card.grabbable {\n cursor: grab;\n}\n.card.grabbable:active {\n cursor: grabbing;\n}\n.card.dragging,\n.card.dragging:hover {\n box-shadow:\n inset 0 0 0 1px #efefef,\n 0 1px 2px rgba(16, 24, 32, 0.04);\n}\n.card.interactive:hover {\n box-shadow:\n inset 0 0 0 1px #efefef,\n 0 0 0 2px var(--brand-main);\n}\n.card.completed {\n background: var(--success-bg);\n box-shadow:\n inset 0 0 0 1px #bfe3cc,\n 0 1px 2px rgba(16, 24, 32, 0.04),\n 0 2px 8px rgba(16, 24, 32, 0.06);\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport styles from './Card.module.css';\n\ninterface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'className'> {\n /** Shows a second sheet behind the card, for representing a stack/batch. */\n stacked?: boolean;\n /** Success-tinted surface, e.g. a completed task. */\n completed?: boolean;\n /** Adds pointer cursor + accent hover ring. */\n interactive?: boolean;\n /** Grab cursor, for drag sources — pair with `interactive`. */\n draggable?: boolean;\n /** Suppresses the hover ring while a drag is in progress. */\n dragging?: boolean;\n /** Card fills its container width instead of a fixed width. */\n fluid?: boolean;\n children: ReactNode;\n}\n\nexport function Card({\n stacked,\n completed,\n interactive,\n draggable,\n dragging,\n fluid,\n children,\n ...rest\n}: CardProps) {\n return (\n <div className={`${styles.wrap} ${fluid ? styles.fluid : ''}`}>\n {stacked && <div className={`${styles.backing} ${completed ? styles.completed : ''}`} />}\n <div\n className={[\n styles.card,\n completed ? styles.completed : '',\n interactive ? styles.interactive : '',\n draggable ? styles.grabbable : '',\n dragging ? styles.dragging : '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </div>\n </div>\n );\n}\n",".neutral,\n.pill,\n.accent,\n.success,\n.danger,\n.count {\n display: inline-flex;\n align-items: center;\n font-weight: 500;\n white-space: nowrap;\n}\n\n/* Square tags — e.g. day badges, worker names, video panel tags */\n.neutral {\n color: var(--text-tertiary);\n font-size: 0.75rem;\n background: var(--ink-5);\n border-radius: 6px;\n padding: 2px 7px;\n}\n\n/* Pill tags — e.g. BPO group labels, total-duration tags */\n.pill {\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border);\n color: var(--text-tertiary);\n font-size: 0.8rem;\n padding: 3px 11px;\n border-radius: 999px;\n}\n\n/* Accent pill — e.g. \"current\" stat, read-only banner badge */\n.accent {\n background: var(--brand-bg);\n color: var(--brand-dark);\n font-size: 0.8rem;\n padding: 3px 11px;\n border-radius: 999px;\n}\n\n/* Success pill — e.g. \"time spent\" stat */\n.success {\n background: var(--success-bg);\n color: var(--success-text);\n font-size: 0.8rem;\n padding: 3px 11px;\n border-radius: 999px;\n}\n\n/* Danger — square (e.g. ASAP tag) reuses the same token pair as the\n pill-shaped status variant; only the shape differs by context. */\n.danger {\n color: var(--danger-text);\n font-size: 0.75rem;\n background: var(--danger-bg);\n border-radius: 6px;\n padding: 2px 7px;\n}\n\n/* Count badge — small solid circle, e.g. active-filter count */\n.count {\n justify-content: center;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 999px;\n background: var(--brand-main);\n color: #fff;\n font-size: 0.65rem;\n line-height: 16px;\n text-align: center;\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport styles from './Tag.module.css';\n\ntype TagVariant = 'neutral' | 'pill' | 'accent' | 'success' | 'danger' | 'count';\n\ninterface TagProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'className'> {\n variant?: TagVariant;\n children: ReactNode;\n}\n\nexport function Tag({ variant = 'neutral', children, ...rest }: TagProps) {\n return (\n <span className={styles[variant]} {...rest}>\n {children}\n </span>\n );\n}\n",".group {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n margin-top: 4px;\n}\n\n.group.sm {\n gap: 6px;\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n appearance: none;\n border: none;\n outline: none;\n font-family: inherit;\n font-weight: 500;\n white-space: nowrap;\n border-radius: 999px;\n cursor: pointer;\n transition:\n background-color 0.15s ease-out,\n color 0.15s ease-out,\n transform 0.1s ease-out;\n background: var(--ink-5);\n color: var(--text-primary);\n}\n\n.group.base .chip {\n height: 36px;\n padding: 0 14px;\n font-size: 0.85rem;\n}\n\n.group.sm .chip {\n height: 24px;\n padding: 0 9px;\n font-size: 0.75rem;\n}\n\n.chip:hover:not(:disabled) {\n background: var(--surface-muted);\n}\n\n.chip:active:not(:disabled) {\n transform: scale(0.95);\n background: var(--surface-muted);\n}\n\n.chip:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n}\n\n.chip.selected {\n background: var(--brand-bg);\n color: var(--brand-main);\n}\n\n.chip.selected:hover:not(:disabled) {\n background: var(--brand-main-20);\n}\n\n.chip.selected:active:not(:disabled) {\n background: var(--brand-main-30);\n}\n\n.chip:disabled {\n background: var(--disabled-bg);\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n",".group {\n display: inline-flex;\n flex-direction: column;\n gap: 0;\n}\n\n.groupLabel {\n margin-bottom: 6px;\n}\n",".label {\n font-size: 0.85rem;\n font-weight: 550;\n color: var(--text-primary);\n padding-left: 4px;\n}\n","import type { ReactNode } from 'react';\nimport styles from './FieldLabel.module.css';\n\ninterface FieldLabelProps {\n children: ReactNode;\n /** Pass the id of the control this labels to render a real `<label htmlFor>`. */\n htmlFor?: string;\n className?: string;\n}\n\nexport function FieldLabel({ children, htmlFor, className }: FieldLabelProps) {\n const classes = `${styles.label} ${className ?? ''}`.trim();\n if (htmlFor) {\n return (\n <label className={classes} htmlFor={htmlFor}>\n {children}\n </label>\n );\n }\n return <span className={classes}>{children}</span>;\n}\n","import type { ReactNode } from 'react';\nimport styles from './TagGroup.module.css';\nimport groupStyles from './OptionGroup.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ntype TagGroupSize = 'sm' | 'base';\n\ninterface TagGroupItem {\n value: string;\n label: ReactNode;\n disabled?: boolean;\n}\n\ninterface TagGroupProps {\n items: TagGroupItem[];\n value: string[];\n onChange: (value: string[]) => void;\n size?: TagGroupSize;\n disabled?: boolean;\n label?: ReactNode;\n 'aria-label'?: string;\n}\n\nexport function TagGroup({\n items,\n value,\n onChange,\n size = 'base',\n disabled = false,\n label,\n ...rest\n}: TagGroupProps) {\n function toggle(itemValue: string) {\n const next = value.includes(itemValue)\n ? value.filter((v) => v !== itemValue)\n : [...value, itemValue];\n onChange(next);\n }\n\n const tags = (\n <div\n role=\"group\"\n aria-label={label ? undefined : rest['aria-label']}\n className={`${styles.group} ${styles[size]}`}\n >\n {items.map((item) => {\n const selected = value.includes(item.value);\n const isDisabled = disabled || item.disabled;\n return (\n <button\n key={item.value}\n type=\"button\"\n aria-pressed={selected}\n disabled={isDisabled}\n className={[styles.chip, selected && styles.selected].filter(Boolean).join(' ')}\n onClick={() => !isDisabled && toggle(item.value)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n );\n\n if (!label) return tags;\n\n return (\n <div className={groupStyles.group} {...rest}>\n <FieldLabel className={groupStyles.groupLabel}>{label}</FieldLabel>\n {tags}\n </div>\n );\n}\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string?.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toKebabCase } from './toKebabCase.mjs';\n\nfunction toLucideIconData(iconName, iconNode, aliases = []) {\n if (iconNode == null) {\n throw new Error(\"[lucide]: iconNode is required when icon name is used\");\n }\n return {\n name: toKebabCase(iconName),\n size: 24,\n node: iconNode,\n ...aliases.length > 0 ? { aliases } : {}\n };\n}\n\nexport { toLucideIconData };\n//# sourceMappingURL=toLucideIconData.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => {\n let out = \"\";\n let upperNext = false;\n for (const ch of string) {\n if (ch === \"-\" || ch === \"_\" || ch <= \" \") {\n upperNext = out.length > 0;\n continue;\n }\n if (out.length === 0) {\n out += ch.toLowerCase();\n } else {\n out += upperNext ? ch.toUpperCase() : ch;\n }\n upperNext = false;\n }\n return out;\n};\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { mergeClasses } from '../utils/mergeClasses.mjs';\n\nfunction isDefined(value) {\n return value !== null && value !== void 0;\n}\nfunction buildLucideIconNode(icon, params = {}) {\n const attributeNames = params.attributeNames ?? {};\n const getAttributeName = (attributeName) => attributeNames[attributeName] ?? attributeName;\n const viewBoxWidth = icon.size ?? icon.width ?? defaultAttributes[\"width\"];\n const viewBoxHeight = icon.size ?? icon.height ?? defaultAttributes[\"height\"];\n const aliasClassNames = icon.aliases?.filter((alias) => typeof alias === \"string\" && alias.trim() !== \"\").map((alias) => `lucide-${alias}`) ?? [];\n const iconClassNames = [...icon.name ? [`lucide-${icon.name}`] : [], ...aliasClassNames];\n const classNamesFromClassName = params.className?.split(\" \").filter(Boolean) ?? [];\n const className = params.includeDefaultClasses === false ? mergeClasses(...classNamesFromClassName) : mergeClasses(\"lucide\", ...iconClassNames, ...classNamesFromClassName);\n const calculatedStrokeWidth = params.absoluteStrokeWidth ? Number(params.strokeWidth ?? defaultAttributes[\"stroke-width\"]) * Number(icon.size ?? icon.width ?? defaultAttributes[\"width\"]) / Number(params.size ?? params.width ?? defaultAttributes[\"width\"]) : params.strokeWidth ?? defaultAttributes[\"stroke-width\"];\n const attributes = {\n ...Object.entries(defaultAttributes).reduce((attrs, [attrName, value]) => {\n attrs[getAttributeName(attrName)] = value;\n return attrs;\n }, {}),\n ...\"color\" in params && params.color && {\n [getAttributeName(\"stroke\")]: params.color\n },\n ...\"size\" in params && isDefined(params.size) && {\n [getAttributeName(\"width\")]: params.size,\n [getAttributeName(\"height\")]: params.size\n },\n ...\"width\" in params && isDefined(params.width) && {\n [getAttributeName(\"width\")]: params.width\n },\n ...\"height\" in params && isDefined(params.height) && {\n [getAttributeName(\"height\")]: params.height\n },\n [getAttributeName(\"stroke-width\")]: calculatedStrokeWidth,\n ...className && {\n [getAttributeName(\"class\")]: className\n },\n [getAttributeName(\"viewBox\")]: `0 0 ${viewBoxWidth} ${viewBoxHeight}`,\n ...params.hasA11yProp === false ? {\n [getAttributeName(\"aria-hidden\")]: \"true\"\n } : {},\n ...\"attributes\" in params && params.attributes\n };\n return [\n \"svg\",\n attributes,\n icon.node.map((child) => {\n const [name, attrs, children] = child;\n const nextAttrs = params.nonScalingStroke ? { [getAttributeName(\"vector-effect\")]: \"non-scaling-stroke\", ...attrs } : attrs;\n return children ? [name, nextAttrs, children] : [name, nextAttrs];\n })\n ];\n}\n\nexport { buildLucideIconNode as default };\n//# sourceMappingURL=buildLucideIconNode.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport buildLucideIconNode from './buildLucideIconNode.mjs';\n\nfunction buildLucideIconForReact(icon, params = {}) {\n return buildLucideIconNode(icon, {\n ...params,\n attributeNames: {\n ...params.attributeNames,\n class: \"className\",\n \"stroke-width\": \"strokeWidth\",\n \"stroke-linecap\": \"strokeLinecap\",\n \"stroke-linejoin\": \"strokeLinejoin\",\n \"vector-effect\": \"vectorEffect\"\n }\n });\n}\n\nexport { buildLucideIconForReact as default };\n//# sourceMappingURL=buildLucideIconForReact.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, nonScalingStroke, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport buildLucideIconForReact from './shared/src/build/buildLucideIconForReact.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({\n color,\n size,\n width,\n height,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className = \"\",\n children,\n iconNode = [],\n icon = {\n node: iconNode,\n aliases: [],\n size: 24\n },\n ...rest\n }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n nonScalingStroke: contextNonScalingStroke = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const hasAccessibleProp = Boolean(children) || hasA11yProp(rest);\n const [name, svgAttributes, builtIconNode = []] = buildLucideIconForReact(icon, {\n color: color ?? contextColor,\n width: width ?? size ?? contextSize,\n height: height ?? size ?? contextSize,\n strokeWidth: strokeWidth ?? contextStrokeWidth,\n absoluteStrokeWidth: absoluteStrokeWidth ?? contextAbsoluteStrokeWidth,\n nonScalingStroke: nonScalingStroke ?? contextNonScalingStroke,\n className: mergeClasses(contextClass, className),\n hasA11yProp: hasAccessibleProp,\n attributes: rest\n });\n return createElement(\n name,\n {\n ref,\n ...svgAttributes\n },\n [\n ...builtIconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { toLucideIconData } from './shared/src/utils/toLucideIconData.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nfunction createLucideIcon(iconDataOrName, iconNode = [], aliases = []) {\n const iconData = typeof iconDataOrName === \"string\" ? toLucideIconData(iconDataOrName, iconNode, aliases) : iconDataOrName;\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n icon: iconData,\n className,\n ...props\n })\n );\n if (iconData.name) {\n Component.displayName = toPascalCase(iconData.name);\n }\n return Component;\n}\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"check\",\n size: 24,\n node: [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]]\n};\n__iconData.node;\nconst Check = createLucideIcon(__iconData);\n\nexport { __iconData, Check as default };\n//# sourceMappingURL=check.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"chevron-down\",\n size: 24,\n node: [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]]\n};\n__iconData.node;\nconst ChevronDown = createLucideIcon(__iconData);\n\nexport { __iconData, ChevronDown as default };\n//# sourceMappingURL=chevron-down.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"search\",\n size: 24,\n node: [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n ]\n};\n__iconData.node;\nconst Search = createLucideIcon(__iconData);\n\nexport { __iconData, Search as default };\n//# sourceMappingURL=search.mjs.map\n",".toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 0 8px;\n background: var(--card-surface);\n border-radius: 16px;\n box-shadow:\n inset 0 0 0 1px var(--border),\n 0 1px 2px rgba(16, 24, 32, 0.04),\n 0 2px 8px rgba(16, 24, 32, 0.06);\n}\n.searchWrap {\n position: relative;\n flex: 1;\n min-width: 0;\n}\n.searchWrap::after {\n content: '';\n position: absolute;\n left: 36px;\n right: 0;\n bottom: 0;\n height: 2px;\n background: var(--brand-main);\n opacity: 0;\n pointer-events: none;\n}\n.searchWrap:focus-within::after {\n opacity: 1;\n}\n.searchIcon {\n position: absolute;\n top: 50%;\n left: 12px;\n width: 16px;\n height: 16px;\n transform: translateY(-53%);\n color: var(--text-tertiary);\n pointer-events: none;\n}\n.searchIcon svg {\n width: 100%;\n height: 100%;\n}\n.search {\n width: 100%;\n box-sizing: border-box;\n border: none;\n padding: 16px 52px 16px 36px;\n font-family: inherit;\n font-size: 1rem;\n color: var(--text-primary);\n background: none;\n box-shadow: inset -1px 0 0 var(--border);\n}\n.search:focus {\n outline: none;\n}\n.searchShortcut {\n position: absolute;\n top: 50%;\n right: 8px;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2px 6px;\n border-radius: 6px;\n background: var(--bg);\n color: var(--text-tertiary);\n font-size: 0.75rem;\n font-weight: 600;\n letter-spacing: 0.02em;\n pointer-events: none;\n}\n.controls {\n display: flex;\n align-items: center;\n flex: none;\n}\n","import { useEffect, useRef, type ChangeEvent, type ReactNode } from 'react';\nimport { Search } from 'lucide-react';\nimport styles from './Toolbar.module.css';\n\ninterface ToolbarProps {\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n placeholder?: string;\n /** Text shown in the keyboard-shortcut badge, e.g. \"⌘K\". Omit to hide the badge. */\n shortcutLabel?: string;\n /** Focuses the search input when Cmd/Ctrl + the shortcut key is pressed. */\n shortcutKey?: string;\n /** Right-side content — filter/sort controls, actions, etc. */\n children?: ReactNode;\n}\n\nexport function Toolbar({\n searchValue,\n onSearchChange,\n placeholder = 'Search…',\n shortcutLabel = '⌘K',\n shortcutKey = 'k',\n children,\n}: ToolbarProps) {\n const searchRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n function onKeyDown(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === shortcutKey.toLowerCase()) {\n e.preventDefault();\n searchRef.current?.focus();\n }\n }\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [shortcutKey]);\n\n return (\n <div className={styles.toolbar}>\n <div className={styles.searchWrap}>\n <span className={styles.searchIcon}>\n <Search />\n </span>\n <input\n ref={searchRef}\n type=\"text\"\n className={styles.search}\n placeholder={placeholder}\n autoComplete=\"off\"\n value={searchValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onSearchChange?.(e.target.value)}\n />\n {shortcutLabel && (\n <span className={styles.searchShortcut} aria-hidden=\"true\">\n {shortcutLabel}\n </span>\n )}\n </div>\n {children && <div className={styles.controls}>{children}</div>}\n </div>\n );\n}\n",".checkbox {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n padding: 8px 4px;\n}\n.control {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n}\n.labelText {\n font-size: 0.85rem;\n color: var(--text-primary);\n transition: color 0.2s ease-out;\n}\n.checkbox:hover .labelText {\n color: var(--brand-main);\n}\n.input {\n position: absolute;\n inset: 0;\n margin: 0;\n opacity: 0;\n cursor: pointer;\n}\n.box {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border-radius: 6px;\n background: var(--ink-5);\n box-shadow: inset 0 0 0 1px var(--border);\n transition:\n background-color 0.2s cubic-bezier(0, 0, 0.2, 1),\n box-shadow 0.2s cubic-bezier(0, 0, 0.2, 1),\n transform 0.1s cubic-bezier(0, 0, 0.2, 1);\n}\n.checkbox:hover .box {\n box-shadow: 0 0 0 1px var(--brand-main);\n}\n.input:focus-visible + .box {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n}\n.input:active + .box {\n transform: scale(0.88);\n}\n.input:checked + .box {\n background: var(--brand-main);\n box-shadow: inset 0 0 0 1px var(--brand-main);\n}\n.checkbox:hover .input:checked + .box {\n box-shadow: 0 0 0 1px var(--brand-main);\n}\n.icon {\n width: 10px;\n height: 10px;\n overflow: visible;\n}\n.icon polyline {\n fill: none;\n stroke: #fff;\n stroke-width: 2.5px;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-dasharray: 22px;\n stroke-dashoffset: 22px;\n transition: stroke-dashoffset 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.input:checked + .box .icon polyline {\n stroke-dashoffset: 0px;\n}\n.checkbox:has(.input:disabled),\n.input:disabled {\n cursor: not-allowed;\n}\n.checkbox:has(.input:disabled) .labelText {\n color: var(--disabled-text);\n}\n.checkbox:has(.input:disabled) .box {\n background: var(--surface-muted);\n box-shadow: inset 0 0 0 1px var(--border);\n transform: none;\n}\n.checkbox:has(.input:disabled) .input:checked + .box {\n background: var(--disabled-bg);\n box-shadow: inset 0 0 0 1px var(--disabled-bg);\n}\n","import type { ChangeEvent, FocusEvent, ReactNode, Ref } from 'react';\nimport styles from './Checkbox.module.css';\nimport groupStyles from './OptionGroup.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ninterface CheckboxProps {\n checked: boolean;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n onBlur?: (e: FocusEvent<HTMLInputElement>) => void;\n name?: string;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n ref?: Ref<HTMLInputElement>;\n}\n\nexport function Checkbox({\n checked,\n onChange,\n onBlur,\n name,\n label,\n ariaLabel,\n disabled,\n className,\n ref,\n}: CheckboxProps) {\n return (\n <label className={`${styles.checkbox} ${className ?? ''}`}>\n <span className={styles.control}>\n <input\n ref={ref}\n type=\"checkbox\"\n className={styles.input}\n checked={checked}\n onChange={onChange}\n onBlur={onBlur}\n name={name}\n aria-label={ariaLabel}\n disabled={disabled}\n />\n <span className={styles.box}>\n <svg className={styles.icon} viewBox=\"0 0 17 18\" aria-hidden=\"true\">\n <polyline points=\"1 9 7 14 15 4\" />\n </svg>\n </span>\n </span>\n {label && <span className={styles.labelText}>{label}</span>}\n </label>\n );\n}\n\ninterface CheckboxGroupItem {\n value: string;\n label: ReactNode;\n disabled?: boolean;\n}\n\ninterface CheckboxGroupProps {\n label?: ReactNode;\n items: CheckboxGroupItem[];\n value: string[];\n onChange: (value: string[]) => void;\n disabled?: boolean;\n 'aria-label'?: string;\n}\n\nexport function CheckboxGroup({ label, items, value, onChange, disabled, ...rest }: CheckboxGroupProps) {\n function toggle(itemValue: string) {\n const next = value.includes(itemValue)\n ? value.filter((v) => v !== itemValue)\n : [...value, itemValue];\n onChange(next);\n }\n\n return (\n <div role=\"group\" aria-label={label ? undefined : rest['aria-label']} className={groupStyles.group}>\n {label && <FieldLabel className={groupStyles.groupLabel}>{label}</FieldLabel>}\n {items.map((item) => (\n <Checkbox\n key={item.value}\n checked={value.includes(item.value)}\n onChange={() => toggle(item.value)}\n label={item.label}\n disabled={disabled || item.disabled}\n />\n ))}\n </div>\n );\n}\n",".radio {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n padding: 8px 4px;\n}\n.control {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n}\n.labelText {\n font-size: 0.85rem;\n color: var(--text-primary);\n transition: color 0.2s ease-out;\n}\n.radio:hover .labelText {\n color: var(--brand-main);\n}\n.input {\n position: absolute;\n inset: 0;\n margin: 0;\n opacity: 0;\n cursor: pointer;\n}\n.circle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--ink-5);\n box-shadow: inset 0 0 0 1px var(--border);\n transition:\n background-color 0.2s cubic-bezier(0, 0, 0.2, 1),\n box-shadow 0.2s cubic-bezier(0, 0, 0.2, 1),\n transform 0.1s cubic-bezier(0, 0, 0.2, 1);\n}\n.radio:hover .circle {\n box-shadow: 0 0 0 1px var(--brand-main);\n}\n.input:focus-visible + .circle {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n}\n.input:active + .circle {\n transform: scale(0.88);\n}\n.input:checked + .circle {\n background: var(--brand-main);\n box-shadow: inset 0 0 0 1px var(--brand-main);\n}\n.radio:hover .input:checked + .circle {\n box-shadow: 0 0 0 1px var(--brand-main);\n}\n.dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #fff;\n transform: scale(0);\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.input:checked + .circle .dot {\n transform: scale(1);\n}\n.radio:has(.input:disabled),\n.input:disabled {\n cursor: not-allowed;\n}\n.radio:has(.input:disabled) .labelText {\n color: var(--disabled-text);\n}\n.radio:has(.input:disabled) .circle {\n background: var(--surface-muted);\n box-shadow: inset 0 0 0 1px var(--border);\n transform: none;\n}\n.radio:has(.input:disabled) .input:checked + .circle {\n background: var(--disabled-bg);\n box-shadow: inset 0 0 0 1px var(--disabled-bg);\n}\n","import type { ChangeEvent, FocusEvent, ReactNode, Ref } from 'react';\nimport styles from './RadioButton.module.css';\nimport groupStyles from './OptionGroup.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ninterface RadioButtonProps {\n checked: boolean;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n onBlur?: (e: FocusEvent<HTMLInputElement>) => void;\n name?: string;\n value?: string;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n ref?: Ref<HTMLInputElement>;\n}\n\nexport function RadioButton({\n checked,\n onChange,\n onBlur,\n name,\n value,\n label,\n ariaLabel,\n disabled,\n className,\n ref,\n}: RadioButtonProps) {\n return (\n <label className={`${styles.radio} ${className ?? ''}`}>\n <span className={styles.control}>\n <input\n ref={ref}\n type=\"radio\"\n className={styles.input}\n checked={checked}\n onChange={onChange}\n onBlur={onBlur}\n name={name}\n value={value}\n aria-label={ariaLabel}\n disabled={disabled}\n />\n <span className={styles.circle}>\n <span className={styles.dot} />\n </span>\n </span>\n {label && <span className={styles.labelText}>{label}</span>}\n </label>\n );\n}\n\ninterface RadioGroupItem {\n value: string;\n label: ReactNode;\n disabled?: boolean;\n}\n\ninterface RadioGroupProps {\n label?: ReactNode;\n name: string;\n items: RadioGroupItem[];\n value: string;\n onChange: (value: string) => void;\n disabled?: boolean;\n 'aria-label'?: string;\n}\n\nexport function RadioGroup({ label, name, items, value, onChange, disabled, ...rest }: RadioGroupProps) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={label ? undefined : rest['aria-label']}\n className={groupStyles.group}\n >\n {label && <FieldLabel className={groupStyles.groupLabel}>{label}</FieldLabel>}\n {items.map((item) => (\n <RadioButton\n key={item.value}\n name={name}\n value={item.value}\n checked={value === item.value}\n onChange={() => onChange(item.value)}\n label={item.label}\n disabled={disabled || item.disabled}\n />\n ))}\n </div>\n );\n}\n",".switch {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n}\n.switch:has(.input:disabled) {\n cursor: not-allowed;\n}\n.control {\n position: relative;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n.input {\n position: absolute;\n inset: 0;\n margin: 0;\n opacity: 0;\n cursor: pointer;\n}\n.input:disabled {\n cursor: not-allowed;\n}\n.track {\n position: relative;\n width: 100%;\n height: 100%;\n border-radius: 999px;\n background: var(--ink-5);\n box-shadow: inset 0 0 0 1px var(--border);\n transition:\n background-color 0.2s cubic-bezier(0, 0, 0.2, 1),\n box-shadow 0.2s cubic-bezier(0, 0, 0.2, 1);\n}\n.switch:hover .track {\n box-shadow: inset 0 0 0 1px var(--brand-main);\n}\n.input:focus-visible + .track {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n}\n.input:checked + .track {\n background: var(--brand-main);\n box-shadow: inset 0 0 0 1px var(--brand-main);\n}\n.input:disabled + .track {\n background: var(--surface-muted);\n box-shadow: inset 0 0 0 1px var(--border);\n}\n.thumb {\n position: absolute;\n top: 50%;\n left: 2px;\n border-radius: 50%;\n background: #fff;\n transform: translateY(-50%);\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.input:checked + .track .thumb {\n transform: translateY(-50%) translateX(var(--switch-thumb-travel));\n}\n\n.sm {\n width: 32px;\n height: 18px;\n --switch-thumb-travel: 14px;\n}\n.sm .thumb {\n width: 14px;\n height: 14px;\n}\n.base {\n width: 40px;\n height: 22px;\n --switch-thumb-travel: 18px;\n}\n.base .thumb {\n width: 18px;\n height: 18px;\n}\n\n.labelText {\n font-size: 0.85rem;\n color: var(--text-primary);\n transition: color 0.2s ease-out;\n}\n.switch:hover .labelText {\n color: var(--brand-main);\n}\n.switch:has(.input:disabled) .labelText {\n color: var(--disabled-text);\n}\n","import type { ChangeEvent, ReactNode } from 'react';\nimport styles from './Switch.module.css';\n\ntype SwitchSize = 'sm' | 'base';\n\ninterface SwitchProps {\n checked: boolean;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n size?: SwitchSize;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function Switch({\n checked,\n onChange,\n size = 'base',\n label,\n ariaLabel,\n disabled,\n className,\n}: SwitchProps) {\n return (\n <label className={`${styles.switch} ${className ?? ''}`}>\n <span className={`${styles.control} ${styles[size]}`}>\n <input\n type=\"checkbox\"\n role=\"switch\"\n className={styles.input}\n checked={checked}\n onChange={onChange}\n aria-label={ariaLabel}\n disabled={disabled}\n />\n <span className={styles.track}>\n <span className={styles.thumb} />\n </span>\n </span>\n {label && <span className={styles.labelText}>{label}</span>}\n </label>\n );\n}\n",".field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.inputWrap {\n position: relative;\n display: flex;\n align-items: center;\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border-input);\n transition: box-shadow 0.2s ease-out;\n}\n.inputWrap:focus-within {\n box-shadow:\n inset 0 0 0 0 var(--border-input),\n 0 0 0 2px var(--brand-main);\n}\n.errorWrap,\n.errorWrap:focus-within {\n box-shadow: inset 0 0 0 1px var(--danger-text);\n}\n.inputWrap:has(.input:disabled) {\n background: var(--surface-muted);\n}\n\n.toolbar {\n background: none;\n box-shadow: none;\n}\n.toolbar::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: 2px;\n background: var(--brand-main);\n opacity: 0;\n transition: opacity 0.2s ease-out;\n}\n.toolbar:focus-within {\n box-shadow: none;\n}\n.toolbar:focus-within::after {\n opacity: 1;\n}\n.toolbar.errorWrap,\n.toolbar.errorWrap:focus-within {\n box-shadow: none;\n}\n.toolbar.errorWrap::after {\n background: var(--danger-text);\n opacity: 1;\n}\n\n.sm {\n height: var(--control-height-sm);\n border-radius: var(--radius-sm);\n}\n.sm .input {\n padding: 0 12px;\n font-size: 0.9rem;\n}\n.base {\n height: var(--control-height-base);\n border-radius: var(--radius-base);\n}\n.base .input {\n padding: 0 14px;\n font-size: 0.9rem;\n}\n.inputWrap:has(.icon) .input {\n padding-left: 8px;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 12px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n.input {\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n background: none;\n font-family: inherit;\n color: var(--text-primary);\n font-weight: 450;\n}\n.input:focus {\n outline: none;\n}\n.input::placeholder {\n color: var(--text-tertiary);\n}\n.input:disabled {\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.helperText {\n font-size: 0.78rem;\n color: var(--text-tertiary);\n padding-left: 8px;\n}\n.errorText {\n font-size: 0.78rem;\n color: var(--danger-text);\n}\n","import { useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport styles from './TextField.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ntype TextFieldSize = 'sm' | 'base';\ntype TextFieldVariant = 'default' | 'toolbar';\n\ninterface TextFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className' | 'size'> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: TextFieldSize;\n variant?: TextFieldVariant;\n leadingIcon?: ReactNode;\n}\n\nexport function TextField({\n label,\n helperText,\n error,\n size = 'base',\n variant = 'default',\n leadingIcon,\n id,\n ...rest\n}: TextFieldProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div className={styles.field}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div\n className={`${styles.inputWrap} ${styles[variant]} ${styles[size]} ${error ? styles.errorWrap : ''}`}\n >\n {leadingIcon && <span className={styles.icon}>{leadingIcon}</span>}\n <input id={inputId} className={styles.input} {...rest} />\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helperText}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n",".field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.inputWrap {\n position: relative;\n display: flex;\n align-items: center;\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border-input);\n transition: box-shadow 0.2s ease-out;\n}\n.inputWrap:focus-within {\n box-shadow:\n inset 0 0 0 0 var(--border-input),\n 0 0 0 2px var(--brand-main);\n}\n.errorWrap,\n.errorWrap:focus-within {\n box-shadow: inset 0 0 0 1px var(--danger-text);\n}\n.inputWrap:has(.input:disabled) {\n background: var(--surface-muted);\n}\n\n.sm {\n height: var(--control-height-sm);\n border-radius: var(--radius-sm);\n}\n.sm .input {\n padding: 0 8px;\n font-size: 0.85rem;\n}\n.base {\n height: var(--control-height-base);\n border-radius: var(--radius-base);\n}\n.base .input {\n padding: 0 10px;\n font-size: 0.9rem;\n}\n.inputWrap:has(.prefix) .input {\n padding-left: 4px;\n}\n.inputWrap:has(.suffix) .input {\n padding-right: 4px;\n}\n\n.prefix,\n.suffix {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--text-tertiary);\n font-size: 0.78rem;\n white-space: nowrap;\n}\n.prefix {\n margin-left: 10px;\n}\n.suffix {\n margin-right: 10px;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n background: none;\n font-family: inherit;\n color: var(--text-primary);\n font-weight: 450;\n font-variant-numeric: tabular-nums;\n appearance: textfield;\n -moz-appearance: textfield;\n}\n.input::-webkit-outer-spin-button,\n.input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n.input:focus {\n outline: none;\n}\n.input::placeholder {\n color: var(--text-tertiary);\n}\n.input:disabled {\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.helperText {\n font-size: 0.78rem;\n color: var(--text-tertiary);\n padding-left: 8px;\n}\n.errorText {\n font-size: 0.78rem;\n color: var(--danger-text);\n}\n","import { useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport styles from './NumberField.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ntype NumberFieldSize = 'sm' | 'base';\n\ninterface NumberFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className' | 'size' | 'prefix'> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: NumberFieldSize;\n /** Rendered inline before the value, e.g. \"$\". */\n prefix?: ReactNode;\n /** Rendered inline after the value, e.g. \"cows\", \"/cwt\". */\n suffix?: ReactNode;\n}\n\nexport function NumberField({\n label,\n helperText,\n error,\n size = 'base',\n prefix,\n suffix,\n id,\n ...rest\n}: NumberFieldProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div className={styles.field}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div className={`${styles.inputWrap} ${styles[size]} ${error ? styles.errorWrap : ''}`}>\n {prefix && <span className={styles.prefix}>{prefix}</span>}\n <input id={inputId} className={styles.input} {...rest} />\n {suffix && <span className={styles.suffix}>{suffix}</span>}\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helperText}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n",".menu {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 180px;\n width: fit-content;\n padding: 4px;\n box-sizing: border-box;\n background: var(--card-surface);\n border-radius: 12px;\n box-shadow:\n inset 0 0 0 1px var(--border),\n 0 8px 24px rgba(0, 0, 0, 0.12);\n}\n.divider {\n height: 1px;\n background: var(--border);\n margin: 4px 6px;\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport styles from './Menu.module.css';\n\ninterface MenuProps extends Omit<HTMLAttributes<HTMLDivElement>, 'className'> {\n children: ReactNode;\n}\n\nexport function Menu({ children, ...rest }: MenuProps) {\n return (\n <div role=\"menu\" className={styles.menu} {...rest}>\n {children}\n </div>\n );\n}\n\nexport function MenuDivider() {\n return <div className={styles.divider} role=\"separator\" />;\n}\n",".item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: var(--control-height-sm);\n box-sizing: border-box;\n border: none;\n background: none;\n border-radius: 8px;\n padding: 8px 12px;\n font-family: inherit;\n font-size: 0.9rem;\n color: var(--text-primary);\n text-align: left;\n cursor: pointer;\n transition:\n background 0.15s ease-out,\n color 0.15s ease-out;\n}\n.item:hover:not(:disabled) {\n background: var(--brand-bg);\n color: var(--brand-dark);\n}\n.item:hover:not(:disabled) .icon,\n.item:hover:not(:disabled) .check {\n color: var(--brand-dark);\n}\n.item:active:not(:disabled) {\n background: var(--brand-main-20);\n}\n.item:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: -2px;\n}\n.item:disabled {\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: -4px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.trailing {\n color: var(--text-tertiary);\n font-size: 0.8rem;\n flex-shrink: 0;\n}\n.selected {\n color: var(--text-primary);\n font-weight: 550;\n}\n.selected .icon {\n color: var(--text-primary);\n}\n.check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 8px;\n color: var(--text-primary);\n flex-shrink: 0;\n}\n.check svg {\n width: 100%;\n height: 100%;\n}\n.destructive {\n color: var(--danger-text);\n}\n.destructive .icon {\n color: var(--danger-text);\n}\n.destructive:hover:not(:disabled) {\n background: var(--danger-bg);\n color: var(--danger-text);\n}\n.destructive:hover:not(:disabled) .icon {\n color: var(--danger-text);\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { Check } from 'lucide-react';\nimport styles from './MenuItem.module.css';\n\ninterface MenuItemProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className'> {\n icon?: ReactNode;\n trailing?: ReactNode;\n selected?: boolean;\n destructive?: boolean;\n children: ReactNode;\n}\n\nexport function MenuItem({ icon, trailing, selected, destructive, children, ...rest }: MenuItemProps) {\n const classes = [styles.item, selected && styles.selected, destructive && styles.destructive]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button type=\"button\" role=\"menuitem\" className={classes} {...rest}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{children}</span>\n {trailing && <span className={styles.trailing}>{trailing}</span>}\n {selected && (\n <span className={styles.check}>\n <Check />\n </span>\n )}\n </button>\n );\n}\n",".field {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.trigger {\n display: flex;\n align-items: center;\n width: 100%;\n box-sizing: border-box;\n border: none;\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border-input);\n font-family: inherit;\n color: var(--text-primary);\n cursor: pointer;\n transition: box-shadow 0.2s ease-out;\n}\n.trigger:focus-visible {\n box-shadow:\n inset 0 0 0 0 var(--border-input),\n 0 0 0 2px var(--brand-main);\n}\n.errorWrap {\n box-shadow: inset 0 0 0 1px var(--danger-text);\n}\n.trigger:disabled {\n background: var(--surface-muted);\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n\n.sm {\n border-radius: var(--radius-sm);\n}\n.sm.trigger {\n height: var(--control-height-sm);\n padding: 0 12px;\n font-size: 0.9rem;\n}\n.base {\n border-radius: var(--radius-base);\n}\n.base.trigger {\n height: var(--control-height-base);\n padding: 0 14px;\n font-size: 0.9rem;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-right: 8px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n.value {\n flex: 1;\n min-width: 0;\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.placeholder {\n color: var(--text-tertiary);\n}\n.chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 8px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n transition: transform 0.15s ease-out;\n}\n.chevron svg {\n width: 100%;\n height: 100%;\n}\n.chevronOpen {\n transform: rotate(180deg);\n}\n\n.menuWrap {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n z-index: 10;\n}\n.helperText {\n font-size: 0.78rem;\n color: var(--text-tertiary);\n padding-left: 8px;\n}\n.errorText {\n font-size: 0.78rem;\n color: var(--danger-text);\n}\n","import { useEffect, useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport { Menu } from './Menu';\nimport { MenuItem } from './MenuItem';\nimport { FieldLabel } from './FieldLabel';\nimport styles from './Dropdown.module.css';\n\ntype DropdownSize = 'sm' | 'base';\n\ninterface DropdownOption<T extends string> {\n value: T;\n label: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\ninterface DropdownProps<T extends string> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: DropdownSize;\n placeholder?: string;\n options: DropdownOption<T>[];\n value?: T;\n onChange: (value: T) => void;\n disabled?: boolean;\n}\n\nexport function Dropdown<T extends string>({\n label,\n helperText,\n error,\n size = 'base',\n placeholder = 'Select…',\n options,\n value,\n onChange,\n disabled,\n}: DropdownProps<T>) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerId = useId();\n\n const selected = options.find((opt) => opt.value === value);\n const enabledValues = options.filter((opt) => !opt.disabled).map((opt) => opt.value);\n\n useEffect(() => {\n if (!open) return;\n const focusValue = value ?? enabledValues[0];\n const el = rootRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${focusValue}\"]`);\n el?.focus();\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function onPointerDown(e: PointerEvent) {\n if (!rootRef.current?.contains(e.target as Node)) setOpen(false);\n }\n function onKeyDown(e: globalThis.KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKeyDown);\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n function handleTriggerKeyDown(e: KeyboardEvent<HTMLButtonElement>) {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n return;\n }\n if (e.key === 'Escape') setOpen(false);\n }\n\n function handleOptionKeyDown(e: KeyboardEvent<HTMLButtonElement>, currentValue: T) {\n const currentIndex = enabledValues.indexOf(currentValue);\n if (currentIndex === -1) return;\n\n let nextIndex: number | null = null;\n if (e.key === 'ArrowDown') nextIndex = (currentIndex + 1) % enabledValues.length;\n if (e.key === 'ArrowUp') nextIndex = (currentIndex - 1 + enabledValues.length) % enabledValues.length;\n if (e.key === 'Home') nextIndex = 0;\n if (e.key === 'End') nextIndex = enabledValues.length - 1;\n\n if (nextIndex !== null) {\n e.preventDefault();\n const nextValue = enabledValues[nextIndex];\n const el = rootRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${nextValue}\"]`);\n el?.focus();\n return;\n }\n if (e.key === 'Escape') setOpen(false);\n }\n\n return (\n <div className={styles.field} ref={rootRef}>\n {label && <FieldLabel htmlFor={triggerId}>{label}</FieldLabel>}\n <button\n id={triggerId}\n type=\"button\"\n className={`${styles.trigger} ${styles[size]} ${error ? styles.errorWrap : ''}`}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n disabled={disabled}\n onClick={() => setOpen((v) => !v)}\n onKeyDown={handleTriggerKeyDown}\n >\n {selected?.icon && <span className={styles.icon}>{selected.icon}</span>}\n <span className={`${styles.value} ${!selected ? styles.placeholder : ''}`}>\n {selected ? selected.label : placeholder}\n </span>\n <span className={`${styles.chevron} ${open ? styles.chevronOpen : ''}`}>\n <ChevronDown />\n </span>\n </button>\n {open && (\n <div className={styles.menuWrap}>\n <Menu role=\"listbox\" style={{ width: '100%' }}>\n {options.map((opt) => (\n <MenuItem\n key={opt.value}\n data-value={opt.value}\n role=\"option\"\n aria-selected={opt.value === value}\n icon={opt.icon}\n selected={opt.value === value}\n disabled={opt.disabled}\n onClick={() => {\n onChange(opt.value);\n setOpen(false);\n }}\n onKeyDown={(e) => handleOptionKeyDown(e, opt.value)}\n >\n {opt.label}\n </MenuItem>\n ))}\n </Menu>\n </div>\n )}\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helperText}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n",".highlight {\n background: var(--brand-bg);\n color: var(--brand-dark);\n border-radius: 3px;\n padding: 0 1px;\n}\n","import { Fragment } from 'react';\nimport styles from './HighlightText.module.css';\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function HighlightText({ text, query }: { text: string; query: string }) {\n if (!query) return <>{text}</>;\n\n const parts = text.split(new RegExp(`(${escapeRegExp(query)})`, 'ig'));\n return (\n <>\n {parts.map((part, i) =>\n part.toLowerCase() === query.toLowerCase() ? (\n <mark key={i} className={styles.highlight}>\n {part}\n </mark>\n ) : (\n <Fragment key={i}>{part}</Fragment>\n ),\n )}\n </>\n );\n}\n",".group {\n position: relative;\n}\n.btn {\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n border-radius: 12px;\n padding: 12px;\n font-family: inherit;\n font-size: 1rem;\n color: var(--text-primary);\n cursor: pointer;\n transition:\n background 0.2s ease-out,\n box-shadow 0.2s ease-out,\n transform 0.2s ease-out;\n}\n.btn:hover {\n background: rgba(10, 10, 11, 0.04);\n}\n.btn:active {\n background: var(--brand-bg);\n box-shadow: inset 0 2px 1px 0 rgba(0, 140, 216, 0.25);\n transform: scale(0.95);\n}\n.caret {\n color: var(--text-tertiary);\n display: flex;\n align-items: center;\n}\n.caret svg {\n width: 14px;\n height: 14px;\n}\n.label {\n color: var(--text-secondary);\n}\n.badge {\n position: absolute;\n top: 2px;\n right: 2px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 999px;\n background: var(--brand-main, #0a84d8);\n color: #fff;\n font-size: 0.65rem;\n font-weight: 600;\n line-height: 16px;\n text-align: center;\n}\n.value {\n color: var(--text-primary);\n font-weight: 500;\n}\n.panel {\n display: none;\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n background: #fff;\n border-radius: 12px;\n min-width: 220px;\n width: fit-content;\n max-height: 280px;\n overflow-y: auto;\n box-shadow:\n inset 0 0 0 1px var(--border),\n 0 8px 24px rgba(0, 0, 0, 0.12);\n z-index: 50;\n}\n.panel.open {\n display: block;\n}\n.panelRight {\n left: auto;\n right: 0;\n}\n.panelWide {\n min-width: 260px;\n padding-bottom: 4px;\n}\n.sectionHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 12px 14px 4px;\n}\n.sectionLabel {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.02em;\n}\n.allToggle {\n background: none;\n border: none;\n padding: 0;\n font-family: inherit;\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--brand-main, #0a84d8);\n cursor: pointer;\n}\n.allToggle:hover {\n text-decoration: underline;\n}\n.divider {\n height: 1px;\n background: var(--border);\n margin: 4px 0;\n}\n.option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px;\n border-radius: 8px;\n font-size: 1rem;\n cursor: pointer;\n}\n.option:hover {\n background: var(--bg);\n}\n.search {\n width: calc(100% - 16px);\n box-sizing: border-box;\n border: none;\n box-shadow: inset 0 0 0 1px var(--border-input);\n border-radius: 8px;\n padding: 8px 12px;\n margin: 8px;\n font-family: inherit;\n font-size: 1rem;\n margin-bottom: 0;\n}\n.search:focus {\n outline: none;\n box-shadow: inset 0 0 0 1px var(--brand-main);\n}\n.optionsList {\n padding: 4px 4px;\n}\n.empty {\n padding: 7px 8px;\n color: var(--text-tertiary);\n font-size: 0.85rem;\n}\n","import { useState } from 'react';\nimport { Checkbox } from './Checkbox';\nimport styles from './FilterSection.module.css';\n\ninterface FilterSectionProps<T extends string> {\n label: string;\n options: T[];\n optionLabel: (opt: T) => string;\n activeSet: Set<T>;\n onToggle: (opt: T) => void;\n onSetAll?: (opts: T[]) => void;\n searchable?: boolean;\n}\n\nexport function FilterSection<T extends string>({\n label,\n options,\n optionLabel,\n activeSet,\n onToggle,\n onSetAll,\n searchable,\n}: FilterSectionProps<T>) {\n const [query, setQuery] = useState('');\n\n const q = query.trim().toLowerCase();\n const matches = q ? options.filter((opt) => optionLabel(opt).toLowerCase().includes(q)) : options;\n const allSelected = options.length > 0 && activeSet.size === options.length;\n\n return (\n <div>\n <div className={styles.sectionHeader}>\n <div className={styles.sectionLabel}>{label}</div>\n {onSetAll && (\n <button\n type=\"button\"\n className={styles.allToggle}\n onClick={() => onSetAll(allSelected ? [] : options)}\n >\n {allSelected ? 'Deselect all' : 'Select all'}\n </button>\n )}\n </div>\n {searchable && (\n <input\n type=\"text\"\n className={styles.search}\n placeholder={`Search ${label.toLowerCase()}…`}\n autoComplete=\"off\"\n value={query}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => setQuery(e.target.value)}\n />\n )}\n <div className={styles.optionsList}>\n {matches.length === 0 && <div className={styles.empty}>No match</div>}\n {matches.map((opt) => (\n <Checkbox\n key={opt}\n className={styles.option}\n checked={activeSet.has(opt)}\n onChange={() => onToggle(opt)}\n label={optionLabel(opt)}\n />\n ))}\n </div>\n </div>\n );\n}\n",".line,\n.box {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.indicator {\n position: absolute;\n left: 0;\n pointer-events: none;\n transition: translate 0.25s cubic-bezier(0.39, 0.575, 0.565, 1), width 0.25s ease,\n scale 0.125s cubic-bezier(0.39, 0.575, 0.565, 1);\n}\n\n.indicator.settling {\n transition: scale 0.1s linear;\n}\n\n.indicatorLine {\n bottom: 0;\n height: 2px;\n background: var(--brand-main);\n}\n\n.indicatorBox {\n top: 4px;\n bottom: 4px;\n border-radius: 8px;\n background: var(--card-surface);\n box-shadow: 0 0 1px 0.5px var(--border);\n}\n\n.tab {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: none;\n border-radius: 8px 8px 0 0;\n font-family: inherit;\n font-weight: 450;\n cursor: pointer;\n white-space: nowrap;\n transition: color 0.15s ease-out, background 0.15s ease-out, box-shadow 0.15s ease-out;\n}\n\n.tab::before {\n content: '';\n position: absolute;\n left: 50%;\n bottom: 0;\n width: 40%;\n aspect-ratio: 1;\n border-radius: 50%;\n transform: translate(-50%, 100%) scale(1);\n transition: transform 0.3s cubic-bezier(0.39, 0.575, 0.565, 1);\n z-index: -1;\n pointer-events: none;\n background: rgba(var(--brand-main-rgb), 0.08);\n}\n.tab:hover:not(:disabled)::before {\n transform: translate(-50%, 15%) scale(4);\n}\n.tab:active:not(:disabled)::before {\n background: rgba(var(--brand-main-rgb), 0.28);\n}\n\n.tab:disabled {\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.tab:disabled::before {\n display: none;\n}\n\n.tab.selected:hover::before {\n display: none;\n}\n\n.tab:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: -4px;\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n\n/* Line variant */\n\n.line {\n box-shadow: inset 0 -1px 0 0 var(--border);\n}\n\n.line .tab {\n background: transparent;\n padding: 12px 8px;\n font-size: 1rem;\n color: var(--text-secondary);\n}\n.line .tab:hover:not(:disabled) {\n color: var(--brand-main);\n}\n.line .tab.selected {\n color: var(--text-primary);\n font-weight: 550;\n}\n\n/* Box variant */\n\n.box {\n box-sizing: border-box;\n height: var(--control-height-base);\n background: var(--ink-5);\n border-radius: var(--radius-base);\n padding: 4px;\n gap: 4px;\n box-shadow: inset 0 0 0.5px 1px #e3e3e3;\n}\n\n.box .tab {\n height: calc(var(--control-height-base) - 8px);\n border-radius: 8px;\n padding: 0 14px;\n font-size: 0.9rem;\n background: transparent;\n color: var(--text-secondary);\n}\n.box .tab:hover:not(:disabled) {\n color: var(--brand-main);\n /* box-shadow: 0 0 0px 1px var(--brand-main-30); */\n}\n.box .tab.selected {\n color: var(--text-primary);\n font-weight: 550;\n}\n\n.box.sm {\n height: var(--control-height-sm);\n border-radius: var(--radius-sm);\n}\n.box.sm .tab {\n height: calc(var(--control-height-sm) - 8px);\n border-radius: 6px;\n padding: 0 14px;\n}\n.box.sm .indicatorBox {\n border-radius: 6px;\n}\n","import {\n useLayoutEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n type TransitionEvent,\n} from 'react';\nimport styles from './Tabs.module.css';\n\ntype TabsVariant = 'line' | 'box';\ntype TabsSize = 'base' | 'sm';\n\ninterface TabItem {\n value: string;\n label: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\ninterface TabsProps {\n items: TabItem[];\n value: string;\n onChange: (value: string) => void;\n variant?: TabsVariant;\n size?: TabsSize;\n 'aria-label'?: string;\n}\n\nexport function Tabs({ items, value, onChange, variant = 'line', size = 'base', ...rest }: TabsProps) {\n const enabledValues = items.filter((item) => !item.disabled).map((item) => item.value);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const tabRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n const prevValueRef = useRef(value);\n const [indicatorStyle, setIndicatorStyle] = useState<{ left: number; width: number } | null>(\n null,\n );\n const [pillPhase, setPillPhase] = useState<'idle' | 'moving' | 'settling'>('idle');\n\n useLayoutEffect(() => {\n const selectedTab = tabRefs.current.get(value);\n if (!selectedTab) return;\n setIndicatorStyle({ left: selectedTab.offsetLeft, width: selectedTab.offsetWidth });\n\n if (variant === 'box' && prevValueRef.current !== value) {\n setPillPhase('moving');\n }\n prevValueRef.current = value;\n }, [value, items, variant, size]);\n\n function handlePillTransitionEnd(event: TransitionEvent<HTMLSpanElement>) {\n if (event.propertyName !== 'scale') return;\n if (pillPhase === 'moving') setPillPhase('settling');\n else if (pillPhase === 'settling') setPillPhase('idle');\n }\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const observer = new ResizeObserver(() => {\n const selectedTab = tabRefs.current.get(value);\n if (!selectedTab) return;\n setIndicatorStyle({ left: selectedTab.offsetLeft, width: selectedTab.offsetWidth });\n });\n observer.observe(container);\n return () => observer.disconnect();\n }, [value]);\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const currentIndex = enabledValues.indexOf(value);\n if (currentIndex === -1) return;\n\n let nextIndex: number | null = null;\n if (event.key === 'ArrowRight') nextIndex = (currentIndex + 1) % enabledValues.length;\n if (event.key === 'ArrowLeft') {\n nextIndex = (currentIndex - 1 + enabledValues.length) % enabledValues.length;\n }\n if (event.key === 'Home') nextIndex = 0;\n if (event.key === 'End') nextIndex = enabledValues.length - 1;\n\n if (nextIndex !== null) {\n event.preventDefault();\n onChange(enabledValues[nextIndex]);\n }\n }\n\n return (\n <div\n ref={containerRef}\n role=\"tablist\"\n className={[styles[variant], variant === 'box' && size === 'sm' && styles.sm]\n .filter(Boolean)\n .join(' ')}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {indicatorStyle && (\n <span\n aria-hidden\n className={[\n styles.indicator,\n variant === 'line' ? styles.indicatorLine : styles.indicatorBox,\n pillPhase === 'settling' && styles.settling,\n ]\n .filter(Boolean)\n .join(' ')}\n onTransitionEnd={handlePillTransitionEnd}\n style={{\n translate: `${indicatorStyle.left}px 0`,\n scale: variant === 'box' && pillPhase === 'moving' ? 0.92 : 1,\n width: indicatorStyle.width,\n }}\n />\n )}\n {items.map((item) => {\n const selected = item.value === value;\n return (\n <button\n key={item.value}\n ref={(node) => {\n if (node) tabRefs.current.set(item.value, node);\n else tabRefs.current.delete(item.value);\n }}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n disabled={item.disabled}\n tabIndex={selected ? 0 : -1}\n className={[styles.tab, selected && styles.selected].filter(Boolean).join(' ')}\n onClick={() => !item.disabled && onChange(item.value)}\n >\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {item.label}\n </button>\n );\n })}\n </div>\n );\n}\n","export function formatDuration(mins: number): string {\n const h = Math.floor(mins / 60);\n const m = mins % 60;\n return `${h}h:${String(m).padStart(2, '0')}m`;\n}\n\n/** HH:MM:SS — seconds are a stable per-video display detail, not tracked in the data model. */\nexport function formatDurationHMS(mins: number, seconds: number): string {\n const h = Math.floor(mins / 60);\n const m = mins % 60;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(seconds)}`;\n}\n"],"x_google_ignoreList":[11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["__iconData","__iconData"],"sources":["../src/components/Button.module.css","../src/components/Button.tsx","../src/components/Card.module.css","../src/components/Card.tsx","../src/components/Tag.module.css","../src/components/Tag.tsx","../src/components/TagGroup.module.css","../src/components/OptionGroup.module.css","../src/components/FieldLabel.module.css","../src/components/FieldLabel.tsx","../src/components/TagGroup.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toLucideIconData.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs","../node_modules/lucide-react/dist/esm/shared/src/build/defaultAttributes.mjs","../node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconNode.mjs","../node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconForReact.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs","../node_modules/lucide-react/dist/esm/context.mjs","../node_modules/lucide-react/dist/esm/Icon.mjs","../node_modules/lucide-react/dist/esm/createLucideIcon.mjs","../node_modules/lucide-react/dist/esm/icons/check.mjs","../node_modules/lucide-react/dist/esm/icons/chevron-down.mjs","../node_modules/lucide-react/dist/esm/icons/search.mjs","../src/components/Toolbar.module.css","../src/components/Toolbar.tsx","../src/components/Checkbox.module.css","../src/components/Checkbox.tsx","../src/components/RadioButton.module.css","../src/components/RadioButton.tsx","../src/components/Switch.module.css","../src/components/Switch.tsx","../src/components/TextField.module.css","../src/components/TextField.tsx","../src/components/NumberField.module.css","../src/components/NumberField.tsx","../src/components/Menu.module.css","../src/components/Menu.tsx","../src/components/MenuItem.module.css","../src/components/MenuItem.tsx","../src/components/Dropdown.module.css","../src/components/Dropdown.tsx","../src/components/HighlightText.module.css","../src/components/HighlightText.tsx","../src/components/FilterSection.module.css","../src/components/FilterSection.tsx","../src/components/Tabs.module.css","../src/components/Tabs.tsx","../src/utils/format.ts"],"sourcesContent":[".primary,\n.secondary,\n.tertiary,\n.dangerous {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n border: none;\n font-family: inherit;\n font-weight: var(--font-weight-regular);\n letter-spacing: 0.01em;\n cursor: pointer;\n transition:\n color 0.2s ease,\n transform 0.2s ease-out;\n}\n.primary:active:not(:disabled),\n.secondary:active:not(:disabled),\n.tertiary:active:not(:disabled),\n.dangerous:active:not(:disabled) {\n transform: scale(0.95);\n}\n\n.sm {\n height: var(--control-height-sm);\n border-radius: var(--radius-sm);\n padding: 0 12px;\n font-size: 0.9rem;\n}\n.base {\n height: var(--control-height-base);\n border-radius: var(--radius-base);\n padding: 0 16px;\n font-size: 0.9rem;\n}\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n}\n.icon:first-child {\n margin-left: -4px;\n}\n.icon:last-child {\n margin-right: -4px;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n\n.iconOnly {\n box-sizing: border-box;\n padding: 0;\n}\n.iconOnly.sm {\n width: var(--control-height-sm);\n}\n.iconOnly.base {\n width: var(--control-height-base);\n}\n.fullWidth {\n width: 100%;\n}\n.primary::before,\n.secondary::before,\n.tertiary::before,\n.dangerous::before {\n content: '';\n position: absolute;\n left: 50%;\n bottom: 0;\n width: 24%;\n aspect-ratio: 1;\n border-radius: 50%;\n transform: translate(-50%, 100%) scale(1);\n transition: transform 0.3s cubic-bezier(0.39, 0.575, 0.565, 1);\n z-index: -1;\n pointer-events: none;\n}\n.primary:hover::before,\n.secondary:hover::before,\n.tertiary:hover::before,\n.dangerous:hover::before {\n transform: translate(-50%, 15%) scale(8);\n}\n\n.primary {\n background: var(--brand-dark);\n color: #fff;\n font-weight: var(--font-weight-regular);\n letter-spacing: 0.02em;\n}\n.primary::before {\n background: rgba(255, 255, 255, 0.08);\n}\n.primary:active:not(:disabled)::before {\n background: rgba(0, 0, 0, 0.08);\n}\n\n.secondary {\n background: var(--ink-5);\n color: var(--text-primary);\n}\n.secondary .icon {\n color: var(--text-secondary);\n}\n.secondary::before {\n background: rgba(var(--brand-main-rgb), 0.08);\n}\n.secondary:active:not(:disabled)::before {\n background: rgba(var(--brand-main-rgb), 0.28);\n}\n.secondary:hover .icon {\n color: var(--brand-main);\n}\n.secondary:hover {\n color: var(--brand-main);\n}\n\n.tertiary {\n background: transparent;\n color: var(--text-secondary);\n}\n.tertiary::before {\n background: rgba(var(--brand-main-rgb), 0.16);\n}\n.tertiary:active:not(:disabled)::before {\n background: rgba(var(--brand-main-rgb), 0.28);\n}\n.tertiary:hover,\n.tertiary:active:not(:disabled) {\n background: var(--bg);\n}\n.tertiary:hover {\n color: var(--brand-main);\n}\n\n.dangerous {\n background: var(--danger-bg);\n color: var(--danger-text-dark);\n}\n.dangerous::before {\n background: rgba(var(--danger-rgb), 0.16);\n}\n.dangerous:active:not(:disabled)::before {\n background: rgba(var(--danger-rgb), 0.28);\n}\n\n.primary:disabled,\n.secondary:disabled,\n.tertiary:disabled,\n.dangerous:disabled {\n background: var(--disabled-bg);\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.primary:disabled:hover,\n.secondary:disabled:hover,\n.tertiary:disabled:hover,\n.dangerous:disabled:hover {\n color: var(--disabled-text);\n}\n.primary:disabled::before,\n.secondary:disabled::before,\n.tertiary:disabled::before,\n.dangerous:disabled::before {\n display: none;\n}\n","import type { ButtonHTMLAttributes, ReactNode, Ref } from 'react';\nimport styles from './Button.module.css';\n\ntype ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'dangerous';\ntype ButtonSize = 'sm' | 'base';\n\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Icon shown before the label. Omit `children` to render an icon-only square button — pass `aria-label` in that case. */\n leadingIcon?: ReactNode;\n /** Icon shown after the label. */\n trailingIcon?: ReactNode;\n /** Stretch to the width of the container. */\n fullWidth?: boolean;\n children?: ReactNode;\n /**\n * Extra classes for layout around the button — responsive visibility,\n * positioning, spacing. Appended after the variant classes.\n */\n className?: string;\n ref?: Ref<HTMLButtonElement>;\n}\n\nexport function Button({\n variant = 'primary',\n size = 'base',\n leadingIcon,\n trailingIcon,\n fullWidth,\n children,\n className,\n ref,\n ...rest\n}: ButtonProps) {\n const iconOnly = !children && Boolean(leadingIcon);\n const classes = [\n styles[variant],\n styles[size],\n iconOnly && styles.iconOnly,\n fullWidth && styles.fullWidth,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n return (\n <button ref={ref} type=\"button\" className={classes} {...rest}>\n {leadingIcon && <span className={styles.icon}>{leadingIcon}</span>}\n {children}\n {trailingIcon && <span className={styles.icon}>{trailingIcon}</span>}\n </button>\n );\n}\n",".wrap {\n position: relative;\n width: 220px;\n flex: 0 0 220px;\n}\n.wrap:hover {\n z-index: 10;\n}\n.fluid {\n width: 100%;\n flex: none;\n}\n\n.backing {\n position: absolute;\n left: 6px;\n right: 6px;\n bottom: -4px;\n height: 10px;\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border);\n border-radius: 0 0 14px 14px;\n z-index: 0;\n}\n.backing.completed {\n background: var(--success-bg);\n box-shadow: inset 0 0 0 1px #bfe3cc;\n}\n\n.card {\n position: relative;\n z-index: 1;\n width: 100%;\n box-sizing: border-box;\n background: var(--card-surface);\n box-shadow:\n inset 0 0 0 1px #efefef,\n 0 1px 2px rgba(16, 24, 32, 0.04);\n border-radius: 16px;\n padding: 12px 14px;\n cursor: default;\n transition:\n box-shadow 0.2s,\n transform 0.1s;\n}\n.card.interactive {\n cursor: pointer;\n}\n.card.interactive:active {\n transform: scale(0.98, 0.95);\n}\n.card.grabbable {\n cursor: grab;\n}\n.card.grabbable:active {\n cursor: grabbing;\n}\n.card.dragging,\n.card.dragging:hover {\n box-shadow:\n inset 0 0 0 1px #efefef,\n 0 1px 2px rgba(16, 24, 32, 0.04);\n}\n.card.interactive:hover {\n box-shadow:\n inset 0 0 0 1px #efefef,\n 0 0 0 2px var(--brand-main);\n}\n.card.completed {\n background: var(--success-bg);\n box-shadow:\n inset 0 0 0 1px #bfe3cc,\n 0 1px 2px rgba(16, 24, 32, 0.04),\n 0 2px 8px rgba(16, 24, 32, 0.06);\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport styles from './Card.module.css';\n\ninterface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'className'> {\n /** Shows a second sheet behind the card, for representing a stack/batch. */\n stacked?: boolean;\n /** Success-tinted surface, e.g. a completed task. */\n completed?: boolean;\n /** Adds pointer cursor + accent hover ring. */\n interactive?: boolean;\n /** Grab cursor, for drag sources — pair with `interactive`. */\n draggable?: boolean;\n /** Suppresses the hover ring while a drag is in progress. */\n dragging?: boolean;\n /** Card fills its container width instead of a fixed width. */\n fluid?: boolean;\n children: ReactNode;\n}\n\nexport function Card({\n stacked,\n completed,\n interactive,\n draggable,\n dragging,\n fluid,\n children,\n ...rest\n}: CardProps) {\n return (\n <div className={`${styles.wrap} ${fluid ? styles.fluid : ''}`}>\n {stacked && <div className={`${styles.backing} ${completed ? styles.completed : ''}`} />}\n <div\n className={[\n styles.card,\n completed ? styles.completed : '',\n interactive ? styles.interactive : '',\n draggable ? styles.grabbable : '',\n dragging ? styles.dragging : '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </div>\n </div>\n );\n}\n",".neutral,\n.pill,\n.accent,\n.success,\n.danger,\n.count {\n display: inline-flex;\n align-items: center;\n font-weight: var(--font-weight-medium);\n white-space: nowrap;\n}\n\n/* Square tags — e.g. day badges, worker names, video panel tags */\n.neutral {\n color: var(--text-tertiary);\n font-size: 0.75rem;\n background: var(--ink-5);\n border-radius: 6px;\n padding: 2px 7px;\n}\n\n/* Pill tags — e.g. BPO group labels, total-duration tags */\n.pill {\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border);\n color: var(--text-tertiary);\n font-size: 0.8rem;\n padding: 3px 11px;\n border-radius: 999px;\n}\n\n/* Accent pill — e.g. \"current\" stat, read-only banner badge */\n.accent {\n background: var(--brand-bg);\n color: var(--brand-dark);\n font-size: 0.8rem;\n padding: 3px 11px;\n border-radius: 999px;\n}\n\n/* Success pill — e.g. \"time spent\" stat */\n.success {\n background: var(--success-bg);\n color: var(--success-text);\n font-size: 0.8rem;\n padding: 3px 11px;\n border-radius: 999px;\n}\n\n/* Danger — square (e.g. ASAP tag) reuses the same token pair as the\n pill-shaped status variant; only the shape differs by context. */\n.danger {\n color: var(--danger-text);\n font-size: 0.75rem;\n background: var(--danger-bg);\n border-radius: 6px;\n padding: 2px 7px;\n}\n\n/* Count badge — small solid circle, e.g. active-filter count */\n.count {\n justify-content: center;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 999px;\n background: var(--brand-main);\n color: #fff;\n font-size: 0.65rem;\n line-height: 16px;\n text-align: center;\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport styles from './Tag.module.css';\n\ntype TagVariant = 'neutral' | 'pill' | 'accent' | 'success' | 'danger' | 'count';\n\ninterface TagProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'className'> {\n variant?: TagVariant;\n children: ReactNode;\n}\n\nexport function Tag({ variant = 'neutral', children, ...rest }: TagProps) {\n return (\n <span className={styles[variant]} {...rest}>\n {children}\n </span>\n );\n}\n",".group {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n margin-top: 4px;\n}\n\n.group.sm {\n gap: 6px;\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n appearance: none;\n border: none;\n outline: none;\n font-family: inherit;\n font-weight: var(--font-weight-medium);\n white-space: nowrap;\n border-radius: 999px;\n cursor: pointer;\n transition:\n background-color 0.15s ease-out,\n color 0.15s ease-out,\n transform 0.1s ease-out;\n background: var(--ink-5);\n color: var(--text-primary);\n}\n\n.group.base .chip {\n height: 36px;\n padding: 0 14px;\n font-size: 0.85rem;\n}\n\n.group.sm .chip {\n height: 24px;\n padding: 0 9px;\n font-size: 0.75rem;\n}\n\n.chip:hover:not(:disabled) {\n background: var(--surface-muted);\n}\n\n.chip:active:not(:disabled) {\n transform: scale(0.95);\n background: var(--surface-muted);\n}\n\n.chip:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n}\n\n.chip.selected {\n background: var(--brand-bg);\n color: var(--brand-main);\n}\n\n.chip.selected:hover:not(:disabled) {\n background: var(--brand-main-20);\n}\n\n.chip.selected:active:not(:disabled) {\n background: var(--brand-main-30);\n}\n\n.chip:disabled {\n background: var(--disabled-bg);\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n",".group {\n display: inline-flex;\n flex-direction: column;\n gap: 0;\n}\n\n.groupLabel {\n margin-bottom: 6px;\n}\n",".label {\n font-size: 0.85rem;\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n padding-left: 4px;\n}\n","import type { ReactNode } from 'react';\nimport styles from './FieldLabel.module.css';\n\ninterface FieldLabelProps {\n children: ReactNode;\n /** Pass the id of the control this labels to render a real `<label htmlFor>`. */\n htmlFor?: string;\n className?: string;\n}\n\nexport function FieldLabel({ children, htmlFor, className }: FieldLabelProps) {\n const classes = `${styles.label} ${className ?? ''}`.trim();\n if (htmlFor) {\n return (\n <label className={classes} htmlFor={htmlFor}>\n {children}\n </label>\n );\n }\n return <span className={classes}>{children}</span>;\n}\n","import type { ReactNode } from 'react';\nimport styles from './TagGroup.module.css';\nimport groupStyles from './OptionGroup.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ntype TagGroupSize = 'sm' | 'base';\n\ninterface TagGroupItem {\n value: string;\n label: ReactNode;\n disabled?: boolean;\n}\n\ninterface TagGroupProps {\n items: TagGroupItem[];\n value: string[];\n onChange: (value: string[]) => void;\n size?: TagGroupSize;\n disabled?: boolean;\n label?: ReactNode;\n 'aria-label'?: string;\n}\n\nexport function TagGroup({\n items,\n value,\n onChange,\n size = 'base',\n disabled = false,\n label,\n ...rest\n}: TagGroupProps) {\n function toggle(itemValue: string) {\n const next = value.includes(itemValue)\n ? value.filter((v) => v !== itemValue)\n : [...value, itemValue];\n onChange(next);\n }\n\n const tags = (\n <div\n role=\"group\"\n aria-label={label ? undefined : rest['aria-label']}\n className={`${styles.group} ${styles[size]}`}\n >\n {items.map((item) => {\n const selected = value.includes(item.value);\n const isDisabled = disabled || item.disabled;\n return (\n <button\n key={item.value}\n type=\"button\"\n aria-pressed={selected}\n disabled={isDisabled}\n className={[styles.chip, selected && styles.selected].filter(Boolean).join(' ')}\n onClick={() => !isDisabled && toggle(item.value)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n );\n\n if (!label) return tags;\n\n return (\n <div className={groupStyles.group} {...rest}>\n <FieldLabel className={groupStyles.groupLabel}>{label}</FieldLabel>\n {tags}\n </div>\n );\n}\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string?.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toKebabCase } from './toKebabCase.mjs';\n\nfunction toLucideIconData(iconName, iconNode, aliases = []) {\n if (iconNode == null) {\n throw new Error(\"[lucide]: iconNode is required when icon name is used\");\n }\n return {\n name: toKebabCase(iconName),\n size: 24,\n node: iconNode,\n ...aliases.length > 0 ? { aliases } : {}\n };\n}\n\nexport { toLucideIconData };\n//# sourceMappingURL=toLucideIconData.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => {\n let out = \"\";\n let upperNext = false;\n for (const ch of string) {\n if (ch === \"-\" || ch === \"_\" || ch <= \" \") {\n upperNext = out.length > 0;\n continue;\n }\n if (out.length === 0) {\n out += ch.toLowerCase();\n } else {\n out += upperNext ? ch.toUpperCase() : ch;\n }\n upperNext = false;\n }\n return out;\n};\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { mergeClasses } from '../utils/mergeClasses.mjs';\n\nfunction isDefined(value) {\n return value !== null && value !== void 0;\n}\nfunction buildLucideIconNode(icon, params = {}) {\n const attributeNames = params.attributeNames ?? {};\n const getAttributeName = (attributeName) => attributeNames[attributeName] ?? attributeName;\n const viewBoxWidth = icon.size ?? icon.width ?? defaultAttributes[\"width\"];\n const viewBoxHeight = icon.size ?? icon.height ?? defaultAttributes[\"height\"];\n const aliasClassNames = icon.aliases?.filter((alias) => typeof alias === \"string\" && alias.trim() !== \"\").map((alias) => `lucide-${alias}`) ?? [];\n const iconClassNames = [...icon.name ? [`lucide-${icon.name}`] : [], ...aliasClassNames];\n const classNamesFromClassName = params.className?.split(\" \").filter(Boolean) ?? [];\n const className = params.includeDefaultClasses === false ? mergeClasses(...classNamesFromClassName) : mergeClasses(\"lucide\", ...iconClassNames, ...classNamesFromClassName);\n const calculatedStrokeWidth = params.absoluteStrokeWidth ? Number(params.strokeWidth ?? defaultAttributes[\"stroke-width\"]) * Number(icon.size ?? icon.width ?? defaultAttributes[\"width\"]) / Number(params.size ?? params.width ?? defaultAttributes[\"width\"]) : params.strokeWidth ?? defaultAttributes[\"stroke-width\"];\n const attributes = {\n ...Object.entries(defaultAttributes).reduce((attrs, [attrName, value]) => {\n attrs[getAttributeName(attrName)] = value;\n return attrs;\n }, {}),\n ...\"color\" in params && params.color && {\n [getAttributeName(\"stroke\")]: params.color\n },\n ...\"size\" in params && isDefined(params.size) && {\n [getAttributeName(\"width\")]: params.size,\n [getAttributeName(\"height\")]: params.size\n },\n ...\"width\" in params && isDefined(params.width) && {\n [getAttributeName(\"width\")]: params.width\n },\n ...\"height\" in params && isDefined(params.height) && {\n [getAttributeName(\"height\")]: params.height\n },\n [getAttributeName(\"stroke-width\")]: calculatedStrokeWidth,\n ...className && {\n [getAttributeName(\"class\")]: className\n },\n [getAttributeName(\"viewBox\")]: `0 0 ${viewBoxWidth} ${viewBoxHeight}`,\n ...params.hasA11yProp === false ? {\n [getAttributeName(\"aria-hidden\")]: \"true\"\n } : {},\n ...\"attributes\" in params && params.attributes\n };\n return [\n \"svg\",\n attributes,\n icon.node.map((child) => {\n const [name, attrs, children] = child;\n const nextAttrs = params.nonScalingStroke ? { [getAttributeName(\"vector-effect\")]: \"non-scaling-stroke\", ...attrs } : attrs;\n return children ? [name, nextAttrs, children] : [name, nextAttrs];\n })\n ];\n}\n\nexport { buildLucideIconNode as default };\n//# sourceMappingURL=buildLucideIconNode.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport buildLucideIconNode from './buildLucideIconNode.mjs';\n\nfunction buildLucideIconForReact(icon, params = {}) {\n return buildLucideIconNode(icon, {\n ...params,\n attributeNames: {\n ...params.attributeNames,\n class: \"className\",\n \"stroke-width\": \"strokeWidth\",\n \"stroke-linecap\": \"strokeLinecap\",\n \"stroke-linejoin\": \"strokeLinejoin\",\n \"vector-effect\": \"vectorEffect\"\n }\n });\n}\n\nexport { buildLucideIconForReact as default };\n//# sourceMappingURL=buildLucideIconForReact.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, nonScalingStroke, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport buildLucideIconForReact from './shared/src/build/buildLucideIconForReact.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({\n color,\n size,\n width,\n height,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className = \"\",\n children,\n iconNode = [],\n icon = {\n node: iconNode,\n aliases: [],\n size: 24\n },\n ...rest\n }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n nonScalingStroke: contextNonScalingStroke = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const hasAccessibleProp = Boolean(children) || hasA11yProp(rest);\n const [name, svgAttributes, builtIconNode = []] = buildLucideIconForReact(icon, {\n color: color ?? contextColor,\n width: width ?? size ?? contextSize,\n height: height ?? size ?? contextSize,\n strokeWidth: strokeWidth ?? contextStrokeWidth,\n absoluteStrokeWidth: absoluteStrokeWidth ?? contextAbsoluteStrokeWidth,\n nonScalingStroke: nonScalingStroke ?? contextNonScalingStroke,\n className: mergeClasses(contextClass, className),\n hasA11yProp: hasAccessibleProp,\n attributes: rest\n });\n return createElement(\n name,\n {\n ref,\n ...svgAttributes\n },\n [\n ...builtIconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { toLucideIconData } from './shared/src/utils/toLucideIconData.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nfunction createLucideIcon(iconDataOrName, iconNode = [], aliases = []) {\n const iconData = typeof iconDataOrName === \"string\" ? toLucideIconData(iconDataOrName, iconNode, aliases) : iconDataOrName;\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n icon: iconData,\n className,\n ...props\n })\n );\n if (iconData.name) {\n Component.displayName = toPascalCase(iconData.name);\n }\n return Component;\n}\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"check\",\n size: 24,\n node: [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]]\n};\n__iconData.node;\nconst Check = createLucideIcon(__iconData);\n\nexport { __iconData, Check as default };\n//# sourceMappingURL=check.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"chevron-down\",\n size: 24,\n node: [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]]\n};\n__iconData.node;\nconst ChevronDown = createLucideIcon(__iconData);\n\nexport { __iconData, ChevronDown as default };\n//# sourceMappingURL=chevron-down.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"search\",\n size: 24,\n node: [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n ]\n};\n__iconData.node;\nconst Search = createLucideIcon(__iconData);\n\nexport { __iconData, Search as default };\n//# sourceMappingURL=search.mjs.map\n",".toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 0 8px;\n background: var(--card-surface);\n border-radius: 16px;\n box-shadow:\n inset 0 0 0 1px var(--border),\n 0 1px 2px rgba(16, 24, 32, 0.04),\n 0 2px 8px rgba(16, 24, 32, 0.06);\n}\n.searchWrap {\n position: relative;\n flex: 1;\n min-width: 0;\n}\n.searchWrap::after {\n content: '';\n position: absolute;\n left: 36px;\n right: 0;\n bottom: 0;\n height: 2px;\n background: var(--brand-main);\n opacity: 0;\n pointer-events: none;\n}\n.searchWrap:focus-within::after {\n opacity: 1;\n}\n.searchIcon {\n position: absolute;\n top: 50%;\n left: 12px;\n width: 16px;\n height: 16px;\n transform: translateY(-53%);\n color: var(--text-tertiary);\n pointer-events: none;\n}\n.searchIcon svg {\n width: 100%;\n height: 100%;\n}\n.search {\n width: 100%;\n box-sizing: border-box;\n border: none;\n padding: 16px 52px 16px 36px;\n font-family: inherit;\n font-size: 1rem;\n color: var(--text-primary);\n background: none;\n box-shadow: inset -1px 0 0 var(--border);\n}\n.search:focus {\n outline: none;\n}\n.searchShortcut {\n position: absolute;\n top: 50%;\n right: 8px;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2px 6px;\n border-radius: 6px;\n background: var(--bg);\n color: var(--text-tertiary);\n font-size: 0.75rem;\n font-weight: var(--font-weight-semibold);\n letter-spacing: 0.02em;\n pointer-events: none;\n}\n.controls {\n display: flex;\n align-items: center;\n flex: none;\n}\n","import { useEffect, useRef, type ChangeEvent, type ReactNode } from 'react';\nimport { Search } from 'lucide-react';\nimport styles from './Toolbar.module.css';\n\ninterface ToolbarProps {\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n placeholder?: string;\n /** Text shown in the keyboard-shortcut badge, e.g. \"⌘K\". Omit to hide the badge. */\n shortcutLabel?: string;\n /** Focuses the search input when Cmd/Ctrl + the shortcut key is pressed. */\n shortcutKey?: string;\n /** Right-side content — filter/sort controls, actions, etc. */\n children?: ReactNode;\n}\n\nexport function Toolbar({\n searchValue,\n onSearchChange,\n placeholder = 'Search…',\n shortcutLabel = '⌘K',\n shortcutKey = 'k',\n children,\n}: ToolbarProps) {\n const searchRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n function onKeyDown(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === shortcutKey.toLowerCase()) {\n e.preventDefault();\n searchRef.current?.focus();\n }\n }\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [shortcutKey]);\n\n return (\n <div className={styles.toolbar}>\n <div className={styles.searchWrap}>\n <span className={styles.searchIcon}>\n <Search />\n </span>\n <input\n ref={searchRef}\n type=\"text\"\n className={styles.search}\n placeholder={placeholder}\n autoComplete=\"off\"\n value={searchValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onSearchChange?.(e.target.value)}\n />\n {shortcutLabel && (\n <span className={styles.searchShortcut} aria-hidden=\"true\">\n {shortcutLabel}\n </span>\n )}\n </div>\n {children && <div className={styles.controls}>{children}</div>}\n </div>\n );\n}\n",".checkbox {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n padding: 8px 4px;\n}\n.control {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n}\n.labelText {\n font-size: 0.85rem;\n color: var(--text-primary);\n transition: color 0.2s ease-out;\n}\n.checkbox:hover .labelText {\n color: var(--brand-main);\n}\n.input {\n position: absolute;\n inset: 0;\n margin: 0;\n opacity: 0;\n cursor: pointer;\n}\n.box {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border-radius: 6px;\n background: var(--ink-5);\n box-shadow: inset 0 0 0 1px var(--border);\n transition:\n background-color 0.2s cubic-bezier(0, 0, 0.2, 1),\n box-shadow 0.2s cubic-bezier(0, 0, 0.2, 1),\n transform 0.1s cubic-bezier(0, 0, 0.2, 1);\n}\n.checkbox:hover .box {\n box-shadow: 0 0 0 1px var(--brand-main);\n}\n.input:focus-visible + .box {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n}\n.input:active + .box {\n transform: scale(0.88);\n}\n.input:checked + .box {\n background: var(--brand-main);\n box-shadow: inset 0 0 0 1px var(--brand-main);\n}\n.checkbox:hover .input:checked + .box {\n box-shadow: 0 0 0 1px var(--brand-main);\n}\n.icon {\n width: 10px;\n height: 10px;\n overflow: visible;\n}\n.icon polyline {\n fill: none;\n stroke: #fff;\n stroke-width: 2.5px;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-dasharray: 22px;\n stroke-dashoffset: 22px;\n transition: stroke-dashoffset 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.input:checked + .box .icon polyline {\n stroke-dashoffset: 0px;\n}\n.checkbox:has(.input:disabled),\n.input:disabled {\n cursor: not-allowed;\n}\n.checkbox:has(.input:disabled) .labelText {\n color: var(--disabled-text);\n}\n.checkbox:has(.input:disabled) .box {\n background: var(--surface-muted);\n box-shadow: inset 0 0 0 1px var(--border);\n transform: none;\n}\n.checkbox:has(.input:disabled) .input:checked + .box {\n background: var(--disabled-bg);\n box-shadow: inset 0 0 0 1px var(--disabled-bg);\n}\n","import type { ChangeEvent, FocusEvent, ReactNode, Ref } from 'react';\nimport styles from './Checkbox.module.css';\nimport groupStyles from './OptionGroup.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ninterface CheckboxProps {\n checked: boolean;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n onBlur?: (e: FocusEvent<HTMLInputElement>) => void;\n name?: string;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n ref?: Ref<HTMLInputElement>;\n}\n\nexport function Checkbox({\n checked,\n onChange,\n onBlur,\n name,\n label,\n ariaLabel,\n disabled,\n className,\n ref,\n}: CheckboxProps) {\n return (\n <label className={`${styles.checkbox} ${className ?? ''}`}>\n <span className={styles.control}>\n <input\n ref={ref}\n type=\"checkbox\"\n className={styles.input}\n checked={checked}\n onChange={onChange}\n onBlur={onBlur}\n name={name}\n aria-label={ariaLabel}\n disabled={disabled}\n />\n <span className={styles.box}>\n <svg className={styles.icon} viewBox=\"0 0 17 18\" aria-hidden=\"true\">\n <polyline points=\"1 9 7 14 15 4\" />\n </svg>\n </span>\n </span>\n {label && <span className={styles.labelText}>{label}</span>}\n </label>\n );\n}\n\ninterface CheckboxGroupItem {\n value: string;\n label: ReactNode;\n disabled?: boolean;\n}\n\ninterface CheckboxGroupProps {\n label?: ReactNode;\n items: CheckboxGroupItem[];\n value: string[];\n onChange: (value: string[]) => void;\n disabled?: boolean;\n 'aria-label'?: string;\n}\n\nexport function CheckboxGroup({ label, items, value, onChange, disabled, ...rest }: CheckboxGroupProps) {\n function toggle(itemValue: string) {\n const next = value.includes(itemValue)\n ? value.filter((v) => v !== itemValue)\n : [...value, itemValue];\n onChange(next);\n }\n\n return (\n <div role=\"group\" aria-label={label ? undefined : rest['aria-label']} className={groupStyles.group}>\n {label && <FieldLabel className={groupStyles.groupLabel}>{label}</FieldLabel>}\n {items.map((item) => (\n <Checkbox\n key={item.value}\n checked={value.includes(item.value)}\n onChange={() => toggle(item.value)}\n label={item.label}\n disabled={disabled || item.disabled}\n />\n ))}\n </div>\n );\n}\n",".radio {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n padding: 8px 4px;\n}\n.control {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n}\n.labelText {\n font-size: 0.85rem;\n color: var(--text-primary);\n transition: color 0.2s ease-out;\n}\n.radio:hover .labelText {\n color: var(--brand-main);\n}\n.input {\n position: absolute;\n inset: 0;\n margin: 0;\n opacity: 0;\n cursor: pointer;\n}\n.circle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--ink-5);\n box-shadow: inset 0 0 0 1px var(--border);\n transition:\n background-color 0.2s cubic-bezier(0, 0, 0.2, 1),\n box-shadow 0.2s cubic-bezier(0, 0, 0.2, 1),\n transform 0.1s cubic-bezier(0, 0, 0.2, 1);\n}\n.radio:hover .circle {\n box-shadow: 0 0 0 1px var(--brand-main);\n}\n.input:focus-visible + .circle {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n}\n.input:active + .circle {\n transform: scale(0.88);\n}\n.input:checked + .circle {\n background: var(--brand-main);\n box-shadow: inset 0 0 0 1px var(--brand-main);\n}\n.radio:hover .input:checked + .circle {\n box-shadow: 0 0 0 1px var(--brand-main);\n}\n.dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #fff;\n transform: scale(0);\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.input:checked + .circle .dot {\n transform: scale(1);\n}\n.radio:has(.input:disabled),\n.input:disabled {\n cursor: not-allowed;\n}\n.radio:has(.input:disabled) .labelText {\n color: var(--disabled-text);\n}\n.radio:has(.input:disabled) .circle {\n background: var(--surface-muted);\n box-shadow: inset 0 0 0 1px var(--border);\n transform: none;\n}\n.radio:has(.input:disabled) .input:checked + .circle {\n background: var(--disabled-bg);\n box-shadow: inset 0 0 0 1px var(--disabled-bg);\n}\n","import type { ChangeEvent, FocusEvent, ReactNode, Ref } from 'react';\nimport styles from './RadioButton.module.css';\nimport groupStyles from './OptionGroup.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ninterface RadioButtonProps {\n checked: boolean;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n onBlur?: (e: FocusEvent<HTMLInputElement>) => void;\n name?: string;\n value?: string;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n ref?: Ref<HTMLInputElement>;\n}\n\nexport function RadioButton({\n checked,\n onChange,\n onBlur,\n name,\n value,\n label,\n ariaLabel,\n disabled,\n className,\n ref,\n}: RadioButtonProps) {\n return (\n <label className={`${styles.radio} ${className ?? ''}`}>\n <span className={styles.control}>\n <input\n ref={ref}\n type=\"radio\"\n className={styles.input}\n checked={checked}\n onChange={onChange}\n onBlur={onBlur}\n name={name}\n value={value}\n aria-label={ariaLabel}\n disabled={disabled}\n />\n <span className={styles.circle}>\n <span className={styles.dot} />\n </span>\n </span>\n {label && <span className={styles.labelText}>{label}</span>}\n </label>\n );\n}\n\ninterface RadioGroupItem {\n value: string;\n label: ReactNode;\n disabled?: boolean;\n}\n\ninterface RadioGroupProps {\n label?: ReactNode;\n name: string;\n items: RadioGroupItem[];\n value: string;\n onChange: (value: string) => void;\n disabled?: boolean;\n 'aria-label'?: string;\n}\n\nexport function RadioGroup({ label, name, items, value, onChange, disabled, ...rest }: RadioGroupProps) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={label ? undefined : rest['aria-label']}\n className={groupStyles.group}\n >\n {label && <FieldLabel className={groupStyles.groupLabel}>{label}</FieldLabel>}\n {items.map((item) => (\n <RadioButton\n key={item.value}\n name={name}\n value={item.value}\n checked={value === item.value}\n onChange={() => onChange(item.value)}\n label={item.label}\n disabled={disabled || item.disabled}\n />\n ))}\n </div>\n );\n}\n",".switch {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n}\n.switch:has(.input:disabled) {\n cursor: not-allowed;\n}\n.control {\n position: relative;\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n.input {\n position: absolute;\n inset: 0;\n margin: 0;\n opacity: 0;\n cursor: pointer;\n}\n.input:disabled {\n cursor: not-allowed;\n}\n.track {\n position: relative;\n width: 100%;\n height: 100%;\n border-radius: 999px;\n background: var(--ink-5);\n box-shadow: inset 0 0 0 1px var(--border);\n transition:\n background-color 0.2s cubic-bezier(0, 0, 0.2, 1),\n box-shadow 0.2s cubic-bezier(0, 0, 0.2, 1);\n}\n.switch:hover .track {\n box-shadow: inset 0 0 0 1px var(--brand-main);\n}\n.input:focus-visible + .track {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n}\n.input:checked + .track {\n background: var(--brand-main);\n box-shadow: inset 0 0 0 1px var(--brand-main);\n}\n.input:disabled + .track {\n background: var(--surface-muted);\n box-shadow: inset 0 0 0 1px var(--border);\n}\n.thumb {\n position: absolute;\n top: 50%;\n left: 2px;\n border-radius: 50%;\n background: #fff;\n transform: translateY(-50%);\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.input:checked + .track .thumb {\n transform: translateY(-50%) translateX(var(--switch-thumb-travel));\n}\n\n.sm {\n width: 32px;\n height: 18px;\n --switch-thumb-travel: 14px;\n}\n.sm .thumb {\n width: 14px;\n height: 14px;\n}\n.base {\n width: 40px;\n height: 22px;\n --switch-thumb-travel: 18px;\n}\n.base .thumb {\n width: 18px;\n height: 18px;\n}\n\n.labelText {\n font-size: 0.85rem;\n color: var(--text-primary);\n transition: color 0.2s ease-out;\n}\n.switch:hover .labelText {\n color: var(--brand-main);\n}\n.switch:has(.input:disabled) .labelText {\n color: var(--disabled-text);\n}\n","import type { ChangeEvent, ReactNode } from 'react';\nimport styles from './Switch.module.css';\n\ntype SwitchSize = 'sm' | 'base';\n\ninterface SwitchProps {\n checked: boolean;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n size?: SwitchSize;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function Switch({\n checked,\n onChange,\n size = 'base',\n label,\n ariaLabel,\n disabled,\n className,\n}: SwitchProps) {\n return (\n <label className={`${styles.switch} ${className ?? ''}`}>\n <span className={`${styles.control} ${styles[size]}`}>\n <input\n type=\"checkbox\"\n role=\"switch\"\n className={styles.input}\n checked={checked}\n onChange={onChange}\n aria-label={ariaLabel}\n disabled={disabled}\n />\n <span className={styles.track}>\n <span className={styles.thumb} />\n </span>\n </span>\n {label && <span className={styles.labelText}>{label}</span>}\n </label>\n );\n}\n",".field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.inputWrap {\n position: relative;\n display: flex;\n align-items: center;\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border-input);\n transition: box-shadow 0.2s ease-out;\n}\n.inputWrap:focus-within {\n box-shadow:\n inset 0 0 0 0 var(--border-input),\n 0 0 0 2px var(--brand-main);\n}\n.errorWrap,\n.errorWrap:focus-within {\n box-shadow: inset 0 0 0 1px var(--danger-text);\n}\n.inputWrap:has(.input:disabled) {\n background: var(--surface-muted);\n}\n\n.toolbar {\n background: none;\n box-shadow: none;\n}\n.toolbar::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: 2px;\n background: var(--brand-main);\n opacity: 0;\n transition: opacity 0.2s ease-out;\n}\n.toolbar:focus-within {\n box-shadow: none;\n}\n.toolbar:focus-within::after {\n opacity: 1;\n}\n.toolbar.errorWrap,\n.toolbar.errorWrap:focus-within {\n box-shadow: none;\n}\n.toolbar.errorWrap::after {\n background: var(--danger-text);\n opacity: 1;\n}\n\n.sm {\n height: var(--control-height-sm);\n border-radius: var(--radius-sm);\n}\n.sm .input {\n padding: 0 12px;\n font-size: 0.9rem;\n}\n.base {\n height: var(--control-height-base);\n border-radius: var(--radius-base);\n}\n.base .input {\n padding: 0 14px;\n font-size: 0.9rem;\n}\n.inputWrap:has(.icon) .input {\n padding-left: 8px;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 12px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n.input {\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n background: none;\n font-family: inherit;\n color: var(--text-primary);\n font-weight: var(--font-weight-regular);\n}\n.input:focus {\n outline: none;\n}\n.input::placeholder {\n color: var(--text-tertiary);\n}\n.input:disabled {\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.helperText {\n font-size: 0.78rem;\n color: var(--text-tertiary);\n padding-left: 8px;\n}\n.errorText {\n font-size: 0.78rem;\n color: var(--danger-text);\n}\n","import { useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport styles from './TextField.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ntype TextFieldSize = 'sm' | 'base';\ntype TextFieldVariant = 'default' | 'toolbar';\n\ninterface TextFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className' | 'size'> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: TextFieldSize;\n variant?: TextFieldVariant;\n leadingIcon?: ReactNode;\n}\n\nexport function TextField({\n label,\n helperText,\n error,\n size = 'base',\n variant = 'default',\n leadingIcon,\n id,\n ...rest\n}: TextFieldProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div className={styles.field}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div\n className={`${styles.inputWrap} ${styles[variant]} ${styles[size]} ${error ? styles.errorWrap : ''}`}\n >\n {leadingIcon && <span className={styles.icon}>{leadingIcon}</span>}\n <input id={inputId} className={styles.input} {...rest} />\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helperText}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n",".field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.inputWrap {\n position: relative;\n display: flex;\n align-items: center;\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border-input);\n transition: box-shadow 0.2s ease-out;\n}\n.inputWrap:focus-within {\n box-shadow:\n inset 0 0 0 0 var(--border-input),\n 0 0 0 2px var(--brand-main);\n}\n.errorWrap,\n.errorWrap:focus-within {\n box-shadow: inset 0 0 0 1px var(--danger-text);\n}\n.inputWrap:has(.input:disabled) {\n background: var(--surface-muted);\n}\n\n.sm {\n height: var(--control-height-sm);\n border-radius: var(--radius-sm);\n}\n.sm .input {\n padding: 0 8px;\n font-size: 0.85rem;\n}\n.base {\n height: var(--control-height-base);\n border-radius: var(--radius-base);\n}\n.base .input {\n padding: 0 10px;\n font-size: 0.9rem;\n}\n.inputWrap:has(.prefix) .input {\n padding-left: 4px;\n}\n.inputWrap:has(.suffix) .input {\n padding-right: 4px;\n}\n\n.prefix,\n.suffix {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--text-tertiary);\n font-size: 0.78rem;\n white-space: nowrap;\n}\n.prefix {\n margin-left: 10px;\n}\n.suffix {\n margin-right: 10px;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n background: none;\n font-family: inherit;\n color: var(--text-primary);\n font-weight: var(--font-weight-regular);\n font-variant-numeric: tabular-nums;\n appearance: textfield;\n -moz-appearance: textfield;\n}\n.input::-webkit-outer-spin-button,\n.input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n.input:focus {\n outline: none;\n}\n.input::placeholder {\n color: var(--text-tertiary);\n}\n.input:disabled {\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.helperText {\n font-size: 0.78rem;\n color: var(--text-tertiary);\n padding-left: 8px;\n}\n.errorText {\n font-size: 0.78rem;\n color: var(--danger-text);\n}\n","import { useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport styles from './NumberField.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ntype NumberFieldSize = 'sm' | 'base';\n\ninterface NumberFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className' | 'size' | 'prefix'> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: NumberFieldSize;\n /** Rendered inline before the value, e.g. \"$\". */\n prefix?: ReactNode;\n /** Rendered inline after the value, e.g. \"cows\", \"/cwt\". */\n suffix?: ReactNode;\n}\n\nexport function NumberField({\n label,\n helperText,\n error,\n size = 'base',\n prefix,\n suffix,\n id,\n ...rest\n}: NumberFieldProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div className={styles.field}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div className={`${styles.inputWrap} ${styles[size]} ${error ? styles.errorWrap : ''}`}>\n {prefix && <span className={styles.prefix}>{prefix}</span>}\n <input id={inputId} className={styles.input} {...rest} />\n {suffix && <span className={styles.suffix}>{suffix}</span>}\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helperText}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n",".menu {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 180px;\n width: fit-content;\n padding: 4px;\n box-sizing: border-box;\n background: var(--card-surface);\n border-radius: 12px;\n box-shadow:\n inset 0 0 0 1px var(--border),\n 0 8px 24px rgba(0, 0, 0, 0.12);\n}\n.divider {\n height: 1px;\n background: var(--border);\n margin: 4px 6px;\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport styles from './Menu.module.css';\n\ninterface MenuProps extends Omit<HTMLAttributes<HTMLDivElement>, 'className'> {\n children: ReactNode;\n}\n\nexport function Menu({ children, ...rest }: MenuProps) {\n return (\n <div role=\"menu\" className={styles.menu} {...rest}>\n {children}\n </div>\n );\n}\n\nexport function MenuDivider() {\n return <div className={styles.divider} role=\"separator\" />;\n}\n",".item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: var(--control-height-sm);\n box-sizing: border-box;\n border: none;\n background: none;\n border-radius: 8px;\n padding: 8px 12px;\n font-family: inherit;\n font-size: 0.9rem;\n color: var(--text-primary);\n text-align: left;\n cursor: pointer;\n transition:\n background 0.15s ease-out,\n color 0.15s ease-out;\n}\n.item:hover:not(:disabled) {\n background: var(--brand-bg);\n color: var(--brand-dark);\n}\n.item:hover:not(:disabled) .icon,\n.item:hover:not(:disabled) .check {\n color: var(--brand-dark);\n}\n.item:active:not(:disabled) {\n background: var(--brand-main-20);\n}\n.item:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: -2px;\n}\n.item:disabled {\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: -2px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.trailing {\n color: var(--text-tertiary);\n font-size: 0.8rem;\n margin-right: -2px;\n flex-shrink: 0;\n}\n.selected {\n color: var(--text-primary);\n font-weight: var(--font-weight-medium);\n}\n.selected .icon {\n color: var(--text-primary);\n}\n.check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 8px;\n color: var(--text-primary);\n flex-shrink: 0;\n}\n.check svg {\n width: 100%;\n height: 100%;\n}\n.destructive {\n color: var(--danger-text);\n}\n.destructive .icon {\n color: var(--danger-text);\n}\n.destructive:hover:not(:disabled) {\n background: var(--danger-bg);\n color: var(--danger-text);\n}\n.destructive:hover:not(:disabled) .icon {\n color: var(--danger-text);\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { Check } from 'lucide-react';\nimport styles from './MenuItem.module.css';\n\ninterface MenuItemProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className'> {\n icon?: ReactNode;\n trailing?: ReactNode;\n selected?: boolean;\n destructive?: boolean;\n children: ReactNode;\n}\n\nexport function MenuItem({ icon, trailing, selected, destructive, children, ...rest }: MenuItemProps) {\n const classes = [styles.item, selected && styles.selected, destructive && styles.destructive]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button type=\"button\" role=\"menuitem\" className={classes} {...rest}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{children}</span>\n {trailing && <span className={styles.trailing}>{trailing}</span>}\n {selected && (\n <span className={styles.check}>\n <Check />\n </span>\n )}\n </button>\n );\n}\n",".field {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.trigger {\n display: flex;\n align-items: center;\n width: 100%;\n box-sizing: border-box;\n border: none;\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border-input);\n font-family: inherit;\n color: var(--text-primary);\n cursor: pointer;\n transition: box-shadow 0.2s ease-out;\n}\n.trigger:focus-visible {\n box-shadow:\n inset 0 0 0 0 var(--border-input),\n 0 0 0 2px var(--brand-main);\n}\n.errorWrap {\n box-shadow: inset 0 0 0 1px var(--danger-text);\n}\n.trigger:disabled {\n background: var(--surface-muted);\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n\n.sm {\n border-radius: var(--radius-sm);\n}\n.sm.trigger {\n height: var(--control-height-sm);\n padding: 0 12px;\n font-size: 0.9rem;\n}\n.base {\n border-radius: var(--radius-base);\n}\n.base.trigger {\n height: var(--control-height-base);\n padding: 0 14px;\n font-size: 0.9rem;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-right: 8px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n.value {\n flex: 1;\n min-width: 0;\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.placeholder {\n color: var(--text-tertiary);\n}\n.chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 8px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n transition: transform 0.15s ease-out;\n}\n.chevron svg {\n width: 100%;\n height: 100%;\n}\n.chevronOpen {\n transform: rotate(180deg);\n}\n\n.menuWrap {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n z-index: 10;\n}\n.helperText {\n font-size: 0.78rem;\n color: var(--text-tertiary);\n padding-left: 8px;\n}\n.errorText {\n font-size: 0.78rem;\n color: var(--danger-text);\n}\n","import { useEffect, useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport { Menu } from './Menu';\nimport { MenuItem } from './MenuItem';\nimport { FieldLabel } from './FieldLabel';\nimport styles from './Dropdown.module.css';\n\ntype DropdownSize = 'sm' | 'base';\n\ninterface DropdownOption<T extends string> {\n value: T;\n label: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\ninterface DropdownProps<T extends string> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: DropdownSize;\n placeholder?: string;\n options: DropdownOption<T>[];\n value?: T;\n onChange: (value: T) => void;\n disabled?: boolean;\n}\n\nexport function Dropdown<T extends string>({\n label,\n helperText,\n error,\n size = 'base',\n placeholder = 'Select…',\n options,\n value,\n onChange,\n disabled,\n}: DropdownProps<T>) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerId = useId();\n\n const selected = options.find((opt) => opt.value === value);\n const enabledValues = options.filter((opt) => !opt.disabled).map((opt) => opt.value);\n\n useEffect(() => {\n if (!open) return;\n const focusValue = value ?? enabledValues[0];\n const el = rootRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${focusValue}\"]`);\n el?.focus();\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function onPointerDown(e: PointerEvent) {\n if (!rootRef.current?.contains(e.target as Node)) setOpen(false);\n }\n function onKeyDown(e: globalThis.KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKeyDown);\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n function handleTriggerKeyDown(e: KeyboardEvent<HTMLButtonElement>) {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n return;\n }\n if (e.key === 'Escape') setOpen(false);\n }\n\n function handleOptionKeyDown(e: KeyboardEvent<HTMLButtonElement>, currentValue: T) {\n const currentIndex = enabledValues.indexOf(currentValue);\n if (currentIndex === -1) return;\n\n let nextIndex: number | null = null;\n if (e.key === 'ArrowDown') nextIndex = (currentIndex + 1) % enabledValues.length;\n if (e.key === 'ArrowUp') nextIndex = (currentIndex - 1 + enabledValues.length) % enabledValues.length;\n if (e.key === 'Home') nextIndex = 0;\n if (e.key === 'End') nextIndex = enabledValues.length - 1;\n\n if (nextIndex !== null) {\n e.preventDefault();\n const nextValue = enabledValues[nextIndex];\n const el = rootRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${nextValue}\"]`);\n el?.focus();\n return;\n }\n if (e.key === 'Escape') setOpen(false);\n }\n\n return (\n <div className={styles.field} ref={rootRef}>\n {label && <FieldLabel htmlFor={triggerId}>{label}</FieldLabel>}\n <button\n id={triggerId}\n type=\"button\"\n className={`${styles.trigger} ${styles[size]} ${error ? styles.errorWrap : ''}`}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n disabled={disabled}\n onClick={() => setOpen((v) => !v)}\n onKeyDown={handleTriggerKeyDown}\n >\n {selected?.icon && <span className={styles.icon}>{selected.icon}</span>}\n <span className={`${styles.value} ${!selected ? styles.placeholder : ''}`}>\n {selected ? selected.label : placeholder}\n </span>\n <span className={`${styles.chevron} ${open ? styles.chevronOpen : ''}`}>\n <ChevronDown />\n </span>\n </button>\n {open && (\n <div className={styles.menuWrap}>\n <Menu role=\"listbox\" style={{ width: '100%' }}>\n {options.map((opt) => (\n <MenuItem\n key={opt.value}\n data-value={opt.value}\n role=\"option\"\n aria-selected={opt.value === value}\n icon={opt.icon}\n selected={opt.value === value}\n disabled={opt.disabled}\n onClick={() => {\n onChange(opt.value);\n setOpen(false);\n }}\n onKeyDown={(e) => handleOptionKeyDown(e, opt.value)}\n >\n {opt.label}\n </MenuItem>\n ))}\n </Menu>\n </div>\n )}\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helperText}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n",".highlight {\n background: var(--brand-bg);\n color: var(--brand-dark);\n border-radius: 3px;\n padding: 0 1px;\n}\n","import { Fragment } from 'react';\nimport styles from './HighlightText.module.css';\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function HighlightText({ text, query }: { text: string; query: string }) {\n if (!query) return <>{text}</>;\n\n const parts = text.split(new RegExp(`(${escapeRegExp(query)})`, 'ig'));\n return (\n <>\n {parts.map((part, i) =>\n part.toLowerCase() === query.toLowerCase() ? (\n <mark key={i} className={styles.highlight}>\n {part}\n </mark>\n ) : (\n <Fragment key={i}>{part}</Fragment>\n ),\n )}\n </>\n );\n}\n",".group {\n position: relative;\n}\n.btn {\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n border-radius: 12px;\n padding: 12px;\n font-family: inherit;\n font-size: 1rem;\n color: var(--text-primary);\n cursor: pointer;\n transition:\n background 0.2s ease-out,\n box-shadow 0.2s ease-out,\n transform 0.2s ease-out;\n}\n.btn:hover {\n background: rgba(10, 10, 11, 0.04);\n}\n.btn:active {\n background: var(--brand-bg);\n box-shadow: inset 0 2px 1px 0 rgba(0, 140, 216, 0.25);\n transform: scale(0.95);\n}\n.caret {\n color: var(--text-tertiary);\n display: flex;\n align-items: center;\n}\n.caret svg {\n width: 14px;\n height: 14px;\n}\n.label {\n color: var(--text-secondary);\n}\n.badge {\n position: absolute;\n top: 2px;\n right: 2px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 999px;\n background: var(--brand-main, #0a84d8);\n color: #fff;\n font-size: 0.65rem;\n font-weight: var(--font-weight-semibold);\n line-height: 16px;\n text-align: center;\n}\n.value {\n color: var(--text-primary);\n font-weight: var(--font-weight-medium);\n}\n.panel {\n display: none;\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n background: #fff;\n border-radius: 12px;\n min-width: 220px;\n width: fit-content;\n max-height: 280px;\n overflow-y: auto;\n box-shadow:\n inset 0 0 0 1px var(--border),\n 0 8px 24px rgba(0, 0, 0, 0.12);\n z-index: 50;\n}\n.panel.open {\n display: block;\n}\n.panelRight {\n left: auto;\n right: 0;\n}\n.panelWide {\n min-width: 260px;\n padding-bottom: 4px;\n}\n.sectionHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 12px 14px 4px;\n}\n.sectionLabel {\n font-size: 0.75rem;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.02em;\n}\n.allToggle {\n background: none;\n border: none;\n padding: 0;\n font-family: inherit;\n font-size: 0.75rem;\n font-weight: var(--font-weight-semibold);\n color: var(--brand-main, #0a84d8);\n cursor: pointer;\n}\n.allToggle:hover {\n text-decoration: underline;\n}\n.divider {\n height: 1px;\n background: var(--border);\n margin: 4px 0;\n}\n.option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px;\n border-radius: 8px;\n font-size: 1rem;\n cursor: pointer;\n}\n.option:hover {\n background: var(--bg);\n}\n.search {\n width: calc(100% - 16px);\n box-sizing: border-box;\n border: none;\n box-shadow: inset 0 0 0 1px var(--border-input);\n border-radius: 8px;\n padding: 8px 12px;\n margin: 8px;\n font-family: inherit;\n font-size: 1rem;\n margin-bottom: 0;\n}\n.search:focus {\n outline: none;\n box-shadow: inset 0 0 0 1px var(--brand-main);\n}\n.optionsList {\n padding: 4px 4px;\n}\n.empty {\n padding: 7px 8px;\n color: var(--text-tertiary);\n font-size: 0.85rem;\n}\n","import { useState } from 'react';\nimport { Checkbox } from './Checkbox';\nimport styles from './FilterSection.module.css';\n\ninterface FilterSectionProps<T extends string> {\n label: string;\n options: T[];\n optionLabel: (opt: T) => string;\n activeSet: Set<T>;\n onToggle: (opt: T) => void;\n onSetAll?: (opts: T[]) => void;\n searchable?: boolean;\n}\n\nexport function FilterSection<T extends string>({\n label,\n options,\n optionLabel,\n activeSet,\n onToggle,\n onSetAll,\n searchable,\n}: FilterSectionProps<T>) {\n const [query, setQuery] = useState('');\n\n const q = query.trim().toLowerCase();\n const matches = q ? options.filter((opt) => optionLabel(opt).toLowerCase().includes(q)) : options;\n const allSelected = options.length > 0 && activeSet.size === options.length;\n\n return (\n <div>\n <div className={styles.sectionHeader}>\n <div className={styles.sectionLabel}>{label}</div>\n {onSetAll && (\n <button\n type=\"button\"\n className={styles.allToggle}\n onClick={() => onSetAll(allSelected ? [] : options)}\n >\n {allSelected ? 'Deselect all' : 'Select all'}\n </button>\n )}\n </div>\n {searchable && (\n <input\n type=\"text\"\n className={styles.search}\n placeholder={`Search ${label.toLowerCase()}…`}\n autoComplete=\"off\"\n value={query}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => setQuery(e.target.value)}\n />\n )}\n <div className={styles.optionsList}>\n {matches.length === 0 && <div className={styles.empty}>No match</div>}\n {matches.map((opt) => (\n <Checkbox\n key={opt}\n className={styles.option}\n checked={activeSet.has(opt)}\n onChange={() => onToggle(opt)}\n label={optionLabel(opt)}\n />\n ))}\n </div>\n </div>\n );\n}\n",".line,\n.box {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.indicator {\n position: absolute;\n left: 0;\n pointer-events: none;\n transition: translate 0.25s cubic-bezier(0.39, 0.575, 0.565, 1), width 0.25s ease,\n scale 0.125s cubic-bezier(0.39, 0.575, 0.565, 1);\n}\n\n.indicator.settling {\n transition: scale 0.1s linear;\n}\n\n.indicatorLine {\n bottom: 0;\n height: 2px;\n background: var(--brand-main);\n}\n\n.indicatorBox {\n top: 4px;\n bottom: 4px;\n border-radius: 8px;\n background: var(--card-surface);\n box-shadow: 0 0 1px 0.5px var(--border);\n}\n\n.tab {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: none;\n border-radius: 8px 8px 0 0;\n font-family: inherit;\n font-weight: var(--font-weight-regular);\n cursor: pointer;\n white-space: nowrap;\n transition: color 0.15s ease-out, background 0.15s ease-out, box-shadow 0.15s ease-out;\n}\n\n.tab::before {\n content: '';\n position: absolute;\n left: 50%;\n bottom: 0;\n width: 40%;\n aspect-ratio: 1;\n border-radius: 50%;\n transform: translate(-50%, 100%) scale(1);\n transition: transform 0.3s cubic-bezier(0.39, 0.575, 0.565, 1);\n z-index: -1;\n pointer-events: none;\n background: rgba(var(--brand-main-rgb), 0.08);\n}\n.tab:hover:not(:disabled)::before {\n transform: translate(-50%, 15%) scale(4);\n}\n.tab:active:not(:disabled)::before {\n background: rgba(var(--brand-main-rgb), 0.28);\n}\n\n.tab:disabled {\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.tab:disabled::before {\n display: none;\n}\n\n.tab.selected:hover::before {\n display: none;\n}\n\n.tab:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: -4px;\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n\n/* Line variant */\n\n.line {\n box-shadow: inset 0 -1px 0 0 var(--border);\n}\n\n.line .tab {\n background: transparent;\n padding: 12px 8px;\n font-size: 1rem;\n color: var(--text-secondary);\n}\n.line .tab:hover:not(:disabled) {\n color: var(--brand-main);\n}\n.line .tab.selected {\n color: var(--text-primary);\n font-weight: var(--font-weight-medium);\n}\n\n/* Box variant */\n\n.box {\n box-sizing: border-box;\n height: var(--control-height-base);\n background: var(--ink-5);\n border-radius: var(--radius-base);\n padding: 4px;\n gap: 4px;\n box-shadow: inset 0 0 0.5px 1px #e3e3e3;\n}\n\n.box .tab {\n height: calc(var(--control-height-base) - 8px);\n border-radius: 8px;\n padding: 0 14px;\n font-size: 0.9rem;\n background: transparent;\n color: var(--text-secondary);\n}\n.box .tab:hover:not(:disabled) {\n color: var(--brand-main);\n /* box-shadow: 0 0 0px 1px var(--brand-main-30); */\n}\n.box .tab.selected {\n color: var(--text-primary);\n font-weight: var(--font-weight-medium);\n}\n\n.box.sm {\n height: var(--control-height-sm);\n border-radius: var(--radius-sm);\n}\n.box.sm .tab {\n height: calc(var(--control-height-sm) - 8px);\n border-radius: 6px;\n padding: 0 14px;\n}\n.box.sm .indicatorBox {\n border-radius: 6px;\n}\n","import {\n useLayoutEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n type TransitionEvent,\n} from 'react';\nimport styles from './Tabs.module.css';\n\ntype TabsVariant = 'line' | 'box';\ntype TabsSize = 'base' | 'sm';\n\ninterface TabItem {\n value: string;\n label: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\ninterface TabsProps {\n items: TabItem[];\n value: string;\n onChange: (value: string) => void;\n variant?: TabsVariant;\n size?: TabsSize;\n 'aria-label'?: string;\n}\n\nexport function Tabs({ items, value, onChange, variant = 'line', size = 'base', ...rest }: TabsProps) {\n const enabledValues = items.filter((item) => !item.disabled).map((item) => item.value);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const tabRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n const prevValueRef = useRef(value);\n const [indicatorStyle, setIndicatorStyle] = useState<{ left: number; width: number } | null>(\n null,\n );\n const [pillPhase, setPillPhase] = useState<'idle' | 'moving' | 'settling'>('idle');\n\n useLayoutEffect(() => {\n const selectedTab = tabRefs.current.get(value);\n if (!selectedTab) return;\n setIndicatorStyle({ left: selectedTab.offsetLeft, width: selectedTab.offsetWidth });\n\n if (variant === 'box' && prevValueRef.current !== value) {\n setPillPhase('moving');\n }\n prevValueRef.current = value;\n }, [value, items, variant, size]);\n\n function handlePillTransitionEnd(event: TransitionEvent<HTMLSpanElement>) {\n if (event.propertyName !== 'scale') return;\n if (pillPhase === 'moving') setPillPhase('settling');\n else if (pillPhase === 'settling') setPillPhase('idle');\n }\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const observer = new ResizeObserver(() => {\n const selectedTab = tabRefs.current.get(value);\n if (!selectedTab) return;\n setIndicatorStyle({ left: selectedTab.offsetLeft, width: selectedTab.offsetWidth });\n });\n observer.observe(container);\n return () => observer.disconnect();\n }, [value]);\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const currentIndex = enabledValues.indexOf(value);\n if (currentIndex === -1) return;\n\n let nextIndex: number | null = null;\n if (event.key === 'ArrowRight') nextIndex = (currentIndex + 1) % enabledValues.length;\n if (event.key === 'ArrowLeft') {\n nextIndex = (currentIndex - 1 + enabledValues.length) % enabledValues.length;\n }\n if (event.key === 'Home') nextIndex = 0;\n if (event.key === 'End') nextIndex = enabledValues.length - 1;\n\n if (nextIndex !== null) {\n event.preventDefault();\n onChange(enabledValues[nextIndex]);\n }\n }\n\n return (\n <div\n ref={containerRef}\n role=\"tablist\"\n className={[styles[variant], variant === 'box' && size === 'sm' && styles.sm]\n .filter(Boolean)\n .join(' ')}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {indicatorStyle && (\n <span\n aria-hidden\n className={[\n styles.indicator,\n variant === 'line' ? styles.indicatorLine : styles.indicatorBox,\n pillPhase === 'settling' && styles.settling,\n ]\n .filter(Boolean)\n .join(' ')}\n onTransitionEnd={handlePillTransitionEnd}\n style={{\n translate: `${indicatorStyle.left}px 0`,\n scale: variant === 'box' && pillPhase === 'moving' ? 0.92 : 1,\n width: indicatorStyle.width,\n }}\n />\n )}\n {items.map((item) => {\n const selected = item.value === value;\n return (\n <button\n key={item.value}\n ref={(node) => {\n if (node) tabRefs.current.set(item.value, node);\n else tabRefs.current.delete(item.value);\n }}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n disabled={item.disabled}\n tabIndex={selected ? 0 : -1}\n className={[styles.tab, selected && styles.selected].filter(Boolean).join(' ')}\n onClick={() => !item.disabled && onChange(item.value)}\n >\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {item.label}\n </button>\n );\n })}\n </div>\n );\n}\n","export function formatDuration(mins: number): string {\n const h = Math.floor(mins / 60);\n const m = mins % 60;\n return `${h}h:${String(m).padStart(2, '0')}m`;\n}\n\n/** HH:MM:SS — seconds are a stable per-video display detail, not tracked in the data model. */\nexport function formatDurationHMS(mins: number, seconds: number): string {\n const h = Math.floor(mins / 60);\n const m = mins % 60;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(seconds)}`;\n}\n"],"x_google_ignoreList":[11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cattle-care-ui",
3
- "version": "0.1.12",
3
+ "version": "0.1.14",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",