cattle-care-ui 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.css +1 -1
- package/dist/index.js +171 -123
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
._primary_1fqpm_1,._secondary_1fqpm_2,._tertiary_1fqpm_3,._dangerous_1fqpm_4{isolation:isolate;letter-spacing:.01em;cursor:pointer;border:none;justify-content:center;align-items:center;gap:8px;font-family:inherit;font-weight:450;transition:color .2s,transform .2s ease-out;display:inline-flex;position:relative;overflow:hidden}._primary_1fqpm_1:active:not(:disabled),._secondary_1fqpm_2:active:not(:disabled),._tertiary_1fqpm_3:active:not(:disabled),._dangerous_1fqpm_4:active:not(:disabled){transform:scale(.95)}._sm_1fqpm_28{border-radius:10px;padding:8px 12px;font-size:.8rem}._base_1fqpm_33{border-radius:12px;padding:12px 16px;font-size:.9rem}._lg_1fqpm_38{border-radius:14px;padding:16px 22px;font-size:1rem}._icon_1fqpm_44{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:flex}._icon_1fqpm_44 svg{width:100%;height:100%}._iconOnly_1fqpm_57{aspect-ratio:1;box-sizing:border-box}._iconOnly_1fqpm_57._sm_1fqpm_28{padding:8px}._iconOnly_1fqpm_57._base_1fqpm_33{padding:12px}._iconOnly_1fqpm_57._lg_1fqpm_38{padding:16px}._primary_1fqpm_1:before,._secondary_1fqpm_2:before,._tertiary_1fqpm_3:before,._dangerous_1fqpm_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_1fqpm_1:hover:before,._secondary_1fqpm_2:hover:before,._tertiary_1fqpm_3:hover:before,._dangerous_1fqpm_4:hover:before{transform:translate(-50%,15%)scale(8)}._primary_1fqpm_1{background:var(--brand-dark);color:#fff;letter-spacing:.02em;font-weight:400}._primary_1fqpm_1:before{background:#ffffff14}._primary_1fqpm_1:active:not(:disabled):before{background:#00000014}._secondary_1fqpm_2{background:var(--surface-muted);color:var(--text-primary)}._secondary_1fqpm_2:before{background:rgba(var(--brand-main-rgb), .16)}._secondary_1fqpm_2:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._secondary_1fqpm_2:hover{color:var(--brand-main)}._tertiary_1fqpm_3{color:var(--text-secondary);background:0 0}._tertiary_1fqpm_3:before{background:rgba(var(--brand-main-rgb), .16)}._tertiary_1fqpm_3:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._tertiary_1fqpm_3:hover,._tertiary_1fqpm_3:active:not(:disabled){background:var(--bg)}._tertiary_1fqpm_3:hover{color:var(--brand-main)}._dangerous_1fqpm_4{background:var(--danger-bg);color:var(--danger-text-dark)}._dangerous_1fqpm_4:before{background:rgba(var(--danger-rgb), .16)}._dangerous_1fqpm_4:active:not(:disabled):before{background:rgba(var(--danger-rgb), .28)}._primary_1fqpm_1:disabled,._secondary_1fqpm_2:disabled,._tertiary_1fqpm_3:disabled,._dangerous_1fqpm_4:disabled{background:var(--disabled-bg);color:var(--disabled-text);cursor:not-allowed}._primary_1fqpm_1:disabled:hover,._secondary_1fqpm_2:disabled:hover,._tertiary_1fqpm_3:disabled:hover,._dangerous_1fqpm_4:disabled:hover{color:var(--disabled-text)}._primary_1fqpm_1:disabled:before,._secondary_1fqpm_2:disabled:before,._tertiary_1fqpm_3:disabled:before,._dangerous_1fqpm_4:disabled:before{display:none}._wrap_ewoh2_1{flex:0 0 220px;width:220px;position:relative}._wrap_ewoh2_1:hover{z-index:10}._fluid_ewoh2_9{flex:none;width:100%}._backing_ewoh2_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_ewoh2_14._completed_ewoh2_25{background:var(--success-bg);box-shadow:inset 0 0 0 1px #bfe3cc}._card_ewoh2_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;position:relative;box-shadow:inset 0 0 0 1px #efefef,0 1px 2px #1018200a}._card_ewoh2_30._interactive_ewoh2_44{cursor:pointer}._card_ewoh2_30._grabbable_ewoh2_47{cursor:grab}._card_ewoh2_30._grabbable_ewoh2_47:active{cursor:grabbing}._card_ewoh2_30._dragging_ewoh2_53,._card_ewoh2_30._dragging_ewoh2_53:hover{box-shadow:inset 0 0 0 1px #efefef,0 1px 2px #1018200a}._card_ewoh2_30._interactive_ewoh2_44:hover{box-shadow:inset 0 0 0 1px #efefef, 0 0 0 2px var(--brand-main)}._card_ewoh2_30._completed_ewoh2_25{background:var(--success-bg);box-shadow:inset 0 0 0 1px #bfe3cc,0 1px 2px #1018200a,0 2px 8px #1018200f}._neutral_c7c7e_1,._pill_c7c7e_2,._accent_c7c7e_3,._success_c7c7e_4,._danger_c7c7e_5,._count_c7c7e_6{white-space:nowrap;align-items:center;font-weight:500;display:inline-flex}._neutral_c7c7e_1{color:var(--text-tertiary);background:var(--bg);border-radius:6px;padding:2px 7px;font-size:.75rem}._pill_c7c7e_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_c7c7e_3{background:var(--brand-bg);color:var(--brand-dark);border-radius:999px;padding:3px 11px;font-size:.8rem}._success_c7c7e_4{background:var(--success-bg);color:var(--success-text);border-radius:999px;padding:3px 11px;font-size:.8rem}._danger_c7c7e_5{color:var(--danger-text);background:var(--danger-bg);border-radius:6px;padding:2px 7px;font-size:.75rem}._count_c7c7e_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}._toolbar_1rsvo_1{background:var(--card-surface);box-shadow:inset 0 0 0 1px var(--border), 0 1px 2px #1018200a, 0 2px 8px #1018200f;border-radius:16px;justify-content:space-between;align-items:center;gap:16px;padding:0 8px;display:flex}._searchWrap_1rsvo_14{flex:1;min-width:0;position:relative}._searchWrap_1rsvo_14:after{content:"";background:var(--brand-main);opacity:0;pointer-events:none;height:2px;position:absolute;bottom:0;left:36px;right:0}._searchWrap_1rsvo_14:focus-within:after{opacity:1}._searchIcon_1rsvo_33{width:16px;height:16px;color:var(--text-tertiary);pointer-events:none;position:absolute;top:50%;left:12px;transform:translateY(-53%)}._searchIcon_1rsvo_33 svg{width:100%;height:100%}._search_1rsvo_14{box-sizing:border-box;width:100%;color:var(--text-primary);box-shadow:inset -1px 0 0 var(--border);background:0 0;border:none;padding:16px 52px 16px 36px;font-family:inherit;font-size:1rem}._search_1rsvo_14:focus{outline:none}._searchShortcut_1rsvo_61{background:var(--bg);color:var(--text-tertiary);letter-spacing:.02em;pointer-events:none;border-radius:6px;justify-content:center;align-items:center;padding:2px 6px;font-size:.75rem;font-weight:600;display:flex;position:absolute;top:50%;right:8px;transform:translateY(-50%)}._controls_1rsvo_78{flex:none;align-items:center;display:flex}._checkbox_veqkz_1{cursor:pointer;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex;position:relative}._input_veqkz_11{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._box_veqkz_18{background:var(--surface-sunken);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}._input_veqkz_11:hover+._box_veqkz_18{box-shadow:inset 0 0 0 1px var(--brand-main)}._input_veqkz_11:focus-visible+._box_veqkz_18{outline:2px solid var(--brand-main);outline-offset:2px}._input_veqkz_11:active+._box_veqkz_18{transform:scale(.88)}._input_veqkz_11:checked+._box_veqkz_18{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._icon_veqkz_46{width:10px;height:10px;overflow:visible}._icon_veqkz_46 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_veqkz_11:checked+._box_veqkz_18 ._icon_veqkz_46 polyline{stroke-dashoffset:0}._radio_7q2jv_1{cursor:pointer;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex;position:relative}._input_7q2jv_11{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._circle_7q2jv_18{background:var(--surface-sunken);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}._input_7q2jv_11:hover+._circle_7q2jv_18{box-shadow:inset 0 0 0 1px var(--brand-main)}._input_7q2jv_11:focus-visible+._circle_7q2jv_18{outline:2px solid var(--brand-main);outline-offset:2px}._input_7q2jv_11:active+._circle_7q2jv_18{transform:scale(.88)}._input_7q2jv_11:checked+._circle_7q2jv_18{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._dot_7q2jv_46{background:#fff;border-radius:50%;width:6px;height:6px;transition:transform .2s cubic-bezier(.4,0,.2,1);transform:scale(0)}._input_7q2jv_11:checked+._circle_7q2jv_18 ._dot_7q2jv_46{transform:scale(1)}._field_133ye_1{flex-direction:column;gap:6px;display:flex}._label_133ye_6{color:var(--text-primary);padding-left:8px;font-size:.85rem;font-weight:550}._inputWrap_133ye_12{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_133ye_12:focus-within{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_133ye_25,._errorWrap_133ye_25:focus-within{box-shadow:inset 0 0 0 1px var(--danger-text)}._inputWrap_133ye_12:has(._input_133ye_12:disabled){background:var(--surface-muted)}._sm_133ye_33{border-radius:10px}._sm_133ye_33 ._input_133ye_12{padding:8px 12px;font-size:.8rem}._base_133ye_40{border-radius:12px}._base_133ye_40 ._input_133ye_12{padding:12px 14px;font-size:.9rem}._lg_133ye_47{border-radius:14px}._lg_133ye_47 ._input_133ye_12{padding:16px;font-size:1rem}._inputWrap_133ye_12:has(._icon_133ye_54) ._input_133ye_12{padding-left:8px}._icon_133ye_54{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-left:12px;display:flex}._icon_133ye_54 svg{width:100%;height:100%}._input_133ye_12{box-sizing:border-box;min-width:0;color:var(--text-primary);background:0 0;border:none;flex:1;font-family:inherit;font-weight:450}._input_133ye_12:focus{outline:none}._input_133ye_12::placeholder{color:var(--text-tertiary)}._input_133ye_12:disabled{color:var(--disabled-text);cursor:not-allowed}._helperText_133ye_92{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_133ye_97{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_1j7n9_1{box-sizing:border-box;width:100%;color:var(--text-primary);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;padding:8px 10px;font-family:inherit;font-size:.9rem;transition:background .15s ease-out,color .15s ease-out;display:flex}._item_1j7n9_1:hover:not(:disabled){background:var(--brand-bg);color:var(--brand-dark)}._item_1j7n9_1:hover:not(:disabled) ._icon_1j7n9_24,._item_1j7n9_1:hover:not(:disabled) ._check_1j7n9_25{color:var(--brand-dark)}._item_1j7n9_1:active:not(:disabled){background:var(--brand-main-20)}._item_1j7n9_1:focus-visible{outline:2px solid var(--brand-main);outline-offset:-2px}._item_1j7n9_1:disabled{color:var(--disabled-text);cursor:not-allowed}._icon_1j7n9_24{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;display:flex}._icon_1j7n9_24 svg{width:100%;height:100%}._label_1j7n9_52{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._trailing_1j7n9_59{color:var(--text-tertiary);flex-shrink:0;font-size:.8rem}._selected_1j7n9_64{color:var(--text-primary);font-weight:550}._selected_1j7n9_64 ._icon_1j7n9_24{color:var(--text-primary)}._check_1j7n9_25{width:16px;height:16px;color:var(--text-primary);flex-shrink:0;justify-content:center;align-items:center;margin-left:8px;display:flex}._check_1j7n9_25 svg{width:100%;height:100%}._destructive_1j7n9_85,._destructive_1j7n9_85 ._icon_1j7n9_24{color:var(--danger-text)}._destructive_1j7n9_85:hover:not(:disabled){background:var(--danger-bg);color:var(--danger-text)}._destructive_1j7n9_85:hover:not(:disabled) ._icon_1j7n9_24{color:var(--danger-text)}._field_1bvdj_1{flex-direction:column;gap:6px;display:flex;position:relative}._label_1bvdj_7{color:var(--text-primary);padding-left:8px;font-size:.85rem;font-weight:550}._trigger_1bvdj_13{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_1bvdj_13:focus-visible{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_1bvdj_31{box-shadow:inset 0 0 0 1px var(--danger-text)}._trigger_1bvdj_13:disabled{background:var(--surface-muted);color:var(--disabled-text);cursor:not-allowed}._sm_1bvdj_40{border-radius:10px}._sm_1bvdj_40._trigger_1bvdj_13{padding:8px 12px;font-size:.8rem}._base_1bvdj_47{border-radius:12px}._base_1bvdj_47._trigger_1bvdj_13{padding:12px 14px;font-size:.9rem}._lg_1bvdj_54{border-radius:14px}._lg_1bvdj_54._trigger_1bvdj_13{padding:16px;font-size:1rem}._icon_1bvdj_62{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-right:8px;display:flex}._icon_1bvdj_62 svg{width:100%;height:100%}._value_1bvdj_76{text-align:left;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._placeholder_1bvdj_84{color:var(--text-tertiary)}._chevron_1bvdj_87{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_1bvdj_87 svg{width:100%;height:100%}._chevronOpen_1bvdj_102{transform:rotate(180deg)}._menuWrap_1bvdj_106{z-index:10;position:absolute;top:calc(100% + 4px);left:0;right:0}._helperText_1bvdj_113{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_1bvdj_118{color:var(--danger-text);font-size:.78rem}._highlight_1anli_1{background:var(--brand-bg);color:var(--brand-dark);border-radius:3px;padding:0 1px}._group_51gk7_1{position:relative}._btn_51gk7_4{color:var(--text-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:6px;padding:12px;font-family:inherit;font-size:1rem;transition:background .2s ease-out,box-shadow .2s ease-out,transform .2s ease-out;display:flex}._btn_51gk7_4:hover{background:#0a0a0b0a}._btn_51gk7_4:active{background:var(--brand-bg);transform:scale(.95);box-shadow:inset 0 2px 1px #008cd840}._caret_51gk7_29{color:var(--text-tertiary);align-items:center;display:flex}._caret_51gk7_29 svg{width:14px;height:14px}._label_51gk7_38{color:var(--text-secondary)}._badge_51gk7_41{background:var(--brand-main,#0a84d8);color:#fff;text-align:center;border-radius:999px;min-width:16px;height:16px;padding:0 4px;font-size:.65rem;font-weight:600;line-height:16px;position:absolute;top:2px;right:2px}._value_51gk7_56{color:var(--text-primary);font-weight:500}._panel_51gk7_60{width:fit-content;min-width:220px;max-height:280px;box-shadow:inset 0 0 0 1px var(--border), 0 8px 24px #0000001f;z-index:50;background:#fff;border-radius:12px;display:none;position:absolute;top:calc(100% + 6px);left:0;overflow-y:auto}._panel_51gk7_60._open_51gk7_76{display:block}._panelRight_51gk7_79{left:auto;right:0}._panelWide_51gk7_83{min-width:260px;padding-bottom:4px}._sectionHeader_51gk7_87{justify-content:space-between;align-items:center;gap:8px;padding:12px 14px 4px;display:flex}._sectionLabel_51gk7_94{color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.02em;font-size:.75rem;font-weight:600}._allToggle_51gk7_101{color:var(--brand-main,#0a84d8);cursor:pointer;background:0 0;border:none;padding:0;font-family:inherit;font-size:.75rem;font-weight:600}._allToggle_51gk7_101:hover{text-decoration:underline}._divider_51gk7_114{background:var(--border);height:1px;margin:4px 0}._option_51gk7_119{cursor:pointer;border-radius:8px;align-items:center;gap:8px;padding:8px;font-size:1rem;display:flex}._option_51gk7_119:hover{background:var(--bg)}._search_51gk7_131{box-sizing:border-box;width:calc(100% - 16px);box-shadow:inset 0 0 0 1px var(--border-input);border:none;border-radius:8px;margin:8px 8px 0;padding:8px 12px;font-family:inherit;font-size:1rem}._search_51gk7_131:focus{box-shadow:inset 0 0 0 1px var(--brand-main);outline:none}._optionsList_51gk7_147{padding:4px}._empty_51gk7_150{color:var(--text-tertiary);padding:7px 8px;font-size:.85rem}._sidebar_1fx39_1{background:var(--surface-sunken);box-sizing:border-box;border-radius:16px 16px 0 0;flex-direction:column;flex:0 0 256px;gap:4px;width:256px;padding:24px 16px 24px 24px;display:flex;overflow-y:auto;box-shadow:1px 0 #0a0a0b08,0 -1px #0a0a0b0d}._title_1fx39_16{letter-spacing:-.01em;margin:0 0 16px 8px;font-size:1.15rem;font-weight:500}._navLink_1fx39_22{color:var(--text-secondary);border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:8px;font-size:.9rem;font-weight:500;text-decoration:none;display:flex}._navLink_1fx39_22:hover{background:var(--card-surface);color:var(--text-primary)}._count_1fx39_38{color:var(--text-tertiary);font-size:.78rem;font-weight:500}._line_1k2qn_1,._box_1k2qn_2{align-items:center;gap:4px;display:inline-flex}._tab_1k2qn_8{isolation:isolate;cursor:pointer;white-space:nowrap;border:none;border-radius:8px 8px 0 0;align-items:center;gap:6px;font-family:inherit;font-weight:450;transition:color .15s ease-out,background .15s ease-out,box-shadow .15s ease-out;display:inline-flex;position:relative;overflow:hidden}._tab_1k2qn_8:before{content:"";aspect-ratio:1;z-index:-1;pointer-events:none;background:rgba(var(--brand-main-rgb), .16);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_1k2qn_8:hover:not(:disabled):before{transform:translate(-50%,15%)scale(4)}._tab_1k2qn_8:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._tab_1k2qn_8:disabled{color:var(--disabled-text);cursor:not-allowed}._tab_1k2qn_8:disabled:before,._tab_1k2qn_8._selected_1k2qn_53:hover:before{display:none}._tab_1k2qn_8:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px}._icon_1k2qn_62{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:flex}._icon_1k2qn_62 svg{width:100%;height:100%}._line_1k2qn_1{box-shadow:inset 0 -1px 0 0 var(--border)}._line_1k2qn_1 ._tab_1k2qn_8{color:var(--text-secondary);background:0 0;padding:12px 6px;font-size:1rem;box-shadow:inset 0 -2px #0000}._line_1k2qn_1 ._tab_1k2qn_8:hover:not(:disabled){color:var(--brand-main)}._line_1k2qn_1 ._tab_1k2qn_8._selected_1k2qn_53{color:var(--text-primary);box-shadow:inset 0 -2px 0 0 var(--brand-main);font-weight:550}._box_1k2qn_2{background:#1018200a;border-radius:10px;gap:4px;padding:4px}._box_1k2qn_2 ._tab_1k2qn_8{color:var(--text-secondary);background:0 0;border-radius:8px;padding:8px 14px;font-size:.9rem}._box_1k2qn_2 ._tab_1k2qn_8:hover:not(:disabled){color:var(--brand-main)}._box_1k2qn_2 ._tab_1k2qn_8._selected_1k2qn_53{background:var(--card-surface);color:var(--text-primary);box-shadow:0 0 1px .5px var(--border);font-weight:550}._box_1k2qn_2._sm_1k2qn_124 ._tab_1k2qn_8{border-radius:8px;padding:4px 14px}: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:#ececec;--border:#e0e0e0;--border-input:#e0e0e0;--danger-bg:#fdeaea;--danger-text:#d92d20;--danger-text-dark:#b91c1c;--danger-rgb:217, 45, 32;--success-bg:#e3f6ea;--success-text:#2f8a52;--warning-text:#9a6400;--disabled-bg:#c4c4c4;--disabled-text:#8a8a8a;--font-family-base:"Inter", sans-serif;--font-size-sm:.75rem;--font-size-base:.875rem;--font-size-lg:1rem;--font-weight-regular:400;--font-weight-bold:500;--line-height-base:1.5;--line-height-tight:1.25}.text-base{font-family:var(--font-family-base);font-size:var(--font-size-base);font-weight:var(--font-weight-regular);line-height:var(--line-height-base)}.text-bold{font-weight:var(--font-weight-bold)}.text-sm{font-size:var(--font-size-sm)}.text-lg{font-size:var(--font-size-lg)}.text-2-line{line-height:var(--line-height-tight)}
|
|
1
|
+
._primary_d59gi_1,._secondary_d59gi_2,._tertiary_d59gi_3,._dangerous_d59gi_4{isolation:isolate;letter-spacing:.01em;cursor:pointer;border:none;justify-content:center;align-items:center;gap:8px;font-family:inherit;font-weight:450;transition:color .2s,transform .2s ease-out;display:inline-flex;position:relative;overflow:hidden}._primary_d59gi_1:active:not(:disabled),._secondary_d59gi_2:active:not(:disabled),._tertiary_d59gi_3:active:not(:disabled),._dangerous_d59gi_4:active:not(:disabled){transform:scale(.95)}._sm_d59gi_28{border-radius:10px;padding:8px 12px;font-size:.8rem}._base_d59gi_33{border-radius:12px;padding:12px 16px;font-size:.9rem}._lg_d59gi_38{border-radius:14px;padding:16px 22px;font-size:1rem}._icon_d59gi_44{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:flex}._icon_d59gi_44 svg{width:100%;height:100%}._iconOnly_d59gi_57{aspect-ratio:1;box-sizing:border-box}._iconOnly_d59gi_57._sm_d59gi_28{padding:8px}._iconOnly_d59gi_57._base_d59gi_33{padding:12px}._iconOnly_d59gi_57._lg_d59gi_38{padding:16px}._primary_d59gi_1:before,._secondary_d59gi_2:before,._tertiary_d59gi_3:before,._dangerous_d59gi_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_d59gi_1:hover:before,._secondary_d59gi_2:hover:before,._tertiary_d59gi_3:hover:before,._dangerous_d59gi_4:hover:before{transform:translate(-50%,15%)scale(8)}._primary_d59gi_1{background:var(--brand-dark);color:#fff;letter-spacing:.02em;font-weight:400}._primary_d59gi_1:before{background:#ffffff14}._primary_d59gi_1:active:not(:disabled):before{background:#00000014}._secondary_d59gi_2{background:var(--surface-muted);color:var(--text-primary)}._secondary_d59gi_2 ._icon_d59gi_44{color:var(--text-secondary)}._secondary_d59gi_2:before{background:rgba(var(--brand-main-rgb), .08)}._secondary_d59gi_2:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._secondary_d59gi_2:hover ._icon_d59gi_44,._secondary_d59gi_2:hover{color:var(--brand-main)}._tertiary_d59gi_3{color:var(--text-secondary);background:0 0}._tertiary_d59gi_3:before{background:rgba(var(--brand-main-rgb), .16)}._tertiary_d59gi_3:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._tertiary_d59gi_3:hover,._tertiary_d59gi_3:active:not(:disabled){background:var(--bg)}._tertiary_d59gi_3:hover{color:var(--brand-main)}._dangerous_d59gi_4{background:var(--danger-bg);color:var(--danger-text-dark)}._dangerous_d59gi_4:before{background:rgba(var(--danger-rgb), .16)}._dangerous_d59gi_4:active:not(:disabled):before{background:rgba(var(--danger-rgb), .28)}._primary_d59gi_1:disabled,._secondary_d59gi_2:disabled,._tertiary_d59gi_3:disabled,._dangerous_d59gi_4:disabled{background:var(--disabled-bg);color:var(--disabled-text);cursor:not-allowed}._primary_d59gi_1:disabled:hover,._secondary_d59gi_2:disabled:hover,._tertiary_d59gi_3:disabled:hover,._dangerous_d59gi_4:disabled:hover{color:var(--disabled-text)}._primary_d59gi_1:disabled:before,._secondary_d59gi_2:disabled:before,._tertiary_d59gi_3:disabled:before,._dangerous_d59gi_4:disabled:before{display:none}._wrap_ewoh2_1{flex:0 0 220px;width:220px;position:relative}._wrap_ewoh2_1:hover{z-index:10}._fluid_ewoh2_9{flex:none;width:100%}._backing_ewoh2_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_ewoh2_14._completed_ewoh2_25{background:var(--success-bg);box-shadow:inset 0 0 0 1px #bfe3cc}._card_ewoh2_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;position:relative;box-shadow:inset 0 0 0 1px #efefef,0 1px 2px #1018200a}._card_ewoh2_30._interactive_ewoh2_44{cursor:pointer}._card_ewoh2_30._grabbable_ewoh2_47{cursor:grab}._card_ewoh2_30._grabbable_ewoh2_47:active{cursor:grabbing}._card_ewoh2_30._dragging_ewoh2_53,._card_ewoh2_30._dragging_ewoh2_53:hover{box-shadow:inset 0 0 0 1px #efefef,0 1px 2px #1018200a}._card_ewoh2_30._interactive_ewoh2_44:hover{box-shadow:inset 0 0 0 1px #efefef, 0 0 0 2px var(--brand-main)}._card_ewoh2_30._completed_ewoh2_25{background:var(--success-bg);box-shadow:inset 0 0 0 1px #bfe3cc,0 1px 2px #1018200a,0 2px 8px #1018200f}._neutral_c7c7e_1,._pill_c7c7e_2,._accent_c7c7e_3,._success_c7c7e_4,._danger_c7c7e_5,._count_c7c7e_6{white-space:nowrap;align-items:center;font-weight:500;display:inline-flex}._neutral_c7c7e_1{color:var(--text-tertiary);background:var(--bg);border-radius:6px;padding:2px 7px;font-size:.75rem}._pill_c7c7e_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_c7c7e_3{background:var(--brand-bg);color:var(--brand-dark);border-radius:999px;padding:3px 11px;font-size:.8rem}._success_c7c7e_4{background:var(--success-bg);color:var(--success-text);border-radius:999px;padding:3px 11px;font-size:.8rem}._danger_c7c7e_5{color:var(--danger-text);background:var(--danger-bg);border-radius:6px;padding:2px 7px;font-size:.75rem}._count_c7c7e_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}._toolbar_1rsvo_1{background:var(--card-surface);box-shadow:inset 0 0 0 1px var(--border), 0 1px 2px #1018200a, 0 2px 8px #1018200f;border-radius:16px;justify-content:space-between;align-items:center;gap:16px;padding:0 8px;display:flex}._searchWrap_1rsvo_14{flex:1;min-width:0;position:relative}._searchWrap_1rsvo_14:after{content:"";background:var(--brand-main);opacity:0;pointer-events:none;height:2px;position:absolute;bottom:0;left:36px;right:0}._searchWrap_1rsvo_14:focus-within:after{opacity:1}._searchIcon_1rsvo_33{width:16px;height:16px;color:var(--text-tertiary);pointer-events:none;position:absolute;top:50%;left:12px;transform:translateY(-53%)}._searchIcon_1rsvo_33 svg{width:100%;height:100%}._search_1rsvo_14{box-sizing:border-box;width:100%;color:var(--text-primary);box-shadow:inset -1px 0 0 var(--border);background:0 0;border:none;padding:16px 52px 16px 36px;font-family:inherit;font-size:1rem}._search_1rsvo_14:focus{outline:none}._searchShortcut_1rsvo_61{background:var(--bg);color:var(--text-tertiary);letter-spacing:.02em;pointer-events:none;border-radius:6px;justify-content:center;align-items:center;padding:2px 6px;font-size:.75rem;font-weight:600;display:flex;position:absolute;top:50%;right:8px;transform:translateY(-50%)}._controls_1rsvo_78{flex:none;align-items:center;display:flex}._checkbox_veqkz_1{cursor:pointer;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex;position:relative}._input_veqkz_11{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._box_veqkz_18{background:var(--surface-sunken);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}._input_veqkz_11:hover+._box_veqkz_18{box-shadow:inset 0 0 0 1px var(--brand-main)}._input_veqkz_11:focus-visible+._box_veqkz_18{outline:2px solid var(--brand-main);outline-offset:2px}._input_veqkz_11:active+._box_veqkz_18{transform:scale(.88)}._input_veqkz_11:checked+._box_veqkz_18{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._icon_veqkz_46{width:10px;height:10px;overflow:visible}._icon_veqkz_46 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_veqkz_11:checked+._box_veqkz_18 ._icon_veqkz_46 polyline{stroke-dashoffset:0}._radio_7q2jv_1{cursor:pointer;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex;position:relative}._input_7q2jv_11{opacity:0;cursor:pointer;margin:0;position:absolute;inset:0}._circle_7q2jv_18{background:var(--surface-sunken);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}._input_7q2jv_11:hover+._circle_7q2jv_18{box-shadow:inset 0 0 0 1px var(--brand-main)}._input_7q2jv_11:focus-visible+._circle_7q2jv_18{outline:2px solid var(--brand-main);outline-offset:2px}._input_7q2jv_11:active+._circle_7q2jv_18{transform:scale(.88)}._input_7q2jv_11:checked+._circle_7q2jv_18{background:var(--brand-main);box-shadow:inset 0 0 0 1px var(--brand-main)}._dot_7q2jv_46{background:#fff;border-radius:50%;width:6px;height:6px;transition:transform .2s cubic-bezier(.4,0,.2,1);transform:scale(0)}._input_7q2jv_11:checked+._circle_7q2jv_18 ._dot_7q2jv_46{transform:scale(1)}._field_133ye_1{flex-direction:column;gap:6px;display:flex}._label_133ye_6{color:var(--text-primary);padding-left:8px;font-size:.85rem;font-weight:550}._inputWrap_133ye_12{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_133ye_12:focus-within{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_133ye_25,._errorWrap_133ye_25:focus-within{box-shadow:inset 0 0 0 1px var(--danger-text)}._inputWrap_133ye_12:has(._input_133ye_12:disabled){background:var(--surface-muted)}._sm_133ye_33{border-radius:10px}._sm_133ye_33 ._input_133ye_12{padding:8px 12px;font-size:.8rem}._base_133ye_40{border-radius:12px}._base_133ye_40 ._input_133ye_12{padding:12px 14px;font-size:.9rem}._lg_133ye_47{border-radius:14px}._lg_133ye_47 ._input_133ye_12{padding:16px;font-size:1rem}._inputWrap_133ye_12:has(._icon_133ye_54) ._input_133ye_12{padding-left:8px}._icon_133ye_54{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-left:12px;display:flex}._icon_133ye_54 svg{width:100%;height:100%}._input_133ye_12{box-sizing:border-box;min-width:0;color:var(--text-primary);background:0 0;border:none;flex:1;font-family:inherit;font-weight:450}._input_133ye_12:focus{outline:none}._input_133ye_12::placeholder{color:var(--text-tertiary)}._input_133ye_12:disabled{color:var(--disabled-text);cursor:not-allowed}._helperText_133ye_92{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_133ye_97{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_1j7n9_1{box-sizing:border-box;width:100%;color:var(--text-primary);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;padding:8px 10px;font-family:inherit;font-size:.9rem;transition:background .15s ease-out,color .15s ease-out;display:flex}._item_1j7n9_1:hover:not(:disabled){background:var(--brand-bg);color:var(--brand-dark)}._item_1j7n9_1:hover:not(:disabled) ._icon_1j7n9_24,._item_1j7n9_1:hover:not(:disabled) ._check_1j7n9_25{color:var(--brand-dark)}._item_1j7n9_1:active:not(:disabled){background:var(--brand-main-20)}._item_1j7n9_1:focus-visible{outline:2px solid var(--brand-main);outline-offset:-2px}._item_1j7n9_1:disabled{color:var(--disabled-text);cursor:not-allowed}._icon_1j7n9_24{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;display:flex}._icon_1j7n9_24 svg{width:100%;height:100%}._label_1j7n9_52{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._trailing_1j7n9_59{color:var(--text-tertiary);flex-shrink:0;font-size:.8rem}._selected_1j7n9_64{color:var(--text-primary);font-weight:550}._selected_1j7n9_64 ._icon_1j7n9_24{color:var(--text-primary)}._check_1j7n9_25{width:16px;height:16px;color:var(--text-primary);flex-shrink:0;justify-content:center;align-items:center;margin-left:8px;display:flex}._check_1j7n9_25 svg{width:100%;height:100%}._destructive_1j7n9_85,._destructive_1j7n9_85 ._icon_1j7n9_24{color:var(--danger-text)}._destructive_1j7n9_85:hover:not(:disabled){background:var(--danger-bg);color:var(--danger-text)}._destructive_1j7n9_85:hover:not(:disabled) ._icon_1j7n9_24{color:var(--danger-text)}._field_1bvdj_1{flex-direction:column;gap:6px;display:flex;position:relative}._label_1bvdj_7{color:var(--text-primary);padding-left:8px;font-size:.85rem;font-weight:550}._trigger_1bvdj_13{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_1bvdj_13:focus-visible{box-shadow:inset 0 0 0 0 var(--border-input), 0 0 0 2px var(--brand-main)}._errorWrap_1bvdj_31{box-shadow:inset 0 0 0 1px var(--danger-text)}._trigger_1bvdj_13:disabled{background:var(--surface-muted);color:var(--disabled-text);cursor:not-allowed}._sm_1bvdj_40{border-radius:10px}._sm_1bvdj_40._trigger_1bvdj_13{padding:8px 12px;font-size:.8rem}._base_1bvdj_47{border-radius:12px}._base_1bvdj_47._trigger_1bvdj_13{padding:12px 14px;font-size:.9rem}._lg_1bvdj_54{border-radius:14px}._lg_1bvdj_54._trigger_1bvdj_13{padding:16px;font-size:1rem}._icon_1bvdj_62{width:16px;height:16px;color:var(--text-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-right:8px;display:flex}._icon_1bvdj_62 svg{width:100%;height:100%}._value_1bvdj_76{text-align:left;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._placeholder_1bvdj_84{color:var(--text-tertiary)}._chevron_1bvdj_87{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_1bvdj_87 svg{width:100%;height:100%}._chevronOpen_1bvdj_102{transform:rotate(180deg)}._menuWrap_1bvdj_106{z-index:10;position:absolute;top:calc(100% + 4px);left:0;right:0}._helperText_1bvdj_113{color:var(--text-tertiary);padding-left:8px;font-size:.78rem}._errorText_1bvdj_118{color:var(--danger-text);font-size:.78rem}._highlight_1anli_1{background:var(--brand-bg);color:var(--brand-dark);border-radius:3px;padding:0 1px}._group_51gk7_1{position:relative}._btn_51gk7_4{color:var(--text-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:6px;padding:12px;font-family:inherit;font-size:1rem;transition:background .2s ease-out,box-shadow .2s ease-out,transform .2s ease-out;display:flex}._btn_51gk7_4:hover{background:#0a0a0b0a}._btn_51gk7_4:active{background:var(--brand-bg);transform:scale(.95);box-shadow:inset 0 2px 1px #008cd840}._caret_51gk7_29{color:var(--text-tertiary);align-items:center;display:flex}._caret_51gk7_29 svg{width:14px;height:14px}._label_51gk7_38{color:var(--text-secondary)}._badge_51gk7_41{background:var(--brand-main,#0a84d8);color:#fff;text-align:center;border-radius:999px;min-width:16px;height:16px;padding:0 4px;font-size:.65rem;font-weight:600;line-height:16px;position:absolute;top:2px;right:2px}._value_51gk7_56{color:var(--text-primary);font-weight:500}._panel_51gk7_60{width:fit-content;min-width:220px;max-height:280px;box-shadow:inset 0 0 0 1px var(--border), 0 8px 24px #0000001f;z-index:50;background:#fff;border-radius:12px;display:none;position:absolute;top:calc(100% + 6px);left:0;overflow-y:auto}._panel_51gk7_60._open_51gk7_76{display:block}._panelRight_51gk7_79{left:auto;right:0}._panelWide_51gk7_83{min-width:260px;padding-bottom:4px}._sectionHeader_51gk7_87{justify-content:space-between;align-items:center;gap:8px;padding:12px 14px 4px;display:flex}._sectionLabel_51gk7_94{color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.02em;font-size:.75rem;font-weight:600}._allToggle_51gk7_101{color:var(--brand-main,#0a84d8);cursor:pointer;background:0 0;border:none;padding:0;font-family:inherit;font-size:.75rem;font-weight:600}._allToggle_51gk7_101:hover{text-decoration:underline}._divider_51gk7_114{background:var(--border);height:1px;margin:4px 0}._option_51gk7_119{cursor:pointer;border-radius:8px;align-items:center;gap:8px;padding:8px;font-size:1rem;display:flex}._option_51gk7_119:hover{background:var(--bg)}._search_51gk7_131{box-sizing:border-box;width:calc(100% - 16px);box-shadow:inset 0 0 0 1px var(--border-input);border:none;border-radius:8px;margin:8px 8px 0;padding:8px 12px;font-family:inherit;font-size:1rem}._search_51gk7_131:focus{box-shadow:inset 0 0 0 1px var(--brand-main);outline:none}._optionsList_51gk7_147{padding:4px}._empty_51gk7_150{color:var(--text-tertiary);padding:7px 8px;font-size:.85rem}._sidebar_1fx39_1{background:var(--surface-sunken);box-sizing:border-box;border-radius:16px 16px 0 0;flex-direction:column;flex:0 0 256px;gap:4px;width:256px;padding:24px 16px 24px 24px;display:flex;overflow-y:auto;box-shadow:1px 0 #0a0a0b08,0 -1px #0a0a0b0d}._title_1fx39_16{letter-spacing:-.01em;margin:0 0 16px 8px;font-size:1.15rem;font-weight:500}._navLink_1fx39_22{color:var(--text-secondary);border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:8px;font-size:.9rem;font-weight:500;text-decoration:none;display:flex}._navLink_1fx39_22:hover{background:var(--card-surface);color:var(--text-primary)}._count_1fx39_38{color:var(--text-tertiary);font-size:.78rem;font-weight:500}._line_gfgon_1,._box_gfgon_2{align-items:center;gap:4px;display:inline-flex;position:relative}._indicator_gfgon_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_gfgon_9._settling_gfgon_17{transition:scale .1s linear}._indicatorLine_gfgon_21{background:var(--brand-main);height:2px;bottom:0}._indicatorBox_gfgon_27{background:var(--card-surface);box-shadow:0 0 1px .5px var(--border);border-radius:8px;top:4px;bottom:4px}._tab_gfgon_35{isolation:isolate;cursor:pointer;white-space:nowrap;border:none;border-radius:8px 8px 0 0;align-items:center;gap:6px;font-family:inherit;font-weight:450;transition:color .15s ease-out,background .15s ease-out,box-shadow .15s ease-out;display:inline-flex;position:relative;overflow:hidden}._tab_gfgon_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_gfgon_35:hover:not(:disabled):before{transform:translate(-50%,15%)scale(4)}._tab_gfgon_35:active:not(:disabled):before{background:rgba(var(--brand-main-rgb), .28)}._tab_gfgon_35:disabled{color:var(--disabled-text);cursor:not-allowed}._tab_gfgon_35:disabled:before,._tab_gfgon_35._selected_gfgon_80:hover:before{display:none}._tab_gfgon_35:focus-visible{outline:2px solid var(--brand-main);outline-offset:2px}._icon_gfgon_89{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:flex}._icon_gfgon_89 svg{width:100%;height:100%}._line_gfgon_1{box-shadow:inset 0 -1px 0 0 var(--border)}._line_gfgon_1 ._tab_gfgon_35{color:var(--text-secondary);background:0 0;padding:12px 6px;font-size:1rem}._line_gfgon_1 ._tab_gfgon_35:hover:not(:disabled){color:var(--brand-main)}._line_gfgon_1 ._tab_gfgon_35._selected_gfgon_80{color:var(--text-primary);font-weight:550}._box_gfgon_2{background:#1018200a;border-radius:10px;gap:4px;padding:4px;box-shadow:inset 0 0 .5px 1px #e3e3e3}._box_gfgon_2 ._tab_gfgon_35{color:var(--text-secondary);background:0 0;border-radius:8px;padding:8px 14px;font-size:.9rem}._box_gfgon_2 ._tab_gfgon_35:hover:not(:disabled){color:var(--brand-main)}._box_gfgon_2 ._tab_gfgon_35._selected_gfgon_80{color:var(--text-primary);font-weight:550}._box_gfgon_2._sm_gfgon_148 ._tab_gfgon_35{border-radius:8px;padding:4px 14px}: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;--danger-bg:#fdeaea;--danger-text:#d92d20;--danger-text-dark:#b91c1c;--danger-rgb:217, 45, 32;--success-bg:#e3f6ea;--success-text:#2f8a52;--warning-text:#9a6400;--disabled-bg:#c4c4c4;--disabled-text:#8a8a8a;--font-family-base:"Inter", sans-serif;--font-size-sm:.75rem;--font-size-base:.875rem;--font-size-lg:1rem;--font-weight-regular:400;--font-weight-bold:500;--line-height-base:1.5;--line-height-tight:1.25}.text-base{font-family:var(--font-family-base);font-size:var(--font-size-base);font-weight:var(--font-weight-regular);line-height:var(--line-height-base)}.text-bold{font-weight:var(--font-weight-bold)}.text-sm{font-size:var(--font-size-sm)}.text-lg{font-size:var(--font-size-lg)}.text-2-line{line-height:var(--line-height-tight)}
|
|
2
2
|
/*$vite$:1*/
|
package/dist/index.js
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
import { Fragment as e, jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
2
|
-
import { Fragment as r, createContext as i, createElement as a, forwardRef as o, useContext as s, useEffect as c, useId as l,
|
|
3
|
-
var
|
|
4
|
-
primary: "
|
|
5
|
-
secondary: "
|
|
6
|
-
tertiary: "
|
|
7
|
-
dangerous: "
|
|
8
|
-
sm: "
|
|
9
|
-
base: "
|
|
10
|
-
lg: "
|
|
11
|
-
icon: "
|
|
12
|
-
iconOnly: "
|
|
2
|
+
import { Fragment as r, createContext as i, createElement as a, forwardRef as o, useContext as s, useEffect as c, useId as l, useLayoutEffect as u, useRef as d, useState as f } from "react";
|
|
3
|
+
var p = {
|
|
4
|
+
primary: "_primary_d59gi_1",
|
|
5
|
+
secondary: "_secondary_d59gi_2",
|
|
6
|
+
tertiary: "_tertiary_d59gi_3",
|
|
7
|
+
dangerous: "_dangerous_d59gi_4",
|
|
8
|
+
sm: "_sm_d59gi_28",
|
|
9
|
+
base: "_base_d59gi_33",
|
|
10
|
+
lg: "_lg_d59gi_38",
|
|
11
|
+
icon: "_icon_d59gi_44",
|
|
12
|
+
iconOnly: "_iconOnly_d59gi_57"
|
|
13
13
|
};
|
|
14
14
|
//#endregion
|
|
15
15
|
//#region src/components/Button.tsx
|
|
16
|
-
function
|
|
16
|
+
function m({ variant: e = "primary", size: r = "base", leadingIcon: i, trailingIcon: a, children: o, ...s }) {
|
|
17
17
|
let c = !o && !!i;
|
|
18
18
|
return /* @__PURE__ */ n("button", {
|
|
19
19
|
type: "button",
|
|
20
|
-
className: `${
|
|
20
|
+
className: `${p[e]} ${p[r]}${c ? ` ${p.iconOnly}` : ""}`,
|
|
21
21
|
...s,
|
|
22
22
|
children: [
|
|
23
23
|
i && /* @__PURE__ */ t("span", {
|
|
24
|
-
className:
|
|
24
|
+
className: p.icon,
|
|
25
25
|
children: i
|
|
26
26
|
}),
|
|
27
27
|
o,
|
|
28
28
|
a && /* @__PURE__ */ t("span", {
|
|
29
|
-
className:
|
|
29
|
+
className: p.icon,
|
|
30
30
|
children: a
|
|
31
31
|
})
|
|
32
32
|
]
|
|
33
33
|
});
|
|
34
34
|
}
|
|
35
|
-
var
|
|
35
|
+
var h = {
|
|
36
36
|
wrap: "_wrap_ewoh2_1",
|
|
37
37
|
fluid: "_fluid_ewoh2_9",
|
|
38
38
|
backing: "_backing_ewoh2_14",
|
|
@@ -44,23 +44,23 @@ var m = {
|
|
|
44
44
|
};
|
|
45
45
|
//#endregion
|
|
46
46
|
//#region src/components/Card.tsx
|
|
47
|
-
function
|
|
47
|
+
function g({ stacked: e, completed: r, interactive: i, draggable: a, dragging: o, fluid: s, children: c, ...l }) {
|
|
48
48
|
return /* @__PURE__ */ n("div", {
|
|
49
|
-
className: `${
|
|
50
|
-
children: [e && /* @__PURE__ */ t("div", { className: `${
|
|
49
|
+
className: `${h.wrap} ${s ? h.fluid : ""}`,
|
|
50
|
+
children: [e && /* @__PURE__ */ t("div", { className: `${h.backing} ${r ? h.completed : ""}` }), /* @__PURE__ */ t("div", {
|
|
51
51
|
className: [
|
|
52
|
-
|
|
53
|
-
r ?
|
|
54
|
-
i ?
|
|
55
|
-
a ?
|
|
56
|
-
o ?
|
|
52
|
+
h.card,
|
|
53
|
+
r ? h.completed : "",
|
|
54
|
+
i ? h.interactive : "",
|
|
55
|
+
a ? h.grabbable : "",
|
|
56
|
+
o ? h.dragging : ""
|
|
57
57
|
].filter(Boolean).join(" "),
|
|
58
58
|
...l,
|
|
59
59
|
children: c
|
|
60
60
|
})]
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
|
-
var
|
|
63
|
+
var _ = {
|
|
64
64
|
neutral: "_neutral_c7c7e_1",
|
|
65
65
|
pill: "_pill_c7c7e_2",
|
|
66
66
|
accent: "_accent_c7c7e_3",
|
|
@@ -70,22 +70,22 @@ var g = {
|
|
|
70
70
|
};
|
|
71
71
|
//#endregion
|
|
72
72
|
//#region src/components/Tag.tsx
|
|
73
|
-
function
|
|
73
|
+
function v({ variant: e = "neutral", children: n, ...r }) {
|
|
74
74
|
return /* @__PURE__ */ t("span", {
|
|
75
|
-
className:
|
|
75
|
+
className: _[e],
|
|
76
76
|
...r,
|
|
77
77
|
children: n
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
//#endregion
|
|
81
81
|
//#region node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs
|
|
82
|
-
var
|
|
82
|
+
var y = (e) => e?.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
|
83
83
|
//#endregion
|
|
84
84
|
//#region node_modules/lucide-react/dist/esm/shared/src/utils/toLucideIconData.mjs
|
|
85
|
-
function
|
|
85
|
+
function b(e, t, n = []) {
|
|
86
86
|
if (t == null) throw Error("[lucide]: iconNode is required when icon name is used");
|
|
87
87
|
return {
|
|
88
|
-
name:
|
|
88
|
+
name: y(e),
|
|
89
89
|
size: 24,
|
|
90
90
|
node: t,
|
|
91
91
|
...n.length > 0 ? { aliases: n } : {}
|
|
@@ -93,7 +93,7 @@ function y(e, t, n = []) {
|
|
|
93
93
|
}
|
|
94
94
|
//#endregion
|
|
95
95
|
//#region node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs
|
|
96
|
-
var
|
|
96
|
+
var x = (e) => {
|
|
97
97
|
let t = "", n = !1;
|
|
98
98
|
for (let r of e) {
|
|
99
99
|
if (r === "-" || r === "_" || r <= " ") {
|
|
@@ -103,10 +103,10 @@ var b = (e) => {
|
|
|
103
103
|
t.length === 0 ? t += r.toLowerCase() : t += n ? r.toUpperCase() : r, n = !1;
|
|
104
104
|
}
|
|
105
105
|
return t;
|
|
106
|
-
},
|
|
107
|
-
let t =
|
|
106
|
+
}, S = (e) => {
|
|
107
|
+
let t = x(e);
|
|
108
108
|
return t.charAt(0).toUpperCase() + t.slice(1);
|
|
109
|
-
},
|
|
109
|
+
}, C = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), w = {
|
|
110
110
|
xmlns: "http://www.w3.org/2000/svg",
|
|
111
111
|
width: 24,
|
|
112
112
|
height: 24,
|
|
@@ -119,22 +119,22 @@ var b = (e) => {
|
|
|
119
119
|
};
|
|
120
120
|
//#endregion
|
|
121
121
|
//#region node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconNode.mjs
|
|
122
|
-
function
|
|
122
|
+
function T(e) {
|
|
123
123
|
return e != null;
|
|
124
124
|
}
|
|
125
|
-
function
|
|
126
|
-
let n = t.attributeNames ?? {}, r = (e) => n[e] ?? e, i = e.size ?? e.width ??
|
|
125
|
+
function E(e, t = {}) {
|
|
126
|
+
let n = t.attributeNames ?? {}, r = (e) => n[e] ?? e, i = e.size ?? e.width ?? w.width, a = e.size ?? e.height ?? w.height, o = e.aliases?.filter((e) => typeof e == "string" && e.trim() !== "").map((e) => `lucide-${e}`) ?? [], s = [...e.name ? [`lucide-${e.name}`] : [], ...o], c = t.className?.split(" ").filter(Boolean) ?? [], l = t.includeDefaultClasses === !1 ? C(...c) : C("lucide", ...s, ...c), u = t.absoluteStrokeWidth ? Number(t.strokeWidth ?? w["stroke-width"]) * Number(e.size ?? e.width ?? w.width) / Number(t.size ?? t.width ?? w.width) : t.strokeWidth ?? w["stroke-width"];
|
|
127
127
|
return [
|
|
128
128
|
"svg",
|
|
129
129
|
{
|
|
130
|
-
...Object.entries(
|
|
130
|
+
...Object.entries(w).reduce((e, [t, n]) => (e[r(t)] = n, e), {}),
|
|
131
131
|
..."color" in t && t.color && { [r("stroke")]: t.color },
|
|
132
|
-
..."size" in t &&
|
|
132
|
+
..."size" in t && T(t.size) && {
|
|
133
133
|
[r("width")]: t.size,
|
|
134
134
|
[r("height")]: t.size
|
|
135
135
|
},
|
|
136
|
-
..."width" in t &&
|
|
137
|
-
..."height" in t &&
|
|
136
|
+
..."width" in t && T(t.width) && { [r("width")]: t.width },
|
|
137
|
+
..."height" in t && T(t.height) && { [r("height")]: t.height },
|
|
138
138
|
[r("stroke-width")]: u,
|
|
139
139
|
...l && { [r("class")]: l },
|
|
140
140
|
[r("viewBox")]: `0 0 ${i} ${a}`,
|
|
@@ -156,8 +156,8 @@ function T(e, t = {}) {
|
|
|
156
156
|
}
|
|
157
157
|
//#endregion
|
|
158
158
|
//#region node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconForReact.mjs
|
|
159
|
-
function
|
|
160
|
-
return
|
|
159
|
+
function D(e, t = {}) {
|
|
160
|
+
return E(e, {
|
|
161
161
|
...t,
|
|
162
162
|
attributeNames: {
|
|
163
163
|
...t.attributeNames,
|
|
@@ -171,44 +171,44 @@ function E(e, t = {}) {
|
|
|
171
171
|
}
|
|
172
172
|
//#endregion
|
|
173
173
|
//#region node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs
|
|
174
|
-
var
|
|
174
|
+
var O = (e) => {
|
|
175
175
|
for (let t in e) if (t.startsWith("aria-") || t === "role" || t === "title") return !0;
|
|
176
176
|
return !1;
|
|
177
|
-
},
|
|
177
|
+
}, ee = i({}), te = () => s(ee), ne = o(({ color: e, size: t, width: n, height: r, strokeWidth: i, absoluteStrokeWidth: o, nonScalingStroke: s, className: c = "", children: l, iconNode: u = [], icon: d = {
|
|
178
178
|
node: u,
|
|
179
179
|
aliases: [],
|
|
180
180
|
size: 24
|
|
181
181
|
}, ...f }, p) => {
|
|
182
|
-
let { size: m = 24, strokeWidth: h = 2, absoluteStrokeWidth: g = !1, nonScalingStroke: _ = !1, color: v = "currentColor", className: y = "" } =
|
|
182
|
+
let { size: m = 24, strokeWidth: h = 2, absoluteStrokeWidth: g = !1, nonScalingStroke: _ = !1, color: v = "currentColor", className: y = "" } = te() ?? {}, b = !!l || O(f), [x, S, w = []] = D(d, {
|
|
183
183
|
color: e ?? v,
|
|
184
184
|
width: n ?? t ?? m,
|
|
185
185
|
height: r ?? t ?? m,
|
|
186
186
|
strokeWidth: i ?? h,
|
|
187
187
|
absoluteStrokeWidth: o ?? g,
|
|
188
188
|
nonScalingStroke: s ?? _,
|
|
189
|
-
className:
|
|
189
|
+
className: C(y, c),
|
|
190
190
|
hasA11yProp: b,
|
|
191
191
|
attributes: f
|
|
192
192
|
});
|
|
193
193
|
return a(x, {
|
|
194
194
|
ref: p,
|
|
195
|
-
...
|
|
195
|
+
...S
|
|
196
196
|
}, [...w.map(([e, t]) => a(e, t)), ...Array.isArray(l) ? l : [l]]);
|
|
197
197
|
});
|
|
198
198
|
//#endregion
|
|
199
199
|
//#region node_modules/lucide-react/dist/esm/createLucideIcon.mjs
|
|
200
|
-
function
|
|
201
|
-
let r = typeof e == "string" ?
|
|
200
|
+
function k(e, t = [], n = []) {
|
|
201
|
+
let r = typeof e == "string" ? b(e, t, n) : e, i = o(({ className: e, ...t }, n) => a(ne, {
|
|
202
202
|
ref: n,
|
|
203
203
|
icon: r,
|
|
204
204
|
className: e,
|
|
205
205
|
...t
|
|
206
206
|
}));
|
|
207
|
-
return r.name && (i.displayName =
|
|
207
|
+
return r.name && (i.displayName = S(r.name)), i;
|
|
208
208
|
}
|
|
209
209
|
//#endregion
|
|
210
210
|
//#region node_modules/lucide-react/dist/esm/icons/check.mjs
|
|
211
|
-
var
|
|
211
|
+
var A = {
|
|
212
212
|
name: "check",
|
|
213
213
|
size: 24,
|
|
214
214
|
node: [["path", {
|
|
@@ -216,8 +216,8 @@ var j = {
|
|
|
216
216
|
key: "1gmf2c"
|
|
217
217
|
}]]
|
|
218
218
|
};
|
|
219
|
-
|
|
220
|
-
var
|
|
219
|
+
A.node;
|
|
220
|
+
var j = k(A), M = {
|
|
221
221
|
name: "chevron-down",
|
|
222
222
|
size: 24,
|
|
223
223
|
node: [["path", {
|
|
@@ -226,7 +226,7 @@ var te = A(j), M = {
|
|
|
226
226
|
}]]
|
|
227
227
|
};
|
|
228
228
|
M.node;
|
|
229
|
-
var N =
|
|
229
|
+
var N = k(M), P = {
|
|
230
230
|
name: "search",
|
|
231
231
|
size: 24,
|
|
232
232
|
node: [["path", {
|
|
@@ -240,7 +240,7 @@ var N = A(M), P = {
|
|
|
240
240
|
}]]
|
|
241
241
|
};
|
|
242
242
|
P.node;
|
|
243
|
-
var F =
|
|
243
|
+
var F = k(P), I = {
|
|
244
244
|
toolbar: "_toolbar_1rsvo_1",
|
|
245
245
|
searchWrap: "_searchWrap_1rsvo_14",
|
|
246
246
|
searchIcon: "_searchIcon_1rsvo_33",
|
|
@@ -251,7 +251,7 @@ var F = A(P), I = {
|
|
|
251
251
|
//#endregion
|
|
252
252
|
//#region src/components/Toolbar.tsx
|
|
253
253
|
function L({ searchValue: e, onSearchChange: r, placeholder: i = "Search…", shortcutLabel: a = "⌘K", shortcutKey: o = "k", children: s }) {
|
|
254
|
-
let l =
|
|
254
|
+
let l = d(null);
|
|
255
255
|
return c(() => {
|
|
256
256
|
function e(e) {
|
|
257
257
|
(e.metaKey || e.ctrlKey) && e.key.toLowerCase() === o.toLowerCase() && (e.preventDefault(), l.current?.focus());
|
|
@@ -323,7 +323,7 @@ var B = {
|
|
|
323
323
|
};
|
|
324
324
|
//#endregion
|
|
325
325
|
//#region src/components/RadioButton.tsx
|
|
326
|
-
function
|
|
326
|
+
function V({ checked: e, onChange: r, name: i, value: a, ariaLabel: o, className: s }) {
|
|
327
327
|
return /* @__PURE__ */ n("label", {
|
|
328
328
|
className: `${B.radio} ${s ?? ""}`,
|
|
329
329
|
children: [/* @__PURE__ */ t("input", {
|
|
@@ -340,7 +340,7 @@ function ne({ checked: e, onChange: r, name: i, value: a, ariaLabel: o, classNam
|
|
|
340
340
|
})]
|
|
341
341
|
});
|
|
342
342
|
}
|
|
343
|
-
var
|
|
343
|
+
var H = {
|
|
344
344
|
field: "_field_133ye_1",
|
|
345
345
|
label: "_label_133ye_6",
|
|
346
346
|
inputWrap: "_inputWrap_133ye_12",
|
|
@@ -355,58 +355,58 @@ var V = {
|
|
|
355
355
|
};
|
|
356
356
|
//#endregion
|
|
357
357
|
//#region src/components/TextField.tsx
|
|
358
|
-
function
|
|
358
|
+
function U({ label: e, helperText: r, error: i, size: a = "base", leadingIcon: o, id: s, ...c }) {
|
|
359
359
|
let u = l(), d = s ?? u;
|
|
360
360
|
return /* @__PURE__ */ n("div", {
|
|
361
|
-
className:
|
|
361
|
+
className: H.field,
|
|
362
362
|
children: [
|
|
363
363
|
e && /* @__PURE__ */ t("label", {
|
|
364
|
-
className:
|
|
364
|
+
className: H.label,
|
|
365
365
|
htmlFor: d,
|
|
366
366
|
children: e
|
|
367
367
|
}),
|
|
368
368
|
/* @__PURE__ */ n("div", {
|
|
369
|
-
className: `${
|
|
369
|
+
className: `${H.inputWrap} ${H[a]} ${i ? H.errorWrap : ""}`,
|
|
370
370
|
children: [o && /* @__PURE__ */ t("span", {
|
|
371
|
-
className:
|
|
371
|
+
className: H.icon,
|
|
372
372
|
children: o
|
|
373
373
|
}), /* @__PURE__ */ t("input", {
|
|
374
374
|
id: d,
|
|
375
|
-
className:
|
|
375
|
+
className: H.input,
|
|
376
376
|
...c
|
|
377
377
|
})]
|
|
378
378
|
}),
|
|
379
379
|
i ? /* @__PURE__ */ t("span", {
|
|
380
|
-
className:
|
|
380
|
+
className: H.errorText,
|
|
381
381
|
children: i
|
|
382
382
|
}) : r ? /* @__PURE__ */ t("span", {
|
|
383
|
-
className:
|
|
383
|
+
className: H.helperText,
|
|
384
384
|
children: r
|
|
385
385
|
}) : null
|
|
386
386
|
]
|
|
387
387
|
});
|
|
388
388
|
}
|
|
389
|
-
var
|
|
389
|
+
var W = {
|
|
390
390
|
menu: "_menu_471l2_1",
|
|
391
391
|
divider: "_divider_471l2_15"
|
|
392
392
|
};
|
|
393
393
|
//#endregion
|
|
394
394
|
//#region src/components/Menu.tsx
|
|
395
|
-
function
|
|
395
|
+
function G({ children: e, ...n }) {
|
|
396
396
|
return /* @__PURE__ */ t("div", {
|
|
397
397
|
role: "menu",
|
|
398
|
-
className:
|
|
398
|
+
className: W.menu,
|
|
399
399
|
...n,
|
|
400
400
|
children: e
|
|
401
401
|
});
|
|
402
402
|
}
|
|
403
|
-
function
|
|
403
|
+
function K() {
|
|
404
404
|
return /* @__PURE__ */ t("div", {
|
|
405
|
-
className:
|
|
405
|
+
className: W.divider,
|
|
406
406
|
role: "separator"
|
|
407
407
|
});
|
|
408
408
|
}
|
|
409
|
-
var
|
|
409
|
+
var q = {
|
|
410
410
|
item: "_item_1j7n9_1",
|
|
411
411
|
icon: "_icon_1j7n9_24",
|
|
412
412
|
check: "_check_1j7n9_25",
|
|
@@ -417,11 +417,11 @@ var K = {
|
|
|
417
417
|
};
|
|
418
418
|
//#endregion
|
|
419
419
|
//#region src/components/MenuItem.tsx
|
|
420
|
-
function
|
|
420
|
+
function J({ icon: e, trailing: r, selected: i, destructive: a, children: o, ...s }) {
|
|
421
421
|
let c = [
|
|
422
|
-
|
|
423
|
-
i &&
|
|
424
|
-
a &&
|
|
422
|
+
q.item,
|
|
423
|
+
i && q.selected,
|
|
424
|
+
a && q.destructive
|
|
425
425
|
].filter(Boolean).join(" ");
|
|
426
426
|
return /* @__PURE__ */ n("button", {
|
|
427
427
|
type: "button",
|
|
@@ -430,25 +430,25 @@ function q({ icon: e, trailing: r, selected: i, destructive: a, children: o, ...
|
|
|
430
430
|
...s,
|
|
431
431
|
children: [
|
|
432
432
|
e && /* @__PURE__ */ t("span", {
|
|
433
|
-
className:
|
|
433
|
+
className: q.icon,
|
|
434
434
|
children: e
|
|
435
435
|
}),
|
|
436
436
|
/* @__PURE__ */ t("span", {
|
|
437
|
-
className:
|
|
437
|
+
className: q.label,
|
|
438
438
|
children: o
|
|
439
439
|
}),
|
|
440
440
|
r && /* @__PURE__ */ t("span", {
|
|
441
|
-
className:
|
|
441
|
+
className: q.trailing,
|
|
442
442
|
children: r
|
|
443
443
|
}),
|
|
444
444
|
i && /* @__PURE__ */ t("span", {
|
|
445
|
-
className:
|
|
446
|
-
children: /* @__PURE__ */ t(
|
|
445
|
+
className: q.check,
|
|
446
|
+
children: /* @__PURE__ */ t(j, {})
|
|
447
447
|
})
|
|
448
448
|
]
|
|
449
449
|
});
|
|
450
450
|
}
|
|
451
|
-
var
|
|
451
|
+
var Y = {
|
|
452
452
|
field: "_field_1bvdj_1",
|
|
453
453
|
label: "_label_1bvdj_7",
|
|
454
454
|
trigger: "_trigger_1bvdj_13",
|
|
@@ -467,11 +467,11 @@ var J = {
|
|
|
467
467
|
};
|
|
468
468
|
//#endregion
|
|
469
469
|
//#region src/components/Dropdown.tsx
|
|
470
|
-
function
|
|
471
|
-
let [h, g] =
|
|
470
|
+
function X({ label: e, helperText: r, error: i, size: a = "base", placeholder: o = "Select…", options: s, value: u, onChange: p, disabled: m }) {
|
|
471
|
+
let [h, g] = f(!1), _ = d(null), v = l(), y = s.find((e) => e.value === u), b = s.filter((e) => !e.disabled).map((e) => e.value);
|
|
472
472
|
c(() => {
|
|
473
473
|
if (!h) return;
|
|
474
|
-
let e =
|
|
474
|
+
let e = u ?? b[0];
|
|
475
475
|
(_.current?.querySelector(`[data-value="${e}"]`))?.focus();
|
|
476
476
|
}, [h]), c(() => {
|
|
477
477
|
if (!h) return;
|
|
@@ -505,18 +505,18 @@ function Y({ label: e, helperText: r, error: i, size: a = "base", placeholder: o
|
|
|
505
505
|
e.key === "Escape" && g(!1);
|
|
506
506
|
}
|
|
507
507
|
return /* @__PURE__ */ n("div", {
|
|
508
|
-
className:
|
|
508
|
+
className: Y.field,
|
|
509
509
|
ref: _,
|
|
510
510
|
children: [
|
|
511
511
|
e && /* @__PURE__ */ t("label", {
|
|
512
|
-
className:
|
|
512
|
+
className: Y.label,
|
|
513
513
|
htmlFor: v,
|
|
514
514
|
children: e
|
|
515
515
|
}),
|
|
516
516
|
/* @__PURE__ */ n("button", {
|
|
517
517
|
id: v,
|
|
518
518
|
type: "button",
|
|
519
|
-
className: `${
|
|
519
|
+
className: `${Y.trigger} ${Y[a]} ${i ? Y.errorWrap : ""}`,
|
|
520
520
|
"aria-haspopup": "listbox",
|
|
521
521
|
"aria-expanded": h,
|
|
522
522
|
disabled: m,
|
|
@@ -524,30 +524,30 @@ function Y({ label: e, helperText: r, error: i, size: a = "base", placeholder: o
|
|
|
524
524
|
onKeyDown: x,
|
|
525
525
|
children: [
|
|
526
526
|
y?.icon && /* @__PURE__ */ t("span", {
|
|
527
|
-
className:
|
|
527
|
+
className: Y.icon,
|
|
528
528
|
children: y.icon
|
|
529
529
|
}),
|
|
530
530
|
/* @__PURE__ */ t("span", {
|
|
531
|
-
className: `${
|
|
531
|
+
className: `${Y.value} ${y ? "" : Y.placeholder}`,
|
|
532
532
|
children: y ? y.label : o
|
|
533
533
|
}),
|
|
534
534
|
/* @__PURE__ */ t("span", {
|
|
535
|
-
className: `${
|
|
535
|
+
className: `${Y.chevron} ${h ? Y.chevronOpen : ""}`,
|
|
536
536
|
children: /* @__PURE__ */ t(N, {})
|
|
537
537
|
})
|
|
538
538
|
]
|
|
539
539
|
}),
|
|
540
540
|
h && /* @__PURE__ */ t("div", {
|
|
541
|
-
className:
|
|
542
|
-
children: /* @__PURE__ */ t(
|
|
541
|
+
className: Y.menuWrap,
|
|
542
|
+
children: /* @__PURE__ */ t(G, {
|
|
543
543
|
role: "listbox",
|
|
544
544
|
style: { width: "100%" },
|
|
545
|
-
children: s.map((e) => /* @__PURE__ */ t(
|
|
545
|
+
children: s.map((e) => /* @__PURE__ */ t(J, {
|
|
546
546
|
"data-value": e.value,
|
|
547
547
|
role: "option",
|
|
548
|
-
"aria-selected": e.value ===
|
|
548
|
+
"aria-selected": e.value === u,
|
|
549
549
|
icon: e.icon,
|
|
550
|
-
selected: e.value ===
|
|
550
|
+
selected: e.value === u,
|
|
551
551
|
disabled: e.disabled,
|
|
552
552
|
onClick: () => {
|
|
553
553
|
p(e.value), g(!1);
|
|
@@ -558,26 +558,26 @@ function Y({ label: e, helperText: r, error: i, size: a = "base", placeholder: o
|
|
|
558
558
|
})
|
|
559
559
|
}),
|
|
560
560
|
i ? /* @__PURE__ */ t("span", {
|
|
561
|
-
className:
|
|
561
|
+
className: Y.errorText,
|
|
562
562
|
children: i
|
|
563
563
|
}) : r ? /* @__PURE__ */ t("span", {
|
|
564
|
-
className:
|
|
564
|
+
className: Y.helperText,
|
|
565
565
|
children: r
|
|
566
566
|
}) : null
|
|
567
567
|
]
|
|
568
568
|
});
|
|
569
569
|
}
|
|
570
|
-
var
|
|
570
|
+
var re = { highlight: "_highlight_1anli_1" };
|
|
571
571
|
//#endregion
|
|
572
572
|
//#region src/components/HighlightText.tsx
|
|
573
|
-
function
|
|
573
|
+
function ie(e) {
|
|
574
574
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
575
575
|
}
|
|
576
|
-
function
|
|
576
|
+
function ae({ text: n, query: i }) {
|
|
577
577
|
if (!i) return /* @__PURE__ */ t(e, { children: n });
|
|
578
|
-
let a = n.split(RegExp(`(${
|
|
578
|
+
let a = n.split(RegExp(`(${ie(i)})`, "ig"));
|
|
579
579
|
return /* @__PURE__ */ t(e, { children: a.map((e, n) => e.toLowerCase() === i.toLowerCase() ? /* @__PURE__ */ t("mark", {
|
|
580
|
-
className:
|
|
580
|
+
className: re.highlight,
|
|
581
581
|
children: e
|
|
582
582
|
}, n) : /* @__PURE__ */ t(r, { children: e }, n)) });
|
|
583
583
|
}
|
|
@@ -603,8 +603,8 @@ var Z = {
|
|
|
603
603
|
};
|
|
604
604
|
//#endregion
|
|
605
605
|
//#region src/components/FilterSection.tsx
|
|
606
|
-
function
|
|
607
|
-
let [l, u] =
|
|
606
|
+
function oe({ label: e, options: r, optionLabel: i, activeSet: a, onToggle: o, onSetAll: s, searchable: c }) {
|
|
607
|
+
let [l, u] = f(""), d = l.trim().toLowerCase(), p = d ? r.filter((e) => i(e).toLowerCase().includes(d)) : r, m = r.length > 0 && a.size === r.length;
|
|
608
608
|
return /* @__PURE__ */ n("div", { children: [
|
|
609
609
|
/* @__PURE__ */ n("div", {
|
|
610
610
|
className: Z.sectionHeader,
|
|
@@ -650,7 +650,7 @@ var Q = {
|
|
|
650
650
|
};
|
|
651
651
|
//#endregion
|
|
652
652
|
//#region src/components/UiElementsSidebar.tsx
|
|
653
|
-
function
|
|
653
|
+
function se({ sections: e }) {
|
|
654
654
|
return /* @__PURE__ */ n("aside", {
|
|
655
655
|
className: Q.sidebar,
|
|
656
656
|
children: [/* @__PURE__ */ t("div", {
|
|
@@ -667,31 +667,79 @@ function oe({ sections: e }) {
|
|
|
667
667
|
});
|
|
668
668
|
}
|
|
669
669
|
var $ = {
|
|
670
|
-
line: "
|
|
671
|
-
box: "
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
670
|
+
line: "_line_gfgon_1",
|
|
671
|
+
box: "_box_gfgon_2",
|
|
672
|
+
indicator: "_indicator_gfgon_9",
|
|
673
|
+
settling: "_settling_gfgon_17",
|
|
674
|
+
indicatorLine: "_indicatorLine_gfgon_21",
|
|
675
|
+
indicatorBox: "_indicatorBox_gfgon_27",
|
|
676
|
+
tab: "_tab_gfgon_35",
|
|
677
|
+
selected: "_selected_gfgon_80",
|
|
678
|
+
icon: "_icon_gfgon_89",
|
|
679
|
+
sm: "_sm_gfgon_148"
|
|
676
680
|
};
|
|
677
681
|
//#endregion
|
|
678
682
|
//#region src/components/Tabs.tsx
|
|
679
|
-
function
|
|
680
|
-
let c = e.filter((e) => !e.disabled).map((e) => e.value);
|
|
681
|
-
|
|
683
|
+
function ce({ items: e, value: r, onChange: i, variant: a = "line", size: o = "base", ...s }) {
|
|
684
|
+
let c = e.filter((e) => !e.disabled).map((e) => e.value), l = d(null), p = d(/* @__PURE__ */ new Map()), m = d(r), [h, g] = f(null), [_, v] = f("idle");
|
|
685
|
+
u(() => {
|
|
686
|
+
let e = p.current.get(r);
|
|
687
|
+
e && (g({
|
|
688
|
+
left: e.offsetLeft,
|
|
689
|
+
width: e.offsetWidth
|
|
690
|
+
}), a === "box" && m.current !== r && v("moving"), m.current = r);
|
|
691
|
+
}, [
|
|
692
|
+
r,
|
|
693
|
+
e,
|
|
694
|
+
a,
|
|
695
|
+
o
|
|
696
|
+
]);
|
|
697
|
+
function y(e) {
|
|
698
|
+
e.propertyName === "scale" && (_ === "moving" ? v("settling") : _ === "settling" && v("idle"));
|
|
699
|
+
}
|
|
700
|
+
u(() => {
|
|
701
|
+
let e = l.current;
|
|
702
|
+
if (!e) return;
|
|
703
|
+
let t = new ResizeObserver(() => {
|
|
704
|
+
let e = p.current.get(r);
|
|
705
|
+
e && g({
|
|
706
|
+
left: e.offsetLeft,
|
|
707
|
+
width: e.offsetWidth
|
|
708
|
+
});
|
|
709
|
+
});
|
|
710
|
+
return t.observe(e), () => t.disconnect();
|
|
711
|
+
}, [r]);
|
|
712
|
+
function b(e) {
|
|
682
713
|
let t = c.indexOf(r);
|
|
683
714
|
if (t === -1) return;
|
|
684
715
|
let n = null;
|
|
685
716
|
e.key === "ArrowRight" && (n = (t + 1) % c.length), e.key === "ArrowLeft" && (n = (t - 1 + c.length) % c.length), e.key === "Home" && (n = 0), e.key === "End" && (n = c.length - 1), n !== null && (e.preventDefault(), i(c[n]));
|
|
686
717
|
}
|
|
687
|
-
return /* @__PURE__ */
|
|
718
|
+
return /* @__PURE__ */ n("div", {
|
|
719
|
+
ref: l,
|
|
688
720
|
role: "tablist",
|
|
689
721
|
className: [$[a], a === "box" && o === "sm" && $.sm].filter(Boolean).join(" "),
|
|
690
|
-
onKeyDown:
|
|
722
|
+
onKeyDown: b,
|
|
691
723
|
...s,
|
|
692
|
-
children:
|
|
724
|
+
children: [h && /* @__PURE__ */ t("span", {
|
|
725
|
+
"aria-hidden": !0,
|
|
726
|
+
className: [
|
|
727
|
+
$.indicator,
|
|
728
|
+
a === "line" ? $.indicatorLine : $.indicatorBox,
|
|
729
|
+
_ === "settling" && $.settling
|
|
730
|
+
].filter(Boolean).join(" "),
|
|
731
|
+
onTransitionEnd: y,
|
|
732
|
+
style: {
|
|
733
|
+
translate: `${h.left}px 0`,
|
|
734
|
+
scale: a === "box" && _ === "moving" ? .92 : 1,
|
|
735
|
+
width: h.width
|
|
736
|
+
}
|
|
737
|
+
}), e.map((e) => {
|
|
693
738
|
let a = e.value === r;
|
|
694
739
|
return /* @__PURE__ */ n("button", {
|
|
740
|
+
ref: (t) => {
|
|
741
|
+
t ? p.current.set(e.value, t) : p.current.delete(e.value);
|
|
742
|
+
},
|
|
695
743
|
type: "button",
|
|
696
744
|
role: "tab",
|
|
697
745
|
"aria-selected": a,
|
|
@@ -704,20 +752,20 @@ function se({ items: e, value: r, onChange: i, variant: a = "line", size: o = "b
|
|
|
704
752
|
children: e.icon
|
|
705
753
|
}), e.label]
|
|
706
754
|
}, e.value);
|
|
707
|
-
})
|
|
755
|
+
})]
|
|
708
756
|
});
|
|
709
757
|
}
|
|
710
758
|
//#endregion
|
|
711
759
|
//#region src/utils/format.ts
|
|
712
|
-
function
|
|
760
|
+
function le(e) {
|
|
713
761
|
let t = Math.floor(e / 60), n = e % 60;
|
|
714
762
|
return `${t}h:${String(n).padStart(2, "0")}m`;
|
|
715
763
|
}
|
|
716
|
-
function
|
|
764
|
+
function ue(e, t) {
|
|
717
765
|
let n = Math.floor(e / 60), r = e % 60, i = (e) => String(e).padStart(2, "0");
|
|
718
766
|
return `${i(n)}:${i(r)}:${i(t)}`;
|
|
719
767
|
}
|
|
720
768
|
//#endregion
|
|
721
|
-
export {
|
|
769
|
+
export { m as Button, g as Card, z as Checkbox, X as Dropdown, oe as FilterSection, ae as HighlightText, G as Menu, K as MenuDivider, J as MenuItem, V as RadioButton, ce as Tabs, v as Tag, U as TextField, L as Toolbar, se as UiElementsSidebar, le as formatDuration, ue as formatDurationHMS };
|
|
722
770
|
|
|
723
771
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["__iconData","__iconData"],"sources":["../src/components/Button.module.css","../src/components/Button.tsx","../src/components/Card.module.css","../src/components/Card.tsx","../src/components/Tag.module.css","../src/components/Tag.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toLucideIconData.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs","../node_modules/lucide-react/dist/esm/shared/src/build/defaultAttributes.mjs","../node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconNode.mjs","../node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconForReact.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs","../node_modules/lucide-react/dist/esm/context.mjs","../node_modules/lucide-react/dist/esm/Icon.mjs","../node_modules/lucide-react/dist/esm/createLucideIcon.mjs","../node_modules/lucide-react/dist/esm/icons/check.mjs","../node_modules/lucide-react/dist/esm/icons/chevron-down.mjs","../node_modules/lucide-react/dist/esm/icons/search.mjs","../src/components/Toolbar.module.css","../src/components/Toolbar.tsx","../src/components/Checkbox.module.css","../src/components/Checkbox.tsx","../src/components/RadioButton.module.css","../src/components/RadioButton.tsx","../src/components/TextField.module.css","../src/components/TextField.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/UiElementsSidebar.module.css","../src/components/UiElementsSidebar.tsx","../src/components/Tabs.module.css","../src/components/Tabs.tsx","../src/utils/format.ts"],"sourcesContent":[".primary,\n.secondary,\n.tertiary,\n.dangerous {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n border: none;\n font-family: inherit;\n font-weight: 450;\n letter-spacing: 0.01em;\n cursor: pointer;\n transition:\n color 0.2s ease,\n transform 0.2s ease-out;\n}\n.primary:active:not(:disabled),\n.secondary:active:not(:disabled),\n.tertiary:active:not(:disabled),\n.dangerous:active:not(:disabled) {\n transform: scale(0.95);\n}\n\n.sm {\n border-radius: 10px;\n padding: 8px 12px;\n font-size: 0.8rem;\n}\n.base {\n border-radius: 12px;\n padding: 12px 16px;\n font-size: 0.9rem;\n}\n.lg {\n border-radius: 14px;\n padding: 16px 22px;\n font-size: 1rem;\n}\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 svg {\n width: 100%;\n height: 100%;\n}\n\n.iconOnly {\n aspect-ratio: 1;\n box-sizing: border-box;\n}\n.iconOnly.sm {\n padding: 8px;\n}\n.iconOnly.base {\n padding: 12px;\n}\n.iconOnly.lg {\n padding: 16px;\n}\n.primary::before,\n.secondary::before,\n.tertiary::before,\n.dangerous::before {\n content: '';\n position: absolute;\n left: 50%;\n bottom: 0;\n width: 24%;\n aspect-ratio: 1;\n border-radius: 50%;\n transform: translate(-50%, 100%) scale(1);\n transition: transform 0.3s cubic-bezier(0.39, 0.575, 0.565, 1);\n z-index: -1;\n pointer-events: none;\n}\n.primary:hover::before,\n.secondary:hover::before,\n.tertiary:hover::before,\n.dangerous:hover::before {\n transform: translate(-50%, 15%) scale(8);\n}\n\n.primary {\n background: var(--brand-dark);\n color: #fff;\n font-weight: 400;\n letter-spacing: 0.02em;\n}\n.primary::before {\n background: rgba(255, 255, 255, 0.08);\n}\n.primary:active:not(:disabled)::before {\n background: rgba(0, 0, 0, 0.08);\n}\n\n.secondary {\n background: var(--surface-muted);\n color: var(--text-primary);\n}\n.secondary::before {\n background: rgba(var(--brand-main-rgb), 0.16);\n}\n.secondary:active:not(:disabled)::before {\n background: rgba(var(--brand-main-rgb), 0.28);\n}\n.secondary:hover {\n color: var(--brand-main);\n}\n\n.tertiary {\n background: transparent;\n color: var(--text-secondary);\n}\n.tertiary::before {\n background: rgba(var(--brand-main-rgb), 0.16);\n}\n.tertiary:active:not(:disabled)::before {\n background: rgba(var(--brand-main-rgb), 0.28);\n}\n.tertiary:hover,\n.tertiary:active:not(:disabled) {\n background: var(--bg);\n}\n.tertiary:hover {\n color: var(--brand-main);\n}\n\n.dangerous {\n background: var(--danger-bg);\n color: var(--danger-text-dark);\n}\n.dangerous::before {\n background: rgba(var(--danger-rgb), 0.16);\n}\n.dangerous:active:not(:disabled)::before {\n background: rgba(var(--danger-rgb), 0.28);\n}\n\n.primary:disabled,\n.secondary:disabled,\n.tertiary:disabled,\n.dangerous:disabled {\n background: var(--disabled-bg);\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.primary:disabled:hover,\n.secondary:disabled:hover,\n.tertiary:disabled:hover,\n.dangerous:disabled:hover {\n color: var(--disabled-text);\n}\n.primary:disabled::before,\n.secondary:disabled::before,\n.tertiary:disabled::before,\n.dangerous:disabled::before {\n display: none;\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport styles from './Button.module.css';\n\ntype ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'dangerous';\ntype ButtonSize = 'sm' | 'base' | 'lg';\n\ninterface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className'> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Icon shown before the label. Omit `children` to render an icon-only square button — pass `aria-label` in that case. */\n leadingIcon?: ReactNode;\n /** Icon shown after the label. */\n trailingIcon?: ReactNode;\n children?: ReactNode;\n}\n\nexport function Button({\n variant = 'primary',\n size = 'base',\n leadingIcon,\n trailingIcon,\n children,\n ...rest\n}: ButtonProps) {\n const iconOnly = !children && Boolean(leadingIcon);\n return (\n <button\n type=\"button\"\n className={`${styles[variant]} ${styles[size]}${iconOnly ? ` ${styles.iconOnly}` : ''}`}\n {...rest}\n >\n {leadingIcon && <span className={styles.icon}>{leadingIcon}</span>}\n {children}\n {trailingIcon && <span className={styles.icon}>{trailingIcon}</span>}\n </button>\n );\n}\n",".wrap {\n position: relative;\n width: 220px;\n flex: 0 0 220px;\n}\n.wrap:hover {\n z-index: 10;\n}\n.fluid {\n width: 100%;\n flex: none;\n}\n\n.backing {\n position: absolute;\n left: 6px;\n right: 6px;\n bottom: -4px;\n height: 10px;\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border);\n border-radius: 0 0 14px 14px;\n z-index: 0;\n}\n.backing.completed {\n background: var(--success-bg);\n box-shadow: inset 0 0 0 1px #bfe3cc;\n}\n\n.card {\n position: relative;\n z-index: 1;\n width: 100%;\n box-sizing: border-box;\n background: var(--card-surface);\n box-shadow:\n inset 0 0 0 1px #efefef,\n 0 1px 2px rgba(16, 24, 32, 0.04);\n border-radius: 16px;\n padding: 12px 14px;\n cursor: default;\n transition: box-shadow 0.2s;\n}\n.card.interactive {\n cursor: pointer;\n}\n.card.grabbable {\n cursor: grab;\n}\n.card.grabbable:active {\n cursor: grabbing;\n}\n.card.dragging,\n.card.dragging:hover {\n box-shadow:\n inset 0 0 0 1px #efefef,\n 0 1px 2px rgba(16, 24, 32, 0.04);\n}\n.card.interactive:hover {\n box-shadow:\n inset 0 0 0 1px #efefef,\n 0 0 0 2px var(--brand-main);\n}\n.card.completed {\n background: var(--success-bg);\n box-shadow:\n inset 0 0 0 1px #bfe3cc,\n 0 1px 2px rgba(16, 24, 32, 0.04),\n 0 2px 8px rgba(16, 24, 32, 0.06);\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport styles from './Card.module.css';\n\ninterface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'className'> {\n /** Shows a second sheet behind the card, for representing a stack/batch. */\n stacked?: boolean;\n /** Success-tinted surface, e.g. a completed task. */\n completed?: boolean;\n /** Adds pointer cursor + accent hover ring. */\n interactive?: boolean;\n /** Grab cursor, for drag sources — pair with `interactive`. */\n draggable?: boolean;\n /** Suppresses the hover ring while a drag is in progress. */\n dragging?: boolean;\n /** Card fills its container width instead of a fixed width. */\n fluid?: boolean;\n children: ReactNode;\n}\n\nexport function Card({\n stacked,\n completed,\n interactive,\n draggable,\n dragging,\n fluid,\n children,\n ...rest\n}: CardProps) {\n return (\n <div className={`${styles.wrap} ${fluid ? styles.fluid : ''}`}>\n {stacked && <div className={`${styles.backing} ${completed ? styles.completed : ''}`} />}\n <div\n className={[\n styles.card,\n completed ? styles.completed : '',\n interactive ? styles.interactive : '',\n draggable ? styles.grabbable : '',\n dragging ? styles.dragging : '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </div>\n </div>\n );\n}\n",".neutral,\n.pill,\n.accent,\n.success,\n.danger,\n.count {\n display: inline-flex;\n align-items: center;\n font-weight: 500;\n white-space: nowrap;\n}\n\n/* Square tags — e.g. day badges, worker names, video panel tags */\n.neutral {\n color: var(--text-tertiary);\n font-size: 0.75rem;\n background: var(--bg);\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","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string?.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toKebabCase } from './toKebabCase.mjs';\n\nfunction toLucideIconData(iconName, iconNode, aliases = []) {\n if (iconNode == null) {\n throw new Error(\"[lucide]: iconNode is required when icon name is used\");\n }\n return {\n name: toKebabCase(iconName),\n size: 24,\n node: iconNode,\n ...aliases.length > 0 ? { aliases } : {}\n };\n}\n\nexport { toLucideIconData };\n//# sourceMappingURL=toLucideIconData.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => {\n let out = \"\";\n let upperNext = false;\n for (const ch of string) {\n if (ch === \"-\" || ch === \"_\" || ch <= \" \") {\n upperNext = out.length > 0;\n continue;\n }\n if (out.length === 0) {\n out += ch.toLowerCase();\n } else {\n out += upperNext ? ch.toUpperCase() : ch;\n }\n upperNext = false;\n }\n return out;\n};\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { mergeClasses } from '../utils/mergeClasses.mjs';\n\nfunction isDefined(value) {\n return value !== null && value !== void 0;\n}\nfunction buildLucideIconNode(icon, params = {}) {\n const attributeNames = params.attributeNames ?? {};\n const getAttributeName = (attributeName) => attributeNames[attributeName] ?? attributeName;\n const viewBoxWidth = icon.size ?? icon.width ?? defaultAttributes[\"width\"];\n const viewBoxHeight = icon.size ?? icon.height ?? defaultAttributes[\"height\"];\n const aliasClassNames = icon.aliases?.filter((alias) => typeof alias === \"string\" && alias.trim() !== \"\").map((alias) => `lucide-${alias}`) ?? [];\n const iconClassNames = [...icon.name ? [`lucide-${icon.name}`] : [], ...aliasClassNames];\n const classNamesFromClassName = params.className?.split(\" \").filter(Boolean) ?? [];\n const className = params.includeDefaultClasses === false ? mergeClasses(...classNamesFromClassName) : mergeClasses(\"lucide\", ...iconClassNames, ...classNamesFromClassName);\n const calculatedStrokeWidth = params.absoluteStrokeWidth ? Number(params.strokeWidth ?? defaultAttributes[\"stroke-width\"]) * Number(icon.size ?? icon.width ?? defaultAttributes[\"width\"]) / Number(params.size ?? params.width ?? defaultAttributes[\"width\"]) : params.strokeWidth ?? defaultAttributes[\"stroke-width\"];\n const attributes = {\n ...Object.entries(defaultAttributes).reduce((attrs, [attrName, value]) => {\n attrs[getAttributeName(attrName)] = value;\n return attrs;\n }, {}),\n ...\"color\" in params && params.color && {\n [getAttributeName(\"stroke\")]: params.color\n },\n ...\"size\" in params && isDefined(params.size) && {\n [getAttributeName(\"width\")]: params.size,\n [getAttributeName(\"height\")]: params.size\n },\n ...\"width\" in params && isDefined(params.width) && {\n [getAttributeName(\"width\")]: params.width\n },\n ...\"height\" in params && isDefined(params.height) && {\n [getAttributeName(\"height\")]: params.height\n },\n [getAttributeName(\"stroke-width\")]: calculatedStrokeWidth,\n ...className && {\n [getAttributeName(\"class\")]: className\n },\n [getAttributeName(\"viewBox\")]: `0 0 ${viewBoxWidth} ${viewBoxHeight}`,\n ...params.hasA11yProp === false ? {\n [getAttributeName(\"aria-hidden\")]: \"true\"\n } : {},\n ...\"attributes\" in params && params.attributes\n };\n return [\n \"svg\",\n attributes,\n icon.node.map((child) => {\n const [name, attrs, children] = child;\n const nextAttrs = params.nonScalingStroke ? { [getAttributeName(\"vector-effect\")]: \"non-scaling-stroke\", ...attrs } : attrs;\n return children ? [name, nextAttrs, children] : [name, nextAttrs];\n })\n ];\n}\n\nexport { buildLucideIconNode as default };\n//# sourceMappingURL=buildLucideIconNode.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport buildLucideIconNode from './buildLucideIconNode.mjs';\n\nfunction buildLucideIconForReact(icon, params = {}) {\n return buildLucideIconNode(icon, {\n ...params,\n attributeNames: {\n ...params.attributeNames,\n class: \"className\",\n \"stroke-width\": \"strokeWidth\",\n \"stroke-linecap\": \"strokeLinecap\",\n \"stroke-linejoin\": \"strokeLinejoin\",\n \"vector-effect\": \"vectorEffect\"\n }\n });\n}\n\nexport { buildLucideIconForReact as default };\n//# sourceMappingURL=buildLucideIconForReact.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, nonScalingStroke, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport buildLucideIconForReact from './shared/src/build/buildLucideIconForReact.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({\n color,\n size,\n width,\n height,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className = \"\",\n children,\n iconNode = [],\n icon = {\n node: iconNode,\n aliases: [],\n size: 24\n },\n ...rest\n }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n nonScalingStroke: contextNonScalingStroke = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const hasAccessibleProp = Boolean(children) || hasA11yProp(rest);\n const [name, svgAttributes, builtIconNode = []] = buildLucideIconForReact(icon, {\n color: color ?? contextColor,\n width: width ?? size ?? contextSize,\n height: height ?? size ?? contextSize,\n strokeWidth: strokeWidth ?? contextStrokeWidth,\n absoluteStrokeWidth: absoluteStrokeWidth ?? contextAbsoluteStrokeWidth,\n nonScalingStroke: nonScalingStroke ?? contextNonScalingStroke,\n className: mergeClasses(contextClass, className),\n hasA11yProp: hasAccessibleProp,\n attributes: rest\n });\n return createElement(\n name,\n {\n ref,\n ...svgAttributes\n },\n [\n ...builtIconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { toLucideIconData } from './shared/src/utils/toLucideIconData.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nfunction createLucideIcon(iconDataOrName, iconNode = [], aliases = []) {\n const iconData = typeof iconDataOrName === \"string\" ? toLucideIconData(iconDataOrName, iconNode, aliases) : iconDataOrName;\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n icon: iconData,\n className,\n ...props\n })\n );\n if (iconData.name) {\n Component.displayName = toPascalCase(iconData.name);\n }\n return Component;\n}\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"check\",\n size: 24,\n node: [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]]\n};\n__iconData.node;\nconst Check = createLucideIcon(__iconData);\n\nexport { __iconData, Check as default };\n//# sourceMappingURL=check.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"chevron-down\",\n size: 24,\n node: [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]]\n};\n__iconData.node;\nconst ChevronDown = createLucideIcon(__iconData);\n\nexport { __iconData, ChevronDown as default };\n//# sourceMappingURL=chevron-down.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"search\",\n size: 24,\n node: [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n ]\n};\n__iconData.node;\nconst Search = createLucideIcon(__iconData);\n\nexport { __iconData, Search as default };\n//# sourceMappingURL=search.mjs.map\n",".toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 0 8px;\n background: var(--card-surface);\n border-radius: 16px;\n box-shadow:\n inset 0 0 0 1px var(--border),\n 0 1px 2px rgba(16, 24, 32, 0.04),\n 0 2px 8px rgba(16, 24, 32, 0.06);\n}\n.searchWrap {\n position: relative;\n flex: 1;\n min-width: 0;\n}\n.searchWrap::after {\n content: '';\n position: absolute;\n left: 36px;\n right: 0;\n bottom: 0;\n height: 2px;\n background: var(--brand-main);\n opacity: 0;\n pointer-events: none;\n}\n.searchWrap:focus-within::after {\n opacity: 1;\n}\n.searchIcon {\n position: absolute;\n top: 50%;\n left: 12px;\n width: 16px;\n height: 16px;\n transform: translateY(-53%);\n color: var(--text-tertiary);\n pointer-events: none;\n}\n.searchIcon svg {\n width: 100%;\n height: 100%;\n}\n.search {\n width: 100%;\n box-sizing: border-box;\n border: none;\n padding: 16px 52px 16px 36px;\n font-family: inherit;\n font-size: 1rem;\n color: var(--text-primary);\n background: none;\n box-shadow: inset -1px 0 0 var(--border);\n}\n.search:focus {\n outline: none;\n}\n.searchShortcut {\n position: absolute;\n top: 50%;\n right: 8px;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2px 6px;\n border-radius: 6px;\n background: var(--bg);\n color: var(--text-tertiary);\n font-size: 0.75rem;\n font-weight: 600;\n letter-spacing: 0.02em;\n pointer-events: none;\n}\n.controls {\n display: flex;\n align-items: center;\n flex: none;\n}\n","import { useEffect, useRef, type ChangeEvent, type ReactNode } from 'react';\nimport { Search } from 'lucide-react';\nimport styles from './Toolbar.module.css';\n\ninterface ToolbarProps {\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n placeholder?: string;\n /** Text shown in the keyboard-shortcut badge, e.g. \"⌘K\". Omit to hide the badge. */\n shortcutLabel?: string;\n /** Focuses the search input when Cmd/Ctrl + the shortcut key is pressed. */\n shortcutKey?: string;\n /** Right-side content — filter/sort controls, actions, etc. */\n children?: ReactNode;\n}\n\nexport function Toolbar({\n searchValue,\n onSearchChange,\n placeholder = 'Search…',\n shortcutLabel = '⌘K',\n shortcutKey = 'k',\n children,\n}: ToolbarProps) {\n const searchRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n function onKeyDown(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === shortcutKey.toLowerCase()) {\n e.preventDefault();\n searchRef.current?.focus();\n }\n }\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [shortcutKey]);\n\n return (\n <div className={styles.toolbar}>\n <div className={styles.searchWrap}>\n <span className={styles.searchIcon}>\n <Search />\n </span>\n <input\n ref={searchRef}\n type=\"text\"\n className={styles.search}\n placeholder={placeholder}\n autoComplete=\"off\"\n value={searchValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onSearchChange?.(e.target.value)}\n />\n {shortcutLabel && (\n <span className={styles.searchShortcut} aria-hidden=\"true\">\n {shortcutLabel}\n </span>\n )}\n </div>\n {children && <div className={styles.controls}>{children}</div>}\n </div>\n );\n}\n",".checkbox {\n 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 cursor: pointer;\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(--surface-sunken);\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.input:hover + .box {\n box-shadow: inset 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.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","import type { ChangeEvent } from 'react';\nimport styles from './Checkbox.module.css';\n\ninterface CheckboxProps {\n checked: boolean;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n ariaLabel?: string;\n className?: string;\n}\n\nexport function Checkbox({ checked, onChange, ariaLabel, className }: CheckboxProps) {\n return (\n <label className={`${styles.checkbox} ${className ?? ''}`}>\n <input\n type=\"checkbox\"\n className={styles.input}\n checked={checked}\n onChange={onChange}\n aria-label={ariaLabel}\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 </label>\n );\n}\n",".radio {\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 cursor: pointer;\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(--surface-sunken);\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.input:hover + .circle {\n box-shadow: inset 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.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","import type { ChangeEvent } from 'react';\nimport styles from './RadioButton.module.css';\n\ninterface RadioButtonProps {\n checked: boolean;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n name?: string;\n value?: string;\n ariaLabel?: string;\n className?: string;\n}\n\nexport function RadioButton({ checked, onChange, name, value, ariaLabel, className }: RadioButtonProps) {\n return (\n <label className={`${styles.radio} ${className ?? ''}`}>\n <input\n type=\"radio\"\n className={styles.input}\n checked={checked}\n onChange={onChange}\n name={name}\n value={value}\n aria-label={ariaLabel}\n />\n <span className={styles.circle}>\n <span className={styles.dot} />\n </span>\n </label>\n );\n}\n",".field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.label {\n font-size: 0.85rem;\n font-weight: 550;\n color: var(--text-primary);\n padding-left: 8px;\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 border-radius: 10px;\n}\n.sm .input {\n padding: 8px 12px;\n font-size: 0.8rem;\n}\n.base {\n border-radius: 12px;\n}\n.base .input {\n padding: 12px 14px;\n font-size: 0.9rem;\n}\n.lg {\n border-radius: 14px;\n}\n.lg .input {\n padding: 16px 16px;\n font-size: 1rem;\n}\n.inputWrap:has(.icon) .input {\n padding-left: 8px;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 12px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n.input {\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n background: none;\n font-family: inherit;\n color: var(--text-primary);\n font-weight: 450;\n}\n.input:focus {\n outline: none;\n}\n.input::placeholder {\n color: var(--text-tertiary);\n}\n.input:disabled {\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.helperText {\n font-size: 0.78rem;\n color: var(--text-tertiary);\n padding-left: 8px;\n}\n.errorText {\n font-size: 0.78rem;\n color: var(--danger-text);\n}\n","import { useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport styles from './TextField.module.css';\n\ntype TextFieldSize = 'sm' | 'base' | 'lg';\n\ninterface TextFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className' | 'size'> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: TextFieldSize;\n leadingIcon?: ReactNode;\n}\n\nexport function TextField({\n label,\n helperText,\n error,\n size = 'base',\n leadingIcon,\n id,\n ...rest\n}: TextFieldProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div className={styles.field}>\n {label && (\n <label className={styles.label} htmlFor={inputId}>\n {label}\n </label>\n )}\n <div className={`${styles.inputWrap} ${styles[size]} ${error ? styles.errorWrap : ''}`}>\n {leadingIcon && <span className={styles.icon}>{leadingIcon}</span>}\n <input id={inputId} className={styles.input} {...rest} />\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helperText}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n",".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 box-sizing: border-box;\n border: none;\n background: none;\n border-radius: 8px;\n padding: 8px 10px;\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 color: var(--text-tertiary);\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.trailing {\n color: var(--text-tertiary);\n font-size: 0.8rem;\n flex-shrink: 0;\n}\n.selected {\n color: var(--text-primary);\n font-weight: 550;\n}\n.selected .icon {\n color: var(--text-primary);\n}\n.check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 8px;\n color: var(--text-primary);\n flex-shrink: 0;\n}\n.check svg {\n width: 100%;\n height: 100%;\n}\n.destructive {\n color: var(--danger-text);\n}\n.destructive .icon {\n color: var(--danger-text);\n}\n.destructive:hover:not(:disabled) {\n background: var(--danger-bg);\n color: var(--danger-text);\n}\n.destructive:hover:not(:disabled) .icon {\n color: var(--danger-text);\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { Check } from 'lucide-react';\nimport styles from './MenuItem.module.css';\n\ninterface MenuItemProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className'> {\n icon?: ReactNode;\n trailing?: ReactNode;\n selected?: boolean;\n destructive?: boolean;\n children: ReactNode;\n}\n\nexport function MenuItem({ icon, trailing, selected, destructive, children, ...rest }: MenuItemProps) {\n const classes = [styles.item, selected && styles.selected, destructive && styles.destructive]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button type=\"button\" role=\"menuitem\" className={classes} {...rest}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{children}</span>\n {trailing && <span className={styles.trailing}>{trailing}</span>}\n {selected && (\n <span className={styles.check}>\n <Check />\n </span>\n )}\n </button>\n );\n}\n",".field {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.label {\n font-size: 0.85rem;\n font-weight: 550;\n color: var(--text-primary);\n padding-left: 8px;\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: 10px;\n}\n.sm.trigger {\n padding: 8px 12px;\n font-size: 0.8rem;\n}\n.base {\n border-radius: 12px;\n}\n.base.trigger {\n padding: 12px 14px;\n font-size: 0.9rem;\n}\n.lg {\n border-radius: 14px;\n}\n.lg.trigger {\n padding: 16px 16px;\n font-size: 1rem;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-right: 8px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n.value {\n flex: 1;\n min-width: 0;\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.placeholder {\n color: var(--text-tertiary);\n}\n.chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 8px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n transition: transform 0.15s ease-out;\n}\n.chevron svg {\n width: 100%;\n height: 100%;\n}\n.chevronOpen {\n transform: rotate(180deg);\n}\n\n.menuWrap {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n z-index: 10;\n}\n.helperText {\n font-size: 0.78rem;\n color: var(--text-tertiary);\n padding-left: 8px;\n}\n.errorText {\n font-size: 0.78rem;\n color: var(--danger-text);\n}\n","import { useEffect, useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport { Menu } from './Menu';\nimport { MenuItem } from './MenuItem';\nimport styles from './Dropdown.module.css';\n\ntype DropdownSize = 'sm' | 'base' | 'lg';\n\ninterface DropdownOption<T extends string> {\n value: T;\n label: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\ninterface DropdownProps<T extends string> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: DropdownSize;\n placeholder?: string;\n options: DropdownOption<T>[];\n value?: T;\n onChange: (value: T) => void;\n disabled?: boolean;\n}\n\nexport function Dropdown<T extends string>({\n label,\n helperText,\n error,\n size = 'base',\n placeholder = 'Select…',\n options,\n value,\n onChange,\n disabled,\n}: DropdownProps<T>) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerId = useId();\n\n const selected = options.find((opt) => opt.value === value);\n const enabledValues = options.filter((opt) => !opt.disabled).map((opt) => opt.value);\n\n useEffect(() => {\n if (!open) return;\n const focusValue = value ?? enabledValues[0];\n const el = rootRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${focusValue}\"]`);\n el?.focus();\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function onPointerDown(e: PointerEvent) {\n if (!rootRef.current?.contains(e.target as Node)) setOpen(false);\n }\n function onKeyDown(e: globalThis.KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKeyDown);\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n function handleTriggerKeyDown(e: KeyboardEvent<HTMLButtonElement>) {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n return;\n }\n if (e.key === 'Escape') setOpen(false);\n }\n\n function handleOptionKeyDown(e: KeyboardEvent<HTMLButtonElement>, currentValue: T) {\n const currentIndex = enabledValues.indexOf(currentValue);\n if (currentIndex === -1) return;\n\n let nextIndex: number | null = null;\n if (e.key === 'ArrowDown') nextIndex = (currentIndex + 1) % enabledValues.length;\n if (e.key === 'ArrowUp') nextIndex = (currentIndex - 1 + enabledValues.length) % enabledValues.length;\n if (e.key === 'Home') nextIndex = 0;\n if (e.key === 'End') nextIndex = enabledValues.length - 1;\n\n if (nextIndex !== null) {\n e.preventDefault();\n const nextValue = enabledValues[nextIndex];\n const el = rootRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${nextValue}\"]`);\n el?.focus();\n return;\n }\n if (e.key === 'Escape') setOpen(false);\n }\n\n return (\n <div className={styles.field} ref={rootRef}>\n {label && (\n <label className={styles.label} htmlFor={triggerId}>\n {label}\n </label>\n )}\n <button\n id={triggerId}\n type=\"button\"\n className={`${styles.trigger} ${styles[size]} ${error ? styles.errorWrap : ''}`}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n disabled={disabled}\n onClick={() => setOpen((v) => !v)}\n onKeyDown={handleTriggerKeyDown}\n >\n {selected?.icon && <span className={styles.icon}>{selected.icon}</span>}\n <span className={`${styles.value} ${!selected ? styles.placeholder : ''}`}>\n {selected ? selected.label : placeholder}\n </span>\n <span className={`${styles.chevron} ${open ? styles.chevronOpen : ''}`}>\n <ChevronDown />\n </span>\n </button>\n {open && (\n <div className={styles.menuWrap}>\n <Menu role=\"listbox\" style={{ width: '100%' }}>\n {options.map((opt) => (\n <MenuItem\n key={opt.value}\n data-value={opt.value}\n role=\"option\"\n aria-selected={opt.value === value}\n icon={opt.icon}\n selected={opt.value === value}\n disabled={opt.disabled}\n onClick={() => {\n onChange(opt.value);\n setOpen(false);\n }}\n onKeyDown={(e) => handleOptionKeyDown(e, opt.value)}\n >\n {opt.label}\n </MenuItem>\n ))}\n </Menu>\n </div>\n )}\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helperText}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n",".highlight {\n background: var(--brand-bg);\n color: var(--brand-dark);\n border-radius: 3px;\n padding: 0 1px;\n}\n","import { Fragment } from 'react';\nimport styles from './HighlightText.module.css';\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function HighlightText({ text, query }: { text: string; query: string }) {\n if (!query) return <>{text}</>;\n\n const parts = text.split(new RegExp(`(${escapeRegExp(query)})`, 'ig'));\n return (\n <>\n {parts.map((part, i) =>\n part.toLowerCase() === query.toLowerCase() ? (\n <mark key={i} className={styles.highlight}>\n {part}\n </mark>\n ) : (\n <Fragment key={i}>{part}</Fragment>\n ),\n )}\n </>\n );\n}\n",".group {\n position: relative;\n}\n.btn {\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n border-radius: 12px;\n padding: 12px;\n font-family: inherit;\n font-size: 1rem;\n color: var(--text-primary);\n cursor: pointer;\n transition:\n background 0.2s ease-out,\n box-shadow 0.2s ease-out,\n transform 0.2s ease-out;\n}\n.btn:hover {\n background: rgba(10, 10, 11, 0.04);\n}\n.btn:active {\n background: var(--brand-bg);\n box-shadow: inset 0 2px 1px 0 rgba(0, 140, 216, 0.25);\n transform: scale(0.95);\n}\n.caret {\n color: var(--text-tertiary);\n display: flex;\n align-items: center;\n}\n.caret svg {\n width: 14px;\n height: 14px;\n}\n.label {\n color: var(--text-secondary);\n}\n.badge {\n position: absolute;\n top: 2px;\n right: 2px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 999px;\n background: var(--brand-main, #0a84d8);\n color: #fff;\n font-size: 0.65rem;\n font-weight: 600;\n line-height: 16px;\n text-align: center;\n}\n.value {\n color: var(--text-primary);\n font-weight: 500;\n}\n.panel {\n display: none;\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n background: #fff;\n border-radius: 12px;\n min-width: 220px;\n width: fit-content;\n max-height: 280px;\n overflow-y: auto;\n box-shadow:\n inset 0 0 0 1px var(--border),\n 0 8px 24px rgba(0, 0, 0, 0.12);\n z-index: 50;\n}\n.panel.open {\n display: block;\n}\n.panelRight {\n left: auto;\n right: 0;\n}\n.panelWide {\n min-width: 260px;\n padding-bottom: 4px;\n}\n.sectionHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 12px 14px 4px;\n}\n.sectionLabel {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.02em;\n}\n.allToggle {\n background: none;\n border: none;\n padding: 0;\n font-family: inherit;\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--brand-main, #0a84d8);\n cursor: pointer;\n}\n.allToggle:hover {\n text-decoration: underline;\n}\n.divider {\n height: 1px;\n background: var(--border);\n margin: 4px 0;\n}\n.option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px;\n border-radius: 8px;\n font-size: 1rem;\n cursor: pointer;\n}\n.option:hover {\n background: var(--bg);\n}\n.search {\n width: calc(100% - 16px);\n box-sizing: border-box;\n border: none;\n box-shadow: inset 0 0 0 1px var(--border-input);\n border-radius: 8px;\n padding: 8px 12px;\n margin: 8px;\n font-family: inherit;\n font-size: 1rem;\n margin-bottom: 0;\n}\n.search:focus {\n outline: none;\n box-shadow: inset 0 0 0 1px var(--brand-main);\n}\n.optionsList {\n padding: 4px 4px;\n}\n.empty {\n padding: 7px 8px;\n color: var(--text-tertiary);\n font-size: 0.85rem;\n}\n","import { useState } from 'react';\nimport { Checkbox } from './Checkbox';\nimport styles from './FilterSection.module.css';\n\ninterface FilterSectionProps<T extends string> {\n label: string;\n options: T[];\n optionLabel: (opt: T) => string;\n activeSet: Set<T>;\n onToggle: (opt: T) => void;\n onSetAll?: (opts: T[]) => void;\n searchable?: boolean;\n}\n\nexport function FilterSection<T extends string>({\n label,\n options,\n optionLabel,\n activeSet,\n onToggle,\n onSetAll,\n searchable,\n}: FilterSectionProps<T>) {\n const [query, setQuery] = useState('');\n\n const q = query.trim().toLowerCase();\n const matches = q ? options.filter((opt) => optionLabel(opt).toLowerCase().includes(q)) : options;\n const allSelected = options.length > 0 && activeSet.size === options.length;\n\n return (\n <div>\n <div className={styles.sectionHeader}>\n <div className={styles.sectionLabel}>{label}</div>\n {onSetAll && (\n <button\n type=\"button\"\n className={styles.allToggle}\n onClick={() => onSetAll(allSelected ? [] : options)}\n >\n {allSelected ? 'Deselect all' : 'Select all'}\n </button>\n )}\n </div>\n {searchable && (\n <input\n type=\"text\"\n className={styles.search}\n placeholder={`Search ${label.toLowerCase()}…`}\n autoComplete=\"off\"\n value={query}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => setQuery(e.target.value)}\n />\n )}\n <div className={styles.optionsList}>\n {matches.length === 0 && <div className={styles.empty}>No match</div>}\n {matches.map((opt) => (\n <label key={opt} className={styles.option}>\n <Checkbox checked={activeSet.has(opt)} onChange={() => onToggle(opt)} />\n <span>{optionLabel(opt)}</span>\n </label>\n ))}\n </div>\n </div>\n );\n}\n",".sidebar {\n width: 256px;\n flex: 0 0 256px;\n border-radius: 16px 16px 0 0;\n box-shadow:\n 1px 0 0 rgba(10, 10, 11, 0.03),\n 0 -1px 0 rgba(10, 10, 11, 0.05);\n background: var(--surface-sunken);\n padding: 24px 16px 24px 24px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 4px;\n overflow-y: auto;\n}\n.title {\n font-weight: 500;\n font-size: 1.15rem;\n letter-spacing: -0.01em;\n margin: 0 0 16px 8px;\n}\n.navLink {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 8px;\n border-radius: 8px;\n color: var(--text-secondary);\n text-decoration: none;\n font-size: 0.9rem;\n font-weight: 500;\n}\n.navLink:hover {\n background: var(--card-surface);\n color: var(--text-primary);\n}\n.count {\n color: var(--text-tertiary);\n font-size: 0.78rem;\n font-weight: 500;\n}\n","import styles from './UiElementsSidebar.module.css';\n\ninterface UiElementsSidebarProps {\n sections: { id: string; label: string; count: number }[];\n}\n\nexport function UiElementsSidebar({ sections }: UiElementsSidebarProps) {\n return (\n <aside className={styles.sidebar}>\n <div className={styles.title}>UI Elements</div>\n {sections.map((section) => (\n <a key={section.id} href={`#${section.id}`} className={styles.navLink}>\n <span>{section.label}</span>\n <span className={styles.count}>{section.count}</span>\n </a>\n ))}\n </aside>\n );\n}\n",".line,\n.box {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.tab {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: none;\n border-radius: 8px 8px 0 0;\n font-family: inherit;\n font-weight: 450;\n cursor: pointer;\n white-space: nowrap;\n transition: color 0.15s ease-out, background 0.15s ease-out, box-shadow 0.15s ease-out;\n}\n\n.tab::before {\n content: '';\n position: absolute;\n left: 50%;\n bottom: 0;\n width: 40%;\n aspect-ratio: 1;\n border-radius: 50%;\n transform: translate(-50%, 100%) scale(1);\n transition: transform 0.3s cubic-bezier(0.39, 0.575, 0.565, 1);\n z-index: -1;\n pointer-events: none;\n background: rgba(var(--brand-main-rgb), 0.16);\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 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 6px;\n font-size: 1rem;\n color: var(--text-secondary);\n box-shadow: inset 0 -2px 0 0 transparent;\n}\n.line .tab:hover:not(:disabled) {\n color: var(--brand-main);\n}\n.line .tab.selected {\n color: var(--text-primary);\n box-shadow: inset 0 -2px 0 0 var(--brand-main);\n font-weight: 550;\n}\n\n/* Box variant */\n\n.box {\n background: rgba(16, 24, 32, 0.04);\n border-radius: 10px;\n padding: 4px;\n gap: 4px;\n}\n\n.box .tab {\n border-radius: 8px;\n padding: 8px 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 background: var(--card-surface);\n color: var(--text-primary);\n box-shadow: 0 0 1px 0.5px var(--border);\n font-weight: 550;\n}\n\n.box.sm .tab {\n border-radius: 8px;\n padding: 4px 14px;\n}\n","import type { KeyboardEvent, ReactNode } 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 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 role=\"tablist\"\n className={[styles[variant], variant === 'box' && size === 'sm' && styles.sm]\n .filter(Boolean)\n .join(' ')}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {items.map((item) => {\n const selected = item.value === value;\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n disabled={item.disabled}\n tabIndex={selected ? 0 : -1}\n className={[styles.tab, selected && styles.selected].filter(Boolean).join(' ')}\n onClick={() => !item.disabled && onChange(item.value)}\n >\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {item.label}\n </button>\n );\n })}\n </div>\n );\n}\n","export function formatDuration(mins: number): string {\n const h = Math.floor(mins / 60);\n const m = mins % 60;\n return `${h}h:${String(m).padStart(2, '0')}m`;\n}\n\n/** HH:MM:SS — seconds are a stable per-video display detail, not tracked in the data model. */\nexport function formatDurationHMS(mins: number, seconds: number): string {\n const h = Math.floor(mins / 60);\n const m = mins % 60;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(seconds)}`;\n}\n"],"x_google_ignoreList":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],"mappings":";;;;;;;;;;;;;;;ACgBA,SAAgB,EAAO,EACrB,aAAU,WACV,UAAO,QACP,gBACA,iBACA,aACA,GAAG,KACW;CACd,IAAM,IAAW,CAAC,KAAY,EAAQ;CACtC,OACE,kBAAC,UAAD;EACE,MAAK;EACL,WAAW,GAAG,EAAO,GAAS,GAAG,EAAO,KAAQ,IAAW,IAAI,EAAO,aAAa;EACnF,GAAI;EAHN,UAAA;GAKG,KAAe,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAO,UAAA;GAAkB,CAAA;GAChE;GACA,KAAgB,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAO,UAAA;GAAmB,CAAA;EAC7D;;AAEZ;;;;;;;;;;;;;AEjBA,SAAgB,EAAK,EACnB,YACA,cACA,gBACA,cACA,aACA,UACA,aACA,GAAG,KACS;CACZ,OACE,kBAAC,OAAD;EAAK,WAAW,GAAG,EAAO,KAAK,GAAG,IAAQ,EAAO,QAAQ;EAAzD,UAAA,CACG,KAAW,kBAAC,OAAD,EAAK,WAAW,GAAG,EAAO,QAAQ,GAAG,IAAY,EAAO,YAAY,KAAO,CAAA,GACvF,kBAAC,OAAD;GACE,WAAW;IACT,EAAO;IACP,IAAY,EAAO,YAAY;IAC/B,IAAc,EAAO,cAAc;IACnC,IAAY,EAAO,YAAY;IAC/B,IAAW,EAAO,WAAW;GAC/B,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;GACX,GAAI;GAEH;EACE,CAAA,CACF;;AAET;;;;;;;;;;;AEtCA,SAAgB,EAAI,EAAE,aAAU,WAAW,aAAU,GAAG,KAAkB;CACxE,OACE,kBAAC,QAAD;EAAM,WAAW,EAAO;EAAU,GAAI;EACnC;CACG,CAAA;AAEV;;;ACTA,IAAM,KAAe,MAAW,GAAQ,QAAQ,sBAAsB,OAAO,CAAC,CAAC,YAAY;;;ACE3F,SAAS,EAAiB,GAAU,GAAU,IAAU,CAAC,GAAG;CAC1D,IAAI,KAAY,MACd,MAAU,MAAM,uDAAuD;CAEzE,OAAO;EACL,MAAM,EAAY,CAAQ;EAC1B,MAAM;EACN,MAAM;EACN,GAAG,EAAQ,SAAS,IAAI,EAAE,WAAQ,IAAI,CAAC;CACzC;AACF;;;ACZA,IAAM,KAAe,MAAW;CAC9B,IAAI,IAAM,IACN,IAAY;CAChB,KAAK,IAAM,KAAM,GAAQ;EACvB,IAAI,MAAO,OAAO,MAAO,OAAO,KAAM,KAAK;GACzC,IAAY,EAAI,SAAS;GACzB;EACF;EAMA,AALI,EAAI,WAAW,IACjB,KAAO,EAAG,YAAY,IAEtB,KAAO,IAAY,EAAG,YAAY,IAAI,GAExC,IAAY;CACd;CACA,OAAO;AACT,GCdM,KAAgB,MAAW;CAC/B,IAAM,IAAY,EAAY,CAAM;CACpC,OAAO,EAAU,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,EAAU,MAAM,CAAC;AAC9D,GCLM,KAAgB,GAAG,MAAY,EAAQ,QAAQ,GAAW,GAAO,MAC9D,EAAQ,KAAc,EAAU,KAAK,MAAM,MAAM,EAAM,QAAQ,CAAS,MAAM,CACtF,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GCFZ,IAAoB;CACxB,OAAO;CACP,OAAO;CACP,QAAQ;CACR,SAAS;CACT,MAAM;CACN,QAAQ;CACR,gBAAgB;CAChB,kBAAkB;CAClB,mBAAmB;AACrB;;;ACPA,SAAS,EAAU,GAAO;CACxB,OAAO,KAAU;AACnB;AACA,SAAS,EAAoB,GAAM,IAAS,CAAC,GAAG;CAC9C,IAAM,IAAiB,EAAO,kBAAkB,CAAC,GAC3C,KAAoB,MAAkB,EAAe,MAAkB,GACvE,IAAe,EAAK,QAAQ,EAAK,SAAS,EAAkB,OAC5D,IAAgB,EAAK,QAAQ,EAAK,UAAU,EAAkB,QAC9D,IAAkB,EAAK,SAAS,QAAQ,MAAU,OAAO,KAAU,YAAY,EAAM,KAAK,MAAM,EAAE,CAAC,CAAC,KAAK,MAAU,UAAU,GAAO,KAAK,CAAC,GAC1I,IAAiB,CAAC,GAAG,EAAK,OAAO,CAAC,UAAU,EAAK,MAAM,IAAI,CAAC,GAAG,GAAG,CAAe,GACjF,IAA0B,EAAO,WAAW,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,KAAK,CAAC,GAC3E,IAAY,EAAO,0BAA0B,KAAQ,EAAa,GAAG,CAAuB,IAAI,EAAa,UAAU,GAAG,GAAgB,GAAG,CAAuB,GACpK,IAAwB,EAAO,sBAAsB,OAAO,EAAO,eAAe,EAAkB,eAAe,IAAI,OAAO,EAAK,QAAQ,EAAK,SAAS,EAAkB,KAAQ,IAAI,OAAO,EAAO,QAAQ,EAAO,SAAS,EAAkB,KAAQ,IAAI,EAAO,eAAe,EAAkB;CA6BzS,OAAO;EACL;EACA;GA7BA,GAAG,OAAO,QAAQ,CAAiB,CAAC,CAAC,QAAQ,GAAO,CAAC,GAAU,QAC7D,EAAM,EAAiB,CAAQ,KAAK,GAC7B,IACN,CAAC,CAAC;GACL,GAAG,WAAW,KAAU,EAAO,SAAS,GACrC,EAAiB,QAAQ,IAAI,EAAO,MACvC;GACA,GAAG,UAAU,KAAU,EAAU,EAAO,IAAI,KAAK;KAC9C,EAAiB,OAAO,IAAI,EAAO;KACnC,EAAiB,QAAQ,IAAI,EAAO;GACvC;GACA,GAAG,WAAW,KAAU,EAAU,EAAO,KAAK,KAAK,GAChD,EAAiB,OAAO,IAAI,EAAO,MACtC;GACA,GAAG,YAAY,KAAU,EAAU,EAAO,MAAM,KAAK,GAClD,EAAiB,QAAQ,IAAI,EAAO,OACvC;IACC,EAAiB,cAAc,IAAI;GACpC,GAAG,KAAa,GACb,EAAiB,OAAO,IAAI,EAC/B;IACC,EAAiB,SAAS,IAAI,OAAO,EAAa,GAAG;GACtD,GAAG,EAAO,gBAAgB,KAAQ,GAC/B,EAAiB,aAAa,IAAI,OACrC,IAAI,CAAC;GACL,GAAG,gBAAgB,KAAU,EAAO;EAI3B;EACT,EAAK,KAAK,KAAK,MAAU;GACvB,IAAM,CAAC,GAAM,GAAO,KAAY,GAC1B,IAAY,EAAO,mBAAmB;KAAG,EAAiB,eAAe,IAAI;IAAsB,GAAG;GAAM,IAAI;GACtH,OAAO,IAAW;IAAC;IAAM;IAAW;GAAQ,IAAI,CAAC,GAAM,CAAS;EAClE,CAAC;CACH;AACF;;;ACnDA,SAAS,EAAwB,GAAM,IAAS,CAAC,GAAG;CAClD,OAAO,EAAoB,GAAM;EAC/B,GAAG;EACH,gBAAgB;GACd,GAAG,EAAO;GACV,OAAO;GACP,gBAAgB;GAChB,kBAAkB;GAClB,mBAAmB;GACnB,iBAAiB;EACnB;CACF,CAAC;AACH;;;ACdA,IAAM,KAAe,MAAU;CAC7B,KAAK,IAAM,KAAQ,GACjB,IAAI,EAAK,WAAW,OAAO,KAAK,MAAS,UAAU,MAAS,SAC1D,OAAO;CAGX,OAAO;AACT,GCHM,IAAgB,EAAc,CAAC,CAAC,GAuBhC,WAAyB,EAAW,CAAa,GCnBjD,IAAO,GACV,EACC,UACA,SACA,UACA,WACA,gBACA,wBACA,qBACA,eAAY,IACZ,aACA,cAAW,CAAC,GACZ,UAAO;CACL,MAAM;CACN,SAAS,CAAC;CACV,MAAM;AACR,GACA,GAAG,KACF,MAAQ;CACT,IAAM,EACJ,MAAM,IAAc,IACpB,aAAa,IAAqB,GAClC,qBAAqB,IAA6B,IAClD,kBAAkB,IAA0B,IAC5C,OAAO,IAAe,gBACtB,WAAW,IAAe,OACxB,GAAiB,KAAK,CAAC,GACrB,IAAoB,EAAQ,KAAa,EAAY,CAAI,GACzD,CAAC,GAAM,GAAe,IAAgB,CAAC,KAAK,EAAwB,GAAM;EAC9E,OAAO,KAAS;EAChB,OAAO,KAAS,KAAQ;EACxB,QAAQ,KAAU,KAAQ;EAC1B,aAAa,KAAe;EAC5B,qBAAqB,KAAuB;EAC5C,kBAAkB,KAAoB;EACtC,WAAW,EAAa,GAAc,CAAS;EAC/C,aAAa;EACb,YAAY;CACd,CAAC;CACD,OAAO,EACL,GACA;EACE;EACA,GAAG;CACL,GACA,CACE,GAAG,EAAc,KAAK,CAAC,GAAK,OAAW,EAAc,GAAK,CAAK,CAAC,GAChE,GAAG,MAAM,QAAQ,CAAQ,IAAI,IAAW,CAAC,CAAQ,CACnD,CACF;AACF,CACF;;;ACtDA,SAAS,EAAiB,GAAgB,IAAW,CAAC,GAAG,IAAU,CAAC,GAAG;CACrE,IAAM,IAAW,OAAO,KAAmB,WAAW,EAAiB,GAAgB,GAAU,CAAO,IAAI,GACtG,IAAY,GACf,EAAE,cAAW,GAAG,KAAS,MAAQ,EAAc,GAAM;EACpD;EACA,MAAM;EACN;EACA,GAAG;CACL,CAAC,CACH;CAIA,OAHI,EAAS,SACX,EAAU,cAAc,EAAa,EAAS,IAAI,IAE7C;AACT;;;ACjBA,IAAMA,IAAa;CACjB,MAAM;CACN,MAAM;CACN,MAAM,CAAC,CAAC,QAAQ;EAAE,GAAG;EAAmB,KAAK;CAAS,CAAC,CAAC;AAC1D;AACAA,EAAW;AACX,IAAM,KAAQ,EAAiBA,CAAU,GCNnCC,IAAa;CACjB,MAAM;CACN,MAAM;CACN,MAAM,CAAC,CAAC,QAAQ;EAAE,GAAG;EAAgB,KAAK;CAAS,CAAC,CAAC;AACvD;AACAA,EAAW;AACX,IAAM,IAAc,EAAiBA,CAAU,GCNzC,IAAa;CACjB,MAAM;CACN,MAAM;CACN,MAAM,CACJ,CAAC,QAAQ;EAAE,GAAG;EAAoB,KAAK;CAAS,CAAC,GACjD,CAAC,UAAU;EAAE,IAAI;EAAM,IAAI;EAAM,GAAG;EAAK,KAAK;CAAS,CAAC,CAC1D;AACF;AACA,EAAW;AACX,IAAM,IAAS,EAAiB,CAAU;;;;;;;;;;AEF1C,SAAgB,EAAQ,EACtB,gBACA,mBACA,iBAAc,WACd,mBAAgB,MAChB,iBAAc,KACd,eACe;CACf,IAAM,IAAY,EAAyB,IAAI;CAa/C,OAXA,QAAgB;EACd,SAAS,EAAU,GAAkB;GACnC,CAAK,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,YAAY,MAAM,EAAY,YAAY,MAC9E,EAAE,eAAe,GACjB,EAAU,SAAS,MAAM;EAE7B;EAEA,OADA,OAAO,iBAAiB,WAAW,CAAS,SAC/B,OAAO,oBAAoB,WAAW,CAAS;CAC9D,GAAG,CAAC,CAAW,CAAC,GAGd,kBAAC,OAAD;EAAK,WAAW,EAAO;EAAvB,UAAA,CACE,kBAAC,OAAD;GAAK,WAAW,EAAO;GAAvB,UAAA;IACE,kBAAC,QAAD;KAAM,WAAW,EAAO;KACtB,UAAA,kBAAC,GAAD,CAAS,CAAA;IACL,CAAA;IACN,kBAAC,SAAD;KACE,KAAK;KACL,MAAK;KACL,WAAW,EAAO;KACL;KACb,cAAa;KACb,OAAO;KACP,WAAW,MAAqC,IAAiB,EAAE,OAAO,KAAK;IAChF,CAAA;IACA,KACC,kBAAC,QAAD;KAAM,WAAW,EAAO;KAAgB,eAAY;KACjD,UAAA;IACG,CAAA;GAEL;EACJ,CAAA,GAAA,KAAY,kBAAC,OAAD;GAAK,WAAW,EAAO;GAAW;EAAc,CAAA,CAC1D;;AAET;;;;;;;;;AEnDA,SAAgB,EAAS,EAAE,YAAS,aAAU,cAAW,gBAA4B;CACnF,OACE,kBAAC,SAAD;EAAO,WAAW,GAAG,EAAO,SAAS,GAAG,KAAa;EAArD,UAAA,CACE,kBAAC,SAAD;GACE,MAAK;GACL,WAAW,EAAO;GACT;GACC;GACV,cAAY;EACb,CAAA,GACD,kBAAC,QAAD;GAAM,WAAW,EAAO;GACtB,UAAA,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAM,SAAQ;IAAY,eAAY;IAC3D,UAAA,kBAAC,YAAD,EAAU,QAAO,gBAAiB,CAAA;GAC/B,CAAA;EACD,CAAA,CACD;;AAEX;;;;;;;;;AEfA,SAAgB,GAAY,EAAE,YAAS,aAAU,SAAM,UAAO,cAAW,gBAA+B;CACtG,OACE,kBAAC,SAAD;EAAO,WAAW,GAAG,EAAO,MAAM,GAAG,KAAa;EAAlD,UAAA,CACE,kBAAC,SAAD;GACE,MAAK;GACL,WAAW,EAAO;GACT;GACC;GACJ;GACC;GACP,cAAY;EACb,CAAA,GACD,kBAAC,QAAD;GAAM,WAAW,EAAO;GACtB,UAAA,kBAAC,QAAD,EAAM,WAAW,EAAO,IAAM,CAAA;EAC1B,CAAA,CACD;;AAEX;;;;;;;;;;;;;;;;AEhBA,SAAgB,EAAU,EACxB,UACA,eACA,UACA,UAAO,QACP,gBACA,OACA,GAAG,KACc;CACjB,IAAM,IAAc,EAAM,GACpB,IAAU,KAAM;CAEtB,OACE,kBAAC,OAAD;EAAK,WAAW,EAAO;EAAvB,UAAA;GACG,KACC,kBAAC,SAAD;IAAO,WAAW,EAAO;IAAO,SAAS;IACtC,UAAA;GACI,CAAA;GAET,kBAAC,OAAD;IAAK,WAAW,GAAG,EAAO,UAAU,GAAG,EAAO,GAAM,GAAG,IAAQ,EAAO,YAAY;IAAlF,UAAA,CACG,KAAe,kBAAC,QAAD;KAAM,WAAW,EAAO;KAAO,UAAA;IAAkB,CAAA,GACjE,kBAAC,SAAD;KAAO,IAAI;KAAS,WAAW,EAAO;KAAO,GAAI;IAAO,CAAA,CACrD;;GACJ,IACC,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAY,UAAA;GAAY,CAAA,IAC9C,IACF,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAa,UAAA;GAAiB,CAAA,IACpD;EACD;;AAET;;;;;;;AEpCA,SAAgB,EAAK,EAAE,aAAU,GAAG,KAAmB;CACrD,OACE,kBAAC,OAAD;EAAK,MAAK;EAAO,WAAW,EAAO;EAAM,GAAI;EAC1C;CACE,CAAA;AAET;AAEA,SAAgB,IAAc;CAC5B,OAAO,kBAAC,OAAD;EAAK,WAAW,EAAO;EAAS,MAAK;CAAa,CAAA;AAC3D;;;;;;;;;;;;AELA,SAAgB,EAAS,EAAE,SAAM,aAAU,aAAU,gBAAa,aAAU,GAAG,KAAuB;CACpG,IAAM,IAAU;EAAC,EAAO;EAAM,KAAY,EAAO;EAAU,KAAe,EAAO;CAAW,CAAC,CAC1F,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,OACE,kBAAC,UAAD;EAAQ,MAAK;EAAS,MAAK;EAAW,WAAW;EAAS,GAAI;EAA9D,UAAA;GACG,KAAQ,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAO,UAAA;GAAW,CAAA;GACnD,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAQ;GAAe,CAAA;GAC9C,KAAY,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAW,UAAA;GAAe,CAAA;GAC9D,KACC,kBAAC,QAAD;IAAM,WAAW,EAAO;IACtB,UAAA,kBAAC,IAAD,CAAQ,CAAA;GACJ,CAAA;EAEF;;AAEZ;;;;;;;;;;;;;;;;;;;;AEFA,SAAgB,EAA2B,EACzC,UACA,eACA,UACA,UAAO,QACP,iBAAc,WACd,YACA,UACA,aACA,eACmB;CACnB,IAAM,CAAC,GAAM,KAAW,EAAS,EAAK,GAChC,IAAU,EAAuB,IAAI,GACrC,IAAY,EAAM,GAElB,IAAW,EAAQ,MAAM,MAAQ,EAAI,UAAU,CAAK,GACpD,IAAgB,EAAQ,QAAQ,MAAQ,CAAC,EAAI,QAAQ,CAAC,CAAC,KAAK,MAAQ,EAAI,KAAK;CASnF,AAPA,QAAgB;EACd,IAAI,CAAC,GAAM;EACX,IAAM,IAAa,KAAS,EAAc;EAE1C,CADW,EAAQ,SAAS,cAAiC,gBAAgB,EAAW,GAAG,EAAA,EACvF,MAAM;CACZ,GAAG,CAAC,CAAI,CAAC,GAET,QAAgB;EACd,IAAI,CAAC,GAAM;EACX,SAAS,EAAc,GAAiB;GACtC,AAAK,EAAQ,SAAS,SAAS,EAAE,MAAc,KAAG,EAAQ,EAAK;EACjE;EACA,SAAS,EAAU,GAA6B;GAC9C,AAAI,EAAE,QAAQ,YAAU,EAAQ,EAAK;EACvC;EAGA,OAFA,OAAO,iBAAiB,eAAe,CAAa,GACpD,OAAO,iBAAiB,WAAW,CAAS,SAC/B;GAEX,AADA,OAAO,oBAAoB,eAAe,CAAa,GACvD,OAAO,oBAAoB,WAAW,CAAS;EACjD;CACF,GAAG,CAAC,CAAI,CAAC;CAET,SAAS,EAAqB,GAAqC;EACjE,IAAI,EAAE,QAAQ,eAAe,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;GAE/D,AADA,EAAE,eAAe,GACjB,EAAQ,EAAI;GACZ;EACF;EACA,AAAI,EAAE,QAAQ,YAAU,EAAQ,EAAK;CACvC;CAEA,SAAS,EAAoB,GAAqC,GAAiB;EACjF,IAAM,IAAe,EAAc,QAAQ,CAAY;EACvD,IAAI,MAAiB,IAAI;EAEzB,IAAI,IAA2B;EAM/B,IALI,EAAE,QAAQ,gBAAa,KAAa,IAAe,KAAK,EAAc,SACtE,EAAE,QAAQ,cAAW,KAAa,IAAe,IAAI,EAAc,UAAU,EAAc,SAC3F,EAAE,QAAQ,WAAQ,IAAY,IAC9B,EAAE,QAAQ,UAAO,IAAY,EAAc,SAAS,IAEpD,MAAc,MAAM;GACtB,EAAE,eAAe;GACjB,IAAM,IAAY,EAAc;GAEhC,CADW,EAAQ,SAAS,cAAiC,gBAAgB,EAAU,GAAG,EAAA,EACtF,MAAM;GACV;EACF;EACA,AAAI,EAAE,QAAQ,YAAU,EAAQ,EAAK;CACvC;CAEA,OACE,kBAAC,OAAD;EAAK,WAAW,EAAO;EAAO,KAAK;EAAnC,UAAA;GACG,KACC,kBAAC,SAAD;IAAO,WAAW,EAAO;IAAO,SAAS;IACtC,UAAA;GACI,CAAA;GAET,kBAAC,UAAD;IACE,IAAI;IACJ,MAAK;IACL,WAAW,GAAG,EAAO,QAAQ,GAAG,EAAO,GAAM,GAAG,IAAQ,EAAO,YAAY;IAC3E,iBAAc;IACd,iBAAe;IACL;IACV,eAAe,GAAS,MAAM,CAAC,CAAC;IAChC,WAAW;IARb,UAAA;KAUG,GAAU,QAAQ,kBAAC,QAAD;MAAM,WAAW,EAAO;MAAO,UAAA,EAAS;KAAW,CAAA;KACtE,kBAAC,QAAD;MAAM,WAAW,GAAG,EAAO,MAAM,GAAI,IAAgC,KAArB,EAAO;MACpD,UAAA,IAAW,EAAS,QAAQ;KACzB,CAAA;KACN,kBAAC,QAAD;MAAM,WAAW,GAAG,EAAO,QAAQ,GAAG,IAAO,EAAO,cAAc;MAChE,UAAA,kBAAC,GAAD,CAAc,CAAA;KACV,CAAA;IACA;;GACP,KACC,kBAAC,OAAD;IAAK,WAAW,EAAO;IACrB,UAAA,kBAAC,GAAD;KAAM,MAAK;KAAU,OAAO,EAAE,OAAO,OAAO;KACzC,UAAA,EAAQ,KAAK,MACZ,kBAAC,GAAD;MAEE,cAAY,EAAI;MAChB,MAAK;MACL,iBAAe,EAAI,UAAU;MAC7B,MAAM,EAAI;MACV,UAAU,EAAI,UAAU;MACxB,UAAU,EAAI;MACd,eAAe;OAEb,AADA,EAAS,EAAI,KAAK,GAClB,EAAQ,EAAK;MACf;MACA,YAAY,MAAM,EAAoB,GAAG,EAAI,KAAK;MAEjD,UAAA,EAAI;KACG,GAdH,EAAI,KAcD,CACX;IACG,CAAA;GACH,CAAA;GAEN,IACC,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAY,UAAA;GAAY,CAAA,IAC9C,IACF,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAa,UAAA;GAAiB,CAAA,IACpD;EACD;;AAET;;;;AEtJA,SAAS,GAAa,GAAuB;CAC3C,OAAO,EAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEA,SAAgB,GAAc,EAAE,SAAM,YAA0C;CAC9E,IAAI,CAAC,GAAO,OAAO,kBAAA,GAAA,EAAA,UAAG,EAAO,CAAA;CAE7B,IAAM,IAAQ,EAAK,MAAU,OAAO,IAAI,GAAa,CAAK,EAAE,IAAI,IAAI,CAAC;CACrE,OACE,kBAAA,GAAA,EAAA,UACG,EAAM,KAAK,GAAM,MAChB,EAAK,YAAY,MAAM,EAAM,YAAY,IACvC,kBAAC,QAAD;EAAc,WAAW,EAAO;EAC7B,UAAA;CACG,GAFK,CAEL,IAEN,kBAAC,GAAD,EAAA,UAAmB,EAAe,GAAnB,CAAmB,CAEtC,EACA,CAAA;AAEN;;;;;;;;;;;;;;;;;;;;;;;AEVA,SAAgB,GAAgC,EAC9C,UACA,YACA,gBACA,cACA,aACA,aACA,iBACwB;CACxB,IAAM,CAAC,GAAO,KAAY,EAAS,EAAE,GAE/B,IAAI,EAAM,KAAK,CAAC,CAAC,YAAY,GAC7B,IAAU,IAAI,EAAQ,QAAQ,MAAQ,EAAY,CAAG,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,GACpF,IAAc,EAAQ,SAAS,KAAK,EAAU,SAAS,EAAQ;CAErE,OACE,kBAAC,OAAD,EAAA,UAAA;EACE,kBAAC,OAAD;GAAK,WAAW,EAAO;GAAvB,UAAA,CACE,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAe,UAAA;GAAW,CAAA,GAChD,KACC,kBAAC,UAAD;IACE,MAAK;IACL,WAAW,EAAO;IAClB,eAAe,EAAS,IAAc,CAAC,IAAI,CAAO;IAEjD,UAAA,IAAc,iBAAiB;GAC1B,CAAA,CAEP;;EACJ,KACC,kBAAC,SAAD;GACE,MAAK;GACL,WAAW,EAAO;GAClB,aAAa,UAAU,EAAM,YAAY,EAAE;GAC3C,cAAa;GACb,OAAO;GACP,UAAU,MAAM,EAAE,gBAAgB;GAClC,WAAW,MAAM,EAAS,EAAE,OAAO,KAAK;EACzC,CAAA;EAEH,kBAAC,OAAD;GAAK,WAAW,EAAO;GAAvB,UAAA,CACG,EAAQ,WAAW,KAAK,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAO,UAAA;GAAa,CAAA,GACnE,EAAQ,KAAK,MACZ,kBAAC,SAAD;IAAiB,WAAW,EAAO;IAAnC,UAAA,CACE,kBAAC,GAAD;KAAU,SAAS,EAAU,IAAI,CAAG;KAAG,gBAAgB,EAAS,CAAG;IAAI,CAAA,GACvE,kBAAC,QAAD,EAAA,UAAO,EAAY,CAAG,EAAQ,CAAA,CACzB;GAHK,GAAA,CAGL,CACR,CACE;;CACF,EAAA,CAAA;AAET;;;;;;;;;AE3DA,SAAgB,GAAkB,EAAE,eAAoC;CACtE,OACE,kBAAC,SAAD;EAAO,WAAW,EAAO;EAAzB,UAAA,CACE,kBAAC,OAAD;GAAK,WAAW,EAAO;GAAO,UAAA;EAAgB,CAAA,GAC7C,EAAS,KAAK,MACb,kBAAC,KAAD;GAAoB,MAAM,IAAI,EAAQ;GAAM,WAAW,EAAO;GAA9D,UAAA,CACE,kBAAC,QAAD,EAAA,UAAO,EAAQ,MAAY,CAAA,GAC3B,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAQ,UAAA,EAAQ;GAAY,CAAA,CACnD;EAHK,GAAA,EAAQ,EAGb,CACJ,CACI;;AAEX;;;;;;;;;;;AEIA,SAAgB,GAAK,EAAE,UAAO,UAAO,aAAU,aAAU,QAAQ,UAAO,QAAQ,GAAG,KAAmB;CACpG,IAAM,IAAgB,EAAM,QAAQ,MAAS,CAAC,EAAK,QAAQ,CAAC,CAAC,KAAK,MAAS,EAAK,KAAK;CAErF,SAAS,EAAc,GAAsC;EAC3D,IAAM,IAAe,EAAc,QAAQ,CAAK;EAChD,IAAI,MAAiB,IAAI;EAEzB,IAAI,IAA2B;EAQ/B,AAPI,EAAM,QAAQ,iBAAc,KAAa,IAAe,KAAK,EAAc,SAC3E,EAAM,QAAQ,gBAChB,KAAa,IAAe,IAAI,EAAc,UAAU,EAAc,SAEpE,EAAM,QAAQ,WAAQ,IAAY,IAClC,EAAM,QAAQ,UAAO,IAAY,EAAc,SAAS,IAExD,MAAc,SAChB,EAAM,eAAe,GACrB,EAAS,EAAc,EAAU;CAErC;CAEA,OACE,kBAAC,OAAD;EACE,MAAK;EACL,WAAW,CAAC,EAAO,IAAU,MAAY,SAAS,MAAS,QAAQ,EAAO,EAAE,CAAC,CAC1E,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;EACX,WAAW;EACX,GAAI;EAEH,UAAA,EAAM,KAAK,MAAS;GACnB,IAAM,IAAW,EAAK,UAAU;GAChC,OACE,kBAAC,UAAD;IAEE,MAAK;IACL,MAAK;IACL,iBAAe;IACf,UAAU,EAAK;IACf,UAAU,IAAW,IAAI;IACzB,WAAW,CAAC,EAAO,KAAK,KAAY,EAAO,QAAQ,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;IAC7E,eAAe,CAAC,EAAK,YAAY,EAAS,EAAK,KAAK;IARtD,UAAA,CAUG,EAAK,QAAQ,kBAAC,QAAD;KAAM,WAAW,EAAO;KAAO,UAAA,EAAK;IAAW,CAAA,GAC5D,EAAK,KACA;GAXD,GAAA,EAAK,KAWJ;EAEZ,CAAC;CACE,CAAA;AAET;;;ACxEA,SAAgB,GAAe,GAAsB;CACnD,IAAM,IAAI,KAAK,MAAM,IAAO,EAAE,GACxB,IAAI,IAAO;CACjB,OAAO,GAAG,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE;AAC7C;AAGA,SAAgB,GAAkB,GAAc,GAAyB;CACvE,IAAM,IAAI,KAAK,MAAM,IAAO,EAAE,GACxB,IAAI,IAAO,IACX,KAAO,MAAc,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;CACpD,OAAO,GAAG,EAAI,CAAC,EAAE,GAAG,EAAI,CAAC,EAAE,GAAG,EAAI,CAAO;AAC3C"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["__iconData","__iconData"],"sources":["../src/components/Button.module.css","../src/components/Button.tsx","../src/components/Card.module.css","../src/components/Card.tsx","../src/components/Tag.module.css","../src/components/Tag.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toLucideIconData.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs","../node_modules/lucide-react/dist/esm/shared/src/build/defaultAttributes.mjs","../node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconNode.mjs","../node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconForReact.mjs","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs","../node_modules/lucide-react/dist/esm/context.mjs","../node_modules/lucide-react/dist/esm/Icon.mjs","../node_modules/lucide-react/dist/esm/createLucideIcon.mjs","../node_modules/lucide-react/dist/esm/icons/check.mjs","../node_modules/lucide-react/dist/esm/icons/chevron-down.mjs","../node_modules/lucide-react/dist/esm/icons/search.mjs","../src/components/Toolbar.module.css","../src/components/Toolbar.tsx","../src/components/Checkbox.module.css","../src/components/Checkbox.tsx","../src/components/RadioButton.module.css","../src/components/RadioButton.tsx","../src/components/TextField.module.css","../src/components/TextField.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/UiElementsSidebar.module.css","../src/components/UiElementsSidebar.tsx","../src/components/Tabs.module.css","../src/components/Tabs.tsx","../src/utils/format.ts"],"sourcesContent":[".primary,\n.secondary,\n.tertiary,\n.dangerous {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n border: none;\n font-family: inherit;\n font-weight: 450;\n letter-spacing: 0.01em;\n cursor: pointer;\n transition:\n color 0.2s ease,\n transform 0.2s ease-out;\n}\n.primary:active:not(:disabled),\n.secondary:active:not(:disabled),\n.tertiary:active:not(:disabled),\n.dangerous:active:not(:disabled) {\n transform: scale(0.95);\n}\n\n.sm {\n border-radius: 10px;\n padding: 8px 12px;\n font-size: 0.8rem;\n}\n.base {\n border-radius: 12px;\n padding: 12px 16px;\n font-size: 0.9rem;\n}\n.lg {\n border-radius: 14px;\n padding: 16px 22px;\n font-size: 1rem;\n}\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 svg {\n width: 100%;\n height: 100%;\n}\n\n.iconOnly {\n aspect-ratio: 1;\n box-sizing: border-box;\n}\n.iconOnly.sm {\n padding: 8px;\n}\n.iconOnly.base {\n padding: 12px;\n}\n.iconOnly.lg {\n padding: 16px;\n}\n.primary::before,\n.secondary::before,\n.tertiary::before,\n.dangerous::before {\n content: '';\n position: absolute;\n left: 50%;\n bottom: 0;\n width: 24%;\n aspect-ratio: 1;\n border-radius: 50%;\n transform: translate(-50%, 100%) scale(1);\n transition: transform 0.3s cubic-bezier(0.39, 0.575, 0.565, 1);\n z-index: -1;\n pointer-events: none;\n}\n.primary:hover::before,\n.secondary:hover::before,\n.tertiary:hover::before,\n.dangerous:hover::before {\n transform: translate(-50%, 15%) scale(8);\n}\n\n.primary {\n background: var(--brand-dark);\n color: #fff;\n font-weight: 400;\n letter-spacing: 0.02em;\n}\n.primary::before {\n background: rgba(255, 255, 255, 0.08);\n}\n.primary:active:not(:disabled)::before {\n background: rgba(0, 0, 0, 0.08);\n}\n\n.secondary {\n background: var(--surface-muted);\n color: var(--text-primary);\n}\n.secondary .icon {\n color: var(--text-secondary);\n}\n.secondary::before {\n background: rgba(var(--brand-main-rgb), 0.08);\n}\n.secondary:active:not(:disabled)::before {\n background: rgba(var(--brand-main-rgb), 0.28);\n}\n.secondary:hover .icon {\n color: var(--brand-main);\n}\n.secondary:hover {\n color: var(--brand-main);\n}\n\n.tertiary {\n background: transparent;\n color: var(--text-secondary);\n}\n.tertiary::before {\n background: rgba(var(--brand-main-rgb), 0.16);\n}\n.tertiary:active:not(:disabled)::before {\n background: rgba(var(--brand-main-rgb), 0.28);\n}\n.tertiary:hover,\n.tertiary:active:not(:disabled) {\n background: var(--bg);\n}\n.tertiary:hover {\n color: var(--brand-main);\n}\n\n.dangerous {\n background: var(--danger-bg);\n color: var(--danger-text-dark);\n}\n.dangerous::before {\n background: rgba(var(--danger-rgb), 0.16);\n}\n.dangerous:active:not(:disabled)::before {\n background: rgba(var(--danger-rgb), 0.28);\n}\n\n.primary:disabled,\n.secondary:disabled,\n.tertiary:disabled,\n.dangerous:disabled {\n background: var(--disabled-bg);\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.primary:disabled:hover,\n.secondary:disabled:hover,\n.tertiary:disabled:hover,\n.dangerous:disabled:hover {\n color: var(--disabled-text);\n}\n.primary:disabled::before,\n.secondary:disabled::before,\n.tertiary:disabled::before,\n.dangerous:disabled::before {\n display: none;\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport styles from './Button.module.css';\n\ntype ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'dangerous';\ntype ButtonSize = 'sm' | 'base' | 'lg';\n\ninterface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className'> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Icon shown before the label. Omit `children` to render an icon-only square button — pass `aria-label` in that case. */\n leadingIcon?: ReactNode;\n /** Icon shown after the label. */\n trailingIcon?: ReactNode;\n children?: ReactNode;\n}\n\nexport function Button({\n variant = 'primary',\n size = 'base',\n leadingIcon,\n trailingIcon,\n children,\n ...rest\n}: ButtonProps) {\n const iconOnly = !children && Boolean(leadingIcon);\n return (\n <button\n type=\"button\"\n className={`${styles[variant]} ${styles[size]}${iconOnly ? ` ${styles.iconOnly}` : ''}`}\n {...rest}\n >\n {leadingIcon && <span className={styles.icon}>{leadingIcon}</span>}\n {children}\n {trailingIcon && <span className={styles.icon}>{trailingIcon}</span>}\n </button>\n );\n}\n",".wrap {\n position: relative;\n width: 220px;\n flex: 0 0 220px;\n}\n.wrap:hover {\n z-index: 10;\n}\n.fluid {\n width: 100%;\n flex: none;\n}\n\n.backing {\n position: absolute;\n left: 6px;\n right: 6px;\n bottom: -4px;\n height: 10px;\n background: var(--card-surface);\n box-shadow: inset 0 0 0 1px var(--border);\n border-radius: 0 0 14px 14px;\n z-index: 0;\n}\n.backing.completed {\n background: var(--success-bg);\n box-shadow: inset 0 0 0 1px #bfe3cc;\n}\n\n.card {\n position: relative;\n z-index: 1;\n width: 100%;\n box-sizing: border-box;\n background: var(--card-surface);\n box-shadow:\n inset 0 0 0 1px #efefef,\n 0 1px 2px rgba(16, 24, 32, 0.04);\n border-radius: 16px;\n padding: 12px 14px;\n cursor: default;\n transition: box-shadow 0.2s;\n}\n.card.interactive {\n cursor: pointer;\n}\n.card.grabbable {\n cursor: grab;\n}\n.card.grabbable:active {\n cursor: grabbing;\n}\n.card.dragging,\n.card.dragging:hover {\n box-shadow:\n inset 0 0 0 1px #efefef,\n 0 1px 2px rgba(16, 24, 32, 0.04);\n}\n.card.interactive:hover {\n box-shadow:\n inset 0 0 0 1px #efefef,\n 0 0 0 2px var(--brand-main);\n}\n.card.completed {\n background: var(--success-bg);\n box-shadow:\n inset 0 0 0 1px #bfe3cc,\n 0 1px 2px rgba(16, 24, 32, 0.04),\n 0 2px 8px rgba(16, 24, 32, 0.06);\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport styles from './Card.module.css';\n\ninterface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'className'> {\n /** Shows a second sheet behind the card, for representing a stack/batch. */\n stacked?: boolean;\n /** Success-tinted surface, e.g. a completed task. */\n completed?: boolean;\n /** Adds pointer cursor + accent hover ring. */\n interactive?: boolean;\n /** Grab cursor, for drag sources — pair with `interactive`. */\n draggable?: boolean;\n /** Suppresses the hover ring while a drag is in progress. */\n dragging?: boolean;\n /** Card fills its container width instead of a fixed width. */\n fluid?: boolean;\n children: ReactNode;\n}\n\nexport function Card({\n stacked,\n completed,\n interactive,\n draggable,\n dragging,\n fluid,\n children,\n ...rest\n}: CardProps) {\n return (\n <div className={`${styles.wrap} ${fluid ? styles.fluid : ''}`}>\n {stacked && <div className={`${styles.backing} ${completed ? styles.completed : ''}`} />}\n <div\n className={[\n styles.card,\n completed ? styles.completed : '',\n interactive ? styles.interactive : '',\n draggable ? styles.grabbable : '',\n dragging ? styles.dragging : '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </div>\n </div>\n );\n}\n",".neutral,\n.pill,\n.accent,\n.success,\n.danger,\n.count {\n display: inline-flex;\n align-items: center;\n font-weight: 500;\n white-space: nowrap;\n}\n\n/* Square tags — e.g. day badges, worker names, video panel tags */\n.neutral {\n color: var(--text-tertiary);\n font-size: 0.75rem;\n background: var(--bg);\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","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string?.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toKebabCase } from './toKebabCase.mjs';\n\nfunction toLucideIconData(iconName, iconNode, aliases = []) {\n if (iconNode == null) {\n throw new Error(\"[lucide]: iconNode is required when icon name is used\");\n }\n return {\n name: toKebabCase(iconName),\n size: 24,\n node: iconNode,\n ...aliases.length > 0 ? { aliases } : {}\n };\n}\n\nexport { toLucideIconData };\n//# sourceMappingURL=toLucideIconData.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => {\n let out = \"\";\n let upperNext = false;\n for (const ch of string) {\n if (ch === \"-\" || ch === \"_\" || ch <= \" \") {\n upperNext = out.length > 0;\n continue;\n }\n if (out.length === 0) {\n out += ch.toLowerCase();\n } else {\n out += upperNext ? ch.toUpperCase() : ch;\n }\n upperNext = false;\n }\n return out;\n};\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { mergeClasses } from '../utils/mergeClasses.mjs';\n\nfunction isDefined(value) {\n return value !== null && value !== void 0;\n}\nfunction buildLucideIconNode(icon, params = {}) {\n const attributeNames = params.attributeNames ?? {};\n const getAttributeName = (attributeName) => attributeNames[attributeName] ?? attributeName;\n const viewBoxWidth = icon.size ?? icon.width ?? defaultAttributes[\"width\"];\n const viewBoxHeight = icon.size ?? icon.height ?? defaultAttributes[\"height\"];\n const aliasClassNames = icon.aliases?.filter((alias) => typeof alias === \"string\" && alias.trim() !== \"\").map((alias) => `lucide-${alias}`) ?? [];\n const iconClassNames = [...icon.name ? [`lucide-${icon.name}`] : [], ...aliasClassNames];\n const classNamesFromClassName = params.className?.split(\" \").filter(Boolean) ?? [];\n const className = params.includeDefaultClasses === false ? mergeClasses(...classNamesFromClassName) : mergeClasses(\"lucide\", ...iconClassNames, ...classNamesFromClassName);\n const calculatedStrokeWidth = params.absoluteStrokeWidth ? Number(params.strokeWidth ?? defaultAttributes[\"stroke-width\"]) * Number(icon.size ?? icon.width ?? defaultAttributes[\"width\"]) / Number(params.size ?? params.width ?? defaultAttributes[\"width\"]) : params.strokeWidth ?? defaultAttributes[\"stroke-width\"];\n const attributes = {\n ...Object.entries(defaultAttributes).reduce((attrs, [attrName, value]) => {\n attrs[getAttributeName(attrName)] = value;\n return attrs;\n }, {}),\n ...\"color\" in params && params.color && {\n [getAttributeName(\"stroke\")]: params.color\n },\n ...\"size\" in params && isDefined(params.size) && {\n [getAttributeName(\"width\")]: params.size,\n [getAttributeName(\"height\")]: params.size\n },\n ...\"width\" in params && isDefined(params.width) && {\n [getAttributeName(\"width\")]: params.width\n },\n ...\"height\" in params && isDefined(params.height) && {\n [getAttributeName(\"height\")]: params.height\n },\n [getAttributeName(\"stroke-width\")]: calculatedStrokeWidth,\n ...className && {\n [getAttributeName(\"class\")]: className\n },\n [getAttributeName(\"viewBox\")]: `0 0 ${viewBoxWidth} ${viewBoxHeight}`,\n ...params.hasA11yProp === false ? {\n [getAttributeName(\"aria-hidden\")]: \"true\"\n } : {},\n ...\"attributes\" in params && params.attributes\n };\n return [\n \"svg\",\n attributes,\n icon.node.map((child) => {\n const [name, attrs, children] = child;\n const nextAttrs = params.nonScalingStroke ? { [getAttributeName(\"vector-effect\")]: \"non-scaling-stroke\", ...attrs } : attrs;\n return children ? [name, nextAttrs, children] : [name, nextAttrs];\n })\n ];\n}\n\nexport { buildLucideIconNode as default };\n//# sourceMappingURL=buildLucideIconNode.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport buildLucideIconNode from './buildLucideIconNode.mjs';\n\nfunction buildLucideIconForReact(icon, params = {}) {\n return buildLucideIconNode(icon, {\n ...params,\n attributeNames: {\n ...params.attributeNames,\n class: \"className\",\n \"stroke-width\": \"strokeWidth\",\n \"stroke-linecap\": \"strokeLinecap\",\n \"stroke-linejoin\": \"strokeLinejoin\",\n \"vector-effect\": \"vectorEffect\"\n }\n });\n}\n\nexport { buildLucideIconForReact as default };\n//# sourceMappingURL=buildLucideIconForReact.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, nonScalingStroke, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport buildLucideIconForReact from './shared/src/build/buildLucideIconForReact.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({\n color,\n size,\n width,\n height,\n strokeWidth,\n absoluteStrokeWidth,\n nonScalingStroke,\n className = \"\",\n children,\n iconNode = [],\n icon = {\n node: iconNode,\n aliases: [],\n size: 24\n },\n ...rest\n }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n nonScalingStroke: contextNonScalingStroke = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const hasAccessibleProp = Boolean(children) || hasA11yProp(rest);\n const [name, svgAttributes, builtIconNode = []] = buildLucideIconForReact(icon, {\n color: color ?? contextColor,\n width: width ?? size ?? contextSize,\n height: height ?? size ?? contextSize,\n strokeWidth: strokeWidth ?? contextStrokeWidth,\n absoluteStrokeWidth: absoluteStrokeWidth ?? contextAbsoluteStrokeWidth,\n nonScalingStroke: nonScalingStroke ?? contextNonScalingStroke,\n className: mergeClasses(contextClass, className),\n hasA11yProp: hasAccessibleProp,\n attributes: rest\n });\n return createElement(\n name,\n {\n ref,\n ...svgAttributes\n },\n [\n ...builtIconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { toLucideIconData } from './shared/src/utils/toLucideIconData.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nfunction createLucideIcon(iconDataOrName, iconNode = [], aliases = []) {\n const iconData = typeof iconDataOrName === \"string\" ? toLucideIconData(iconDataOrName, iconNode, aliases) : iconDataOrName;\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n icon: iconData,\n className,\n ...props\n })\n );\n if (iconData.name) {\n Component.displayName = toPascalCase(iconData.name);\n }\n return Component;\n}\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"check\",\n size: 24,\n node: [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]]\n};\n__iconData.node;\nconst Check = createLucideIcon(__iconData);\n\nexport { __iconData, Check as default };\n//# sourceMappingURL=check.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"chevron-down\",\n size: 24,\n node: [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]]\n};\n__iconData.node;\nconst ChevronDown = createLucideIcon(__iconData);\n\nexport { __iconData, ChevronDown as default };\n//# sourceMappingURL=chevron-down.mjs.map\n","/**\n * @license lucide-react v1.46.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"search\",\n size: 24,\n node: [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n ]\n};\n__iconData.node;\nconst Search = createLucideIcon(__iconData);\n\nexport { __iconData, Search as default };\n//# sourceMappingURL=search.mjs.map\n",".toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 0 8px;\n background: var(--card-surface);\n border-radius: 16px;\n box-shadow:\n inset 0 0 0 1px var(--border),\n 0 1px 2px rgba(16, 24, 32, 0.04),\n 0 2px 8px rgba(16, 24, 32, 0.06);\n}\n.searchWrap {\n position: relative;\n flex: 1;\n min-width: 0;\n}\n.searchWrap::after {\n content: '';\n position: absolute;\n left: 36px;\n right: 0;\n bottom: 0;\n height: 2px;\n background: var(--brand-main);\n opacity: 0;\n pointer-events: none;\n}\n.searchWrap:focus-within::after {\n opacity: 1;\n}\n.searchIcon {\n position: absolute;\n top: 50%;\n left: 12px;\n width: 16px;\n height: 16px;\n transform: translateY(-53%);\n color: var(--text-tertiary);\n pointer-events: none;\n}\n.searchIcon svg {\n width: 100%;\n height: 100%;\n}\n.search {\n width: 100%;\n box-sizing: border-box;\n border: none;\n padding: 16px 52px 16px 36px;\n font-family: inherit;\n font-size: 1rem;\n color: var(--text-primary);\n background: none;\n box-shadow: inset -1px 0 0 var(--border);\n}\n.search:focus {\n outline: none;\n}\n.searchShortcut {\n position: absolute;\n top: 50%;\n right: 8px;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2px 6px;\n border-radius: 6px;\n background: var(--bg);\n color: var(--text-tertiary);\n font-size: 0.75rem;\n font-weight: 600;\n letter-spacing: 0.02em;\n pointer-events: none;\n}\n.controls {\n display: flex;\n align-items: center;\n flex: none;\n}\n","import { useEffect, useRef, type ChangeEvent, type ReactNode } from 'react';\nimport { Search } from 'lucide-react';\nimport styles from './Toolbar.module.css';\n\ninterface ToolbarProps {\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n placeholder?: string;\n /** Text shown in the keyboard-shortcut badge, e.g. \"⌘K\". Omit to hide the badge. */\n shortcutLabel?: string;\n /** Focuses the search input when Cmd/Ctrl + the shortcut key is pressed. */\n shortcutKey?: string;\n /** Right-side content — filter/sort controls, actions, etc. */\n children?: ReactNode;\n}\n\nexport function Toolbar({\n searchValue,\n onSearchChange,\n placeholder = 'Search…',\n shortcutLabel = '⌘K',\n shortcutKey = 'k',\n children,\n}: ToolbarProps) {\n const searchRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n function onKeyDown(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === shortcutKey.toLowerCase()) {\n e.preventDefault();\n searchRef.current?.focus();\n }\n }\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [shortcutKey]);\n\n return (\n <div className={styles.toolbar}>\n <div className={styles.searchWrap}>\n <span className={styles.searchIcon}>\n <Search />\n </span>\n <input\n ref={searchRef}\n type=\"text\"\n className={styles.search}\n placeholder={placeholder}\n autoComplete=\"off\"\n value={searchValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onSearchChange?.(e.target.value)}\n />\n {shortcutLabel && (\n <span className={styles.searchShortcut} aria-hidden=\"true\">\n {shortcutLabel}\n </span>\n )}\n </div>\n {children && <div className={styles.controls}>{children}</div>}\n </div>\n );\n}\n",".checkbox {\n 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 cursor: pointer;\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(--surface-sunken);\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.input:hover + .box {\n box-shadow: inset 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.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","import type { ChangeEvent } from 'react';\nimport styles from './Checkbox.module.css';\n\ninterface CheckboxProps {\n checked: boolean;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n ariaLabel?: string;\n className?: string;\n}\n\nexport function Checkbox({ checked, onChange, ariaLabel, className }: CheckboxProps) {\n return (\n <label className={`${styles.checkbox} ${className ?? ''}`}>\n <input\n type=\"checkbox\"\n className={styles.input}\n checked={checked}\n onChange={onChange}\n aria-label={ariaLabel}\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 </label>\n );\n}\n",".radio {\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 cursor: pointer;\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(--surface-sunken);\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.input:hover + .circle {\n box-shadow: inset 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.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","import type { ChangeEvent } from 'react';\nimport styles from './RadioButton.module.css';\n\ninterface RadioButtonProps {\n checked: boolean;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n name?: string;\n value?: string;\n ariaLabel?: string;\n className?: string;\n}\n\nexport function RadioButton({ checked, onChange, name, value, ariaLabel, className }: RadioButtonProps) {\n return (\n <label className={`${styles.radio} ${className ?? ''}`}>\n <input\n type=\"radio\"\n className={styles.input}\n checked={checked}\n onChange={onChange}\n name={name}\n value={value}\n aria-label={ariaLabel}\n />\n <span className={styles.circle}>\n <span className={styles.dot} />\n </span>\n </label>\n );\n}\n",".field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.label {\n font-size: 0.85rem;\n font-weight: 550;\n color: var(--text-primary);\n padding-left: 8px;\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 border-radius: 10px;\n}\n.sm .input {\n padding: 8px 12px;\n font-size: 0.8rem;\n}\n.base {\n border-radius: 12px;\n}\n.base .input {\n padding: 12px 14px;\n font-size: 0.9rem;\n}\n.lg {\n border-radius: 14px;\n}\n.lg .input {\n padding: 16px 16px;\n font-size: 1rem;\n}\n.inputWrap:has(.icon) .input {\n padding-left: 8px;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 12px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n.input {\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n background: none;\n font-family: inherit;\n color: var(--text-primary);\n font-weight: 450;\n}\n.input:focus {\n outline: none;\n}\n.input::placeholder {\n color: var(--text-tertiary);\n}\n.input:disabled {\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.helperText {\n font-size: 0.78rem;\n color: var(--text-tertiary);\n padding-left: 8px;\n}\n.errorText {\n font-size: 0.78rem;\n color: var(--danger-text);\n}\n","import { useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport styles from './TextField.module.css';\n\ntype TextFieldSize = 'sm' | 'base' | 'lg';\n\ninterface TextFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className' | 'size'> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: TextFieldSize;\n leadingIcon?: ReactNode;\n}\n\nexport function TextField({\n label,\n helperText,\n error,\n size = 'base',\n leadingIcon,\n id,\n ...rest\n}: TextFieldProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div className={styles.field}>\n {label && (\n <label className={styles.label} htmlFor={inputId}>\n {label}\n </label>\n )}\n <div className={`${styles.inputWrap} ${styles[size]} ${error ? styles.errorWrap : ''}`}>\n {leadingIcon && <span className={styles.icon}>{leadingIcon}</span>}\n <input id={inputId} className={styles.input} {...rest} />\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helperText}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n",".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 box-sizing: border-box;\n border: none;\n background: none;\n border-radius: 8px;\n padding: 8px 10px;\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 color: var(--text-tertiary);\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.trailing {\n color: var(--text-tertiary);\n font-size: 0.8rem;\n flex-shrink: 0;\n}\n.selected {\n color: var(--text-primary);\n font-weight: 550;\n}\n.selected .icon {\n color: var(--text-primary);\n}\n.check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 8px;\n color: var(--text-primary);\n flex-shrink: 0;\n}\n.check svg {\n width: 100%;\n height: 100%;\n}\n.destructive {\n color: var(--danger-text);\n}\n.destructive .icon {\n color: var(--danger-text);\n}\n.destructive:hover:not(:disabled) {\n background: var(--danger-bg);\n color: var(--danger-text);\n}\n.destructive:hover:not(:disabled) .icon {\n color: var(--danger-text);\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { Check } from 'lucide-react';\nimport styles from './MenuItem.module.css';\n\ninterface MenuItemProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className'> {\n icon?: ReactNode;\n trailing?: ReactNode;\n selected?: boolean;\n destructive?: boolean;\n children: ReactNode;\n}\n\nexport function MenuItem({ icon, trailing, selected, destructive, children, ...rest }: MenuItemProps) {\n const classes = [styles.item, selected && styles.selected, destructive && styles.destructive]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button type=\"button\" role=\"menuitem\" className={classes} {...rest}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{children}</span>\n {trailing && <span className={styles.trailing}>{trailing}</span>}\n {selected && (\n <span className={styles.check}>\n <Check />\n </span>\n )}\n </button>\n );\n}\n",".field {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.label {\n font-size: 0.85rem;\n font-weight: 550;\n color: var(--text-primary);\n padding-left: 8px;\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: 10px;\n}\n.sm.trigger {\n padding: 8px 12px;\n font-size: 0.8rem;\n}\n.base {\n border-radius: 12px;\n}\n.base.trigger {\n padding: 12px 14px;\n font-size: 0.9rem;\n}\n.lg {\n border-radius: 14px;\n}\n.lg.trigger {\n padding: 16px 16px;\n font-size: 1rem;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-right: 8px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n}\n.icon svg {\n width: 100%;\n height: 100%;\n}\n.value {\n flex: 1;\n min-width: 0;\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.placeholder {\n color: var(--text-tertiary);\n}\n.chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 8px;\n color: var(--text-tertiary);\n flex-shrink: 0;\n transition: transform 0.15s ease-out;\n}\n.chevron svg {\n width: 100%;\n height: 100%;\n}\n.chevronOpen {\n transform: rotate(180deg);\n}\n\n.menuWrap {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n z-index: 10;\n}\n.helperText {\n font-size: 0.78rem;\n color: var(--text-tertiary);\n padding-left: 8px;\n}\n.errorText {\n font-size: 0.78rem;\n color: var(--danger-text);\n}\n","import { useEffect, useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport { Menu } from './Menu';\nimport { MenuItem } from './MenuItem';\nimport styles from './Dropdown.module.css';\n\ntype DropdownSize = 'sm' | 'base' | 'lg';\n\ninterface DropdownOption<T extends string> {\n value: T;\n label: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\ninterface DropdownProps<T extends string> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: DropdownSize;\n placeholder?: string;\n options: DropdownOption<T>[];\n value?: T;\n onChange: (value: T) => void;\n disabled?: boolean;\n}\n\nexport function Dropdown<T extends string>({\n label,\n helperText,\n error,\n size = 'base',\n placeholder = 'Select…',\n options,\n value,\n onChange,\n disabled,\n}: DropdownProps<T>) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerId = useId();\n\n const selected = options.find((opt) => opt.value === value);\n const enabledValues = options.filter((opt) => !opt.disabled).map((opt) => opt.value);\n\n useEffect(() => {\n if (!open) return;\n const focusValue = value ?? enabledValues[0];\n const el = rootRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${focusValue}\"]`);\n el?.focus();\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function onPointerDown(e: PointerEvent) {\n if (!rootRef.current?.contains(e.target as Node)) setOpen(false);\n }\n function onKeyDown(e: globalThis.KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKeyDown);\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n function handleTriggerKeyDown(e: KeyboardEvent<HTMLButtonElement>) {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n return;\n }\n if (e.key === 'Escape') setOpen(false);\n }\n\n function handleOptionKeyDown(e: KeyboardEvent<HTMLButtonElement>, currentValue: T) {\n const currentIndex = enabledValues.indexOf(currentValue);\n if (currentIndex === -1) return;\n\n let nextIndex: number | null = null;\n if (e.key === 'ArrowDown') nextIndex = (currentIndex + 1) % enabledValues.length;\n if (e.key === 'ArrowUp') nextIndex = (currentIndex - 1 + enabledValues.length) % enabledValues.length;\n if (e.key === 'Home') nextIndex = 0;\n if (e.key === 'End') nextIndex = enabledValues.length - 1;\n\n if (nextIndex !== null) {\n e.preventDefault();\n const nextValue = enabledValues[nextIndex];\n const el = rootRef.current?.querySelector<HTMLButtonElement>(`[data-value=\"${nextValue}\"]`);\n el?.focus();\n return;\n }\n if (e.key === 'Escape') setOpen(false);\n }\n\n return (\n <div className={styles.field} ref={rootRef}>\n {label && (\n <label className={styles.label} htmlFor={triggerId}>\n {label}\n </label>\n )}\n <button\n id={triggerId}\n type=\"button\"\n className={`${styles.trigger} ${styles[size]} ${error ? styles.errorWrap : ''}`}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n disabled={disabled}\n onClick={() => setOpen((v) => !v)}\n onKeyDown={handleTriggerKeyDown}\n >\n {selected?.icon && <span className={styles.icon}>{selected.icon}</span>}\n <span className={`${styles.value} ${!selected ? styles.placeholder : ''}`}>\n {selected ? selected.label : placeholder}\n </span>\n <span className={`${styles.chevron} ${open ? styles.chevronOpen : ''}`}>\n <ChevronDown />\n </span>\n </button>\n {open && (\n <div className={styles.menuWrap}>\n <Menu role=\"listbox\" style={{ width: '100%' }}>\n {options.map((opt) => (\n <MenuItem\n key={opt.value}\n data-value={opt.value}\n role=\"option\"\n aria-selected={opt.value === value}\n icon={opt.icon}\n selected={opt.value === value}\n disabled={opt.disabled}\n onClick={() => {\n onChange(opt.value);\n setOpen(false);\n }}\n onKeyDown={(e) => handleOptionKeyDown(e, opt.value)}\n >\n {opt.label}\n </MenuItem>\n ))}\n </Menu>\n </div>\n )}\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helperText}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n",".highlight {\n background: var(--brand-bg);\n color: var(--brand-dark);\n border-radius: 3px;\n padding: 0 1px;\n}\n","import { Fragment } from 'react';\nimport styles from './HighlightText.module.css';\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function HighlightText({ text, query }: { text: string; query: string }) {\n if (!query) return <>{text}</>;\n\n const parts = text.split(new RegExp(`(${escapeRegExp(query)})`, 'ig'));\n return (\n <>\n {parts.map((part, i) =>\n part.toLowerCase() === query.toLowerCase() ? (\n <mark key={i} className={styles.highlight}>\n {part}\n </mark>\n ) : (\n <Fragment key={i}>{part}</Fragment>\n ),\n )}\n </>\n );\n}\n",".group {\n position: relative;\n}\n.btn {\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n border-radius: 12px;\n padding: 12px;\n font-family: inherit;\n font-size: 1rem;\n color: var(--text-primary);\n cursor: pointer;\n transition:\n background 0.2s ease-out,\n box-shadow 0.2s ease-out,\n transform 0.2s ease-out;\n}\n.btn:hover {\n background: rgba(10, 10, 11, 0.04);\n}\n.btn:active {\n background: var(--brand-bg);\n box-shadow: inset 0 2px 1px 0 rgba(0, 140, 216, 0.25);\n transform: scale(0.95);\n}\n.caret {\n color: var(--text-tertiary);\n display: flex;\n align-items: center;\n}\n.caret svg {\n width: 14px;\n height: 14px;\n}\n.label {\n color: var(--text-secondary);\n}\n.badge {\n position: absolute;\n top: 2px;\n right: 2px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 999px;\n background: var(--brand-main, #0a84d8);\n color: #fff;\n font-size: 0.65rem;\n font-weight: 600;\n line-height: 16px;\n text-align: center;\n}\n.value {\n color: var(--text-primary);\n font-weight: 500;\n}\n.panel {\n display: none;\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n background: #fff;\n border-radius: 12px;\n min-width: 220px;\n width: fit-content;\n max-height: 280px;\n overflow-y: auto;\n box-shadow:\n inset 0 0 0 1px var(--border),\n 0 8px 24px rgba(0, 0, 0, 0.12);\n z-index: 50;\n}\n.panel.open {\n display: block;\n}\n.panelRight {\n left: auto;\n right: 0;\n}\n.panelWide {\n min-width: 260px;\n padding-bottom: 4px;\n}\n.sectionHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 12px 14px 4px;\n}\n.sectionLabel {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--text-tertiary);\n text-transform: uppercase;\n letter-spacing: 0.02em;\n}\n.allToggle {\n background: none;\n border: none;\n padding: 0;\n font-family: inherit;\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--brand-main, #0a84d8);\n cursor: pointer;\n}\n.allToggle:hover {\n text-decoration: underline;\n}\n.divider {\n height: 1px;\n background: var(--border);\n margin: 4px 0;\n}\n.option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px;\n border-radius: 8px;\n font-size: 1rem;\n cursor: pointer;\n}\n.option:hover {\n background: var(--bg);\n}\n.search {\n width: calc(100% - 16px);\n box-sizing: border-box;\n border: none;\n box-shadow: inset 0 0 0 1px var(--border-input);\n border-radius: 8px;\n padding: 8px 12px;\n margin: 8px;\n font-family: inherit;\n font-size: 1rem;\n margin-bottom: 0;\n}\n.search:focus {\n outline: none;\n box-shadow: inset 0 0 0 1px var(--brand-main);\n}\n.optionsList {\n padding: 4px 4px;\n}\n.empty {\n padding: 7px 8px;\n color: var(--text-tertiary);\n font-size: 0.85rem;\n}\n","import { useState } from 'react';\nimport { Checkbox } from './Checkbox';\nimport styles from './FilterSection.module.css';\n\ninterface FilterSectionProps<T extends string> {\n label: string;\n options: T[];\n optionLabel: (opt: T) => string;\n activeSet: Set<T>;\n onToggle: (opt: T) => void;\n onSetAll?: (opts: T[]) => void;\n searchable?: boolean;\n}\n\nexport function FilterSection<T extends string>({\n label,\n options,\n optionLabel,\n activeSet,\n onToggle,\n onSetAll,\n searchable,\n}: FilterSectionProps<T>) {\n const [query, setQuery] = useState('');\n\n const q = query.trim().toLowerCase();\n const matches = q ? options.filter((opt) => optionLabel(opt).toLowerCase().includes(q)) : options;\n const allSelected = options.length > 0 && activeSet.size === options.length;\n\n return (\n <div>\n <div className={styles.sectionHeader}>\n <div className={styles.sectionLabel}>{label}</div>\n {onSetAll && (\n <button\n type=\"button\"\n className={styles.allToggle}\n onClick={() => onSetAll(allSelected ? [] : options)}\n >\n {allSelected ? 'Deselect all' : 'Select all'}\n </button>\n )}\n </div>\n {searchable && (\n <input\n type=\"text\"\n className={styles.search}\n placeholder={`Search ${label.toLowerCase()}…`}\n autoComplete=\"off\"\n value={query}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => setQuery(e.target.value)}\n />\n )}\n <div className={styles.optionsList}>\n {matches.length === 0 && <div className={styles.empty}>No match</div>}\n {matches.map((opt) => (\n <label key={opt} className={styles.option}>\n <Checkbox checked={activeSet.has(opt)} onChange={() => onToggle(opt)} />\n <span>{optionLabel(opt)}</span>\n </label>\n ))}\n </div>\n </div>\n );\n}\n",".sidebar {\n width: 256px;\n flex: 0 0 256px;\n border-radius: 16px 16px 0 0;\n box-shadow:\n 1px 0 0 rgba(10, 10, 11, 0.03),\n 0 -1px 0 rgba(10, 10, 11, 0.05);\n background: var(--surface-sunken);\n padding: 24px 16px 24px 24px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 4px;\n overflow-y: auto;\n}\n.title {\n font-weight: 500;\n font-size: 1.15rem;\n letter-spacing: -0.01em;\n margin: 0 0 16px 8px;\n}\n.navLink {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 8px;\n border-radius: 8px;\n color: var(--text-secondary);\n text-decoration: none;\n font-size: 0.9rem;\n font-weight: 500;\n}\n.navLink:hover {\n background: var(--card-surface);\n color: var(--text-primary);\n}\n.count {\n color: var(--text-tertiary);\n font-size: 0.78rem;\n font-weight: 500;\n}\n","import styles from './UiElementsSidebar.module.css';\n\ninterface UiElementsSidebarProps {\n sections: { id: string; label: string; count: number }[];\n}\n\nexport function UiElementsSidebar({ sections }: UiElementsSidebarProps) {\n return (\n <aside className={styles.sidebar}>\n <div className={styles.title}>UI Elements</div>\n {sections.map((section) => (\n <a key={section.id} href={`#${section.id}`} className={styles.navLink}>\n <span>{section.label}</span>\n <span className={styles.count}>{section.count}</span>\n </a>\n ))}\n </aside>\n );\n}\n",".line,\n.box {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.indicator {\n position: absolute;\n left: 0;\n pointer-events: none;\n transition: translate 0.25s cubic-bezier(0.39, 0.575, 0.565, 1), width 0.25s ease,\n scale 0.125s cubic-bezier(0.39, 0.575, 0.565, 1);\n}\n\n.indicator.settling {\n transition: scale 0.1s linear;\n}\n\n.indicatorLine {\n bottom: 0;\n height: 2px;\n background: var(--brand-main);\n}\n\n.indicatorBox {\n top: 4px;\n bottom: 4px;\n border-radius: 8px;\n background: var(--card-surface);\n box-shadow: 0 0 1px 0.5px var(--border);\n}\n\n.tab {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: none;\n border-radius: 8px 8px 0 0;\n font-family: inherit;\n font-weight: 450;\n cursor: pointer;\n white-space: nowrap;\n transition: color 0.15s ease-out, background 0.15s ease-out, box-shadow 0.15s ease-out;\n}\n\n.tab::before {\n content: '';\n position: absolute;\n left: 50%;\n bottom: 0;\n width: 40%;\n aspect-ratio: 1;\n border-radius: 50%;\n transform: translate(-50%, 100%) scale(1);\n transition: transform 0.3s cubic-bezier(0.39, 0.575, 0.565, 1);\n z-index: -1;\n pointer-events: none;\n background: rgba(var(--brand-main-rgb), 0.08);\n}\n.tab:hover:not(:disabled)::before {\n transform: translate(-50%, 15%) scale(4);\n}\n.tab:active:not(:disabled)::before {\n background: rgba(var(--brand-main-rgb), 0.28);\n}\n\n.tab:disabled {\n color: var(--disabled-text);\n cursor: not-allowed;\n}\n.tab:disabled::before {\n display: none;\n}\n\n.tab.selected:hover::before {\n display: none;\n}\n\n.tab:focus-visible {\n outline: 2px solid var(--brand-main);\n outline-offset: 2px;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n 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 6px;\n font-size: 1rem;\n color: var(--text-secondary);\n}\n.line .tab:hover:not(:disabled) {\n color: var(--brand-main);\n}\n.line .tab.selected {\n color: var(--text-primary);\n font-weight: 550;\n}\n\n/* Box variant */\n\n.box {\n background: rgba(16, 24, 32, 0.04);\n border-radius: 10px;\n padding: 4px;\n gap: 4px;\n box-shadow: inset 0 0 0.5px 1px #e3e3e3;\n}\n\n.box .tab {\n border-radius: 8px;\n padding: 8px 14px;\n font-size: 0.9rem;\n background: transparent;\n color: var(--text-secondary);\n}\n.box .tab:hover:not(:disabled) {\n color: var(--brand-main);\n /* box-shadow: 0 0 0px 1px var(--brand-main-30); */\n}\n.box .tab.selected {\n color: var(--text-primary);\n font-weight: 550;\n}\n\n.box.sm .tab {\n border-radius: 8px;\n padding: 4px 14px;\n}\n","import {\n useLayoutEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n type TransitionEvent,\n} from 'react';\nimport styles from './Tabs.module.css';\n\ntype TabsVariant = 'line' | 'box';\ntype TabsSize = 'base' | 'sm';\n\ninterface TabItem {\n value: string;\n label: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\ninterface TabsProps {\n items: TabItem[];\n value: string;\n onChange: (value: string) => void;\n variant?: TabsVariant;\n size?: TabsSize;\n 'aria-label'?: string;\n}\n\nexport function Tabs({ items, value, onChange, variant = 'line', size = 'base', ...rest }: TabsProps) {\n const enabledValues = items.filter((item) => !item.disabled).map((item) => item.value);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const tabRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n const prevValueRef = useRef(value);\n const [indicatorStyle, setIndicatorStyle] = useState<{ left: number; width: number } | null>(\n null,\n );\n const [pillPhase, setPillPhase] = useState<'idle' | 'moving' | 'settling'>('idle');\n\n useLayoutEffect(() => {\n const selectedTab = tabRefs.current.get(value);\n if (!selectedTab) return;\n setIndicatorStyle({ left: selectedTab.offsetLeft, width: selectedTab.offsetWidth });\n\n if (variant === 'box' && prevValueRef.current !== value) {\n setPillPhase('moving');\n }\n prevValueRef.current = value;\n }, [value, items, variant, size]);\n\n function handlePillTransitionEnd(event: TransitionEvent<HTMLSpanElement>) {\n if (event.propertyName !== 'scale') return;\n if (pillPhase === 'moving') setPillPhase('settling');\n else if (pillPhase === 'settling') setPillPhase('idle');\n }\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const observer = new ResizeObserver(() => {\n const selectedTab = tabRefs.current.get(value);\n if (!selectedTab) return;\n setIndicatorStyle({ left: selectedTab.offsetLeft, width: selectedTab.offsetWidth });\n });\n observer.observe(container);\n return () => observer.disconnect();\n }, [value]);\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const currentIndex = enabledValues.indexOf(value);\n if (currentIndex === -1) return;\n\n let nextIndex: number | null = null;\n if (event.key === 'ArrowRight') nextIndex = (currentIndex + 1) % enabledValues.length;\n if (event.key === 'ArrowLeft') {\n nextIndex = (currentIndex - 1 + enabledValues.length) % enabledValues.length;\n }\n if (event.key === 'Home') nextIndex = 0;\n if (event.key === 'End') nextIndex = enabledValues.length - 1;\n\n if (nextIndex !== null) {\n event.preventDefault();\n onChange(enabledValues[nextIndex]);\n }\n }\n\n return (\n <div\n ref={containerRef}\n role=\"tablist\"\n className={[styles[variant], variant === 'box' && size === 'sm' && styles.sm]\n .filter(Boolean)\n .join(' ')}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {indicatorStyle && (\n <span\n aria-hidden\n className={[\n styles.indicator,\n variant === 'line' ? styles.indicatorLine : styles.indicatorBox,\n pillPhase === 'settling' && styles.settling,\n ]\n .filter(Boolean)\n .join(' ')}\n onTransitionEnd={handlePillTransitionEnd}\n style={{\n translate: `${indicatorStyle.left}px 0`,\n scale: variant === 'box' && pillPhase === 'moving' ? 0.92 : 1,\n width: indicatorStyle.width,\n }}\n />\n )}\n {items.map((item) => {\n const selected = item.value === value;\n return (\n <button\n key={item.value}\n ref={(node) => {\n if (node) tabRefs.current.set(item.value, node);\n else tabRefs.current.delete(item.value);\n }}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n disabled={item.disabled}\n tabIndex={selected ? 0 : -1}\n className={[styles.tab, selected && styles.selected].filter(Boolean).join(' ')}\n onClick={() => !item.disabled && onChange(item.value)}\n >\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {item.label}\n </button>\n );\n })}\n </div>\n );\n}\n","export function formatDuration(mins: number): string {\n const h = Math.floor(mins / 60);\n const m = mins % 60;\n return `${h}h:${String(m).padStart(2, '0')}m`;\n}\n\n/** HH:MM:SS — seconds are a stable per-video display detail, not tracked in the data model. */\nexport function formatDurationHMS(mins: number, seconds: number): string {\n const h = Math.floor(mins / 60);\n const m = mins % 60;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(seconds)}`;\n}\n"],"x_google_ignoreList":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],"mappings":"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"}
|