cattle-care-ui 0.1.19 → 0.1.21

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.
@@ -1,11 +1,12 @@
1
1
  import { ReactNode } from 'react';
2
2
  type TabsVariant = 'line' | 'box';
3
3
  type TabsSize = 'base' | 'sm';
4
- interface TabItem {
4
+ export interface TabItem {
5
5
  value: string;
6
- label: ReactNode;
6
+ label?: ReactNode;
7
7
  icon?: ReactNode;
8
8
  disabled?: boolean;
9
+ 'aria-label'?: string;
9
10
  }
10
11
  interface TabsProps {
11
12
  items: TabItem[];
@@ -14,6 +15,7 @@ interface TabsProps {
14
15
  variant?: TabsVariant;
15
16
  size?: TabsSize;
16
17
  'aria-label'?: string;
18
+ 'aria-labelledby'?: string;
17
19
  }
18
20
  export declare function Tabs({ items, value, onChange, variant, size, ...rest }: TabsProps): import("react").JSX.Element;
19
21
  export {};
@@ -0,0 +1,11 @@
1
+ import { ReactNode } from 'react';
2
+ import { TabItem } from './Tabs';
3
+ interface ToggleProps {
4
+ items: TabItem[];
5
+ value: string;
6
+ onChange: (value: string) => void;
7
+ label?: ReactNode;
8
+ 'aria-label'?: string;
9
+ }
10
+ export declare function Toggle({ items, value, onChange, label, 'aria-label': ariaLabel }: ToggleProps): import("react").JSX.Element;
11
+ export {};
package/dist/index.css CHANGED
@@ -1,2 +1,2 @@
1
- ._primary_1fqtv_1,._secondary_1fqtv_2,._tertiary_1fqtv_3,._dangerous_1fqtv_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_1fqtv_1:focus-visible,._secondary_1fqtv_2:focus-visible,._tertiary_1fqtv_3:focus-visible,._dangerous_1fqtv_4:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px}._primary_1fqtv_1:active:not(:disabled),._secondary_1fqtv_2:active:not(:disabled),._tertiary_1fqtv_3:active:not(:disabled),._dangerous_1fqtv_4:active:not(:disabled){transform:scale(.95)}._sm_1fqtv_35{height:var(--control-height-sm);border-radius:var(--radius-sm);padding:0 12px;font-size:.9rem}._base_1fqtv_41{height:var(--control-height-base);border-radius:var(--radius-base);padding:0 16px;font-size:.9rem}._icon_1fqtv_47{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:flex}._icon_1fqtv_47:first-child{margin-left:-4px}._icon_1fqtv_47:last-child{margin-right:-4px}._icon_1fqtv_47 svg{width:100%;height:100%}._iconOnly_1fqtv_66{box-sizing:border-box;padding:0}._iconOnly_1fqtv_66._sm_1fqtv_35{width:var(--control-height-sm)}._iconOnly_1fqtv_66._base_1fqtv_41{width:var(--control-height-base)}._fullWidth_1fqtv_76{width:100%}._primary_1fqtv_1:before,._secondary_1fqtv_2:before,._tertiary_1fqtv_3:before,._dangerous_1fqtv_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_1fqtv_1:hover:before,._secondary_1fqtv_2:hover:before,._tertiary_1fqtv_3:hover:before,._dangerous_1fqtv_4:hover:before{transform:translate(-50%,15%)scale(8)}._primary_1fqtv_1{background:var(--brand-dark);color:#fff;font-weight:var(--font-weight-regular);letter-spacing:.02em}._primary_1fqtv_1:before{background:#ffffff14}._primary_1fqtv_1:active:not(:disabled):before{background:#00000014}._secondary_1fqtv_2{background:var(--depth-5);color:var(--text-primary)}._secondary_1fqtv_2 ._icon_1fqtv_47{color:var(--text-secondary)}._secondary_1fqtv_2:before{background:rgba(var(--brand-main-rgb), .08)}._secondary_1fqtv_2:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._secondary_1fqtv_2:hover ._icon_1fqtv_47,._secondary_1fqtv_2:hover{color:var(--brand-main)}._tertiary_1fqtv_3{color:var(--text-secondary);background:0 0}._tertiary_1fqtv_3:before{background:rgba(var(--brand-main-rgb), .16)}._tertiary_1fqtv_3:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._tertiary_1fqtv_3:hover,._tertiary_1fqtv_3:active:not(:disabled){background:var(--bg)}._tertiary_1fqtv_3:hover{color:var(--brand-main)}._dangerous_1fqtv_4{background:var(--danger-bg);color:var(--danger-text-dark)}._dangerous_1fqtv_4:before{background:rgba(var(--danger-rgb), .16)}._dangerous_1fqtv_4:active:not(:disabled):before{background:rgba(var(--danger-rgb), .28)}._primary_1fqtv_1:disabled,._secondary_1fqtv_2:disabled,._tertiary_1fqtv_3:disabled,._dangerous_1fqtv_4:disabled{background:var(--disabled-bg);color:var(--disabled-text);cursor:not-allowed}._primary_1fqtv_1:disabled:hover,._secondary_1fqtv_2:disabled:hover,._tertiary_1fqtv_3:disabled:hover,._dangerous_1fqtv_4:disabled:hover{color:var(--disabled-text)}._primary_1fqtv_1:disabled:before,._secondary_1fqtv_2:disabled:before,._tertiary_1fqtv_3:disabled:before,._dangerous_1fqtv_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_1h6kq_1,._pill_1h6kq_2,._accent_1h6kq_3,._success_1h6kq_4,._danger_1h6kq_5,._count_1h6kq_6{font-weight:var(--font-weight-medium);white-space:nowrap;align-items:center;display:inline-flex}._neutral_1h6kq_1{color:var(--text-tertiary);background:var(--depth-5);border-radius:6px;padding:2px 7px;font-size:.75rem}._pill_1h6kq_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_1h6kq_3{background:var(--brand-bg);color:var(--brand-dark);border-radius:999px;padding:3px 11px;font-size:.8rem}._success_1h6kq_4{background:var(--success-bg);color:var(--success-text);border-radius:999px;padding:3px 11px;font-size:.8rem}._danger_1h6kq_5{color:var(--danger-text);background:var(--danger-bg);border-radius:6px;padding:2px 7px;font-size:.75rem}._count_1h6kq_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_jl3nf_1{flex-wrap:wrap;align-items:center;gap:8px;margin-top:4px;display:inline-flex}._group_jl3nf_1._sm_jl3nf_9{gap:6px}._chip_jl3nf_13{appearance:none;font-family:inherit;font-weight:var(--font-weight-medium);white-space:nowrap;cursor:pointer;background:var(--depth-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_jl3nf_1._base_jl3nf_33 ._chip_jl3nf_13{height:36px;padding:0 14px;font-size:.85rem}._group_jl3nf_1._sm_jl3nf_9 ._chip_jl3nf_13{height:24px;padding:0 9px;font-size:.75rem}._chip_jl3nf_13:hover:not(:disabled){background:var(--surface-muted)}._chip_jl3nf_13:active:not(:disabled){background:var(--surface-muted);transform:scale(.95)}._chip_jl3nf_13:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px}._chip_jl3nf_13._selected_jl3nf_59{background:var(--brand-bg);color:var(--brand-main)}._chip_jl3nf_13._selected_jl3nf_59:hover:not(:disabled){background:var(--brand-main-20)}._chip_jl3nf_13._selected_jl3nf_59:active:not(:disabled){background:var(--brand-main-30)}._chip_jl3nf_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_54v1q_1{cursor:pointer;align-items:center;gap:8px;padding:8px 4px;display:inline-flex}._control_54v1q_8{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex;position:relative}._labelText_54v1q_17{color:var(--text-primary);font-size:.85rem;transition:color .2s ease-out}._checkbox_54v1q_1:hover ._labelText_54v1q_17{color:var(--brand-main)}._input_54v1q_25{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._box_54v1q_32{background:var(--depth-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_54v1q_1:hover ._box_54v1q_32{box-shadow:0 0 0 1px var(--brand-main)}._input_54v1q_25:focus-visible+._box_54v1q_32{outline:2px solid var(--brand-main);outline-offset:2px}._input_54v1q_25:active+._box_54v1q_32{transform:scale(.88)}._input_54v1q_25:checked+._box_54v1q_32{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._checkbox_54v1q_1:hover ._input_54v1q_25:checked+._box_54v1q_32{box-shadow:0 0 0 1px var(--brand-main)}._icon_54v1q_63{width:10px;height:10px;overflow:visible}._icon_54v1q_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_54v1q_25:checked+._box_54v1q_32 ._icon_54v1q_63 polyline{stroke-dashoffset:0}._input_54v1q_25:disabled{cursor:not-allowed}._checkbox_54v1q_1:has(._input_54v1q_25:disabled){cursor:not-allowed}._checkbox_54v1q_1:has(._input_54v1q_25:disabled) ._labelText_54v1q_17{color:var(--disabled-text)}._checkbox_54v1q_1:has(._input_54v1q_25:disabled) ._box_54v1q_32{background:var(--surface-muted);box-shadow:inset 0 0 0 1px var(--border);transform:none}._checkbox_54v1q_1:has(._input_54v1q_25:disabled) ._input_54v1q_25:checked+._box_54v1q_32{background:var(--disabled-bg);box-shadow:inset 0 0 0 1px var(--disabled-bg)}._radio_wj7kb_1{cursor:pointer;align-items:center;gap:8px;padding:8px 4px;display:inline-flex}._control_wj7kb_8{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex;position:relative}._labelText_wj7kb_17{color:var(--text-primary);font-size:.85rem;transition:color .2s ease-out}._radio_wj7kb_1:hover ._labelText_wj7kb_17{color:var(--brand-main)}._input_wj7kb_25{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._circle_wj7kb_32{background:var(--depth-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_wj7kb_1:hover ._circle_wj7kb_32{box-shadow:0 0 0 1px var(--brand-main)}._input_wj7kb_25:focus-visible+._circle_wj7kb_32{outline:2px solid var(--brand-main);outline-offset:2px}._input_wj7kb_25:active+._circle_wj7kb_32{transform:scale(.88)}._input_wj7kb_25:checked+._circle_wj7kb_32{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._radio_wj7kb_1:hover ._input_wj7kb_25:checked+._circle_wj7kb_32{box-shadow:0 0 0 1px var(--brand-main)}._dot_wj7kb_63{background:#fff;border-radius:50%;width:6px;height:6px;transition:transform .2s cubic-bezier(.4,0,.2,1);transform:scale(0)}._input_wj7kb_25:checked+._circle_wj7kb_32 ._dot_wj7kb_63{transform:scale(1)}._input_wj7kb_25:disabled{cursor:not-allowed}._radio_wj7kb_1:has(._input_wj7kb_25:disabled){cursor:not-allowed}._radio_wj7kb_1:has(._input_wj7kb_25:disabled) ._labelText_wj7kb_17{color:var(--disabled-text)}._radio_wj7kb_1:has(._input_wj7kb_25:disabled) ._circle_wj7kb_32{background:var(--surface-muted);box-shadow:inset 0 0 0 1px var(--border);transform:none}._radio_wj7kb_1:has(._input_wj7kb_25:disabled) ._input_wj7kb_25:checked+._circle_wj7kb_32{background:var(--disabled-bg);box-shadow:inset 0 0 0 1px var(--disabled-bg)}._switch_1uo9k_1{cursor:pointer;align-items:center;gap:8px;display:inline-flex}._switch_1uo9k_1:has(._input_1uo9k_7:disabled){cursor:not-allowed}._control_1uo9k_10{flex-shrink:0;align-items:center;display:inline-flex;position:relative}._input_1uo9k_7{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._input_1uo9k_7:disabled{cursor:not-allowed}._track_1uo9k_26{background:var(--depth-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_1uo9k_1:hover ._track_1uo9k_26{box-shadow:inset 0 0 0 1px var(--brand-main)}._input_1uo9k_7:focus-visible+._track_1uo9k_26{outline:2px solid var(--brand-main);outline-offset:2px}._input_1uo9k_7:checked+._track_1uo9k_26{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._input_1uo9k_7:disabled+._track_1uo9k_26{background:var(--surface-muted);box-shadow:inset 0 0 0 1px var(--border)}._thumb_1uo9k_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_1uo9k_7:checked+._track_1uo9k_26 ._thumb_1uo9k_52{transform:translateY(-50%) translateX(var(--switch-thumb-travel))}._sm_1uo9k_65{--switch-thumb-travel:14px;width:32px;height:18px}._sm_1uo9k_65 ._thumb_1uo9k_52{width:14px;height:14px}._base_1uo9k_74{--switch-thumb-travel:18px;width:40px;height:22px}._base_1uo9k_74 ._thumb_1uo9k_52{width:18px;height:18px}._labelText_1uo9k_84{color:var(--text-primary);font-size:.85rem;transition:color .2s ease-out}._switch_1uo9k_1:hover ._labelText_1uo9k_84{color:var(--brand-main)}._switch_1uo9k_1:has(._input_1uo9k_7:disabled) ._labelText_1uo9k_84{color:var(--disabled-text)}._field_p41tk_1{flex-direction:column;gap:6px;display:flex}._inputWrap_p41tk_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_p41tk_6:focus-within{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_p41tk_19,._errorWrap_p41tk_19:focus-within{box-shadow:inset 0 0 0 1px var(--danger-text)}._inputWrap_p41tk_6:has(._input_p41tk_6:disabled){background:var(--surface-muted)}._toolbar_p41tk_27{box-shadow:none;background:0 0}._toolbar_p41tk_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_p41tk_27:focus-within{box-shadow:none}._toolbar_p41tk_27:focus-within:after{opacity:1}._toolbar_p41tk_27._errorWrap_p41tk_19,._toolbar_p41tk_27._errorWrap_p41tk_19:focus-within{box-shadow:none}._toolbar_p41tk_27._errorWrap_p41tk_19:after{background:var(--danger-text);opacity:1}._sm_p41tk_57{height:var(--control-height-sm);border-radius:var(--radius-sm)}._sm_p41tk_57 ._input_p41tk_6{padding:0 12px;font-size:.9rem}._base_p41tk_65{height:var(--control-height-base);border-radius:var(--radius-base)}._base_p41tk_65 ._input_p41tk_6{padding:0 14px;font-size:.9rem}._inputWrap_p41tk_6:has(._icon_p41tk_73) ._input_p41tk_6{padding-left:8px}._icon_p41tk_73{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-left:12px;display:flex}._icon_p41tk_73 svg{width:100%;height:100%}._input_p41tk_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_p41tk_6:focus{outline:none}._input_p41tk_6::placeholder{color:var(--text-tertiary)}._input_p41tk_6:disabled{color:var(--disabled-text);cursor:not-allowed}._helperText_p41tk_111{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_p41tk_116{color:var(--danger-text);font-size:.78rem}._trailing_p41tk_120{width:32px;height:32px;color:var(--text-tertiary);cursor:pointer;background:0 0;border:none;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;margin-right:6px;padding:0;transition:color .15s ease-out,background .15s ease-out;display:flex}._trailing_p41tk_120 svg{width:16px;height:16px}._trailing_p41tk_120:hover:not(:disabled){color:var(--brand-main);background:var(--brand-main-5)}._trailing_p41tk_120:focus-visible{outline:2px solid var(--brand-main);outline-offset:-2px}._trailing_p41tk_120:disabled{cursor:not-allowed}._pickerInput_p41tk_151{cursor:pointer;caret-color:#0000}._pickerInput_p41tk_151:disabled{cursor:not-allowed}._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_manci_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_manci_1:hover:not(:disabled){background:var(--brand-bg);color:var(--brand-dark)}._item_manci_1:hover:not(:disabled) ._icon_manci_25,._item_manci_1:hover:not(:disabled) ._check_manci_26{color:var(--brand-dark)}._item_manci_1:active:not(:disabled){background:var(--brand-main-20)}._item_manci_1:focus-visible{outline:2px solid var(--brand-main);outline-offset:-2px}._item_manci_1:disabled{color:var(--disabled-text);cursor:not-allowed}._icon_manci_25{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-left:-2px;display:flex}._icon_manci_25 svg{width:100%;height:100%}._label_manci_54{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._trailing_manci_61{color:var(--text-tertiary);flex-shrink:0;margin-right:-2px;font-size:.8rem}._selected_manci_67{background:var(--depth-5);color:var(--text-primary);font-weight:var(--font-weight-medium)}._selected_manci_67 ._icon_manci_25{color:var(--text-primary)}._check_manci_26{width:16px;height:16px;color:var(--text-primary);flex-shrink:0;justify-content:center;align-items:center;margin-left:8px;display:flex}._selected_manci_67 ._check_manci_26{color:var(--brand-main)}._check_manci_26 svg{width:100%;height:100%}._destructive_manci_92,._destructive_manci_92 ._icon_manci_25{color:var(--danger-text)}._destructive_manci_92:hover:not(:disabled){background:var(--danger-bg);color:var(--danger-text)}._destructive_manci_92:hover:not(:disabled) ._icon_manci_25{color:var(--danger-text)}._field_ynqml_1{flex-direction:column;gap:6px;display:flex;position:relative}._trigger_ynqml_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_ynqml_7:focus-visible{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_ynqml_25{box-shadow:inset 0 0 0 1px var(--danger-text)}._trigger_ynqml_7:disabled{background:var(--surface-muted);color:var(--disabled-text);cursor:not-allowed}._sm_ynqml_34{border-radius:var(--radius-sm)}._sm_ynqml_34._trigger_ynqml_7{height:var(--control-height-sm);padding:0 12px;font-size:.9rem}._base_ynqml_42{border-radius:var(--radius-base)}._base_ynqml_42._trigger_ynqml_7{height:var(--control-height-base);padding:0 14px;font-size:.9rem}._icon_ynqml_51{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-right:8px;display:flex}._icon_ynqml_51 svg{width:100%;height:100%}._value_ynqml_65{text-align:left;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._placeholder_ynqml_73{color:var(--text-tertiary)}._chevron_ynqml_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_ynqml_76 svg{width:100%;height:100%}._chevronOpen_ynqml_91{transform:rotate(180deg)}._menuWrap_ynqml_95{z-index:10;position:absolute;top:calc(100% + 4px);left:0;right:0}._menuWrapUp_ynqml_102{top:auto;bottom:calc(100% + 4px)}._list_ynqml_106{flex-direction:column;gap:2px;max-height:320px;display:flex;overflow-y:auto}._search_ynqml_113{width:100%;height:var(--control-height-sm);box-sizing:border-box;background:var(--card-surface);box-shadow:inset 0 0 0 1px var(--border-input);color:var(--text-primary);border:none;border-radius:8px;outline:none;margin-bottom:4px;padding:0 10px;font-family:inherit;font-size:.9rem}._search_ynqml_113:focus{box-shadow:inset 0 0 0 1.5px var(--brand-main)}._noResults_ynqml_131{color:var(--text-tertiary);padding:8px 12px;font-size:.9rem}._helperText_ynqml_136{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_ynqml_141{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_10t2j_1{position:relative}._btn_10t2j_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_10t2j_4:hover{background:#0a0a0b0a}._btn_10t2j_4:active{background:var(--brand-bg);transform:scale(.95);box-shadow:inset 0 2px 1px #008cd840}._caret_10t2j_29{color:var(--text-tertiary);align-items:center;display:flex}._caret_10t2j_29 svg{width:14px;height:14px}._label_10t2j_38{color:var(--text-secondary)}._badge_10t2j_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_10t2j_56{color:var(--text-primary);font-weight:var(--font-weight-medium)}._panel_10t2j_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_10t2j_60._open_10t2j_76{display:block}._panelRight_10t2j_79{left:auto;right:0}._panelWide_10t2j_83{min-width:260px;padding-bottom:4px}._sectionHeader_10t2j_87{justify-content:space-between;align-items:center;gap:8px;padding:12px 14px 4px;display:flex}._sectionLabel_10t2j_94{font-size:.75rem;font-weight:var(--font-weight-semibold);color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.02em}._allToggle_10t2j_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_10t2j_101:hover{text-decoration:underline}._allToggle_10t2j_101:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px;border-radius:4px}._divider_10t2j_119{background:var(--border);height:1px;margin:4px 0}._option_10t2j_124{cursor:pointer;border-radius:8px;align-items:center;gap:8px;padding:8px;font-size:1rem;display:flex}._option_10t2j_124:hover{background:var(--bg)}._search_10t2j_136{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_10t2j_136:focus{box-shadow:inset 0 0 0 1px var(--brand-main);outline:none}._optionsList_10t2j_152{padding:4px}._empty_10t2j_155{color:var(--text-tertiary);padding:7px 8px;font-size:.85rem}._line_avsvv_1,._box_avsvv_2{align-items:center;gap:4px;display:inline-flex;position:relative}._indicator_avsvv_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_avsvv_9._settling_avsvv_17{transition:scale .1s linear}._indicatorLine_avsvv_21{background:var(--brand-main);height:2px;bottom:0}._indicatorBox_avsvv_27{background:var(--card-surface);box-shadow:0 0 1px .5px var(--border);border-radius:8px;top:4px;bottom:4px}._tab_avsvv_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_avsvv_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_avsvv_35:hover:not(:disabled):before{transform:translate(-50%,15%)scale(4)}._tab_avsvv_35:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._tab_avsvv_35:disabled{color:var(--disabled-text);cursor:not-allowed}._tab_avsvv_35:disabled:before,._tab_avsvv_35._selected_avsvv_80:hover:before{display:none}._tab_avsvv_35:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px}._icon_avsvv_89{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;margin-left:-4px;display:flex}._icon_avsvv_89 svg{width:100%;height:100%}._line_avsvv_1{box-shadow:inset 0 -1px 0 0 var(--border)}._line_avsvv_1 ._tab_avsvv_35{color:var(--text-secondary);background:0 0;padding:12px 8px;font-size:1rem}._line_avsvv_1 ._tab_avsvv_35:hover:not(:disabled){color:var(--brand-main)}._line_avsvv_1 ._tab_avsvv_35._selected_avsvv_80{color:var(--text-primary);font-weight:var(--font-weight-medium)}._box_avsvv_2{box-sizing:border-box;height:var(--control-height-base);background:var(--depth-5);border-radius:var(--radius-base);gap:4px;padding:4px;box-shadow:inset 0 0 .5px 1px #e3e3e3}._box_avsvv_2 ._tab_avsvv_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_avsvv_2 ._tab_avsvv_35:hover:not(:disabled){color:var(--brand-main)}._box_avsvv_2 ._tab_avsvv_35._selected_avsvv_80{color:var(--text-primary);font-weight:var(--font-weight-medium)}._box_avsvv_2._sm_avsvv_152{height:var(--control-height-sm);border-radius:var(--radius-sm)}._box_avsvv_2._sm_avsvv_152 ._tab_avsvv_35{height:calc(var(--control-height-sm) - 8px);border-radius:6px;padding:0 14px}._box_avsvv_2._sm_avsvv_152 ._indicatorBox_avsvv_27{border-radius:6px}._spinner_1lfif_1{flex-shrink:0;display:block;position:relative}._inner_1lfif_7,._outer_1lfif_8{display:block;position:absolute;top:0;left:0}._inner_1lfif_7{animation:1s cubic-bezier(.5,0,.4,1) infinite _spin_1lfif_1}._outer_1lfif_8{animation:1s ease-in-out infinite _spinReverse_1lfif_1}._default_1lfif_24 ._inner_1lfif_7{fill:#008cd8}._default_1lfif_24 ._outer_1lfif_8{fill:#4cd5ff}._subtle_1lfif_31 ._inner_1lfif_7,._subtle_1lfif_31 ._outer_1lfif_8{fill:var(--depth-5)}@media (prefers-reduced-motion:reduce){._inner_1lfif_7,._outer_1lfif_8{animation-duration:3s}}@keyframes _spin_1lfif_1{to{transform:rotate(360deg)}}@keyframes _spinReverse_1lfif_1{to{transform:rotate(-360deg)}}: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;--depth-base:16, 24, 32;--depth-2:rgba(var(--depth-base), .02);--depth-5:rgba(var(--depth-base), .05);--depth-10:rgba(var(--depth-base), .1);--depth-20:rgba(var(--depth-base), .2);--depth-50:rgba(var(--depth-base), .5);--depth-75:rgba(var(--depth-base), .75);--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:450;--font-weight-medium:550;--font-weight-semibold:650;--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)}
1
+ ._primary_12k4r_1,._secondary_12k4r_2,._tertiary_12k4r_3,._dangerous_12k4r_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_12k4r_1:focus-visible,._secondary_12k4r_2:focus-visible,._tertiary_12k4r_3:focus-visible,._dangerous_12k4r_4:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px}._primary_12k4r_1:active:not(:disabled),._secondary_12k4r_2:active:not(:disabled),._tertiary_12k4r_3:active:not(:disabled),._dangerous_12k4r_4:active:not(:disabled){transform:scale(.95)}._sm_12k4r_35{height:var(--control-height-sm);border-radius:var(--radius-sm);padding:0 12px;font-size:.9rem}._base_12k4r_41{height:var(--control-height-base);border-radius:var(--radius-base);padding:0 16px;font-size:.9rem}._icon_12k4r_47{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:flex}._leadingIcon_12k4r_55{margin-left:-4px}._trailingIcon_12k4r_58{margin-right:-4px}._icon_12k4r_47 svg{width:100%;height:100%}._iconOnly_12k4r_66{box-sizing:border-box;padding:0}._iconOnly_12k4r_66._sm_12k4r_35{width:var(--control-height-sm)}._iconOnly_12k4r_66._base_12k4r_41{width:var(--control-height-base)}._fullWidth_12k4r_76{width:100%}._primary_12k4r_1:before,._secondary_12k4r_2:before,._tertiary_12k4r_3:before,._dangerous_12k4r_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_12k4r_1:hover:before,._secondary_12k4r_2:hover:before,._tertiary_12k4r_3:hover:before,._dangerous_12k4r_4:hover:before{transform:translate(-50%,15%)scale(8)}._primary_12k4r_1{background:var(--brand-dark);color:#fff;font-weight:var(--font-weight-regular);letter-spacing:.02em}._primary_12k4r_1:before{background:#ffffff14}._primary_12k4r_1:active:not(:disabled):before{background:#00000014}._secondary_12k4r_2{background:var(--depth-5);color:var(--text-primary)}._secondary_12k4r_2 ._icon_12k4r_47{color:var(--text-secondary)}._secondary_12k4r_2:before{background:rgba(var(--brand-main-rgb), .08)}._secondary_12k4r_2:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._secondary_12k4r_2:hover ._icon_12k4r_47,._secondary_12k4r_2:hover{color:var(--brand-main)}._tertiary_12k4r_3{color:var(--text-secondary);background:0 0}._tertiary_12k4r_3:before{background:rgba(var(--brand-main-rgb), .16)}._tertiary_12k4r_3:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._tertiary_12k4r_3:hover,._tertiary_12k4r_3:active:not(:disabled){background:var(--bg)}._tertiary_12k4r_3:hover{color:var(--brand-main)}._dangerous_12k4r_4{background:var(--danger-bg);color:var(--danger-text-dark)}._dangerous_12k4r_4:before{background:rgba(var(--danger-rgb), .16)}._dangerous_12k4r_4:active:not(:disabled):before{background:rgba(var(--danger-rgb), .28)}._primary_12k4r_1:disabled,._secondary_12k4r_2:disabled,._tertiary_12k4r_3:disabled,._dangerous_12k4r_4:disabled{background:var(--disabled-bg);color:var(--disabled-text);cursor:not-allowed}._primary_12k4r_1:disabled:hover,._secondary_12k4r_2:disabled:hover,._tertiary_12k4r_3:disabled:hover,._dangerous_12k4r_4:disabled:hover{color:var(--disabled-text)}._primary_12k4r_1:disabled:before,._secondary_12k4r_2:disabled:before,._tertiary_12k4r_3:disabled:before,._dangerous_12k4r_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_1h6kq_1,._pill_1h6kq_2,._accent_1h6kq_3,._success_1h6kq_4,._danger_1h6kq_5,._count_1h6kq_6{font-weight:var(--font-weight-medium);white-space:nowrap;align-items:center;display:inline-flex}._neutral_1h6kq_1{color:var(--text-tertiary);background:var(--depth-5);border-radius:6px;padding:2px 7px;font-size:.75rem}._pill_1h6kq_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_1h6kq_3{background:var(--brand-bg);color:var(--brand-dark);border-radius:999px;padding:3px 11px;font-size:.8rem}._success_1h6kq_4{background:var(--success-bg);color:var(--success-text);border-radius:999px;padding:3px 11px;font-size:.8rem}._danger_1h6kq_5{color:var(--danger-text);background:var(--danger-bg);border-radius:6px;padding:2px 7px;font-size:.75rem}._count_1h6kq_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_jl3nf_1{flex-wrap:wrap;align-items:center;gap:8px;margin-top:4px;display:inline-flex}._group_jl3nf_1._sm_jl3nf_9{gap:6px}._chip_jl3nf_13{appearance:none;font-family:inherit;font-weight:var(--font-weight-medium);white-space:nowrap;cursor:pointer;background:var(--depth-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_jl3nf_1._base_jl3nf_33 ._chip_jl3nf_13{height:36px;padding:0 14px;font-size:.85rem}._group_jl3nf_1._sm_jl3nf_9 ._chip_jl3nf_13{height:24px;padding:0 9px;font-size:.75rem}._chip_jl3nf_13:hover:not(:disabled){background:var(--surface-muted)}._chip_jl3nf_13:active:not(:disabled){background:var(--surface-muted);transform:scale(.95)}._chip_jl3nf_13:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px}._chip_jl3nf_13._selected_jl3nf_59{background:var(--brand-bg);color:var(--brand-main)}._chip_jl3nf_13._selected_jl3nf_59:hover:not(:disabled){background:var(--brand-main-20)}._chip_jl3nf_13._selected_jl3nf_59:active:not(:disabled){background:var(--brand-main-30)}._chip_jl3nf_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_54v1q_1{cursor:pointer;align-items:center;gap:8px;padding:8px 4px;display:inline-flex}._control_54v1q_8{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex;position:relative}._labelText_54v1q_17{color:var(--text-primary);font-size:.85rem;transition:color .2s ease-out}._checkbox_54v1q_1:hover ._labelText_54v1q_17{color:var(--brand-main)}._input_54v1q_25{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._box_54v1q_32{background:var(--depth-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_54v1q_1:hover ._box_54v1q_32{box-shadow:0 0 0 1px var(--brand-main)}._input_54v1q_25:focus-visible+._box_54v1q_32{outline:2px solid var(--brand-main);outline-offset:2px}._input_54v1q_25:active+._box_54v1q_32{transform:scale(.88)}._input_54v1q_25:checked+._box_54v1q_32{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._checkbox_54v1q_1:hover ._input_54v1q_25:checked+._box_54v1q_32{box-shadow:0 0 0 1px var(--brand-main)}._icon_54v1q_63{width:10px;height:10px;overflow:visible}._icon_54v1q_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_54v1q_25:checked+._box_54v1q_32 ._icon_54v1q_63 polyline{stroke-dashoffset:0}._input_54v1q_25:disabled{cursor:not-allowed}._checkbox_54v1q_1:has(._input_54v1q_25:disabled){cursor:not-allowed}._checkbox_54v1q_1:has(._input_54v1q_25:disabled) ._labelText_54v1q_17{color:var(--disabled-text)}._checkbox_54v1q_1:has(._input_54v1q_25:disabled) ._box_54v1q_32{background:var(--surface-muted);box-shadow:inset 0 0 0 1px var(--border);transform:none}._checkbox_54v1q_1:has(._input_54v1q_25:disabled) ._input_54v1q_25:checked+._box_54v1q_32{background:var(--disabled-bg);box-shadow:inset 0 0 0 1px var(--disabled-bg)}._radio_wj7kb_1{cursor:pointer;align-items:center;gap:8px;padding:8px 4px;display:inline-flex}._control_wj7kb_8{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex;position:relative}._labelText_wj7kb_17{color:var(--text-primary);font-size:.85rem;transition:color .2s ease-out}._radio_wj7kb_1:hover ._labelText_wj7kb_17{color:var(--brand-main)}._input_wj7kb_25{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._circle_wj7kb_32{background:var(--depth-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_wj7kb_1:hover ._circle_wj7kb_32{box-shadow:0 0 0 1px var(--brand-main)}._input_wj7kb_25:focus-visible+._circle_wj7kb_32{outline:2px solid var(--brand-main);outline-offset:2px}._input_wj7kb_25:active+._circle_wj7kb_32{transform:scale(.88)}._input_wj7kb_25:checked+._circle_wj7kb_32{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._radio_wj7kb_1:hover ._input_wj7kb_25:checked+._circle_wj7kb_32{box-shadow:0 0 0 1px var(--brand-main)}._dot_wj7kb_63{background:#fff;border-radius:50%;width:6px;height:6px;transition:transform .2s cubic-bezier(.4,0,.2,1);transform:scale(0)}._input_wj7kb_25:checked+._circle_wj7kb_32 ._dot_wj7kb_63{transform:scale(1)}._input_wj7kb_25:disabled{cursor:not-allowed}._radio_wj7kb_1:has(._input_wj7kb_25:disabled){cursor:not-allowed}._radio_wj7kb_1:has(._input_wj7kb_25:disabled) ._labelText_wj7kb_17{color:var(--disabled-text)}._radio_wj7kb_1:has(._input_wj7kb_25:disabled) ._circle_wj7kb_32{background:var(--surface-muted);box-shadow:inset 0 0 0 1px var(--border);transform:none}._radio_wj7kb_1:has(._input_wj7kb_25:disabled) ._input_wj7kb_25:checked+._circle_wj7kb_32{background:var(--disabled-bg);box-shadow:inset 0 0 0 1px var(--disabled-bg)}._switch_1uo9k_1{cursor:pointer;align-items:center;gap:8px;display:inline-flex}._switch_1uo9k_1:has(._input_1uo9k_7:disabled){cursor:not-allowed}._control_1uo9k_10{flex-shrink:0;align-items:center;display:inline-flex;position:relative}._input_1uo9k_7{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._input_1uo9k_7:disabled{cursor:not-allowed}._track_1uo9k_26{background:var(--depth-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_1uo9k_1:hover ._track_1uo9k_26{box-shadow:inset 0 0 0 1px var(--brand-main)}._input_1uo9k_7:focus-visible+._track_1uo9k_26{outline:2px solid var(--brand-main);outline-offset:2px}._input_1uo9k_7:checked+._track_1uo9k_26{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._input_1uo9k_7:disabled+._track_1uo9k_26{background:var(--surface-muted);box-shadow:inset 0 0 0 1px var(--border)}._thumb_1uo9k_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_1uo9k_7:checked+._track_1uo9k_26 ._thumb_1uo9k_52{transform:translateY(-50%) translateX(var(--switch-thumb-travel))}._sm_1uo9k_65{--switch-thumb-travel:14px;width:32px;height:18px}._sm_1uo9k_65 ._thumb_1uo9k_52{width:14px;height:14px}._base_1uo9k_74{--switch-thumb-travel:18px;width:40px;height:22px}._base_1uo9k_74 ._thumb_1uo9k_52{width:18px;height:18px}._labelText_1uo9k_84{color:var(--text-primary);font-size:.85rem;transition:color .2s ease-out}._switch_1uo9k_1:hover ._labelText_1uo9k_84{color:var(--brand-main)}._switch_1uo9k_1:has(._input_1uo9k_7:disabled) ._labelText_1uo9k_84{color:var(--disabled-text)}._field_p41tk_1{flex-direction:column;gap:6px;display:flex}._inputWrap_p41tk_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_p41tk_6:focus-within{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_p41tk_19,._errorWrap_p41tk_19:focus-within{box-shadow:inset 0 0 0 1px var(--danger-text)}._inputWrap_p41tk_6:has(._input_p41tk_6:disabled){background:var(--surface-muted)}._toolbar_p41tk_27{box-shadow:none;background:0 0}._toolbar_p41tk_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_p41tk_27:focus-within{box-shadow:none}._toolbar_p41tk_27:focus-within:after{opacity:1}._toolbar_p41tk_27._errorWrap_p41tk_19,._toolbar_p41tk_27._errorWrap_p41tk_19:focus-within{box-shadow:none}._toolbar_p41tk_27._errorWrap_p41tk_19:after{background:var(--danger-text);opacity:1}._sm_p41tk_57{height:var(--control-height-sm);border-radius:var(--radius-sm)}._sm_p41tk_57 ._input_p41tk_6{padding:0 12px;font-size:.9rem}._base_p41tk_65{height:var(--control-height-base);border-radius:var(--radius-base)}._base_p41tk_65 ._input_p41tk_6{padding:0 14px;font-size:.9rem}._inputWrap_p41tk_6:has(._icon_p41tk_73) ._input_p41tk_6{padding-left:8px}._icon_p41tk_73{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-left:12px;display:flex}._icon_p41tk_73 svg{width:100%;height:100%}._input_p41tk_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_p41tk_6:focus{outline:none}._input_p41tk_6::placeholder{color:var(--text-tertiary)}._input_p41tk_6:disabled{color:var(--disabled-text);cursor:not-allowed}._helperText_p41tk_111{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_p41tk_116{color:var(--danger-text);font-size:.78rem}._trailing_p41tk_120{width:32px;height:32px;color:var(--text-tertiary);cursor:pointer;background:0 0;border:none;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;margin-right:6px;padding:0;transition:color .15s ease-out,background .15s ease-out;display:flex}._trailing_p41tk_120 svg{width:16px;height:16px}._trailing_p41tk_120:hover:not(:disabled){color:var(--brand-main);background:var(--brand-main-5)}._trailing_p41tk_120:focus-visible{outline:2px solid var(--brand-main);outline-offset:-2px}._trailing_p41tk_120:disabled{cursor:not-allowed}._pickerInput_p41tk_151{cursor:pointer;caret-color:#0000}._pickerInput_p41tk_151:disabled{cursor:not-allowed}._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_manci_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_manci_1:hover:not(:disabled){background:var(--brand-bg);color:var(--brand-dark)}._item_manci_1:hover:not(:disabled) ._icon_manci_25,._item_manci_1:hover:not(:disabled) ._check_manci_26{color:var(--brand-dark)}._item_manci_1:active:not(:disabled){background:var(--brand-main-20)}._item_manci_1:focus-visible{outline:2px solid var(--brand-main);outline-offset:-2px}._item_manci_1:disabled{color:var(--disabled-text);cursor:not-allowed}._icon_manci_25{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-left:-2px;display:flex}._icon_manci_25 svg{width:100%;height:100%}._label_manci_54{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._trailing_manci_61{color:var(--text-tertiary);flex-shrink:0;margin-right:-2px;font-size:.8rem}._selected_manci_67{background:var(--depth-5);color:var(--text-primary);font-weight:var(--font-weight-medium)}._selected_manci_67 ._icon_manci_25{color:var(--text-primary)}._check_manci_26{width:16px;height:16px;color:var(--text-primary);flex-shrink:0;justify-content:center;align-items:center;margin-left:8px;display:flex}._selected_manci_67 ._check_manci_26{color:var(--brand-main)}._check_manci_26 svg{width:100%;height:100%}._destructive_manci_92,._destructive_manci_92 ._icon_manci_25{color:var(--danger-text)}._destructive_manci_92:hover:not(:disabled){background:var(--danger-bg);color:var(--danger-text)}._destructive_manci_92:hover:not(:disabled) ._icon_manci_25{color:var(--danger-text)}._field_ynqml_1{flex-direction:column;gap:6px;display:flex;position:relative}._trigger_ynqml_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_ynqml_7:focus-visible{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_ynqml_25{box-shadow:inset 0 0 0 1px var(--danger-text)}._trigger_ynqml_7:disabled{background:var(--surface-muted);color:var(--disabled-text);cursor:not-allowed}._sm_ynqml_34{border-radius:var(--radius-sm)}._sm_ynqml_34._trigger_ynqml_7{height:var(--control-height-sm);padding:0 12px;font-size:.9rem}._base_ynqml_42{border-radius:var(--radius-base)}._base_ynqml_42._trigger_ynqml_7{height:var(--control-height-base);padding:0 14px;font-size:.9rem}._icon_ynqml_51{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-right:8px;display:flex}._icon_ynqml_51 svg{width:100%;height:100%}._value_ynqml_65{text-align:left;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._placeholder_ynqml_73{color:var(--text-tertiary)}._chevron_ynqml_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_ynqml_76 svg{width:100%;height:100%}._chevronOpen_ynqml_91{transform:rotate(180deg)}._menuWrap_ynqml_95{z-index:10;position:absolute;top:calc(100% + 4px);left:0;right:0}._menuWrapUp_ynqml_102{top:auto;bottom:calc(100% + 4px)}._list_ynqml_106{flex-direction:column;gap:2px;max-height:320px;display:flex;overflow-y:auto}._search_ynqml_113{width:100%;height:var(--control-height-sm);box-sizing:border-box;background:var(--card-surface);box-shadow:inset 0 0 0 1px var(--border-input);color:var(--text-primary);border:none;border-radius:8px;outline:none;margin-bottom:4px;padding:0 10px;font-family:inherit;font-size:.9rem}._search_ynqml_113:focus{box-shadow:inset 0 0 0 1.5px var(--brand-main)}._noResults_ynqml_131{color:var(--text-tertiary);padding:8px 12px;font-size:.9rem}._helperText_ynqml_136{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_ynqml_141{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_10t2j_1{position:relative}._btn_10t2j_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_10t2j_4:hover{background:#0a0a0b0a}._btn_10t2j_4:active{background:var(--brand-bg);transform:scale(.95);box-shadow:inset 0 2px 1px #008cd840}._caret_10t2j_29{color:var(--text-tertiary);align-items:center;display:flex}._caret_10t2j_29 svg{width:14px;height:14px}._label_10t2j_38{color:var(--text-secondary)}._badge_10t2j_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_10t2j_56{color:var(--text-primary);font-weight:var(--font-weight-medium)}._panel_10t2j_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_10t2j_60._open_10t2j_76{display:block}._panelRight_10t2j_79{left:auto;right:0}._panelWide_10t2j_83{min-width:260px;padding-bottom:4px}._sectionHeader_10t2j_87{justify-content:space-between;align-items:center;gap:8px;padding:12px 14px 4px;display:flex}._sectionLabel_10t2j_94{font-size:.75rem;font-weight:var(--font-weight-semibold);color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.02em}._allToggle_10t2j_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_10t2j_101:hover{text-decoration:underline}._allToggle_10t2j_101:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px;border-radius:4px}._divider_10t2j_119{background:var(--border);height:1px;margin:4px 0}._option_10t2j_124{cursor:pointer;border-radius:8px;align-items:center;gap:8px;padding:8px;font-size:1rem;display:flex}._option_10t2j_124:hover{background:var(--bg)}._search_10t2j_136{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_10t2j_136:focus{box-shadow:inset 0 0 0 1px var(--brand-main);outline:none}._optionsList_10t2j_152{padding:4px}._empty_10t2j_155{color:var(--text-tertiary);padding:7px 8px;font-size:.85rem}._line_z2201_1,._box_z2201_2{align-items:center;gap:4px;display:inline-flex;position:relative}._indicator_z2201_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_z2201_9._settling_z2201_17{transition:scale .1s linear}._indicatorLine_z2201_21{background:var(--brand-main);height:2px;bottom:0}._indicatorBox_z2201_27{background:var(--card-surface);box-shadow:0 0 1px .5px var(--border);border-radius:8px;top:4px;bottom:4px}._tab_z2201_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_z2201_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_z2201_35:hover:not(:disabled):before{transform:translate(-50%,15%)scale(4)}._tab_z2201_35:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._tab_z2201_35:disabled{color:var(--disabled-text);cursor:not-allowed}._tab_z2201_35:disabled:before,._tab_z2201_35._selected_z2201_80:hover:before{display:none}._tab_z2201_35:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px}._icon_z2201_89{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;margin-left:-4px;display:flex}._icon_z2201_89 svg{width:100%;height:100%}._tab_z2201_35._iconOnly_z2201_103{justify-content:center}._tab_z2201_35._iconOnly_z2201_103 ._icon_z2201_89{margin-left:0}._tab_z2201_35._iconOnly_z2201_103:before{width:60%}._line_z2201_1{box-shadow:inset 0 -1px 0 0 var(--border)}._line_z2201_1 ._tab_z2201_35{color:var(--text-secondary);background:0 0;padding:12px 8px;font-size:1rem}._line_z2201_1 ._tab_z2201_35:hover:not(:disabled){color:var(--brand-main)}._line_z2201_1 ._tab_z2201_35._selected_z2201_80{color:var(--text-primary);font-weight:var(--font-weight-medium)}._box_z2201_2{box-sizing:border-box;height:var(--control-height-base);background:var(--depth-5);border-radius:var(--radius-base);gap:4px;padding:4px;box-shadow:inset 0 0 .5px 1px #e3e3e3}._box_z2201_2 ._tab_z2201_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_z2201_2 ._tab_z2201_35:hover:not(:disabled){color:var(--brand-main)}._box_z2201_2 ._tab_z2201_35._selected_z2201_80{color:var(--text-primary);font-weight:var(--font-weight-medium)}._box_z2201_2._sm_z2201_163{height:var(--control-height-sm);border-radius:var(--radius-sm)}._box_z2201_2._sm_z2201_163 ._tab_z2201_35{height:calc(var(--control-height-sm) - 8px);border-radius:6px;padding:0 14px}._box_z2201_2 ._tab_z2201_35._iconOnly_z2201_103{width:calc(var(--control-height-base) - 8px);padding:0}._box_z2201_2._sm_z2201_163 ._tab_z2201_35._iconOnly_z2201_103{width:calc(var(--control-height-sm) - 8px);padding:0}._box_z2201_2._sm_z2201_163 ._indicatorBox_z2201_27{border-radius:6px}._root_17koe_1{align-items:center;gap:12px;display:inline-flex}._label_17koe_7{color:var(--text-secondary);font-size:.9rem;font-weight:var(--font-weight-regular);white-space:nowrap}._spinner_1lfif_1{flex-shrink:0;display:block;position:relative}._inner_1lfif_7,._outer_1lfif_8{display:block;position:absolute;top:0;left:0}._inner_1lfif_7{animation:1s cubic-bezier(.5,0,.4,1) infinite _spin_1lfif_1}._outer_1lfif_8{animation:1s ease-in-out infinite _spinReverse_1lfif_1}._default_1lfif_24 ._inner_1lfif_7{fill:#008cd8}._default_1lfif_24 ._outer_1lfif_8{fill:#4cd5ff}._subtle_1lfif_31 ._inner_1lfif_7,._subtle_1lfif_31 ._outer_1lfif_8{fill:var(--depth-5)}@media (prefers-reduced-motion:reduce){._inner_1lfif_7,._outer_1lfif_8{animation-duration:3s}}@keyframes _spin_1lfif_1{to{transform:rotate(360deg)}}@keyframes _spinReverse_1lfif_1{to{transform:rotate(-360deg)}}: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;--depth-base:16, 24, 32;--depth-2:rgba(var(--depth-base), .02);--depth-5:rgba(var(--depth-base), .05);--depth-10:rgba(var(--depth-base), .1);--depth-20:rgba(var(--depth-base), .2);--depth-50:rgba(var(--depth-base), .5);--depth-75:rgba(var(--depth-base), .75);--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:450;--font-weight-medium:550;--font-weight-semibold:650;--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.d.ts CHANGED
@@ -17,5 +17,6 @@ export { MenuItem } from './components/MenuItem';
17
17
  export { HighlightText } from './components/HighlightText';
18
18
  export { FilterSection } from './components/FilterSection';
19
19
  export { Tabs } from './components/Tabs';
20
+ export { Toggle } from './components/Toggle';
20
21
  export { Spinner } from './components/Spinner';
21
22
  export { formatDuration, formatDurationHMS } from './utils/format';
package/dist/index.js CHANGED
@@ -2,15 +2,17 @@
2
2
  import { Fragment as e, jsx as t, jsxs as n } from "react/jsx-runtime";
3
3
  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";
4
4
  var p = {
5
- primary: "_primary_1fqtv_1",
6
- secondary: "_secondary_1fqtv_2",
7
- tertiary: "_tertiary_1fqtv_3",
8
- dangerous: "_dangerous_1fqtv_4",
9
- sm: "_sm_1fqtv_35",
10
- base: "_base_1fqtv_41",
11
- icon: "_icon_1fqtv_47",
12
- iconOnly: "_iconOnly_1fqtv_66",
13
- fullWidth: "_fullWidth_1fqtv_76"
5
+ primary: "_primary_12k4r_1",
6
+ secondary: "_secondary_12k4r_2",
7
+ tertiary: "_tertiary_12k4r_3",
8
+ dangerous: "_dangerous_12k4r_4",
9
+ sm: "_sm_12k4r_35",
10
+ base: "_base_12k4r_41",
11
+ icon: "_icon_12k4r_47",
12
+ leadingIcon: "_leadingIcon_12k4r_55",
13
+ trailingIcon: "_trailingIcon_12k4r_58",
14
+ iconOnly: "_iconOnly_12k4r_66",
15
+ fullWidth: "_fullWidth_12k4r_76"
14
16
  };
15
17
  //#endregion
16
18
  //#region src/components/Button.tsx
@@ -29,12 +31,12 @@ function m({ variant: e = "primary", size: r = "base", leadingIcon: i, trailingI
29
31
  ...u,
30
32
  children: [
31
33
  i && /* @__PURE__ */ t("span", {
32
- className: p.icon,
34
+ className: `${p.icon} ${d ? "" : p.leadingIcon}`.trim(),
33
35
  children: i
34
36
  }),
35
37
  s,
36
38
  a && /* @__PURE__ */ t("span", {
37
- className: p.icon,
39
+ className: `${p.icon} ${p.trailingIcon}`,
38
40
  children: a
39
41
  })
40
42
  ]
@@ -1027,16 +1029,17 @@ function we({ label: e, options: r, optionLabel: i, activeSet: a, onToggle: o, o
1027
1029
  ] });
1028
1030
  }
1029
1031
  var Q = {
1030
- line: "_line_avsvv_1",
1031
- box: "_box_avsvv_2",
1032
- indicator: "_indicator_avsvv_9",
1033
- settling: "_settling_avsvv_17",
1034
- indicatorLine: "_indicatorLine_avsvv_21",
1035
- indicatorBox: "_indicatorBox_avsvv_27",
1036
- tab: "_tab_avsvv_35",
1037
- selected: "_selected_avsvv_80",
1038
- icon: "_icon_avsvv_89",
1039
- sm: "_sm_avsvv_152"
1032
+ line: "_line_z2201_1",
1033
+ box: "_box_z2201_2",
1034
+ indicator: "_indicator_z2201_9",
1035
+ settling: "_settling_z2201_17",
1036
+ indicatorLine: "_indicatorLine_z2201_21",
1037
+ indicatorBox: "_indicatorBox_z2201_27",
1038
+ tab: "_tab_z2201_35",
1039
+ selected: "_selected_z2201_80",
1040
+ icon: "_icon_z2201_89",
1041
+ iconOnly: "_iconOnly_z2201_103",
1042
+ sm: "_sm_z2201_163"
1040
1043
  };
1041
1044
  //#endregion
1042
1045
  //#region src/components/Tabs.tsx
@@ -1095,7 +1098,7 @@ function Te({ items: e, value: r, onChange: i, variant: a = "line", size: o = "b
1095
1098
  width: h.width
1096
1099
  }
1097
1100
  }), e.map((e) => {
1098
- let a = e.value === r;
1101
+ let a = e.value === r, o = !e.label && !!e.icon;
1099
1102
  return /* @__PURE__ */ n("button", {
1100
1103
  ref: (t) => {
1101
1104
  t ? p.current.set(e.value, t) : p.current.delete(e.value);
@@ -1103,9 +1106,14 @@ function Te({ items: e, value: r, onChange: i, variant: a = "line", size: o = "b
1103
1106
  type: "button",
1104
1107
  role: "tab",
1105
1108
  "aria-selected": a,
1109
+ "aria-label": e["aria-label"],
1106
1110
  disabled: e.disabled,
1107
1111
  tabIndex: a ? 0 : -1,
1108
- className: [Q.tab, a && Q.selected].filter(Boolean).join(" "),
1112
+ className: [
1113
+ Q.tab,
1114
+ a && Q.selected,
1115
+ o && Q.iconOnly
1116
+ ].filter(Boolean).join(" "),
1109
1117
  onClick: () => !e.disabled && i(e.value),
1110
1118
  children: [e.icon && /* @__PURE__ */ t("span", {
1111
1119
  className: Q.icon,
@@ -1115,6 +1123,31 @@ function Te({ items: e, value: r, onChange: i, variant: a = "line", size: o = "b
1115
1123
  })]
1116
1124
  });
1117
1125
  }
1126
+ var Ee = {
1127
+ root: "_root_17koe_1",
1128
+ label: "_label_17koe_7"
1129
+ };
1130
+ //#endregion
1131
+ //#region src/components/Toggle.tsx
1132
+ function De({ items: e, value: r, onChange: i, label: a, "aria-label": o }) {
1133
+ let s = l();
1134
+ return /* @__PURE__ */ n("div", {
1135
+ className: Ee.root,
1136
+ children: [a && /* @__PURE__ */ t("span", {
1137
+ id: s,
1138
+ className: Ee.label,
1139
+ children: a
1140
+ }), /* @__PURE__ */ t(Te, {
1141
+ items: e,
1142
+ value: r,
1143
+ onChange: i,
1144
+ variant: "box",
1145
+ size: "sm",
1146
+ "aria-label": o,
1147
+ "aria-labelledby": a && !o ? s : void 0
1148
+ })]
1149
+ });
1150
+ }
1118
1151
  var $ = {
1119
1152
  spinner: "_spinner_1lfif_1",
1120
1153
  inner: "_inner_1lfif_7",
@@ -1126,7 +1159,7 @@ var $ = {
1126
1159
  };
1127
1160
  //#endregion
1128
1161
  //#region src/components/Spinner.tsx
1129
- function Ee({ variant: e = "default", size: r = 64, label: i = "Loading", className: a, "data-testid": o }) {
1162
+ function Oe({ variant: e = "default", size: r = 64, label: i = "Loading", className: a, "data-testid": o }) {
1130
1163
  let s = [
1131
1164
  $.spinner,
1132
1165
  $[e],
@@ -1162,15 +1195,15 @@ function Ee({ variant: e = "default", size: r = 64, label: i = "Loading", classN
1162
1195
  }
1163
1196
  //#endregion
1164
1197
  //#region src/utils/format.ts
1165
- function De(e) {
1198
+ function ke(e) {
1166
1199
  let t = Math.floor(e / 60), n = e % 60;
1167
1200
  return `${t}h:${String(n).padStart(2, "0")}m`;
1168
1201
  }
1169
- function Oe(e, t) {
1202
+ function Ae(e, t) {
1170
1203
  let n = Math.floor(e / 60), r = e % 60, i = (e) => String(e).padStart(2, "0");
1171
1204
  return `${i(n)}:${i(r)}:${i(t)}`;
1172
1205
  }
1173
1206
  //#endregion
1174
- export { m as Button, g as Card, W as Checkbox, se as CheckboxGroup, pe as DateField, be as Dropdown, S as FieldLabel, we as FilterSection, Ce as HighlightText, ge as Menu, _e as MenuDivider, ve as MenuItem, me as NumberField, fe as PasswordField, ce as RadioButton, le as RadioGroup, Ee as Spinner, ue as Switch, Te as Tabs, v as Tag, ee as TagGroup, de as TextField, oe as Toolbar, De as formatDuration, Oe as formatDurationHMS };
1207
+ export { m as Button, g as Card, W as Checkbox, se as CheckboxGroup, pe as DateField, be as Dropdown, S as FieldLabel, we as FilterSection, Ce as HighlightText, ge as Menu, _e as MenuDivider, ve as MenuItem, me as NumberField, fe as PasswordField, ce as RadioButton, le as RadioGroup, Oe as Spinner, ue as Switch, Te as Tabs, v as Tag, ee as TagGroup, de as TextField, De as Toggle, oe as Toolbar, ke as formatDuration, Ae as formatDurationHMS };
1175
1208
 
1176
1209
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["__iconData","__iconData","__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/eye-off.mjs","../node_modules/lucide-react/dist/esm/icons/eye.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/PasswordField.tsx","../src/components/DateField.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/components/Spinner.module.css","../src/components/Spinner.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:focus-visible,\n.secondary:focus-visible,\n.tertiary:focus-visible,\n.dangerous:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\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(--depth-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(--depth-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(--depth-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: \"eye-off\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\n key: \"ct8e1f\"\n }\n ],\n [\"path\", { d: \"M14.084 14.158a3 3 0 0 1-4.242-4.242\", key: \"151rxh\" }],\n [\n \"path\",\n {\n d: \"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\n key: \"13bj9a\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n ]\n};\n__iconData.node;\nconst EyeOff = createLucideIcon(__iconData);\n\nexport { __iconData, EyeOff as default };\n//# sourceMappingURL=eye-off.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: \"eye\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\n key: \"1nclc0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n ]\n};\n__iconData.node;\nconst Eye = createLucideIcon(__iconData);\n\nexport { __iconData, Eye as default };\n//# sourceMappingURL=eye.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(--depth-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(--depth-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(--depth-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.trailing {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n margin-right: 6px;\n padding: 0;\n border: none;\n border-radius: 8px;\n background: none;\n color: var(--text-tertiary);\n cursor: pointer;\n flex-shrink: 0;\n transition: color 0.15s ease-out, background 0.15s ease-out;\n}\n.trailing svg {\n width: 16px;\n height: 16px;\n}\n.trailing:hover:not(:disabled) {\n color: var(--brand-main);\n background: var(--brand-main-5);\n}\n.trailing:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: -2px;\n}\n.trailing:disabled {\n cursor: not-allowed;\n}\n.pickerInput {\n cursor: pointer;\n caret-color: transparent;\n}\n.pickerInput:disabled {\n cursor: not-allowed;\n}\n","import { useId, type InputHTMLAttributes, type ReactNode, type Ref } 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 /** Extra classes for layout around the field — width, flex growth. Appended after its own class. */\n className?: string;\n /** Reaches the <input>, e.g. for a form library to focus a field that failed validation. */\n ref?: Ref<HTMLInputElement>;\n}\n\nexport function TextField({\n label,\n helperText,\n error,\n size = 'base',\n variant = 'default',\n leadingIcon,\n id,\n className,\n ref,\n ...rest\n}: TextFieldProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div className={[styles.field, className].filter(Boolean).join(' ')}>\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 ref={ref} 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","import { useId, useState, type InputHTMLAttributes, type Ref } from 'react';\nimport { Eye, EyeOff } from 'lucide-react';\nimport styles from './TextField.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ntype PasswordFieldSize = 'sm' | 'base';\n\ninterface PasswordFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className' | 'size' | 'type'> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: PasswordFieldSize;\n /** Accessible name of the toggle while the value is hidden. */\n showLabel?: string;\n /** Accessible name of the toggle while the value is shown. */\n hideLabel?: string;\n /** Start with the value shown. */\n defaultVisible?: boolean;\n /** Extra classes for layout around the field. */\n className?: string;\n ref?: Ref<HTMLInputElement>;\n}\n\n/** A text field for passwords and PINs, with a button that shows or hides what was typed. */\nexport function PasswordField({\n label,\n helperText,\n error,\n size = 'base',\n showLabel = 'Show password',\n hideLabel = 'Hide password',\n defaultVisible = false,\n id,\n className,\n ref,\n disabled,\n ...rest\n}: PasswordFieldProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const [visible, setVisible] = useState(defaultVisible);\n\n return (\n <div className={[styles.field, className].filter(Boolean).join(' ')}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div className={`${styles.inputWrap} ${styles.default} ${styles[size]} ${error ? styles.errorWrap : ''}`}>\n <input\n ref={ref}\n id={inputId}\n className={styles.input}\n type={visible ? 'text' : 'password'}\n autoComplete=\"off\"\n disabled={disabled}\n {...rest}\n />\n <button\n type=\"button\"\n className={styles.trailing}\n aria-label={visible ? hideLabel : showLabel}\n aria-pressed={visible}\n aria-controls={inputId}\n disabled={disabled}\n onClick={() => setVisible((v) => !v)}\n >\n {visible ? <EyeOff /> : <Eye />}\n </button>\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","import { useId, useRef, type InputHTMLAttributes, type Ref } from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport styles from './TextField.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ntype DateFieldSize = 'sm' | 'base';\n\ninterface DateFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className' | 'size'> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: DateFieldSize;\n /** Accessible name of the button next to the date. */\n openLabel?: string;\n /** Extra classes for layout around the field. */\n className?: string;\n ref?: Ref<HTMLInputElement>;\n}\n\n/**\n * Shows a picked date and opens a calendar on click. It renders no calendar\n * itself: pass it as the input of a date picker (e.g. react-datepicker's\n * `customInput`), which supplies `value`, `onClick` and `ref`.\n */\nexport function DateField({\n label,\n helperText,\n error,\n size = 'base',\n openLabel = 'Open calendar',\n id,\n className,\n ref,\n onClick,\n disabled,\n ...rest\n}: DateFieldProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n function setRefs(el: HTMLInputElement | null) {\n inputRef.current = el;\n if (typeof ref === 'function') ref(el);\n else if (ref) ref.current = el;\n }\n\n return (\n <div className={[styles.field, className].filter(Boolean).join(' ')}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div className={`${styles.inputWrap} ${styles.default} ${styles[size]} ${error ? styles.errorWrap : ''}`}>\n <input\n {...rest}\n ref={setRefs}\n id={inputId}\n className={`${styles.input} ${styles.pickerInput}`}\n inputMode=\"none\"\n readOnly\n disabled={disabled}\n onClick={onClick}\n />\n <button\n type=\"button\"\n tabIndex={-1}\n className={styles.trailing}\n aria-label={openLabel}\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n >\n <ChevronDown />\n </button>\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 background: var(--depth-5);\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.selected .check {\n color: var(--brand-main);\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.menuWrapUp {\n top: auto;\n bottom: calc(100% + 4px);\n}\n.list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 320px;\n overflow-y: auto;\n}\n.search {\n width: 100%;\n height: var(--control-height-sm);\n box-sizing: border-box;\n margin-bottom: 4px;\n padding: 0 10px;\n border: none;\n border-radius: 8px;\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border-input);\n font-family: inherit;\n font-size: 0.9rem;\n color: var(--text-primary);\n outline: none;\n}\n.search:focus {\n box-shadow: inset 0 0 0 1.5px var(--brand-main);\n}\n.noResults {\n padding: 8px 12px;\n font-size: 0.9rem;\n color: var(--text-tertiary);\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 {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ChangeEvent,\n type KeyboardEvent,\n type ReactNode,\n} 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 /** Text matched by search when `label` is not a plain string. */\n searchText?: string;\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 /** Show a search field at the top of the open menu that filters options by their text. */\n searchable?: boolean;\n /** Placeholder for the search field. */\n searchPlaceholder?: string;\n /** Shown in place of the options when a search matches nothing. */\n noResultsText?: ReactNode;\n /** Open the menu on first render. */\n defaultOpen?: boolean;\n /** Focus the trigger on first render. */\n autoFocus?: boolean;\n /**\n * Extra classes for layout around the field — width, responsive sizing.\n * Appended after the field's own class.\n */\n className?: string;\n /** Extra classes for the label, e.g. to hide it below a breakpoint. */\n labelClassName?: string;\n /** Accessible name when there is no visible `label`. */\n 'aria-label'?: string;\n 'data-testid'?: string;\n}\n\nfunction optionText(opt: DropdownOption<string>): string {\n if (opt.searchText !== undefined) return opt.searchText;\n return typeof opt.label === 'string' || typeof opt.label === 'number' ? String(opt.label) : '';\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 searchable,\n searchPlaceholder = 'Search…',\n noResultsText = 'No matches',\n defaultOpen = false,\n autoFocus,\n className,\n labelClassName,\n 'aria-label': ariaLabel,\n 'data-testid': dataTestId,\n}: DropdownProps<T>) {\n const [open, setOpen] = useState(defaultOpen);\n const [query, setQuery] = useState('');\n const [openUpward, setOpenUpward] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const triggerId = useId();\n const listboxId = useId();\n\n const selected = options.find((opt) => opt.value === value);\n const trimmedQuery = query.trim().toLowerCase();\n const visibleOptions =\n searchable && trimmedQuery\n ? options.filter((opt) => optionText(opt).toLowerCase().includes(trimmedQuery))\n : options;\n const enabledValues = visibleOptions.filter((opt) => !opt.disabled).map((opt) => opt.value);\n\n function close() {\n setOpen(false);\n setQuery('');\n }\n\n // Searchable menus focus the search field; others focus the selected (or first) option.\n useEffect(() => {\n if (!open) return;\n if (searchable) {\n searchRef.current?.focus();\n return;\n }\n const focusValue = value ?? enabledValues[0];\n const el = rootRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${focusValue}\"]`);\n el?.focus();\n }, [open]);\n\n // Open upward when there is not enough room below and more room above.\n useLayoutEffect(() => {\n if (!open || !menuRef.current || !rootRef.current) {\n setOpenUpward(false);\n return;\n }\n const rootRect = rootRef.current.getBoundingClientRect();\n const menuHeight = menuRef.current.getBoundingClientRect().height;\n const spaceBelow = window.innerHeight - rootRect.bottom;\n const spaceAbove = rootRect.top;\n setOpenUpward(spaceBelow < menuHeight + 8 && spaceAbove > spaceBelow);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function onPointerDown(e: PointerEvent) {\n if (!rootRef.current?.contains(e.target as Node)) close();\n }\n function onKeyDown(e: globalThis.KeyboardEvent) {\n if (e.key === 'Escape') {\n close();\n triggerRef.current?.focus();\n }\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 focusOption(optionValue: T | undefined) {\n if (optionValue === undefined) return;\n rootRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${optionValue}\"]`)?.focus();\n }\n\n function handleTriggerKeyDown(e: KeyboardEvent<HTMLButtonElement>) {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n }\n }\n\n function handleSearchKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n focusOption(enabledValues[0]);\n }\n if (e.key === 'Enter' && enabledValues.length === 1) {\n e.preventDefault();\n select(enabledValues[0]);\n }\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') {\n if (searchable && currentIndex === 0) {\n e.preventDefault();\n searchRef.current?.focus();\n return;\n }\n nextIndex = (currentIndex - 1 + enabledValues.length) % enabledValues.length;\n }\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 focusOption(enabledValues[nextIndex]);\n }\n }\n\n function select(optionValue: T) {\n onChange(optionValue);\n close();\n triggerRef.current?.focus();\n }\n\n return (\n <div\n className={[styles.field, className].filter(Boolean).join(' ')}\n ref={rootRef}\n data-testid={dataTestId}\n >\n {label && (\n <FieldLabel htmlFor={triggerId} className={labelClassName}>\n {label}\n </FieldLabel>\n )}\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n role=\"combobox\"\n className={`${styles.trigger} ${styles[size]} ${error ? styles.errorWrap : ''}`}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-label={label ? undefined : ariaLabel}\n autoFocus={autoFocus}\n disabled={disabled}\n onClick={() => (open ? close() : setOpen(true))}\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 ref={menuRef} className={`${styles.menuWrap} ${openUpward ? styles.menuWrapUp : ''}`}>\n <Menu role=\"presentation\" style={{ width: '100%' }}>\n {searchable && (\n <input\n ref={searchRef}\n type=\"text\"\n className={styles.search}\n value={query}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n aria-controls={listboxId}\n autoComplete=\"off\"\n spellCheck={false}\n onChange={(e: ChangeEvent<HTMLInputElement>) => setQuery(e.target.value)}\n onKeyDown={handleSearchKeyDown}\n />\n )}\n <div id={listboxId} role=\"listbox\" aria-label={label ?? ariaLabel} className={styles.list}>\n {visibleOptions.length === 0 ? (\n <div className={styles.noResults} role=\"presentation\">\n {noResultsText}\n </div>\n ) : (\n visibleOptions.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={() => select(opt.value)}\n onKeyDown={(e) => handleOptionKeyDown(e, opt.value)}\n >\n {opt.label}\n </MenuItem>\n ))\n )}\n </div>\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.allToggle:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n border-radius: 4px;\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(--depth-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",".spinner {\n position: relative;\n display: block;\n flex-shrink: 0;\n}\n\n.inner,\n.outer {\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n}\n\n.inner {\n animation: spin 1s cubic-bezier(0.5, 0, 0.4, 1) infinite;\n}\n\n.outer {\n animation: spinReverse 1s ease-in-out infinite;\n}\n\n/* Brand logo colors, kept as literals on purpose. */\n.default .inner {\n fill: #008cd8;\n}\n.default .outer {\n fill: #4cd5ff;\n}\n\n.subtle .inner,\n.subtle .outer {\n fill: var(--depth-5);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .inner,\n .outer {\n animation-duration: 3s;\n }\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes spinReverse {\n to {\n transform: rotate(-360deg);\n }\n}\n","import styles from './Spinner.module.css';\n\ntype SpinnerVariant = 'default' | 'subtle';\n\ninterface SpinnerProps {\n /** `default` uses the brand logo blues; `subtle` uses a faint depth tint for busy surfaces. */\n variant?: SpinnerVariant;\n /** Width and height in px. */\n size?: number;\n /** Accessible name announced by screen readers. */\n label?: string;\n /** Extra classes for layout around the spinner. Appended after the variant classes. */\n className?: string;\n 'data-testid'?: string;\n}\n\nexport function Spinner({\n variant = 'default',\n size = 64,\n label = 'Loading',\n className,\n 'data-testid': dataTestId,\n}: SpinnerProps) {\n const classes = [styles.spinner, styles[variant], className].filter(Boolean).join(' ');\n return (\n <div\n role=\"status\"\n aria-label={label}\n className={classes}\n style={{ width: size, height: size }}\n data-testid={dataTestId}\n >\n <svg className={styles.inner} width={size} height={size} viewBox=\"0 0 64 64\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M45.4273 17.5099C45.5053 17.5796 45.5088 17.6535 45.4377 17.7316L38.8829 24.8071C38.8634 24.828 38.8365 24.8404 38.8079 24.8416C38.7793 24.8428 38.7514 24.8326 38.7303 24.8134C36.6569 22.9045 34.221 22.0275 31.4225 22.1823C29.9153 22.2659 28.5572 22.6333 27.3483 23.2845C25.0295 24.5352 23.4428 26.4155 22.588 28.9253C20.717 34.4308 24.3708 40.1612 29.8184 41.6584C30.8097 41.9302 31.99 41.9735 33.3593 41.788C35.158 41.5433 36.8709 40.5854 38.3412 39.5627C38.4022 39.5203 38.4764 39.5014 38.5502 39.5094C38.6241 39.5175 38.6925 39.552 38.7428 39.6066L45.1742 46.6069C45.1803 46.6137 45.185 46.6217 45.188 46.6303C45.191 46.639 45.1923 46.6482 45.1917 46.6573C45.1911 46.6665 45.1887 46.6754 45.1846 46.6836C45.1805 46.6918 45.1748 46.6992 45.1679 46.7052C44.4401 47.3033 43.6502 47.8855 42.7982 48.4516C39.8799 50.3897 36.6339 51.4633 33.0602 51.6725C29.3847 51.8872 25.9031 51.1106 22.6152 49.3425C19.7917 47.8227 17.4903 45.764 15.7112 43.1663C14.4132 41.2707 13.4349 39.3097 12.8667 37.0717C11.973 33.5775 11.9925 30.1014 12.9253 26.6435C13.1679 25.7483 13.5465 24.8469 13.8414 23.9412C14.6703 21.4035 16.9915 18.887 18.9133 17.1899C26.3467 10.6186 38.1184 10.8908 45.4273 17.5099Z\"\n />\n </svg>\n <svg className={styles.outer} width={size} height={size} viewBox=\"0 0 64 64\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M23.9528 51.6749C24.675 51.9719 25.504 52.2515 26.4396 52.5136C29.5538 53.3858 33.0236 53.4255 36.1044 52.8608C39.7938 52.1832 43.2155 50.3364 46.0955 47.9667C46.1341 47.9349 46.1835 47.9192 46.2336 47.9227C46.2837 47.9262 46.3308 47.9487 46.3653 47.9855C48.5489 50.321 50.6076 52.5617 52.5415 54.7076C52.7465 54.9349 52.9626 55.1914 53.1899 55.4773C53.2568 55.5623 53.2492 55.6404 53.1669 55.7115C45.9875 61.8759 37.7414 64.4924 28.4286 63.5609C27.0036 63.4173 25.635 63.1761 24.323 62.8373C18.1489 61.2422 12.9382 58.1328 8.69108 53.5092C4.73535 49.2049 2.16559 44.2111 0.981796 38.5277C0.170292 34.6236 0.131251 30.548 0.864671 26.3008C1.10171 24.933 1.44681 23.5867 1.89997 22.2621C3.86319 16.5286 7.08689 11.7802 11.5711 8.01689C16.4638 3.90918 22.0697 1.47885 28.3889 0.725907C29.9073 0.546038 31.6858 0.498631 33.7243 0.583685C39.227 0.815842 44.6001 2.60826 49.1575 5.58447C50.8335 6.67902 52.2222 7.73732 53.3238 8.75937C53.5301 8.9504 53.5427 9.1463 53.3614 9.34708C51.1054 11.836 48.8612 14.2391 46.6289 16.5565C46.534 16.6569 46.435 16.6611 46.3319 16.569C42.8516 13.5029 38.8624 11.7049 34.3643 11.1751C33.642 11.09 32.7831 11.0531 31.7875 11.0642C30.8199 11.074 29.9868 11.1263 29.2882 11.2211C23.3065 12.0305 18.3747 15.0653 14.7397 19.9196C14.2266 20.6043 13.7943 21.2986 13.443 22.0028C12.3944 24.1012 11.7028 25.9683 11.3682 27.6038C10.2792 32.9385 11.0824 38.0216 13.7776 42.853C14.0481 43.3368 14.3402 43.7872 14.654 44.2041C14.9691 44.6252 15.294 45.0372 15.6286 45.4402C17.9767 48.2748 20.7514 50.3531 23.9528 51.6749Z\"\n />\n </svg>\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,26,27],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["__iconData","__iconData","__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/eye-off.mjs","../node_modules/lucide-react/dist/esm/icons/eye.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/PasswordField.tsx","../src/components/DateField.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/components/Toggle.module.css","../src/components/Toggle.tsx","../src/components/Spinner.module.css","../src/components/Spinner.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:focus-visible,\n.secondary:focus-visible,\n.tertiary:focus-visible,\n.dangerous:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\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.leadingIcon {\n margin-left: -4px;\n}\n.trailingIcon {\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(--depth-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} ${iconOnly ? '' : styles.leadingIcon}`.trim()}>{leadingIcon}</span>}\n {children}\n {trailingIcon && <span className={`${styles.icon} ${styles.trailingIcon}`}>{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(--depth-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(--depth-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: \"eye-off\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\n key: \"ct8e1f\"\n }\n ],\n [\"path\", { d: \"M14.084 14.158a3 3 0 0 1-4.242-4.242\", key: \"151rxh\" }],\n [\n \"path\",\n {\n d: \"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\n key: \"13bj9a\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n ]\n};\n__iconData.node;\nconst EyeOff = createLucideIcon(__iconData);\n\nexport { __iconData, EyeOff as default };\n//# sourceMappingURL=eye-off.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: \"eye\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\n key: \"1nclc0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n ]\n};\n__iconData.node;\nconst Eye = createLucideIcon(__iconData);\n\nexport { __iconData, Eye as default };\n//# sourceMappingURL=eye.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(--depth-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(--depth-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(--depth-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.trailing {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n margin-right: 6px;\n padding: 0;\n border: none;\n border-radius: 8px;\n background: none;\n color: var(--text-tertiary);\n cursor: pointer;\n flex-shrink: 0;\n transition: color 0.15s ease-out, background 0.15s ease-out;\n}\n.trailing svg {\n width: 16px;\n height: 16px;\n}\n.trailing:hover:not(:disabled) {\n color: var(--brand-main);\n background: var(--brand-main-5);\n}\n.trailing:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: -2px;\n}\n.trailing:disabled {\n cursor: not-allowed;\n}\n.pickerInput {\n cursor: pointer;\n caret-color: transparent;\n}\n.pickerInput:disabled {\n cursor: not-allowed;\n}\n","import { useId, type InputHTMLAttributes, type ReactNode, type Ref } 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 /** Extra classes for layout around the field — width, flex growth. Appended after its own class. */\n className?: string;\n /** Reaches the <input>, e.g. for a form library to focus a field that failed validation. */\n ref?: Ref<HTMLInputElement>;\n}\n\nexport function TextField({\n label,\n helperText,\n error,\n size = 'base',\n variant = 'default',\n leadingIcon,\n id,\n className,\n ref,\n ...rest\n}: TextFieldProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div className={[styles.field, className].filter(Boolean).join(' ')}>\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 ref={ref} 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","import { useId, useState, type InputHTMLAttributes, type Ref } from 'react';\nimport { Eye, EyeOff } from 'lucide-react';\nimport styles from './TextField.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ntype PasswordFieldSize = 'sm' | 'base';\n\ninterface PasswordFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className' | 'size' | 'type'> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: PasswordFieldSize;\n /** Accessible name of the toggle while the value is hidden. */\n showLabel?: string;\n /** Accessible name of the toggle while the value is shown. */\n hideLabel?: string;\n /** Start with the value shown. */\n defaultVisible?: boolean;\n /** Extra classes for layout around the field. */\n className?: string;\n ref?: Ref<HTMLInputElement>;\n}\n\n/** A text field for passwords and PINs, with a button that shows or hides what was typed. */\nexport function PasswordField({\n label,\n helperText,\n error,\n size = 'base',\n showLabel = 'Show password',\n hideLabel = 'Hide password',\n defaultVisible = false,\n id,\n className,\n ref,\n disabled,\n ...rest\n}: PasswordFieldProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const [visible, setVisible] = useState(defaultVisible);\n\n return (\n <div className={[styles.field, className].filter(Boolean).join(' ')}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div className={`${styles.inputWrap} ${styles.default} ${styles[size]} ${error ? styles.errorWrap : ''}`}>\n <input\n ref={ref}\n id={inputId}\n className={styles.input}\n type={visible ? 'text' : 'password'}\n autoComplete=\"off\"\n disabled={disabled}\n {...rest}\n />\n <button\n type=\"button\"\n className={styles.trailing}\n aria-label={visible ? hideLabel : showLabel}\n aria-pressed={visible}\n aria-controls={inputId}\n disabled={disabled}\n onClick={() => setVisible((v) => !v)}\n >\n {visible ? <EyeOff /> : <Eye />}\n </button>\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","import { useId, useRef, type InputHTMLAttributes, type Ref } from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport styles from './TextField.module.css';\nimport { FieldLabel } from './FieldLabel';\n\ntype DateFieldSize = 'sm' | 'base';\n\ninterface DateFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className' | 'size'> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: DateFieldSize;\n /** Accessible name of the button next to the date. */\n openLabel?: string;\n /** Extra classes for layout around the field. */\n className?: string;\n ref?: Ref<HTMLInputElement>;\n}\n\n/**\n * Shows a picked date and opens a calendar on click. It renders no calendar\n * itself: pass it as the input of a date picker (e.g. react-datepicker's\n * `customInput`), which supplies `value`, `onClick` and `ref`.\n */\nexport function DateField({\n label,\n helperText,\n error,\n size = 'base',\n openLabel = 'Open calendar',\n id,\n className,\n ref,\n onClick,\n disabled,\n ...rest\n}: DateFieldProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n function setRefs(el: HTMLInputElement | null) {\n inputRef.current = el;\n if (typeof ref === 'function') ref(el);\n else if (ref) ref.current = el;\n }\n\n return (\n <div className={[styles.field, className].filter(Boolean).join(' ')}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div className={`${styles.inputWrap} ${styles.default} ${styles[size]} ${error ? styles.errorWrap : ''}`}>\n <input\n {...rest}\n ref={setRefs}\n id={inputId}\n className={`${styles.input} ${styles.pickerInput}`}\n inputMode=\"none\"\n readOnly\n disabled={disabled}\n onClick={onClick}\n />\n <button\n type=\"button\"\n tabIndex={-1}\n className={styles.trailing}\n aria-label={openLabel}\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n >\n <ChevronDown />\n </button>\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 background: var(--depth-5);\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.selected .check {\n color: var(--brand-main);\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.menuWrapUp {\n top: auto;\n bottom: calc(100% + 4px);\n}\n.list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 320px;\n overflow-y: auto;\n}\n.search {\n width: 100%;\n height: var(--control-height-sm);\n box-sizing: border-box;\n margin-bottom: 4px;\n padding: 0 10px;\n border: none;\n border-radius: 8px;\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border-input);\n font-family: inherit;\n font-size: 0.9rem;\n color: var(--text-primary);\n outline: none;\n}\n.search:focus {\n box-shadow: inset 0 0 0 1.5px var(--brand-main);\n}\n.noResults {\n padding: 8px 12px;\n font-size: 0.9rem;\n color: var(--text-tertiary);\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 {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ChangeEvent,\n type KeyboardEvent,\n type ReactNode,\n} 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 /** Text matched by search when `label` is not a plain string. */\n searchText?: string;\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 /** Show a search field at the top of the open menu that filters options by their text. */\n searchable?: boolean;\n /** Placeholder for the search field. */\n searchPlaceholder?: string;\n /** Shown in place of the options when a search matches nothing. */\n noResultsText?: ReactNode;\n /** Open the menu on first render. */\n defaultOpen?: boolean;\n /** Focus the trigger on first render. */\n autoFocus?: boolean;\n /**\n * Extra classes for layout around the field — width, responsive sizing.\n * Appended after the field's own class.\n */\n className?: string;\n /** Extra classes for the label, e.g. to hide it below a breakpoint. */\n labelClassName?: string;\n /** Accessible name when there is no visible `label`. */\n 'aria-label'?: string;\n 'data-testid'?: string;\n}\n\nfunction optionText(opt: DropdownOption<string>): string {\n if (opt.searchText !== undefined) return opt.searchText;\n return typeof opt.label === 'string' || typeof opt.label === 'number' ? String(opt.label) : '';\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 searchable,\n searchPlaceholder = 'Search…',\n noResultsText = 'No matches',\n defaultOpen = false,\n autoFocus,\n className,\n labelClassName,\n 'aria-label': ariaLabel,\n 'data-testid': dataTestId,\n}: DropdownProps<T>) {\n const [open, setOpen] = useState(defaultOpen);\n const [query, setQuery] = useState('');\n const [openUpward, setOpenUpward] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const triggerId = useId();\n const listboxId = useId();\n\n const selected = options.find((opt) => opt.value === value);\n const trimmedQuery = query.trim().toLowerCase();\n const visibleOptions =\n searchable && trimmedQuery\n ? options.filter((opt) => optionText(opt).toLowerCase().includes(trimmedQuery))\n : options;\n const enabledValues = visibleOptions.filter((opt) => !opt.disabled).map((opt) => opt.value);\n\n function close() {\n setOpen(false);\n setQuery('');\n }\n\n // Searchable menus focus the search field; others focus the selected (or first) option.\n useEffect(() => {\n if (!open) return;\n if (searchable) {\n searchRef.current?.focus();\n return;\n }\n const focusValue = value ?? enabledValues[0];\n const el = rootRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${focusValue}\"]`);\n el?.focus();\n }, [open]);\n\n // Open upward when there is not enough room below and more room above.\n useLayoutEffect(() => {\n if (!open || !menuRef.current || !rootRef.current) {\n setOpenUpward(false);\n return;\n }\n const rootRect = rootRef.current.getBoundingClientRect();\n const menuHeight = menuRef.current.getBoundingClientRect().height;\n const spaceBelow = window.innerHeight - rootRect.bottom;\n const spaceAbove = rootRect.top;\n setOpenUpward(spaceBelow < menuHeight + 8 && spaceAbove > spaceBelow);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function onPointerDown(e: PointerEvent) {\n if (!rootRef.current?.contains(e.target as Node)) close();\n }\n function onKeyDown(e: globalThis.KeyboardEvent) {\n if (e.key === 'Escape') {\n close();\n triggerRef.current?.focus();\n }\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 focusOption(optionValue: T | undefined) {\n if (optionValue === undefined) return;\n rootRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${optionValue}\"]`)?.focus();\n }\n\n function handleTriggerKeyDown(e: KeyboardEvent<HTMLButtonElement>) {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n }\n }\n\n function handleSearchKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n focusOption(enabledValues[0]);\n }\n if (e.key === 'Enter' && enabledValues.length === 1) {\n e.preventDefault();\n select(enabledValues[0]);\n }\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') {\n if (searchable && currentIndex === 0) {\n e.preventDefault();\n searchRef.current?.focus();\n return;\n }\n nextIndex = (currentIndex - 1 + enabledValues.length) % enabledValues.length;\n }\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 focusOption(enabledValues[nextIndex]);\n }\n }\n\n function select(optionValue: T) {\n onChange(optionValue);\n close();\n triggerRef.current?.focus();\n }\n\n return (\n <div\n className={[styles.field, className].filter(Boolean).join(' ')}\n ref={rootRef}\n data-testid={dataTestId}\n >\n {label && (\n <FieldLabel htmlFor={triggerId} className={labelClassName}>\n {label}\n </FieldLabel>\n )}\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n role=\"combobox\"\n className={`${styles.trigger} ${styles[size]} ${error ? styles.errorWrap : ''}`}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-label={label ? undefined : ariaLabel}\n autoFocus={autoFocus}\n disabled={disabled}\n onClick={() => (open ? close() : setOpen(true))}\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 ref={menuRef} className={`${styles.menuWrap} ${openUpward ? styles.menuWrapUp : ''}`}>\n <Menu role=\"presentation\" style={{ width: '100%' }}>\n {searchable && (\n <input\n ref={searchRef}\n type=\"text\"\n className={styles.search}\n value={query}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n aria-controls={listboxId}\n autoComplete=\"off\"\n spellCheck={false}\n onChange={(e: ChangeEvent<HTMLInputElement>) => setQuery(e.target.value)}\n onKeyDown={handleSearchKeyDown}\n />\n )}\n <div id={listboxId} role=\"listbox\" aria-label={label ?? ariaLabel} className={styles.list}>\n {visibleOptions.length === 0 ? (\n <div className={styles.noResults} role=\"presentation\">\n {noResultsText}\n </div>\n ) : (\n visibleOptions.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={() => select(opt.value)}\n onKeyDown={(e) => handleOptionKeyDown(e, opt.value)}\n >\n {opt.label}\n </MenuItem>\n ))\n )}\n </div>\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.allToggle:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n border-radius: 4px;\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.tab.iconOnly {\n justify-content: center;\n}\n.tab.iconOnly .icon {\n margin-left: 0;\n}\n/* Square button: the default 40% hover circle (x4) doesn't reach the top corners */\n.tab.iconOnly::before {\n width: 60%;\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(--depth-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 .tab.iconOnly {\n width: calc(var(--control-height-base) - 8px);\n padding: 0;\n}\n.box.sm .tab.iconOnly {\n width: calc(var(--control-height-sm) - 8px);\n padding: 0;\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\nexport interface TabItem {\n value: string;\n label?: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n 'aria-label'?: string;\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 'aria-labelledby'?: 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 const iconOnly = !item.label && !!item.icon;\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 aria-label={item['aria-label']}\n disabled={item.disabled}\n tabIndex={selected ? 0 : -1}\n className={[styles.tab, selected && styles.selected, iconOnly && styles.iconOnly]\n .filter(Boolean)\n .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",".root {\n display: inline-flex;\n align-items: center;\n gap: 12px;\n}\n\n.label {\n font-size: 0.9rem;\n color: var(--text-secondary);\n font-weight: var(--font-weight-regular);\n white-space: nowrap;\n}\n","import { useId, type ReactNode } from 'react';\nimport { Tabs, type TabItem } from './Tabs';\nimport styles from './Toggle.module.css';\n\ninterface ToggleProps {\n items: TabItem[];\n value: string;\n onChange: (value: string) => void;\n label?: ReactNode;\n 'aria-label'?: string;\n}\n\nexport function Toggle({ items, value, onChange, label, 'aria-label': ariaLabel }: ToggleProps) {\n const labelId = useId();\n\n return (\n <div className={styles.root}>\n {label && (\n <span id={labelId} className={styles.label}>\n {label}\n </span>\n )}\n <Tabs\n items={items}\n value={value}\n onChange={onChange}\n variant=\"box\"\n size=\"sm\"\n aria-label={ariaLabel}\n aria-labelledby={label && !ariaLabel ? labelId : undefined}\n />\n </div>\n );\n}\n",".spinner {\n position: relative;\n display: block;\n flex-shrink: 0;\n}\n\n.inner,\n.outer {\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n}\n\n.inner {\n animation: spin 1s cubic-bezier(0.5, 0, 0.4, 1) infinite;\n}\n\n.outer {\n animation: spinReverse 1s ease-in-out infinite;\n}\n\n/* Brand logo colors, kept as literals on purpose. */\n.default .inner {\n fill: #008cd8;\n}\n.default .outer {\n fill: #4cd5ff;\n}\n\n.subtle .inner,\n.subtle .outer {\n fill: var(--depth-5);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .inner,\n .outer {\n animation-duration: 3s;\n }\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes spinReverse {\n to {\n transform: rotate(-360deg);\n }\n}\n","import styles from './Spinner.module.css';\n\ntype SpinnerVariant = 'default' | 'subtle';\n\ninterface SpinnerProps {\n /** `default` uses the brand logo blues; `subtle` uses a faint depth tint for busy surfaces. */\n variant?: SpinnerVariant;\n /** Width and height in px. */\n size?: number;\n /** Accessible name announced by screen readers. */\n label?: string;\n /** Extra classes for layout around the spinner. Appended after the variant classes. */\n className?: string;\n 'data-testid'?: string;\n}\n\nexport function Spinner({\n variant = 'default',\n size = 64,\n label = 'Loading',\n className,\n 'data-testid': dataTestId,\n}: SpinnerProps) {\n const classes = [styles.spinner, styles[variant], className].filter(Boolean).join(' ');\n return (\n <div\n role=\"status\"\n aria-label={label}\n className={classes}\n style={{ width: size, height: size }}\n data-testid={dataTestId}\n >\n <svg className={styles.inner} width={size} height={size} viewBox=\"0 0 64 64\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M45.4273 17.5099C45.5053 17.5796 45.5088 17.6535 45.4377 17.7316L38.8829 24.8071C38.8634 24.828 38.8365 24.8404 38.8079 24.8416C38.7793 24.8428 38.7514 24.8326 38.7303 24.8134C36.6569 22.9045 34.221 22.0275 31.4225 22.1823C29.9153 22.2659 28.5572 22.6333 27.3483 23.2845C25.0295 24.5352 23.4428 26.4155 22.588 28.9253C20.717 34.4308 24.3708 40.1612 29.8184 41.6584C30.8097 41.9302 31.99 41.9735 33.3593 41.788C35.158 41.5433 36.8709 40.5854 38.3412 39.5627C38.4022 39.5203 38.4764 39.5014 38.5502 39.5094C38.6241 39.5175 38.6925 39.552 38.7428 39.6066L45.1742 46.6069C45.1803 46.6137 45.185 46.6217 45.188 46.6303C45.191 46.639 45.1923 46.6482 45.1917 46.6573C45.1911 46.6665 45.1887 46.6754 45.1846 46.6836C45.1805 46.6918 45.1748 46.6992 45.1679 46.7052C44.4401 47.3033 43.6502 47.8855 42.7982 48.4516C39.8799 50.3897 36.6339 51.4633 33.0602 51.6725C29.3847 51.8872 25.9031 51.1106 22.6152 49.3425C19.7917 47.8227 17.4903 45.764 15.7112 43.1663C14.4132 41.2707 13.4349 39.3097 12.8667 37.0717C11.973 33.5775 11.9925 30.1014 12.9253 26.6435C13.1679 25.7483 13.5465 24.8469 13.8414 23.9412C14.6703 21.4035 16.9915 18.887 18.9133 17.1899C26.3467 10.6186 38.1184 10.8908 45.4273 17.5099Z\"\n />\n </svg>\n <svg className={styles.outer} width={size} height={size} viewBox=\"0 0 64 64\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M23.9528 51.6749C24.675 51.9719 25.504 52.2515 26.4396 52.5136C29.5538 53.3858 33.0236 53.4255 36.1044 52.8608C39.7938 52.1832 43.2155 50.3364 46.0955 47.9667C46.1341 47.9349 46.1835 47.9192 46.2336 47.9227C46.2837 47.9262 46.3308 47.9487 46.3653 47.9855C48.5489 50.321 50.6076 52.5617 52.5415 54.7076C52.7465 54.9349 52.9626 55.1914 53.1899 55.4773C53.2568 55.5623 53.2492 55.6404 53.1669 55.7115C45.9875 61.8759 37.7414 64.4924 28.4286 63.5609C27.0036 63.4173 25.635 63.1761 24.323 62.8373C18.1489 61.2422 12.9382 58.1328 8.69108 53.5092C4.73535 49.2049 2.16559 44.2111 0.981796 38.5277C0.170292 34.6236 0.131251 30.548 0.864671 26.3008C1.10171 24.933 1.44681 23.5867 1.89997 22.2621C3.86319 16.5286 7.08689 11.7802 11.5711 8.01689C16.4638 3.90918 22.0697 1.47885 28.3889 0.725907C29.9073 0.546038 31.6858 0.498631 33.7243 0.583685C39.227 0.815842 44.6001 2.60826 49.1575 5.58447C50.8335 6.67902 52.2222 7.73732 53.3238 8.75937C53.5301 8.9504 53.5427 9.1463 53.3614 9.34708C51.1054 11.836 48.8612 14.2391 46.6289 16.5565C46.534 16.6569 46.435 16.6611 46.3319 16.569C42.8516 13.5029 38.8624 11.7049 34.3643 11.1751C33.642 11.09 32.7831 11.0531 31.7875 11.0642C30.8199 11.074 29.9868 11.1263 29.2882 11.2211C23.3065 12.0305 18.3747 15.0653 14.7397 19.9196C14.2266 20.6043 13.7943 21.2986 13.443 22.0028C12.3944 24.1012 11.7028 25.9683 11.3682 27.6038C10.2792 32.9385 11.0824 38.0216 13.7776 42.853C14.0481 43.3368 14.3402 43.7872 14.654 44.2041C14.9691 44.6252 15.294 45.0372 15.6286 45.4402C17.9767 48.2748 20.7514 50.3531 23.9528 51.6749Z\"\n />\n </svg>\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,26,27],"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.19",
3
+ "version": "0.1.21",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",