@hoardodile/ui 0.0.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/dist/components/breadcrumb.js +3 -0
- package/dist/components/breadcrumb.js.map +1 -1
- package/dist/components/caption-bar.js +3 -0
- package/dist/components/caption-bar.js.map +1 -1
- package/dist/components/color-picker.js +3 -0
- package/dist/components/color-picker.js.map +1 -1
- package/dist/components/combobox.js +3 -0
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/dropdown-menu.js +3 -0
- package/dist/components/dropdown-menu.js.map +1 -1
- package/dist/components/dropdown-select.js +3 -0
- package/dist/components/dropdown-select.js.map +1 -1
- package/dist/components/font-picker.js +3 -0
- package/dist/components/font-picker.js.map +1 -1
- package/dist/components/image-crop-panel.js +3 -0
- package/dist/components/image-crop-panel.js.map +1 -1
- package/dist/components/pagination-bar.js +3 -0
- package/dist/components/pagination-bar.js.map +1 -1
- package/dist/components/pagination.js +3 -0
- package/dist/components/pagination.js.map +1 -1
- package/dist/components/panel-toolbar.js +3 -0
- package/dist/components/panel-toolbar.js.map +1 -1
- package/dist/components/plugin-download-consent.d.ts +16 -9
- package/dist/components/plugin-download-consent.js +89 -33
- package/dist/components/plugin-download-consent.js.map +1 -1
- package/dist/components/search-field.js +3 -0
- package/dist/components/search-field.js.map +1 -1
- package/dist/components/sidebar.js +3 -0
- package/dist/components/sidebar.js.map +1 -1
- package/dist/components/toast.js +3 -0
- package/dist/components/toast.js.map +1 -1
- package/dist/icons/actions.js +3 -0
- package/dist/icons/actions.js.map +1 -1
- package/dist/icons/registry.d.ts +2 -1
- package/dist/icons/registry.js +9 -1
- package/dist/icons/registry.js.map +1 -1
- package/package.json +2 -2
- package/src/components/plugin-download-consent.test.tsx +40 -4
- package/src/components/plugin-download-consent.tsx +130 -39
- package/src/icons/registry.ts +8 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/merge-config.ts","../../src/lib/utils.ts","../../src/viewport.ts","../../src/hooks/use-mobile.ts","../../src/hooks/useMobileBackToClose.ts","../../src/components/button.tsx","../../src/components/input.tsx","../../src/components/input-group.tsx","../../src/icons/icon-style.ts","../../src/icons/registry.ts","../../src/icons/marks.tsx","../../src/components/combobox.tsx"],"names":["ButtonPrimitive","cva","jsx","InputPrimitive","AltArrowDownBoldWeight","AltArrowDownBoldDuotone","AltArrowDownLinear","ComboboxPrimitive"],"mappings":"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","file":"combobox.js","sourcesContent":["import { extendTailwindMerge } from \"tailwind-merge\"\n\n// The app's `@theme inline` tokens (theme.css) generate utility names\n// tailwind-merge doesn't know, so it misclassifies them — e.g. `text-ui` is\n// parsed as a text color and dropped next to any `text-*` color. The default\n// class groups are theme-backed, so extending the theme (keys mirror the v4\n// token namespaces one-to-one) registers every custom utility with correct\n// conflict semantics. merge-config.test.ts pins this list against theme.css.\nexport const mergeTheme = {\n\ttext: [\"tiny\", \"ui\", \"doc\", \"doc-title\", \"doc-heading\", \"quote\"],\n\tspacing: [\"chip\", \"control\", \"nav\", \"sidebar\", \"panel\"],\n\ttracking: [\"label\"],\n\tshadow: [\"card\", \"dialog\"],\n\tcontainer: [\"reading\", \"medium\", \"content\"],\n\tfont: [\"doc\", \"heading\"],\n\tease: [\"standard\"],\n\tanimate: [\"skel\", \"pop\"],\n} as const\n\nexport const twMerge = extendTailwindMerge({\n\textend: { theme: mergeTheme },\n})\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"./merge-config\"\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","/**\n * Mobile viewport initial-scale factor used across the app shell and\n * plugin iframe previews. Kept in one place so it can be changed\n * without hunting through HTML templates and CSS rules.\n */\nexport const MOBILE_INITIAL_SCALE = 0.8\n\n/**\n * Width in pixels at which the app switches from below-md to md+ layouts.\n *\n * This value is intentionally aligned with Tailwind's `md` breakpoint\n * (768 px) so that JS detection and CSS responsive prefixes stay in sync.\n * Components that need to know whether they are in the \"below md\" viewport\n * should use {@link isBelowMd} or {@link useBelowMd} from @hoardodile/ui/hooks/use-mobile.\n */\nexport const MOBILE_BREAKPOINT_PX = 768\n\n/**\n * Same breakpoint expressed in rems, matching Tailwind's default theme\n * (`--breakpoint-md: 48rem`). Useful for CSS media queries and comments.\n */\nexport const MOBILE_BREAKPOINT_REM = MOBILE_BREAKPOINT_PX / 16\n\n/**\n * Media query string that matches viewports below the `md` breakpoint\n * (< 768 px). Shared between JS hooks and anywhere else that needs to detect\n * a below-md viewport.\n *\n * Keep this in sync with the CSS/Tailwind breakpoint so JS and CSS never\n * disagree about the viewport size.\n */\nexport const MOBILE_QUERY = `(max-width: ${MOBILE_BREAKPOINT_PX - 1}px)`\n\n/**\n * Width in pixels at which the app switches from a drawer to a fixed left\n * sidebar (the \"app shell\"). Raised above `md` so mid-size viewports keep\n * the whole width for their content column — below this the sidebar hides\n * behind the hamburger drawer.\n *\n * Use the CSS `sidebar:` / `max-sidebar:` variants (`--breakpoint-sidebar`)\n * at call sites — this value is the single source of truth for both.\n */\nexport const SIDEBAR_BREAKPOINT_PX = 1150\n\n/**\n * Media query string that matches viewports below the sidebar breakpoint\n * (`max-sidebar`), i.e. where the shell shows the drawer instead of the fixed\n * sidebar. Shared between JS hooks and anywhere else that needs the\n * below-sidebar viewport.\n */\nexport const SIDEBAR_QUERY = `(max-width: ${SIDEBAR_BREAKPOINT_PX - 1}px)`\n\n/**\n * Width in pixels at which the right filter rail switches from a fixed\n * column to a drawer (DESIGN.md — Layout: \"the panel becomes an\n * overlay below 1440px\"). Below this the sidebar + panel + content no\n * longer fit comfortably, so the rail hides behind a Filters button.\n *\n * Use the CSS `panel:` / `max-panel:` variants (`--breakpoint-panel`)\n * at call sites — this value is the single source of truth for both.\n */\nexport const PANEL_BREAKPOINT_PX = 1440\n\n/**\n * Media query string that matches viewports below the panel breakpoint\n * (< 1440 px), i.e. where the filter rail lives in a drawer. Shared\n * between JS hooks and anywhere else that needs the below-panel viewport.\n */\nexport const PANEL_QUERY = `(max-width: ${PANEL_BREAKPOINT_PX - 1}px)`\n","import {\n\tMOBILE_QUERY,\n\tPANEL_QUERY,\n\tSIDEBAR_QUERY,\n} from \"@hoardodile/ui/viewport\"\nimport { useMedia } from \"react-use\"\n\n/**\n * One-shot check for viewports below the `md` breakpoint (< 768 px).\n *\n * Prefer {@link useBelowMd} in React components so they re-render when the\n * viewport crosses the breakpoint. Use this helper only in event handlers,\n * utility functions, or effects where a reactive hook is not appropriate.\n */\nexport function isBelowMd(): boolean {\n\tif (typeof window === \"undefined\") return false\n\treturn window.matchMedia(MOBILE_QUERY).matches\n}\n\nexport function useBelowMd(): boolean {\n\treturn useMedia(MOBILE_QUERY, false)\n}\n\n/**\n * Reactive check for viewports below the app-shell sidebar breakpoint\n * (`max-sidebar`), where the fixed sidebar is replaced by the hamburger\n * drawer. Keep in sync with `SIDEBAR_BREAKPOINT_PX` and the\n * `sidebar:` / `max-sidebar:` CSS variants. The shell alone decides its own chrome;\n * compact-UI consumers keep using {@link useBelowMd}.\n */\nexport function useBelowSidebar(): boolean {\n\treturn useMedia(SIDEBAR_QUERY, false)\n}\n\n/**\n * Reactive check for viewports below the filter-rail breakpoint\n * (< 1440 px), where the rail becomes a drawer instead of a fixed right\n * column. Keep in sync with `PANEL_BREAKPOINT_PX` and the\n * `panel:` / `max-panel:` CSS variants.\n */\nexport function useBelowPanel(): boolean {\n\treturn useMedia(PANEL_QUERY, false)\n}\n\n/**\n * Compatibility alias for official shadcn-generated components (e.g.\n * `sidebar.tsx`), which import `useIsMobile` from this module. Mobile\n * detection rules are owned by THIS file for the whole repo (apps and\n * plugins alike) — never let the registry version of `use-mobile.ts`\n * replace it; restore after every `shadcn add`.\n */\nexport function useIsMobile(): boolean {\n\treturn useBelowMd()\n}\n","import { isBelowMd } from \"@hoardodile/ui/hooks/use-mobile\"\nimport { useEffect, useRef } from \"react\"\n\nconst HISTORY_KEY = \"__appMobileOverlay\"\n\n/**\n * LIFO stack of currently-open overlays registered via\n * {@link useMobileBackToClose}. Each entry knows how to close its own\n * overlay. The browser back gesture only closes the top entry, so\n * stacking dialogs/popovers/sheets unwind in reverse opening order\n * instead of all collapsing on the first back press.\n *\n * State is module-level so multiple component instances share a\n * single popstate listener and a single ordering source of truth.\n */\ntype OverlayEntry = {\n\treadonly id: number\n\t/** Original history state captured at push time for later restore. */\n\treadonly baseState: unknown\n\tclose: (() => void) | undefined\n}\n\nconst overlayStack: OverlayEntry[] = []\nlet popListenerInstalled = false\nlet historyPatched = false\nlet nextOverlayId = 0\n// Counts consecutive popstate events to suppress. When we call\n// `history.back()` N times (e.g. to unwind an active entry plus\n// parked entries), the next N popstate events must be swallowed so\n// they don't cascade-close deeper overlays.\nlet suppressPopCount = 0\n/**\n * Tracks every synthetic entry ID ever pushed. Used by the\n * capture-phase popstate listener to identify \"phantom\" entries —\n * synthetic history slots that remain in forward/back history after\n * the overlay was closed via route navigation. The listener auto-skips\n * these to prevent dead back-presses and router confusion.\n */\nconst seenSyntheticIds = new Set<number>()\n\n/**\n * Optional navigation-resolver registration injected by the host app.\n *\n * When set (via {@link setNavigationResolver}), `scheduleStateRestore`\n * uses it to receive a deterministic \"navigation complete\" signal from\n * the router instead of guessing timing via `requestAnimationFrame`.\n *\n * The registered function accepts a one-shot callback and returns an\n * unsubscribe function. The hook calls it, inspects `history.state`\n * inside the callback, then unsubscribes.\n */\ntype NavigationResolver = (onResolved: () => void) => () => void\nlet navigationResolver: NavigationResolver | undefined\n\n/**\n * Registers a navigation-resolver factory so that\n * {@link useMobileBackToClose} can wait for the router to finish\n * flushing its history mutations before inspecting `history.state`.\n *\n * Call this once at app startup, after the router is created:\n *\n * ```ts\n * import { setNavigationResolver } from \"@hoardodile/ui\"\n * import { router } from \"./router\"\n *\n * setNavigationResolver((fn) => router.subscribe(\"onResolved\", fn))\n * ```\n *\n * When no resolver is registered, the hook falls back to\n * `requestAnimationFrame` (correct for microtask-based routers but\n * less deterministic).\n */\nexport function setNavigationResolver(resolver: NavigationResolver): void {\n\tnavigationResolver = resolver\n}\n\n/**\n * Patches `history.pushState` once (idempotent) so that every call\n * from a router (or any other non-overlay code) is intercepted.\n *\n * When a pushState is detected that does NOT carry our\n * {@link HISTORY_KEY} marker, all open overlay entries are closed\n * and the stack is cleared. The synthetic entry's marker is\n * intentionally NOT stripped — the capture-phase popstate listener\n * uses it to identify and auto-skip the stranded entry when the\n * user later navigates past it.\n */\nfunction patchHistory(): void {\n\tif (historyPatched) return\n\tif (typeof window === \"undefined\") return\n\thistoryPatched = true\n\tconst origPush = window.history.pushState.bind(window.history)\n\twindow.history.pushState = (\n\t\tdata: unknown,\n\t\tunused: string,\n\t\turl?: string | URL | null,\n\t): void => {\n\t\tconst state = data as Record<string, unknown> | null\n\t\tif (state !== null && typeof state === \"object\" && HISTORY_KEY in state) {\n\t\t\t// Our own synthetic push — pass through.\n\t\t\torigPush(data, unused, url)\n\t\t\treturn\n\t\t}\n\t\t// Real navigation — close all overlays so the stack is\n\t\t// cleared synchronously (before React's async effects).\n\t\t// The synthetic entry remains in history with its marker\n\t\t// intact; the capture-phase popstate listener will\n\t\t// auto-skip it later.\n\t\tif (overlayStack.length > 0) {\n\t\t\tcloseAllOverlays()\n\t\t}\n\t\torigPush(data, unused, url)\n\t}\n}\n\n/**\n * Closes every active overlay in the stack (top-down) and clears\n * the stack. Called when a real navigation is detected so that\n * overlay state doesn't leak across route boundaries.\n */\nfunction closeAllOverlays(): void {\n\twhile (overlayStack.length > 0) {\n\t\tconst entry = overlayStack.pop()\n\t\tif (entry?.close !== undefined) {\n\t\t\tconst fn = entry.close\n\t\t\tentry.close = undefined\n\t\t\tfn()\n\t\t}\n\t}\n}\n\n/**\n * Installs popstate listeners and patches history.pushState.\n *\n * Two listeners are installed:\n *\n * 1. **Capture-phase** — runs BEFORE any bubbling-phase listeners\n * (including TanStack Router's popstate handler). Inspects the\n * state at the history pointer:\n *\n * - **Active entry** (id found in overlayStack): the back\n * gesture landed on a synthetic entry that belongs to an\n * overlay still below the top of the stack. Pop and close the\n * top overlay (the one the user is actually dismissing) and\n * block the event from reaching the router via\n * `stopImmediatePropagation()`.\n *\n * - **Phantom entry** (id in `seenSyntheticIds` but NOT in\n * overlayStack): a synthetic history slot that remains after\n * the overlay was closed via route navigation. Blocks the\n * event AND auto-skips by calling `history.back()` to advance\n * the pointer past the phantom, so the router never sees its\n * stale URL.\n *\n * 2. **Bubbling-phase** — closes the top overlay when the back\n * gesture returns to the base route state (no synthetic marker),\n * which happens for the last open overlay.\n */\nfunction ensurePopListener(): void {\n\tif (popListenerInstalled) return\n\tif (typeof window === \"undefined\") return\n\tpopListenerInstalled = true\n\n\t// Capture-phase gate: block synthetic popstate from reaching\n\t// the router (or any other bubbling-phase listener on window).\n\twindow.addEventListener(\n\t\t\"popstate\",\n\t\t(e: PopStateEvent) => {\n\t\t\tif (suppressPopCount > 0) return // let the counter handle it\n\t\t\tconst state = e.state as Record<string, unknown> | null\n\t\t\tif (state !== null && typeof state === \"object\" && HISTORY_KEY in state) {\n\t\t\t\tconst id = state[HISTORY_KEY]\n\t\t\t\t// Active entry still in the stack → the back gesture\n\t\t\t\t// landed on a synthetic entry of an overlay below the\n\t\t\t\t// top. Close the top overlay and hide the event from\n\t\t\t\t// the router.\n\t\t\t\tif (\n\t\t\t\t\ttypeof id === \"number\" &&\n\t\t\t\t\toverlayStack.some((entry) => entry.id === id)\n\t\t\t\t) {\n\t\t\t\t\tcloseTopOverlay()\n\t\t\t\t\te.stopImmediatePropagation()\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Phantom entry: a synthetic history slot that\n\t\t\t\t// remains after the overlay was closed via\n\t\t\t\t// route navigation. Block the event from the\n\t\t\t\t// router AND auto-skip by calling history.back()\n\t\t\t\t// to move the pointer past the phantom.\n\t\t\t\te.stopImmediatePropagation()\n\t\t\t\tif (typeof id === \"number\" && seenSyntheticIds.has(id)) {\n\t\t\t\t\twindow.history.back()\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttrue, // capture phase\n\t)\n\n\twindow.addEventListener(\"popstate\", handlePop)\n\tpatchHistory()\n}\n\nfunction closeTopOverlay(): void {\n\tconst top = overlayStack.pop()\n\tif (top === undefined) return\n\t// `close` may be cleared if this entry was dismissed via UI from a\n\t// non-top position; the popstate then just unwinds a stale\n\t// synthetic history slot and there is nothing to close.\n\tif (top.close === undefined) return\n\t// Clear close before calling it so the resulting effect sees\n\t// idRef as undefined (back-gesture close) and skips the\n\t// back() + replaceState() UI-close path.\n\tconst closeFn = top.close\n\ttop.close = undefined\n\tcloseFn()\n}\n\nfunction handlePop(): void {\n\tif (suppressPopCount > 0) {\n\t\tsuppressPopCount--\n\t\treturn\n\t}\n\tcloseTopOverlay()\n}\n\n/**\n * Removes the entry with the given `id` from the overlay stack.\n *\n * When the entry is **not** the top of the stack, it is \"parked\"\n * (left in place with its close callback cleared) so the synthetic\n * history slot survives until swept.\n *\n * @returns An object describing what was removed:\n * - `removed`: whether the entry was found.\n * - `parkedBelow`: how many parked (close=undefined) entries were\n * found below the removed entry. These must be unwound alongside\n * the active entry to prevent dead back-presses.\n */\nfunction removeFromStack(id: number): {\n\treadonly removed: boolean\n\treadonly parkedBelow: number\n} {\n\tconst idx = overlayStack.findIndex((e) => e.id === id)\n\tif (idx === -1) return { removed: false, parkedBelow: 0 }\n\tconst wasTop = idx === overlayStack.length - 1\n\tif (!wasTop) {\n\t\t// Park: keep the history slot but neutralise the callback.\n\t\tconst entry = overlayStack[idx]\n\t\tif (entry !== undefined) entry.close = undefined\n\t\treturn { removed: true, parkedBelow: 0 }\n\t}\n\t// Top entry — remove it and count ALL parked entries below so\n\t// their orphaned synthetic history slots are unwound in the same\n\t// batch as the active entry's slot.\n\toverlayStack.pop()\n\tconst remaining = overlayStack.splice(0, overlayStack.length)\n\tconst active = remaining.filter((e) => e.close !== undefined)\n\tconst parkedBelow = remaining.length - active.length\n\toverlayStack.push(...active)\n\treturn { removed: true, parkedBelow }\n}\n\n/**\n * Cleans up the synthetic history entry after an overlay closes via\n * UI (not back gesture, not route navigation).\n *\n * `history.back()` is asynchronous — it queues a history traversal\n * task. The popstate event fires only after the traversal completes\n * (pointer has moved to the target entry). By replacing the state\n * inside the popstate handler, we ensure:\n *\n * 1. The pointer is at the base entry (not the synthetic one).\n * 2. `replaceState` truncates forward history, eliminating the\n * phantom synthetic entry that `back()` alone would leave behind.\n *\n * **Route-change safety**: When a navigation-resolver is registered\n * (via {@link setNavigationResolver}), `scheduleStateRestore` uses\n * the router's deterministic \"navigation resolved\" signal to know\n * when `history.state` reflects the new route. When no resolver is\n * available (e.g. tests), it falls back to `requestAnimationFrame`,\n * which runs after the microtask queue where the router flushes its\n * pending `pushState` calls.\n *\n * - If `history.state` still carries our marker → normal UI close,\n * proceed with the `back()` + `replaceState()` cleanup.\n * - If `history.state` no longer carries our marker → a route\n * change has pushed a real entry on top. Skip the `back()` call\n * to avoid racing with the router's push. The capture-phase\n * popstate listener will auto-skip the stranded phantom entry.\n */\nfunction scheduleStateRestore(\n\tid: number,\n\tbaseState: unknown,\n\tparkedBelow: number,\n): void {\n\tfunction check(): void {\n\t\tconst currentState = window.history.state as Record<string, unknown> | null\n\n\t\t// The history pointer is no longer on this overlay's own\n\t\t// synthetic entry (route change, or another overlay has\n\t\t// already pushed/popped on top). Do NOT call history.back()\n\t\t// — it would race with the current top entry and navigate\n\t\t// to the wrong place. Just sweep parked entries from the\n\t\t// stack but do NOT prune `seenSyntheticIds`; any stranded\n\t\t// synthetic entries will be auto-skipped by the capture-phase\n\t\t// listener when the user navigates past them.\n\t\tif (\n\t\t\tcurrentState === null ||\n\t\t\ttypeof currentState !== \"object\" ||\n\t\t\t!(HISTORY_KEY in currentState) ||\n\t\t\tcurrentState[HISTORY_KEY] !== id\n\t\t) {\n\t\t\tsweepParkedEntries()\n\t\t\treturn\n\t\t}\n\n\t\tconst totalBacks = 1 + parkedBelow\n\t\tlet done = false\n\n\t\tfunction restore(): void {\n\t\t\tif (done) return\n\t\t\tdone = true\n\t\t\twindow.removeEventListener(\"popstate\", onPop)\n\t\t\twindow.history.replaceState(baseState, \"\")\n\t\t\t// replaceState truncates forward history, eliminating\n\t\t\t// phantom entries. Safe to prune their IDs from\n\t\t\t// `seenSyntheticIds` (excluding IDs still in the\n\t\t\t// active stack).\n\t\t\tconst sweptIds = sweepParkedEntries()\n\t\t\tcleanupSeenIds(sweptIds)\n\t\t}\n\n\t\tfunction onPop(): void {\n\t\t\tif (suppressPopCount > 0) {\n\t\t\t\tsuppressPopCount--\n\t\t\t\treturn\n\t\t\t}\n\t\t\trestore()\n\t\t}\n\n\t\twindow.addEventListener(\"popstate\", onPop)\n\n\t\tsuppressPopCount += totalBacks\n\t\tfor (let i = 0; i < totalBacks; i++) {\n\t\t\twindow.history.back()\n\t\t}\n\t}\n\n\t// Use both the router's deterministic \"navigation resolved\" signal\n\t// and a requestAnimationFrame fallback. In the common UI-close case\n\t// (e.g. clicking outside a dropdown) there is no route change, so\n\t// the resolver never fires. Without the fallback the synthetic\n\t// history entry would be left behind as a phantom.\n\tlet disposed = false\n\tlet rafId: number | undefined\n\tlet unsub: (() => void) | undefined\n\n\tfunction run(): void {\n\t\tif (disposed) return\n\t\tdisposed = true\n\t\tunsub?.()\n\t\tif (rafId !== undefined) {\n\t\t\tcancelAnimationFrame(rafId)\n\t\t}\n\t\tcheck()\n\t}\n\n\tif (navigationResolver !== undefined) {\n\t\tunsub = navigationResolver(run)\n\t}\n\n\trafId = requestAnimationFrame(run)\n}\n\n/**\n * Sweeps all parked entries (those with no close callback) from the\n * overlay stack. Called after `replaceState` truncates forward\n * history, since parked entries no longer have corresponding history\n * entries and would cause dead back-presses.\n *\n * @returns The IDs of entries that were removed, used by the caller\n * to prune `seenSyntheticIds`.\n */\nfunction sweepParkedEntries(): readonly number[] {\n\tconst sweptIds: number[] = []\n\tfor (let i = overlayStack.length - 1; i >= 0; i--) {\n\t\tconst entry = overlayStack[i]\n\t\tif (entry !== undefined && entry.close === undefined) {\n\t\t\tsweptIds.push(entry.id)\n\t\t\toverlayStack.splice(i, 1)\n\t\t}\n\t}\n\treturn sweptIds\n}\n\n/**\n * Removes swept IDs from `seenSyntheticIds` to prevent unbounded\n * growth over the lifetime of the SPA session.\n *\n * After `replaceState` truncates forward history, phantom entries\n * for swept parked overlays are eliminated. Their IDs can safely\n * be removed from `seenSyntheticIds` — unless the same ID belongs\n * to an entry still active in the stack (which happens when a\n * lower-ID entry is parked but a higher-ID entry above it is still\n * open and not swept).\n */\nfunction cleanupSeenIds(sweptIds: readonly number[]): void {\n\tconst activeIds = new Set(overlayStack.map((e) => e.id))\n\tfor (const id of sweptIds) {\n\t\tif (!activeIds.has(id)) {\n\t\t\tseenSyntheticIds.delete(id)\n\t\t}\n\t}\n}\n\n/**\n * On mobile (< sm), when an overlay (dialog/sheet/popover) opens we push a\n * synthetic history entry so the device back gesture closes it instead of\n * navigating away from the page.\n *\n * **Closing via UI** calls `history.back()` to navigate past the\n * synthetic entry, then uses `replaceState` (inside the resulting\n * popstate handler) to restore the original history state.\n *\n * **Closing via back gesture** is handled by the popstate listener,\n * which pops the stack entry and calls the close callback.\n *\n * **Closing via route navigation**: the `pushState` interceptor\n * closes all overlays synchronously but does NOT strip the synthetic\n * marker. The React effect's `scheduleStateRestore` waits for the\n * router's navigation-resolved signal (or falls back to\n * `requestAnimationFrame`); by then the router's push has completed\n * and the marker is gone from `history.state`, so `back()` is\n * skipped. The stranded synthetic entry is later auto-skipped by the\n * capture-phase popstate listener when the user navigates past it.\n *\n * Multiple overlays open at once stack: pressing back closes the most\n * recently opened one first, matching the visual stacking order.\n *\n * No-op on non-mobile viewports and when no `onOpenChange` is provided\n * (uncontrolled overlays cannot be closed externally).\n */\nexport function useMobileBackToClose(\n\topen: boolean | undefined,\n\tonOpenChange: ((open: boolean) => void) | undefined,\n): void {\n\tconst idRef = useRef<number | undefined>(undefined)\n\tconst onChangeRef = useRef(onOpenChange)\n\tonChangeRef.current = onOpenChange\n\n\tuseEffect(() => {\n\t\tif (typeof window === \"undefined\") return\n\t\tif (onChangeRef.current === undefined) return\n\t\tif (!isBelowMd()) return\n\t\tensurePopListener()\n\n\t\tif (open === true && idRef.current === undefined) {\n\t\t\tconst id = ++nextOverlayId\n\t\t\tidRef.current = id\n\t\t\tseenSyntheticIds.add(id)\n\t\t\t// Capture the base state BEFORE pushing so we can restore\n\t\t\t// it on close (via replaceState) to eliminate phantoms.\n\t\t\tconst baseState = window.history.state ?? null\n\t\t\twindow.history.pushState(\n\t\t\t\t{\n\t\t\t\t\t...((baseState as Record<string, unknown>) ?? {}),\n\t\t\t\t\t[HISTORY_KEY]: id,\n\t\t\t\t},\n\t\t\t\t\"\",\n\t\t\t)\n\t\t\toverlayStack.push({\n\t\t\t\tid,\n\t\t\t\tbaseState,\n\t\t\t\tclose() {\n\t\t\t\t\tidRef.current = undefined\n\t\t\t\t\tonChangeRef.current?.(false)\n\t\t\t\t},\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tif (open !== true && idRef.current !== undefined) {\n\t\t\tconst id = idRef.current\n\t\t\tidRef.current = undefined\n\t\t\tconst entryIdx = overlayStack.findIndex((e) => e.id === id)\n\t\t\tconst entry = entryIdx !== -1 ? overlayStack[entryIdx] : undefined\n\t\t\tconst { removed, parkedBelow } = removeFromStack(id)\n\t\t\tif (removed && entry !== undefined) {\n\t\t\t\tscheduleStateRestore(id, entry.baseState, parkedBelow)\n\t\t\t}\n\t\t}\n\t}, [open])\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (idRef.current !== undefined) {\n\t\t\t\tconst id = idRef.current\n\t\t\t\tidRef.current = undefined\n\t\t\t\tconst entryIdx = overlayStack.findIndex((e) => e.id === id)\n\t\t\t\tconst entry = entryIdx !== -1 ? overlayStack[entryIdx] : undefined\n\t\t\t\tconst { removed, parkedBelow } = removeFromStack(id)\n\t\t\t\tif (removed && entry !== undefined) {\n\t\t\t\t\tscheduleStateRestore(id, entry.baseState, parkedBelow)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [])\n}\n","import { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@hoardodile/ui/lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg text-ui font-medium whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary px-4! text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background shadow-xs hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n danger:\n \"bg-[color-mix(in_oklab,var(--destructive),black_12%)] text-white hover:bg-[color-mix(in_oklab,var(--destructive),black_4%)] focus-visible:border-destructive/40 focus-visible:ring-destructive/20 disabled:bg-destructive/10 disabled:text-muted-foreground dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-control gap-2 px-3 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-2 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-chip gap-2 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5\",\n lg: \"h-10 gap-2 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-9\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n active,\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props &\n VariantProps<typeof buttonVariants> & {\n /** Latched toggle state: accent fill, hover pinned so an active\n button never shifts. Callers keep choosing the matching aria\n attribute (`aria-pressed` / `aria-expanded`). */\n active?: boolean\n }) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(\n buttonVariants({ variant, size, className }),\n active && \"bg-accent text-accent-foreground hover:bg-accent\"\n )}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { Input as InputPrimitive } from \"@base-ui/react/input\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@hoardodile/ui/lib/utils\"\n\n/**\n * Muted-fill control (the ControlStub / forms anatomy): fill background,\n * `rounded-lg`, no border — the same anatomy as the search field. Three\n * height tiers ride the control tokens: `sm` h-chip, `md` h-control,\n * `lg` h-10.\n */\nconst inputVariants = cva(\n \"w-full min-w-0 rounded-lg bg-muted text-ui text-foreground outline-none placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:ring-[3px] aria-invalid:ring-destructive/20\",\n {\n variants: {\n size: {\n sm: \"h-chip px-2.5 text-xs\",\n md: \"h-control px-3\",\n lg: \"h-10 px-3.5\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\nfunction Input({\n className,\n size,\n type,\n ...props\n}: Omit<React.ComponentProps<\"input\">, \"size\"> &\n VariantProps<typeof inputVariants>) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(inputVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nexport { Input, inputVariants }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@hoardodile/ui/lib/utils\"\nimport { Button } from \"@hoardodile/ui/components/button\"\nimport { Input } from \"@hoardodile/ui/components/input\"\nimport { Textarea } from \"@hoardodile/ui/components/textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-9 w-full min-w-0 items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-2 has-[>button]:-ml-1 has-[>kbd]:ml-[-0.15rem]\",\n \"inline-end\":\n \"order-last pr-2 has-[>button]:-mr-1 has-[>kbd]:mr-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\" | \"type\"> &\n VariantProps<typeof inputGroupButtonVariants> & {\n type?: \"button\" | \"submit\" | \"reset\"\n }) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: Omit<React.ComponentProps<\"input\">, \"size\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none bg-transparent aria-invalid:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none bg-transparent py-2 aria-invalid:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","import { type ComponentType, createElement, useSyncExternalStore } from \"react\"\nimport type { IconType } from \"../components/icon.tsx\"\n\n/**\n * Icon-mode-aware glyph wrapper (Settings → Icons in the host app).\n *\n * The active icon style lives as `data-icon-style` on `document.documentElement`\n * — the host app writes it from its preference store, plugin iframes receive\n * it through the `themeChanged` push — so this module needs no context or\n * injected state: a single shared `MutationObserver` watches the attribute\n * and every wrapped component re-renders through `useSyncExternalStore`\n * when it flips.\n *\n * Only `linear` needs a component swap: the boldDuotone glyphs change to\n * their thin-line linear counterparts. `grayscale` is pure CSS (theme.css\n * recolors the `.hd-icon` hook), so the store only tracks the mode.\n */\nexport type IconStyleValue = \"duotone\" | \"grayscale\" | \"linear\"\n\n/**\n * The parallel Solar weights an icon registers — named after Solar's own\n * weights (DESIGN.md — Iconography). Every icon carries all of them;\n * adding a mode here forces every registry entry to fill it in.\n */\nexport type IconMode = \"bold\" | \"boldDuotone\" | \"linear\"\n\n/** All three mode glyphs of one icon. Mandatory and complete by type. */\nexport type IconVariants = Record<IconMode, IconType>\n\nfunction readIconMode(): IconMode {\n\treturn document.documentElement.dataset.iconStyle === \"linear\"\n\t\t? \"linear\"\n\t\t: \"boldDuotone\"\n}\n\n// Never read `document` at module load — pure-logic consumers (node test\n// environments) import this module without a DOM. The first subscribe\n// (component mount) snapshots the current value.\nlet currentMode: IconMode = \"boldDuotone\"\nlet observer: MutationObserver | undefined\nconst listeners = new Set<() => void>()\n\nfunction ensureObserver(): void {\n\tif (observer !== undefined || typeof document === \"undefined\") return\n\tobserver = new MutationObserver(() => {\n\t\tconst next = readIconMode()\n\t\tif (next === currentMode) return\n\t\tcurrentMode = next\n\t\tfor (const cb of listeners) cb()\n\t})\n\tobserver.observe(document.documentElement, {\n\t\tattributes: true,\n\t\tattributeFilter: [\"data-icon-style\"],\n\t})\n}\n\nfunction subscribeIconStyle(callback: () => void): () => void {\n\tensureObserver()\n\tcurrentMode = readIconMode()\n\tlisteners.add(callback)\n\treturn () => {\n\t\tlisteners.delete(callback)\n\t}\n}\n\nfunction getIconStyleSnapshot(): IconMode {\n\treturn currentMode\n}\n\n/**\n * Wraps a Solar glyph family so its render follows the host's icon style.\n *\n * `createIcon({ bold, boldDuotone, linear })` — the three parallel weights\n * of one icon. Without a `mode` prop the wrapper renders the glyph for the\n * active icon style; an explicit `mode` overrides it (selected states pass\n * `\"bold\"` through `Icon`).\n *\n * Every wrapped render merges the `hd-icon` hook class, so the duotone /\n * grayscale CSS in theme.css applies to direct renders too. Returns\n * `undefined`-free components callable through the `Icon` wrapper or bare\n * JSX alike.\n */\nexport function createIcon(\n\tvariants: IconVariants,\n): ComponentType<Record<string, unknown>> {\n\tfunction Icon(props: Record<string, unknown>) {\n\t\tconst current = useSyncExternalStore(\n\t\t\tsubscribeIconStyle,\n\t\t\tgetIconStyleSnapshot,\n\t\t\t() => \"boldDuotone\",\n\t\t)\n\t\tconst { mode, ...rest } = props as { readonly mode?: IconMode } & Record<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>\n\t\tconst Component = variants[(mode ?? current) as IconMode]\n\t\tconst className =\n\t\t\ttypeof rest.className === \"string\"\n\t\t\t\t? `hd-icon ${rest.className}`\n\t\t\t\t: \"hd-icon\"\n\t\treturn createElement(Component, { ...rest, className })\n\t}\n\treturn Icon\n}\n","/**\n * Central Solar icon registry for the design system.\n *\n * Every Solar glyph the app renders is exported here through `createIcon`\n * from `@hoardodile/ui` — one component per glyph carrying the three\n * parallel Solar weights (bold / boldDuotone / linear). The wrapper picks\n * the glyph for the active icon style preference (Settings → Icons): in\n * `linear` style the boldDuotone glyphs swap to their thin-line linear\n * counterparts; an explicit `mode` prop overrides (`\"bold\"` for selected\n * states). Every export carries the `hd-icon` hook class so the\n * duotone/grayscale CSS in theme.css applies to direct renders too. All\n * exports are wrapped — never the raw glyphs. Importing Solar directly is\n * confined to this file and @hoardodile/ui internals — consumers import\n * the wrapped exports only.\n *\n * Structure — imports first, one block per Solar weight (bold / bold-duotone /\n * linear, alphabetical by glyph; every glyph has all three), then one\n * export section, alphabetical by name (ordinal, case-sensitive —\n * `BookTone`'s stem `Book` sorts before `Bookmark`):\n *\n * export const <Name> = createIcon({\n * bold: <Name>BoldWeight, — filled, single-color; selected states\n * boldDuotone: <Name>BoldDuotone, — two-tone, the default\n * linear: <Name>Linear, — thin-line; `linear` icon style\n * })\n *\n * Modes are parallel and mandatory: adding a member to `IconMode` forces\n * every entry to register it (guarded by icons.test.ts). One exception:\n * `MenuDots` maps its `linear` slot to the filled weight — the thin-line\n * dots read as noise at small sizes. Tree-shaking keeps only the variants\n * actually imported.\n */\n\nimport { AddCircleIcon as AddCircleBoldWeight } from \"@solar-icons/react/bold/add-circle\"\nimport { AlignLeftIcon as AlignLeftBoldWeight } from \"@solar-icons/react/bold/align-left\"\nimport { AltArrowDownIcon as AltArrowDownBoldWeight } from \"@solar-icons/react/bold/alt-arrow-down\"\nimport { AltArrowLeftIcon as AltArrowLeftBoldWeight } from \"@solar-icons/react/bold/alt-arrow-left\"\nimport { AltArrowRightIcon as AltArrowRightBoldWeight } from \"@solar-icons/react/bold/alt-arrow-right\"\nimport { AltArrowUpIcon as AltArrowUpBoldWeight } from \"@solar-icons/react/bold/alt-arrow-up\"\nimport { ArchiveIcon as ArchiveBoldWeight } from \"@solar-icons/react/bold/archive\"\nimport { ArrowRightIcon as ArrowRightBoldWeight } from \"@solar-icons/react/bold/arrow-right\"\nimport { ArrowToTopLeftIcon as ArrowToTopLeftBoldWeight } from \"@solar-icons/react/bold/arrow-to-top-left\"\nimport { ArrowToTopRightIcon as ArrowToTopRightBoldWeight } from \"@solar-icons/react/bold/arrow-to-top-right\"\nimport { BellIcon as BellBoldWeight } from \"@solar-icons/react/bold/bell\"\nimport { BoltIcon as BoltBoldWeight } from \"@solar-icons/react/bold/bolt\"\nimport { BookIcon as BookBoldWeight } from \"@solar-icons/react/bold/book\"\nimport { Book2Icon as Book2BoldWeight } from \"@solar-icons/react/bold/book-2\"\nimport { BookmarkIcon as BookmarkBoldWeight } from \"@solar-icons/react/bold/bookmark\"\nimport { BookmarkCircleIcon as BookmarkCircleBoldWeight } from \"@solar-icons/react/bold/bookmark-circle\"\nimport { BoxIcon as BoxBoldWeight } from \"@solar-icons/react/bold/box\"\nimport { BranchingPathsUpIcon as BranchingPathsUpBoldWeight } from \"@solar-icons/react/bold/branching-paths-up\"\nimport { BugIcon as BugBoldWeight } from \"@solar-icons/react/bold/bug\"\nimport { CalendarDateIcon as CalendarDateBoldWeight } from \"@solar-icons/react/bold/calendar-date\"\nimport { ChatRoundIcon as ChatRoundBoldWeight } from \"@solar-icons/react/bold/chat-round\"\nimport { ChatRoundDotsIcon as ChatRoundDotsBoldWeight } from \"@solar-icons/react/bold/chat-round-dots\"\nimport { ChatRoundLineIcon as ChatRoundLineBoldWeight } from \"@solar-icons/react/bold/chat-round-line\"\nimport { ChatSquareIcon as ChatSquareBoldWeight } from \"@solar-icons/react/bold/chat-square\"\nimport { CheckCircleIcon as CheckCircleBoldWeight } from \"@solar-icons/react/bold/check-circle\"\nimport { ChecklistIcon as ChecklistBoldWeight } from \"@solar-icons/react/bold/checklist\"\nimport { ClipboardListIcon as ClipboardListBoldWeight } from \"@solar-icons/react/bold/clipboard-list\"\nimport { ClockCircleIcon as ClockCircleBoldWeight } from \"@solar-icons/react/bold/clock-circle\"\nimport { CompassIcon as CompassBoldWeight } from \"@solar-icons/react/bold/compass\"\nimport { CopyIcon as CopyBoldWeight } from \"@solar-icons/react/bold/copy\"\nimport { CrownIcon as CrownBoldWeight } from \"@solar-icons/react/bold/crown\"\nimport { DangerTriangleIcon as DangerTriangleBoldWeight } from \"@solar-icons/react/bold/danger-triangle\"\nimport { DatabaseIcon as DatabaseBoldWeight } from \"@solar-icons/react/bold/database\"\nimport { DisketteIcon as DisketteBoldWeight } from \"@solar-icons/react/bold/diskette\"\nimport { DislikeIcon as DislikeBoldWeight } from \"@solar-icons/react/bold/dislike\"\nimport { DocumentAddIcon as DocumentAddBoldWeight } from \"@solar-icons/react/bold/document-add\"\nimport { DocumentTextIcon as DocumentTextBoldWeight } from \"@solar-icons/react/bold/document-text\"\nimport { DoubleAltArrowDownIcon as DoubleAltArrowDownBoldWeight } from \"@solar-icons/react/bold/double-alt-arrow-down\"\nimport { DownloadIcon as DownloadBoldWeight } from \"@solar-icons/react/bold/download\"\nimport { EraserIcon as EraserBoldWeight } from \"@solar-icons/react/bold/eraser\"\nimport { EyeIcon as EyeBoldWeight } from \"@solar-icons/react/bold/eye\"\nimport { FileIcon as FileBoldWeight } from \"@solar-icons/react/bold/file\"\nimport { FileRemoveIcon as FileRemoveBoldWeight } from \"@solar-icons/react/bold/file-remove\"\nimport { FileTextIcon as FileTextBoldWeight } from \"@solar-icons/react/bold/file-text\"\nimport { FilterIcon as FilterBoldWeight } from \"@solar-icons/react/bold/filter\"\nimport { FiltersIcon as FiltersBoldWeight } from \"@solar-icons/react/bold/filters\"\nimport { FolderIcon as FolderBoldWeight } from \"@solar-icons/react/bold/folder\"\nimport { FolderOpenIcon as FolderOpenBoldWeight } from \"@solar-icons/react/bold/folder-open\"\nimport { FolderPathConnectIcon as FolderPathConnectBoldWeight } from \"@solar-icons/react/bold/folder-path-connect\"\nimport { ForbiddenCircleIcon as ForbiddenCircleBoldWeight } from \"@solar-icons/react/bold/forbidden-circle\"\nimport { GalleryIcon as GalleryBoldWeight } from \"@solar-icons/react/bold/gallery\"\nimport { GalleryAddIcon as GalleryAddBoldWeight } from \"@solar-icons/react/bold/gallery-add\"\nimport { GalleryWideIcon as GalleryWideBoldWeight } from \"@solar-icons/react/bold/gallery-wide\"\nimport { GlobalIcon as GlobalBoldWeight } from \"@solar-icons/react/bold/global\"\nimport { GraphDownIcon as GraphDownBoldWeight } from \"@solar-icons/react/bold/graph-down\"\nimport { GraphUpIcon as GraphUpBoldWeight } from \"@solar-icons/react/bold/graph-up\"\nimport { HamburgerMenuIcon as HamburgerMenuBoldWeight } from \"@solar-icons/react/bold/hamburger-menu\"\nimport { HandHeartIcon as HandHeartBoldWeight } from \"@solar-icons/react/bold/hand-heart\"\nimport { HeartIcon as HeartBoldWeight } from \"@solar-icons/react/bold/heart\"\nimport { HelpIcon as HelpBoldWeight } from \"@solar-icons/react/bold/help\"\nimport { HistoryIcon as HistoryBoldWeight } from \"@solar-icons/react/bold/history\"\nimport { HomeAngleIcon as HomeAngleBoldWeight } from \"@solar-icons/react/bold/home-angle\"\nimport { InfoCircleIcon as InfoCircleBoldWeight } from \"@solar-icons/react/bold/info-circle\"\nimport { LayersIcon as LayersBoldWeight } from \"@solar-icons/react/bold/layers\"\nimport { LetterIcon as LetterBoldWeight } from \"@solar-icons/react/bold/letter\"\nimport { LikeIcon as LikeBoldWeight } from \"@solar-icons/react/bold/like\"\nimport { LinkIcon as LinkBoldWeight } from \"@solar-icons/react/bold/link\"\nimport { ListIcon as ListBoldWeight } from \"@solar-icons/react/bold/list\"\nimport { ListVerticalIcon as ListVerticalBoldWeight } from \"@solar-icons/react/bold/list-vertical\"\nimport { LockPasswordIcon as LockPasswordBoldWeight } from \"@solar-icons/react/bold/lock-password\"\nimport { Login2Icon as Login2BoldWeight } from \"@solar-icons/react/bold/login-2\"\nimport { LogoutIcon as LogoutBoldWeight } from \"@solar-icons/react/bold/logout\"\nimport { MagicWand2Icon as MagicWand2BoldWeight } from \"@solar-icons/react/bold/magic-wand-2\"\nimport { MagnifierIcon as MagnifierBoldWeight } from \"@solar-icons/react/bold/magnifier\"\nimport { MagnifierZoomInIcon as MagnifierZoomInBoldWeight } from \"@solar-icons/react/bold/magnifier-zoom-in\"\nimport { MagnifierZoomOutIcon as MagnifierZoomOutBoldWeight } from \"@solar-icons/react/bold/magnifier-zoom-out\"\nimport { MaximizeIcon as MaximizeBoldWeight } from \"@solar-icons/react/bold/maximize\"\nimport { MenuDotsIcon as MenuDotsBoldWeight } from \"@solar-icons/react/bold/menu-dots\"\nimport { MinimizeIcon as MinimizeBoldWeight } from \"@solar-icons/react/bold/minimize\"\nimport { MinusSquareIcon as MinusSquareBoldWeight } from \"@solar-icons/react/bold/minus-square\"\nimport { MonitorIcon as MonitorBoldWeight } from \"@solar-icons/react/bold/monitor\"\nimport { MonitorSmartphoneIcon as MonitorSmartphoneBoldWeight } from \"@solar-icons/react/bold/monitor-smartphone\"\nimport { MoonIcon as MoonBoldWeight } from \"@solar-icons/react/bold/moon\"\nimport { MoveToFolderIcon as MoveToFolderBoldWeight } from \"@solar-icons/react/bold/move-to-folder\"\nimport { MusicNotesIcon as MusicNotesBoldWeight } from \"@solar-icons/react/bold/music-notes\"\nimport { PaletteIcon as PaletteBoldWeight } from \"@solar-icons/react/bold/palette\"\nimport { PaletteRoundIcon as PaletteRoundBoldWeight } from \"@solar-icons/react/bold/palette-round\"\nimport { PauseIcon as PauseBoldWeight } from \"@solar-icons/react/bold/pause\"\nimport { PenIcon as PenBoldWeight } from \"@solar-icons/react/bold/pen\"\nimport { PenNewRoundIcon as PenNewRoundBoldWeight } from \"@solar-icons/react/bold/pen-new-round\"\nimport { PieChartIcon as PieChartBoldWeight } from \"@solar-icons/react/bold/pie-chart\"\nimport { PinIcon as PinBoldWeight } from \"@solar-icons/react/bold/pin\"\nimport { PlayIcon as PlayBoldWeight } from \"@solar-icons/react/bold/play\"\nimport { PlugCircleIcon as PlugCircleBoldWeight } from \"@solar-icons/react/bold/plug-circle\"\nimport { PlusMinusIcon as PlusMinusBoldWeight } from \"@solar-icons/react/bold/plus-minus\"\nimport { PulseIcon as PulseBoldWeight } from \"@solar-icons/react/bold/pulse\"\nimport { RefreshIcon as RefreshBoldWeight } from \"@solar-icons/react/bold/refresh\"\nimport { RefreshCircleIcon as RefreshCircleBoldWeight } from \"@solar-icons/react/bold/refresh-circle\"\nimport { ReorderIcon as ReorderBoldWeight } from \"@solar-icons/react/bold/reorder\"\nimport { RepeatIcon as RepeatBoldWeight } from \"@solar-icons/react/bold/repeat\"\nimport { ReplyIcon as ReplyBoldWeight } from \"@solar-icons/react/bold/reply\"\nimport { RestartIcon as RestartBoldWeight } from \"@solar-icons/react/bold/restart\"\nimport { RocketIcon as RocketBoldWeight } from \"@solar-icons/react/bold/rocket\"\nimport { RouteIcon as RouteBoldWeight } from \"@solar-icons/react/bold/route\"\nimport { ScaleIcon as ScaleBoldWeight } from \"@solar-icons/react/bold/scale\"\nimport { ServerIcon as ServerBoldWeight } from \"@solar-icons/react/bold/server\"\nimport { SettingsIcon as SettingsBoldWeight } from \"@solar-icons/react/bold/settings\"\nimport { ShareIcon as ShareBoldWeight } from \"@solar-icons/react/bold/share\"\nimport { ShieldCheckIcon as ShieldCheckBoldWeight } from \"@solar-icons/react/bold/shield-check\"\nimport { SidebarMinimalisticIcon as SidebarMinimalisticBoldWeight } from \"@solar-icons/react/bold/sidebar-minimalistic\"\nimport { SliderHorizontalIcon as SliderHorizontalBoldWeight } from \"@solar-icons/react/bold/slider-horizontal\"\nimport { SmartphoneIcon as SmartphoneBoldWeight } from \"@solar-icons/react/bold/smartphone\"\nimport { SortIcon as SortBoldWeight } from \"@solar-icons/react/bold/sort\"\nimport { SortByTimeIcon as SortByTimeBoldWeight } from \"@solar-icons/react/bold/sort-by-time\"\nimport { SortHorizontalIcon as SortHorizontalBoldWeight } from \"@solar-icons/react/bold/sort-horizontal\"\nimport { SortVerticalIcon as SortVerticalBoldWeight } from \"@solar-icons/react/bold/sort-vertical\"\nimport { StarIcon as StarBoldWeight } from \"@solar-icons/react/bold/star\"\nimport { StructureIcon as StructureBoldWeight } from \"@solar-icons/react/bold/structure\"\nimport { SunIcon as SunBoldWeight } from \"@solar-icons/react/bold/sun\"\nimport { TagIcon as TagBoldWeight } from \"@solar-icons/react/bold/tag\"\nimport { TelescopeIcon as TelescopeBoldWeight } from \"@solar-icons/react/bold/telescope\"\nimport { TestTubeIcon as TestTubeBoldWeight } from \"@solar-icons/react/bold/test-tube\"\nimport { TextFormatIcon as TextFormatBoldWeight } from \"@solar-icons/react/bold/text-format\"\nimport { TransferHorizontalIcon as TransferHorizontalBoldWeight } from \"@solar-icons/react/bold/transfer-horizontal\"\nimport { TranslationIcon as TranslationBoldWeight } from \"@solar-icons/react/bold/translation\"\nimport { TrashBinMinimalisticIcon as TrashBinMinimalisticBoldWeight } from \"@solar-icons/react/bold/trash-bin-minimalistic\"\nimport { UndoLeftIcon as UndoLeftBoldWeight } from \"@solar-icons/react/bold/undo-left\"\nimport { UndoLeftRoundIcon as UndoLeftRoundBoldWeight } from \"@solar-icons/react/bold/undo-left-round\"\nimport { UndoRightIcon as UndoRightBoldWeight } from \"@solar-icons/react/bold/undo-right\"\nimport { UndoRightRoundIcon as UndoRightRoundBoldWeight } from \"@solar-icons/react/bold/undo-right-round\"\nimport { UploadIcon as UploadBoldWeight } from \"@solar-icons/react/bold/upload\"\nimport { UserIcon as UserBoldWeight } from \"@solar-icons/react/bold/user\"\nimport { UserIdIcon as UserIdBoldWeight } from \"@solar-icons/react/bold/user-id\"\nimport { UserMinusIcon as UserMinusBoldWeight } from \"@solar-icons/react/bold/user-minus\"\nimport { UserPlusIcon as UserPlusBoldWeight } from \"@solar-icons/react/bold/user-plus\"\nimport { UsersGroupRoundedIcon as UsersGroupRoundedBoldWeight } from \"@solar-icons/react/bold/users-group-rounded\"\nimport { UsersGroupTwoRoundedIcon as UsersGroupTwoRoundedBoldWeight } from \"@solar-icons/react/bold/users-group-two-rounded\"\nimport { VideoFrameIcon as VideoFrameBoldWeight } from \"@solar-icons/react/bold/video-frame\"\nimport { Widget2Icon as Widget2BoldWeight } from \"@solar-icons/react/bold/widget-2\"\nimport { Widget5Icon as Widget5BoldWeight } from \"@solar-icons/react/bold/widget-5\"\nimport { WindowFrameIcon as WindowFrameBoldWeight } from \"@solar-icons/react/bold/window-frame\"\nimport { AddCircleIcon as AddCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/add-circle\"\nimport { AlignLeftIcon as AlignLeftBoldDuotone } from \"@solar-icons/react/bold-duotone/align-left\"\nimport { AltArrowDownIcon as AltArrowDownBoldDuotone } from \"@solar-icons/react/bold-duotone/alt-arrow-down\"\nimport { AltArrowLeftIcon as AltArrowLeftBoldDuotone } from \"@solar-icons/react/bold-duotone/alt-arrow-left\"\nimport { AltArrowRightIcon as AltArrowRightBoldDuotone } from \"@solar-icons/react/bold-duotone/alt-arrow-right\"\nimport { AltArrowUpIcon as AltArrowUpBoldDuotone } from \"@solar-icons/react/bold-duotone/alt-arrow-up\"\nimport { ArchiveIcon as ArchiveBoldDuotone } from \"@solar-icons/react/bold-duotone/archive\"\nimport { ArrowRightIcon as ArrowRightBoldDuotone } from \"@solar-icons/react/bold-duotone/arrow-right\"\nimport { ArrowToTopLeftIcon as ArrowToTopLeftBoldDuotone } from \"@solar-icons/react/bold-duotone/arrow-to-top-left\"\nimport { ArrowToTopRightIcon as ArrowToTopRightBoldDuotone } from \"@solar-icons/react/bold-duotone/arrow-to-top-right\"\nimport { BellIcon as BellBoldDuotone } from \"@solar-icons/react/bold-duotone/bell\"\nimport { BoltIcon as BoltBoldDuotone } from \"@solar-icons/react/bold-duotone/bolt\"\nimport { BookIcon as BookBoldDuotone } from \"@solar-icons/react/bold-duotone/book\"\nimport { Book2Icon as Book2BoldDuotone } from \"@solar-icons/react/bold-duotone/book-2\"\nimport { BookmarkIcon as BookmarkBoldDuotone } from \"@solar-icons/react/bold-duotone/bookmark\"\nimport { BookmarkCircleIcon as BookmarkCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/bookmark-circle\"\nimport { BoxIcon as BoxBoldDuotone } from \"@solar-icons/react/bold-duotone/box\"\nimport { BranchingPathsUpIcon as BranchingPathsUpBoldDuotone } from \"@solar-icons/react/bold-duotone/branching-paths-up\"\nimport { BugIcon as BugBoldDuotone } from \"@solar-icons/react/bold-duotone/bug\"\nimport { CalendarDateIcon as CalendarDateBoldDuotone } from \"@solar-icons/react/bold-duotone/calendar-date\"\nimport { ChatRoundIcon as ChatRoundBoldDuotone } from \"@solar-icons/react/bold-duotone/chat-round\"\nimport { ChatRoundDotsIcon as ChatRoundDotsBoldDuotone } from \"@solar-icons/react/bold-duotone/chat-round-dots\"\nimport { ChatRoundLineIcon as ChatRoundLineBoldDuotone } from \"@solar-icons/react/bold-duotone/chat-round-line\"\nimport { ChatSquareIcon as ChatSquareBoldDuotone } from \"@solar-icons/react/bold-duotone/chat-square\"\nimport { CheckCircleIcon as CheckCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/check-circle\"\nimport { ChecklistIcon as ChecklistBoldDuotone } from \"@solar-icons/react/bold-duotone/checklist\"\nimport { ClipboardListIcon as ClipboardListBoldDuotone } from \"@solar-icons/react/bold-duotone/clipboard-list\"\nimport { ClockCircleIcon as ClockCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/clock-circle\"\nimport { CompassIcon as CompassBoldDuotone } from \"@solar-icons/react/bold-duotone/compass\"\nimport { CopyIcon as CopyBoldDuotone } from \"@solar-icons/react/bold-duotone/copy\"\nimport { CrownIcon as CrownBoldDuotone } from \"@solar-icons/react/bold-duotone/crown\"\nimport { DangerTriangleIcon as DangerTriangleBoldDuotone } from \"@solar-icons/react/bold-duotone/danger-triangle\"\nimport { DatabaseIcon as DatabaseBoldDuotone } from \"@solar-icons/react/bold-duotone/database\"\nimport { DisketteIcon as DisketteBoldDuotone } from \"@solar-icons/react/bold-duotone/diskette\"\nimport { DislikeIcon as DislikeBoldDuotone } from \"@solar-icons/react/bold-duotone/dislike\"\nimport { DocumentAddIcon as DocumentAddBoldDuotone } from \"@solar-icons/react/bold-duotone/document-add\"\nimport { DocumentTextIcon as DocumentTextBoldDuotone } from \"@solar-icons/react/bold-duotone/document-text\"\nimport { DoubleAltArrowDownIcon as DoubleAltArrowDownBoldDuotone } from \"@solar-icons/react/bold-duotone/double-alt-arrow-down\"\nimport { DownloadIcon as DownloadBoldDuotone } from \"@solar-icons/react/bold-duotone/download\"\nimport { EraserIcon as EraserBoldDuotone } from \"@solar-icons/react/bold-duotone/eraser\"\nimport { EyeIcon as EyeBoldDuotone } from \"@solar-icons/react/bold-duotone/eye\"\nimport { FileIcon as FileBoldDuotone } from \"@solar-icons/react/bold-duotone/file\"\nimport { FileRemoveIcon as FileRemoveBoldDuotone } from \"@solar-icons/react/bold-duotone/file-remove\"\nimport { FileTextIcon as FileTextBoldDuotone } from \"@solar-icons/react/bold-duotone/file-text\"\nimport { FilterIcon as FilterBoldDuotone } from \"@solar-icons/react/bold-duotone/filter\"\nimport { FiltersIcon as FiltersBoldDuotone } from \"@solar-icons/react/bold-duotone/filters\"\nimport { FolderIcon as FolderBoldDuotone } from \"@solar-icons/react/bold-duotone/folder\"\nimport { FolderOpenIcon as FolderOpenBoldDuotone } from \"@solar-icons/react/bold-duotone/folder-open\"\nimport { FolderPathConnectIcon as FolderPathConnectBoldDuotone } from \"@solar-icons/react/bold-duotone/folder-path-connect\"\nimport { ForbiddenCircleIcon as ForbiddenCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/forbidden-circle\"\nimport { GalleryIcon as GalleryBoldDuotone } from \"@solar-icons/react/bold-duotone/gallery\"\nimport { GalleryAddIcon as GalleryAddBoldDuotone } from \"@solar-icons/react/bold-duotone/gallery-add\"\nimport { GalleryWideIcon as GalleryWideBoldDuotone } from \"@solar-icons/react/bold-duotone/gallery-wide\"\nimport { GlobalIcon as GlobalBoldDuotone } from \"@solar-icons/react/bold-duotone/global\"\nimport { GraphDownIcon as GraphDownBoldDuotone } from \"@solar-icons/react/bold-duotone/graph-down\"\nimport { GraphUpIcon as GraphUpBoldDuotone } from \"@solar-icons/react/bold-duotone/graph-up\"\nimport { HamburgerMenuIcon as HamburgerMenuBoldDuotone } from \"@solar-icons/react/bold-duotone/hamburger-menu\"\nimport { HandHeartIcon as HandHeartBoldDuotone } from \"@solar-icons/react/bold-duotone/hand-heart\"\nimport { HeartIcon as HeartBoldDuotone } from \"@solar-icons/react/bold-duotone/heart\"\nimport { HelpIcon as HelpBoldDuotone } from \"@solar-icons/react/bold-duotone/help\"\nimport { HistoryIcon as HistoryBoldDuotone } from \"@solar-icons/react/bold-duotone/history\"\nimport { HomeAngleIcon as HomeAngleBoldDuotone } from \"@solar-icons/react/bold-duotone/home-angle\"\nimport { InfoCircleIcon as InfoCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/info-circle\"\nimport { LayersIcon as LayersBoldDuotone } from \"@solar-icons/react/bold-duotone/layers\"\nimport { LetterIcon as LetterBoldDuotone } from \"@solar-icons/react/bold-duotone/letter\"\nimport { LikeIcon as LikeBoldDuotone } from \"@solar-icons/react/bold-duotone/like\"\nimport { LinkIcon as LinkBoldDuotone } from \"@solar-icons/react/bold-duotone/link\"\nimport { ListIcon as ListBoldDuotone } from \"@solar-icons/react/bold-duotone/list\"\nimport { ListVerticalIcon as ListVerticalBoldDuotone } from \"@solar-icons/react/bold-duotone/list-vertical\"\nimport { LockPasswordIcon as LockPasswordBoldDuotone } from \"@solar-icons/react/bold-duotone/lock-password\"\nimport { Login2Icon as Login2BoldDuotone } from \"@solar-icons/react/bold-duotone/login-2\"\nimport { LogoutIcon as LogoutBoldDuotone } from \"@solar-icons/react/bold-duotone/logout\"\nimport { MagicWand2Icon as MagicWand2BoldDuotone } from \"@solar-icons/react/bold-duotone/magic-wand-2\"\nimport { MagnifierIcon as MagnifierBoldDuotone } from \"@solar-icons/react/bold-duotone/magnifier\"\nimport { MagnifierZoomInIcon as MagnifierZoomInBoldDuotone } from \"@solar-icons/react/bold-duotone/magnifier-zoom-in\"\nimport { MagnifierZoomOutIcon as MagnifierZoomOutBoldDuotone } from \"@solar-icons/react/bold-duotone/magnifier-zoom-out\"\nimport { MaximizeIcon as MaximizeBoldDuotone } from \"@solar-icons/react/bold-duotone/maximize\"\nimport { MenuDotsIcon as MenuDotsBoldDuotone } from \"@solar-icons/react/bold-duotone/menu-dots\"\nimport { MinimizeIcon as MinimizeBoldDuotone } from \"@solar-icons/react/bold-duotone/minimize\"\nimport { MinusSquareIcon as MinusSquareBoldDuotone } from \"@solar-icons/react/bold-duotone/minus-square\"\nimport { MonitorIcon as MonitorBoldDuotone } from \"@solar-icons/react/bold-duotone/monitor\"\nimport { MonitorSmartphoneIcon as MonitorSmartphoneBoldDuotone } from \"@solar-icons/react/bold-duotone/monitor-smartphone\"\nimport { MoonIcon as MoonBoldDuotone } from \"@solar-icons/react/bold-duotone/moon\"\nimport { MoveToFolderIcon as MoveToFolderBoldDuotone } from \"@solar-icons/react/bold-duotone/move-to-folder\"\nimport { MusicNotesIcon as MusicNotesBoldDuotone } from \"@solar-icons/react/bold-duotone/music-notes\"\nimport { PaletteIcon as PaletteBoldDuotone } from \"@solar-icons/react/bold-duotone/palette\"\nimport { PaletteRoundIcon as PaletteRoundBoldDuotone } from \"@solar-icons/react/bold-duotone/palette-round\"\nimport { PauseIcon as PauseBoldDuotone } from \"@solar-icons/react/bold-duotone/pause\"\nimport { PenIcon as PenBoldDuotone } from \"@solar-icons/react/bold-duotone/pen\"\nimport { PenNewRoundIcon as PenNewRoundBoldDuotone } from \"@solar-icons/react/bold-duotone/pen-new-round\"\nimport { PieChartIcon as PieChartBoldDuotone } from \"@solar-icons/react/bold-duotone/pie-chart\"\nimport { PinIcon as PinBoldDuotone } from \"@solar-icons/react/bold-duotone/pin\"\nimport { PlayIcon as PlayBoldDuotone } from \"@solar-icons/react/bold-duotone/play\"\nimport { PlugCircleIcon as PlugCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/plug-circle\"\nimport { PlusMinusIcon as PlusMinusBoldDuotone } from \"@solar-icons/react/bold-duotone/plus-minus\"\nimport { PulseIcon as PulseBoldDuotone } from \"@solar-icons/react/bold-duotone/pulse\"\nimport { RefreshIcon as RefreshBoldDuotone } from \"@solar-icons/react/bold-duotone/refresh\"\nimport { RefreshCircleIcon as RefreshCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/refresh-circle\"\nimport { ReorderIcon as ReorderBoldDuotone } from \"@solar-icons/react/bold-duotone/reorder\"\nimport { RepeatIcon as RepeatBoldDuotone } from \"@solar-icons/react/bold-duotone/repeat\"\nimport { ReplyIcon as ReplyBoldDuotone } from \"@solar-icons/react/bold-duotone/reply\"\nimport { RestartIcon as RestartBoldDuotone } from \"@solar-icons/react/bold-duotone/restart\"\nimport { RocketIcon as RocketBoldDuotone } from \"@solar-icons/react/bold-duotone/rocket\"\nimport { RouteIcon as RouteBoldDuotone } from \"@solar-icons/react/bold-duotone/route\"\nimport { ScaleIcon as ScaleBoldDuotone } from \"@solar-icons/react/bold-duotone/scale\"\nimport { ServerIcon as ServerBoldDuotone } from \"@solar-icons/react/bold-duotone/server\"\nimport { SettingsIcon as SettingsBoldDuotone } from \"@solar-icons/react/bold-duotone/settings\"\nimport { ShareIcon as ShareBoldDuotone } from \"@solar-icons/react/bold-duotone/share\"\nimport { ShieldCheckIcon as ShieldCheckBoldDuotone } from \"@solar-icons/react/bold-duotone/shield-check\"\nimport { SidebarMinimalisticIcon as SidebarMinimalisticBoldDuotone } from \"@solar-icons/react/bold-duotone/sidebar-minimalistic\"\nimport { SliderHorizontalIcon as SliderHorizontalBoldDuotone } from \"@solar-icons/react/bold-duotone/slider-horizontal\"\nimport { SmartphoneIcon as SmartphoneBoldDuotone } from \"@solar-icons/react/bold-duotone/smartphone\"\nimport { SortIcon as SortBoldDuotone } from \"@solar-icons/react/bold-duotone/sort\"\nimport { SortByTimeIcon as SortByTimeBoldDuotone } from \"@solar-icons/react/bold-duotone/sort-by-time\"\nimport { SortHorizontalIcon as SortHorizontalBoldDuotone } from \"@solar-icons/react/bold-duotone/sort-horizontal\"\nimport { SortVerticalIcon as SortVerticalBoldDuotone } from \"@solar-icons/react/bold-duotone/sort-vertical\"\nimport { StarIcon as StarBoldDuotone } from \"@solar-icons/react/bold-duotone/star\"\nimport { StructureIcon as StructureBoldDuotone } from \"@solar-icons/react/bold-duotone/structure\"\nimport { SunIcon as SunBoldDuotone } from \"@solar-icons/react/bold-duotone/sun\"\nimport { TagIcon as TagBoldDuotone } from \"@solar-icons/react/bold-duotone/tag\"\nimport { TelescopeIcon as TelescopeBoldDuotone } from \"@solar-icons/react/bold-duotone/telescope\"\nimport { TestTubeIcon as TestTubeBoldDuotone } from \"@solar-icons/react/bold-duotone/test-tube\"\nimport { TextFormatIcon as TextFormatBoldDuotone } from \"@solar-icons/react/bold-duotone/text-format\"\nimport { TransferHorizontalIcon as TransferHorizontalBoldDuotone } from \"@solar-icons/react/bold-duotone/transfer-horizontal\"\nimport { TranslationIcon as TranslationBoldDuotone } from \"@solar-icons/react/bold-duotone/translation\"\nimport { TrashBinMinimalisticIcon as TrashBinMinimalisticBoldDuotone } from \"@solar-icons/react/bold-duotone/trash-bin-minimalistic\"\nimport { UndoLeftIcon as UndoLeftBoldDuotone } from \"@solar-icons/react/bold-duotone/undo-left\"\nimport { UndoLeftRoundIcon as UndoLeftRoundBoldDuotone } from \"@solar-icons/react/bold-duotone/undo-left-round\"\nimport { UndoRightIcon as UndoRightBoldDuotone } from \"@solar-icons/react/bold-duotone/undo-right\"\nimport { UndoRightRoundIcon as UndoRightRoundBoldDuotone } from \"@solar-icons/react/bold-duotone/undo-right-round\"\nimport { UploadIcon as UploadBoldDuotone } from \"@solar-icons/react/bold-duotone/upload\"\nimport { UserIcon as UserBoldDuotone } from \"@solar-icons/react/bold-duotone/user\"\nimport { UserIdIcon as UserIdBoldDuotone } from \"@solar-icons/react/bold-duotone/user-id\"\nimport { UserMinusIcon as UserMinusBoldDuotone } from \"@solar-icons/react/bold-duotone/user-minus\"\nimport { UserPlusIcon as UserPlusBoldDuotone } from \"@solar-icons/react/bold-duotone/user-plus\"\nimport { UsersGroupRoundedIcon as UsersGroupRoundedBoldDuotone } from \"@solar-icons/react/bold-duotone/users-group-rounded\"\nimport { UsersGroupTwoRoundedIcon as UsersGroupTwoRoundedBoldDuotone } from \"@solar-icons/react/bold-duotone/users-group-two-rounded\"\nimport { VideoFrameIcon as VideoFrameBoldDuotone } from \"@solar-icons/react/bold-duotone/video-frame\"\nimport { Widget2Icon as Widget2BoldDuotone } from \"@solar-icons/react/bold-duotone/widget-2\"\nimport { Widget5Icon as Widget5BoldDuotone } from \"@solar-icons/react/bold-duotone/widget-5\"\nimport { WindowFrameIcon as WindowFrameBoldDuotone } from \"@solar-icons/react/bold-duotone/window-frame\"\nimport { AddCircleIcon as AddCircleLinear } from \"@solar-icons/react/linear/add-circle\"\nimport { AlignLeftIcon as AlignLeftLinear } from \"@solar-icons/react/linear/align-left\"\nimport { AltArrowDownIcon as AltArrowDownLinear } from \"@solar-icons/react/linear/alt-arrow-down\"\nimport { AltArrowLeftIcon as AltArrowLeftLinear } from \"@solar-icons/react/linear/alt-arrow-left\"\nimport { AltArrowRightIcon as AltArrowRightLinear } from \"@solar-icons/react/linear/alt-arrow-right\"\nimport { AltArrowUpIcon as AltArrowUpLinear } from \"@solar-icons/react/linear/alt-arrow-up\"\nimport { ArchiveIcon as ArchiveLinear } from \"@solar-icons/react/linear/archive\"\nimport { ArrowRightIcon as ArrowRightLinear } from \"@solar-icons/react/linear/arrow-right\"\nimport { ArrowToTopLeftIcon as ArrowToTopLeftLinear } from \"@solar-icons/react/linear/arrow-to-top-left\"\nimport { ArrowToTopRightIcon as ArrowToTopRightLinear } from \"@solar-icons/react/linear/arrow-to-top-right\"\nimport { BellIcon as BellLinear } from \"@solar-icons/react/linear/bell\"\nimport { BoltIcon as BoltLinear } from \"@solar-icons/react/linear/bolt\"\nimport { BookIcon as BookLinear } from \"@solar-icons/react/linear/book\"\nimport { Book2Icon as Book2Linear } from \"@solar-icons/react/linear/book-2\"\nimport { BookmarkIcon as BookmarkLinear } from \"@solar-icons/react/linear/bookmark\"\nimport { BookmarkCircleIcon as BookmarkCircleLinear } from \"@solar-icons/react/linear/bookmark-circle\"\nimport { BoxIcon as BoxLinear } from \"@solar-icons/react/linear/box\"\nimport { BranchingPathsUpIcon as BranchingPathsUpLinear } from \"@solar-icons/react/linear/branching-paths-up\"\nimport { BugIcon as BugLinear } from \"@solar-icons/react/linear/bug\"\nimport { CalendarDateIcon as CalendarDateLinear } from \"@solar-icons/react/linear/calendar-date\"\nimport { ChatRoundIcon as ChatRoundLinear } from \"@solar-icons/react/linear/chat-round\"\nimport { ChatRoundDotsIcon as ChatRoundDotsLinear } from \"@solar-icons/react/linear/chat-round-dots\"\nimport { ChatRoundLineIcon as ChatRoundLineLinear } from \"@solar-icons/react/linear/chat-round-line\"\nimport { ChatSquareIcon as ChatSquareLinear } from \"@solar-icons/react/linear/chat-square\"\nimport { CheckCircleIcon as CheckCircleLinear } from \"@solar-icons/react/linear/check-circle\"\nimport { ChecklistIcon as ChecklistLinear } from \"@solar-icons/react/linear/checklist\"\nimport { ClipboardListIcon as ClipboardListLinear } from \"@solar-icons/react/linear/clipboard-list\"\nimport { ClockCircleIcon as ClockCircleLinear } from \"@solar-icons/react/linear/clock-circle\"\nimport { CompassIcon as CompassLinear } from \"@solar-icons/react/linear/compass\"\nimport { CopyIcon as CopyLinear } from \"@solar-icons/react/linear/copy\"\nimport { CrownIcon as CrownLinear } from \"@solar-icons/react/linear/crown\"\nimport { DangerTriangleIcon as DangerTriangleLinear } from \"@solar-icons/react/linear/danger-triangle\"\nimport { DatabaseIcon as DatabaseLinear } from \"@solar-icons/react/linear/database\"\nimport { DisketteIcon as DisketteLinear } from \"@solar-icons/react/linear/diskette\"\nimport { DislikeIcon as DislikeLinear } from \"@solar-icons/react/linear/dislike\"\nimport { DocumentAddIcon as DocumentAddLinear } from \"@solar-icons/react/linear/document-add\"\nimport { DocumentTextIcon as DocumentTextLinear } from \"@solar-icons/react/linear/document-text\"\nimport { DoubleAltArrowDownIcon as DoubleAltArrowDownLinear } from \"@solar-icons/react/linear/double-alt-arrow-down\"\nimport { DownloadIcon as DownloadLinear } from \"@solar-icons/react/linear/download\"\nimport { EraserIcon as EraserLinear } from \"@solar-icons/react/linear/eraser\"\nimport { EyeIcon as EyeLinear } from \"@solar-icons/react/linear/eye\"\nimport { FileIcon as FileLinear } from \"@solar-icons/react/linear/file\"\nimport { FileRemoveIcon as FileRemoveLinear } from \"@solar-icons/react/linear/file-remove\"\nimport { FileTextIcon as FileTextLinear } from \"@solar-icons/react/linear/file-text\"\nimport { FilterIcon as FilterLinear } from \"@solar-icons/react/linear/filter\"\nimport { FiltersIcon as FiltersLinear } from \"@solar-icons/react/linear/filters\"\nimport { FolderIcon as FolderLinear } from \"@solar-icons/react/linear/folder\"\nimport { FolderOpenIcon as FolderOpenLinear } from \"@solar-icons/react/linear/folder-open\"\nimport { FolderPathConnectIcon as FolderPathConnectLinear } from \"@solar-icons/react/linear/folder-path-connect\"\nimport { ForbiddenCircleIcon as ForbiddenCircleLinear } from \"@solar-icons/react/linear/forbidden-circle\"\nimport { GalleryIcon as GalleryLinear } from \"@solar-icons/react/linear/gallery\"\nimport { GalleryAddIcon as GalleryAddLinear } from \"@solar-icons/react/linear/gallery-add\"\nimport { GalleryWideIcon as GalleryWideLinear } from \"@solar-icons/react/linear/gallery-wide\"\nimport { GlobalIcon as GlobalLinear } from \"@solar-icons/react/linear/global\"\nimport { GraphDownIcon as GraphDownLinear } from \"@solar-icons/react/linear/graph-down\"\nimport { GraphUpIcon as GraphUpLinear } from \"@solar-icons/react/linear/graph-up\"\nimport { HamburgerMenuIcon as HamburgerMenuLinear } from \"@solar-icons/react/linear/hamburger-menu\"\nimport { HandHeartIcon as HandHeartLinear } from \"@solar-icons/react/linear/hand-heart\"\nimport { HeartIcon as HeartLinear } from \"@solar-icons/react/linear/heart\"\nimport { HelpIcon as HelpLinear } from \"@solar-icons/react/linear/help\"\nimport { HistoryIcon as HistoryLinear } from \"@solar-icons/react/linear/history\"\nimport { HomeAngleIcon as HomeAngleLinear } from \"@solar-icons/react/linear/home-angle\"\nimport { InfoCircleIcon as InfoCircleLinear } from \"@solar-icons/react/linear/info-circle\"\nimport { LayersIcon as LayersLinear } from \"@solar-icons/react/linear/layers\"\nimport { LetterIcon as LetterLinear } from \"@solar-icons/react/linear/letter\"\nimport { LikeIcon as LikeLinear } from \"@solar-icons/react/linear/like\"\nimport { LinkIcon as LinkLinear } from \"@solar-icons/react/linear/link\"\nimport { ListIcon as ListLinear } from \"@solar-icons/react/linear/list\"\nimport { ListVerticalIcon as ListVerticalLinear } from \"@solar-icons/react/linear/list-vertical\"\nimport { LockPasswordIcon as LockPasswordLinear } from \"@solar-icons/react/linear/lock-password\"\nimport { Login2Icon as Login2Linear } from \"@solar-icons/react/linear/login-2\"\nimport { LogoutIcon as LogoutLinear } from \"@solar-icons/react/linear/logout\"\nimport { MagicWand2Icon as MagicWand2Linear } from \"@solar-icons/react/linear/magic-wand-2\"\nimport { MagnifierIcon as MagnifierLinear } from \"@solar-icons/react/linear/magnifier\"\nimport { MagnifierZoomInIcon as MagnifierZoomInLinear } from \"@solar-icons/react/linear/magnifier-zoom-in\"\nimport { MagnifierZoomOutIcon as MagnifierZoomOutLinear } from \"@solar-icons/react/linear/magnifier-zoom-out\"\nimport { MaximizeIcon as MaximizeLinear } from \"@solar-icons/react/linear/maximize\"\nimport { MinimizeIcon as MinimizeLinear } from \"@solar-icons/react/linear/minimize\"\nimport { MinusSquareIcon as MinusSquareLinear } from \"@solar-icons/react/linear/minus-square\"\nimport { MonitorIcon as MonitorLinear } from \"@solar-icons/react/linear/monitor\"\nimport { MonitorSmartphoneIcon as MonitorSmartphoneLinear } from \"@solar-icons/react/linear/monitor-smartphone\"\nimport { MoonIcon as MoonLinear } from \"@solar-icons/react/linear/moon\"\nimport { MoveToFolderIcon as MoveToFolderLinear } from \"@solar-icons/react/linear/move-to-folder\"\nimport { MusicNotesIcon as MusicNotesLinear } from \"@solar-icons/react/linear/music-notes\"\nimport { PaletteIcon as PaletteLinear } from \"@solar-icons/react/linear/palette\"\nimport { PaletteRoundIcon as PaletteRoundLinear } from \"@solar-icons/react/linear/palette-round\"\nimport { PauseIcon as PauseLinear } from \"@solar-icons/react/linear/pause\"\nimport { PenIcon as PenLinear } from \"@solar-icons/react/linear/pen\"\nimport { PenNewRoundIcon as PenNewRoundLinear } from \"@solar-icons/react/linear/pen-new-round\"\nimport { PieChartIcon as PieChartLinear } from \"@solar-icons/react/linear/pie-chart\"\nimport { PinIcon as PinLinear } from \"@solar-icons/react/linear/pin\"\nimport { PlayIcon as PlayLinear } from \"@solar-icons/react/linear/play\"\nimport { PlugCircleIcon as PlugCircleLinear } from \"@solar-icons/react/linear/plug-circle\"\nimport { PlusMinusIcon as PlusMinusLinear } from \"@solar-icons/react/linear/plus-minus\"\nimport { PulseIcon as PulseLinear } from \"@solar-icons/react/linear/pulse\"\nimport { RefreshIcon as RefreshLinear } from \"@solar-icons/react/linear/refresh\"\nimport { RefreshCircleIcon as RefreshCircleLinear } from \"@solar-icons/react/linear/refresh-circle\"\nimport { ReorderIcon as ReorderLinear } from \"@solar-icons/react/linear/reorder\"\nimport { RepeatIcon as RepeatLinear } from \"@solar-icons/react/linear/repeat\"\nimport { ReplyIcon as ReplyLinear } from \"@solar-icons/react/linear/reply\"\nimport { RestartIcon as RestartLinear } from \"@solar-icons/react/linear/restart\"\nimport { RocketIcon as RocketLinear } from \"@solar-icons/react/linear/rocket\"\nimport { RouteIcon as RouteLinear } from \"@solar-icons/react/linear/route\"\nimport { ScaleIcon as ScaleLinear } from \"@solar-icons/react/linear/scale\"\nimport { ServerIcon as ServerLinear } from \"@solar-icons/react/linear/server\"\nimport { SettingsIcon as SettingsLinear } from \"@solar-icons/react/linear/settings\"\nimport { ShareIcon as ShareLinear } from \"@solar-icons/react/linear/share\"\nimport { ShieldCheckIcon as ShieldCheckLinear } from \"@solar-icons/react/linear/shield-check\"\nimport { SidebarMinimalisticIcon as SidebarMinimalisticLinear } from \"@solar-icons/react/linear/sidebar-minimalistic\"\nimport { SliderHorizontalIcon as SliderHorizontalLinear } from \"@solar-icons/react/linear/slider-horizontal\"\nimport { SmartphoneIcon as SmartphoneLinear } from \"@solar-icons/react/linear/smartphone\"\nimport { SortIcon as SortLinear } from \"@solar-icons/react/linear/sort\"\nimport { SortByTimeIcon as SortByTimeLinear } from \"@solar-icons/react/linear/sort-by-time\"\nimport { SortHorizontalIcon as SortHorizontalLinear } from \"@solar-icons/react/linear/sort-horizontal\"\nimport { SortVerticalIcon as SortVerticalLinear } from \"@solar-icons/react/linear/sort-vertical\"\nimport { StarIcon as StarLinear } from \"@solar-icons/react/linear/star\"\nimport { StructureIcon as StructureLinear } from \"@solar-icons/react/linear/structure\"\nimport { SunIcon as SunLinear } from \"@solar-icons/react/linear/sun\"\nimport { TagIcon as TagLinear } from \"@solar-icons/react/linear/tag\"\nimport { TelescopeIcon as TelescopeLinear } from \"@solar-icons/react/linear/telescope\"\nimport { TestTubeIcon as TestTubeLinear } from \"@solar-icons/react/linear/test-tube\"\nimport { TextFormatIcon as TextFormatLinear } from \"@solar-icons/react/linear/text-format\"\nimport { TransferHorizontalIcon as TransferHorizontalLinear } from \"@solar-icons/react/linear/transfer-horizontal\"\nimport { TranslationIcon as TranslationLinear } from \"@solar-icons/react/linear/translation\"\nimport { TrashBinMinimalisticIcon as TrashBinMinimalisticLinear } from \"@solar-icons/react/linear/trash-bin-minimalistic\"\nimport { UndoLeftIcon as UndoLeftLinear } from \"@solar-icons/react/linear/undo-left\"\nimport { UndoLeftRoundIcon as UndoLeftRoundLinear } from \"@solar-icons/react/linear/undo-left-round\"\nimport { UndoRightIcon as UndoRightLinear } from \"@solar-icons/react/linear/undo-right\"\nimport { UndoRightRoundIcon as UndoRightRoundLinear } from \"@solar-icons/react/linear/undo-right-round\"\nimport { UploadIcon as UploadLinear } from \"@solar-icons/react/linear/upload\"\nimport { UserIcon as UserLinear } from \"@solar-icons/react/linear/user\"\nimport { UserIdIcon as UserIdLinear } from \"@solar-icons/react/linear/user-id\"\nimport { UserMinusIcon as UserMinusLinear } from \"@solar-icons/react/linear/user-minus\"\nimport { UserPlusIcon as UserPlusLinear } from \"@solar-icons/react/linear/user-plus\"\nimport { UsersGroupRoundedIcon as UsersGroupRoundedLinear } from \"@solar-icons/react/linear/users-group-rounded\"\nimport { UsersGroupTwoRoundedIcon as UsersGroupTwoRoundedLinear } from \"@solar-icons/react/linear/users-group-two-rounded\"\nimport { VideoFrameIcon as VideoFrameLinear } from \"@solar-icons/react/linear/video-frame\"\nimport { Widget2Icon as Widget2Linear } from \"@solar-icons/react/linear/widget-2\"\nimport { Widget5Icon as Widget5Linear } from \"@solar-icons/react/linear/widget-5\"\nimport { WindowFrameIcon as WindowFrameLinear } from \"@solar-icons/react/linear/window-frame\"\nimport { createIcon } from \"./icon-style\"\n\n// ── One icon per glyph - three parallel Solar weights ────────────\nexport const AddCircle = createIcon({\n\tbold: AddCircleBoldWeight,\n\tboldDuotone: AddCircleBoldDuotone,\n\tlinear: AddCircleLinear,\n})\nexport const AlignLeft = createIcon({\n\tbold: AlignLeftBoldWeight,\n\tboldDuotone: AlignLeftBoldDuotone,\n\tlinear: AlignLeftLinear,\n})\nexport const AltArrowDown = createIcon({\n\tbold: AltArrowDownBoldWeight,\n\tboldDuotone: AltArrowDownBoldDuotone,\n\tlinear: AltArrowDownLinear,\n})\nexport const AltArrowLeft = createIcon({\n\tbold: AltArrowLeftBoldWeight,\n\tboldDuotone: AltArrowLeftBoldDuotone,\n\tlinear: AltArrowLeftLinear,\n})\nexport const AltArrowRight = createIcon({\n\tbold: AltArrowRightBoldWeight,\n\tboldDuotone: AltArrowRightBoldDuotone,\n\tlinear: AltArrowRightLinear,\n})\nexport const AltArrowUp = createIcon({\n\tbold: AltArrowUpBoldWeight,\n\tboldDuotone: AltArrowUpBoldDuotone,\n\tlinear: AltArrowUpLinear,\n})\nexport const Archive = createIcon({\n\tbold: ArchiveBoldWeight,\n\tboldDuotone: ArchiveBoldDuotone,\n\tlinear: ArchiveLinear,\n})\nexport const ArrowRight = createIcon({\n\tbold: ArrowRightBoldWeight,\n\tboldDuotone: ArrowRightBoldDuotone,\n\tlinear: ArrowRightLinear,\n})\nexport const ArrowToTopLeft = createIcon({\n\tbold: ArrowToTopLeftBoldWeight,\n\tboldDuotone: ArrowToTopLeftBoldDuotone,\n\tlinear: ArrowToTopLeftLinear,\n})\nexport const ArrowToTopRight = createIcon({\n\tbold: ArrowToTopRightBoldWeight,\n\tboldDuotone: ArrowToTopRightBoldDuotone,\n\tlinear: ArrowToTopRightLinear,\n})\nexport const Bell = createIcon({\n\tbold: BellBoldWeight,\n\tboldDuotone: BellBoldDuotone,\n\tlinear: BellLinear,\n})\nexport const Bolt = createIcon({\n\tbold: BoltBoldWeight,\n\tboldDuotone: BoltBoldDuotone,\n\tlinear: BoltLinear,\n})\nexport const Book = createIcon({\n\tbold: BookBoldWeight,\n\tboldDuotone: BookBoldDuotone,\n\tlinear: BookLinear,\n})\nexport const Book2 = createIcon({\n\tbold: Book2BoldWeight,\n\tboldDuotone: Book2BoldDuotone,\n\tlinear: Book2Linear,\n})\nexport const Bookmark = createIcon({\n\tbold: BookmarkBoldWeight,\n\tboldDuotone: BookmarkBoldDuotone,\n\tlinear: BookmarkLinear,\n})\nexport const BookmarkCircle = createIcon({\n\tbold: BookmarkCircleBoldWeight,\n\tboldDuotone: BookmarkCircleBoldDuotone,\n\tlinear: BookmarkCircleLinear,\n})\nexport const Box = createIcon({\n\tbold: BoxBoldWeight,\n\tboldDuotone: BoxBoldDuotone,\n\tlinear: BoxLinear,\n})\nexport const BranchingPathsUp = createIcon({\n\tbold: BranchingPathsUpBoldWeight,\n\tboldDuotone: BranchingPathsUpBoldDuotone,\n\tlinear: BranchingPathsUpLinear,\n})\nexport const Bug = createIcon({\n\tbold: BugBoldWeight,\n\tboldDuotone: BugBoldDuotone,\n\tlinear: BugLinear,\n})\nexport const CalendarDate = createIcon({\n\tbold: CalendarDateBoldWeight,\n\tboldDuotone: CalendarDateBoldDuotone,\n\tlinear: CalendarDateLinear,\n})\nexport const ChatRound = createIcon({\n\tbold: ChatRoundBoldWeight,\n\tboldDuotone: ChatRoundBoldDuotone,\n\tlinear: ChatRoundLinear,\n})\nexport const ChatRoundDots = createIcon({\n\tbold: ChatRoundDotsBoldWeight,\n\tboldDuotone: ChatRoundDotsBoldDuotone,\n\tlinear: ChatRoundDotsLinear,\n})\nexport const ChatRoundLine = createIcon({\n\tbold: ChatRoundLineBoldWeight,\n\tboldDuotone: ChatRoundLineBoldDuotone,\n\tlinear: ChatRoundLineLinear,\n})\nexport const ChatSquare = createIcon({\n\tbold: ChatSquareBoldWeight,\n\tboldDuotone: ChatSquareBoldDuotone,\n\tlinear: ChatSquareLinear,\n})\nexport const CheckCircle = createIcon({\n\tbold: CheckCircleBoldWeight,\n\tboldDuotone: CheckCircleBoldDuotone,\n\tlinear: CheckCircleLinear,\n})\nexport const Checklist = createIcon({\n\tbold: ChecklistBoldWeight,\n\tboldDuotone: ChecklistBoldDuotone,\n\tlinear: ChecklistLinear,\n})\nexport const ClipboardList = createIcon({\n\tbold: ClipboardListBoldWeight,\n\tboldDuotone: ClipboardListBoldDuotone,\n\tlinear: ClipboardListLinear,\n})\nexport const ClockCircle = createIcon({\n\tbold: ClockCircleBoldWeight,\n\tboldDuotone: ClockCircleBoldDuotone,\n\tlinear: ClockCircleLinear,\n})\nexport const Compass = createIcon({\n\tbold: CompassBoldWeight,\n\tboldDuotone: CompassBoldDuotone,\n\tlinear: CompassLinear,\n})\nexport const Copy = createIcon({\n\tbold: CopyBoldWeight,\n\tboldDuotone: CopyBoldDuotone,\n\tlinear: CopyLinear,\n})\nexport const Crown = createIcon({\n\tbold: CrownBoldWeight,\n\tboldDuotone: CrownBoldDuotone,\n\tlinear: CrownLinear,\n})\nexport const DangerTriangle = createIcon({\n\tbold: DangerTriangleBoldWeight,\n\tboldDuotone: DangerTriangleBoldDuotone,\n\tlinear: DangerTriangleLinear,\n})\nexport const Database = createIcon({\n\tbold: DatabaseBoldWeight,\n\tboldDuotone: DatabaseBoldDuotone,\n\tlinear: DatabaseLinear,\n})\nexport const Diskette = createIcon({\n\tbold: DisketteBoldWeight,\n\tboldDuotone: DisketteBoldDuotone,\n\tlinear: DisketteLinear,\n})\nexport const Dislike = createIcon({\n\tbold: DislikeBoldWeight,\n\tboldDuotone: DislikeBoldDuotone,\n\tlinear: DislikeLinear,\n})\nexport const DocumentAdd = createIcon({\n\tbold: DocumentAddBoldWeight,\n\tboldDuotone: DocumentAddBoldDuotone,\n\tlinear: DocumentAddLinear,\n})\nexport const DocumentText = createIcon({\n\tbold: DocumentTextBoldWeight,\n\tboldDuotone: DocumentTextBoldDuotone,\n\tlinear: DocumentTextLinear,\n})\nexport const DoubleAltArrowDown = createIcon({\n\tbold: DoubleAltArrowDownBoldWeight,\n\tboldDuotone: DoubleAltArrowDownBoldDuotone,\n\tlinear: DoubleAltArrowDownLinear,\n})\nexport const Download = createIcon({\n\tbold: DownloadBoldWeight,\n\tboldDuotone: DownloadBoldDuotone,\n\tlinear: DownloadLinear,\n})\nexport const Eraser = createIcon({\n\tbold: EraserBoldWeight,\n\tboldDuotone: EraserBoldDuotone,\n\tlinear: EraserLinear,\n})\nexport const Eye = createIcon({\n\tbold: EyeBoldWeight,\n\tboldDuotone: EyeBoldDuotone,\n\tlinear: EyeLinear,\n})\nexport const File = createIcon({\n\tbold: FileBoldWeight,\n\tboldDuotone: FileBoldDuotone,\n\tlinear: FileLinear,\n})\nexport const FileRemove = createIcon({\n\tbold: FileRemoveBoldWeight,\n\tboldDuotone: FileRemoveBoldDuotone,\n\tlinear: FileRemoveLinear,\n})\nexport const FileText = createIcon({\n\tbold: FileTextBoldWeight,\n\tboldDuotone: FileTextBoldDuotone,\n\tlinear: FileTextLinear,\n})\nexport const Filter = createIcon({\n\tbold: FilterBoldWeight,\n\tboldDuotone: FilterBoldDuotone,\n\tlinear: FilterLinear,\n})\nexport const Filters = createIcon({\n\tbold: FiltersBoldWeight,\n\tboldDuotone: FiltersBoldDuotone,\n\tlinear: FiltersLinear,\n})\nexport const Folder = createIcon({\n\tbold: FolderBoldWeight,\n\tboldDuotone: FolderBoldDuotone,\n\tlinear: FolderLinear,\n})\nexport const FolderOpen = createIcon({\n\tbold: FolderOpenBoldWeight,\n\tboldDuotone: FolderOpenBoldDuotone,\n\tlinear: FolderOpenLinear,\n})\nexport const FolderPathConnect = createIcon({\n\tbold: FolderPathConnectBoldWeight,\n\tboldDuotone: FolderPathConnectBoldDuotone,\n\tlinear: FolderPathConnectLinear,\n})\nexport const ForbiddenCircle = createIcon({\n\tbold: ForbiddenCircleBoldWeight,\n\tboldDuotone: ForbiddenCircleBoldDuotone,\n\tlinear: ForbiddenCircleLinear,\n})\nexport const Gallery = createIcon({\n\tbold: GalleryBoldWeight,\n\tboldDuotone: GalleryBoldDuotone,\n\tlinear: GalleryLinear,\n})\nexport const GalleryAdd = createIcon({\n\tbold: GalleryAddBoldWeight,\n\tboldDuotone: GalleryAddBoldDuotone,\n\tlinear: GalleryAddLinear,\n})\nexport const GalleryWide = createIcon({\n\tbold: GalleryWideBoldWeight,\n\tboldDuotone: GalleryWideBoldDuotone,\n\tlinear: GalleryWideLinear,\n})\nexport const Global = createIcon({\n\tbold: GlobalBoldWeight,\n\tboldDuotone: GlobalBoldDuotone,\n\tlinear: GlobalLinear,\n})\nexport const GraphDown = createIcon({\n\tbold: GraphDownBoldWeight,\n\tboldDuotone: GraphDownBoldDuotone,\n\tlinear: GraphDownLinear,\n})\nexport const GraphUp = createIcon({\n\tbold: GraphUpBoldWeight,\n\tboldDuotone: GraphUpBoldDuotone,\n\tlinear: GraphUpLinear,\n})\nexport const HamburgerMenu = createIcon({\n\tbold: HamburgerMenuBoldWeight,\n\tboldDuotone: HamburgerMenuBoldDuotone,\n\tlinear: HamburgerMenuLinear,\n})\nexport const HandHeart = createIcon({\n\tbold: HandHeartBoldWeight,\n\tboldDuotone: HandHeartBoldDuotone,\n\tlinear: HandHeartLinear,\n})\nexport const Heart = createIcon({\n\tbold: HeartBoldWeight,\n\tboldDuotone: HeartBoldDuotone,\n\tlinear: HeartLinear,\n})\nexport const Help = createIcon({\n\tbold: HelpBoldWeight,\n\tboldDuotone: HelpBoldDuotone,\n\tlinear: HelpLinear,\n})\nexport const History = createIcon({\n\tbold: HistoryBoldWeight,\n\tboldDuotone: HistoryBoldDuotone,\n\tlinear: HistoryLinear,\n})\nexport const HomeAngle = createIcon({\n\tbold: HomeAngleBoldWeight,\n\tboldDuotone: HomeAngleBoldDuotone,\n\tlinear: HomeAngleLinear,\n})\nexport const InfoCircle = createIcon({\n\tbold: InfoCircleBoldWeight,\n\tboldDuotone: InfoCircleBoldDuotone,\n\tlinear: InfoCircleLinear,\n})\nexport const Layers = createIcon({\n\tbold: LayersBoldWeight,\n\tboldDuotone: LayersBoldDuotone,\n\tlinear: LayersLinear,\n})\nexport const Letter = createIcon({\n\tbold: LetterBoldWeight,\n\tboldDuotone: LetterBoldDuotone,\n\tlinear: LetterLinear,\n})\nexport const Like = createIcon({\n\tbold: LikeBoldWeight,\n\tboldDuotone: LikeBoldDuotone,\n\tlinear: LikeLinear,\n})\nexport const Link = createIcon({\n\tbold: LinkBoldWeight,\n\tboldDuotone: LinkBoldDuotone,\n\tlinear: LinkLinear,\n})\nexport const List = createIcon({\n\tbold: ListBoldWeight,\n\tboldDuotone: ListBoldDuotone,\n\tlinear: ListLinear,\n})\nexport const ListVertical = createIcon({\n\tbold: ListVerticalBoldWeight,\n\tboldDuotone: ListVerticalBoldDuotone,\n\tlinear: ListVerticalLinear,\n})\nexport const LockPassword = createIcon({\n\tbold: LockPasswordBoldWeight,\n\tboldDuotone: LockPasswordBoldDuotone,\n\tlinear: LockPasswordLinear,\n})\nexport const Login2 = createIcon({\n\tbold: Login2BoldWeight,\n\tboldDuotone: Login2BoldDuotone,\n\tlinear: Login2Linear,\n})\nexport const Logout = createIcon({\n\tbold: LogoutBoldWeight,\n\tboldDuotone: LogoutBoldDuotone,\n\tlinear: LogoutLinear,\n})\nexport const MagicWand2 = createIcon({\n\tbold: MagicWand2BoldWeight,\n\tboldDuotone: MagicWand2BoldDuotone,\n\tlinear: MagicWand2Linear,\n})\nexport const Magnifier = createIcon({\n\tbold: MagnifierBoldWeight,\n\tboldDuotone: MagnifierBoldDuotone,\n\tlinear: MagnifierLinear,\n})\nexport const MagnifierZoomIn = createIcon({\n\tbold: MagnifierZoomInBoldWeight,\n\tboldDuotone: MagnifierZoomInBoldDuotone,\n\tlinear: MagnifierZoomInLinear,\n})\nexport const MagnifierZoomOut = createIcon({\n\tbold: MagnifierZoomOutBoldWeight,\n\tboldDuotone: MagnifierZoomOutBoldDuotone,\n\tlinear: MagnifierZoomOutLinear,\n})\nexport const Maximize = createIcon({\n\tbold: MaximizeBoldWeight,\n\tboldDuotone: MaximizeBoldDuotone,\n\tlinear: MaximizeLinear,\n})\nexport const MenuDots = createIcon({\n\tbold: MenuDotsBoldWeight,\n\tboldDuotone: MenuDotsBoldDuotone,\n\tlinear: MenuDotsBoldWeight,\n})\nexport const Minimize = createIcon({\n\tbold: MinimizeBoldWeight,\n\tboldDuotone: MinimizeBoldDuotone,\n\tlinear: MinimizeLinear,\n})\nexport const MinusSquare = createIcon({\n\tbold: MinusSquareBoldWeight,\n\tboldDuotone: MinusSquareBoldDuotone,\n\tlinear: MinusSquareLinear,\n})\nexport const Monitor = createIcon({\n\tbold: MonitorBoldWeight,\n\tboldDuotone: MonitorBoldDuotone,\n\tlinear: MonitorLinear,\n})\nexport const MonitorSmartphone = createIcon({\n\tbold: MonitorSmartphoneBoldWeight,\n\tboldDuotone: MonitorSmartphoneBoldDuotone,\n\tlinear: MonitorSmartphoneLinear,\n})\nexport const Moon = createIcon({\n\tbold: MoonBoldWeight,\n\tboldDuotone: MoonBoldDuotone,\n\tlinear: MoonLinear,\n})\nexport const MoveToFolder = createIcon({\n\tbold: MoveToFolderBoldWeight,\n\tboldDuotone: MoveToFolderBoldDuotone,\n\tlinear: MoveToFolderLinear,\n})\nexport const MusicNotes = createIcon({\n\tbold: MusicNotesBoldWeight,\n\tboldDuotone: MusicNotesBoldDuotone,\n\tlinear: MusicNotesLinear,\n})\nexport const Palette = createIcon({\n\tbold: PaletteBoldWeight,\n\tboldDuotone: PaletteBoldDuotone,\n\tlinear: PaletteLinear,\n})\nexport const PaletteRound = createIcon({\n\tbold: PaletteRoundBoldWeight,\n\tboldDuotone: PaletteRoundBoldDuotone,\n\tlinear: PaletteRoundLinear,\n})\nexport const Pause = createIcon({\n\tbold: PauseBoldWeight,\n\tboldDuotone: PauseBoldDuotone,\n\tlinear: PauseLinear,\n})\nexport const Pen = createIcon({\n\tbold: PenBoldWeight,\n\tboldDuotone: PenBoldDuotone,\n\tlinear: PenLinear,\n})\nexport const PenNewRound = createIcon({\n\tbold: PenNewRoundBoldWeight,\n\tboldDuotone: PenNewRoundBoldDuotone,\n\tlinear: PenNewRoundLinear,\n})\nexport const PieChart = createIcon({\n\tbold: PieChartBoldWeight,\n\tboldDuotone: PieChartBoldDuotone,\n\tlinear: PieChartLinear,\n})\nexport const Pin = createIcon({\n\tbold: PinBoldWeight,\n\tboldDuotone: PinBoldDuotone,\n\tlinear: PinLinear,\n})\nexport const Play = createIcon({\n\tbold: PlayBoldWeight,\n\tboldDuotone: PlayBoldDuotone,\n\tlinear: PlayLinear,\n})\nexport const PlugCircle = createIcon({\n\tbold: PlugCircleBoldWeight,\n\tboldDuotone: PlugCircleBoldDuotone,\n\tlinear: PlugCircleLinear,\n})\nexport const PlusMinus = createIcon({\n\tbold: PlusMinusBoldWeight,\n\tboldDuotone: PlusMinusBoldDuotone,\n\tlinear: PlusMinusLinear,\n})\nexport const Pulse = createIcon({\n\tbold: PulseBoldWeight,\n\tboldDuotone: PulseBoldDuotone,\n\tlinear: PulseLinear,\n})\nexport const Refresh = createIcon({\n\tbold: RefreshBoldWeight,\n\tboldDuotone: RefreshBoldDuotone,\n\tlinear: RefreshLinear,\n})\nexport const RefreshCircle = createIcon({\n\tbold: RefreshCircleBoldWeight,\n\tboldDuotone: RefreshCircleBoldDuotone,\n\tlinear: RefreshCircleLinear,\n})\nexport const Reorder = createIcon({\n\tbold: ReorderBoldWeight,\n\tboldDuotone: ReorderBoldDuotone,\n\tlinear: ReorderLinear,\n})\nexport const Repeat = createIcon({\n\tbold: RepeatBoldWeight,\n\tboldDuotone: RepeatBoldDuotone,\n\tlinear: RepeatLinear,\n})\nexport const Reply = createIcon({\n\tbold: ReplyBoldWeight,\n\tboldDuotone: ReplyBoldDuotone,\n\tlinear: ReplyLinear,\n})\nexport const Restart = createIcon({\n\tbold: RestartBoldWeight,\n\tboldDuotone: RestartBoldDuotone,\n\tlinear: RestartLinear,\n})\nexport const Rocket = createIcon({\n\tbold: RocketBoldWeight,\n\tboldDuotone: RocketBoldDuotone,\n\tlinear: RocketLinear,\n})\nexport const Route = createIcon({\n\tbold: RouteBoldWeight,\n\tboldDuotone: RouteBoldDuotone,\n\tlinear: RouteLinear,\n})\nexport const Scale = createIcon({\n\tbold: ScaleBoldWeight,\n\tboldDuotone: ScaleBoldDuotone,\n\tlinear: ScaleLinear,\n})\nexport const Server = createIcon({\n\tbold: ServerBoldWeight,\n\tboldDuotone: ServerBoldDuotone,\n\tlinear: ServerLinear,\n})\nexport const Settings = createIcon({\n\tbold: SettingsBoldWeight,\n\tboldDuotone: SettingsBoldDuotone,\n\tlinear: SettingsLinear,\n})\nexport const Share = createIcon({\n\tbold: ShareBoldWeight,\n\tboldDuotone: ShareBoldDuotone,\n\tlinear: ShareLinear,\n})\nexport const ShieldCheck = createIcon({\n\tbold: ShieldCheckBoldWeight,\n\tboldDuotone: ShieldCheckBoldDuotone,\n\tlinear: ShieldCheckLinear,\n})\nexport const SidebarMinimalistic = createIcon({\n\tbold: SidebarMinimalisticBoldWeight,\n\tboldDuotone: SidebarMinimalisticBoldDuotone,\n\tlinear: SidebarMinimalisticLinear,\n})\nexport const SliderHorizontal = createIcon({\n\tbold: SliderHorizontalBoldWeight,\n\tboldDuotone: SliderHorizontalBoldDuotone,\n\tlinear: SliderHorizontalLinear,\n})\nexport const Smartphone = createIcon({\n\tbold: SmartphoneBoldWeight,\n\tboldDuotone: SmartphoneBoldDuotone,\n\tlinear: SmartphoneLinear,\n})\nexport const Sort = createIcon({\n\tbold: SortBoldWeight,\n\tboldDuotone: SortBoldDuotone,\n\tlinear: SortLinear,\n})\nexport const SortByTime = createIcon({\n\tbold: SortByTimeBoldWeight,\n\tboldDuotone: SortByTimeBoldDuotone,\n\tlinear: SortByTimeLinear,\n})\nexport const SortHorizontal = createIcon({\n\tbold: SortHorizontalBoldWeight,\n\tboldDuotone: SortHorizontalBoldDuotone,\n\tlinear: SortHorizontalLinear,\n})\nexport const SortVertical = createIcon({\n\tbold: SortVerticalBoldWeight,\n\tboldDuotone: SortVerticalBoldDuotone,\n\tlinear: SortVerticalLinear,\n})\nexport const Star = createIcon({\n\tbold: StarBoldWeight,\n\tboldDuotone: StarBoldDuotone,\n\tlinear: StarLinear,\n})\nexport const Structure = createIcon({\n\tbold: StructureBoldWeight,\n\tboldDuotone: StructureBoldDuotone,\n\tlinear: StructureLinear,\n})\nexport const Sun = createIcon({\n\tbold: SunBoldWeight,\n\tboldDuotone: SunBoldDuotone,\n\tlinear: SunLinear,\n})\nexport const Tag = createIcon({\n\tbold: TagBoldWeight,\n\tboldDuotone: TagBoldDuotone,\n\tlinear: TagLinear,\n})\nexport const Telescope = createIcon({\n\tbold: TelescopeBoldWeight,\n\tboldDuotone: TelescopeBoldDuotone,\n\tlinear: TelescopeLinear,\n})\nexport const TestTube = createIcon({\n\tbold: TestTubeBoldWeight,\n\tboldDuotone: TestTubeBoldDuotone,\n\tlinear: TestTubeLinear,\n})\nexport const TextFormat = createIcon({\n\tbold: TextFormatBoldWeight,\n\tboldDuotone: TextFormatBoldDuotone,\n\tlinear: TextFormatLinear,\n})\nexport const TransferHorizontal = createIcon({\n\tbold: TransferHorizontalBoldWeight,\n\tboldDuotone: TransferHorizontalBoldDuotone,\n\tlinear: TransferHorizontalLinear,\n})\nexport const Translation = createIcon({\n\tbold: TranslationBoldWeight,\n\tboldDuotone: TranslationBoldDuotone,\n\tlinear: TranslationLinear,\n})\nexport const TrashBinMinimalistic = createIcon({\n\tbold: TrashBinMinimalisticBoldWeight,\n\tboldDuotone: TrashBinMinimalisticBoldDuotone,\n\tlinear: TrashBinMinimalisticLinear,\n})\nexport const UndoLeft = createIcon({\n\tbold: UndoLeftBoldWeight,\n\tboldDuotone: UndoLeftBoldDuotone,\n\tlinear: UndoLeftLinear,\n})\nexport const UndoLeftRound = createIcon({\n\tbold: UndoLeftRoundBoldWeight,\n\tboldDuotone: UndoLeftRoundBoldDuotone,\n\tlinear: UndoLeftRoundLinear,\n})\nexport const UndoRight = createIcon({\n\tbold: UndoRightBoldWeight,\n\tboldDuotone: UndoRightBoldDuotone,\n\tlinear: UndoRightLinear,\n})\nexport const UndoRightRound = createIcon({\n\tbold: UndoRightRoundBoldWeight,\n\tboldDuotone: UndoRightRoundBoldDuotone,\n\tlinear: UndoRightRoundLinear,\n})\nexport const Upload = createIcon({\n\tbold: UploadBoldWeight,\n\tboldDuotone: UploadBoldDuotone,\n\tlinear: UploadLinear,\n})\nexport const User = createIcon({\n\tbold: UserBoldWeight,\n\tboldDuotone: UserBoldDuotone,\n\tlinear: UserLinear,\n})\nexport const UserId = createIcon({\n\tbold: UserIdBoldWeight,\n\tboldDuotone: UserIdBoldDuotone,\n\tlinear: UserIdLinear,\n})\nexport const UserMinus = createIcon({\n\tbold: UserMinusBoldWeight,\n\tboldDuotone: UserMinusBoldDuotone,\n\tlinear: UserMinusLinear,\n})\nexport const UserPlus = createIcon({\n\tbold: UserPlusBoldWeight,\n\tboldDuotone: UserPlusBoldDuotone,\n\tlinear: UserPlusLinear,\n})\nexport const UsersGroupRounded = createIcon({\n\tbold: UsersGroupRoundedBoldWeight,\n\tboldDuotone: UsersGroupRoundedBoldDuotone,\n\tlinear: UsersGroupRoundedLinear,\n})\nexport const UsersGroupTwoRounded = createIcon({\n\tbold: UsersGroupTwoRoundedBoldWeight,\n\tboldDuotone: UsersGroupTwoRoundedBoldDuotone,\n\tlinear: UsersGroupTwoRoundedLinear,\n})\nexport const VideoFrame = createIcon({\n\tbold: VideoFrameBoldWeight,\n\tboldDuotone: VideoFrameBoldDuotone,\n\tlinear: VideoFrameLinear,\n})\nexport const Widget2 = createIcon({\n\tbold: Widget2BoldWeight,\n\tboldDuotone: Widget2BoldDuotone,\n\tlinear: Widget2Linear,\n})\nexport const Widget5 = createIcon({\n\tbold: Widget5BoldWeight,\n\tboldDuotone: Widget5BoldDuotone,\n\tlinear: Widget5Linear,\n})\nexport const WindowFrame = createIcon({\n\tbold: WindowFrameBoldWeight,\n\tboldDuotone: WindowFrameBoldDuotone,\n\tlinear: WindowFrameLinear,\n})\n","/**\n * Local utility marks — the three plain glyphs Solar's vocabulary lacks\n * (its ✓/×/+ only exist inside Circle/Square containers, whose marks occupy\n * barely a third of the box and go muddy below 16px). These are drawn\n * in-house for the spots where a bare mark is the whole meaning: checkbox\n * ticks, selected badges, pill clears, add affordances.\n *\n * Check and Cross are strokes in Solar's language (24 viewBox, round caps)\n * at 2 units — diagonals anti-alias gracefully at any tier. Plus is a\n * filled cross instead: its pure orthogonal edges land on integer pixels\n * at the md tier (3-unit arms render as a crisp 2px bar at 16px), where a\n * 1.33px stroke would straddle pixel boundaries and blur. Weight-insensitive:\n * no tone layer, no weight variants. Original geometry — not derived\n * from Solar assets.\n *\n * Marks ride the same `mode` channel as registry icons (declared, ignored):\n * a check is a check in every weight.\n */\nimport type { IconMode } from \"./icon-style.ts\"\n\ntype MarkProps = {\n\tclassName?: string\n\tmode?: IconMode\n}\n\nfunction Mark({\n\td,\n\tfilled,\n\tclassName,\n}: MarkProps & { d: string; filled?: boolean }) {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"none\"\n\t\t\tclassName={className}\n\t\t>\n\t\t\t{filled ? (\n\t\t\t\t<path d={d} fill=\"currentColor\" />\n\t\t\t) : (\n\t\t\t\t<path\n\t\t\t\t\td={d}\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</svg>\n\t)\n}\n\n/** Plain ✓ — checkbox ticks, selected badges. */\nexport function Check(props: MarkProps) {\n\treturn <Mark {...props} d=\"M5 12.8l4.7 4.7L19 7.2\" />\n}\n\n/** Plain × — pill and chip clears. */\nexport function Cross(props: MarkProps) {\n\treturn <Mark {...props} d=\"M6 6l12 12M18 6L6 18\" />\n}\n\n/** Plain + — add affordances. Filled cross, 3-unit arms spanning 5–19. */\nexport function Plus(props: MarkProps) {\n\treturn (\n\t\t<Mark\n\t\t\t{...props}\n\t\t\tfilled\n\t\t\td=\"M10.5 5h3v5.5H19v3h-5.5V19h-3v-5.5H5v-3h5.5V5Z\"\n\t\t/>\n\t)\n}\n","\"use client\"\n\n\nimport * as React from \"react\"\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react\"\n\nimport { cn } from \"@hoardodile/ui/lib/utils\"\nimport { useMobileBackToClose } from \"@hoardodile/ui/hooks/useMobileBackToClose\"\nimport { Button } from \"@hoardodile/ui/components/button\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupInput,\n} from \"@hoardodile/ui/components/input-group\"\nimport { AltArrowDown } from \"@hoardodile/ui/icons/registry\"\nimport { Check, Cross } from \"@hoardodile/ui/icons/marks\"\n\nfunction Combobox<Value, Multiple extends boolean | undefined = false>({\n open,\n defaultOpen,\n onOpenChange,\n ...props\n}: Omit<ComboboxPrimitive.Root.Props<Value, Multiple>, \"onOpenChange\"> & {\n /**\n * `eventDetails` is absent for closes triggered by the mobile back\n * gesture (a synthetic close with no underlying Base UI event).\n */\n onOpenChange?: (\n open: boolean,\n eventDetails?: ComboboxPrimitive.Root.ChangeEventDetails,\n ) => void\n}) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(\n defaultOpen ?? false,\n )\n const isControlled = open !== undefined\n const currentOpen = isControlled ? open : uncontrolledOpen\n function handleOpenChange(\n next: boolean,\n eventDetails?: ComboboxPrimitive.Root.ChangeEventDetails,\n ) {\n if (!isControlled) setUncontrolledOpen(next)\n onOpenChange?.(next, eventDetails)\n }\n useMobileBackToClose(currentOpen, handleOpenChange)\n return (\n <ComboboxPrimitive.Root<Value, Multiple>\n open={currentOpen}\n onOpenChange={handleOpenChange}\n {...props}\n />\n )\n}\n\nfunction ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) {\n return <ComboboxPrimitive.Value data-slot=\"combobox-value\" {...props} />\n}\n\nfunction ComboboxTrigger({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Trigger.Props) {\n return (\n <ComboboxPrimitive.Trigger\n data-slot=\"combobox-trigger\"\n className={cn(\"[&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n {children}\n <AltArrowDown className=\"pointer-events-none size-4 text-muted-foreground\" />\n </ComboboxPrimitive.Trigger>\n )\n}\n\nfunction ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) {\n return (\n <ComboboxPrimitive.Clear\n data-slot=\"combobox-clear\"\n render={<InputGroupButton variant=\"ghost\" size=\"icon-xs\" />}\n className={cn(className)}\n {...props}\n >\n <Cross className=\"pointer-events-none\" />\n </ComboboxPrimitive.Clear>\n )\n}\n\nfunction ComboboxInput({\n className,\n children,\n disabled = false,\n showTrigger = true,\n showClear = false,\n ...props\n}: ComboboxPrimitive.Input.Props & {\n showTrigger?: boolean\n showClear?: boolean\n}) {\n return (\n <InputGroup className={cn(\"w-auto\", className)}>\n <ComboboxPrimitive.Input\n render={<InputGroupInput disabled={disabled} />}\n {...props}\n />\n <InputGroupAddon align=\"inline-end\">\n {showTrigger && (\n <InputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n render={<ComboboxTrigger />}\n data-slot=\"input-group-button\"\n className=\"group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent\"\n disabled={disabled}\n />\n )}\n {showClear && <ComboboxClear disabled={disabled} />}\n </InputGroupAddon>\n {children}\n </InputGroup>\n )\n}\n\nfunction ComboboxContent({\n className,\n side = \"bottom\",\n sideOffset = 6,\n align = \"start\",\n alignOffset = 0,\n anchor,\n ...props\n}: ComboboxPrimitive.Popup.Props &\n Pick<\n ComboboxPrimitive.Positioner.Props,\n \"side\" | \"align\" | \"sideOffset\" | \"alignOffset\" | \"anchor\"\n >) {\n return (\n <ComboboxPrimitive.Portal>\n <ComboboxPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"isolate z-50\"\n >\n <ComboboxPrimitive.Popup\n data-slot=\"combobox-content\"\n data-chips={!!anchor}\n className={cn(\"group/combobox-content relative max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n )\n}\n\nfunction ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) {\n return (\n <ComboboxPrimitive.List\n data-slot=\"combobox-list\"\n className={cn(\n \"no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxItem({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Item.Props) {\n return (\n <ComboboxPrimitive.Item\n data-slot=\"combobox-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ComboboxPrimitive.ItemIndicator\n render={\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n }\n >\n <Check className=\"pointer-events-none\" />\n </ComboboxPrimitive.ItemIndicator>\n </ComboboxPrimitive.Item>\n )\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {\n return (\n <ComboboxPrimitive.Group\n data-slot=\"combobox-group\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxLabel({\n className,\n ...props\n}: ComboboxPrimitive.GroupLabel.Props) {\n return (\n <ComboboxPrimitive.GroupLabel\n data-slot=\"combobox-label\"\n className={cn(\"px-2 py-1.5 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxCollection({ ...props }: ComboboxPrimitive.Collection.Props) {\n return (\n <ComboboxPrimitive.Collection data-slot=\"combobox-collection\" {...props} />\n )\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {\n return (\n <ComboboxPrimitive.Empty\n data-slot=\"combobox-empty\"\n className={cn(\n \"hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxSeparator({\n className,\n ...props\n}: ComboboxPrimitive.Separator.Props) {\n return (\n <ComboboxPrimitive.Separator\n data-slot=\"combobox-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxChips({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> &\n ComboboxPrimitive.Chips.Props) {\n return (\n <ComboboxPrimitive.Chips\n data-slot=\"combobox-chips\"\n className={cn(\n \"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent bg-clip-padding px-2.5 py-1.5 text-sm shadow-xs transition-[color,box-shadow] focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1.5 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxChip({\n className,\n children,\n showRemove = true,\n ...props\n}: ComboboxPrimitive.Chip.Props & {\n showRemove?: boolean\n}) {\n return (\n <ComboboxPrimitive.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n \"flex h-[calc(--spacing(5.5))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0\",\n className\n )}\n {...props}\n >\n {children}\n {showRemove && (\n <ComboboxPrimitive.ChipRemove\n render={<Button variant=\"ghost\" size=\"icon-xs\" />}\n className=\"-ml-1 opacity-50 hover:opacity-100\"\n data-slot=\"combobox-chip-remove\"\n >\n <Cross className=\"pointer-events-none\" />\n </ComboboxPrimitive.ChipRemove>\n )}\n </ComboboxPrimitive.Chip>\n )\n}\n\nfunction ComboboxChipsInput({\n className,\n ...props\n}: ComboboxPrimitive.Input.Props) {\n return (\n <ComboboxPrimitive.Input\n data-slot=\"combobox-chip-input\"\n className={cn(\"min-w-16 flex-1 outline-none\", className)}\n {...props}\n />\n )\n}\n\nfunction useComboboxAnchor() {\n return React.useRef<HTMLDivElement | null>(null)\n}\n\nexport {\n Combobox,\n ComboboxInput,\n ComboboxContent,\n ComboboxList,\n ComboboxItem,\n ComboboxGroup,\n ComboboxLabel,\n ComboboxCollection,\n ComboboxEmpty,\n ComboboxSeparator,\n ComboboxChips,\n ComboboxChip,\n ComboboxChipsInput,\n ComboboxTrigger,\n ComboboxValue,\n useComboboxAnchor,\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/merge-config.ts","../../src/lib/utils.ts","../../src/viewport.ts","../../src/hooks/use-mobile.ts","../../src/hooks/useMobileBackToClose.ts","../../src/components/button.tsx","../../src/components/input.tsx","../../src/components/input-group.tsx","../../src/icons/icon-style.ts","../../src/icons/registry.ts","../../src/icons/marks.tsx","../../src/components/combobox.tsx"],"names":["ButtonPrimitive","cva","jsx","InputPrimitive","AltArrowDownBoldWeight","AltArrowDownBoldDuotone","AltArrowDownLinear","ComboboxPrimitive"],"mappings":"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","file":"combobox.js","sourcesContent":["import { extendTailwindMerge } from \"tailwind-merge\"\n\n// The app's `@theme inline` tokens (theme.css) generate utility names\n// tailwind-merge doesn't know, so it misclassifies them — e.g. `text-ui` is\n// parsed as a text color and dropped next to any `text-*` color. The default\n// class groups are theme-backed, so extending the theme (keys mirror the v4\n// token namespaces one-to-one) registers every custom utility with correct\n// conflict semantics. merge-config.test.ts pins this list against theme.css.\nexport const mergeTheme = {\n\ttext: [\"tiny\", \"ui\", \"doc\", \"doc-title\", \"doc-heading\", \"quote\"],\n\tspacing: [\"chip\", \"control\", \"nav\", \"sidebar\", \"panel\"],\n\ttracking: [\"label\"],\n\tshadow: [\"card\", \"dialog\"],\n\tcontainer: [\"reading\", \"medium\", \"content\"],\n\tfont: [\"doc\", \"heading\"],\n\tease: [\"standard\"],\n\tanimate: [\"skel\", \"pop\"],\n} as const\n\nexport const twMerge = extendTailwindMerge({\n\textend: { theme: mergeTheme },\n})\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"./merge-config\"\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","/**\n * Mobile viewport initial-scale factor used across the app shell and\n * plugin iframe previews. Kept in one place so it can be changed\n * without hunting through HTML templates and CSS rules.\n */\nexport const MOBILE_INITIAL_SCALE = 0.8\n\n/**\n * Width in pixels at which the app switches from below-md to md+ layouts.\n *\n * This value is intentionally aligned with Tailwind's `md` breakpoint\n * (768 px) so that JS detection and CSS responsive prefixes stay in sync.\n * Components that need to know whether they are in the \"below md\" viewport\n * should use {@link isBelowMd} or {@link useBelowMd} from @hoardodile/ui/hooks/use-mobile.\n */\nexport const MOBILE_BREAKPOINT_PX = 768\n\n/**\n * Same breakpoint expressed in rems, matching Tailwind's default theme\n * (`--breakpoint-md: 48rem`). Useful for CSS media queries and comments.\n */\nexport const MOBILE_BREAKPOINT_REM = MOBILE_BREAKPOINT_PX / 16\n\n/**\n * Media query string that matches viewports below the `md` breakpoint\n * (< 768 px). Shared between JS hooks and anywhere else that needs to detect\n * a below-md viewport.\n *\n * Keep this in sync with the CSS/Tailwind breakpoint so JS and CSS never\n * disagree about the viewport size.\n */\nexport const MOBILE_QUERY = `(max-width: ${MOBILE_BREAKPOINT_PX - 1}px)`\n\n/**\n * Width in pixels at which the app switches from a drawer to a fixed left\n * sidebar (the \"app shell\"). Raised above `md` so mid-size viewports keep\n * the whole width for their content column — below this the sidebar hides\n * behind the hamburger drawer.\n *\n * Use the CSS `sidebar:` / `max-sidebar:` variants (`--breakpoint-sidebar`)\n * at call sites — this value is the single source of truth for both.\n */\nexport const SIDEBAR_BREAKPOINT_PX = 1150\n\n/**\n * Media query string that matches viewports below the sidebar breakpoint\n * (`max-sidebar`), i.e. where the shell shows the drawer instead of the fixed\n * sidebar. Shared between JS hooks and anywhere else that needs the\n * below-sidebar viewport.\n */\nexport const SIDEBAR_QUERY = `(max-width: ${SIDEBAR_BREAKPOINT_PX - 1}px)`\n\n/**\n * Width in pixels at which the right filter rail switches from a fixed\n * column to a drawer (DESIGN.md — Layout: \"the panel becomes an\n * overlay below 1440px\"). Below this the sidebar + panel + content no\n * longer fit comfortably, so the rail hides behind a Filters button.\n *\n * Use the CSS `panel:` / `max-panel:` variants (`--breakpoint-panel`)\n * at call sites — this value is the single source of truth for both.\n */\nexport const PANEL_BREAKPOINT_PX = 1440\n\n/**\n * Media query string that matches viewports below the panel breakpoint\n * (< 1440 px), i.e. where the filter rail lives in a drawer. Shared\n * between JS hooks and anywhere else that needs the below-panel viewport.\n */\nexport const PANEL_QUERY = `(max-width: ${PANEL_BREAKPOINT_PX - 1}px)`\n","import {\n\tMOBILE_QUERY,\n\tPANEL_QUERY,\n\tSIDEBAR_QUERY,\n} from \"@hoardodile/ui/viewport\"\nimport { useMedia } from \"react-use\"\n\n/**\n * One-shot check for viewports below the `md` breakpoint (< 768 px).\n *\n * Prefer {@link useBelowMd} in React components so they re-render when the\n * viewport crosses the breakpoint. Use this helper only in event handlers,\n * utility functions, or effects where a reactive hook is not appropriate.\n */\nexport function isBelowMd(): boolean {\n\tif (typeof window === \"undefined\") return false\n\treturn window.matchMedia(MOBILE_QUERY).matches\n}\n\nexport function useBelowMd(): boolean {\n\treturn useMedia(MOBILE_QUERY, false)\n}\n\n/**\n * Reactive check for viewports below the app-shell sidebar breakpoint\n * (`max-sidebar`), where the fixed sidebar is replaced by the hamburger\n * drawer. Keep in sync with `SIDEBAR_BREAKPOINT_PX` and the\n * `sidebar:` / `max-sidebar:` CSS variants. The shell alone decides its own chrome;\n * compact-UI consumers keep using {@link useBelowMd}.\n */\nexport function useBelowSidebar(): boolean {\n\treturn useMedia(SIDEBAR_QUERY, false)\n}\n\n/**\n * Reactive check for viewports below the filter-rail breakpoint\n * (< 1440 px), where the rail becomes a drawer instead of a fixed right\n * column. Keep in sync with `PANEL_BREAKPOINT_PX` and the\n * `panel:` / `max-panel:` CSS variants.\n */\nexport function useBelowPanel(): boolean {\n\treturn useMedia(PANEL_QUERY, false)\n}\n\n/**\n * Compatibility alias for official shadcn-generated components (e.g.\n * `sidebar.tsx`), which import `useIsMobile` from this module. Mobile\n * detection rules are owned by THIS file for the whole repo (apps and\n * plugins alike) — never let the registry version of `use-mobile.ts`\n * replace it; restore after every `shadcn add`.\n */\nexport function useIsMobile(): boolean {\n\treturn useBelowMd()\n}\n","import { isBelowMd } from \"@hoardodile/ui/hooks/use-mobile\"\nimport { useEffect, useRef } from \"react\"\n\nconst HISTORY_KEY = \"__appMobileOverlay\"\n\n/**\n * LIFO stack of currently-open overlays registered via\n * {@link useMobileBackToClose}. Each entry knows how to close its own\n * overlay. The browser back gesture only closes the top entry, so\n * stacking dialogs/popovers/sheets unwind in reverse opening order\n * instead of all collapsing on the first back press.\n *\n * State is module-level so multiple component instances share a\n * single popstate listener and a single ordering source of truth.\n */\ntype OverlayEntry = {\n\treadonly id: number\n\t/** Original history state captured at push time for later restore. */\n\treadonly baseState: unknown\n\tclose: (() => void) | undefined\n}\n\nconst overlayStack: OverlayEntry[] = []\nlet popListenerInstalled = false\nlet historyPatched = false\nlet nextOverlayId = 0\n// Counts consecutive popstate events to suppress. When we call\n// `history.back()` N times (e.g. to unwind an active entry plus\n// parked entries), the next N popstate events must be swallowed so\n// they don't cascade-close deeper overlays.\nlet suppressPopCount = 0\n/**\n * Tracks every synthetic entry ID ever pushed. Used by the\n * capture-phase popstate listener to identify \"phantom\" entries —\n * synthetic history slots that remain in forward/back history after\n * the overlay was closed via route navigation. The listener auto-skips\n * these to prevent dead back-presses and router confusion.\n */\nconst seenSyntheticIds = new Set<number>()\n\n/**\n * Optional navigation-resolver registration injected by the host app.\n *\n * When set (via {@link setNavigationResolver}), `scheduleStateRestore`\n * uses it to receive a deterministic \"navigation complete\" signal from\n * the router instead of guessing timing via `requestAnimationFrame`.\n *\n * The registered function accepts a one-shot callback and returns an\n * unsubscribe function. The hook calls it, inspects `history.state`\n * inside the callback, then unsubscribes.\n */\ntype NavigationResolver = (onResolved: () => void) => () => void\nlet navigationResolver: NavigationResolver | undefined\n\n/**\n * Registers a navigation-resolver factory so that\n * {@link useMobileBackToClose} can wait for the router to finish\n * flushing its history mutations before inspecting `history.state`.\n *\n * Call this once at app startup, after the router is created:\n *\n * ```ts\n * import { setNavigationResolver } from \"@hoardodile/ui\"\n * import { router } from \"./router\"\n *\n * setNavigationResolver((fn) => router.subscribe(\"onResolved\", fn))\n * ```\n *\n * When no resolver is registered, the hook falls back to\n * `requestAnimationFrame` (correct for microtask-based routers but\n * less deterministic).\n */\nexport function setNavigationResolver(resolver: NavigationResolver): void {\n\tnavigationResolver = resolver\n}\n\n/**\n * Patches `history.pushState` once (idempotent) so that every call\n * from a router (or any other non-overlay code) is intercepted.\n *\n * When a pushState is detected that does NOT carry our\n * {@link HISTORY_KEY} marker, all open overlay entries are closed\n * and the stack is cleared. The synthetic entry's marker is\n * intentionally NOT stripped — the capture-phase popstate listener\n * uses it to identify and auto-skip the stranded entry when the\n * user later navigates past it.\n */\nfunction patchHistory(): void {\n\tif (historyPatched) return\n\tif (typeof window === \"undefined\") return\n\thistoryPatched = true\n\tconst origPush = window.history.pushState.bind(window.history)\n\twindow.history.pushState = (\n\t\tdata: unknown,\n\t\tunused: string,\n\t\turl?: string | URL | null,\n\t): void => {\n\t\tconst state = data as Record<string, unknown> | null\n\t\tif (state !== null && typeof state === \"object\" && HISTORY_KEY in state) {\n\t\t\t// Our own synthetic push — pass through.\n\t\t\torigPush(data, unused, url)\n\t\t\treturn\n\t\t}\n\t\t// Real navigation — close all overlays so the stack is\n\t\t// cleared synchronously (before React's async effects).\n\t\t// The synthetic entry remains in history with its marker\n\t\t// intact; the capture-phase popstate listener will\n\t\t// auto-skip it later.\n\t\tif (overlayStack.length > 0) {\n\t\t\tcloseAllOverlays()\n\t\t}\n\t\torigPush(data, unused, url)\n\t}\n}\n\n/**\n * Closes every active overlay in the stack (top-down) and clears\n * the stack. Called when a real navigation is detected so that\n * overlay state doesn't leak across route boundaries.\n */\nfunction closeAllOverlays(): void {\n\twhile (overlayStack.length > 0) {\n\t\tconst entry = overlayStack.pop()\n\t\tif (entry?.close !== undefined) {\n\t\t\tconst fn = entry.close\n\t\t\tentry.close = undefined\n\t\t\tfn()\n\t\t}\n\t}\n}\n\n/**\n * Installs popstate listeners and patches history.pushState.\n *\n * Two listeners are installed:\n *\n * 1. **Capture-phase** — runs BEFORE any bubbling-phase listeners\n * (including TanStack Router's popstate handler). Inspects the\n * state at the history pointer:\n *\n * - **Active entry** (id found in overlayStack): the back\n * gesture landed on a synthetic entry that belongs to an\n * overlay still below the top of the stack. Pop and close the\n * top overlay (the one the user is actually dismissing) and\n * block the event from reaching the router via\n * `stopImmediatePropagation()`.\n *\n * - **Phantom entry** (id in `seenSyntheticIds` but NOT in\n * overlayStack): a synthetic history slot that remains after\n * the overlay was closed via route navigation. Blocks the\n * event AND auto-skips by calling `history.back()` to advance\n * the pointer past the phantom, so the router never sees its\n * stale URL.\n *\n * 2. **Bubbling-phase** — closes the top overlay when the back\n * gesture returns to the base route state (no synthetic marker),\n * which happens for the last open overlay.\n */\nfunction ensurePopListener(): void {\n\tif (popListenerInstalled) return\n\tif (typeof window === \"undefined\") return\n\tpopListenerInstalled = true\n\n\t// Capture-phase gate: block synthetic popstate from reaching\n\t// the router (or any other bubbling-phase listener on window).\n\twindow.addEventListener(\n\t\t\"popstate\",\n\t\t(e: PopStateEvent) => {\n\t\t\tif (suppressPopCount > 0) return // let the counter handle it\n\t\t\tconst state = e.state as Record<string, unknown> | null\n\t\t\tif (state !== null && typeof state === \"object\" && HISTORY_KEY in state) {\n\t\t\t\tconst id = state[HISTORY_KEY]\n\t\t\t\t// Active entry still in the stack → the back gesture\n\t\t\t\t// landed on a synthetic entry of an overlay below the\n\t\t\t\t// top. Close the top overlay and hide the event from\n\t\t\t\t// the router.\n\t\t\t\tif (\n\t\t\t\t\ttypeof id === \"number\" &&\n\t\t\t\t\toverlayStack.some((entry) => entry.id === id)\n\t\t\t\t) {\n\t\t\t\t\tcloseTopOverlay()\n\t\t\t\t\te.stopImmediatePropagation()\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Phantom entry: a synthetic history slot that\n\t\t\t\t// remains after the overlay was closed via\n\t\t\t\t// route navigation. Block the event from the\n\t\t\t\t// router AND auto-skip by calling history.back()\n\t\t\t\t// to move the pointer past the phantom.\n\t\t\t\te.stopImmediatePropagation()\n\t\t\t\tif (typeof id === \"number\" && seenSyntheticIds.has(id)) {\n\t\t\t\t\twindow.history.back()\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttrue, // capture phase\n\t)\n\n\twindow.addEventListener(\"popstate\", handlePop)\n\tpatchHistory()\n}\n\nfunction closeTopOverlay(): void {\n\tconst top = overlayStack.pop()\n\tif (top === undefined) return\n\t// `close` may be cleared if this entry was dismissed via UI from a\n\t// non-top position; the popstate then just unwinds a stale\n\t// synthetic history slot and there is nothing to close.\n\tif (top.close === undefined) return\n\t// Clear close before calling it so the resulting effect sees\n\t// idRef as undefined (back-gesture close) and skips the\n\t// back() + replaceState() UI-close path.\n\tconst closeFn = top.close\n\ttop.close = undefined\n\tcloseFn()\n}\n\nfunction handlePop(): void {\n\tif (suppressPopCount > 0) {\n\t\tsuppressPopCount--\n\t\treturn\n\t}\n\tcloseTopOverlay()\n}\n\n/**\n * Removes the entry with the given `id` from the overlay stack.\n *\n * When the entry is **not** the top of the stack, it is \"parked\"\n * (left in place with its close callback cleared) so the synthetic\n * history slot survives until swept.\n *\n * @returns An object describing what was removed:\n * - `removed`: whether the entry was found.\n * - `parkedBelow`: how many parked (close=undefined) entries were\n * found below the removed entry. These must be unwound alongside\n * the active entry to prevent dead back-presses.\n */\nfunction removeFromStack(id: number): {\n\treadonly removed: boolean\n\treadonly parkedBelow: number\n} {\n\tconst idx = overlayStack.findIndex((e) => e.id === id)\n\tif (idx === -1) return { removed: false, parkedBelow: 0 }\n\tconst wasTop = idx === overlayStack.length - 1\n\tif (!wasTop) {\n\t\t// Park: keep the history slot but neutralise the callback.\n\t\tconst entry = overlayStack[idx]\n\t\tif (entry !== undefined) entry.close = undefined\n\t\treturn { removed: true, parkedBelow: 0 }\n\t}\n\t// Top entry — remove it and count ALL parked entries below so\n\t// their orphaned synthetic history slots are unwound in the same\n\t// batch as the active entry's slot.\n\toverlayStack.pop()\n\tconst remaining = overlayStack.splice(0, overlayStack.length)\n\tconst active = remaining.filter((e) => e.close !== undefined)\n\tconst parkedBelow = remaining.length - active.length\n\toverlayStack.push(...active)\n\treturn { removed: true, parkedBelow }\n}\n\n/**\n * Cleans up the synthetic history entry after an overlay closes via\n * UI (not back gesture, not route navigation).\n *\n * `history.back()` is asynchronous — it queues a history traversal\n * task. The popstate event fires only after the traversal completes\n * (pointer has moved to the target entry). By replacing the state\n * inside the popstate handler, we ensure:\n *\n * 1. The pointer is at the base entry (not the synthetic one).\n * 2. `replaceState` truncates forward history, eliminating the\n * phantom synthetic entry that `back()` alone would leave behind.\n *\n * **Route-change safety**: When a navigation-resolver is registered\n * (via {@link setNavigationResolver}), `scheduleStateRestore` uses\n * the router's deterministic \"navigation resolved\" signal to know\n * when `history.state` reflects the new route. When no resolver is\n * available (e.g. tests), it falls back to `requestAnimationFrame`,\n * which runs after the microtask queue where the router flushes its\n * pending `pushState` calls.\n *\n * - If `history.state` still carries our marker → normal UI close,\n * proceed with the `back()` + `replaceState()` cleanup.\n * - If `history.state` no longer carries our marker → a route\n * change has pushed a real entry on top. Skip the `back()` call\n * to avoid racing with the router's push. The capture-phase\n * popstate listener will auto-skip the stranded phantom entry.\n */\nfunction scheduleStateRestore(\n\tid: number,\n\tbaseState: unknown,\n\tparkedBelow: number,\n): void {\n\tfunction check(): void {\n\t\tconst currentState = window.history.state as Record<string, unknown> | null\n\n\t\t// The history pointer is no longer on this overlay's own\n\t\t// synthetic entry (route change, or another overlay has\n\t\t// already pushed/popped on top). Do NOT call history.back()\n\t\t// — it would race with the current top entry and navigate\n\t\t// to the wrong place. Just sweep parked entries from the\n\t\t// stack but do NOT prune `seenSyntheticIds`; any stranded\n\t\t// synthetic entries will be auto-skipped by the capture-phase\n\t\t// listener when the user navigates past them.\n\t\tif (\n\t\t\tcurrentState === null ||\n\t\t\ttypeof currentState !== \"object\" ||\n\t\t\t!(HISTORY_KEY in currentState) ||\n\t\t\tcurrentState[HISTORY_KEY] !== id\n\t\t) {\n\t\t\tsweepParkedEntries()\n\t\t\treturn\n\t\t}\n\n\t\tconst totalBacks = 1 + parkedBelow\n\t\tlet done = false\n\n\t\tfunction restore(): void {\n\t\t\tif (done) return\n\t\t\tdone = true\n\t\t\twindow.removeEventListener(\"popstate\", onPop)\n\t\t\twindow.history.replaceState(baseState, \"\")\n\t\t\t// replaceState truncates forward history, eliminating\n\t\t\t// phantom entries. Safe to prune their IDs from\n\t\t\t// `seenSyntheticIds` (excluding IDs still in the\n\t\t\t// active stack).\n\t\t\tconst sweptIds = sweepParkedEntries()\n\t\t\tcleanupSeenIds(sweptIds)\n\t\t}\n\n\t\tfunction onPop(): void {\n\t\t\tif (suppressPopCount > 0) {\n\t\t\t\tsuppressPopCount--\n\t\t\t\treturn\n\t\t\t}\n\t\t\trestore()\n\t\t}\n\n\t\twindow.addEventListener(\"popstate\", onPop)\n\n\t\tsuppressPopCount += totalBacks\n\t\tfor (let i = 0; i < totalBacks; i++) {\n\t\t\twindow.history.back()\n\t\t}\n\t}\n\n\t// Use both the router's deterministic \"navigation resolved\" signal\n\t// and a requestAnimationFrame fallback. In the common UI-close case\n\t// (e.g. clicking outside a dropdown) there is no route change, so\n\t// the resolver never fires. Without the fallback the synthetic\n\t// history entry would be left behind as a phantom.\n\tlet disposed = false\n\tlet rafId: number | undefined\n\tlet unsub: (() => void) | undefined\n\n\tfunction run(): void {\n\t\tif (disposed) return\n\t\tdisposed = true\n\t\tunsub?.()\n\t\tif (rafId !== undefined) {\n\t\t\tcancelAnimationFrame(rafId)\n\t\t}\n\t\tcheck()\n\t}\n\n\tif (navigationResolver !== undefined) {\n\t\tunsub = navigationResolver(run)\n\t}\n\n\trafId = requestAnimationFrame(run)\n}\n\n/**\n * Sweeps all parked entries (those with no close callback) from the\n * overlay stack. Called after `replaceState` truncates forward\n * history, since parked entries no longer have corresponding history\n * entries and would cause dead back-presses.\n *\n * @returns The IDs of entries that were removed, used by the caller\n * to prune `seenSyntheticIds`.\n */\nfunction sweepParkedEntries(): readonly number[] {\n\tconst sweptIds: number[] = []\n\tfor (let i = overlayStack.length - 1; i >= 0; i--) {\n\t\tconst entry = overlayStack[i]\n\t\tif (entry !== undefined && entry.close === undefined) {\n\t\t\tsweptIds.push(entry.id)\n\t\t\toverlayStack.splice(i, 1)\n\t\t}\n\t}\n\treturn sweptIds\n}\n\n/**\n * Removes swept IDs from `seenSyntheticIds` to prevent unbounded\n * growth over the lifetime of the SPA session.\n *\n * After `replaceState` truncates forward history, phantom entries\n * for swept parked overlays are eliminated. Their IDs can safely\n * be removed from `seenSyntheticIds` — unless the same ID belongs\n * to an entry still active in the stack (which happens when a\n * lower-ID entry is parked but a higher-ID entry above it is still\n * open and not swept).\n */\nfunction cleanupSeenIds(sweptIds: readonly number[]): void {\n\tconst activeIds = new Set(overlayStack.map((e) => e.id))\n\tfor (const id of sweptIds) {\n\t\tif (!activeIds.has(id)) {\n\t\t\tseenSyntheticIds.delete(id)\n\t\t}\n\t}\n}\n\n/**\n * On mobile (< sm), when an overlay (dialog/sheet/popover) opens we push a\n * synthetic history entry so the device back gesture closes it instead of\n * navigating away from the page.\n *\n * **Closing via UI** calls `history.back()` to navigate past the\n * synthetic entry, then uses `replaceState` (inside the resulting\n * popstate handler) to restore the original history state.\n *\n * **Closing via back gesture** is handled by the popstate listener,\n * which pops the stack entry and calls the close callback.\n *\n * **Closing via route navigation**: the `pushState` interceptor\n * closes all overlays synchronously but does NOT strip the synthetic\n * marker. The React effect's `scheduleStateRestore` waits for the\n * router's navigation-resolved signal (or falls back to\n * `requestAnimationFrame`); by then the router's push has completed\n * and the marker is gone from `history.state`, so `back()` is\n * skipped. The stranded synthetic entry is later auto-skipped by the\n * capture-phase popstate listener when the user navigates past it.\n *\n * Multiple overlays open at once stack: pressing back closes the most\n * recently opened one first, matching the visual stacking order.\n *\n * No-op on non-mobile viewports and when no `onOpenChange` is provided\n * (uncontrolled overlays cannot be closed externally).\n */\nexport function useMobileBackToClose(\n\topen: boolean | undefined,\n\tonOpenChange: ((open: boolean) => void) | undefined,\n): void {\n\tconst idRef = useRef<number | undefined>(undefined)\n\tconst onChangeRef = useRef(onOpenChange)\n\tonChangeRef.current = onOpenChange\n\n\tuseEffect(() => {\n\t\tif (typeof window === \"undefined\") return\n\t\tif (onChangeRef.current === undefined) return\n\t\tif (!isBelowMd()) return\n\t\tensurePopListener()\n\n\t\tif (open === true && idRef.current === undefined) {\n\t\t\tconst id = ++nextOverlayId\n\t\t\tidRef.current = id\n\t\t\tseenSyntheticIds.add(id)\n\t\t\t// Capture the base state BEFORE pushing so we can restore\n\t\t\t// it on close (via replaceState) to eliminate phantoms.\n\t\t\tconst baseState = window.history.state ?? null\n\t\t\twindow.history.pushState(\n\t\t\t\t{\n\t\t\t\t\t...((baseState as Record<string, unknown>) ?? {}),\n\t\t\t\t\t[HISTORY_KEY]: id,\n\t\t\t\t},\n\t\t\t\t\"\",\n\t\t\t)\n\t\t\toverlayStack.push({\n\t\t\t\tid,\n\t\t\t\tbaseState,\n\t\t\t\tclose() {\n\t\t\t\t\tidRef.current = undefined\n\t\t\t\t\tonChangeRef.current?.(false)\n\t\t\t\t},\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tif (open !== true && idRef.current !== undefined) {\n\t\t\tconst id = idRef.current\n\t\t\tidRef.current = undefined\n\t\t\tconst entryIdx = overlayStack.findIndex((e) => e.id === id)\n\t\t\tconst entry = entryIdx !== -1 ? overlayStack[entryIdx] : undefined\n\t\t\tconst { removed, parkedBelow } = removeFromStack(id)\n\t\t\tif (removed && entry !== undefined) {\n\t\t\t\tscheduleStateRestore(id, entry.baseState, parkedBelow)\n\t\t\t}\n\t\t}\n\t}, [open])\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (idRef.current !== undefined) {\n\t\t\t\tconst id = idRef.current\n\t\t\t\tidRef.current = undefined\n\t\t\t\tconst entryIdx = overlayStack.findIndex((e) => e.id === id)\n\t\t\t\tconst entry = entryIdx !== -1 ? overlayStack[entryIdx] : undefined\n\t\t\t\tconst { removed, parkedBelow } = removeFromStack(id)\n\t\t\t\tif (removed && entry !== undefined) {\n\t\t\t\t\tscheduleStateRestore(id, entry.baseState, parkedBelow)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [])\n}\n","import { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@hoardodile/ui/lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg text-ui font-medium whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary px-4! text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background shadow-xs hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n danger:\n \"bg-[color-mix(in_oklab,var(--destructive),black_12%)] text-white hover:bg-[color-mix(in_oklab,var(--destructive),black_4%)] focus-visible:border-destructive/40 focus-visible:ring-destructive/20 disabled:bg-destructive/10 disabled:text-muted-foreground dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-control gap-2 px-3 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-2 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-chip gap-2 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5\",\n lg: \"h-10 gap-2 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-9\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n active,\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props &\n VariantProps<typeof buttonVariants> & {\n /** Latched toggle state: accent fill, hover pinned so an active\n button never shifts. Callers keep choosing the matching aria\n attribute (`aria-pressed` / `aria-expanded`). */\n active?: boolean\n }) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(\n buttonVariants({ variant, size, className }),\n active && \"bg-accent text-accent-foreground hover:bg-accent\"\n )}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { Input as InputPrimitive } from \"@base-ui/react/input\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@hoardodile/ui/lib/utils\"\n\n/**\n * Muted-fill control (the ControlStub / forms anatomy): fill background,\n * `rounded-lg`, no border — the same anatomy as the search field. Three\n * height tiers ride the control tokens: `sm` h-chip, `md` h-control,\n * `lg` h-10.\n */\nconst inputVariants = cva(\n \"w-full min-w-0 rounded-lg bg-muted text-ui text-foreground outline-none placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:ring-[3px] aria-invalid:ring-destructive/20\",\n {\n variants: {\n size: {\n sm: \"h-chip px-2.5 text-xs\",\n md: \"h-control px-3\",\n lg: \"h-10 px-3.5\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\nfunction Input({\n className,\n size,\n type,\n ...props\n}: Omit<React.ComponentProps<\"input\">, \"size\"> &\n VariantProps<typeof inputVariants>) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(inputVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nexport { Input, inputVariants }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@hoardodile/ui/lib/utils\"\nimport { Button } from \"@hoardodile/ui/components/button\"\nimport { Input } from \"@hoardodile/ui/components/input\"\nimport { Textarea } from \"@hoardodile/ui/components/textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-9 w-full min-w-0 items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-2 has-[>button]:-ml-1 has-[>kbd]:ml-[-0.15rem]\",\n \"inline-end\":\n \"order-last pr-2 has-[>button]:-mr-1 has-[>kbd]:mr-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\" | \"type\"> &\n VariantProps<typeof inputGroupButtonVariants> & {\n type?: \"button\" | \"submit\" | \"reset\"\n }) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: Omit<React.ComponentProps<\"input\">, \"size\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none bg-transparent aria-invalid:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none bg-transparent py-2 aria-invalid:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","import { type ComponentType, createElement, useSyncExternalStore } from \"react\"\nimport type { IconType } from \"../components/icon.tsx\"\n\n/**\n * Icon-mode-aware glyph wrapper (Settings → Icons in the host app).\n *\n * The active icon style lives as `data-icon-style` on `document.documentElement`\n * — the host app writes it from its preference store, plugin iframes receive\n * it through the `themeChanged` push — so this module needs no context or\n * injected state: a single shared `MutationObserver` watches the attribute\n * and every wrapped component re-renders through `useSyncExternalStore`\n * when it flips.\n *\n * Only `linear` needs a component swap: the boldDuotone glyphs change to\n * their thin-line linear counterparts. `grayscale` is pure CSS (theme.css\n * recolors the `.hd-icon` hook), so the store only tracks the mode.\n */\nexport type IconStyleValue = \"duotone\" | \"grayscale\" | \"linear\"\n\n/**\n * The parallel Solar weights an icon registers — named after Solar's own\n * weights (DESIGN.md — Iconography). Every icon carries all of them;\n * adding a mode here forces every registry entry to fill it in.\n */\nexport type IconMode = \"bold\" | \"boldDuotone\" | \"linear\"\n\n/** All three mode glyphs of one icon. Mandatory and complete by type. */\nexport type IconVariants = Record<IconMode, IconType>\n\nfunction readIconMode(): IconMode {\n\treturn document.documentElement.dataset.iconStyle === \"linear\"\n\t\t? \"linear\"\n\t\t: \"boldDuotone\"\n}\n\n// Never read `document` at module load — pure-logic consumers (node test\n// environments) import this module without a DOM. The first subscribe\n// (component mount) snapshots the current value.\nlet currentMode: IconMode = \"boldDuotone\"\nlet observer: MutationObserver | undefined\nconst listeners = new Set<() => void>()\n\nfunction ensureObserver(): void {\n\tif (observer !== undefined || typeof document === \"undefined\") return\n\tobserver = new MutationObserver(() => {\n\t\tconst next = readIconMode()\n\t\tif (next === currentMode) return\n\t\tcurrentMode = next\n\t\tfor (const cb of listeners) cb()\n\t})\n\tobserver.observe(document.documentElement, {\n\t\tattributes: true,\n\t\tattributeFilter: [\"data-icon-style\"],\n\t})\n}\n\nfunction subscribeIconStyle(callback: () => void): () => void {\n\tensureObserver()\n\tcurrentMode = readIconMode()\n\tlisteners.add(callback)\n\treturn () => {\n\t\tlisteners.delete(callback)\n\t}\n}\n\nfunction getIconStyleSnapshot(): IconMode {\n\treturn currentMode\n}\n\n/**\n * Wraps a Solar glyph family so its render follows the host's icon style.\n *\n * `createIcon({ bold, boldDuotone, linear })` — the three parallel weights\n * of one icon. Without a `mode` prop the wrapper renders the glyph for the\n * active icon style; an explicit `mode` overrides it (selected states pass\n * `\"bold\"` through `Icon`).\n *\n * Every wrapped render merges the `hd-icon` hook class, so the duotone /\n * grayscale CSS in theme.css applies to direct renders too. Returns\n * `undefined`-free components callable through the `Icon` wrapper or bare\n * JSX alike.\n */\nexport function createIcon(\n\tvariants: IconVariants,\n): ComponentType<Record<string, unknown>> {\n\tfunction Icon(props: Record<string, unknown>) {\n\t\tconst current = useSyncExternalStore(\n\t\t\tsubscribeIconStyle,\n\t\t\tgetIconStyleSnapshot,\n\t\t\t() => \"boldDuotone\",\n\t\t)\n\t\tconst { mode, ...rest } = props as { readonly mode?: IconMode } & Record<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>\n\t\tconst Component = variants[(mode ?? current) as IconMode]\n\t\tconst className =\n\t\t\ttypeof rest.className === \"string\"\n\t\t\t\t? `hd-icon ${rest.className}`\n\t\t\t\t: \"hd-icon\"\n\t\treturn createElement(Component, { ...rest, className })\n\t}\n\treturn Icon\n}\n","/**\n * Central Solar icon registry for the design system.\n *\n * Every Solar glyph the app renders is exported here through `createIcon`\n * from `@hoardodile/ui` — one component per glyph carrying the three\n * parallel Solar weights (bold / boldDuotone / linear). The wrapper picks\n * the glyph for the active icon style preference (Settings → Icons): in\n * `linear` style the boldDuotone glyphs swap to their thin-line linear\n * counterparts; an explicit `mode` prop overrides (`\"bold\"` for selected\n * states). Every export carries the `hd-icon` hook class so the\n * duotone/grayscale CSS in theme.css applies to direct renders too. All\n * exports are wrapped — never the raw glyphs. Importing Solar directly is\n * confined to this file and @hoardodile/ui internals — consumers import\n * the wrapped exports only.\n *\n * Structure — imports first, one block per Solar weight (bold / bold-duotone /\n * linear, alphabetical by glyph; every glyph has all three), then one\n * export section, alphabetical by name (ordinal, case-sensitive —\n * `BookTone`'s stem `Book` sorts before `Bookmark`):\n *\n * export const <Name> = createIcon({\n * bold: <Name>BoldWeight, — filled, single-color; selected states\n * boldDuotone: <Name>BoldDuotone, — two-tone, the default\n * linear: <Name>Linear, — thin-line; `linear` icon style\n * })\n *\n * Modes are parallel and mandatory: adding a member to `IconMode` forces\n * every entry to register it (guarded by icons.test.ts). One exception:\n * `MenuDots` maps its `linear` slot to the filled weight — the thin-line\n * dots read as noise at small sizes. Tree-shaking keeps only the variants\n * actually imported.\n */\n\nimport { AddCircleIcon as AddCircleBoldWeight } from \"@solar-icons/react/bold/add-circle\"\nimport { AlignLeftIcon as AlignLeftBoldWeight } from \"@solar-icons/react/bold/align-left\"\nimport { AltArrowDownIcon as AltArrowDownBoldWeight } from \"@solar-icons/react/bold/alt-arrow-down\"\nimport { AltArrowLeftIcon as AltArrowLeftBoldWeight } from \"@solar-icons/react/bold/alt-arrow-left\"\nimport { AltArrowRightIcon as AltArrowRightBoldWeight } from \"@solar-icons/react/bold/alt-arrow-right\"\nimport { AltArrowUpIcon as AltArrowUpBoldWeight } from \"@solar-icons/react/bold/alt-arrow-up\"\nimport { ArchiveIcon as ArchiveBoldWeight } from \"@solar-icons/react/bold/archive\"\nimport { ArrowRightIcon as ArrowRightBoldWeight } from \"@solar-icons/react/bold/arrow-right\"\nimport { ArrowToTopLeftIcon as ArrowToTopLeftBoldWeight } from \"@solar-icons/react/bold/arrow-to-top-left\"\nimport { ArrowToTopRightIcon as ArrowToTopRightBoldWeight } from \"@solar-icons/react/bold/arrow-to-top-right\"\nimport { BellIcon as BellBoldWeight } from \"@solar-icons/react/bold/bell\"\nimport { BoltIcon as BoltBoldWeight } from \"@solar-icons/react/bold/bolt\"\nimport { BookIcon as BookBoldWeight } from \"@solar-icons/react/bold/book\"\nimport { Book2Icon as Book2BoldWeight } from \"@solar-icons/react/bold/book-2\"\nimport { BookmarkIcon as BookmarkBoldWeight } from \"@solar-icons/react/bold/bookmark\"\nimport { BookmarkCircleIcon as BookmarkCircleBoldWeight } from \"@solar-icons/react/bold/bookmark-circle\"\nimport { BoxIcon as BoxBoldWeight } from \"@solar-icons/react/bold/box\"\nimport { BranchingPathsUpIcon as BranchingPathsUpBoldWeight } from \"@solar-icons/react/bold/branching-paths-up\"\nimport { BugIcon as BugBoldWeight } from \"@solar-icons/react/bold/bug\"\nimport { CalendarDateIcon as CalendarDateBoldWeight } from \"@solar-icons/react/bold/calendar-date\"\nimport { ChatRoundIcon as ChatRoundBoldWeight } from \"@solar-icons/react/bold/chat-round\"\nimport { ChatRoundDotsIcon as ChatRoundDotsBoldWeight } from \"@solar-icons/react/bold/chat-round-dots\"\nimport { ChatRoundLineIcon as ChatRoundLineBoldWeight } from \"@solar-icons/react/bold/chat-round-line\"\nimport { ChatSquareIcon as ChatSquareBoldWeight } from \"@solar-icons/react/bold/chat-square\"\nimport { CheckCircleIcon as CheckCircleBoldWeight } from \"@solar-icons/react/bold/check-circle\"\nimport { ChecklistIcon as ChecklistBoldWeight } from \"@solar-icons/react/bold/checklist\"\nimport { ClipboardListIcon as ClipboardListBoldWeight } from \"@solar-icons/react/bold/clipboard-list\"\nimport { ClockCircleIcon as ClockCircleBoldWeight } from \"@solar-icons/react/bold/clock-circle\"\nimport { CompassIcon as CompassBoldWeight } from \"@solar-icons/react/bold/compass\"\nimport { CopyIcon as CopyBoldWeight } from \"@solar-icons/react/bold/copy\"\nimport { CrownIcon as CrownBoldWeight } from \"@solar-icons/react/bold/crown\"\nimport { DangerTriangleIcon as DangerTriangleBoldWeight } from \"@solar-icons/react/bold/danger-triangle\"\nimport { DatabaseIcon as DatabaseBoldWeight } from \"@solar-icons/react/bold/database\"\nimport { DisketteIcon as DisketteBoldWeight } from \"@solar-icons/react/bold/diskette\"\nimport { DislikeIcon as DislikeBoldWeight } from \"@solar-icons/react/bold/dislike\"\nimport { DocumentAddIcon as DocumentAddBoldWeight } from \"@solar-icons/react/bold/document-add\"\nimport { DocumentTextIcon as DocumentTextBoldWeight } from \"@solar-icons/react/bold/document-text\"\nimport { DoubleAltArrowDownIcon as DoubleAltArrowDownBoldWeight } from \"@solar-icons/react/bold/double-alt-arrow-down\"\nimport { DownloadIcon as DownloadBoldWeight } from \"@solar-icons/react/bold/download\"\nimport { EraserIcon as EraserBoldWeight } from \"@solar-icons/react/bold/eraser\"\nimport { EyeIcon as EyeBoldWeight } from \"@solar-icons/react/bold/eye\"\nimport { FileIcon as FileBoldWeight } from \"@solar-icons/react/bold/file\"\nimport { FileRemoveIcon as FileRemoveBoldWeight } from \"@solar-icons/react/bold/file-remove\"\nimport { FileTextIcon as FileTextBoldWeight } from \"@solar-icons/react/bold/file-text\"\nimport { FilterIcon as FilterBoldWeight } from \"@solar-icons/react/bold/filter\"\nimport { FiltersIcon as FiltersBoldWeight } from \"@solar-icons/react/bold/filters\"\nimport { FolderIcon as FolderBoldWeight } from \"@solar-icons/react/bold/folder\"\nimport { FolderOpenIcon as FolderOpenBoldWeight } from \"@solar-icons/react/bold/folder-open\"\nimport { FolderPathConnectIcon as FolderPathConnectBoldWeight } from \"@solar-icons/react/bold/folder-path-connect\"\nimport { ForbiddenCircleIcon as ForbiddenCircleBoldWeight } from \"@solar-icons/react/bold/forbidden-circle\"\nimport { GalleryIcon as GalleryBoldWeight } from \"@solar-icons/react/bold/gallery\"\nimport { GalleryAddIcon as GalleryAddBoldWeight } from \"@solar-icons/react/bold/gallery-add\"\nimport { GalleryWideIcon as GalleryWideBoldWeight } from \"@solar-icons/react/bold/gallery-wide\"\nimport { GlobalIcon as GlobalBoldWeight } from \"@solar-icons/react/bold/global\"\nimport { GraphDownIcon as GraphDownBoldWeight } from \"@solar-icons/react/bold/graph-down\"\nimport { GraphUpIcon as GraphUpBoldWeight } from \"@solar-icons/react/bold/graph-up\"\nimport { HamburgerMenuIcon as HamburgerMenuBoldWeight } from \"@solar-icons/react/bold/hamburger-menu\"\nimport { HandHeartIcon as HandHeartBoldWeight } from \"@solar-icons/react/bold/hand-heart\"\nimport { HeartIcon as HeartBoldWeight } from \"@solar-icons/react/bold/heart\"\nimport { HelpIcon as HelpBoldWeight } from \"@solar-icons/react/bold/help\"\nimport { HistoryIcon as HistoryBoldWeight } from \"@solar-icons/react/bold/history\"\nimport { HomeAngleIcon as HomeAngleBoldWeight } from \"@solar-icons/react/bold/home-angle\"\nimport { InfoCircleIcon as InfoCircleBoldWeight } from \"@solar-icons/react/bold/info-circle\"\nimport { LayersIcon as LayersBoldWeight } from \"@solar-icons/react/bold/layers\"\nimport { LetterIcon as LetterBoldWeight } from \"@solar-icons/react/bold/letter\"\nimport { LikeIcon as LikeBoldWeight } from \"@solar-icons/react/bold/like\"\nimport { LinkIcon as LinkBoldWeight } from \"@solar-icons/react/bold/link\"\nimport { ListIcon as ListBoldWeight } from \"@solar-icons/react/bold/list\"\nimport { ListVerticalIcon as ListVerticalBoldWeight } from \"@solar-icons/react/bold/list-vertical\"\nimport { LockPasswordIcon as LockPasswordBoldWeight } from \"@solar-icons/react/bold/lock-password\"\nimport { Login2Icon as Login2BoldWeight } from \"@solar-icons/react/bold/login-2\"\nimport { LogoutIcon as LogoutBoldWeight } from \"@solar-icons/react/bold/logout\"\nimport { MagicWand2Icon as MagicWand2BoldWeight } from \"@solar-icons/react/bold/magic-wand-2\"\nimport { MagnifierIcon as MagnifierBoldWeight } from \"@solar-icons/react/bold/magnifier\"\nimport { MagnifierZoomInIcon as MagnifierZoomInBoldWeight } from \"@solar-icons/react/bold/magnifier-zoom-in\"\nimport { MagnifierZoomOutIcon as MagnifierZoomOutBoldWeight } from \"@solar-icons/react/bold/magnifier-zoom-out\"\nimport { MaximizeIcon as MaximizeBoldWeight } from \"@solar-icons/react/bold/maximize\"\nimport { MenuDotsIcon as MenuDotsBoldWeight } from \"@solar-icons/react/bold/menu-dots\"\nimport { MinimizeIcon as MinimizeBoldWeight } from \"@solar-icons/react/bold/minimize\"\nimport { MinusSquareIcon as MinusSquareBoldWeight } from \"@solar-icons/react/bold/minus-square\"\nimport { MonitorIcon as MonitorBoldWeight } from \"@solar-icons/react/bold/monitor\"\nimport { MonitorSmartphoneIcon as MonitorSmartphoneBoldWeight } from \"@solar-icons/react/bold/monitor-smartphone\"\nimport { MoonIcon as MoonBoldWeight } from \"@solar-icons/react/bold/moon\"\nimport { MoveToFolderIcon as MoveToFolderBoldWeight } from \"@solar-icons/react/bold/move-to-folder\"\nimport { MusicNotesIcon as MusicNotesBoldWeight } from \"@solar-icons/react/bold/music-notes\"\nimport { PaletteIcon as PaletteBoldWeight } from \"@solar-icons/react/bold/palette\"\nimport { PaletteRoundIcon as PaletteRoundBoldWeight } from \"@solar-icons/react/bold/palette-round\"\nimport { PauseIcon as PauseBoldWeight } from \"@solar-icons/react/bold/pause\"\nimport { PenIcon as PenBoldWeight } from \"@solar-icons/react/bold/pen\"\nimport { PenNewRoundIcon as PenNewRoundBoldWeight } from \"@solar-icons/react/bold/pen-new-round\"\nimport { PieChartIcon as PieChartBoldWeight } from \"@solar-icons/react/bold/pie-chart\"\nimport { PinIcon as PinBoldWeight } from \"@solar-icons/react/bold/pin\"\nimport { PlayIcon as PlayBoldWeight } from \"@solar-icons/react/bold/play\"\nimport { PlugCircleIcon as PlugCircleBoldWeight } from \"@solar-icons/react/bold/plug-circle\"\nimport { PlusMinusIcon as PlusMinusBoldWeight } from \"@solar-icons/react/bold/plus-minus\"\nimport { PulseIcon as PulseBoldWeight } from \"@solar-icons/react/bold/pulse\"\nimport { RefreshIcon as RefreshBoldWeight } from \"@solar-icons/react/bold/refresh\"\nimport { RefreshCircleIcon as RefreshCircleBoldWeight } from \"@solar-icons/react/bold/refresh-circle\"\nimport { ReorderIcon as ReorderBoldWeight } from \"@solar-icons/react/bold/reorder\"\nimport { RepeatIcon as RepeatBoldWeight } from \"@solar-icons/react/bold/repeat\"\nimport { ReplyIcon as ReplyBoldWeight } from \"@solar-icons/react/bold/reply\"\nimport { RestartIcon as RestartBoldWeight } from \"@solar-icons/react/bold/restart\"\nimport { RocketIcon as RocketBoldWeight } from \"@solar-icons/react/bold/rocket\"\nimport { RouteIcon as RouteBoldWeight } from \"@solar-icons/react/bold/route\"\nimport { ScaleIcon as ScaleBoldWeight } from \"@solar-icons/react/bold/scale\"\nimport { ServerIcon as ServerBoldWeight } from \"@solar-icons/react/bold/server\"\nimport { SettingsIcon as SettingsBoldWeight } from \"@solar-icons/react/bold/settings\"\nimport { ShareIcon as ShareBoldWeight } from \"@solar-icons/react/bold/share\"\nimport { ShieldCheckIcon as ShieldCheckBoldWeight } from \"@solar-icons/react/bold/shield-check\"\nimport { Shop2Icon as Shop2BoldWeight } from \"@solar-icons/react/bold/shop-2\"\nimport { SidebarMinimalisticIcon as SidebarMinimalisticBoldWeight } from \"@solar-icons/react/bold/sidebar-minimalistic\"\nimport { SliderHorizontalIcon as SliderHorizontalBoldWeight } from \"@solar-icons/react/bold/slider-horizontal\"\nimport { SmartphoneIcon as SmartphoneBoldWeight } from \"@solar-icons/react/bold/smartphone\"\nimport { SortIcon as SortBoldWeight } from \"@solar-icons/react/bold/sort\"\nimport { SortByTimeIcon as SortByTimeBoldWeight } from \"@solar-icons/react/bold/sort-by-time\"\nimport { SortHorizontalIcon as SortHorizontalBoldWeight } from \"@solar-icons/react/bold/sort-horizontal\"\nimport { SortVerticalIcon as SortVerticalBoldWeight } from \"@solar-icons/react/bold/sort-vertical\"\nimport { StarIcon as StarBoldWeight } from \"@solar-icons/react/bold/star\"\nimport { StructureIcon as StructureBoldWeight } from \"@solar-icons/react/bold/structure\"\nimport { SunIcon as SunBoldWeight } from \"@solar-icons/react/bold/sun\"\nimport { TagIcon as TagBoldWeight } from \"@solar-icons/react/bold/tag\"\nimport { TelescopeIcon as TelescopeBoldWeight } from \"@solar-icons/react/bold/telescope\"\nimport { TestTubeIcon as TestTubeBoldWeight } from \"@solar-icons/react/bold/test-tube\"\nimport { TextFormatIcon as TextFormatBoldWeight } from \"@solar-icons/react/bold/text-format\"\nimport { TransferHorizontalIcon as TransferHorizontalBoldWeight } from \"@solar-icons/react/bold/transfer-horizontal\"\nimport { TranslationIcon as TranslationBoldWeight } from \"@solar-icons/react/bold/translation\"\nimport { TrashBinMinimalisticIcon as TrashBinMinimalisticBoldWeight } from \"@solar-icons/react/bold/trash-bin-minimalistic\"\nimport { UndoLeftIcon as UndoLeftBoldWeight } from \"@solar-icons/react/bold/undo-left\"\nimport { UndoLeftRoundIcon as UndoLeftRoundBoldWeight } from \"@solar-icons/react/bold/undo-left-round\"\nimport { UndoRightIcon as UndoRightBoldWeight } from \"@solar-icons/react/bold/undo-right\"\nimport { UndoRightRoundIcon as UndoRightRoundBoldWeight } from \"@solar-icons/react/bold/undo-right-round\"\nimport { UploadIcon as UploadBoldWeight } from \"@solar-icons/react/bold/upload\"\nimport { UserIcon as UserBoldWeight } from \"@solar-icons/react/bold/user\"\nimport { UserIdIcon as UserIdBoldWeight } from \"@solar-icons/react/bold/user-id\"\nimport { UserMinusIcon as UserMinusBoldWeight } from \"@solar-icons/react/bold/user-minus\"\nimport { UserPlusIcon as UserPlusBoldWeight } from \"@solar-icons/react/bold/user-plus\"\nimport { UsersGroupRoundedIcon as UsersGroupRoundedBoldWeight } from \"@solar-icons/react/bold/users-group-rounded\"\nimport { UsersGroupTwoRoundedIcon as UsersGroupTwoRoundedBoldWeight } from \"@solar-icons/react/bold/users-group-two-rounded\"\nimport { VideoFrameIcon as VideoFrameBoldWeight } from \"@solar-icons/react/bold/video-frame\"\nimport { Widget2Icon as Widget2BoldWeight } from \"@solar-icons/react/bold/widget-2\"\nimport { Widget5Icon as Widget5BoldWeight } from \"@solar-icons/react/bold/widget-5\"\nimport { WindowFrameIcon as WindowFrameBoldWeight } from \"@solar-icons/react/bold/window-frame\"\nimport { AddCircleIcon as AddCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/add-circle\"\nimport { AlignLeftIcon as AlignLeftBoldDuotone } from \"@solar-icons/react/bold-duotone/align-left\"\nimport { AltArrowDownIcon as AltArrowDownBoldDuotone } from \"@solar-icons/react/bold-duotone/alt-arrow-down\"\nimport { AltArrowLeftIcon as AltArrowLeftBoldDuotone } from \"@solar-icons/react/bold-duotone/alt-arrow-left\"\nimport { AltArrowRightIcon as AltArrowRightBoldDuotone } from \"@solar-icons/react/bold-duotone/alt-arrow-right\"\nimport { AltArrowUpIcon as AltArrowUpBoldDuotone } from \"@solar-icons/react/bold-duotone/alt-arrow-up\"\nimport { ArchiveIcon as ArchiveBoldDuotone } from \"@solar-icons/react/bold-duotone/archive\"\nimport { ArrowRightIcon as ArrowRightBoldDuotone } from \"@solar-icons/react/bold-duotone/arrow-right\"\nimport { ArrowToTopLeftIcon as ArrowToTopLeftBoldDuotone } from \"@solar-icons/react/bold-duotone/arrow-to-top-left\"\nimport { ArrowToTopRightIcon as ArrowToTopRightBoldDuotone } from \"@solar-icons/react/bold-duotone/arrow-to-top-right\"\nimport { BellIcon as BellBoldDuotone } from \"@solar-icons/react/bold-duotone/bell\"\nimport { BoltIcon as BoltBoldDuotone } from \"@solar-icons/react/bold-duotone/bolt\"\nimport { BookIcon as BookBoldDuotone } from \"@solar-icons/react/bold-duotone/book\"\nimport { Book2Icon as Book2BoldDuotone } from \"@solar-icons/react/bold-duotone/book-2\"\nimport { BookmarkIcon as BookmarkBoldDuotone } from \"@solar-icons/react/bold-duotone/bookmark\"\nimport { BookmarkCircleIcon as BookmarkCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/bookmark-circle\"\nimport { BoxIcon as BoxBoldDuotone } from \"@solar-icons/react/bold-duotone/box\"\nimport { BranchingPathsUpIcon as BranchingPathsUpBoldDuotone } from \"@solar-icons/react/bold-duotone/branching-paths-up\"\nimport { BugIcon as BugBoldDuotone } from \"@solar-icons/react/bold-duotone/bug\"\nimport { CalendarDateIcon as CalendarDateBoldDuotone } from \"@solar-icons/react/bold-duotone/calendar-date\"\nimport { ChatRoundIcon as ChatRoundBoldDuotone } from \"@solar-icons/react/bold-duotone/chat-round\"\nimport { ChatRoundDotsIcon as ChatRoundDotsBoldDuotone } from \"@solar-icons/react/bold-duotone/chat-round-dots\"\nimport { ChatRoundLineIcon as ChatRoundLineBoldDuotone } from \"@solar-icons/react/bold-duotone/chat-round-line\"\nimport { ChatSquareIcon as ChatSquareBoldDuotone } from \"@solar-icons/react/bold-duotone/chat-square\"\nimport { CheckCircleIcon as CheckCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/check-circle\"\nimport { ChecklistIcon as ChecklistBoldDuotone } from \"@solar-icons/react/bold-duotone/checklist\"\nimport { ClipboardListIcon as ClipboardListBoldDuotone } from \"@solar-icons/react/bold-duotone/clipboard-list\"\nimport { ClockCircleIcon as ClockCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/clock-circle\"\nimport { CompassIcon as CompassBoldDuotone } from \"@solar-icons/react/bold-duotone/compass\"\nimport { CopyIcon as CopyBoldDuotone } from \"@solar-icons/react/bold-duotone/copy\"\nimport { CrownIcon as CrownBoldDuotone } from \"@solar-icons/react/bold-duotone/crown\"\nimport { DangerTriangleIcon as DangerTriangleBoldDuotone } from \"@solar-icons/react/bold-duotone/danger-triangle\"\nimport { DatabaseIcon as DatabaseBoldDuotone } from \"@solar-icons/react/bold-duotone/database\"\nimport { DisketteIcon as DisketteBoldDuotone } from \"@solar-icons/react/bold-duotone/diskette\"\nimport { DislikeIcon as DislikeBoldDuotone } from \"@solar-icons/react/bold-duotone/dislike\"\nimport { DocumentAddIcon as DocumentAddBoldDuotone } from \"@solar-icons/react/bold-duotone/document-add\"\nimport { DocumentTextIcon as DocumentTextBoldDuotone } from \"@solar-icons/react/bold-duotone/document-text\"\nimport { DoubleAltArrowDownIcon as DoubleAltArrowDownBoldDuotone } from \"@solar-icons/react/bold-duotone/double-alt-arrow-down\"\nimport { DownloadIcon as DownloadBoldDuotone } from \"@solar-icons/react/bold-duotone/download\"\nimport { EraserIcon as EraserBoldDuotone } from \"@solar-icons/react/bold-duotone/eraser\"\nimport { EyeIcon as EyeBoldDuotone } from \"@solar-icons/react/bold-duotone/eye\"\nimport { FileIcon as FileBoldDuotone } from \"@solar-icons/react/bold-duotone/file\"\nimport { FileRemoveIcon as FileRemoveBoldDuotone } from \"@solar-icons/react/bold-duotone/file-remove\"\nimport { FileTextIcon as FileTextBoldDuotone } from \"@solar-icons/react/bold-duotone/file-text\"\nimport { FilterIcon as FilterBoldDuotone } from \"@solar-icons/react/bold-duotone/filter\"\nimport { FiltersIcon as FiltersBoldDuotone } from \"@solar-icons/react/bold-duotone/filters\"\nimport { FolderIcon as FolderBoldDuotone } from \"@solar-icons/react/bold-duotone/folder\"\nimport { FolderOpenIcon as FolderOpenBoldDuotone } from \"@solar-icons/react/bold-duotone/folder-open\"\nimport { FolderPathConnectIcon as FolderPathConnectBoldDuotone } from \"@solar-icons/react/bold-duotone/folder-path-connect\"\nimport { ForbiddenCircleIcon as ForbiddenCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/forbidden-circle\"\nimport { GalleryIcon as GalleryBoldDuotone } from \"@solar-icons/react/bold-duotone/gallery\"\nimport { GalleryAddIcon as GalleryAddBoldDuotone } from \"@solar-icons/react/bold-duotone/gallery-add\"\nimport { GalleryWideIcon as GalleryWideBoldDuotone } from \"@solar-icons/react/bold-duotone/gallery-wide\"\nimport { GlobalIcon as GlobalBoldDuotone } from \"@solar-icons/react/bold-duotone/global\"\nimport { GraphDownIcon as GraphDownBoldDuotone } from \"@solar-icons/react/bold-duotone/graph-down\"\nimport { GraphUpIcon as GraphUpBoldDuotone } from \"@solar-icons/react/bold-duotone/graph-up\"\nimport { HamburgerMenuIcon as HamburgerMenuBoldDuotone } from \"@solar-icons/react/bold-duotone/hamburger-menu\"\nimport { HandHeartIcon as HandHeartBoldDuotone } from \"@solar-icons/react/bold-duotone/hand-heart\"\nimport { HeartIcon as HeartBoldDuotone } from \"@solar-icons/react/bold-duotone/heart\"\nimport { HelpIcon as HelpBoldDuotone } from \"@solar-icons/react/bold-duotone/help\"\nimport { HistoryIcon as HistoryBoldDuotone } from \"@solar-icons/react/bold-duotone/history\"\nimport { HomeAngleIcon as HomeAngleBoldDuotone } from \"@solar-icons/react/bold-duotone/home-angle\"\nimport { InfoCircleIcon as InfoCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/info-circle\"\nimport { LayersIcon as LayersBoldDuotone } from \"@solar-icons/react/bold-duotone/layers\"\nimport { LetterIcon as LetterBoldDuotone } from \"@solar-icons/react/bold-duotone/letter\"\nimport { LikeIcon as LikeBoldDuotone } from \"@solar-icons/react/bold-duotone/like\"\nimport { LinkIcon as LinkBoldDuotone } from \"@solar-icons/react/bold-duotone/link\"\nimport { ListIcon as ListBoldDuotone } from \"@solar-icons/react/bold-duotone/list\"\nimport { ListVerticalIcon as ListVerticalBoldDuotone } from \"@solar-icons/react/bold-duotone/list-vertical\"\nimport { LockPasswordIcon as LockPasswordBoldDuotone } from \"@solar-icons/react/bold-duotone/lock-password\"\nimport { Login2Icon as Login2BoldDuotone } from \"@solar-icons/react/bold-duotone/login-2\"\nimport { LogoutIcon as LogoutBoldDuotone } from \"@solar-icons/react/bold-duotone/logout\"\nimport { MagicWand2Icon as MagicWand2BoldDuotone } from \"@solar-icons/react/bold-duotone/magic-wand-2\"\nimport { MagnifierIcon as MagnifierBoldDuotone } from \"@solar-icons/react/bold-duotone/magnifier\"\nimport { MagnifierZoomInIcon as MagnifierZoomInBoldDuotone } from \"@solar-icons/react/bold-duotone/magnifier-zoom-in\"\nimport { MagnifierZoomOutIcon as MagnifierZoomOutBoldDuotone } from \"@solar-icons/react/bold-duotone/magnifier-zoom-out\"\nimport { MaximizeIcon as MaximizeBoldDuotone } from \"@solar-icons/react/bold-duotone/maximize\"\nimport { MenuDotsIcon as MenuDotsBoldDuotone } from \"@solar-icons/react/bold-duotone/menu-dots\"\nimport { MinimizeIcon as MinimizeBoldDuotone } from \"@solar-icons/react/bold-duotone/minimize\"\nimport { MinusSquareIcon as MinusSquareBoldDuotone } from \"@solar-icons/react/bold-duotone/minus-square\"\nimport { MonitorIcon as MonitorBoldDuotone } from \"@solar-icons/react/bold-duotone/monitor\"\nimport { MonitorSmartphoneIcon as MonitorSmartphoneBoldDuotone } from \"@solar-icons/react/bold-duotone/monitor-smartphone\"\nimport { MoonIcon as MoonBoldDuotone } from \"@solar-icons/react/bold-duotone/moon\"\nimport { MoveToFolderIcon as MoveToFolderBoldDuotone } from \"@solar-icons/react/bold-duotone/move-to-folder\"\nimport { MusicNotesIcon as MusicNotesBoldDuotone } from \"@solar-icons/react/bold-duotone/music-notes\"\nimport { PaletteIcon as PaletteBoldDuotone } from \"@solar-icons/react/bold-duotone/palette\"\nimport { PaletteRoundIcon as PaletteRoundBoldDuotone } from \"@solar-icons/react/bold-duotone/palette-round\"\nimport { PauseIcon as PauseBoldDuotone } from \"@solar-icons/react/bold-duotone/pause\"\nimport { PenIcon as PenBoldDuotone } from \"@solar-icons/react/bold-duotone/pen\"\nimport { PenNewRoundIcon as PenNewRoundBoldDuotone } from \"@solar-icons/react/bold-duotone/pen-new-round\"\nimport { PieChartIcon as PieChartBoldDuotone } from \"@solar-icons/react/bold-duotone/pie-chart\"\nimport { PinIcon as PinBoldDuotone } from \"@solar-icons/react/bold-duotone/pin\"\nimport { PlayIcon as PlayBoldDuotone } from \"@solar-icons/react/bold-duotone/play\"\nimport { PlugCircleIcon as PlugCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/plug-circle\"\nimport { PlusMinusIcon as PlusMinusBoldDuotone } from \"@solar-icons/react/bold-duotone/plus-minus\"\nimport { PulseIcon as PulseBoldDuotone } from \"@solar-icons/react/bold-duotone/pulse\"\nimport { RefreshIcon as RefreshBoldDuotone } from \"@solar-icons/react/bold-duotone/refresh\"\nimport { RefreshCircleIcon as RefreshCircleBoldDuotone } from \"@solar-icons/react/bold-duotone/refresh-circle\"\nimport { ReorderIcon as ReorderBoldDuotone } from \"@solar-icons/react/bold-duotone/reorder\"\nimport { RepeatIcon as RepeatBoldDuotone } from \"@solar-icons/react/bold-duotone/repeat\"\nimport { ReplyIcon as ReplyBoldDuotone } from \"@solar-icons/react/bold-duotone/reply\"\nimport { RestartIcon as RestartBoldDuotone } from \"@solar-icons/react/bold-duotone/restart\"\nimport { RocketIcon as RocketBoldDuotone } from \"@solar-icons/react/bold-duotone/rocket\"\nimport { RouteIcon as RouteBoldDuotone } from \"@solar-icons/react/bold-duotone/route\"\nimport { ScaleIcon as ScaleBoldDuotone } from \"@solar-icons/react/bold-duotone/scale\"\nimport { ServerIcon as ServerBoldDuotone } from \"@solar-icons/react/bold-duotone/server\"\nimport { SettingsIcon as SettingsBoldDuotone } from \"@solar-icons/react/bold-duotone/settings\"\nimport { ShareIcon as ShareBoldDuotone } from \"@solar-icons/react/bold-duotone/share\"\nimport { ShieldCheckIcon as ShieldCheckBoldDuotone } from \"@solar-icons/react/bold-duotone/shield-check\"\nimport { Shop2Icon as Shop2BoldDuotone } from \"@solar-icons/react/bold-duotone/shop-2\"\nimport { SidebarMinimalisticIcon as SidebarMinimalisticBoldDuotone } from \"@solar-icons/react/bold-duotone/sidebar-minimalistic\"\nimport { SliderHorizontalIcon as SliderHorizontalBoldDuotone } from \"@solar-icons/react/bold-duotone/slider-horizontal\"\nimport { SmartphoneIcon as SmartphoneBoldDuotone } from \"@solar-icons/react/bold-duotone/smartphone\"\nimport { SortIcon as SortBoldDuotone } from \"@solar-icons/react/bold-duotone/sort\"\nimport { SortByTimeIcon as SortByTimeBoldDuotone } from \"@solar-icons/react/bold-duotone/sort-by-time\"\nimport { SortHorizontalIcon as SortHorizontalBoldDuotone } from \"@solar-icons/react/bold-duotone/sort-horizontal\"\nimport { SortVerticalIcon as SortVerticalBoldDuotone } from \"@solar-icons/react/bold-duotone/sort-vertical\"\nimport { StarIcon as StarBoldDuotone } from \"@solar-icons/react/bold-duotone/star\"\nimport { StructureIcon as StructureBoldDuotone } from \"@solar-icons/react/bold-duotone/structure\"\nimport { SunIcon as SunBoldDuotone } from \"@solar-icons/react/bold-duotone/sun\"\nimport { TagIcon as TagBoldDuotone } from \"@solar-icons/react/bold-duotone/tag\"\nimport { TelescopeIcon as TelescopeBoldDuotone } from \"@solar-icons/react/bold-duotone/telescope\"\nimport { TestTubeIcon as TestTubeBoldDuotone } from \"@solar-icons/react/bold-duotone/test-tube\"\nimport { TextFormatIcon as TextFormatBoldDuotone } from \"@solar-icons/react/bold-duotone/text-format\"\nimport { TransferHorizontalIcon as TransferHorizontalBoldDuotone } from \"@solar-icons/react/bold-duotone/transfer-horizontal\"\nimport { TranslationIcon as TranslationBoldDuotone } from \"@solar-icons/react/bold-duotone/translation\"\nimport { TrashBinMinimalisticIcon as TrashBinMinimalisticBoldDuotone } from \"@solar-icons/react/bold-duotone/trash-bin-minimalistic\"\nimport { UndoLeftIcon as UndoLeftBoldDuotone } from \"@solar-icons/react/bold-duotone/undo-left\"\nimport { UndoLeftRoundIcon as UndoLeftRoundBoldDuotone } from \"@solar-icons/react/bold-duotone/undo-left-round\"\nimport { UndoRightIcon as UndoRightBoldDuotone } from \"@solar-icons/react/bold-duotone/undo-right\"\nimport { UndoRightRoundIcon as UndoRightRoundBoldDuotone } from \"@solar-icons/react/bold-duotone/undo-right-round\"\nimport { UploadIcon as UploadBoldDuotone } from \"@solar-icons/react/bold-duotone/upload\"\nimport { UserIcon as UserBoldDuotone } from \"@solar-icons/react/bold-duotone/user\"\nimport { UserIdIcon as UserIdBoldDuotone } from \"@solar-icons/react/bold-duotone/user-id\"\nimport { UserMinusIcon as UserMinusBoldDuotone } from \"@solar-icons/react/bold-duotone/user-minus\"\nimport { UserPlusIcon as UserPlusBoldDuotone } from \"@solar-icons/react/bold-duotone/user-plus\"\nimport { UsersGroupRoundedIcon as UsersGroupRoundedBoldDuotone } from \"@solar-icons/react/bold-duotone/users-group-rounded\"\nimport { UsersGroupTwoRoundedIcon as UsersGroupTwoRoundedBoldDuotone } from \"@solar-icons/react/bold-duotone/users-group-two-rounded\"\nimport { VideoFrameIcon as VideoFrameBoldDuotone } from \"@solar-icons/react/bold-duotone/video-frame\"\nimport { Widget2Icon as Widget2BoldDuotone } from \"@solar-icons/react/bold-duotone/widget-2\"\nimport { Widget5Icon as Widget5BoldDuotone } from \"@solar-icons/react/bold-duotone/widget-5\"\nimport { WindowFrameIcon as WindowFrameBoldDuotone } from \"@solar-icons/react/bold-duotone/window-frame\"\nimport { AddCircleIcon as AddCircleLinear } from \"@solar-icons/react/linear/add-circle\"\nimport { AlignLeftIcon as AlignLeftLinear } from \"@solar-icons/react/linear/align-left\"\nimport { AltArrowDownIcon as AltArrowDownLinear } from \"@solar-icons/react/linear/alt-arrow-down\"\nimport { AltArrowLeftIcon as AltArrowLeftLinear } from \"@solar-icons/react/linear/alt-arrow-left\"\nimport { AltArrowRightIcon as AltArrowRightLinear } from \"@solar-icons/react/linear/alt-arrow-right\"\nimport { AltArrowUpIcon as AltArrowUpLinear } from \"@solar-icons/react/linear/alt-arrow-up\"\nimport { ArchiveIcon as ArchiveLinear } from \"@solar-icons/react/linear/archive\"\nimport { ArrowRightIcon as ArrowRightLinear } from \"@solar-icons/react/linear/arrow-right\"\nimport { ArrowToTopLeftIcon as ArrowToTopLeftLinear } from \"@solar-icons/react/linear/arrow-to-top-left\"\nimport { ArrowToTopRightIcon as ArrowToTopRightLinear } from \"@solar-icons/react/linear/arrow-to-top-right\"\nimport { BellIcon as BellLinear } from \"@solar-icons/react/linear/bell\"\nimport { BoltIcon as BoltLinear } from \"@solar-icons/react/linear/bolt\"\nimport { BookIcon as BookLinear } from \"@solar-icons/react/linear/book\"\nimport { Book2Icon as Book2Linear } from \"@solar-icons/react/linear/book-2\"\nimport { BookmarkIcon as BookmarkLinear } from \"@solar-icons/react/linear/bookmark\"\nimport { BookmarkCircleIcon as BookmarkCircleLinear } from \"@solar-icons/react/linear/bookmark-circle\"\nimport { BoxIcon as BoxLinear } from \"@solar-icons/react/linear/box\"\nimport { BranchingPathsUpIcon as BranchingPathsUpLinear } from \"@solar-icons/react/linear/branching-paths-up\"\nimport { BugIcon as BugLinear } from \"@solar-icons/react/linear/bug\"\nimport { CalendarDateIcon as CalendarDateLinear } from \"@solar-icons/react/linear/calendar-date\"\nimport { ChatRoundIcon as ChatRoundLinear } from \"@solar-icons/react/linear/chat-round\"\nimport { ChatRoundDotsIcon as ChatRoundDotsLinear } from \"@solar-icons/react/linear/chat-round-dots\"\nimport { ChatRoundLineIcon as ChatRoundLineLinear } from \"@solar-icons/react/linear/chat-round-line\"\nimport { ChatSquareIcon as ChatSquareLinear } from \"@solar-icons/react/linear/chat-square\"\nimport { CheckCircleIcon as CheckCircleLinear } from \"@solar-icons/react/linear/check-circle\"\nimport { ChecklistIcon as ChecklistLinear } from \"@solar-icons/react/linear/checklist\"\nimport { ClipboardListIcon as ClipboardListLinear } from \"@solar-icons/react/linear/clipboard-list\"\nimport { ClockCircleIcon as ClockCircleLinear } from \"@solar-icons/react/linear/clock-circle\"\nimport { CompassIcon as CompassLinear } from \"@solar-icons/react/linear/compass\"\nimport { CopyIcon as CopyLinear } from \"@solar-icons/react/linear/copy\"\nimport { CrownIcon as CrownLinear } from \"@solar-icons/react/linear/crown\"\nimport { DangerTriangleIcon as DangerTriangleLinear } from \"@solar-icons/react/linear/danger-triangle\"\nimport { DatabaseIcon as DatabaseLinear } from \"@solar-icons/react/linear/database\"\nimport { DisketteIcon as DisketteLinear } from \"@solar-icons/react/linear/diskette\"\nimport { DislikeIcon as DislikeLinear } from \"@solar-icons/react/linear/dislike\"\nimport { DocumentAddIcon as DocumentAddLinear } from \"@solar-icons/react/linear/document-add\"\nimport { DocumentTextIcon as DocumentTextLinear } from \"@solar-icons/react/linear/document-text\"\nimport { DoubleAltArrowDownIcon as DoubleAltArrowDownLinear } from \"@solar-icons/react/linear/double-alt-arrow-down\"\nimport { DownloadIcon as DownloadLinear } from \"@solar-icons/react/linear/download\"\nimport { EraserIcon as EraserLinear } from \"@solar-icons/react/linear/eraser\"\nimport { EyeIcon as EyeLinear } from \"@solar-icons/react/linear/eye\"\nimport { FileIcon as FileLinear } from \"@solar-icons/react/linear/file\"\nimport { FileRemoveIcon as FileRemoveLinear } from \"@solar-icons/react/linear/file-remove\"\nimport { FileTextIcon as FileTextLinear } from \"@solar-icons/react/linear/file-text\"\nimport { FilterIcon as FilterLinear } from \"@solar-icons/react/linear/filter\"\nimport { FiltersIcon as FiltersLinear } from \"@solar-icons/react/linear/filters\"\nimport { FolderIcon as FolderLinear } from \"@solar-icons/react/linear/folder\"\nimport { FolderOpenIcon as FolderOpenLinear } from \"@solar-icons/react/linear/folder-open\"\nimport { FolderPathConnectIcon as FolderPathConnectLinear } from \"@solar-icons/react/linear/folder-path-connect\"\nimport { ForbiddenCircleIcon as ForbiddenCircleLinear } from \"@solar-icons/react/linear/forbidden-circle\"\nimport { GalleryIcon as GalleryLinear } from \"@solar-icons/react/linear/gallery\"\nimport { GalleryAddIcon as GalleryAddLinear } from \"@solar-icons/react/linear/gallery-add\"\nimport { GalleryWideIcon as GalleryWideLinear } from \"@solar-icons/react/linear/gallery-wide\"\nimport { GlobalIcon as GlobalLinear } from \"@solar-icons/react/linear/global\"\nimport { GraphDownIcon as GraphDownLinear } from \"@solar-icons/react/linear/graph-down\"\nimport { GraphUpIcon as GraphUpLinear } from \"@solar-icons/react/linear/graph-up\"\nimport { HamburgerMenuIcon as HamburgerMenuLinear } from \"@solar-icons/react/linear/hamburger-menu\"\nimport { HandHeartIcon as HandHeartLinear } from \"@solar-icons/react/linear/hand-heart\"\nimport { HeartIcon as HeartLinear } from \"@solar-icons/react/linear/heart\"\nimport { HelpIcon as HelpLinear } from \"@solar-icons/react/linear/help\"\nimport { HistoryIcon as HistoryLinear } from \"@solar-icons/react/linear/history\"\nimport { HomeAngleIcon as HomeAngleLinear } from \"@solar-icons/react/linear/home-angle\"\nimport { InfoCircleIcon as InfoCircleLinear } from \"@solar-icons/react/linear/info-circle\"\nimport { LayersIcon as LayersLinear } from \"@solar-icons/react/linear/layers\"\nimport { LetterIcon as LetterLinear } from \"@solar-icons/react/linear/letter\"\nimport { LikeIcon as LikeLinear } from \"@solar-icons/react/linear/like\"\nimport { LinkIcon as LinkLinear } from \"@solar-icons/react/linear/link\"\nimport { ListIcon as ListLinear } from \"@solar-icons/react/linear/list\"\nimport { ListVerticalIcon as ListVerticalLinear } from \"@solar-icons/react/linear/list-vertical\"\nimport { LockPasswordIcon as LockPasswordLinear } from \"@solar-icons/react/linear/lock-password\"\nimport { Login2Icon as Login2Linear } from \"@solar-icons/react/linear/login-2\"\nimport { LogoutIcon as LogoutLinear } from \"@solar-icons/react/linear/logout\"\nimport { MagicWand2Icon as MagicWand2Linear } from \"@solar-icons/react/linear/magic-wand-2\"\nimport { MagnifierIcon as MagnifierLinear } from \"@solar-icons/react/linear/magnifier\"\nimport { MagnifierZoomInIcon as MagnifierZoomInLinear } from \"@solar-icons/react/linear/magnifier-zoom-in\"\nimport { MagnifierZoomOutIcon as MagnifierZoomOutLinear } from \"@solar-icons/react/linear/magnifier-zoom-out\"\nimport { MaximizeIcon as MaximizeLinear } from \"@solar-icons/react/linear/maximize\"\nimport { MinimizeIcon as MinimizeLinear } from \"@solar-icons/react/linear/minimize\"\nimport { MinusSquareIcon as MinusSquareLinear } from \"@solar-icons/react/linear/minus-square\"\nimport { MonitorIcon as MonitorLinear } from \"@solar-icons/react/linear/monitor\"\nimport { MonitorSmartphoneIcon as MonitorSmartphoneLinear } from \"@solar-icons/react/linear/monitor-smartphone\"\nimport { MoonIcon as MoonLinear } from \"@solar-icons/react/linear/moon\"\nimport { MoveToFolderIcon as MoveToFolderLinear } from \"@solar-icons/react/linear/move-to-folder\"\nimport { MusicNotesIcon as MusicNotesLinear } from \"@solar-icons/react/linear/music-notes\"\nimport { PaletteIcon as PaletteLinear } from \"@solar-icons/react/linear/palette\"\nimport { PaletteRoundIcon as PaletteRoundLinear } from \"@solar-icons/react/linear/palette-round\"\nimport { PauseIcon as PauseLinear } from \"@solar-icons/react/linear/pause\"\nimport { PenIcon as PenLinear } from \"@solar-icons/react/linear/pen\"\nimport { PenNewRoundIcon as PenNewRoundLinear } from \"@solar-icons/react/linear/pen-new-round\"\nimport { PieChartIcon as PieChartLinear } from \"@solar-icons/react/linear/pie-chart\"\nimport { PinIcon as PinLinear } from \"@solar-icons/react/linear/pin\"\nimport { PlayIcon as PlayLinear } from \"@solar-icons/react/linear/play\"\nimport { PlugCircleIcon as PlugCircleLinear } from \"@solar-icons/react/linear/plug-circle\"\nimport { PlusMinusIcon as PlusMinusLinear } from \"@solar-icons/react/linear/plus-minus\"\nimport { PulseIcon as PulseLinear } from \"@solar-icons/react/linear/pulse\"\nimport { RefreshIcon as RefreshLinear } from \"@solar-icons/react/linear/refresh\"\nimport { RefreshCircleIcon as RefreshCircleLinear } from \"@solar-icons/react/linear/refresh-circle\"\nimport { ReorderIcon as ReorderLinear } from \"@solar-icons/react/linear/reorder\"\nimport { RepeatIcon as RepeatLinear } from \"@solar-icons/react/linear/repeat\"\nimport { ReplyIcon as ReplyLinear } from \"@solar-icons/react/linear/reply\"\nimport { RestartIcon as RestartLinear } from \"@solar-icons/react/linear/restart\"\nimport { RocketIcon as RocketLinear } from \"@solar-icons/react/linear/rocket\"\nimport { RouteIcon as RouteLinear } from \"@solar-icons/react/linear/route\"\nimport { ScaleIcon as ScaleLinear } from \"@solar-icons/react/linear/scale\"\nimport { ServerIcon as ServerLinear } from \"@solar-icons/react/linear/server\"\nimport { SettingsIcon as SettingsLinear } from \"@solar-icons/react/linear/settings\"\nimport { ShareIcon as ShareLinear } from \"@solar-icons/react/linear/share\"\nimport { ShieldCheckIcon as ShieldCheckLinear } from \"@solar-icons/react/linear/shield-check\"\nimport { Shop2Icon as Shop2Linear } from \"@solar-icons/react/linear/shop-2\"\nimport { SidebarMinimalisticIcon as SidebarMinimalisticLinear } from \"@solar-icons/react/linear/sidebar-minimalistic\"\nimport { SliderHorizontalIcon as SliderHorizontalLinear } from \"@solar-icons/react/linear/slider-horizontal\"\nimport { SmartphoneIcon as SmartphoneLinear } from \"@solar-icons/react/linear/smartphone\"\nimport { SortIcon as SortLinear } from \"@solar-icons/react/linear/sort\"\nimport { SortByTimeIcon as SortByTimeLinear } from \"@solar-icons/react/linear/sort-by-time\"\nimport { SortHorizontalIcon as SortHorizontalLinear } from \"@solar-icons/react/linear/sort-horizontal\"\nimport { SortVerticalIcon as SortVerticalLinear } from \"@solar-icons/react/linear/sort-vertical\"\nimport { StarIcon as StarLinear } from \"@solar-icons/react/linear/star\"\nimport { StructureIcon as StructureLinear } from \"@solar-icons/react/linear/structure\"\nimport { SunIcon as SunLinear } from \"@solar-icons/react/linear/sun\"\nimport { TagIcon as TagLinear } from \"@solar-icons/react/linear/tag\"\nimport { TelescopeIcon as TelescopeLinear } from \"@solar-icons/react/linear/telescope\"\nimport { TestTubeIcon as TestTubeLinear } from \"@solar-icons/react/linear/test-tube\"\nimport { TextFormatIcon as TextFormatLinear } from \"@solar-icons/react/linear/text-format\"\nimport { TransferHorizontalIcon as TransferHorizontalLinear } from \"@solar-icons/react/linear/transfer-horizontal\"\nimport { TranslationIcon as TranslationLinear } from \"@solar-icons/react/linear/translation\"\nimport { TrashBinMinimalisticIcon as TrashBinMinimalisticLinear } from \"@solar-icons/react/linear/trash-bin-minimalistic\"\nimport { UndoLeftIcon as UndoLeftLinear } from \"@solar-icons/react/linear/undo-left\"\nimport { UndoLeftRoundIcon as UndoLeftRoundLinear } from \"@solar-icons/react/linear/undo-left-round\"\nimport { UndoRightIcon as UndoRightLinear } from \"@solar-icons/react/linear/undo-right\"\nimport { UndoRightRoundIcon as UndoRightRoundLinear } from \"@solar-icons/react/linear/undo-right-round\"\nimport { UploadIcon as UploadLinear } from \"@solar-icons/react/linear/upload\"\nimport { UserIcon as UserLinear } from \"@solar-icons/react/linear/user\"\nimport { UserIdIcon as UserIdLinear } from \"@solar-icons/react/linear/user-id\"\nimport { UserMinusIcon as UserMinusLinear } from \"@solar-icons/react/linear/user-minus\"\nimport { UserPlusIcon as UserPlusLinear } from \"@solar-icons/react/linear/user-plus\"\nimport { UsersGroupRoundedIcon as UsersGroupRoundedLinear } from \"@solar-icons/react/linear/users-group-rounded\"\nimport { UsersGroupTwoRoundedIcon as UsersGroupTwoRoundedLinear } from \"@solar-icons/react/linear/users-group-two-rounded\"\nimport { VideoFrameIcon as VideoFrameLinear } from \"@solar-icons/react/linear/video-frame\"\nimport { Widget2Icon as Widget2Linear } from \"@solar-icons/react/linear/widget-2\"\nimport { Widget5Icon as Widget5Linear } from \"@solar-icons/react/linear/widget-5\"\nimport { WindowFrameIcon as WindowFrameLinear } from \"@solar-icons/react/linear/window-frame\"\nimport { createIcon } from \"./icon-style\"\n\n// ── One icon per glyph - three parallel Solar weights ────────────\nexport const AddCircle = createIcon({\n\tbold: AddCircleBoldWeight,\n\tboldDuotone: AddCircleBoldDuotone,\n\tlinear: AddCircleLinear,\n})\nexport const AlignLeft = createIcon({\n\tbold: AlignLeftBoldWeight,\n\tboldDuotone: AlignLeftBoldDuotone,\n\tlinear: AlignLeftLinear,\n})\nexport const AltArrowDown = createIcon({\n\tbold: AltArrowDownBoldWeight,\n\tboldDuotone: AltArrowDownBoldDuotone,\n\tlinear: AltArrowDownLinear,\n})\nexport const AltArrowLeft = createIcon({\n\tbold: AltArrowLeftBoldWeight,\n\tboldDuotone: AltArrowLeftBoldDuotone,\n\tlinear: AltArrowLeftLinear,\n})\nexport const AltArrowRight = createIcon({\n\tbold: AltArrowRightBoldWeight,\n\tboldDuotone: AltArrowRightBoldDuotone,\n\tlinear: AltArrowRightLinear,\n})\nexport const AltArrowUp = createIcon({\n\tbold: AltArrowUpBoldWeight,\n\tboldDuotone: AltArrowUpBoldDuotone,\n\tlinear: AltArrowUpLinear,\n})\nexport const Archive = createIcon({\n\tbold: ArchiveBoldWeight,\n\tboldDuotone: ArchiveBoldDuotone,\n\tlinear: ArchiveLinear,\n})\nexport const ArrowRight = createIcon({\n\tbold: ArrowRightBoldWeight,\n\tboldDuotone: ArrowRightBoldDuotone,\n\tlinear: ArrowRightLinear,\n})\nexport const ArrowToTopLeft = createIcon({\n\tbold: ArrowToTopLeftBoldWeight,\n\tboldDuotone: ArrowToTopLeftBoldDuotone,\n\tlinear: ArrowToTopLeftLinear,\n})\nexport const ArrowToTopRight = createIcon({\n\tbold: ArrowToTopRightBoldWeight,\n\tboldDuotone: ArrowToTopRightBoldDuotone,\n\tlinear: ArrowToTopRightLinear,\n})\nexport const Bell = createIcon({\n\tbold: BellBoldWeight,\n\tboldDuotone: BellBoldDuotone,\n\tlinear: BellLinear,\n})\nexport const Bolt = createIcon({\n\tbold: BoltBoldWeight,\n\tboldDuotone: BoltBoldDuotone,\n\tlinear: BoltLinear,\n})\nexport const Book = createIcon({\n\tbold: BookBoldWeight,\n\tboldDuotone: BookBoldDuotone,\n\tlinear: BookLinear,\n})\nexport const Book2 = createIcon({\n\tbold: Book2BoldWeight,\n\tboldDuotone: Book2BoldDuotone,\n\tlinear: Book2Linear,\n})\nexport const Bookmark = createIcon({\n\tbold: BookmarkBoldWeight,\n\tboldDuotone: BookmarkBoldDuotone,\n\tlinear: BookmarkLinear,\n})\nexport const BookmarkCircle = createIcon({\n\tbold: BookmarkCircleBoldWeight,\n\tboldDuotone: BookmarkCircleBoldDuotone,\n\tlinear: BookmarkCircleLinear,\n})\nexport const Box = createIcon({\n\tbold: BoxBoldWeight,\n\tboldDuotone: BoxBoldDuotone,\n\tlinear: BoxLinear,\n})\nexport const BranchingPathsUp = createIcon({\n\tbold: BranchingPathsUpBoldWeight,\n\tboldDuotone: BranchingPathsUpBoldDuotone,\n\tlinear: BranchingPathsUpLinear,\n})\nexport const Bug = createIcon({\n\tbold: BugBoldWeight,\n\tboldDuotone: BugBoldDuotone,\n\tlinear: BugLinear,\n})\nexport const CalendarDate = createIcon({\n\tbold: CalendarDateBoldWeight,\n\tboldDuotone: CalendarDateBoldDuotone,\n\tlinear: CalendarDateLinear,\n})\nexport const ChatRound = createIcon({\n\tbold: ChatRoundBoldWeight,\n\tboldDuotone: ChatRoundBoldDuotone,\n\tlinear: ChatRoundLinear,\n})\nexport const ChatRoundDots = createIcon({\n\tbold: ChatRoundDotsBoldWeight,\n\tboldDuotone: ChatRoundDotsBoldDuotone,\n\tlinear: ChatRoundDotsLinear,\n})\nexport const ChatRoundLine = createIcon({\n\tbold: ChatRoundLineBoldWeight,\n\tboldDuotone: ChatRoundLineBoldDuotone,\n\tlinear: ChatRoundLineLinear,\n})\nexport const ChatSquare = createIcon({\n\tbold: ChatSquareBoldWeight,\n\tboldDuotone: ChatSquareBoldDuotone,\n\tlinear: ChatSquareLinear,\n})\nexport const CheckCircle = createIcon({\n\tbold: CheckCircleBoldWeight,\n\tboldDuotone: CheckCircleBoldDuotone,\n\tlinear: CheckCircleLinear,\n})\nexport const Checklist = createIcon({\n\tbold: ChecklistBoldWeight,\n\tboldDuotone: ChecklistBoldDuotone,\n\tlinear: ChecklistLinear,\n})\nexport const ClipboardList = createIcon({\n\tbold: ClipboardListBoldWeight,\n\tboldDuotone: ClipboardListBoldDuotone,\n\tlinear: ClipboardListLinear,\n})\nexport const ClockCircle = createIcon({\n\tbold: ClockCircleBoldWeight,\n\tboldDuotone: ClockCircleBoldDuotone,\n\tlinear: ClockCircleLinear,\n})\nexport const Compass = createIcon({\n\tbold: CompassBoldWeight,\n\tboldDuotone: CompassBoldDuotone,\n\tlinear: CompassLinear,\n})\nexport const Copy = createIcon({\n\tbold: CopyBoldWeight,\n\tboldDuotone: CopyBoldDuotone,\n\tlinear: CopyLinear,\n})\nexport const Crown = createIcon({\n\tbold: CrownBoldWeight,\n\tboldDuotone: CrownBoldDuotone,\n\tlinear: CrownLinear,\n})\nexport const DangerTriangle = createIcon({\n\tbold: DangerTriangleBoldWeight,\n\tboldDuotone: DangerTriangleBoldDuotone,\n\tlinear: DangerTriangleLinear,\n})\nexport const Database = createIcon({\n\tbold: DatabaseBoldWeight,\n\tboldDuotone: DatabaseBoldDuotone,\n\tlinear: DatabaseLinear,\n})\nexport const Diskette = createIcon({\n\tbold: DisketteBoldWeight,\n\tboldDuotone: DisketteBoldDuotone,\n\tlinear: DisketteLinear,\n})\nexport const Dislike = createIcon({\n\tbold: DislikeBoldWeight,\n\tboldDuotone: DislikeBoldDuotone,\n\tlinear: DislikeLinear,\n})\nexport const DocumentAdd = createIcon({\n\tbold: DocumentAddBoldWeight,\n\tboldDuotone: DocumentAddBoldDuotone,\n\tlinear: DocumentAddLinear,\n})\nexport const DocumentText = createIcon({\n\tbold: DocumentTextBoldWeight,\n\tboldDuotone: DocumentTextBoldDuotone,\n\tlinear: DocumentTextLinear,\n})\nexport const DoubleAltArrowDown = createIcon({\n\tbold: DoubleAltArrowDownBoldWeight,\n\tboldDuotone: DoubleAltArrowDownBoldDuotone,\n\tlinear: DoubleAltArrowDownLinear,\n})\nexport const Download = createIcon({\n\tbold: DownloadBoldWeight,\n\tboldDuotone: DownloadBoldDuotone,\n\tlinear: DownloadLinear,\n})\nexport const Eraser = createIcon({\n\tbold: EraserBoldWeight,\n\tboldDuotone: EraserBoldDuotone,\n\tlinear: EraserLinear,\n})\nexport const Eye = createIcon({\n\tbold: EyeBoldWeight,\n\tboldDuotone: EyeBoldDuotone,\n\tlinear: EyeLinear,\n})\nexport const File = createIcon({\n\tbold: FileBoldWeight,\n\tboldDuotone: FileBoldDuotone,\n\tlinear: FileLinear,\n})\nexport const FileRemove = createIcon({\n\tbold: FileRemoveBoldWeight,\n\tboldDuotone: FileRemoveBoldDuotone,\n\tlinear: FileRemoveLinear,\n})\nexport const FileText = createIcon({\n\tbold: FileTextBoldWeight,\n\tboldDuotone: FileTextBoldDuotone,\n\tlinear: FileTextLinear,\n})\nexport const Filter = createIcon({\n\tbold: FilterBoldWeight,\n\tboldDuotone: FilterBoldDuotone,\n\tlinear: FilterLinear,\n})\nexport const Filters = createIcon({\n\tbold: FiltersBoldWeight,\n\tboldDuotone: FiltersBoldDuotone,\n\tlinear: FiltersLinear,\n})\nexport const Folder = createIcon({\n\tbold: FolderBoldWeight,\n\tboldDuotone: FolderBoldDuotone,\n\tlinear: FolderLinear,\n})\nexport const FolderOpen = createIcon({\n\tbold: FolderOpenBoldWeight,\n\tboldDuotone: FolderOpenBoldDuotone,\n\tlinear: FolderOpenLinear,\n})\nexport const FolderPathConnect = createIcon({\n\tbold: FolderPathConnectBoldWeight,\n\tboldDuotone: FolderPathConnectBoldDuotone,\n\tlinear: FolderPathConnectLinear,\n})\nexport const ForbiddenCircle = createIcon({\n\tbold: ForbiddenCircleBoldWeight,\n\tboldDuotone: ForbiddenCircleBoldDuotone,\n\tlinear: ForbiddenCircleLinear,\n})\nexport const Gallery = createIcon({\n\tbold: GalleryBoldWeight,\n\tboldDuotone: GalleryBoldDuotone,\n\tlinear: GalleryLinear,\n})\nexport const GalleryAdd = createIcon({\n\tbold: GalleryAddBoldWeight,\n\tboldDuotone: GalleryAddBoldDuotone,\n\tlinear: GalleryAddLinear,\n})\nexport const GalleryWide = createIcon({\n\tbold: GalleryWideBoldWeight,\n\tboldDuotone: GalleryWideBoldDuotone,\n\tlinear: GalleryWideLinear,\n})\nexport const Global = createIcon({\n\tbold: GlobalBoldWeight,\n\tboldDuotone: GlobalBoldDuotone,\n\tlinear: GlobalLinear,\n})\nexport const GraphDown = createIcon({\n\tbold: GraphDownBoldWeight,\n\tboldDuotone: GraphDownBoldDuotone,\n\tlinear: GraphDownLinear,\n})\nexport const GraphUp = createIcon({\n\tbold: GraphUpBoldWeight,\n\tboldDuotone: GraphUpBoldDuotone,\n\tlinear: GraphUpLinear,\n})\nexport const HamburgerMenu = createIcon({\n\tbold: HamburgerMenuBoldWeight,\n\tboldDuotone: HamburgerMenuBoldDuotone,\n\tlinear: HamburgerMenuLinear,\n})\nexport const HandHeart = createIcon({\n\tbold: HandHeartBoldWeight,\n\tboldDuotone: HandHeartBoldDuotone,\n\tlinear: HandHeartLinear,\n})\nexport const Heart = createIcon({\n\tbold: HeartBoldWeight,\n\tboldDuotone: HeartBoldDuotone,\n\tlinear: HeartLinear,\n})\nexport const Help = createIcon({\n\tbold: HelpBoldWeight,\n\tboldDuotone: HelpBoldDuotone,\n\tlinear: HelpLinear,\n})\nexport const History = createIcon({\n\tbold: HistoryBoldWeight,\n\tboldDuotone: HistoryBoldDuotone,\n\tlinear: HistoryLinear,\n})\nexport const HomeAngle = createIcon({\n\tbold: HomeAngleBoldWeight,\n\tboldDuotone: HomeAngleBoldDuotone,\n\tlinear: HomeAngleLinear,\n})\nexport const InfoCircle = createIcon({\n\tbold: InfoCircleBoldWeight,\n\tboldDuotone: InfoCircleBoldDuotone,\n\tlinear: InfoCircleLinear,\n})\nexport const Layers = createIcon({\n\tbold: LayersBoldWeight,\n\tboldDuotone: LayersBoldDuotone,\n\tlinear: LayersLinear,\n})\nexport const Letter = createIcon({\n\tbold: LetterBoldWeight,\n\tboldDuotone: LetterBoldDuotone,\n\tlinear: LetterLinear,\n})\nexport const Like = createIcon({\n\tbold: LikeBoldWeight,\n\tboldDuotone: LikeBoldDuotone,\n\tlinear: LikeLinear,\n})\nexport const Link = createIcon({\n\tbold: LinkBoldWeight,\n\tboldDuotone: LinkBoldDuotone,\n\tlinear: LinkLinear,\n})\nexport const List = createIcon({\n\tbold: ListBoldWeight,\n\tboldDuotone: ListBoldDuotone,\n\tlinear: ListLinear,\n})\nexport const ListVertical = createIcon({\n\tbold: ListVerticalBoldWeight,\n\tboldDuotone: ListVerticalBoldDuotone,\n\tlinear: ListVerticalLinear,\n})\nexport const LockPassword = createIcon({\n\tbold: LockPasswordBoldWeight,\n\tboldDuotone: LockPasswordBoldDuotone,\n\tlinear: LockPasswordLinear,\n})\nexport const Login2 = createIcon({\n\tbold: Login2BoldWeight,\n\tboldDuotone: Login2BoldDuotone,\n\tlinear: Login2Linear,\n})\nexport const Logout = createIcon({\n\tbold: LogoutBoldWeight,\n\tboldDuotone: LogoutBoldDuotone,\n\tlinear: LogoutLinear,\n})\nexport const MagicWand2 = createIcon({\n\tbold: MagicWand2BoldWeight,\n\tboldDuotone: MagicWand2BoldDuotone,\n\tlinear: MagicWand2Linear,\n})\nexport const Magnifier = createIcon({\n\tbold: MagnifierBoldWeight,\n\tboldDuotone: MagnifierBoldDuotone,\n\tlinear: MagnifierLinear,\n})\nexport const MagnifierZoomIn = createIcon({\n\tbold: MagnifierZoomInBoldWeight,\n\tboldDuotone: MagnifierZoomInBoldDuotone,\n\tlinear: MagnifierZoomInLinear,\n})\nexport const MagnifierZoomOut = createIcon({\n\tbold: MagnifierZoomOutBoldWeight,\n\tboldDuotone: MagnifierZoomOutBoldDuotone,\n\tlinear: MagnifierZoomOutLinear,\n})\nexport const Maximize = createIcon({\n\tbold: MaximizeBoldWeight,\n\tboldDuotone: MaximizeBoldDuotone,\n\tlinear: MaximizeLinear,\n})\nexport const MenuDots = createIcon({\n\tbold: MenuDotsBoldWeight,\n\tboldDuotone: MenuDotsBoldDuotone,\n\tlinear: MenuDotsBoldWeight,\n})\nexport const Minimize = createIcon({\n\tbold: MinimizeBoldWeight,\n\tboldDuotone: MinimizeBoldDuotone,\n\tlinear: MinimizeLinear,\n})\nexport const MinusSquare = createIcon({\n\tbold: MinusSquareBoldWeight,\n\tboldDuotone: MinusSquareBoldDuotone,\n\tlinear: MinusSquareLinear,\n})\nexport const Monitor = createIcon({\n\tbold: MonitorBoldWeight,\n\tboldDuotone: MonitorBoldDuotone,\n\tlinear: MonitorLinear,\n})\nexport const MonitorSmartphone = createIcon({\n\tbold: MonitorSmartphoneBoldWeight,\n\tboldDuotone: MonitorSmartphoneBoldDuotone,\n\tlinear: MonitorSmartphoneLinear,\n})\nexport const Moon = createIcon({\n\tbold: MoonBoldWeight,\n\tboldDuotone: MoonBoldDuotone,\n\tlinear: MoonLinear,\n})\nexport const MoveToFolder = createIcon({\n\tbold: MoveToFolderBoldWeight,\n\tboldDuotone: MoveToFolderBoldDuotone,\n\tlinear: MoveToFolderLinear,\n})\nexport const MusicNotes = createIcon({\n\tbold: MusicNotesBoldWeight,\n\tboldDuotone: MusicNotesBoldDuotone,\n\tlinear: MusicNotesLinear,\n})\nexport const Palette = createIcon({\n\tbold: PaletteBoldWeight,\n\tboldDuotone: PaletteBoldDuotone,\n\tlinear: PaletteLinear,\n})\nexport const PaletteRound = createIcon({\n\tbold: PaletteRoundBoldWeight,\n\tboldDuotone: PaletteRoundBoldDuotone,\n\tlinear: PaletteRoundLinear,\n})\nexport const Pause = createIcon({\n\tbold: PauseBoldWeight,\n\tboldDuotone: PauseBoldDuotone,\n\tlinear: PauseLinear,\n})\nexport const Pen = createIcon({\n\tbold: PenBoldWeight,\n\tboldDuotone: PenBoldDuotone,\n\tlinear: PenLinear,\n})\nexport const PenNewRound = createIcon({\n\tbold: PenNewRoundBoldWeight,\n\tboldDuotone: PenNewRoundBoldDuotone,\n\tlinear: PenNewRoundLinear,\n})\nexport const PieChart = createIcon({\n\tbold: PieChartBoldWeight,\n\tboldDuotone: PieChartBoldDuotone,\n\tlinear: PieChartLinear,\n})\nexport const Pin = createIcon({\n\tbold: PinBoldWeight,\n\tboldDuotone: PinBoldDuotone,\n\tlinear: PinLinear,\n})\nexport const Play = createIcon({\n\tbold: PlayBoldWeight,\n\tboldDuotone: PlayBoldDuotone,\n\tlinear: PlayLinear,\n})\nexport const PlugCircle = createIcon({\n\tbold: PlugCircleBoldWeight,\n\tboldDuotone: PlugCircleBoldDuotone,\n\tlinear: PlugCircleLinear,\n})\nexport const PlusMinus = createIcon({\n\tbold: PlusMinusBoldWeight,\n\tboldDuotone: PlusMinusBoldDuotone,\n\tlinear: PlusMinusLinear,\n})\nexport const Pulse = createIcon({\n\tbold: PulseBoldWeight,\n\tboldDuotone: PulseBoldDuotone,\n\tlinear: PulseLinear,\n})\nexport const Refresh = createIcon({\n\tbold: RefreshBoldWeight,\n\tboldDuotone: RefreshBoldDuotone,\n\tlinear: RefreshLinear,\n})\nexport const RefreshCircle = createIcon({\n\tbold: RefreshCircleBoldWeight,\n\tboldDuotone: RefreshCircleBoldDuotone,\n\tlinear: RefreshCircleLinear,\n})\nexport const Reorder = createIcon({\n\tbold: ReorderBoldWeight,\n\tboldDuotone: ReorderBoldDuotone,\n\tlinear: ReorderLinear,\n})\nexport const Repeat = createIcon({\n\tbold: RepeatBoldWeight,\n\tboldDuotone: RepeatBoldDuotone,\n\tlinear: RepeatLinear,\n})\nexport const Reply = createIcon({\n\tbold: ReplyBoldWeight,\n\tboldDuotone: ReplyBoldDuotone,\n\tlinear: ReplyLinear,\n})\nexport const Restart = createIcon({\n\tbold: RestartBoldWeight,\n\tboldDuotone: RestartBoldDuotone,\n\tlinear: RestartLinear,\n})\nexport const Rocket = createIcon({\n\tbold: RocketBoldWeight,\n\tboldDuotone: RocketBoldDuotone,\n\tlinear: RocketLinear,\n})\nexport const Route = createIcon({\n\tbold: RouteBoldWeight,\n\tboldDuotone: RouteBoldDuotone,\n\tlinear: RouteLinear,\n})\nexport const Scale = createIcon({\n\tbold: ScaleBoldWeight,\n\tboldDuotone: ScaleBoldDuotone,\n\tlinear: ScaleLinear,\n})\nexport const Server = createIcon({\n\tbold: ServerBoldWeight,\n\tboldDuotone: ServerBoldDuotone,\n\tlinear: ServerLinear,\n})\nexport const Settings = createIcon({\n\tbold: SettingsBoldWeight,\n\tboldDuotone: SettingsBoldDuotone,\n\tlinear: SettingsLinear,\n})\nexport const Share = createIcon({\n\tbold: ShareBoldWeight,\n\tboldDuotone: ShareBoldDuotone,\n\tlinear: ShareLinear,\n})\nexport const ShieldCheck = createIcon({\n\tbold: ShieldCheckBoldWeight,\n\tboldDuotone: ShieldCheckBoldDuotone,\n\tlinear: ShieldCheckLinear,\n})\nexport const Shop2 = createIcon({\n\tbold: Shop2BoldWeight,\n\tboldDuotone: Shop2BoldDuotone,\n\tlinear: Shop2Linear,\n})\nexport const SidebarMinimalistic = createIcon({\n\tbold: SidebarMinimalisticBoldWeight,\n\tboldDuotone: SidebarMinimalisticBoldDuotone,\n\tlinear: SidebarMinimalisticLinear,\n})\nexport const SliderHorizontal = createIcon({\n\tbold: SliderHorizontalBoldWeight,\n\tboldDuotone: SliderHorizontalBoldDuotone,\n\tlinear: SliderHorizontalLinear,\n})\nexport const Smartphone = createIcon({\n\tbold: SmartphoneBoldWeight,\n\tboldDuotone: SmartphoneBoldDuotone,\n\tlinear: SmartphoneLinear,\n})\nexport const Sort = createIcon({\n\tbold: SortBoldWeight,\n\tboldDuotone: SortBoldDuotone,\n\tlinear: SortLinear,\n})\nexport const SortByTime = createIcon({\n\tbold: SortByTimeBoldWeight,\n\tboldDuotone: SortByTimeBoldDuotone,\n\tlinear: SortByTimeLinear,\n})\nexport const SortHorizontal = createIcon({\n\tbold: SortHorizontalBoldWeight,\n\tboldDuotone: SortHorizontalBoldDuotone,\n\tlinear: SortHorizontalLinear,\n})\nexport const SortVertical = createIcon({\n\tbold: SortVerticalBoldWeight,\n\tboldDuotone: SortVerticalBoldDuotone,\n\tlinear: SortVerticalLinear,\n})\nexport const Star = createIcon({\n\tbold: StarBoldWeight,\n\tboldDuotone: StarBoldDuotone,\n\tlinear: StarLinear,\n})\nexport const Structure = createIcon({\n\tbold: StructureBoldWeight,\n\tboldDuotone: StructureBoldDuotone,\n\tlinear: StructureLinear,\n})\nexport const Sun = createIcon({\n\tbold: SunBoldWeight,\n\tboldDuotone: SunBoldDuotone,\n\tlinear: SunLinear,\n})\nexport const Tag = createIcon({\n\tbold: TagBoldWeight,\n\tboldDuotone: TagBoldDuotone,\n\tlinear: TagLinear,\n})\nexport const Telescope = createIcon({\n\tbold: TelescopeBoldWeight,\n\tboldDuotone: TelescopeBoldDuotone,\n\tlinear: TelescopeLinear,\n})\nexport const TestTube = createIcon({\n\tbold: TestTubeBoldWeight,\n\tboldDuotone: TestTubeBoldDuotone,\n\tlinear: TestTubeLinear,\n})\nexport const TextFormat = createIcon({\n\tbold: TextFormatBoldWeight,\n\tboldDuotone: TextFormatBoldDuotone,\n\tlinear: TextFormatLinear,\n})\nexport const TransferHorizontal = createIcon({\n\tbold: TransferHorizontalBoldWeight,\n\tboldDuotone: TransferHorizontalBoldDuotone,\n\tlinear: TransferHorizontalLinear,\n})\nexport const Translation = createIcon({\n\tbold: TranslationBoldWeight,\n\tboldDuotone: TranslationBoldDuotone,\n\tlinear: TranslationLinear,\n})\nexport const TrashBinMinimalistic = createIcon({\n\tbold: TrashBinMinimalisticBoldWeight,\n\tboldDuotone: TrashBinMinimalisticBoldDuotone,\n\tlinear: TrashBinMinimalisticLinear,\n})\nexport const UndoLeft = createIcon({\n\tbold: UndoLeftBoldWeight,\n\tboldDuotone: UndoLeftBoldDuotone,\n\tlinear: UndoLeftLinear,\n})\nexport const UndoLeftRound = createIcon({\n\tbold: UndoLeftRoundBoldWeight,\n\tboldDuotone: UndoLeftRoundBoldDuotone,\n\tlinear: UndoLeftRoundLinear,\n})\nexport const UndoRight = createIcon({\n\tbold: UndoRightBoldWeight,\n\tboldDuotone: UndoRightBoldDuotone,\n\tlinear: UndoRightLinear,\n})\nexport const UndoRightRound = createIcon({\n\tbold: UndoRightRoundBoldWeight,\n\tboldDuotone: UndoRightRoundBoldDuotone,\n\tlinear: UndoRightRoundLinear,\n})\nexport const Upload = createIcon({\n\tbold: UploadBoldWeight,\n\tboldDuotone: UploadBoldDuotone,\n\tlinear: UploadLinear,\n})\nexport const User = createIcon({\n\tbold: UserBoldWeight,\n\tboldDuotone: UserBoldDuotone,\n\tlinear: UserLinear,\n})\nexport const UserId = createIcon({\n\tbold: UserIdBoldWeight,\n\tboldDuotone: UserIdBoldDuotone,\n\tlinear: UserIdLinear,\n})\nexport const UserMinus = createIcon({\n\tbold: UserMinusBoldWeight,\n\tboldDuotone: UserMinusBoldDuotone,\n\tlinear: UserMinusLinear,\n})\nexport const UserPlus = createIcon({\n\tbold: UserPlusBoldWeight,\n\tboldDuotone: UserPlusBoldDuotone,\n\tlinear: UserPlusLinear,\n})\nexport const UsersGroupRounded = createIcon({\n\tbold: UsersGroupRoundedBoldWeight,\n\tboldDuotone: UsersGroupRoundedBoldDuotone,\n\tlinear: UsersGroupRoundedLinear,\n})\nexport const UsersGroupTwoRounded = createIcon({\n\tbold: UsersGroupTwoRoundedBoldWeight,\n\tboldDuotone: UsersGroupTwoRoundedBoldDuotone,\n\tlinear: UsersGroupTwoRoundedLinear,\n})\nexport const VideoFrame = createIcon({\n\tbold: VideoFrameBoldWeight,\n\tboldDuotone: VideoFrameBoldDuotone,\n\tlinear: VideoFrameLinear,\n})\nexport const Widget2 = createIcon({\n\tbold: Widget2BoldWeight,\n\tboldDuotone: Widget2BoldDuotone,\n\tlinear: Widget2Linear,\n})\nexport const Widget5 = createIcon({\n\tbold: Widget5BoldWeight,\n\tboldDuotone: Widget5BoldDuotone,\n\tlinear: Widget5Linear,\n})\nexport const WindowFrame = createIcon({\n\tbold: WindowFrameBoldWeight,\n\tboldDuotone: WindowFrameBoldDuotone,\n\tlinear: WindowFrameLinear,\n})\n","/**\n * Local utility marks — the three plain glyphs Solar's vocabulary lacks\n * (its ✓/×/+ only exist inside Circle/Square containers, whose marks occupy\n * barely a third of the box and go muddy below 16px). These are drawn\n * in-house for the spots where a bare mark is the whole meaning: checkbox\n * ticks, selected badges, pill clears, add affordances.\n *\n * Check and Cross are strokes in Solar's language (24 viewBox, round caps)\n * at 2 units — diagonals anti-alias gracefully at any tier. Plus is a\n * filled cross instead: its pure orthogonal edges land on integer pixels\n * at the md tier (3-unit arms render as a crisp 2px bar at 16px), where a\n * 1.33px stroke would straddle pixel boundaries and blur. Weight-insensitive:\n * no tone layer, no weight variants. Original geometry — not derived\n * from Solar assets.\n *\n * Marks ride the same `mode` channel as registry icons (declared, ignored):\n * a check is a check in every weight.\n */\nimport type { IconMode } from \"./icon-style.ts\"\n\ntype MarkProps = {\n\tclassName?: string\n\tmode?: IconMode\n}\n\nfunction Mark({\n\td,\n\tfilled,\n\tclassName,\n}: MarkProps & { d: string; filled?: boolean }) {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"none\"\n\t\t\tclassName={className}\n\t\t>\n\t\t\t{filled ? (\n\t\t\t\t<path d={d} fill=\"currentColor\" />\n\t\t\t) : (\n\t\t\t\t<path\n\t\t\t\t\td={d}\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</svg>\n\t)\n}\n\n/** Plain ✓ — checkbox ticks, selected badges. */\nexport function Check(props: MarkProps) {\n\treturn <Mark {...props} d=\"M5 12.8l4.7 4.7L19 7.2\" />\n}\n\n/** Plain × — pill and chip clears. */\nexport function Cross(props: MarkProps) {\n\treturn <Mark {...props} d=\"M6 6l12 12M18 6L6 18\" />\n}\n\n/** Plain + — add affordances. Filled cross, 3-unit arms spanning 5–19. */\nexport function Plus(props: MarkProps) {\n\treturn (\n\t\t<Mark\n\t\t\t{...props}\n\t\t\tfilled\n\t\t\td=\"M10.5 5h3v5.5H19v3h-5.5V19h-3v-5.5H5v-3h5.5V5Z\"\n\t\t/>\n\t)\n}\n","\"use client\"\n\n\nimport * as React from \"react\"\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react\"\n\nimport { cn } from \"@hoardodile/ui/lib/utils\"\nimport { useMobileBackToClose } from \"@hoardodile/ui/hooks/useMobileBackToClose\"\nimport { Button } from \"@hoardodile/ui/components/button\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupInput,\n} from \"@hoardodile/ui/components/input-group\"\nimport { AltArrowDown } from \"@hoardodile/ui/icons/registry\"\nimport { Check, Cross } from \"@hoardodile/ui/icons/marks\"\n\nfunction Combobox<Value, Multiple extends boolean | undefined = false>({\n open,\n defaultOpen,\n onOpenChange,\n ...props\n}: Omit<ComboboxPrimitive.Root.Props<Value, Multiple>, \"onOpenChange\"> & {\n /**\n * `eventDetails` is absent for closes triggered by the mobile back\n * gesture (a synthetic close with no underlying Base UI event).\n */\n onOpenChange?: (\n open: boolean,\n eventDetails?: ComboboxPrimitive.Root.ChangeEventDetails,\n ) => void\n}) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(\n defaultOpen ?? false,\n )\n const isControlled = open !== undefined\n const currentOpen = isControlled ? open : uncontrolledOpen\n function handleOpenChange(\n next: boolean,\n eventDetails?: ComboboxPrimitive.Root.ChangeEventDetails,\n ) {\n if (!isControlled) setUncontrolledOpen(next)\n onOpenChange?.(next, eventDetails)\n }\n useMobileBackToClose(currentOpen, handleOpenChange)\n return (\n <ComboboxPrimitive.Root<Value, Multiple>\n open={currentOpen}\n onOpenChange={handleOpenChange}\n {...props}\n />\n )\n}\n\nfunction ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) {\n return <ComboboxPrimitive.Value data-slot=\"combobox-value\" {...props} />\n}\n\nfunction ComboboxTrigger({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Trigger.Props) {\n return (\n <ComboboxPrimitive.Trigger\n data-slot=\"combobox-trigger\"\n className={cn(\"[&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n {children}\n <AltArrowDown className=\"pointer-events-none size-4 text-muted-foreground\" />\n </ComboboxPrimitive.Trigger>\n )\n}\n\nfunction ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) {\n return (\n <ComboboxPrimitive.Clear\n data-slot=\"combobox-clear\"\n render={<InputGroupButton variant=\"ghost\" size=\"icon-xs\" />}\n className={cn(className)}\n {...props}\n >\n <Cross className=\"pointer-events-none\" />\n </ComboboxPrimitive.Clear>\n )\n}\n\nfunction ComboboxInput({\n className,\n children,\n disabled = false,\n showTrigger = true,\n showClear = false,\n ...props\n}: ComboboxPrimitive.Input.Props & {\n showTrigger?: boolean\n showClear?: boolean\n}) {\n return (\n <InputGroup className={cn(\"w-auto\", className)}>\n <ComboboxPrimitive.Input\n render={<InputGroupInput disabled={disabled} />}\n {...props}\n />\n <InputGroupAddon align=\"inline-end\">\n {showTrigger && (\n <InputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n render={<ComboboxTrigger />}\n data-slot=\"input-group-button\"\n className=\"group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent\"\n disabled={disabled}\n />\n )}\n {showClear && <ComboboxClear disabled={disabled} />}\n </InputGroupAddon>\n {children}\n </InputGroup>\n )\n}\n\nfunction ComboboxContent({\n className,\n side = \"bottom\",\n sideOffset = 6,\n align = \"start\",\n alignOffset = 0,\n anchor,\n ...props\n}: ComboboxPrimitive.Popup.Props &\n Pick<\n ComboboxPrimitive.Positioner.Props,\n \"side\" | \"align\" | \"sideOffset\" | \"alignOffset\" | \"anchor\"\n >) {\n return (\n <ComboboxPrimitive.Portal>\n <ComboboxPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"isolate z-50\"\n >\n <ComboboxPrimitive.Popup\n data-slot=\"combobox-content\"\n data-chips={!!anchor}\n className={cn(\"group/combobox-content relative max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n )\n}\n\nfunction ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) {\n return (\n <ComboboxPrimitive.List\n data-slot=\"combobox-list\"\n className={cn(\n \"no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxItem({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Item.Props) {\n return (\n <ComboboxPrimitive.Item\n data-slot=\"combobox-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ComboboxPrimitive.ItemIndicator\n render={\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n }\n >\n <Check className=\"pointer-events-none\" />\n </ComboboxPrimitive.ItemIndicator>\n </ComboboxPrimitive.Item>\n )\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {\n return (\n <ComboboxPrimitive.Group\n data-slot=\"combobox-group\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxLabel({\n className,\n ...props\n}: ComboboxPrimitive.GroupLabel.Props) {\n return (\n <ComboboxPrimitive.GroupLabel\n data-slot=\"combobox-label\"\n className={cn(\"px-2 py-1.5 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxCollection({ ...props }: ComboboxPrimitive.Collection.Props) {\n return (\n <ComboboxPrimitive.Collection data-slot=\"combobox-collection\" {...props} />\n )\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {\n return (\n <ComboboxPrimitive.Empty\n data-slot=\"combobox-empty\"\n className={cn(\n \"hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxSeparator({\n className,\n ...props\n}: ComboboxPrimitive.Separator.Props) {\n return (\n <ComboboxPrimitive.Separator\n data-slot=\"combobox-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxChips({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> &\n ComboboxPrimitive.Chips.Props) {\n return (\n <ComboboxPrimitive.Chips\n data-slot=\"combobox-chips\"\n className={cn(\n \"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent bg-clip-padding px-2.5 py-1.5 text-sm shadow-xs transition-[color,box-shadow] focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1.5 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxChip({\n className,\n children,\n showRemove = true,\n ...props\n}: ComboboxPrimitive.Chip.Props & {\n showRemove?: boolean\n}) {\n return (\n <ComboboxPrimitive.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n \"flex h-[calc(--spacing(5.5))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0\",\n className\n )}\n {...props}\n >\n {children}\n {showRemove && (\n <ComboboxPrimitive.ChipRemove\n render={<Button variant=\"ghost\" size=\"icon-xs\" />}\n className=\"-ml-1 opacity-50 hover:opacity-100\"\n data-slot=\"combobox-chip-remove\"\n >\n <Cross className=\"pointer-events-none\" />\n </ComboboxPrimitive.ChipRemove>\n )}\n </ComboboxPrimitive.Chip>\n )\n}\n\nfunction ComboboxChipsInput({\n className,\n ...props\n}: ComboboxPrimitive.Input.Props) {\n return (\n <ComboboxPrimitive.Input\n data-slot=\"combobox-chip-input\"\n className={cn(\"min-w-16 flex-1 outline-none\", className)}\n {...props}\n />\n )\n}\n\nfunction useComboboxAnchor() {\n return React.useRef<HTMLDivElement | null>(null)\n}\n\nexport {\n Combobox,\n ComboboxInput,\n ComboboxContent,\n ComboboxList,\n ComboboxItem,\n ComboboxGroup,\n ComboboxLabel,\n ComboboxCollection,\n ComboboxEmpty,\n ComboboxSeparator,\n ComboboxChips,\n ComboboxChip,\n ComboboxChipsInput,\n ComboboxTrigger,\n ComboboxValue,\n useComboboxAnchor,\n}\n"]}
|