bav-react-ui 0.1.0
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/LICENSE +674 -0
- package/README.md +20 -0
- package/dist/bav-ui.cjs +2 -0
- package/dist/bav-ui.cjs.map +1 -0
- package/dist/bav-ui.mjs +1601 -0
- package/dist/bav-ui.mjs.map +1 -0
- package/dist/components/Alert.d.ts +11 -0
- package/dist/components/Avatar.d.ts +8 -0
- package/dist/components/Badge.d.ts +10 -0
- package/dist/components/Breadcrumbs.d.ts +11 -0
- package/dist/components/Button.d.ts +12 -0
- package/dist/components/Card.d.ts +16 -0
- package/dist/components/Checkbox.d.ts +5 -0
- package/dist/components/ConfirmDialog.d.ts +1 -0
- package/dist/components/DescriptionList.d.ts +12 -0
- package/dist/components/Divider.d.ts +7 -0
- package/dist/components/EmptyState.d.ts +9 -0
- package/dist/components/FileInput.d.ts +9 -0
- package/dist/components/Flex.d.ts +13 -0
- package/dist/components/FormField.d.ts +14 -0
- package/dist/components/IconButton.d.ts +8 -0
- package/dist/components/Input.d.ts +7 -0
- package/dist/components/Kbd.d.ts +6 -0
- package/dist/components/Layout.d.ts +19 -0
- package/dist/components/Menu.d.ts +20 -0
- package/dist/components/Modal.d.ts +13 -0
- package/dist/components/Pagination.d.ts +10 -0
- package/dist/components/Panel.d.ts +11 -0
- package/dist/components/ProgressBar.d.ts +8 -0
- package/dist/components/Radio.d.ts +19 -0
- package/dist/components/SearchInput.d.ts +8 -0
- package/dist/components/Select.d.ts +13 -0
- package/dist/components/Skeleton.d.ts +9 -0
- package/dist/components/Spinner.d.ts +5 -0
- package/dist/components/Stat.d.ts +10 -0
- package/dist/components/Switch.d.ts +5 -0
- package/dist/components/Table.d.ts +23 -0
- package/dist/components/Tabs.d.ts +16 -0
- package/dist/components/Tag.d.ts +7 -0
- package/dist/components/Textarea.d.ts +5 -0
- package/dist/components/Toast.d.ts +1 -0
- package/dist/components/Tooltip.d.ts +8 -0
- package/dist/components/Typography.d.ts +27 -0
- package/dist/components/confirmStore.d.ts +21 -0
- package/dist/components/toastStore.d.ts +25 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/theme/ThemeProvider.d.ts +5 -0
- package/dist/theme/tokens.d.ts +23 -0
- package/dist/theme/useThemeStore.d.ts +21 -0
- package/dist/utils/cx.d.ts +2 -0
- package/package.json +59 -0
package/README.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# @bav/ui
|
|
2
|
+
|
|
3
|
+
The "@bav/ui" design system: a themeable React component library containing buttons, inputs, tables, dialogs, toasts, layout primitives and a
|
|
4
|
+
light/dark theme.
|
|
5
|
+
|
|
6
|
+
## Usage
|
|
7
|
+
|
|
8
|
+
```tsx
|
|
9
|
+
import { ThemeProvider, Button } from "@bav/ui";
|
|
10
|
+
import "@bav/ui/styles/global.css";
|
|
11
|
+
|
|
12
|
+
export const App = () => (
|
|
13
|
+
<ThemeProvider>
|
|
14
|
+
<Button variant="primary">Save</Button>
|
|
15
|
+
</ThemeProvider>
|
|
16
|
+
);
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`ThemeProvider` applies the active theme's CSS variables to `:root`; switch with
|
|
20
|
+
`useThemeStore().setTheme("light" | "dark")`.
|
package/dist/bav-ui.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});require('./index.css');let e=require("zustand"),t=require("react"),n=require("react/jsx-runtime"),r=require("react-feather"),i=require("react-dom");var a={primary:`#ffffff`,bg:`#000000`,panel:`#111111`,card:`#1a1a1a`,border:`#333333`,text:`#ffffff`,muted:`#b3b3b3`,accent:`#60a5fa`,danger:`#ff4444`,success:`#4caf50`,warning:`#f59e0b`,focus:`rgba(255, 255, 255, 0.3)`,chipsBackground:`rgba(255, 255, 255, 0.04)`,chipsBackgroundActive:`rgba(255, 255, 255, 0.12)`,buttons:`#2a2a2a`,shadow:`rgba(0, 0, 0, 0.2)`},o={primary:`#000000`,bg:`#ffffff`,panel:`#eeeeee`,card:`#efefef`,border:`#bbbbbb`,text:`#000000`,muted:`#323232`,accent:`#2563eb`,danger:`#ff4444`,success:`#4caf50`,warning:`#d97706`,focus:`rgba(0, 0, 0, 0.25)`,chipsBackground:`#efefef`,chipsBackgroundActive:`rgba(0, 0, 0, 0.08)`,buttons:`#dcdcdc`,shadow:`rgba(0, 0, 0, 0.12)`},s={dark:a,light:o},c={primary:`--primary`,bg:`--bg`,panel:`--panel`,card:`--card`,border:`--border`,text:`--text`,muted:`--muted`,accent:`--accent`,danger:`--danger`,success:`--success`,warning:`--warning`,focus:`--focus`,chipsBackground:`--chips-background`,chipsBackgroundActive:`--chips-background-active`,buttons:`--buttons`,shadow:`--shadow`};function l(e){let t={};for(let n of Object.keys(e))t[c[n]]=e[n];return t}function u(e,t){let n;try{n=e()}catch{return}return{getItem:e=>{let r=e=>e===null?null:JSON.parse(e,t?.reviver),i=n.getItem(e)??null;return i instanceof Promise?i.then(r):r(i)},setItem:(e,r)=>n.setItem(e,JSON.stringify(r,t?.replacer)),removeItem:e=>n.removeItem(e)}}var d=e=>t=>{try{let n=e(t);return n instanceof Promise?n:{then(e){return d(e)(n)},catch(e){return this}}}catch(e){return{then(e){return this},catch(t){return d(t)(e)}}}},f=(0,e.create)()(((e,t)=>(n,r,i)=>{let a={storage:u(()=>window.localStorage),partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...t},o=!1,s=0,c=new Set,l=new Set,f=a.storage;if(!f)return e((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${a.name}', the given storage is currently unavailable.`),n(...e)},r,i);let p=()=>{let e=a.partialize({...r()});return f.setItem(a.name,{state:e,version:a.version})},m=i.setState;i.setState=(e,t)=>(m(e,t),p());let h=e((...e)=>(n(...e),p()),r,i);i.getInitialState=()=>h;let g,_=()=>{if(!f)return;let e=++s;o=!1,c.forEach(e=>e(r()??h));let t=a.onRehydrateStorage?.call(a,r()??h)||void 0;return d(f.getItem.bind(f))(a.name).then(e=>{if(e)if(typeof e.version==`number`&&e.version!==a.version){if(a.migrate){let t=a.migrate(e.state,e.version);return t instanceof Promise?t.then(e=>[!0,e]):[!0,t]}console.error(`State loaded from storage couldn't be migrated since no migrate function was provided`)}else return[!1,e.state];return[!1,void 0]}).then(t=>{if(e!==s)return;let[i,o]=t;if(g=a.merge(o,r()??h),n(g,!0),i)return p()}).then(()=>{e===s&&(t?.(r(),void 0),g=r(),o=!0,l.forEach(e=>e(g)))}).catch(n=>{e===s&&t?.(void 0,n)})};return i.persist={setOptions:e=>{a={...a,...e},e.storage&&(f=e.storage)},clearStorage:()=>{f?.removeItem(a.name)},getOptions:()=>a,rehydrate:()=>_(),hasHydrated:()=>o,onHydrate:e=>(c.add(e),()=>{c.delete(e)}),onFinishHydration:e=>(l.add(e),()=>{l.delete(e)})},a.skipHydration||_(),g||h})((e,t)=>({currentTheme:`dark`,tokens:s.dark,setTheme:t=>e({currentTheme:t,tokens:s[t]}),toggleTheme:()=>{let n=t().currentTheme===`dark`?`light`:`dark`;e({currentTheme:n,tokens:s[n]})}}),{name:`bav-theme`}));function p({children:e}){let r=f(e=>e.tokens),i=f(e=>e.currentTheme);return(0,t.useEffect)(()=>{let e=document.documentElement,t=l(r);for(let[n,r]of Object.entries(t))e.style.setProperty(n,r);e.setAttribute(`data-theme`,i)},[r,i]),(0,n.jsx)(n.Fragment,{children:e})}var m=(...e)=>e.filter(e=>typeof e==`string`&&e.length>0).join(` `),h={spinner:`_spinner_102nw_1`,"bav-spin":`_bav-spin_102nw_1`};function g({size:e,className:t}){return(0,n.jsx)(`span`,{className:`${h.spinner} ${t}`,style:{width:e,height:e},role:`status`,"aria-label":`Loading`})}var _={button:`_button_1ejsq_1`,sm:`_sm_1ejsq_40`,md:`_md_1ejsq_45`,lg:`_lg_1ejsq_50`,primary:`_primary_1ejsq_56`,danger:`_danger_1ejsq_66`,subtle:`_subtle_1ejsq_76`,ghost:`_ghost_1ejsq_80`,block:`_block_1ejsq_89`,loading:`_loading_1ejsq_93`,spinner:`_spinner_1ejsq_97`,icon:`_icon_1ejsq_105`},ee={default:``,primary:_.primary,danger:_.danger,subtle:_.subtle,ghost:_.ghost};function v({variant:e,size:t,block:r,loading:i,leftIcon:a,rightIcon:o,className:s,type:c,disabled:l,children:u,...d}){return(0,n.jsxs)(`button`,{type:c,disabled:l||i,className:m(_.button,_[t],ee[e],r&&_.block,i&&_.loading,s),...d,children:[i&&(0,n.jsx)(`span`,{className:_.spinner,children:(0,n.jsx)(g,{size:t===`lg`?20:16})}),a&&(0,n.jsx)(`span`,{className:_.icon,children:a}),u,o&&(0,n.jsx)(`span`,{className:_.icon,children:o})]})}var y={button:`_button_1bhk3_1`,solid:`_solid_1bhk3_32`,danger:`_danger_1bhk3_35`,sm:`_sm_1bhk3_40`,md:`_md_1bhk3_44`,lg:`_lg_1bhk3_48`};function te({label:e,size:t,variant:r,className:i,type:a,children:o,...s}){return(0,n.jsx)(`button`,{type:a,"aria-label":e,title:e,className:m(y.button,y[t],r===`solid`&&y.solid,r===`danger`&&y.danger,i),...s,children:o})}var b={wrap:`_wrap_mj8y3_1`,input:`_input_mj8y3_8`,sm:`_sm_mj8y3_32`,md:`_md_mj8y3_37`,invalid:`_invalid_mj8y3_43`,hasIcon:`_hasIcon_mj8y3_51`,icon:`_icon_mj8y3_57`},ne=(0,t.forwardRef)(function({inputSize:e,invalid:t,leftIcon:r,className:i,...a},o){return(0,n.jsxs)(`span`,{className:b.wrap,children:[r&&(0,n.jsx)(`span`,{className:b.icon,children:r}),(0,n.jsx)(`input`,{ref:o,"aria-invalid":t||void 0,className:m(b.input,b[e],r&&b.hasIcon,t&&b.invalid,i),...a})]})}),re={textarea:`_textarea_1v6em_1`,invalid:`_invalid_1v6em_29`},ie=(0,t.forwardRef)(function({invalid:e,className:t,...r},i){return(0,n.jsx)(`textarea`,{ref:i,"aria-invalid":e||void 0,className:m(re.textarea,e&&re.invalid,t),...r})}),x={wrap:`_wrap_6tkeb_1`,select:`_select_6tkeb_8`,sm:`_sm_6tkeb_32`,invalid:`_invalid_6tkeb_36`,chevron:`_chevron_6tkeb_40`},ae=(0,t.forwardRef)(function({selectSize:e,invalid:t,options:i,placeholder:a,className:o,children:s,...c},l){return(0,n.jsxs)(`span`,{className:x.wrap,children:[(0,n.jsxs)(`select`,{ref:l,"aria-invalid":t||void 0,className:m(x.select,e===`sm`&&x.sm,t&&x.invalid,o),...c,children:[a&&(0,n.jsx)(`option`,{value:``,disabled:!0,children:a}),i?i.map(e=>(0,n.jsx)(`option`,{value:e.value,disabled:e.disabled,children:e.label},e.value)):s]}),(0,n.jsx)(r.ChevronDown,{className:x.chevron})]})}),S={label:`_label_glwcp_1`,disabled:`_disabled_glwcp_10`,native:`_native_glwcp_15`,box:`_box_glwcp_22`},oe=(0,t.forwardRef)(function({children:e,className:t,disabled:i,...a},o){return(0,n.jsxs)(`label`,{className:m(S.label,i&&S.disabled,t),children:[(0,n.jsx)(`input`,{ref:o,type:`checkbox`,className:S.native,disabled:i,...a}),(0,n.jsx)(`span`,{className:S.box,"aria-hidden":`true`,children:(0,n.jsx)(r.Check,{})}),e&&(0,n.jsx)(`span`,{children:e})]})}),C={label:`_label_1qs2n_1`,disabled:`_disabled_1qs2n_10`,native:`_native_1qs2n_15`,track:`_track_1qs2n_22`,thumb:`_thumb_1qs2n_34`},se=(0,t.forwardRef)(function({children:e,className:t,disabled:r,...i},a){return(0,n.jsxs)(`label`,{className:m(C.label,r&&C.disabled,t),children:[(0,n.jsx)(`input`,{ref:a,type:`checkbox`,role:`switch`,className:C.native,disabled:r,...i}),(0,n.jsx)(`span`,{className:C.track,"aria-hidden":`true`,children:(0,n.jsx)(`span`,{className:C.thumb})}),e&&(0,n.jsx)(`span`,{children:e})]})}),w={group:`_group_vvdcv_1`,horizontal:`_horizontal_vvdcv_6`,label:`_label_vvdcv_12`,disabled:`_disabled_vvdcv_21`,native:`_native_vvdcv_26`,dot:`_dot_vvdcv_33`};function T({children:e,className:t,disabled:r,...i}){return(0,n.jsxs)(`label`,{className:m(w.label,r&&w.disabled,t),children:[(0,n.jsx)(`input`,{type:`radio`,className:w.native,disabled:r,...i}),(0,n.jsx)(`span`,{className:w.dot,"aria-hidden":`true`}),e&&(0,n.jsx)(`span`,{children:e})]})}function ce({name:e,value:t,options:r,onChange:i,horizontal:a,className:o}){return(0,n.jsx)(`div`,{role:`radiogroup`,className:m(w.group,a&&w.horizontal,o),children:r.map(r=>(0,n.jsx)(T,{name:e,value:r.value,checked:t===r.value,disabled:r.disabled,onChange:e=>i?.(e.target.value),children:r.label},r.value))})}var E={field:`_field_1toma_1`,labelRow:`_labelRow_1toma_8`,label:`_label_1toma_8`,required:`_required_1toma_20`,optional:`_optional_1toma_25`,hint:`_hint_1toma_30`,error:`_error_1toma_34`};function le({label:e,hint:r,error:i,required:a,optional:o,className:s,children:c}){let l=(0,t.useId)(),u=!!i;return(0,n.jsxs)(`div`,{className:m(E.field,s),children:[(e||o)&&(0,n.jsxs)(`div`,{className:E.labelRow,children:[e&&(0,n.jsxs)(`label`,{htmlFor:l,className:E.label,children:[e,a&&(0,n.jsx)(`span`,{className:E.required,children:`*`})]}),o&&!a&&(0,n.jsx)(`span`,{className:E.optional,children:`Optional`})]}),typeof c==`function`?c({id:l,invalid:u}):c,i?(0,n.jsx)(`span`,{className:E.error,children:i}):r?(0,n.jsx)(`span`,{className:E.hint,children:r}):null]})}var D={drop:`_drop_4v9xi_1`,input:`_input_4v9xi_27`,disabled:`_disabled_4v9xi_40`,invalid:`_invalid_4v9xi_45`,icon:`_icon_4v9xi_49`,label:`_label_4v9xi_61`},ue=(0,t.forwardRef)(function({onFileChange:e,fileName:t,placeholder:r,icon:i,invalid:a,disabled:o,className:s,...c},l){return(0,n.jsxs)(`label`,{className:m(D.drop,a&&D.invalid,o&&D.disabled,s),"data-has-file":t?`true`:void 0,children:[(0,n.jsx)(`input`,{ref:l,type:`file`,disabled:o,className:D.input,onChange:t=>e?.(t.target.files?.[0]??null),...c}),i&&(0,n.jsx)(`span`,{className:D.icon,children:i}),(0,n.jsx)(`span`,{className:D.label,children:t??r})]})}),O={row:`_row_1vo45_1`,icon:`_icon_1vo45_7`,input:`_input_1vo45_20`,clear:`_clear_1vo45_49`,shortcut:`_shortcut_1vo45_74`},de=(0,t.forwardRef)(function({value:e,onValueChange:t,shortcut:i,placeholder:a,className:o,...s},c){let l=e.length>0;return(0,n.jsxs)(`div`,{className:m(O.row,o),children:[(0,n.jsx)(`span`,{className:O.icon,children:(0,n.jsx)(r.Search,{})}),(0,n.jsx)(`input`,{ref:c,type:`search`,className:O.input,value:e,placeholder:a,onChange:e=>t(e.target.value),...s}),l?(0,n.jsx)(`button`,{type:`button`,className:O.clear,onClick:()=>t(``),"aria-label":`Clear search`,children:(0,n.jsx)(r.X,{})}):i&&(0,n.jsx)(`span`,{className:O.shortcut,children:i})]})}),k={badge:`_badge_1u5ss_1`,square:`_square_1u5ss_13`,mono:`_mono_1u5ss_16`,neutral:`_neutral_1u5ss_20`,accent:`_accent_1u5ss_24`,success:`_success_1u5ss_29`,warning:`_warning_1u5ss_34`,danger:`_danger_1u5ss_39`,dot:`_dot_1u5ss_45`};function fe({tone:e,square:t,mono:r,dot:i,className:a,children:o,...s}){return(0,n.jsxs)(`span`,{className:m(k.badge,k[e],t&&k.square,r&&k.mono,a),...s,children:[i&&(0,n.jsx)(`span`,{className:k.dot}),o]})}var A={tag:`_tag_i8fnf_1`,noClose:`_noClose_i8fnf_15`,close:`_close_i8fnf_18`};function pe({children:e,onRemove:t,className:i}){return(0,n.jsxs)(`span`,{className:m(A.tag,!t&&A.noClose,i),children:[e,t&&(0,n.jsx)(`button`,{type:`button`,className:A.close,onClick:t,"aria-label":`Remove`,children:(0,n.jsx)(r.X,{})})]})}var me={kbd:`_kbd_1b6zb_1`};function he({children:e,className:t}){return(0,n.jsx)(`kbd`,{className:m(me.kbd,t),children:e})}var j={avatar:`_avatar_ernyw_1`,square:`_square_ernyw_15`,img:`_img_ernyw_18`,sm:`_sm_ernyw_24`,md:`_md_ernyw_29`,lg:`_lg_ernyw_34`},ge=e=>{if(!e)return`?`;let t=e.trim().split(/\s+/);return((t[0]?.[0]??``)+(t.length>1?t[t.length-1][0]:``)).slice(0,2)};function _e({name:e,src:t,size:r,square:i,className:a}){return(0,n.jsx)(`span`,{className:m(j.avatar,j[r],i&&j.square,a),"aria-label":e,title:e,children:t?(0,n.jsx)(`img`,{className:j.img,src:t,alt:e??``}):ge(e)})}var M={skeleton:`_skeleton_n45ub_1`,"bav-skeleton":`_bav-skeleton_n45ub_1`,text:`_text_n45ub_13`,circle:`_circle_n45ub_18`};function ve({variant:e,width:t,height:r,lines:i,radius:a,className:o}){let s={width:t,height:r??(e===`circle`?t:void 0),borderRadius:a};return e===`text`&&i&&i>1?(0,n.jsx)(`span`,{children:Array.from({length:i}).map((e,t)=>(0,n.jsx)(`span`,{className:m(M.skeleton,M.text,o),style:{width:t===i-1?`70%`:`100%`}},t))}):(0,n.jsx)(`span`,{className:m(M.skeleton,e===`text`&&M.text,e===`circle`&&M.circle,o),style:s})}var N={divider:`_divider_xkemn_1`,horizontal:`_horizontal_xkemn_5`,vertical:`_vertical_xkemn_10`,labelled:`_labelled_xkemn_16`};function ye({orientation:e,children:t,className:r}){return t?(0,n.jsx)(`div`,{className:m(N.labelled,r),role:`separator`,children:t}):(0,n.jsx)(`hr`,{className:m(N.divider,N[e],r),"aria-orientation":e})}var P={wrap:`_wrap_1fpxy_1`,head:`_head_1fpxy_7`,value:`_value_1fpxy_14`,track:`_track_1fpxy_20`,sm:`_sm_1fpxy_27`,lg:`_lg_1fpxy_30`,bar:`_bar_1fpxy_34`,indeterminate:`_indeterminate_1fpxy_41`,"bav-indeterminate":`_bav-indeterminate_1fpxy_1`,"bav-shimmer":`_bav-shimmer_1fpxy_1`};function be({value:e,size:t,label:r,showValue:i,className:a}){let o=e==null,s=o?0:Math.max(0,Math.min(100,e));return(0,n.jsxs)(`div`,{className:m(P.wrap,a),children:[(r||i)&&(0,n.jsxs)(`div`,{className:P.head,children:[r&&(0,n.jsx)(`span`,{children:r}),i&&!o&&(0,n.jsxs)(`span`,{className:P.value,children:[Math.round(s),`%`]})]}),(0,n.jsx)(`div`,{className:m(P.track,t===`sm`&&P.sm,t===`lg`&&P.lg),role:`progressbar`,"aria-valuenow":o?void 0:Math.round(s),"aria-valuemin":0,"aria-valuemax":100,children:(0,n.jsx)(`div`,{className:m(P.bar,o&&P.indeterminate),style:o?void 0:{width:`${s}%`}})})]})}var F={stat:`_stat_12af2_1`,label:`_label_12af2_6`,valueRow:`_valueRow_12af2_12`,value:`_value_12af2_12`,delta:`_delta_12af2_24`,up:`_up_12af2_28`,down:`_down_12af2_31`,hint:`_hint_12af2_34`};function xe({label:e,value:t,delta:r,trend:i,hint:a,className:o}){return(0,n.jsxs)(`div`,{className:m(F.stat,o),children:[(0,n.jsx)(`span`,{className:F.label,children:e}),(0,n.jsxs)(`div`,{className:F.valueRow,children:[(0,n.jsx)(`span`,{className:F.value,children:t}),r&&(0,n.jsx)(`span`,{className:m(F.delta,i===`up`&&F.up,i===`down`&&F.down),children:r})]}),a&&(0,n.jsx)(`span`,{className:F.hint,children:a})]})}var I={card:`_card_8qptx_1`,interactive:`_interactive_8qptx_10`,header:`_header_8qptx_23`,headTitles:`_headTitles_8qptx_30`,title:`_title_8qptx_36`,subtitle:`_subtitle_8qptx_42`,headEnd:`_headEnd_8qptx_46`,body:`_body_8qptx_50`,footer:`_footer_8qptx_58`};function Se({interactive:e,className:t,children:r,...i}){return(0,n.jsx)(`div`,{className:m(I.card,e&&I.interactive,t),...i,children:r})}function Ce({title:e,subtitle:t,media:r,actions:i,className:a,children:o}){return(0,n.jsxs)(`div`,{className:m(I.header,a),children:[r,(e||t)&&(0,n.jsxs)(`div`,{className:I.headTitles,children:[e&&(0,n.jsx)(`h3`,{className:I.title,children:e}),t&&(0,n.jsx)(`span`,{className:I.subtitle,children:t})]}),o,i&&(0,n.jsx)(`div`,{className:I.headEnd,children:i})]})}function we({className:e,children:t,...r}){return(0,n.jsx)(`div`,{className:m(I.body,e),...r,children:t})}function Te({className:e,children:t,...r}){return(0,n.jsx)(`div`,{className:m(I.footer,e),...r,children:t})}var L={panel:`_panel_1ahhx_1`,header:`_header_1ahhx_11`,title:`_title_1ahhx_21`,headerEnd:`_headerEnd_1ahhx_28`,body:`_body_1ahhx_35`,noPadding:`_noPadding_1ahhx_39`};function Ee({headerTitle:e,headerChildren:t,headerActions:r,disableHeader:i,flush:a,className:o,children:s}){let c=!i&&(e||t||r);return(0,n.jsxs)(`section`,{className:m(L.panel,a&&L.noPadding,o),children:[c&&(0,n.jsxs)(`header`,{className:L.header,children:[e&&(0,n.jsx)(`h2`,{className:L.title,children:e}),t,r&&(0,n.jsx)(`div`,{className:L.headerEnd,children:r})]}),(0,n.jsx)(`div`,{className:L.body,children:s})]})}var R={container:`_container_1lpv0_1`,table:`_table_1lpv0_6`,clickable:`_clickable_1lpv0_44`,compact:`_compact_1lpv0_48`,numeric:`_numeric_1lpv0_53`,mono:`_mono_1lpv0_58`,muted:`_muted_1lpv0_62`,empty:`_empty_1lpv0_66`};function De({compact:e,clickableRows:t,className:r,children:i,...a}){return(0,n.jsx)(`div`,{className:R.container,children:(0,n.jsx)(`table`,{className:m(R.table,e&&R.compact,t&&R.clickable,r),...a,children:i})})}function Oe({className:e,...t}){return(0,n.jsx)(`thead`,{className:e,...t})}function ke({className:e,...t}){return(0,n.jsx)(`tbody`,{className:e,...t})}function Ae({className:e,...t}){return(0,n.jsx)(`tr`,{className:e,...t})}function je({numeric:e,className:t,...r}){return(0,n.jsx)(`th`,{className:m(e&&R.numeric,t),...r})}function Me({numeric:e,mono:t,muted:r,className:i,...a}){return(0,n.jsx)(`td`,{className:m(e&&R.numeric,t&&R.mono,r&&R.muted,i),...a})}function Ne({colSpan:e,children:t}){return(0,n.jsx)(`tr`,{children:(0,n.jsx)(`td`,{colSpan:e,className:R.empty,children:t})})}var z={list:`_list_jq2cc_1`,columns2:`_columns2_jq2cc_8`,row:`_row_jq2cc_12`,label:`_label_jq2cc_19`,value:`_value_jq2cc_27`,mono:`_mono_jq2cc_34`};function Pe({items:e,wide:t,className:r}){return(0,n.jsx)(`dl`,{className:m(z.list,t&&z.columns2,r),children:e.map((e,t)=>(0,n.jsxs)(`div`,{className:z.row,children:[(0,n.jsx)(`dt`,{className:z.label,children:e.label}),(0,n.jsx)(`dd`,{className:m(z.value,e.mono&&z.mono),children:e.value??`—`})]},t))})}var Fe={small:8,middle:16,large:24};function Ie({vertical:e,align:t,justify:r,gap:i,wrap:a,flex:o,as:s=`div`,style:c,children:l,...u}){let d=typeof i==`string`?Fe[i]:i;return(0,n.jsx)(s,{style:{display:`flex`,flexDirection:e?`column`:`row`,alignItems:t,justifyContent:r,gap:d,flexWrap:a?`wrap`:void 0,flex:o,minWidth:0,...c},...u,children:l})}var Le=e=>e===0?`0`:`var(--space-${e})`;function Re({gap:e,align:t,justify:r,as:i=`div`,style:a,children:o,...s}){return(0,n.jsx)(i,{style:{display:`flex`,flexDirection:`column`,gap:Le(e),alignItems:t,justifyContent:r,...a},...s,children:o})}function ze({gap:e,align:t,justify:r,wrap:i,as:a=`div`,style:o,children:s,...c}){return(0,n.jsx)(a,{style:{display:`flex`,flexDirection:`row`,gap:Le(e),alignItems:t,justifyContent:r,flexWrap:i?`wrap`:void 0,...o},...c,children:s})}var B={title:`_title_4aj6y_1`,h1:`_h1_4aj6y_8`,h2:`_h2_4aj6y_11`,h3:`_h3_4aj6y_14`,h4:`_h4_4aj6y_17`,h5:`_h5_4aj6y_21`,noMargin:`_noMargin_4aj6y_26`,text:`_text_4aj6y_30`,secondary:`_secondary_4aj6y_34`,success:`_success_4aj6y_37`,warning:`_warning_4aj6y_40`,danger:`_danger_4aj6y_43`,accent:`_accent_4aj6y_46`,strong:`_strong_4aj6y_50`,code:`_code_4aj6y_54`,mono:`_mono_4aj6y_63`,xs:`_xs_4aj6y_67`,sm:`_sm_4aj6y_70`,lg:`_lg_4aj6y_73`,uppercase:`_uppercase_4aj6y_77`,paragraph:`_paragraph_4aj6y_82`},V={default:void 0,secondary:B.secondary,success:B.success,warning:B.warning,danger:B.danger,accent:B.accent};function Be({level:e,type:t,noMargin:r,className:i,...a}){return(0,n.jsx)(`h${e}`,{className:m(B.title,B[`h${e}`],V[t],r&&B.noMargin,i),...a})}function Ve({type:e,size:t,strong:r,code:i,mono:a,uppercase:o,className:s,...c}){return(0,n.jsx)(`span`,{className:m(B.text,V[e],t!==`md`&&B[t],r&&B.strong,i&&B.code,a&&B.mono,o&&B.uppercase,s),...c})}function He({type:e,className:t,...r}){return(0,n.jsx)(`p`,{className:m(B.paragraph,V[e],t),...r})}var Ue={Title:Be,Text:Ve,Paragraph:He},H={nav:`_nav_13bns_1`,list:`_list_13bns_9`,item:`_item_13bns_18`,link:`_link_13bns_24`,current:`_current_13bns_36`,separator:`_separator_13bns_41`};function We({items:e,renderLink:i,className:a}){let o=i??((e,t)=>(0,n.jsx)(`a`,{className:H.link,href:e,children:t}));return(0,n.jsx)(`nav`,{"aria-label":`Breadcrumb`,className:m(H.nav,a),children:(0,n.jsx)(`ol`,{className:H.list,children:e.map((i,a)=>{let s=a===e.length-1;return(0,n.jsxs)(t.Fragment,{children:[(0,n.jsx)(`li`,{className:H.item,children:i.href&&!s?o(i.href,i.title):(0,n.jsx)(`span`,{className:s?H.current:void 0,"aria-current":s?`page`:void 0,children:i.title})}),!s&&(0,n.jsx)(`span`,{className:H.separator,"aria-hidden":`true`,children:(0,n.jsx)(r.ChevronRight,{})})]},a)})})})}var U={list:`_list_mc9sc_1`,fitted:`_fitted_mc9sc_7`,tab:`_tab_mc9sc_10`,active:`_active_mc9sc_52`,count:`_count_mc9sc_62`};function Ge({items:e,value:t,onChange:r,fitted:i,className:a}){return(0,n.jsx)(`div`,{className:m(U.list,i&&U.fitted,a),role:`tablist`,children:e.map(e=>{let i=e.value===t;return(0,n.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":i,disabled:e.disabled,className:m(U.tab,i&&U.active),onClick:()=>r(e.value),children:[e.icon,e.label,typeof e.count==`number`&&(0,n.jsx)(`span`,{className:U.count,children:e.count})]},e.value)})})}var W={bar:`_bar_mwt55_1`,count:`_count_mwt55_8`,nav:`_nav_mwt55_18`,arrow:`_arrow_mwt55_23`,pages:`_pages_mwt55_52`,page:`_page_mwt55_52`,active:`_active_mwt55_78`,ellipsis:`_ellipsis_mwt55_89`},Ke=`…`;function qe(e,t,n){if(t<=n)return Array.from({length:t},(e,t)=>t+1);let r=Math.max(1,Math.floor((n-3)/2)),i=Math.max(2,e-r),a=Math.min(t-1,e+r),o=[1];i>2&&o.push(Ke);for(let e=i;e<=a;e++)o.push(e);return a<t-1&&o.push(Ke),o.push(t),o}function Je({page:e,pageCount:t,onChange:i,totalItems:a,pageSize:o,siblingCount:s,className:c}){if(t<=1&&a===void 0)return null;let l=qe(e,t,Math.max(5,s)),u=n=>n>=1&&n<=t&&n!==e&&i(n),d=a!==void 0&&o?(()=>{let t=a===0?0:(e-1)*o+1,r=Math.min(e*o,a);return(0,n.jsxs)(`span`,{className:W.count,children:[(0,n.jsx)(`strong`,{children:t}),`–`,(0,n.jsx)(`strong`,{children:r}),` of `,(0,n.jsx)(`strong`,{children:a})]})})():null;return(0,n.jsxs)(`div`,{className:m(W.bar,c),children:[d??(0,n.jsx)(`span`,{}),(0,n.jsxs)(`div`,{className:W.nav,children:[(0,n.jsx)(`button`,{type:`button`,className:W.arrow,onClick:()=>u(e-1),disabled:e<=1,"aria-label":`Previous page`,children:(0,n.jsx)(r.ChevronLeft,{})}),(0,n.jsx)(`div`,{className:W.pages,children:l.map((t,r)=>typeof t==`number`?(0,n.jsx)(`button`,{type:`button`,className:m(W.page,t===e&&W.active),"aria-current":t===e?`page`:void 0,onClick:()=>u(t),children:t},t):(0,n.jsx)(`span`,{className:W.ellipsis,children:t},`e${r}`))}),(0,n.jsx)(`button`,{type:`button`,className:W.arrow,onClick:()=>u(e+1),disabled:e>=t,"aria-label":`Next page`,children:(0,n.jsx)(r.ChevronRight,{})})]})]})}var G={root:`_root_mpq46_1`,panel:`_panel_mpq46_5`,"bav-pop-in":`_bav-pop-in_mpq46_1`,start:`_start_mpq46_17`,end:`_end_mpq46_20`,item:`_item_mpq46_24`,itemIcon:`_itemIcon_mpq46_50`,danger:`_danger_mpq46_58`,separator:`_separator_mpq46_68`,label:`_label_mpq46_73`},Ye=(0,t.createContext)(null);function Xe({trigger:e,align:r,children:i,className:a}){let[o,s]=(0,t.useState)(!1),c=(0,t.useRef)(null);return(0,t.useEffect)(()=>{if(!o)return;let e=e=>{c.current?.contains(e.target)||s(!1)},t=e=>e.key===`Escape`&&s(!1);return document.addEventListener(`mousedown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`keydown`,t)}},[o]),(0,n.jsxs)(`div`,{ref:c,className:m(G.root,a),children:[(0,n.jsx)(`span`,{onClick:()=>s(e=>!e),children:e}),o&&(0,n.jsx)(`div`,{className:m(G.panel,G[r]),role:`menu`,children:(0,n.jsx)(Ye.Provider,{value:{close:()=>s(!1)},children:i})})]})}function Ze({onSelect:e,icon:r,danger:i,disabled:a,children:o}){let s=(0,t.useContext)(Ye);return(0,n.jsxs)(`button`,{type:`button`,role:`menuitem`,disabled:a,className:m(G.item,i&&G.danger),onClick:()=>{e?.(),s?.close()},children:[r&&(0,n.jsx)(`span`,{className:G.itemIcon,children:r}),o]})}function Qe(){return(0,n.jsx)(`div`,{className:G.separator,role:`separator`})}function $e({children:e}){return(0,n.jsx)(`div`,{className:G.label,children:e})}var K={backdrop:`_backdrop_2jxpm_1`,"bav-fade-in":`_bav-fade-in_2jxpm_1`,modal:`_modal_2jxpm_14`,"bav-pop-in":`_bav-pop-in_2jxpm_1`,sm:`_sm_2jxpm_26`,md:`_md_2jxpm_29`,lg:`_lg_2jxpm_32`,header:`_header_2jxpm_36`,title:`_title_2jxpm_42`,close:`_close_2jxpm_48`,body:`_body_2jxpm_73`,footer:`_footer_2jxpm_81`};function et({open:e,onClose:a,title:o,size:s,footer:c,dismissible:l,showClose:u,className:d,children:f}){return(0,t.useEffect)(()=>{if(!e)return;let t=e=>{e.key===`Escape`&&l&&a()};document.addEventListener(`keydown`,t);let n=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.removeEventListener(`keydown`,t),document.body.style.overflow=n}},[e,l,a]),!e||typeof document>`u`?null:(0,i.createPortal)((0,n.jsx)(`div`,{className:K.backdrop,onClick:()=>l&&a(),role:`presentation`,children:(0,n.jsxs)(`div`,{className:m(K.modal,K[s],d),role:`dialog`,"aria-modal":`true`,onClick:e=>e.stopPropagation(),children:[(o||u)&&(0,n.jsxs)(`div`,{className:K.header,children:[o&&(0,n.jsx)(`h2`,{className:K.title,children:o}),u&&(0,n.jsx)(`button`,{type:`button`,className:K.close,onClick:a,"aria-label":`Close`,children:(0,n.jsx)(r.X,{})})]}),(0,n.jsx)(`div`,{className:K.body,children:f}),c&&(0,n.jsx)(`div`,{className:K.footer,children:c})]})}),document.body)}var q={wrap:`_wrap_i3jd9_1`,bubble:`_bubble_i3jd9_5`,top:`_top_i3jd9_30`,bottom:`_bottom_i3jd9_35`,left:`_left_i3jd9_40`,right:`_right_i3jd9_45`};function tt({label:e,placement:t,children:r,className:i}){return(0,n.jsxs)(`span`,{className:m(q.wrap,i),children:[r,(0,n.jsx)(`span`,{role:`tooltip`,className:m(q.bubble,q[t]),children:e})]})}var J={alert:`_alert_11x8q_1`,icon:`_icon_11x8q_13`,content:`_content_11x8q_22`,title:`_title_11x8q_26`,close:`_close_11x8q_30`,info:`_info_11x8q_53`,success:`_success_11x8q_60`,warning:`_warning_11x8q_67`,danger:`_danger_11x8q_74`},nt={info:(0,n.jsx)(r.Info,{}),success:(0,n.jsx)(r.CheckCircle,{}),warning:(0,n.jsx)(r.AlertTriangle,{}),danger:(0,n.jsx)(r.AlertCircle,{})};function rt({tone:e,title:t,children:i,onClose:a,icon:o,className:s}){let c=o!==null;return(0,n.jsxs)(`div`,{className:m(J.alert,J[e],s),role:`alert`,children:[c&&(0,n.jsx)(`span`,{className:J.icon,children:o??nt[e]}),(0,n.jsxs)(`div`,{className:J.content,children:[t&&(0,n.jsx)(`div`,{className:J.title,children:t}),i]}),a&&(0,n.jsx)(`button`,{type:`button`,className:J.close,onClick:a,"aria-label":`Dismiss`,children:(0,n.jsx)(r.X,{})})]})}var Y={empty:`_empty_gusco_1`,icon:`_icon_gusco_10`,title:`_title_gusco_24`,description:`_description_gusco_30`,actions:`_actions_gusco_37`};function it({icon:e,title:t,description:i,actions:a,className:o}){return(0,n.jsxs)(`div`,{className:m(Y.empty,o),children:[(0,n.jsx)(`div`,{className:Y.icon,children:e??(0,n.jsx)(r.Inbox,{})}),(0,n.jsx)(`h3`,{className:Y.title,children:t}),i&&(0,n.jsx)(`p`,{className:Y.description,children:i}),a&&(0,n.jsx)(`div`,{className:Y.actions,children:a})]})}var X={viewport:`_viewport_10jk7_1`,toast:`_toast_10jk7_14`,visible:`_visible_10jk7_33`,leaving:`_leaving_10jk7_38`,error:`_error_10jk7_46`,iconWrapper:`_iconWrapper_10jk7_49`,progressBar:`_progressBar_10jk7_50`,success:`_success_10jk7_54`,info:`_info_10jk7_62`,warning:`_warning_10jk7_70`,message:`_message_10jk7_94`,closeButton:`_closeButton_10jk7_102`,progressTrack:`_progressTrack_10jk7_132`,shrink:`_shrink_10jk7_1`},Z=(0,e.create)(e=>({toasts:[],push:(t,n)=>{let r=Math.random().toString(36).slice(2);return e(e=>({toasts:[...e.toasts,{id:r,message:t,type:n?.type??`info`,duration:n?.duration??6e3}]})),r},dismiss:t=>e(e=>({toasts:e.toasts.filter(e=>e.id!==t)}))})),at={show:(e,t=`info`,n)=>Z.getState().push(e,{type:t,duration:n}),success:(e,t)=>Z.getState().push(e,{type:`success`,duration:t}),error:(e,t)=>Z.getState().push(e,{type:`error`,duration:t}),info:(e,t)=>Z.getState().push(e,{type:`info`,duration:t}),warning:(e,t)=>Z.getState().push(e,{type:`warning`,duration:t})},ot={error:r.AlertCircle,success:r.Smile,info:r.Info,warning:r.AlertTriangle};function st({toast:e,onClose:i}){let[a,o]=(0,t.useState)(!1),[s,c]=(0,t.useState)(!1);(0,t.useEffect)(()=>{requestAnimationFrame(()=>o(!0));let t=setTimeout(l,e.duration);return()=>clearTimeout(t)},[e.duration]);let l=()=>{c(!0),setTimeout(i,280)},u=ot[e.type];return(0,n.jsxs)(`div`,{className:[X.toast,X[e.type],a?X.visible:``,s?X.leaving:``].filter(Boolean).join(` `),role:`alert`,children:[(0,n.jsx)(`div`,{className:X.iconWrapper,children:(0,n.jsx)(u,{})}),(0,n.jsx)(`p`,{className:X.message,children:e.message}),(0,n.jsx)(`button`,{type:`button`,className:X.closeButton,onClick:l,"aria-label":`Dismiss`,children:(0,n.jsx)(r.X,{})}),(0,n.jsx)(`div`,{className:X.progressTrack,children:(0,n.jsx)(`div`,{className:X.progressBar,style:{animationDuration:`${e.duration}ms`}})})]})}function ct(){let e=Z(e=>e.toasts),t=Z(e=>e.dismiss);return(0,n.jsx)(`div`,{className:X.viewport,children:e.map(e=>(0,n.jsx)(st,{toast:e,onClose:()=>t(e.id)},e.id))})}var Q={backdrop:`_backdrop_u5sma_1`,modal:`_modal_u5sma_13`,header:`_header_u5sma_22`,headerContent:`_headerContent_u5sma_26`,icon:`_icon_u5sma_32`,danger:`_danger_u5sma_37`,title:`_title_u5sma_41`,body:`_body_u5sma_48`,error:`_error_u5sma_55`,actions:`_actions_u5sma_67`},$=(0,e.create)(e=>({isOpen:!1,options:null,isLoading:!1,confirm:t=>e({isOpen:!0,options:t,isLoading:!1}),close:()=>e({isOpen:!1,options:null,isLoading:!1}),setLoading:t=>e({isLoading:t})})),lt=e=>$.getState().confirm(e);function ut(){let{isOpen:e,options:i,isLoading:a,close:o,setLoading:s}=$(),[c,l]=(0,t.useState)(null),u=async()=>{if(i){s(!0),l(null);try{await i.onConfirm(),o()}catch(e){l(e instanceof Error?e.message:`An error occurred`),s(!1)}}},d=()=>{a||(i?.onCancel?.(),l(null),o())};if((0,t.useEffect)(()=>{if(!e)return;let t=e=>{e.key===`Escape`&&d(),e.key===`Enter`&&!a&&!c&&u()};return document.addEventListener(`keydown`,t),()=>document.removeEventListener(`keydown`,t)},[e,a,c]),!e||!i)return null;let f=`${Q.modal} ${i.danger?Q.danger:``}`;return(0,n.jsx)(`div`,{className:Q.backdrop,onClick:d,role:`presentation`,children:(0,n.jsxs)(`div`,{className:f,onClick:e=>e.stopPropagation(),role:`alertdialog`,"aria-modal":`true`,"aria-labelledby":`bav-confirm-title`,children:[(0,n.jsx)(`div`,{className:Q.header,children:(0,n.jsxs)(`div`,{className:Q.headerContent,children:[(0,n.jsx)(r.AlertCircle,{className:Q.icon,"aria-hidden":`true`}),(0,n.jsx)(`h2`,{className:Q.title,id:`bav-confirm-title`,children:i.title})]})}),(0,n.jsxs)(`div`,{className:Q.body,children:[typeof i.message==`string`?(0,n.jsx)(`p`,{style:{margin:0},children:i.message}):i.message,c&&(0,n.jsxs)(`div`,{className:Q.error,role:`alert`,children:[(0,n.jsx)(r.AlertCircle,{size:16,"aria-hidden":`true`}),(0,n.jsx)(`span`,{children:c})]})]}),(0,n.jsxs)(`div`,{className:Q.actions,children:[(0,n.jsx)(v,{variant:`ghost`,onClick:d,disabled:a,children:i.cancelText??`Cancel`}),(0,n.jsx)(v,{variant:i.danger?`danger`:`primary`,onClick:u,disabled:a,autoFocus:!0,children:a?`Please wait…`:i.confirmText??`Confirm`})]})]})})}exports.Alert=rt,exports.Avatar=_e,exports.Badge=fe,exports.Breadcrumbs=We,exports.Button=v,exports.Card=Se,exports.CardBody=we,exports.CardFooter=Te,exports.CardHeader=Ce,exports.Checkbox=oe,exports.ConfirmDialog=ut,exports.DescriptionList=Pe,exports.Divider=ye,exports.EmptyState=it,exports.FileInput=ue,exports.Flex=Ie,exports.FormField=le,exports.IconButton=te,exports.Inline=ze,exports.Input=ne,exports.Kbd=he,exports.Menu=Xe,exports.MenuItem=Ze,exports.MenuLabel=$e,exports.MenuSeparator=Qe,exports.Modal=et,exports.Pagination=Je,exports.Panel=Ee,exports.Paragraph=He,exports.ProgressBar=be,exports.Radio=T,exports.RadioGroup=ce,exports.SearchInput=de,exports.Select=ae,exports.Skeleton=ve,exports.Spinner=g,exports.Stack=Re,exports.Stat=xe,exports.Switch=se,exports.Table=De,exports.TableBody=ke,exports.TableCell=Me,exports.TableEmpty=Ne,exports.TableHead=je,exports.TableHeader=Oe,exports.TableRow=Ae,exports.Tabs=Ge,exports.Tag=pe,exports.Text=Ve,exports.Textarea=ie,exports.ThemeProvider=p,exports.Title=Be,exports.ToastViewport=ct,exports.Tooltip=tt,exports.Typography=Ue,exports.confirm=lt,exports.cx=m,exports.darkTheme=a,exports.lightTheme=o,exports.themes=s,exports.toCssVars=l,exports.toast=at,exports.useConfirmStore=$,exports.useThemeStore=f,exports.useToastStore=Z;
|
|
2
|
+
//# sourceMappingURL=bav-ui.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bav-ui.cjs","names":[],"sources":["../src/theme/tokens.ts","../node_modules/.bun/zustand@5.0.14+93dbe784b8baa420/node_modules/zustand/esm/middleware.mjs","../src/theme/useThemeStore.ts","../src/theme/ThemeProvider.tsx","../src/utils/cx.ts","../src/components/Spinner.module.css","../src/components/Spinner.tsx","../src/components/Button.module.css","../src/components/Button.tsx","../src/components/IconButton.module.css","../src/components/IconButton.tsx","../src/components/Input.module.css","../src/components/Input.tsx","../src/components/Textarea.module.css","../src/components/Textarea.tsx","../src/components/Select.module.css","../src/components/Select.tsx","../src/components/Checkbox.module.css","../src/components/Checkbox.tsx","../src/components/Switch.module.css","../src/components/Switch.tsx","../src/components/Radio.module.css","../src/components/Radio.tsx","../src/components/FormField.module.css","../src/components/FormField.tsx","../src/components/FileInput.module.css","../src/components/FileInput.tsx","../src/components/SearchInput.module.css","../src/components/SearchInput.tsx","../src/components/Badge.module.css","../src/components/Badge.tsx","../src/components/Tag.module.css","../src/components/Tag.tsx","../src/components/Kbd.module.css","../src/components/Kbd.tsx","../src/components/Avatar.module.css","../src/components/Avatar.tsx","../src/components/Skeleton.module.css","../src/components/Skeleton.tsx","../src/components/Divider.module.css","../src/components/Divider.tsx","../src/components/ProgressBar.module.css","../src/components/ProgressBar.tsx","../src/components/Stat.module.css","../src/components/Stat.tsx","../src/components/Card.module.css","../src/components/Card.tsx","../src/components/Panel.module.css","../src/components/Panel.tsx","../src/components/Table.module.css","../src/components/Table.tsx","../src/components/DescriptionList.module.css","../src/components/DescriptionList.tsx","../src/components/Flex.tsx","../src/components/Layout.tsx","../src/components/Typography.module.css","../src/components/Typography.tsx","../src/components/Breadcrumbs.module.css","../src/components/Breadcrumbs.tsx","../src/components/Tabs.module.css","../src/components/Tabs.tsx","../src/components/Pagination.module.css","../src/components/Pagination.tsx","../src/components/Menu.module.css","../src/components/Menu.tsx","../src/components/Modal.module.css","../src/components/Modal.tsx","../src/components/Tooltip.module.css","../src/components/Tooltip.tsx","../src/components/Alert.module.css","../src/components/Alert.tsx","../src/components/EmptyState.module.css","../src/components/EmptyState.tsx","../src/components/Toast.module.css","../src/components/toastStore.ts","../src/components/Toast.tsx","../src/components/ConfirmDialog.module.css","../src/components/confirmStore.ts","../src/components/ConfirmDialog.tsx"],"sourcesContent":["export interface ThemeTokens {\n primary: string;\n bg: string;\n panel: string;\n card: string;\n border: string;\n text: string;\n muted: string;\n accent: string;\n danger: string;\n success: string;\n warning: string;\n focus: string;\n chipsBackground: string;\n chipsBackgroundActive: string;\n buttons: string;\n shadow: string;\n}\n\nexport type ThemeName = \"dark\" | \"light\";\n\nexport const darkTheme: ThemeTokens = {\n primary: \"#ffffff\",\n bg: \"#000000\",\n panel: \"#111111\",\n card: \"#1a1a1a\",\n border: \"#333333\",\n text: \"#ffffff\",\n muted: \"#b3b3b3\",\n accent: \"#60a5fa\",\n danger: \"#ff4444\",\n success: \"#4caf50\",\n warning: \"#f59e0b\",\n focus: \"rgba(255, 255, 255, 0.3)\",\n chipsBackground: \"rgba(255, 255, 255, 0.04)\",\n chipsBackgroundActive: \"rgba(255, 255, 255, 0.12)\",\n buttons: \"#2a2a2a\",\n shadow: \"rgba(0, 0, 0, 0.2)\",\n};\n\nexport const lightTheme: ThemeTokens = {\n primary: \"#000000\",\n bg: \"#ffffff\",\n panel: \"#eeeeee\",\n card: \"#efefef\",\n border: \"#bbbbbb\",\n text: \"#000000\",\n muted: \"#323232\",\n accent: \"#2563eb\",\n danger: \"#ff4444\",\n success: \"#4caf50\",\n warning: \"#d97706\",\n focus: \"rgba(0, 0, 0, 0.25)\",\n chipsBackground: \"#efefef\",\n chipsBackgroundActive: \"rgba(0, 0, 0, 0.08)\",\n buttons: \"#dcdcdc\",\n shadow: \"rgba(0, 0, 0, 0.12)\",\n};\n\nexport const themes: Record<ThemeName, ThemeTokens> = {\n dark: darkTheme,\n light: lightTheme,\n};\n\nconst KEY_TO_VAR: Record<keyof ThemeTokens, string> = {\n primary: \"--primary\",\n bg: \"--bg\",\n panel: \"--panel\",\n card: \"--card\",\n border: \"--border\",\n text: \"--text\",\n muted: \"--muted\",\n accent: \"--accent\",\n danger: \"--danger\",\n success: \"--success\",\n warning: \"--warning\",\n focus: \"--focus\",\n chipsBackground: \"--chips-background\",\n chipsBackgroundActive: \"--chips-background-active\",\n buttons: \"--buttons\",\n shadow: \"--shadow\",\n};\n\nexport function toCssVars(tokens: ThemeTokens): Record<string, string> {\n const out: Record<string, string> = {};\n for (const key of Object.keys(tokens) as (keyof ThemeTokens)[]) {\n out[KEY_TO_VAR[key]] = tokens[key];\n }\n return out;\n}\n","const reduxImpl = (reducer, initial) => (set, _get, api) => {\n api.dispatch = (action) => {\n set((state) => reducer(state, action), false, action);\n return action;\n };\n api.dispatchFromDevtools = true;\n return { dispatch: (...args) => api.dispatch(...args), ...initial };\n};\nconst redux = reduxImpl;\n\nconst shouldDispatchFromDevtools = (api) => !!api.dispatchFromDevtools && typeof api.dispatch === \"function\";\nconst trackedConnections = /* @__PURE__ */ new Map();\nconst getTrackedConnectionState = (name) => {\n const api = trackedConnections.get(name);\n if (!api) return {};\n return Object.fromEntries(\n Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])\n );\n};\nconst extractConnectionInformation = (store, extensionConnector, options) => {\n if (store === void 0) {\n return {\n type: \"untracked\",\n connection: extensionConnector.connect(options)\n };\n }\n const existingConnection = trackedConnections.get(options.name);\n if (existingConnection) {\n return { type: \"tracked\", store, ...existingConnection };\n }\n const newConnection = {\n connection: extensionConnector.connect(options),\n stores: {}\n };\n trackedConnections.set(options.name, newConnection);\n return { type: \"tracked\", store, ...newConnection };\n};\nconst removeStoreFromTrackedConnections = (name, store) => {\n if (store === void 0) return;\n const connectionInfo = trackedConnections.get(name);\n if (!connectionInfo) return;\n delete connectionInfo.stores[store];\n if (Object.keys(connectionInfo.stores).length === 0) {\n trackedConnections.delete(name);\n }\n};\nconst v8StackLineRe = /.+ (.+) .+/;\nconst geckoStackLineRe = /^([^@]+)@/;\nfunction findCallerName(stack) {\n var _a, _b, _c;\n if (!stack) return void 0;\n const traceLines = stack.split(\"\\n\");\n const apiSetStateLineIndex = traceLines.findIndex(\n (traceLine) => traceLine.includes(\"api.setState\")\n );\n if (apiSetStateLineIndex < 0) return void 0;\n const callerLine = ((_a = traceLines[apiSetStateLineIndex + 1]) == null ? void 0 : _a.trim()) || \"\";\n return ((_b = v8StackLineRe.exec(callerLine)) == null ? void 0 : _b[1]) || ((_c = geckoStackLineRe.exec(callerLine)) == null ? void 0 : _c[1]);\n}\nconst devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {\n const { enabled, anonymousActionType, store, ...options } = devtoolsOptions;\n let extensionConnector;\n try {\n extensionConnector = (enabled != null ? enabled : (import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") && window.__REDUX_DEVTOOLS_EXTENSION__;\n } catch (e) {\n }\n if (!extensionConnector) {\n return fn(set, get, api);\n }\n const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options);\n let isRecording = true;\n api.setState = ((state, replace, nameOrAction) => {\n const r = set(state, replace);\n if (!isRecording) return r;\n const action = nameOrAction === void 0 ? {\n type: anonymousActionType || findCallerName(new Error().stack) || \"anonymous\"\n } : typeof nameOrAction === \"string\" ? { type: nameOrAction } : nameOrAction;\n if (store === void 0) {\n connection == null ? void 0 : connection.send(action, get());\n return r;\n }\n connection == null ? void 0 : connection.send(\n {\n ...action,\n type: `${store}/${action.type}`\n },\n {\n ...getTrackedConnectionState(options.name),\n [store]: api.getState()\n }\n );\n return r;\n });\n api.devtools = {\n cleanup: () => {\n if (connection && typeof connection.unsubscribe === \"function\") {\n connection.unsubscribe();\n }\n removeStoreFromTrackedConnections(options.name, store);\n }\n };\n const setStateFromDevtools = (...a) => {\n const originalIsRecording = isRecording;\n isRecording = false;\n set(...a);\n isRecording = originalIsRecording;\n };\n const initialState = fn(api.setState, get, api);\n if (connectionInformation.type === \"untracked\") {\n connection == null ? void 0 : connection.init(initialState);\n } else {\n connectionInformation.stores[connectionInformation.store] = api;\n connection == null ? void 0 : connection.init(\n Object.fromEntries(\n Object.entries(connectionInformation.stores).map(([key, store2]) => [\n key,\n key === connectionInformation.store ? initialState : store2.getState()\n ])\n )\n );\n }\n if (shouldDispatchFromDevtools(api)) {\n let didWarnAboutReservedActionType = false;\n const originalDispatch = api.dispatch;\n api.dispatch = (...args) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && args[0].type === \"__setState\" && !didWarnAboutReservedActionType) {\n console.warn(\n '[zustand devtools middleware] \"__setState\" action type is reserved to set state from the devtools. Avoid using it.'\n );\n didWarnAboutReservedActionType = true;\n }\n originalDispatch(...args);\n };\n }\n connection.subscribe((message) => {\n var _a;\n switch (message.type) {\n case \"ACTION\":\n if (typeof message.payload !== \"string\") {\n console.error(\n \"[zustand devtools middleware] Unsupported action format\"\n );\n return;\n }\n return parseJsonThen(\n message.payload,\n (action) => {\n if (action.type === \"__setState\") {\n if (store === void 0) {\n setStateFromDevtools(action.state);\n return;\n }\n if (Object.keys(action.state).length !== 1) {\n console.error(\n `\n [zustand devtools middleware] Unsupported __setState action format.\n When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),\n and value of this only key should be a state object. Example: { \"type\": \"__setState\", \"state\": { \"abc123Store\": { \"foo\": \"bar\" } } }\n `\n );\n }\n const stateFromDevtools = action.state[store];\n if (stateFromDevtools === void 0 || stateFromDevtools === null) {\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {\n setStateFromDevtools(stateFromDevtools);\n }\n return;\n }\n if (shouldDispatchFromDevtools(api)) {\n api.dispatch(action);\n }\n }\n );\n case \"DISPATCH\":\n switch (message.payload.type) {\n case \"RESET\":\n setStateFromDevtools(initialState);\n if (store === void 0) {\n return connection == null ? void 0 : connection.init(api.getState());\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"COMMIT\":\n if (store === void 0) {\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"ROLLBACK\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n setStateFromDevtools(state[store]);\n connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n });\n case \"JUMP_TO_STATE\":\n case \"JUMP_TO_ACTION\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {\n setStateFromDevtools(state[store]);\n }\n });\n case \"IMPORT_STATE\": {\n const { nextLiftedState } = message.payload;\n const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;\n if (!lastComputedState) return;\n if (store === void 0) {\n setStateFromDevtools(lastComputedState);\n } else {\n setStateFromDevtools(lastComputedState[store]);\n }\n connection == null ? void 0 : connection.send(\n null,\n // FIXME no-any\n nextLiftedState\n );\n return;\n }\n case \"PAUSE_RECORDING\":\n return isRecording = !isRecording;\n }\n return;\n }\n });\n return initialState;\n};\nconst devtools = devtoolsImpl;\nconst parseJsonThen = (stringified, fn) => {\n let parsed;\n try {\n parsed = JSON.parse(stringified);\n } catch (e) {\n console.error(\n \"[zustand devtools middleware] Could not parse the received json\",\n e\n );\n }\n if (parsed !== void 0) fn(parsed);\n};\n\nconst subscribeWithSelectorImpl = (fn) => (set, get, api) => {\n const origSubscribe = api.subscribe;\n api.subscribe = ((selector, optListener, options) => {\n let listener = selector;\n if (optListener) {\n const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;\n let currentSlice = selector(api.getState());\n listener = (state) => {\n const nextSlice = selector(state);\n if (!equalityFn(currentSlice, nextSlice)) {\n const previousSlice = currentSlice;\n optListener(currentSlice = nextSlice, previousSlice);\n }\n };\n if (options == null ? void 0 : options.fireImmediately) {\n optListener(currentSlice, currentSlice);\n }\n }\n return origSubscribe(listener);\n });\n const initialState = fn(set, get, api);\n return initialState;\n};\nconst subscribeWithSelector = subscribeWithSelectorImpl;\n\nfunction combine(initialState, create) {\n return (...args) => Object.assign({}, initialState, create(...args));\n}\n\nfunction createJSONStorage(getStorage, options) {\n let storage;\n try {\n storage = getStorage();\n } catch (e) {\n return;\n }\n const persistStorage = {\n getItem: (name) => {\n var _a;\n const parse = (str2) => {\n if (str2 === null) {\n return null;\n }\n return JSON.parse(str2, options == null ? void 0 : options.reviver);\n };\n const str = (_a = storage.getItem(name)) != null ? _a : null;\n if (str instanceof Promise) {\n return str.then(parse);\n }\n return parse(str);\n },\n setItem: (name, newValue) => storage.setItem(name, JSON.stringify(newValue, options == null ? void 0 : options.replacer)),\n removeItem: (name) => storage.removeItem(name)\n };\n return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n try {\n const result = fn(input);\n if (result instanceof Promise) {\n return result;\n }\n return {\n then(onFulfilled) {\n return toThenable(onFulfilled)(result);\n },\n catch(_onRejected) {\n return this;\n }\n };\n } catch (e) {\n return {\n then(_onFulfilled) {\n return this;\n },\n catch(onRejected) {\n return toThenable(onRejected)(e);\n }\n };\n }\n};\nconst persistImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n storage: createJSONStorage(() => window.localStorage),\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n let hydrationVersion = 0;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage = options.storage;\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const setItem = () => {\n const state = options.partialize({ ...get() });\n return storage.setItem(options.name, {\n state,\n version: options.version\n });\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n return setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n return setItem();\n },\n get,\n api\n );\n api.getInitialState = () => configResult;\n let stateFromStorage;\n const hydrate = () => {\n var _a, _b;\n if (!storage) return;\n const currentVersion = ++hydrationVersion;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => {\n var _a2;\n return cb((_a2 = get()) != null ? _a2 : configResult);\n });\n const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n const migration = options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n if (migration instanceof Promise) {\n return migration.then((result) => [true, result]);\n }\n return [true, migration];\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return [false, deserializedStorageValue.state];\n }\n }\n return [false, void 0];\n }).then((migrationResult) => {\n var _a2;\n if (currentVersion !== hydrationVersion) {\n return;\n }\n const [migrated, migratedState] = migrationResult;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n if (migrated) {\n return setItem();\n }\n }).then(() => {\n if (currentVersion !== hydrationVersion) {\n return;\n }\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(get(), void 0);\n stateFromStorage = get();\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n if (currentVersion !== hydrationVersion) {\n return;\n }\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.storage) {\n storage = newOptions.storage;\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n if (!options.skipHydration) {\n hydrate();\n }\n return stateFromStorage || configResult;\n};\nconst persist = persistImpl;\n\nfunction ssrSafe(config, isSSR = typeof window === \"undefined\") {\n return (set, get, api) => {\n if (!isSSR) {\n return config(set, get, api);\n }\n const ssrSet = () => {\n throw new Error(\"Cannot set state of Zustand store in SSR\");\n };\n api.setState = ssrSet;\n return config(ssrSet, get, api);\n };\n}\n\nexport { combine, createJSONStorage, devtools, persist, redux, subscribeWithSelector, ssrSafe as unstable_ssrSafe };\n","import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport { themes, type ThemeName, type ThemeTokens } from \"./tokens\";\n\ninterface ThemeStore {\n currentTheme: ThemeName;\n tokens: ThemeTokens;\n setTheme: (theme: ThemeName) => void;\n toggleTheme: () => void;\n}\n\nexport const useThemeStore = create<ThemeStore>()(\n persist(\n (set, get) => ({\n currentTheme: \"dark\",\n tokens: themes.dark,\n setTheme: (theme) => set({ currentTheme: theme, tokens: themes[theme] }),\n toggleTheme: () => {\n const next: ThemeName = get().currentTheme === \"dark\" ? \"light\" : \"dark\";\n set({ currentTheme: next, tokens: themes[next] });\n },\n }),\n { name: \"bav-theme\" },\n ),\n);\n","import { useEffect, type ReactNode } from \"react\";\nimport { useThemeStore } from \"./useThemeStore\";\nimport { toCssVars } from \"./tokens\";\n\nexport interface ThemeProviderProps {\n children: ReactNode;\n}\n\nexport function ThemeProvider({ children }: ThemeProviderProps) {\n const tokens = useThemeStore((s) => s.tokens);\n const currentTheme = useThemeStore((s) => s.currentTheme);\n\n useEffect(() => {\n const root = document.documentElement;\n const vars = toCssVars(tokens);\n for (const [name, value] of Object.entries(vars)) {\n root.style.setProperty(name, value);\n }\n root.setAttribute(\"data-theme\", currentTheme);\n }, [tokens, currentTheme]);\n\n return <>{children}</>;\n}\n","export type ClassValue = unknown;\n\nexport const cx = (...values: ClassValue[]): string =>\n values.filter((v): v is string => typeof v === \"string\" && v.length > 0).join(\" \");\n",".spinner {\n display: inline-block;\n border-radius: 50%;\n border: 2px solid var(--chips-background-active);\n border-top-color: var(--accent);\n animation: bav-spin 0.7s linear infinite;\n}\n","import styles from \"./Spinner.module.css\";\n\nexport interface SpinnerProps {\n size?: number;\n className?: string;\n}\n\nexport function Spinner({ size, className }: SpinnerProps) {\n return (\n <span\n className={`${styles.spinner} ${className}`}\n style={{ width: size, height: size }}\n role=\"status\"\n aria-label=\"Loading\"\n />\n );\n}\n",".button {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--space-2);\n border: 1px solid var(--border);\n background: var(--buttons);\n color: var(--text);\n border-radius: var(--radius-md);\n font-weight: 500;\n line-height: 1;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition:\n background var(--dur) ease,\n border-color var(--dur) ease,\n transform var(--dur-fast) ease,\n opacity var(--dur) ease,\n color var(--dur) ease;\n}\n\n.button:hover:not(:disabled) {\n background: var(--chips-background-active);\n border-color: var(--focus);\n}\n.button:active:not(:disabled) {\n transform: scale(0.97);\n}\n.button:focus-visible {\n outline: none;\n box-shadow: var(--ring);\n}\n.button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.sm {\n height: 32px;\n padding: 0 12px;\n font-size: var(--fs-sm);\n}\n.md {\n height: 40px;\n padding: 0 18px;\n font-size: var(--fs-sm);\n}\n.lg {\n height: 48px;\n padding: 0 24px;\n font-size: var(--fs-md);\n}\n\n.primary {\n background: var(--accent);\n border-color: var(--accent);\n color: #fff;\n}\n.primary:hover:not(:disabled) {\n filter: brightness(1.08);\n background: var(--accent);\n border-color: var(--accent);\n}\n.danger {\n background: var(--danger);\n border-color: var(--danger);\n color: #fff;\n}\n.danger:hover:not(:disabled) {\n filter: brightness(1.08);\n background: var(--danger);\n border-color: var(--danger);\n}\n.subtle {\n background: var(--chips-background);\n border-color: transparent;\n}\n.ghost {\n background: transparent;\n border-color: transparent;\n}\n.ghost:hover:not(:disabled) {\n background: var(--chips-background);\n border-color: transparent;\n}\n\n.block {\n width: 100%;\n}\n\n.loading {\n color: transparent !important;\n pointer-events: none;\n}\n.spinner {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n.icon svg {\n width: 1em;\n height: 1em;\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport { Spinner } from \"./Spinner\";\nimport styles from \"./Button.module.css\";\n\nexport type ButtonVariant = \"default\" | \"primary\" | \"danger\" | \"subtle\" | \"ghost\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n block?: boolean;\n loading?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n}\n\nconst variantClass: Record<ButtonVariant, string> = {\n default: \"\",\n primary: styles.primary,\n danger: styles.danger,\n subtle: styles.subtle,\n ghost: styles.ghost,\n};\n\nexport function Button({\n variant,\n size,\n block,\n loading,\n leftIcon,\n rightIcon,\n className,\n type,\n disabled,\n children,\n ...rest\n}: ButtonProps) {\n return (\n <button\n type={type}\n disabled={disabled || loading}\n className={cx(\n styles.button,\n styles[size!],\n variantClass[variant!],\n block && styles.block,\n loading && styles.loading,\n className,\n )}\n {...rest}\n >\n {loading && (\n <span className={styles.spinner}>\n <Spinner size={size === \"lg\" ? 20 : 16} />\n </span>\n )}\n {leftIcon && <span className={styles.icon}>{leftIcon}</span>}\n {children}\n {rightIcon && <span className={styles.icon}>{rightIcon}</span>}\n </button>\n );\n}\n",".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 1px solid transparent;\n background: transparent;\n color: var(--muted);\n border-radius: var(--radius-md);\n cursor: pointer;\n transition:\n background var(--dur-fast) ease,\n color var(--dur-fast) ease,\n border-color var(--dur-fast) ease,\n transform var(--dur-fast) ease;\n}\n.button:hover:not(:disabled) {\n background: var(--chips-background-active);\n color: var(--text);\n}\n.button:active:not(:disabled) {\n transform: scale(0.92);\n}\n.button:focus-visible {\n outline: none;\n box-shadow: var(--ring);\n}\n.button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.solid {\n background: var(--chips-background);\n}\n.danger:hover:not(:disabled) {\n background: rgba(255, 68, 68, 0.15);\n color: var(--danger);\n}\n\n.sm {\n width: 28px;\n height: 28px;\n}\n.md {\n width: 34px;\n height: 34px;\n}\n.lg {\n width: 42px;\n height: 42px;\n}\n\n.button svg {\n width: 60%;\n height: 60%;\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./IconButton.module.css\";\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n label: string;\n size?: \"sm\" | \"md\" | \"lg\";\n variant?: \"ghost\" | \"solid\" | \"danger\";\n children: ReactNode;\n}\n\nexport function IconButton({\n label,\n size,\n variant,\n className,\n type,\n children,\n ...rest\n}: IconButtonProps) {\n return (\n <button\n type={type}\n aria-label={label}\n title={label}\n className={cx(\n styles.button,\n styles[size!],\n variant === \"solid\" && styles.solid,\n variant === \"danger\" && styles.danger,\n className,\n )}\n {...rest}\n >\n {children}\n </button>\n );\n}\n",".wrap {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.input {\n width: 100%;\n border: 1px solid var(--border);\n border-radius: var(--radius-md);\n background: var(--card);\n color: var(--text);\n outline: none;\n transition:\n border-color var(--dur) ease,\n box-shadow var(--dur) ease;\n}\n.input::placeholder {\n color: var(--muted);\n opacity: 0.65;\n}\n.input:focus {\n border-color: var(--accent);\n box-shadow: var(--ring);\n}\n.input:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n.sm {\n height: 36px;\n padding: 0 12px;\n font-size: var(--fs-sm);\n}\n.md {\n height: 44px;\n padding: 0 14px;\n font-size: var(--fs-md);\n}\n\n.invalid {\n border-color: var(--danger);\n}\n.invalid:focus {\n border-color: var(--danger);\n box-shadow: 0 0 0 3px rgba(255, 68, 68, 0.18);\n}\n\n.hasIcon.sm {\n padding-left: 36px;\n}\n.hasIcon.md {\n padding-left: 42px;\n}\n.icon {\n position: absolute;\n left: 14px;\n display: flex;\n align-items: center;\n color: var(--muted);\n pointer-events: none;\n}\n.icon svg {\n width: 16px;\n height: 16px;\n}\n.wrap:focus-within .icon {\n color: var(--text);\n}\n","import { forwardRef, type InputHTMLAttributes, type ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Input.module.css\";\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n inputSize?: \"sm\" | \"md\";\n invalid?: boolean;\n leftIcon?: ReactNode;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n { inputSize, invalid, leftIcon, className, ...rest },\n ref,\n) {\n return (\n <span className={styles.wrap}>\n {leftIcon && <span className={styles.icon}>{leftIcon}</span>}\n <input\n ref={ref}\n aria-invalid={invalid || undefined}\n className={cx(\n styles.input,\n styles[inputSize!],\n leftIcon && styles.hasIcon,\n invalid && styles.invalid,\n className,\n )}\n {...rest}\n />\n </span>\n );\n});\n",".textarea {\n width: 100%;\n min-height: 96px;\n padding: 12px 14px;\n border: 1px solid var(--border);\n border-radius: var(--radius-md);\n background: var(--card);\n color: var(--text);\n font-size: var(--fs-sm);\n line-height: 1.5;\n resize: vertical;\n outline: none;\n transition:\n border-color var(--dur) ease,\n box-shadow var(--dur) ease;\n}\n.textarea::placeholder {\n color: var(--muted);\n opacity: 0.65;\n}\n.textarea:focus {\n border-color: var(--accent);\n box-shadow: var(--ring);\n}\n.textarea:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n.invalid {\n border-color: var(--danger);\n}\n.invalid:focus {\n border-color: var(--danger);\n box-shadow: 0 0 0 3px rgba(255, 68, 68, 0.18);\n}\n","import { forwardRef, type TextareaHTMLAttributes } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Textarea.module.css\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n invalid?: boolean;\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { invalid, className, ...rest },\n ref,\n) {\n return (\n <textarea\n ref={ref}\n aria-invalid={invalid || undefined}\n className={cx(styles.textarea, invalid && styles.invalid, className)}\n {...rest}\n />\n );\n});\n",".wrap {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 100%;\n}\n\n.select {\n width: 100%;\n height: 44px;\n padding: 0 38px 0 14px;\n border: 1px solid var(--border);\n border-radius: var(--radius-md);\n background: var(--card);\n color: var(--text);\n font-size: var(--fs-sm);\n cursor: pointer;\n outline: none;\n appearance: none;\n transition:\n border-color var(--dur) ease,\n box-shadow var(--dur) ease;\n}\n.select:focus {\n border-color: var(--accent);\n box-shadow: var(--ring);\n}\n.select:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n.sm {\n height: 36px;\n font-size: var(--fs-sm);\n}\n.invalid {\n border-color: var(--danger);\n}\n\n.chevron {\n position: absolute;\n right: 12px;\n width: 16px;\n height: 16px;\n color: var(--muted);\n pointer-events: none;\n}\n","import { forwardRef, type SelectHTMLAttributes } from \"react\";\nimport { ChevronDown } from \"react-feather\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Select.module.css\";\n\nexport interface SelectOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, \"size\"> {\n selectSize?: \"sm\" | \"md\";\n invalid?: boolean;\n options?: SelectOption[];\n placeholder?: string;\n}\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(function Select(\n { selectSize, invalid, options, placeholder, className, children, ...rest },\n ref,\n) {\n return (\n <span className={styles.wrap}>\n <select\n ref={ref}\n aria-invalid={invalid || undefined}\n className={cx(\n styles.select,\n selectSize === \"sm\" && styles.sm,\n invalid && styles.invalid,\n className,\n )}\n {...rest}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options\n ? options.map((o) => (\n <option key={o.value} value={o.value} disabled={o.disabled}>\n {o.label}\n </option>\n ))\n : children}\n </select>\n <ChevronDown className={styles.chevron} />\n </span>\n );\n});\n",".label {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n cursor: pointer;\n color: var(--text);\n font-size: var(--fs-sm);\n user-select: none;\n}\n.label.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.native {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n flex-shrink: 0;\n border: 1px solid var(--border);\n border-radius: var(--radius-sm);\n background: var(--card);\n color: transparent;\n transition:\n background var(--dur-fast) ease,\n border-color var(--dur-fast) ease,\n color var(--dur-fast) ease;\n}\n.box svg {\n width: 13px;\n height: 13px;\n stroke-width: 3;\n}\n\n.native:checked + .box {\n background: var(--accent);\n border-color: var(--accent);\n color: #fff;\n}\n.native:focus-visible + .box {\n box-shadow: var(--ring);\n}\n","import { forwardRef, type InputHTMLAttributes, type ReactNode } from \"react\";\nimport { Check } from \"react-feather\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Checkbox.module.css\";\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n children?: ReactNode;\n}\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n { children, className, disabled, ...rest },\n ref,\n) {\n return (\n <label className={cx(styles.label, disabled && styles.disabled, className)}>\n <input ref={ref} type=\"checkbox\" className={styles.native} disabled={disabled} {...rest} />\n <span className={styles.box} aria-hidden=\"true\">\n <Check />\n </span>\n {children && <span>{children}</span>}\n </label>\n );\n});\n",".label {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n cursor: pointer;\n color: var(--text);\n font-size: var(--fs-sm);\n user-select: none;\n}\n.label.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.native {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.track {\n position: relative;\n width: 38px;\n height: 22px;\n flex-shrink: 0;\n border-radius: var(--radius-pill);\n background: var(--chips-background-active);\n border: 1px solid var(--border);\n transition:\n background var(--dur) ease,\n border-color var(--dur) ease;\n}\n.thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--muted);\n transition:\n transform var(--dur) var(--ease-out),\n background var(--dur) ease;\n}\n\n.native:checked + .track {\n background: var(--accent);\n border-color: var(--accent);\n}\n.native:checked + .track .thumb {\n transform: translateX(16px);\n background: #fff;\n}\n.native:focus-visible + .track {\n box-shadow: var(--ring);\n}\n","import { forwardRef, type InputHTMLAttributes, type ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Switch.module.css\";\n\nexport interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n children?: ReactNode;\n}\n\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(function Switch(\n { children, className, disabled, ...rest },\n ref,\n) {\n return (\n <label className={cx(styles.label, disabled && styles.disabled, className)}>\n <input\n ref={ref}\n type=\"checkbox\"\n role=\"switch\"\n className={styles.native}\n disabled={disabled}\n {...rest}\n />\n <span className={styles.track} aria-hidden=\"true\">\n <span className={styles.thumb} />\n </span>\n {children && <span>{children}</span>}\n </label>\n );\n});\n",".group {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n.group.horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--space-4);\n}\n\n.label {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n cursor: pointer;\n color: var(--text);\n font-size: var(--fs-sm);\n user-select: none;\n}\n.label.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.native {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.dot {\n position: relative;\n display: inline-flex;\n width: 18px;\n height: 18px;\n flex-shrink: 0;\n border: 1px solid var(--border);\n border-radius: 50%;\n background: var(--card);\n transition: border-color var(--dur-fast) ease;\n}\n.dot::after {\n content: \"\";\n position: absolute;\n inset: 0;\n margin: auto;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--accent);\n transform: scale(0);\n transition: transform var(--dur-fast) var(--ease-out);\n}\n.native:checked + .dot {\n border-color: var(--accent);\n}\n.native:checked + .dot::after {\n transform: scale(1);\n}\n.native:focus-visible + .dot {\n box-shadow: var(--ring);\n}\n","import { type InputHTMLAttributes, type ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Radio.module.css\";\n\nexport interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n children?: ReactNode;\n}\n\nexport function Radio({ children, className, disabled, ...rest }: RadioProps) {\n return (\n <label className={cx(styles.label, disabled && styles.disabled, className)}>\n <input type=\"radio\" className={styles.native} disabled={disabled} {...rest} />\n <span className={styles.dot} aria-hidden=\"true\" />\n {children && <span>{children}</span>}\n </label>\n );\n}\n\nexport interface RadioOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n name: string;\n value?: string;\n options: RadioOption[];\n onChange?: (value: string) => void;\n horizontal?: boolean;\n className?: string;\n}\n\nexport function RadioGroup({\n name,\n value,\n options,\n onChange,\n horizontal,\n className,\n}: RadioGroupProps) {\n return (\n <div role=\"radiogroup\" className={cx(styles.group, horizontal && styles.horizontal, className)}>\n {options.map((o) => (\n <Radio\n key={o.value}\n name={name}\n value={o.value}\n checked={value === o.value}\n disabled={o.disabled}\n onChange={(e) => onChange?.(e.target.value)}\n >\n {o.label}\n </Radio>\n ))}\n </div>\n );\n}\n",".field {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n width: 100%;\n}\n\n.labelRow {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.label {\n font-size: var(--fs-sm);\n font-weight: 500;\n color: var(--text);\n}\n.required {\n color: var(--danger);\n margin-left: 2px;\n}\n\n.optional {\n font-size: var(--fs-xs);\n color: var(--muted);\n}\n\n.hint {\n font-size: var(--fs-xs);\n color: var(--muted);\n}\n.error {\n font-size: var(--fs-xs);\n color: var(--danger);\n}\n","import { useId, type ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./FormField.module.css\";\n\nexport interface FormFieldProps {\n label?: ReactNode;\n hint?: ReactNode;\n error?: ReactNode;\n required?: boolean;\n optional?: boolean;\n className?: string;\n children: ReactNode | ((props: { id: string; invalid: boolean }) => ReactNode);\n}\n\nexport function FormField({\n label,\n hint,\n error,\n required,\n optional,\n className,\n children,\n}: FormFieldProps) {\n const id = useId();\n const invalid = Boolean(error);\n\n return (\n <div className={cx(styles.field, className)}>\n {(label || optional) && (\n <div className={styles.labelRow}>\n {label && (\n <label htmlFor={id} className={styles.label}>\n {label}\n {required && <span className={styles.required}>*</span>}\n </label>\n )}\n {optional && !required && <span className={styles.optional}>Optional</span>}\n </div>\n )}\n {typeof children === \"function\" ? children({ id, invalid }) : children}\n {error ? (\n <span className={styles.error}>{error}</span>\n ) : hint ? (\n <span className={styles.hint}>{hint}</span>\n ) : null}\n </div>\n );\n}\n",".drop {\n position: relative;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 1px dashed var(--border);\n border-radius: var(--radius-lg);\n background: var(--card);\n color: var(--muted);\n cursor: pointer;\n transition:\n border-color var(--dur) ease,\n color var(--dur) ease;\n}\n\n.drop:hover {\n border-color: var(--accent);\n color: var(--text);\n}\n\n.drop[data-has-file=\"true\"] {\n border-style: solid;\n color: var(--text);\n}\n\n.input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n cursor: pointer;\n}\n\n.input:disabled {\n cursor: not-allowed;\n}\n\n.disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n.invalid {\n border-color: var(--danger);\n}\n\n.icon {\n display: flex;\n align-items: center;\n color: var(--muted);\n flex-shrink: 0;\n}\n\n.icon svg {\n width: 18px;\n height: 18px;\n}\n\n.label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--fs-sm);\n}\n","import { forwardRef, type InputHTMLAttributes, type ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./FileInput.module.css\";\n\nexport interface FileInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"value\" | \"type\" | \"placeholder\"\n> {\n onFileChange?: (file: File | null) => void;\n fileName?: ReactNode;\n placeholder?: ReactNode;\n icon?: ReactNode;\n invalid?: boolean;\n}\n\nexport const FileInput = forwardRef<HTMLInputElement, FileInputProps>(function FileInput(\n {\n onFileChange,\n fileName,\n placeholder,\n icon,\n invalid,\n disabled,\n className,\n ...rest\n },\n ref,\n) {\n return (\n <label\n className={cx(styles.drop, invalid && styles.invalid, disabled && styles.disabled, className)}\n data-has-file={fileName ? \"true\" : undefined}\n >\n <input\n ref={ref}\n type=\"file\"\n disabled={disabled}\n className={styles.input}\n onChange={(e) => onFileChange?.(e.target.files?.[0] ?? null)}\n {...rest}\n />\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{fileName ?? placeholder}</span>\n </label>\n );\n});\n",".row {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n}\n.icon {\n position: absolute;\n left: 14px;\n display: flex;\n align-items: center;\n color: var(--muted);\n pointer-events: none;\n transition: color var(--dur) ease;\n}\n.icon svg {\n width: 16px;\n height: 16px;\n}\n.input {\n width: 100%;\n height: 44px;\n padding: 0 44px;\n border: 1px solid var(--border);\n border-radius: var(--radius-lg);\n background: var(--card);\n color: var(--text);\n font-size: var(--fs-md);\n outline: none;\n transition:\n border-color var(--dur) ease,\n box-shadow var(--dur) ease;\n}\n.input::placeholder {\n color: var(--muted);\n opacity: 0.65;\n}\n.input::-webkit-search-cancel-button {\n display: none;\n}\n.input:focus {\n border-color: var(--accent);\n box-shadow: var(--ring);\n}\n.row:focus-within .icon {\n color: var(--text);\n}\n\n.clear {\n position: absolute;\n right: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 50%;\n background: var(--chips-background-active);\n color: var(--muted);\n cursor: pointer;\n transition:\n background var(--dur-fast) ease,\n color var(--dur-fast) ease;\n}\n.clear:hover {\n color: var(--text);\n}\n.clear svg {\n width: 14px;\n height: 14px;\n}\n\n.shortcut {\n position: absolute;\n right: 12px;\n display: inline-flex;\n align-items: center;\n padding: 3px 7px;\n border-radius: var(--radius-sm);\n border: 1px solid var(--border);\n color: var(--muted);\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n pointer-events: none;\n opacity: 0.6;\n transition: opacity var(--dur) ease;\n}\n.row:focus-within .shortcut {\n opacity: 0;\n}\n","import { forwardRef, type InputHTMLAttributes } from \"react\";\nimport { Search, X } from \"react-feather\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./SearchInput.module.css\";\n\nexport interface SearchInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"value\" | \"onChange\"\n> {\n value: string;\n onValueChange: (value: string) => void;\n shortcut?: string;\n className?: string;\n}\n\nexport const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(function SearchInput(\n { value, onValueChange, shortcut, placeholder, className, ...rest },\n ref,\n) {\n const hasValue = value.length > 0;\n return (\n <div className={cx(styles.row, className)}>\n <span className={styles.icon}>\n <Search />\n </span>\n <input\n ref={ref}\n type=\"search\"\n className={styles.input}\n value={value}\n placeholder={placeholder}\n onChange={(e) => onValueChange(e.target.value)}\n {...rest}\n />\n {hasValue ? (\n <button\n type=\"button\"\n className={styles.clear}\n onClick={() => onValueChange(\"\")}\n aria-label=\"Clear search\"\n >\n <X />\n </button>\n ) : (\n shortcut && <span className={styles.shortcut}>{shortcut}</span>\n )}\n </div>\n );\n});\n",".badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: var(--radius-pill);\n font-size: var(--fs-xs);\n font-weight: 600;\n line-height: 1.5;\n white-space: nowrap;\n border: 1px solid transparent;\n}\n.square {\n border-radius: var(--radius-sm);\n}\n.mono {\n font-family: var(--font-mono);\n}\n\n.neutral {\n background: var(--chips-background-active);\n color: var(--text);\n}\n.accent {\n background: color-mix(in srgb, var(--accent) 16%, transparent);\n color: var(--accent);\n border-color: color-mix(in srgb, var(--accent) 35%, transparent);\n}\n.success {\n background: rgba(76, 175, 80, 0.14);\n color: var(--success);\n border-color: rgba(76, 175, 80, 0.4);\n}\n.warning {\n background: rgba(245, 158, 11, 0.14);\n color: var(--warning);\n border-color: rgba(245, 158, 11, 0.4);\n}\n.danger {\n background: rgba(255, 68, 68, 0.14);\n color: var(--danger);\n border-color: rgba(255, 68, 68, 0.4);\n}\n\n.dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: currentColor;\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Badge.module.css\";\n\nexport type BadgeTone = \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: BadgeTone;\n square?: boolean;\n mono?: boolean;\n dot?: boolean;\n children: ReactNode;\n}\n\nexport function Badge({\n tone,\n square,\n mono,\n dot,\n className,\n children,\n ...rest\n}: BadgeProps) {\n return (\n <span\n className={cx(\n styles.badge,\n styles[tone!],\n square && styles.square,\n mono && styles.mono,\n className,\n )}\n {...rest}\n >\n {dot && <span className={styles.dot} />}\n {children}\n </span>\n );\n}\n",".tag {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 26px;\n padding: 0 4px 0 10px;\n border-radius: var(--radius-sm);\n border: 1px solid var(--border);\n background: var(--chips-background);\n color: var(--text);\n font-size: var(--fs-xs);\n font-weight: 500;\n white-space: nowrap;\n}\n.noClose {\n padding-right: 10px;\n}\n.close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border: none;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--muted);\n cursor: pointer;\n transition:\n background var(--dur-fast) ease,\n color var(--dur-fast) ease;\n}\n.close:hover {\n background: var(--chips-background-active);\n color: var(--text);\n}\n.close svg {\n width: 12px;\n height: 12px;\n}\n","import type { ReactNode } from \"react\";\nimport { X } from \"react-feather\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Tag.module.css\";\n\nexport interface TagProps {\n children: ReactNode;\n onRemove?: () => void;\n className?: string;\n}\n\nexport function Tag({ children, onRemove, className }: TagProps) {\n return (\n <span className={cx(styles.tag, !onRemove && styles.noClose, className)}>\n {children}\n {onRemove && (\n <button type=\"button\" className={styles.close} onClick={onRemove} aria-label=\"Remove\">\n <X />\n </button>\n )}\n </span>\n );\n}\n",".kbd {\n display: inline-flex;\n align-items: center;\n padding: 3px 7px;\n border-radius: var(--radius-sm);\n border: 1px solid var(--border);\n background: var(--chips-background);\n color: var(--muted);\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n font-weight: 500;\n line-height: 1;\n letter-spacing: 0.03em;\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Kbd.module.css\";\n\nexport interface KbdProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function Kbd({ children, className }: KbdProps) {\n return <kbd className={cx(styles.kbd, className)}>{children}</kbd>;\n}\n",".avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n border-radius: 50%;\n background: var(--chips-background-active);\n color: var(--text);\n font-weight: 600;\n text-transform: uppercase;\n line-height: 1;\n user-select: none;\n}\n.square {\n border-radius: var(--radius-md);\n}\n.img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.sm {\n width: 28px;\n height: 28px;\n font-size: 11px;\n}\n.md {\n width: 38px;\n height: 38px;\n font-size: 14px;\n}\n.lg {\n width: 52px;\n height: 52px;\n font-size: 18px;\n}\n","import { cx } from \"../utils/cx\";\nimport styles from \"./Avatar.module.css\";\n\nexport interface AvatarProps {\n name?: string;\n src?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n square?: boolean;\n className?: string;\n}\n\nconst initials = (name?: string): string => {\n if (!name) return \"?\";\n const parts = name.trim().split(/\\s+/);\n return ((parts[0]?.[0] ?? \"\") + (parts.length > 1 ? parts[parts.length - 1][0] : \"\")).slice(0, 2);\n};\n\nexport function Avatar({ name, src, size, square, className }: AvatarProps) {\n return (\n <span\n className={cx(styles.avatar, styles[size!], square && styles.square, className)}\n aria-label={name}\n title={name}\n >\n {src ? <img className={styles.img} src={src} alt={name ?? \"\"} /> : initials(name)}\n </span>\n );\n}\n",".skeleton {\n display: block;\n background: linear-gradient(\n 90deg,\n var(--chips-background) 25%,\n var(--chips-background-active) 37%,\n var(--chips-background) 63%\n );\n background-size: 400% 100%;\n animation: bav-skeleton 1.4s ease infinite;\n border-radius: var(--radius-sm);\n}\n.text {\n height: 0.8em;\n margin: 0.2em 0;\n border-radius: var(--radius-sm);\n}\n.circle {\n border-radius: 50%;\n}\n","import type { CSSProperties } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Skeleton.module.css\";\n\nexport interface SkeletonProps {\n variant?: \"rect\" | \"text\" | \"circle\";\n width?: number | string;\n height?: number | string;\n lines?: number;\n radius?: number | string;\n className?: string;\n}\n\nexport function Skeleton({\n variant,\n width,\n height,\n lines,\n radius,\n className,\n}: SkeletonProps) {\n const style: CSSProperties = {\n width,\n height: height ?? (variant === \"circle\" ? width : undefined),\n borderRadius: radius,\n };\n\n if (variant === \"text\" && lines && lines > 1) {\n return (\n <span>\n {Array.from({ length: lines }).map((_, i) => (\n <span\n key={i}\n className={cx(styles.skeleton, styles.text, className)}\n style={{ width: i === lines - 1 ? \"70%\" : \"100%\" }}\n />\n ))}\n </span>\n );\n }\n\n return (\n <span\n className={cx(\n styles.skeleton,\n variant === \"text\" && styles.text,\n variant === \"circle\" && styles.circle,\n className,\n )}\n style={style}\n />\n );\n}\n",".divider {\n border: none;\n background: var(--border);\n}\n.horizontal {\n width: 100%;\n height: 1px;\n margin: var(--space-4) 0;\n}\n.vertical {\n width: 1px;\n align-self: stretch;\n margin: 0 var(--space-3);\n}\n\n.labelled {\n display: flex;\n align-items: center;\n gap: var(--space-3);\n width: 100%;\n margin: var(--space-4) 0;\n color: var(--muted);\n font-size: var(--fs-xs);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n.labelled::before,\n.labelled::after {\n content: \"\";\n flex: 1;\n height: 1px;\n background: var(--border);\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Divider.module.css\";\n\nexport interface DividerProps {\n orientation?: \"horizontal\" | \"vertical\";\n children?: ReactNode;\n className?: string;\n}\n\nexport function Divider({ orientation, children, className }: DividerProps) {\n if (children) {\n return (\n <div className={cx(styles.labelled, className)} role=\"separator\">\n {children}\n </div>\n );\n }\n return (\n <hr\n className={cx(styles.divider, styles[orientation], className)}\n aria-orientation={orientation}\n />\n );\n}\n",".wrap {\n display: flex;\n flex-direction: column;\n gap: 6px;\n width: 100%;\n}\n.head {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n font-size: var(--fs-xs);\n color: var(--muted);\n}\n.value {\n color: var(--text);\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n}\n\n.track {\n width: 100%;\n height: 6px;\n border-radius: var(--radius-pill);\n background: var(--chips-background-active);\n overflow: hidden;\n}\n.sm {\n height: 3px;\n}\n.lg {\n height: 10px;\n}\n\n.bar {\n height: 100%;\n border-radius: var(--radius-pill);\n background: var(--accent);\n transition: width 0.3s var(--ease-out);\n}\n\n.indeterminate {\n width: 40% !important;\n background: linear-gradient(\n 90deg,\n var(--accent) 0%,\n color-mix(in srgb, var(--accent) 50%, #fff) 50%,\n var(--accent) 100%\n );\n background-size: 200% 100%;\n animation:\n bav-indeterminate 1.2s ease-in-out infinite,\n bav-shimmer 1.5s linear infinite;\n}\n\n@keyframes bav-indeterminate {\n 0% {\n margin-left: -40%;\n }\n 100% {\n margin-left: 100%;\n }\n}\n","import { cx } from \"../utils/cx\";\nimport styles from \"./ProgressBar.module.css\";\n\nexport interface ProgressBarProps {\n value?: number | null;\n size?: \"sm\" | \"md\" | \"lg\";\n label?: string;\n showValue?: boolean;\n className?: string;\n}\n\nexport function ProgressBar({\n value,\n size,\n label,\n showValue,\n className,\n}: ProgressBarProps) {\n const indeterminate = value === null || value === undefined;\n const pct = indeterminate ? 0 : Math.max(0, Math.min(100, value));\n\n return (\n <div className={cx(styles.wrap, className)}>\n {(label || showValue) && (\n <div className={styles.head}>\n {label && <span>{label}</span>}\n {showValue && !indeterminate && <span className={styles.value}>{Math.round(pct)}%</span>}\n </div>\n )}\n <div\n className={cx(styles.track, size === \"sm\" && styles.sm, size === \"lg\" && styles.lg)}\n role=\"progressbar\"\n aria-valuenow={indeterminate ? undefined : Math.round(pct)}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className={cx(styles.bar, indeterminate && styles.indeterminate)}\n style={indeterminate ? undefined : { width: `${pct}%` }}\n />\n </div>\n </div>\n );\n}\n",".stat {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.label {\n font-size: var(--fs-xs);\n color: var(--muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n.valueRow {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n}\n.value {\n font-size: var(--fs-xl);\n font-weight: 700;\n line-height: 1.1;\n color: var(--text);\n font-variant-numeric: tabular-nums;\n}\n.delta {\n font-size: var(--fs-xs);\n font-weight: 600;\n}\n.up {\n color: var(--success);\n}\n.down {\n color: var(--danger);\n}\n.hint {\n font-size: var(--fs-xs);\n color: var(--muted);\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Stat.module.css\";\n\nexport interface StatProps {\n label: ReactNode;\n value: ReactNode;\n delta?: string;\n trend?: \"up\" | \"down\";\n hint?: ReactNode;\n className?: string;\n}\n\nexport function Stat({ label, value, delta, trend, hint, className }: StatProps) {\n return (\n <div className={cx(styles.stat, className)}>\n <span className={styles.label}>{label}</span>\n <div className={styles.valueRow}>\n <span className={styles.value}>{value}</span>\n {delta && (\n <span\n className={cx(\n styles.delta,\n trend === \"up\" && styles.up,\n trend === \"down\" && styles.down,\n )}\n >\n {delta}\n </span>\n )}\n </div>\n {hint && <span className={styles.hint}>{hint}</span>}\n </div>\n );\n}\n",".card {\n display: flex;\n flex-direction: column;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-sm);\n overflow: hidden;\n}\n.interactive {\n cursor: pointer;\n transition:\n border-color var(--dur) ease,\n box-shadow 0.25s ease,\n transform 0.25s ease;\n}\n.interactive:hover {\n border-color: var(--focus);\n box-shadow: var(--shadow-md);\n transform: translateY(-2px);\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: var(--space-3);\n padding: var(--space-4);\n border-bottom: 1px solid var(--border);\n}\n.headTitles {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n.title {\n margin: 0;\n font-size: var(--fs-md);\n font-weight: 600;\n color: var(--text);\n}\n.subtitle {\n font-size: var(--fs-xs);\n color: var(--muted);\n}\n.headEnd {\n margin-left: auto;\n}\n\n.body {\n padding: var(--space-4);\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n flex: 1;\n}\n\n.footer {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-3) var(--space-4);\n border-top: 1px solid var(--border);\n background: var(--chips-background);\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Card.module.css\";\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n interactive?: boolean;\n}\n\nexport function Card({ interactive, className, children, ...rest }: CardProps) {\n return (\n <div className={cx(styles.card, interactive && styles.interactive, className)} {...rest}>\n {children}\n </div>\n );\n}\n\nexport interface CardHeaderProps {\n title?: ReactNode;\n subtitle?: ReactNode;\n media?: ReactNode;\n actions?: ReactNode;\n className?: string;\n children?: ReactNode;\n}\n\nexport function CardHeader({\n title,\n subtitle,\n media,\n actions,\n className,\n children,\n}: CardHeaderProps) {\n return (\n <div className={cx(styles.header, className)}>\n {media}\n {(title || subtitle) && (\n <div className={styles.headTitles}>\n {title && <h3 className={styles.title}>{title}</h3>}\n {subtitle && <span className={styles.subtitle}>{subtitle}</span>}\n </div>\n )}\n {children}\n {actions && <div className={styles.headEnd}>{actions}</div>}\n </div>\n );\n}\n\nexport function CardBody({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cx(styles.body, className)} {...rest}>\n {children}\n </div>\n );\n}\n\nexport function CardFooter({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cx(styles.footer, className)} {...rest}>\n {children}\n </div>\n );\n}\n",".panel {\n display: flex;\n flex-direction: column;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-sm);\n overflow: hidden;\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: var(--space-3);\n min-height: 46px;\n padding: var(--space-2) var(--space-4);\n background: var(--chips-background);\n border-bottom: 1px solid var(--border);\n}\n\n.title {\n margin: 0;\n font-size: var(--fs-sm);\n font-weight: 600;\n color: var(--text);\n}\n\n.headerEnd {\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.body {\n padding: var(--space-3);\n}\n\n.noPadding .body {\n padding: 0;\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Panel.module.css\";\n\nexport interface PanelProps {\n headerTitle?: ReactNode;\n headerChildren?: ReactNode;\n headerActions?: ReactNode;\n disableHeader?: boolean;\n flush?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\nexport function Panel({\n headerTitle,\n headerChildren,\n headerActions,\n disableHeader,\n flush,\n className,\n children,\n}: PanelProps) {\n const hasHeader = !disableHeader && (headerTitle || headerChildren || headerActions);\n return (\n <section className={cx(styles.panel, flush && styles.noPadding, className)}>\n {hasHeader && (\n <header className={styles.header}>\n {headerTitle && <h2 className={styles.title}>{headerTitle}</h2>}\n {headerChildren}\n {headerActions && <div className={styles.headerEnd}>{headerActions}</div>}\n </header>\n )}\n <div className={styles.body}>{children}</div>\n </section>\n );\n}\n",".container {\n width: 100%;\n overflow-x: auto;\n}\n\n.table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--fs-sm);\n caption-side: bottom;\n}\n\n.table th {\n text-align: left;\n padding: 10px 14px;\n font-size: var(--fs-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--muted);\n background: var(--chips-background);\n border-bottom: 1px solid var(--border);\n white-space: nowrap;\n}\n\n.table td {\n padding: 10px 14px;\n border-bottom: 1px solid var(--border);\n color: var(--text);\n}\n\n.table tbody tr {\n transition: background var(--dur-fast) ease;\n}\n\n.table tbody tr:hover {\n background: var(--chips-background);\n}\n\n.table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.clickable tbody tr {\n cursor: pointer;\n}\n\n.compact th,\n.compact td {\n padding: 6px 10px;\n}\n\n.numeric {\n text-align: right !important;\n font-variant-numeric: tabular-nums;\n}\n\n.mono {\n font-family: var(--font-mono);\n}\n\n.muted {\n color: var(--muted) !important;\n}\n\n.empty {\n padding: var(--space-6) !important;\n text-align: center;\n color: var(--muted);\n}\n","import type { HTMLAttributes, TdHTMLAttributes, ThHTMLAttributes } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Table.module.css\";\n\nexport interface TableProps extends HTMLAttributes<HTMLTableElement> {\n compact?: boolean;\n clickableRows?: boolean;\n}\n\nexport function Table({ compact, clickableRows, className, children, ...rest }: TableProps) {\n return (\n <div className={styles.container}>\n <table\n className={cx(\n styles.table,\n compact && styles.compact,\n clickableRows && styles.clickable,\n className,\n )}\n {...rest}\n >\n {children}\n </table>\n </div>\n );\n}\n\nexport function TableHeader({ className, ...rest }: HTMLAttributes<HTMLTableSectionElement>) {\n return <thead className={className} {...rest} />;\n}\n\nexport function TableBody({ className, ...rest }: HTMLAttributes<HTMLTableSectionElement>) {\n return <tbody className={className} {...rest} />;\n}\n\nexport function TableRow({ className, ...rest }: HTMLAttributes<HTMLTableRowElement>) {\n return <tr className={className} {...rest} />;\n}\n\nexport interface TableHeadProps extends ThHTMLAttributes<HTMLTableCellElement> {\n numeric?: boolean;\n}\n\nexport function TableHead({ numeric, className, ...rest }: TableHeadProps) {\n return <th className={cx(numeric && styles.numeric, className)} {...rest} />;\n}\n\nexport interface TableCellProps extends TdHTMLAttributes<HTMLTableCellElement> {\n numeric?: boolean;\n mono?: boolean;\n muted?: boolean;\n}\n\nexport function TableCell({ numeric, mono, muted, className, ...rest }: TableCellProps) {\n return (\n <td\n className={cx(\n numeric && styles.numeric,\n mono && styles.mono,\n muted && styles.muted,\n className,\n )}\n {...rest}\n />\n );\n}\n\nexport function TableEmpty({ colSpan, children }: { colSpan: number; children: React.ReactNode }) {\n return (\n <tr>\n <td colSpan={colSpan} className={styles.empty}>\n {children}\n </td>\n </tr>\n );\n}\n",".list {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n gap: var(--space-4) var(--space-5);\n margin: 0;\n}\n\n.columns2 {\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n}\n\n.row {\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 0;\n}\n\n.label {\n font-size: var(--fs-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--muted);\n}\n\n.value {\n margin: 0;\n font-size: var(--fs-sm);\n color: var(--text);\n overflow-wrap: anywhere;\n}\n\n.mono {\n font-family: var(--font-mono);\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./DescriptionList.module.css\";\n\nexport interface DescriptionItem {\n label: ReactNode;\n value: ReactNode;\n mono?: boolean;\n}\n\nexport interface DescriptionListProps {\n items: DescriptionItem[];\n wide?: boolean;\n className?: string;\n}\n\nexport function DescriptionList({ items, wide, className }: DescriptionListProps) {\n return (\n <dl className={cx(styles.list, wide && styles.columns2, className)}>\n {items.map((item, i) => (\n <div key={i} className={styles.row}>\n <dt className={styles.label}>{item.label}</dt>\n <dd className={cx(styles.value, item.mono && styles.mono)}>{item.value ?? \"—\"}</dd>\n </div>\n ))}\n </dl>\n );\n}\n","import type { CSSProperties, ElementType, HTMLAttributes, ReactNode } from \"react\";\n\nexport type FlexGap = \"small\" | \"middle\" | \"large\" | number;\n\nconst GAP_PRESET: Record<string, number> = { small: 8, middle: 16, large: 24 };\n\nexport interface FlexProps extends HTMLAttributes<HTMLElement> {\n vertical?: boolean;\n align?: CSSProperties[\"alignItems\"];\n justify?: CSSProperties[\"justifyContent\"];\n gap?: FlexGap;\n wrap?: boolean;\n flex?: CSSProperties[\"flex\"];\n as?: ElementType;\n children?: ReactNode;\n}\n\nexport function Flex({\n vertical,\n align,\n justify,\n gap,\n wrap,\n flex,\n as: As = \"div\",\n style,\n children,\n ...rest\n}: FlexProps) {\n const gapValue = typeof gap === \"string\" ? GAP_PRESET[gap] : gap;\n return (\n <As\n style={{\n display: \"flex\",\n flexDirection: vertical ? \"column\" : \"row\",\n alignItems: align,\n justifyContent: justify,\n gap: gapValue,\n flexWrap: wrap ? \"wrap\" : undefined,\n flex,\n minWidth: 0,\n ...style,\n }}\n {...rest}\n >\n {children}\n </As>\n );\n}\n","import type { CSSProperties, ElementType, HTMLAttributes, ReactNode } from \"react\";\n\ntype GapToken = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8;\nconst gapVar = (g: GapToken): string => (g === 0 ? \"0\" : `var(--space-${g})`);\n\ninterface BaseProps extends HTMLAttributes<HTMLElement> {\n gap?: GapToken;\n as?: ElementType;\n children?: ReactNode;\n}\n\ninterface StackProps extends BaseProps {\n align?: CSSProperties[\"alignItems\"];\n justify?: CSSProperties[\"justifyContent\"];\n}\n\nexport function Stack({\n gap,\n align,\n justify,\n as: As = \"div\",\n style,\n children,\n ...rest\n}: StackProps) {\n return (\n <As\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: gapVar(gap!),\n alignItems: align,\n justifyContent: justify,\n ...style,\n }}\n {...rest}\n >\n {children}\n </As>\n );\n}\n\ninterface InlineProps extends BaseProps {\n align?: CSSProperties[\"alignItems\"];\n justify?: CSSProperties[\"justifyContent\"];\n wrap?: boolean;\n}\n\nexport function Inline({\n gap,\n align,\n justify,\n wrap,\n as: As = \"div\",\n style,\n children,\n ...rest\n}: InlineProps) {\n return (\n <As\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n gap: gapVar(gap!),\n alignItems: align,\n justifyContent: justify,\n flexWrap: wrap ? \"wrap\" : undefined,\n ...style,\n }}\n {...rest}\n >\n {children}\n </As>\n );\n}\n",".title {\n margin: 0 0 0.4em;\n color: var(--text);\n font-weight: 700;\n line-height: 1.25;\n}\n\n.h1 {\n font-size: 28px;\n}\n.h2 {\n font-size: 24px;\n}\n.h3 {\n font-size: 20px;\n}\n.h4 {\n font-size: 16px;\n font-weight: 600;\n}\n.h5 {\n font-size: 14px;\n font-weight: 600;\n}\n\n.noMargin {\n margin-bottom: 0;\n}\n\n.text {\n color: var(--text);\n}\n\n.secondary {\n color: var(--muted);\n}\n.success {\n color: var(--success);\n}\n.warning {\n color: var(--warning);\n}\n.danger {\n color: var(--danger);\n}\n.accent {\n color: var(--accent);\n}\n\n.strong {\n font-weight: 600;\n}\n\n.code {\n font-family: var(--font-mono);\n font-size: 0.92em;\n background: var(--chips-background);\n border: 1px solid var(--border);\n border-radius: var(--radius-sm);\n padding: 1px 5px;\n}\n\n.mono {\n font-family: var(--font-mono);\n}\n\n.xs {\n font-size: var(--fs-xs);\n}\n.sm {\n font-size: var(--fs-sm);\n}\n.lg {\n font-size: var(--fs-lg);\n}\n\n.uppercase {\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.paragraph {\n margin: 0 0 1em;\n color: var(--text);\n font-size: var(--fs-sm);\n line-height: 1.6;\n}\n\n.paragraph:last-child {\n margin-bottom: 0;\n}\n","import type { ElementType, HTMLAttributes } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Typography.module.css\";\n\nexport type TextTone = \"default\" | \"secondary\" | \"success\" | \"warning\" | \"danger\" | \"accent\";\nexport type TextSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nconst toneClass: Record<TextTone, string | undefined> = {\n default: undefined,\n secondary: styles.secondary,\n success: styles.success,\n warning: styles.warning,\n danger: styles.danger,\n accent: styles.accent,\n};\n\nexport interface TitleProps extends HTMLAttributes<HTMLHeadingElement> {\n level?: 1 | 2 | 3 | 4 | 5;\n type?: TextTone;\n noMargin?: boolean;\n}\n\nexport function Title({ level, type, noMargin, className, ...rest }: TitleProps) {\n const Tag = `h${level}` as ElementType;\n return (\n <Tag\n className={cx(\n styles.title,\n styles[`h${level}` as keyof typeof styles],\n toneClass[type!],\n noMargin && styles.noMargin,\n className,\n )}\n {...rest}\n />\n );\n}\n\nexport interface TextProps extends HTMLAttributes<HTMLSpanElement> {\n type?: TextTone;\n size?: TextSize;\n strong?: boolean;\n code?: boolean;\n mono?: boolean;\n uppercase?: boolean;\n}\n\nexport function Text({\n type,\n size,\n strong,\n code,\n mono,\n uppercase,\n className,\n ...rest\n}: TextProps) {\n return (\n <span\n className={cx(\n styles.text,\n toneClass[type!],\n size !== \"md\" && styles[size!],\n strong && styles.strong,\n code && styles.code,\n mono && styles.mono,\n uppercase && styles.uppercase,\n className,\n )}\n {...rest}\n />\n );\n}\n\nexport interface ParagraphProps extends HTMLAttributes<HTMLParagraphElement> {\n type?: TextTone;\n}\n\nexport function Paragraph({ type, className, ...rest }: ParagraphProps) {\n return <p className={cx(styles.paragraph, toneClass[type!], className)} {...rest} />;\n}\n\nexport const Typography = { Title, Text, Paragraph };\n",".nav {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n font-size: var(--fs-sm);\n color: var(--muted);\n}\n\n.list {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.link {\n color: var(--muted);\n text-decoration: none;\n transition: color var(--dur-fast) ease;\n}\n\n.link:hover {\n color: var(--text);\n text-decoration: underline;\n text-underline-offset: 3px;\n}\n\n.current {\n color: var(--text);\n font-weight: 500;\n}\n\n.separator {\n display: flex;\n color: var(--muted);\n opacity: 0.5;\n}\n\n.separator svg {\n width: 13px;\n height: 13px;\n}\n","import { Fragment, type ReactNode } from \"react\";\nimport { ChevronRight } from \"react-feather\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Breadcrumbs.module.css\";\n\nexport interface BreadcrumbItem {\n title: ReactNode;\n href?: string;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n renderLink?: (href: string, children: ReactNode) => ReactNode;\n className?: string;\n}\n\nexport function Breadcrumbs({ items, renderLink, className }: BreadcrumbsProps) {\n const link =\n renderLink ??\n ((href: string, children: ReactNode) => (\n <a className={styles.link} href={href}>\n {children}\n </a>\n ));\n\n return (\n <nav aria-label=\"Breadcrumb\" className={cx(styles.nav, className)}>\n <ol className={styles.list}>\n {items.map((item, i) => {\n const isLast = i === items.length - 1;\n return (\n <Fragment key={i}>\n <li className={styles.item}>\n {item.href && !isLast ? (\n link(item.href, item.title)\n ) : (\n <span\n className={isLast ? styles.current : undefined}\n aria-current={isLast ? \"page\" : undefined}\n >\n {item.title}\n </span>\n )}\n </li>\n {!isLast && (\n <span className={styles.separator} aria-hidden=\"true\">\n <ChevronRight />\n </span>\n )}\n </Fragment>\n );\n })}\n </ol>\n </nav>\n );\n}\n",".list {\n display: flex;\n align-items: center;\n gap: 2px;\n border-bottom: 1px solid var(--border);\n}\n.fitted {\n width: 100%;\n}\n.fitted .tab {\n flex: 1;\n justify-content: center;\n}\n\n.tab {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 10px 14px;\n border: none;\n background: transparent;\n color: var(--muted);\n font-size: var(--fs-sm);\n font-weight: 500;\n cursor: pointer;\n transition: color var(--dur) ease;\n}\n.tab::after {\n content: \"\";\n position: absolute;\n left: 8px;\n right: 8px;\n bottom: -1px;\n height: 2px;\n border-radius: 2px;\n background: var(--accent);\n transform: scaleX(0);\n transition: transform var(--dur) var(--ease-out);\n}\n.tab:hover:not(:disabled) {\n color: var(--text);\n}\n.tab:focus-visible {\n outline: none;\n color: var(--text);\n}\n.tab:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n.active {\n color: var(--text);\n}\n.active::after {\n transform: scaleX(1);\n}\n.tab svg {\n width: 15px;\n height: 15px;\n}\n.count {\n margin-left: 2px;\n font-size: var(--fs-xs);\n color: var(--muted);\n background: var(--chips-background-active);\n border-radius: var(--radius-pill);\n padding: 1px 7px;\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Tabs.module.css\";\n\nexport interface TabItem {\n value: string;\n label: ReactNode;\n icon?: ReactNode;\n count?: number;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n value: string;\n onChange: (value: string) => void;\n fitted?: boolean;\n className?: string;\n}\n\nexport function Tabs({ items, value, onChange, fitted, className }: TabsProps) {\n return (\n <div className={cx(styles.list, fitted && styles.fitted, className)} role=\"tablist\">\n {items.map((item) => {\n const active = item.value === value;\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n disabled={item.disabled}\n className={cx(styles.tab, active && styles.active)}\n onClick={() => onChange(item.value)}\n >\n {item.icon}\n {item.label}\n {typeof item.count === \"number\" && <span className={styles.count}>{item.count}</span>}\n </button>\n );\n })}\n </div>\n );\n}\n",".bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: 8px 4px;\n}\n.count {\n font-size: var(--fs-sm);\n color: var(--muted);\n white-space: nowrap;\n}\n.count strong {\n color: var(--text);\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n}\n.nav {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid transparent;\n border-radius: var(--radius-md);\n background: transparent;\n color: var(--muted);\n cursor: pointer;\n transition:\n background var(--dur-fast) ease,\n border-color var(--dur-fast) ease,\n color var(--dur-fast) ease;\n}\n.arrow:hover:not(:disabled) {\n background: var(--chips-background-active);\n border-color: var(--border);\n color: var(--text);\n}\n.arrow:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n.arrow svg {\n width: 16px;\n height: 16px;\n}\n.pages {\n display: flex;\n align-items: center;\n gap: 2px;\n margin: 0 4px;\n}\n.page {\n min-width: 32px;\n height: 32px;\n padding: 0 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid transparent;\n border-radius: var(--radius-md);\n background: transparent;\n color: var(--muted);\n font-size: var(--fs-sm);\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n transition:\n background var(--dur-fast) ease,\n border-color var(--dur-fast) ease,\n color var(--dur-fast) ease;\n}\n.page:hover:not(.active) {\n background: var(--chips-background);\n color: var(--text);\n}\n.active {\n background: var(--chips-background-active);\n border-color: var(--focus);\n color: var(--text);\n font-weight: 600;\n cursor: default;\n}\n.ellipsis {\n width: 28px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--muted);\n opacity: 0.6;\n user-select: none;\n}\n","import { ChevronLeft, ChevronRight } from \"react-feather\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Pagination.module.css\";\n\nexport interface PaginationProps {\n page: number;\n pageCount: number;\n onChange: (page: number) => void;\n totalItems?: number;\n pageSize?: number;\n siblingCount?: number;\n className?: string;\n}\n\nconst ELLIPSIS = \"…\";\n\nfunction buildRange(page: number, pageCount: number, max: number): (number | string)[] {\n if (pageCount <= max) return Array.from({ length: pageCount }, (_, i) => i + 1);\n\n const side = Math.max(1, Math.floor((max - 3) / 2));\n const left = Math.max(2, page - side);\n const right = Math.min(pageCount - 1, page + side);\n\n const range: (number | string)[] = [1];\n if (left > 2) range.push(ELLIPSIS);\n for (let i = left; i <= right; i++) range.push(i);\n if (right < pageCount - 1) range.push(ELLIPSIS);\n range.push(pageCount);\n return range;\n}\n\nexport function Pagination({\n page,\n pageCount,\n onChange,\n totalItems,\n pageSize,\n siblingCount,\n className,\n}: PaginationProps) {\n if (pageCount <= 1 && totalItems === undefined) return null;\n\n const range = buildRange(page, pageCount, Math.max(5, siblingCount!));\n const go = (p: number) => p >= 1 && p <= pageCount && p !== page && onChange(p);\n\n const summary =\n totalItems !== undefined && pageSize\n ? (() => {\n const from = totalItems === 0 ? 0 : (page - 1) * pageSize + 1;\n const to = Math.min(page * pageSize, totalItems);\n return (\n <span className={styles.count}>\n <strong>{from}</strong>–<strong>{to}</strong> of <strong>{totalItems}</strong>\n </span>\n );\n })()\n : null;\n\n return (\n <div className={cx(styles.bar, className)}>\n {summary ?? <span />}\n <div className={styles.nav}>\n <button\n type=\"button\"\n className={styles.arrow}\n onClick={() => go(page - 1)}\n disabled={page <= 1}\n aria-label=\"Previous page\"\n >\n <ChevronLeft />\n </button>\n <div className={styles.pages}>\n {range.map((p, i) =>\n typeof p === \"number\" ? (\n <button\n key={p}\n type=\"button\"\n className={cx(styles.page, p === page && styles.active)}\n aria-current={p === page ? \"page\" : undefined}\n onClick={() => go(p)}\n >\n {p}\n </button>\n ) : (\n <span key={`e${i}`} className={styles.ellipsis}>\n {p}\n </span>\n ),\n )}\n </div>\n <button\n type=\"button\"\n className={styles.arrow}\n onClick={() => go(page + 1)}\n disabled={page >= pageCount}\n aria-label=\"Next page\"\n >\n <ChevronRight />\n </button>\n </div>\n </div>\n );\n}\n",".root {\n position: relative;\n display: inline-flex;\n}\n.panel {\n position: absolute;\n top: calc(100% + 6px);\n z-index: var(--z-dropdown);\n min-width: 200px;\n padding: 6px;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: var(--radius-md);\n box-shadow: var(--shadow-md);\n animation: bav-pop-in 0.16s var(--ease-out);\n}\n.start {\n left: 0;\n}\n.end {\n right: 0;\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n width: 100%;\n padding: 8px 10px;\n border: none;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text);\n font-size: var(--fs-sm);\n text-align: left;\n cursor: pointer;\n transition:\n background var(--dur-fast) ease,\n color var(--dur-fast) ease;\n}\n.item:hover:not(:disabled),\n.item:focus-visible {\n background: var(--chips-background-active);\n outline: none;\n}\n.item:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n.itemIcon {\n display: inline-flex;\n color: var(--muted);\n}\n.itemIcon svg {\n width: 16px;\n height: 16px;\n}\n.danger {\n color: var(--danger);\n}\n.danger .itemIcon {\n color: var(--danger);\n}\n.danger:hover:not(:disabled) {\n background: rgba(255, 68, 68, 0.14);\n}\n\n.separator {\n height: 1px;\n margin: 6px 4px;\n background: var(--border);\n}\n.label {\n padding: 6px 10px 4px;\n font-size: var(--fs-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--muted);\n}\n","import { createContext, useContext, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Menu.module.css\";\n\nconst MenuContext = createContext<{ close: () => void } | null>(null);\n\nexport interface MenuProps {\n trigger: ReactNode;\n align?: \"start\" | \"end\";\n children: ReactNode;\n className?: string;\n}\n\nexport function Menu({ trigger, align, children, className }: MenuProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDocClick = (e: MouseEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && setOpen(false);\n document.addEventListener(\"mousedown\", onDocClick);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onDocClick);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n return (\n <div ref={rootRef} className={cx(styles.root, className)}>\n <span onClick={() => setOpen((o) => !o)}>{trigger}</span>\n {open && (\n <div className={cx(styles.panel, styles[align!])} role=\"menu\">\n <MenuContext.Provider value={{ close: () => setOpen(false) }}>\n {children}\n </MenuContext.Provider>\n </div>\n )}\n </div>\n );\n}\n\nexport interface MenuItemProps {\n onSelect?: () => void;\n icon?: ReactNode;\n danger?: boolean;\n disabled?: boolean;\n children: ReactNode;\n}\n\nexport function MenuItem({ onSelect, icon, danger, disabled, children }: MenuItemProps) {\n const ctx = useContext(MenuContext);\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={disabled}\n className={cx(styles.item, danger && styles.danger)}\n onClick={() => {\n onSelect?.();\n ctx?.close();\n }}\n >\n {icon && <span className={styles.itemIcon}>{icon}</span>}\n {children}\n </button>\n );\n}\n\nexport function MenuSeparator() {\n return <div className={styles.separator} role=\"separator\" />;\n}\n\nexport function MenuLabel({ children }: { children: ReactNode }) {\n return <div className={styles.label}>{children}</div>;\n}\n",".backdrop {\n position: fixed;\n inset: 0;\n z-index: var(--z-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--space-6);\n background: rgba(0, 0, 0, 0.55);\n backdrop-filter: blur(2px);\n animation: bav-fade-in var(--dur) ease;\n}\n\n.modal {\n display: flex;\n flex-direction: column;\n width: 100%;\n max-height: calc(100vh - 2 * var(--space-6));\n background: var(--panel);\n border: 1px solid var(--border);\n border-radius: var(--radius-xl);\n box-shadow: var(--shadow-lg);\n overflow: hidden;\n animation: bav-pop-in 0.22s var(--ease-out);\n}\n.sm {\n max-width: 380px;\n}\n.md {\n max-width: 520px;\n}\n.lg {\n max-width: 760px;\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: var(--space-3);\n padding: var(--space-5) var(--space-5) var(--space-3);\n}\n.title {\n margin: 0;\n font-size: var(--fs-lg);\n font-weight: 600;\n color: var(--text);\n}\n.close {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: none;\n border-radius: var(--radius-md);\n background: var(--chips-background);\n color: var(--muted);\n cursor: pointer;\n transition:\n background var(--dur-fast) ease,\n color var(--dur-fast) ease;\n}\n.close:hover {\n background: var(--chips-background-active);\n color: var(--text);\n}\n.close svg {\n width: 16px;\n height: 16px;\n}\n\n.body {\n padding: var(--space-3) var(--space-5) var(--space-5);\n overflow-y: auto;\n color: var(--text);\n font-size: var(--fs-sm);\n line-height: 1.55;\n}\n\n.footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--space-2);\n padding: var(--space-4) var(--space-5);\n border-top: 1px solid var(--border);\n}\n","import { useEffect, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { X } from \"react-feather\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Modal.module.css\";\n\nexport interface ModalProps {\n open: boolean;\n onClose: () => void;\n title?: ReactNode;\n size?: \"sm\" | \"md\" | \"lg\";\n footer?: ReactNode;\n dismissible?: boolean;\n showClose?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\nexport function Modal({\n open,\n onClose,\n title,\n size,\n footer,\n dismissible,\n showClose,\n className,\n children,\n}: ModalProps) {\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && dismissible) onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.body.style.overflow = prev;\n };\n }, [open, dismissible, onClose]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div className={styles.backdrop} onClick={() => dismissible && onClose()} role=\"presentation\">\n <div\n className={cx(styles.modal, styles[size!], className)}\n role=\"dialog\"\n aria-modal=\"true\"\n onClick={(e) => e.stopPropagation()}\n >\n {(title || showClose) && (\n <div className={styles.header}>\n {title && <h2 className={styles.title}>{title}</h2>}\n {showClose && (\n <button type=\"button\" className={styles.close} onClick={onClose} aria-label=\"Close\">\n <X />\n </button>\n )}\n </div>\n )}\n <div className={styles.body}>{children}</div>\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n </div>,\n document.body,\n );\n}\n",".wrap {\n position: relative;\n display: inline-flex;\n}\n.bubble {\n position: absolute;\n z-index: var(--z-tooltip);\n padding: 5px 9px;\n border-radius: var(--radius-sm);\n background: var(--text);\n color: var(--bg);\n font-size: var(--fs-xs);\n font-weight: 500;\n line-height: 1.3;\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n transform: scale(0.96);\n transition:\n opacity var(--dur-fast) ease,\n transform var(--dur-fast) ease;\n box-shadow: var(--shadow-sm);\n}\n.wrap:hover .bubble,\n.wrap:focus-within .bubble {\n opacity: 1;\n transform: scale(1);\n}\n\n.top {\n bottom: calc(100% + 6px);\n left: 50%;\n translate: -50% 0;\n}\n.bottom {\n top: calc(100% + 6px);\n left: 50%;\n translate: -50% 0;\n}\n.left {\n right: calc(100% + 6px);\n top: 50%;\n translate: 0 -50%;\n}\n.right {\n left: calc(100% + 6px);\n top: 50%;\n translate: 0 -50%;\n}\n","import type { ReactNode } from \"react\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Tooltip.module.css\";\n\nexport interface TooltipProps {\n label: ReactNode;\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\";\n children: ReactNode;\n className?: string;\n}\n\nexport function Tooltip({ label, placement, children, className }: TooltipProps) {\n return (\n <span className={cx(styles.wrap, className)}>\n {children}\n <span role=\"tooltip\" className={cx(styles.bubble, styles[placement!])}>\n {label}\n </span>\n </span>\n );\n}\n",".alert {\n display: flex;\n align-items: flex-start;\n gap: var(--space-3);\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border);\n border-radius: var(--radius-md);\n background: var(--chips-background);\n color: var(--text);\n font-size: var(--fs-sm);\n line-height: 1.5;\n}\n.icon {\n display: flex;\n flex-shrink: 0;\n margin-top: 1px;\n}\n.icon svg {\n width: 18px;\n height: 18px;\n}\n.content {\n flex: 1;\n min-width: 0;\n}\n.title {\n font-weight: 600;\n margin-bottom: 2px;\n}\n.close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: var(--radius-sm);\n background: transparent;\n color: inherit;\n opacity: 0.7;\n cursor: pointer;\n flex-shrink: 0;\n}\n.close:hover {\n opacity: 1;\n background: var(--chips-background-active);\n}\n.close svg {\n width: 14px;\n height: 14px;\n}\n\n.info .icon {\n color: var(--accent);\n}\n.info {\n border-color: color-mix(in srgb, var(--accent) 35%, transparent);\n background: color-mix(in srgb, var(--accent) 8%, var(--chips-background));\n}\n.success .icon {\n color: var(--success);\n}\n.success {\n border-color: rgba(76, 175, 80, 0.4);\n background: rgba(76, 175, 80, 0.08);\n}\n.warning .icon {\n color: var(--warning);\n}\n.warning {\n border-color: rgba(245, 158, 11, 0.4);\n background: rgba(245, 158, 11, 0.08);\n}\n.danger .icon {\n color: var(--danger);\n}\n.danger {\n border-color: rgba(255, 68, 68, 0.4);\n background: rgba(255, 68, 68, 0.08);\n}\n","import type { ReactNode } from \"react\";\nimport { AlertCircle, AlertTriangle, CheckCircle, Info, X } from \"react-feather\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./Alert.module.css\";\n\nexport type AlertTone = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface AlertProps {\n tone?: AlertTone;\n title?: ReactNode;\n children?: ReactNode;\n onClose?: () => void;\n icon?: ReactNode | null;\n className?: string;\n}\n\nconst defaultIcon: Record<AlertTone, ReactNode> = {\n info: <Info />,\n success: <CheckCircle />,\n warning: <AlertTriangle />,\n danger: <AlertCircle />,\n};\n\nexport function Alert({ tone, title, children, onClose, icon, className }: AlertProps) {\n const showIcon = icon !== null;\n return (\n <div className={cx(styles.alert, styles[tone!], className)} role=\"alert\">\n {showIcon && <span className={styles.icon}>{icon ?? defaultIcon[tone!]}</span>}\n <div className={styles.content}>\n {title && <div className={styles.title}>{title}</div>}\n {children}\n </div>\n {onClose && (\n <button type=\"button\" className={styles.close} onClick={onClose} aria-label=\"Dismiss\">\n <X />\n </button>\n )}\n </div>\n );\n}\n",".empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n gap: var(--space-3);\n padding: var(--space-8) var(--space-4);\n}\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n border-radius: var(--radius-lg);\n background: var(--chips-background);\n color: var(--muted);\n}\n.icon svg {\n width: 24px;\n height: 24px;\n}\n.title {\n margin: 0;\n font-size: var(--fs-md);\n font-weight: 600;\n color: var(--text);\n}\n.description {\n margin: 0;\n max-width: 360px;\n font-size: var(--fs-sm);\n color: var(--muted);\n line-height: 1.5;\n}\n.actions {\n display: flex;\n gap: var(--space-2);\n margin-top: var(--space-2);\n}\n","import type { ReactNode } from \"react\";\nimport { Inbox } from \"react-feather\";\nimport { cx } from \"../utils/cx\";\nimport styles from \"./EmptyState.module.css\";\n\nexport interface EmptyStateProps {\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n}\n\nexport function EmptyState({ icon, title, description, actions, className }: EmptyStateProps) {\n return (\n <div className={cx(styles.empty, className)}>\n <div className={styles.icon}>{icon ?? <Inbox />}</div>\n <h3 className={styles.title}>{title}</h3>\n {description && <p className={styles.description}>{description}</p>}\n {actions && <div className={styles.actions}>{actions}</div>}\n </div>\n );\n}\n",".viewport {\n position: fixed;\n top: 16px;\n right: 16px;\n z-index: 1000;\n width: min(360px, calc(100vw - 32px));\n pointer-events: none;\n}\n\n.viewport > * {\n pointer-events: auto;\n}\n\n.toast {\n position: relative;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n margin-bottom: 14px;\n border-radius: 12px;\n background: var(--card);\n border: 1px solid var(--border);\n box-shadow: 0 8px 32px var(--shadow);\n overflow: hidden;\n transform: translateY(-20px);\n opacity: 0;\n transition:\n transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1),\n opacity 0.3s ease;\n}\n\n.toast.visible {\n transform: translateY(0);\n opacity: 1;\n}\n\n.toast.leaving {\n transform: translateY(-20px) scale(0.95);\n opacity: 0;\n transition:\n transform 0.25s ease-in,\n opacity 0.25s ease-in;\n}\n\n.error {\n border-color: rgba(255, 68, 68, 0.4);\n}\n.error .iconWrapper,\n.error .progressBar {\n color: var(--danger);\n background-color: var(--danger);\n}\n.success {\n border-color: rgba(76, 175, 80, 0.4);\n}\n.success .iconWrapper,\n.success .progressBar {\n color: var(--success);\n background-color: var(--success);\n}\n.info {\n border-color: rgba(96, 165, 250, 0.4);\n}\n.info .iconWrapper,\n.info .progressBar {\n color: var(--accent);\n background-color: var(--accent);\n}\n.warning {\n border-color: rgba(245, 158, 11, 0.4);\n}\n.warning .iconWrapper,\n.warning .progressBar {\n color: #f59e0b;\n background-color: #f59e0b;\n}\n\n.iconWrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n flex-shrink: 0;\n background: transparent !important;\n}\n\n.iconWrapper svg {\n width: 100%;\n height: 100%;\n}\n\n.message {\n flex: 1;\n margin: 0;\n font-size: 14px;\n color: var(--text);\n line-height: 1.4;\n}\n\n.closeButton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: 8px;\n background: var(--chips-background);\n color: var(--muted);\n cursor: pointer;\n transition:\n background 0.2s ease,\n color 0.2s ease,\n transform 0.15s ease;\n flex-shrink: 0;\n}\n\n.closeButton:hover {\n background: var(--chips-background-active);\n color: var(--text);\n transform: scale(1.1);\n}\n\n.closeButton svg {\n width: 14px;\n height: 14px;\n}\n\n.progressTrack {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: 3px;\n background: var(--chips-background);\n overflow: hidden;\n}\n\n.progressBar {\n height: 100%;\n width: 100%;\n transform-origin: left;\n animation: shrink linear forwards;\n}\n\n@keyframes shrink {\n from {\n transform: scaleX(1);\n }\n to {\n transform: scaleX(0);\n }\n}\n","import { create } from \"zustand\";\nimport type { ReactNode } from \"react\";\n\nexport type ToastType = \"error\" | \"success\" | \"info\" | \"warning\";\n\nexport interface ToastItem {\n id: string;\n message: ReactNode;\n type: ToastType;\n duration: number;\n}\n\ninterface ToastState {\n toasts: ToastItem[];\n push: (message: ReactNode, opts?: { type?: ToastType; duration?: number }) => string;\n dismiss: (id: string) => void;\n}\n\nexport const useToastStore = create<ToastState>((set) => ({\n toasts: [],\n push: (message, opts) => {\n const id = Math.random().toString(36).slice(2);\n set((s) => ({\n toasts: [\n ...s.toasts,\n { id, message, type: opts?.type ?? \"info\", duration: opts?.duration ?? 6000 },\n ],\n }));\n return id;\n },\n dismiss: (id) => set((s) => ({ toasts: s.toasts.filter((t) => t.id !== id) })),\n}));\n\nexport const toast = {\n show: (message: ReactNode, type: ToastType = \"info\", duration?: number) =>\n useToastStore.getState().push(message, { type, duration }),\n success: (message: ReactNode, duration?: number) =>\n useToastStore.getState().push(message, { type: \"success\", duration }),\n error: (message: ReactNode, duration?: number) =>\n useToastStore.getState().push(message, { type: \"error\", duration }),\n info: (message: ReactNode, duration?: number) =>\n useToastStore.getState().push(message, { type: \"info\", duration }),\n warning: (message: ReactNode, duration?: number) =>\n useToastStore.getState().push(message, { type: \"warning\", duration }),\n};\n","import { useEffect, useState } from \"react\";\nimport { AlertCircle, AlertTriangle, Info, Smile, X } from \"react-feather\";\nimport styles from \"./Toast.module.css\";\nimport { useToastStore, type ToastItem, type ToastType } from \"./toastStore\";\n\nconst iconMap: Record<ToastType, typeof AlertCircle> = {\n error: AlertCircle,\n success: Smile,\n info: Info,\n warning: AlertTriangle,\n};\n\nfunction Toast({ toast, onClose }: { toast: ToastItem; onClose: () => void }) {\n const [visible, setVisible] = useState(false);\n const [leaving, setLeaving] = useState(false);\n\n useEffect(() => {\n requestAnimationFrame(() => setVisible(true));\n const timer = setTimeout(handleClose, toast.duration);\n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toast.duration]);\n\n const handleClose = () => {\n setLeaving(true);\n setTimeout(onClose, 280);\n };\n\n const Icon = iconMap[toast.type];\n const cls = [\n styles.toast,\n styles[toast.type],\n visible ? styles.visible : \"\",\n leaving ? styles.leaving : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={cls} role=\"alert\">\n <div className={styles.iconWrapper}>\n <Icon />\n </div>\n <p className={styles.message}>{toast.message}</p>\n <button\n type=\"button\"\n className={styles.closeButton}\n onClick={handleClose}\n aria-label=\"Dismiss\"\n >\n <X />\n </button>\n <div className={styles.progressTrack}>\n <div className={styles.progressBar} style={{ animationDuration: `${toast.duration}ms` }} />\n </div>\n </div>\n );\n}\n\nexport function ToastViewport() {\n const toasts = useToastStore((s) => s.toasts);\n const dismiss = useToastStore((s) => s.dismiss);\n\n return (\n <div className={styles.viewport}>\n {toasts.map((t) => (\n <Toast key={t.id} toast={t} onClose={() => dismiss(t.id)} />\n ))}\n </div>\n );\n}\n",".backdrop {\n position: fixed;\n inset: 0;\n z-index: 1100;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: rgba(0, 0, 0, 0.55);\n backdrop-filter: blur(2px);\n}\n\n.modal {\n width: min(420px, 100%);\n background: var(--panel);\n border: 1px solid var(--border);\n border-radius: 16px;\n box-shadow: 0 24px 64px var(--shadow);\n overflow: hidden;\n}\n\n.header {\n padding: 20px 20px 0;\n}\n\n.headerContent {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.icon {\n color: var(--accent);\n flex-shrink: 0;\n}\n\n.danger .icon {\n color: var(--danger);\n}\n\n.title {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--text);\n}\n\n.body {\n padding: 14px 20px 4px;\n color: var(--muted);\n font-size: 14px;\n line-height: 1.5;\n}\n\n.error {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 12px;\n padding: 8px 10px;\n border-radius: 8px;\n background: rgba(255, 68, 68, 0.1);\n color: var(--danger);\n font-size: 13px;\n}\n\n.actions {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 16px 20px 20px;\n}\n","import { create } from \"zustand\";\nimport type { ReactNode } from \"react\";\n\nexport interface ConfirmOptions {\n title: string;\n message: ReactNode;\n confirmText?: string;\n cancelText?: string;\n danger?: boolean;\n onConfirm: () => void | Promise<void>;\n onCancel?: () => void;\n}\n\ninterface ConfirmState {\n isOpen: boolean;\n options: ConfirmOptions | null;\n isLoading: boolean;\n confirm: (options: ConfirmOptions) => void;\n close: () => void;\n setLoading: (loading: boolean) => void;\n}\n\nexport const useConfirmStore = create<ConfirmState>((set) => ({\n isOpen: false,\n options: null,\n isLoading: false,\n confirm: (options) => set({ isOpen: true, options, isLoading: false }),\n close: () => set({ isOpen: false, options: null, isLoading: false }),\n setLoading: (isLoading) => set({ isLoading }),\n}));\n\nexport const confirm = (options: ConfirmOptions) => useConfirmStore.getState().confirm(options);\n","import { useState, useEffect } from \"react\";\nimport { AlertCircle } from \"react-feather\";\nimport styles from \"./ConfirmDialog.module.css\";\nimport { Button } from \"./Button\";\nimport { useConfirmStore } from \"./confirmStore\";\n\nexport function ConfirmDialog() {\n const { isOpen, options, isLoading, close, setLoading } = useConfirmStore();\n const [error, setError] = useState<string | null>(null);\n\n const handleConfirm = async () => {\n if (!options) return;\n setLoading(true);\n setError(null);\n try {\n await options.onConfirm();\n close();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"An error occurred\");\n setLoading(false);\n }\n };\n\n const handleCancel = () => {\n if (isLoading) return;\n options?.onCancel?.();\n setError(null);\n close();\n };\n\n useEffect(() => {\n if (!isOpen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") handleCancel();\n if (e.key === \"Enter\" && !isLoading && !error) void handleConfirm();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, isLoading, error]);\n\n if (!isOpen || !options) return null;\n\n const modalCls = `${styles.modal} ${options.danger ? styles.danger : \"\"}`;\n\n return (\n <div className={styles.backdrop} onClick={handleCancel} role=\"presentation\">\n <div\n className={modalCls}\n onClick={(e) => e.stopPropagation()}\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"bav-confirm-title\"\n >\n <div className={styles.header}>\n <div className={styles.headerContent}>\n <AlertCircle className={styles.icon} aria-hidden=\"true\" />\n <h2 className={styles.title} id=\"bav-confirm-title\">\n {options.title}\n </h2>\n </div>\n </div>\n\n <div className={styles.body}>\n {typeof options.message === \"string\" ? (\n <p style={{ margin: 0 }}>{options.message}</p>\n ) : (\n options.message\n )}\n {error && (\n <div className={styles.error} role=\"alert\">\n <AlertCircle size={16} aria-hidden=\"true\" />\n <span>{error}</span>\n </div>\n )}\n </div>\n\n <div className={styles.actions}>\n <Button variant=\"ghost\" onClick={handleCancel} disabled={isLoading}>\n {options.cancelText ?? \"Cancel\"}\n </Button>\n <Button\n variant={options.danger ? \"danger\" : \"primary\"}\n onClick={handleConfirm}\n disabled={isLoading}\n autoFocus\n >\n {isLoading ? \"Please wait…\" : (options.confirmText ?? \"Confirm\")}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"x_google_ignoreList":[1],"mappings":"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"}
|