bav-react-ui 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -4
- package/dist/bav-ui.cjs.map +1 -1
- package/dist/bav-ui.mjs.map +1 -1
- package/dist/index.css +1 -1
- package/package.json +1 -1
package/dist/bav-ui.cjs.map
CHANGED
|
@@ -1 +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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"}
|
|
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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"}
|