@hoardodile/ui 0.1.6 → 0.1.8

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.
Files changed (273) hide show
  1. package/dist/chunk-2BVZEYNW.js +97 -0
  2. package/dist/chunk-2BVZEYNW.js.map +1 -0
  3. package/dist/chunk-2DTR6CD5.js +47 -0
  4. package/dist/chunk-2DTR6CD5.js.map +1 -0
  5. package/dist/chunk-2HWSCY4T.js +20 -0
  6. package/dist/chunk-2HWSCY4T.js.map +1 -0
  7. package/dist/chunk-363CCKQ7.js +75 -0
  8. package/dist/chunk-363CCKQ7.js.map +1 -0
  9. package/dist/chunk-3ZQJWBVB.js +30 -0
  10. package/dist/chunk-3ZQJWBVB.js.map +1 -0
  11. package/dist/chunk-4D36OO5W.js +277 -0
  12. package/dist/chunk-4D36OO5W.js.map +1 -0
  13. package/dist/chunk-4UITFLIN.js +31 -0
  14. package/dist/chunk-4UITFLIN.js.map +1 -0
  15. package/dist/chunk-6HAIUXNZ.js +11 -0
  16. package/dist/chunk-6HAIUXNZ.js.map +1 -0
  17. package/dist/chunk-7JMMFY67.js +62 -0
  18. package/dist/chunk-7JMMFY67.js.map +1 -0
  19. package/dist/chunk-7MWWHI6T.js +1149 -0
  20. package/dist/chunk-7MWWHI6T.js.map +1 -0
  21. package/dist/chunk-AEHTAUAQ.js +65 -0
  22. package/dist/chunk-AEHTAUAQ.js.map +1 -0
  23. package/dist/chunk-ASRGQ5BD.js +130 -0
  24. package/dist/chunk-ASRGQ5BD.js.map +1 -0
  25. package/dist/chunk-BFGOE5AI.js +187 -0
  26. package/dist/chunk-BFGOE5AI.js.map +1 -0
  27. package/dist/chunk-BRT25IDQ.js +46 -0
  28. package/dist/chunk-BRT25IDQ.js.map +1 -0
  29. package/dist/chunk-BU5DQOPM.js +29 -0
  30. package/dist/chunk-BU5DQOPM.js.map +1 -0
  31. package/dist/chunk-BWASOT5X.js +266 -0
  32. package/dist/chunk-BWASOT5X.js.map +1 -0
  33. package/dist/chunk-F32V4Z7Q.js +26 -0
  34. package/dist/chunk-F32V4Z7Q.js.map +1 -0
  35. package/dist/chunk-F7RHDRRJ.js +24 -0
  36. package/dist/chunk-F7RHDRRJ.js.map +1 -0
  37. package/dist/chunk-FH5RNCFR.js +21 -0
  38. package/dist/chunk-FH5RNCFR.js.map +1 -0
  39. package/dist/chunk-GKSX5ULZ.js +513 -0
  40. package/dist/chunk-GKSX5ULZ.js.map +1 -0
  41. package/dist/chunk-JPFDNRCA.js +26 -0
  42. package/dist/chunk-JPFDNRCA.js.map +1 -0
  43. package/dist/chunk-KNPRUZ4H.js +13 -0
  44. package/dist/chunk-KNPRUZ4H.js.map +1 -0
  45. package/dist/chunk-KOFWEPPB.js +254 -0
  46. package/dist/chunk-KOFWEPPB.js.map +1 -0
  47. package/dist/chunk-M5OJN54O.js +10 -0
  48. package/dist/chunk-M5OJN54O.js.map +1 -0
  49. package/dist/chunk-OEVALKQ5.js +51 -0
  50. package/dist/chunk-OEVALKQ5.js.map +1 -0
  51. package/dist/chunk-OW5FWLPH.js +33 -0
  52. package/dist/chunk-OW5FWLPH.js.map +1 -0
  53. package/dist/chunk-POX7TXBH.js +41 -0
  54. package/dist/chunk-POX7TXBH.js.map +1 -0
  55. package/dist/chunk-PWJBHUM2.js +58 -0
  56. package/dist/chunk-PWJBHUM2.js.map +1 -0
  57. package/dist/chunk-QGMDWGJT.js +23 -0
  58. package/dist/chunk-QGMDWGJT.js.map +1 -0
  59. package/dist/chunk-QGTQQNUL.js +36 -0
  60. package/dist/chunk-QGTQQNUL.js.map +1 -0
  61. package/dist/chunk-SAY52ZKI.js +152 -0
  62. package/dist/chunk-SAY52ZKI.js.map +1 -0
  63. package/dist/chunk-SKDPGSRL.js +166 -0
  64. package/dist/chunk-SKDPGSRL.js.map +1 -0
  65. package/dist/chunk-T56ARCUK.js +38 -0
  66. package/dist/chunk-T56ARCUK.js.map +1 -0
  67. package/dist/chunk-TDDHQZ62.js +227 -0
  68. package/dist/chunk-TDDHQZ62.js.map +1 -0
  69. package/dist/chunk-TMQ5OMBK.js +29 -0
  70. package/dist/chunk-TMQ5OMBK.js.map +1 -0
  71. package/dist/chunk-UEVND7AS.js +23 -0
  72. package/dist/chunk-UEVND7AS.js.map +1 -0
  73. package/dist/chunk-UPWHCG4S.js +40 -0
  74. package/dist/chunk-UPWHCG4S.js.map +1 -0
  75. package/dist/chunk-VWUNF7VX.js +3 -0
  76. package/dist/chunk-VWUNF7VX.js.map +1 -0
  77. package/dist/chunk-WI6O7GZK.js +45 -0
  78. package/dist/chunk-WI6O7GZK.js.map +1 -0
  79. package/dist/chunk-WVEK3WCX.js +21 -0
  80. package/dist/chunk-WVEK3WCX.js.map +1 -0
  81. package/dist/chunk-XBPQEZES.js +48 -0
  82. package/dist/chunk-XBPQEZES.js.map +1 -0
  83. package/dist/chunk-ZYAGKKR7.js +142 -0
  84. package/dist/chunk-ZYAGKKR7.js.map +1 -0
  85. package/dist/components/alert.js +2 -21
  86. package/dist/components/alert.js.map +1 -1
  87. package/dist/components/app-dialog.js +10 -654
  88. package/dist/components/app-dialog.js.map +1 -1
  89. package/dist/components/badge.js +2 -23
  90. package/dist/components/badge.js.map +1 -1
  91. package/dist/components/breadcrumb.js +5 -501
  92. package/dist/components/breadcrumb.js.map +1 -1
  93. package/dist/components/button.js +3 -76
  94. package/dist/components/button.js.map +1 -1
  95. package/dist/components/caption-bar.js +7 -518
  96. package/dist/components/caption-bar.js.map +1 -1
  97. package/dist/components/checkbox.js +4 -74
  98. package/dist/components/checkbox.js.map +1 -1
  99. package/dist/components/chip-button.js +4 -85
  100. package/dist/components/chip-button.js.map +1 -1
  101. package/dist/components/close-confirm-dialog.js +12 -662
  102. package/dist/components/close-confirm-dialog.js.map +1 -1
  103. package/dist/components/color-picker.js +7 -530
  104. package/dist/components/color-picker.js.map +1 -1
  105. package/dist/components/combobox.js +15 -934
  106. package/dist/components/combobox.js.map +1 -1
  107. package/dist/components/confirm-by-typing-dialog.js +12 -669
  108. package/dist/components/confirm-by-typing-dialog.js.map +1 -1
  109. package/dist/components/confirm-dialog.js +11 -637
  110. package/dist/components/confirm-dialog.js.map +1 -1
  111. package/dist/components/count-badge.js +2 -21
  112. package/dist/components/count-badge.js.map +1 -1
  113. package/dist/components/dialog.js +8 -569
  114. package/dist/components/dialog.js.map +1 -1
  115. package/dist/components/dropdown-menu.js +9 -1004
  116. package/dist/components/dropdown-menu.js.map +1 -1
  117. package/dist/components/dropdown-select.js +9 -880
  118. package/dist/components/dropdown-select.js.map +1 -1
  119. package/dist/components/empty.js +2 -21
  120. package/dist/components/empty.js.map +1 -1
  121. package/dist/components/filter-rail.js +7 -145
  122. package/dist/components/filter-rail.js.map +1 -1
  123. package/dist/components/fixed-action-bar.js +2 -21
  124. package/dist/components/fixed-action-bar.js.map +1 -1
  125. package/dist/components/font-picker.js +11 -586
  126. package/dist/components/font-picker.js.map +1 -1
  127. package/dist/components/form.js +9 -66
  128. package/dist/components/form.js.map +1 -1
  129. package/dist/components/icon-tile.js +3 -43
  130. package/dist/components/icon-tile.js.map +1 -1
  131. package/dist/components/icon-toggle.js +3 -43
  132. package/dist/components/icon-toggle.js.map +1 -1
  133. package/dist/components/icon.js +3 -47
  134. package/dist/components/icon.js.map +1 -1
  135. package/dist/components/image-crop-panel.js +19 -772
  136. package/dist/components/image-crop-panel.js.map +1 -1
  137. package/dist/components/image-cropper.js +1 -164
  138. package/dist/components/image-cropper.js.map +1 -1
  139. package/dist/components/input-group.js +6 -268
  140. package/dist/components/input-group.js.map +1 -1
  141. package/dist/components/input.js +3 -58
  142. package/dist/components/input.js.map +1 -1
  143. package/dist/components/label.js +3 -38
  144. package/dist/components/label.js.map +1 -1
  145. package/dist/components/list-empty-row.js +2 -21
  146. package/dist/components/list-empty-row.js.map +1 -1
  147. package/dist/components/management-empty.js +2 -21
  148. package/dist/components/management-empty.js.map +1 -1
  149. package/dist/components/management-skeleton.js +4 -59
  150. package/dist/components/management-skeleton.js.map +1 -1
  151. package/dist/components/meta-chip.js +2 -21
  152. package/dist/components/meta-chip.js.map +1 -1
  153. package/dist/components/mobile-drawer.js +7 -268
  154. package/dist/components/mobile-drawer.js.map +1 -1
  155. package/dist/components/page-header.js +3 -42
  156. package/dist/components/page-header.js.map +1 -1
  157. package/dist/components/page-scaffold.js +5 -76
  158. package/dist/components/page-scaffold.js.map +1 -1
  159. package/dist/components/pagination-bar.js +13 -614
  160. package/dist/components/pagination-bar.js.map +1 -1
  161. package/dist/components/pagination.js +6 -681
  162. package/dist/components/pagination.js.map +1 -1
  163. package/dist/components/panel-toolbar.js +11 -713
  164. package/dist/components/panel-toolbar.js.map +1 -1
  165. package/dist/components/pill-tabs.js +2 -21
  166. package/dist/components/pill-tabs.js.map +1 -1
  167. package/dist/components/plugin-download-consent.js +13 -663
  168. package/dist/components/plugin-download-consent.js.map +1 -1
  169. package/dist/components/popover.js +5 -242
  170. package/dist/components/popover.js.map +1 -1
  171. package/dist/components/preview-card.js +2 -21
  172. package/dist/components/preview-card.js.map +1 -1
  173. package/dist/components/progress.js +2 -20
  174. package/dist/components/progress.js.map +1 -1
  175. package/dist/components/radio-group.js +2 -21
  176. package/dist/components/radio-group.js.map +1 -1
  177. package/dist/components/scroll-area.js +2 -21
  178. package/dist/components/scroll-area.js.map +1 -1
  179. package/dist/components/search-field.js +6 -587
  180. package/dist/components/search-field.js.map +1 -1
  181. package/dist/components/secondary-stat.js +3 -40
  182. package/dist/components/secondary-stat.js.map +1 -1
  183. package/dist/components/section-header.js +3 -43
  184. package/dist/components/section-header.js.map +1 -1
  185. package/dist/components/section-label.js +3 -44
  186. package/dist/components/section-label.js.map +1 -1
  187. package/dist/components/section-tabs.js +2 -21
  188. package/dist/components/section-tabs.js.map +1 -1
  189. package/dist/components/separator.js +3 -47
  190. package/dist/components/separator.js.map +1 -1
  191. package/dist/components/sheet.js +8 -467
  192. package/dist/components/sheet.js.map +1 -1
  193. package/dist/components/sidebar.js +24 -1044
  194. package/dist/components/sidebar.js.map +1 -1
  195. package/dist/components/skeleton.js +3 -39
  196. package/dist/components/skeleton.js.map +1 -1
  197. package/dist/components/slider.js +2 -21
  198. package/dist/components/slider.js.map +1 -1
  199. package/dist/components/sortable-chip-list.js +2 -21
  200. package/dist/components/sortable-chip-list.js.map +1 -1
  201. package/dist/components/special-tag-surface.js +3 -531
  202. package/dist/components/special-tag-surface.js.map +1 -1
  203. package/dist/components/spinner.js +3 -63
  204. package/dist/components/spinner.js.map +1 -1
  205. package/dist/components/surface.js +3 -49
  206. package/dist/components/surface.js.map +1 -1
  207. package/dist/components/switch.js +3 -51
  208. package/dist/components/switch.js.map +1 -1
  209. package/dist/components/table.js +2 -20
  210. package/dist/components/table.js.map +1 -1
  211. package/dist/components/tag-chip.js +6 -617
  212. package/dist/components/tag-chip.js.map +1 -1
  213. package/dist/components/textarea.js +3 -56
  214. package/dist/components/textarea.js.map +1 -1
  215. package/dist/components/toast.js +8 -806
  216. package/dist/components/toast.js.map +1 -1
  217. package/dist/components/toggle.js +2 -20
  218. package/dist/components/toggle.js.map +1 -1
  219. package/dist/components/tooltip.js +3 -80
  220. package/dist/components/tooltip.js.map +1 -1
  221. package/dist/hooks/use-dialog-footer-actions.js +1 -9
  222. package/dist/hooks/use-dialog-footer-actions.js.map +1 -1
  223. package/dist/hooks/use-form-field.js +1 -34
  224. package/dist/hooks/use-form-field.js.map +1 -1
  225. package/dist/hooks/use-mobile.js +2 -27
  226. package/dist/hooks/use-mobile.js.map +1 -1
  227. package/dist/hooks/useMobileBackToClose.js +3 -232
  228. package/dist/hooks/useMobileBackToClose.js.map +1 -1
  229. package/dist/icons/actions.js +4 -521
  230. package/dist/icons/actions.js.map +1 -1
  231. package/dist/icons/icon-style.js +1 -49
  232. package/dist/icons/icon-style.js.map +1 -1
  233. package/dist/icons/marks.js +1 -46
  234. package/dist/icons/marks.js.map +1 -1
  235. package/dist/icons/registry.d.ts +2 -1
  236. package/dist/icons/registry.js +2 -1186
  237. package/dist/icons/registry.js.map +1 -1
  238. package/dist/index.js +10 -651
  239. package/dist/index.js.map +1 -1
  240. package/dist/lib/colors.js +1 -63
  241. package/dist/lib/colors.js.map +1 -1
  242. package/dist/lib/merge-config.js +1 -18
  243. package/dist/lib/merge-config.js.map +1 -1
  244. package/dist/lib/pagination.js +1 -24
  245. package/dist/lib/pagination.js.map +1 -1
  246. package/dist/lib/tag-surface.js +5 -613
  247. package/dist/lib/tag-surface.js.map +1 -1
  248. package/dist/lib/utils.js +2 -24
  249. package/dist/lib/utils.js.map +1 -1
  250. package/dist/res-card-template/format.d.ts +21 -0
  251. package/dist/res-card-template/format.js +3 -0
  252. package/dist/res-card-template/format.js.map +1 -0
  253. package/dist/res-card-template/icon.d.ts +38 -0
  254. package/dist/res-card-template/icon.js +3 -0
  255. package/dist/res-card-template/icon.js.map +1 -0
  256. package/dist/res-card-template/index.d.ts +4 -0
  257. package/dist/res-card-template/index.js +5 -0
  258. package/dist/res-card-template/index.js.map +1 -0
  259. package/dist/res-card-template/template.d.ts +48 -0
  260. package/dist/res-card-template/template.js +5 -0
  261. package/dist/res-card-template/template.js.map +1 -0
  262. package/dist/viewport.js +1 -11
  263. package/dist/viewport.js.map +1 -1
  264. package/package.json +9 -2
  265. package/src/components/image-crop-panel.dist.test.tsx +54 -0
  266. package/src/icons/registry.ts +8 -0
  267. package/src/res-card-template/format.test.ts +45 -0
  268. package/src/res-card-template/format.ts +36 -0
  269. package/src/res-card-template/icon.test.ts +100 -0
  270. package/src/res-card-template/icon.ts +86 -0
  271. package/src/res-card-template/index.ts +22 -0
  272. package/src/res-card-template/template.test.ts +457 -0
  273. package/src/res-card-template/template.ts +429 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/merge-config.ts","../../src/lib/utils.ts","../../src/components/button.tsx","../../src/icons/marks.tsx","../../src/components/checkbox.tsx","../../src/components/separator.tsx","../../src/components/filter-rail.tsx"],"names":["ButtonPrimitive","jsx","CheckboxPrimitive","SeparatorPrimitive"],"mappings":"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","file":"filter-rail.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","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","/**\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\nimport { Checkbox as CheckboxPrimitive } from \"@base-ui/react/checkbox\"\n\nimport { cn } from \"@hoardodile/ui/lib/utils\"\nimport { Check } from \"@hoardodile/ui/icons/marks\"\n\nfunction Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer relative flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-sm bg-muted outline-none group-has-disabled/field:opacity-50 focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:bg-destructive/20 aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-checked:bg-primary data-checked:text-primary-foreground\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current [&>svg]:size-3\"\n >\n <Check />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n}\n\nexport { Checkbox }\n","import { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\"\n\nimport { cn } from \"@hoardodile/ui/lib/utils\"\n\nexport type SeparatorSize = \"hairline\" | \"seam\"\n\n/**\n * Horizontal/vertical divider: hairlines are 1px and quiet; the 2px\n * `seam` tier marks only structural seams (tab bars, panel sections,\n * pinned action bars).\n */\nfunction Separator({\n className,\n orientation = \"horizontal\",\n size = \"hairline\",\n ...props\n}: SeparatorPrimitive.Props & {\n readonly size?: SeparatorSize\n}) {\n const thickness =\n size === \"seam\"\n ? \"data-horizontal:h-0.5 data-vertical:w-0.5\"\n : \"data-horizontal:h-px data-vertical:w-px\"\n return (\n <SeparatorPrimitive\n data-slot=\"separator\"\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-horizontal:w-full data-vertical:self-stretch\",\n thickness,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","import { Button } from \"@hoardodile/ui/components/button\"\nimport { Checkbox } from \"@hoardodile/ui/components/checkbox\"\nimport { Separator } from \"@hoardodile/ui/components/separator\"\nimport { cn } from \"@hoardodile/ui/lib/utils\"\nimport { type ReactNode, useId } from \"react\"\n\ntype FilterRailProps = {\n\t/** Rail title, e.g. \"Filters\". */\n\treadonly title: ReactNode\n\t/** Header link that resets every staged filter (applies immediately). */\n\treadonly clearAllLabel: ReactNode\n\treadonly onClearAll: () => void\n\t/** Footer apply button label, e.g. \"Show 24 resources\". */\n\treadonly resultLabel: ReactNode\n\treadonly onApply: () => void\n\t/** When false (live-search mode) the footer apply button is omitted. */\n\treadonly showApply?: boolean\n\t/**\n\t * Live-search toggle row above the apply button — checked means every\n\t * filter change applies immediately instead of staging. Rendered when\n\t * provided.\n\t */\n\treadonly liveSearch?: boolean\n\treadonly onLiveSearchChange?: (live: boolean) => void\n\treadonly liveSearchLabel?: ReactNode\n\treadonly children: ReactNode\n\treadonly className?: string\n}\n\n/**\n * Filter rail: the faceted filter surface on index pages. Lives in the\n * AppShell's right panel column on wide screens and in a route-owned\n * drawer below the panel breakpoint, so it always fills its parent's\n * height and scrolls its own sections.\n */\nexport function FilterRail(props: FilterRailProps) {\n\tconst {\n\t\ttitle,\n\t\tclearAllLabel,\n\t\tonClearAll,\n\t\tresultLabel,\n\t\tonApply,\n\t\tshowApply = true,\n\t\tliveSearch,\n\t\tonLiveSearchChange,\n\t\tliveSearchLabel,\n\t\tchildren,\n\t\tclassName,\n\t} = props\n\tconst liveToggleId = useId()\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"flex h-full w-full flex-col overflow-hidden\", className)}\n\t\t>\n\t\t\t<div className=\"flex items-baseline px-5 pt-5\">\n\t\t\t\t<span className=\"text-xs font-semibold tracking-label uppercase text-foreground\">\n\t\t\t\t\t{title}\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName=\"ml-auto cursor-pointer text-xs text-muted-foreground hover:text-secondary-foreground\"\n\t\t\t\t\tdata-testid=\"filter-rail-clear-all\"\n\t\t\t\t\tonClick={onClearAll}\n\t\t\t\t>\n\t\t\t\t\t{clearAllLabel}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-y-auto px-5 pb-5\">{children}</div>\n\t\t\t{liveSearch !== undefined ? (\n\t\t\t\t<>\n\t\t\t\t\t<Separator size=\"seam\" />\n\t\t\t\t\t<div className=\"mb-3 flex items-center justify-between px-5 pt-3\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\tid={liveToggleId}\n\t\t\t\t\t\t\t\tchecked={liveSearch}\n\t\t\t\t\t\t\t\tonCheckedChange={(v) => onLiveSearchChange?.(v === true)}\n\t\t\t\t\t\t\t\tdata-testid=\"live-search-toggle\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\thtmlFor={liveToggleId}\n\t\t\t\t\t\t\t\tclassName=\"cursor-pointer text-xs text-muted-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{liveSearchLabel}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t\t{showApply ? (\n\t\t\t\t<div className=\"mb-3 px-5\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"w-full justify-center\"\n\t\t\t\t\t\tonClick={onApply}\n\t\t\t\t\t\tdata-testid=\"filter-rail-apply\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{resultLabel}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t)\n}\n\ntype FilterRailSectionProps = {\n\t/** Section label (uppercase tracking-label); omitted for the\n\t label-less first panel section. */\n\treadonly label?: ReactNode\n\t/**\n\t * Pad the label and content (`px-5`) while the seam stays full-bleed —\n\t * detail panels whose sections take their own padding without touching\n\t * the edge-to-edge separators.\n\t */\n\treadonly padded?: boolean\n\treadonly children: ReactNode\n}\n\n/** One facet group; sections are separated by 2px structural seams. */\nexport function FilterRailSection(props: FilterRailSectionProps) {\n\tconst { label, children, padded = false } = props\n\treturn (\n\t\t<section className=\"mt-5 first:mt-4 first:pt-0 first:*:data-[slot=separator]:hidden\">\n\t\t\t<Separator size=\"seam\" className=\"mb-4\" />\n\t\t\t<div className={padded ? \"px-5\" : undefined}>\n\t\t\t\t{label !== undefined ? (\n\t\t\t\t\t<div className=\"text-xs font-semibold tracking-label uppercase text-foreground\">\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t\t{label !== undefined ? (\n\t\t\t\t\t<div className=\"mt-2 flex flex-col\">{children}</div>\n\t\t\t\t) : (\n\t\t\t\t\tchildren\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n"]}
1
+ {"version":3,"sources":["../../src/components/filter-rail.tsx"],"names":[],"mappings":"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","file":"filter-rail.js","sourcesContent":["import { Button } from \"@hoardodile/ui/components/button\"\nimport { Checkbox } from \"@hoardodile/ui/components/checkbox\"\nimport { Separator } from \"@hoardodile/ui/components/separator\"\nimport { cn } from \"@hoardodile/ui/lib/utils\"\nimport { type ReactNode, useId } from \"react\"\n\ntype FilterRailProps = {\n\t/** Rail title, e.g. \"Filters\". */\n\treadonly title: ReactNode\n\t/** Header link that resets every staged filter (applies immediately). */\n\treadonly clearAllLabel: ReactNode\n\treadonly onClearAll: () => void\n\t/** Footer apply button label, e.g. \"Show 24 resources\". */\n\treadonly resultLabel: ReactNode\n\treadonly onApply: () => void\n\t/** When false (live-search mode) the footer apply button is omitted. */\n\treadonly showApply?: boolean\n\t/**\n\t * Live-search toggle row above the apply button — checked means every\n\t * filter change applies immediately instead of staging. Rendered when\n\t * provided.\n\t */\n\treadonly liveSearch?: boolean\n\treadonly onLiveSearchChange?: (live: boolean) => void\n\treadonly liveSearchLabel?: ReactNode\n\treadonly children: ReactNode\n\treadonly className?: string\n}\n\n/**\n * Filter rail: the faceted filter surface on index pages. Lives in the\n * AppShell's right panel column on wide screens and in a route-owned\n * drawer below the panel breakpoint, so it always fills its parent's\n * height and scrolls its own sections.\n */\nexport function FilterRail(props: FilterRailProps) {\n\tconst {\n\t\ttitle,\n\t\tclearAllLabel,\n\t\tonClearAll,\n\t\tresultLabel,\n\t\tonApply,\n\t\tshowApply = true,\n\t\tliveSearch,\n\t\tonLiveSearchChange,\n\t\tliveSearchLabel,\n\t\tchildren,\n\t\tclassName,\n\t} = props\n\tconst liveToggleId = useId()\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"flex h-full w-full flex-col overflow-hidden\", className)}\n\t\t>\n\t\t\t<div className=\"flex items-baseline px-5 pt-5\">\n\t\t\t\t<span className=\"text-xs font-semibold tracking-label uppercase text-foreground\">\n\t\t\t\t\t{title}\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName=\"ml-auto cursor-pointer text-xs text-muted-foreground hover:text-secondary-foreground\"\n\t\t\t\t\tdata-testid=\"filter-rail-clear-all\"\n\t\t\t\t\tonClick={onClearAll}\n\t\t\t\t>\n\t\t\t\t\t{clearAllLabel}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-y-auto px-5 pb-5\">{children}</div>\n\t\t\t{liveSearch !== undefined ? (\n\t\t\t\t<>\n\t\t\t\t\t<Separator size=\"seam\" />\n\t\t\t\t\t<div className=\"mb-3 flex items-center justify-between px-5 pt-3\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\tid={liveToggleId}\n\t\t\t\t\t\t\t\tchecked={liveSearch}\n\t\t\t\t\t\t\t\tonCheckedChange={(v) => onLiveSearchChange?.(v === true)}\n\t\t\t\t\t\t\t\tdata-testid=\"live-search-toggle\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\thtmlFor={liveToggleId}\n\t\t\t\t\t\t\t\tclassName=\"cursor-pointer text-xs text-muted-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{liveSearchLabel}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t\t{showApply ? (\n\t\t\t\t<div className=\"mb-3 px-5\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"w-full justify-center\"\n\t\t\t\t\t\tonClick={onApply}\n\t\t\t\t\t\tdata-testid=\"filter-rail-apply\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{resultLabel}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t)\n}\n\ntype FilterRailSectionProps = {\n\t/** Section label (uppercase tracking-label); omitted for the\n\t label-less first panel section. */\n\treadonly label?: ReactNode\n\t/**\n\t * Pad the label and content (`px-5`) while the seam stays full-bleed —\n\t * detail panels whose sections take their own padding without touching\n\t * the edge-to-edge separators.\n\t */\n\treadonly padded?: boolean\n\treadonly children: ReactNode\n}\n\n/** One facet group; sections are separated by 2px structural seams. */\nexport function FilterRailSection(props: FilterRailSectionProps) {\n\tconst { label, children, padded = false } = props\n\treturn (\n\t\t<section className=\"mt-5 first:mt-4 first:pt-0 first:*:data-[slot=separator]:hidden\">\n\t\t\t<Separator size=\"seam\" className=\"mb-4\" />\n\t\t\t<div className={padded ? \"px-5\" : undefined}>\n\t\t\t\t{label !== undefined ? (\n\t\t\t\t\t<div className=\"text-xs font-semibold tracking-label uppercase text-foreground\">\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t\t{label !== undefined ? (\n\t\t\t\t\t<div className=\"mt-2 flex flex-col\">{children}</div>\n\t\t\t\t) : (\n\t\t\t\t\tchildren\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n"]}
@@ -1,26 +1,7 @@
1
- import { clsx } from 'clsx';
2
- import { extendTailwindMerge } from 'tailwind-merge';
1
+ import { cn } from '../chunk-M5OJN54O.js';
2
+ import '../chunk-2HWSCY4T.js';
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
 
5
- // src/lib/utils.ts
6
- var mergeTheme = {
7
- text: ["tiny", "ui", "doc", "doc-title", "doc-heading", "quote"],
8
- spacing: ["chip", "control", "nav", "sidebar", "panel"],
9
- tracking: ["label"],
10
- shadow: ["card", "dialog"],
11
- container: ["reading", "medium", "content"],
12
- font: ["doc", "heading"],
13
- ease: ["standard"],
14
- animate: ["skel", "pop"]
15
- };
16
- var twMerge = extendTailwindMerge({
17
- extend: { theme: mergeTheme }
18
- });
19
-
20
- // src/lib/utils.ts
21
- function cn(...inputs) {
22
- return twMerge(clsx(inputs));
23
- }
24
5
  function FixedActionBar(props) {
25
6
  return /* @__PURE__ */ jsxs(
26
7
  "div",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/merge-config.ts","../../src/lib/utils.ts","../../src/components/fixed-action-bar.tsx"],"names":[],"mappings":";;;;;AAQO,IAAM,UAAA,GAAa;AAAA,EACzB,MAAM,CAAC,MAAA,EAAQ,MAAM,KAAA,EAAO,WAAA,EAAa,eAAe,OAAO,CAAA;AAAA,EAC/D,SAAS,CAAC,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,WAAW,OAAO,CAAA;AAAA,EACtD,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,EAClB,MAAA,EAAQ,CAAC,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACzB,SAAA,EAAW,CAAC,SAAA,EAAW,QAAA,EAAU,SAAS,CAAA;AAAA,EAC1C,IAAA,EAAM,CAAC,KAAA,EAAO,SAAS,CAAA;AAAA,EACvB,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,OAAA,EAAS,CAAC,MAAA,EAAQ,KAAK;AACxB,CAAA;AAEO,IAAM,UAAU,mBAAA,CAAoB;AAAA,EAC1C,MAAA,EAAQ,EAAE,KAAA,EAAO,UAAA;AAClB,CAAC,CAAA;;;AClBM,SAAS,MAAM,MAAA,EAAsB;AAC3C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC5B;ACiBO,SAAS,eAAe,KAAA,EAA4B;AAC1D,EAAA,uBACC,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,wHAAA;AAAA,QACA,KAAA,CAAM;AAAA,OACP;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACd,QAAA,kBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA,KAAA,CAAM,QAAA,KAAa,MAAA,mBACnB,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACA,SAAA,EAAU,+EAAA;AAAA,YACV,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,CAAA,CAAA;AAAI;AAAA,SACtC,GACG,MACL,CAAA,EACD,CAAA;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6FAAA,EACb,gBAAM,QAAA,EACR;AAAA;AAAA;AAAA,GACD;AAEF","file":"fixed-action-bar.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","import { cn } from \"@hoardodile/ui/lib/utils\"\nimport type { ReactNode } from \"react\"\n\ntype FixedActionBarProps = {\n\treadonly children: ReactNode\n\treadonly className?: string\n\t/**\n\t * 0–100 shows the 2px top progress strip while an upload is staging;\n\t * omit when idle. The track doubles as the seam.\n\t */\n\treadonly progress?: number\n}\n\n/**\n * Fixed bottom action bar for long forms. Pinned to the viewport bottom\n * so the submit control is always reachable, starting after the sidebar\n * on md+; the top progress strip separates it from scrolling content (a\n * quiet muted track when idle, a foreground fill while staging). The\n * inner row mirrors PageScaffold's gutters and centers at `max-w-content`,\n * so the buttons right-align with the page column's edge. Forms using it\n * reserve clearance with bottom padding.\n */\nexport function FixedActionBar(props: FixedActionBarProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed inset-x-0 bottom-0 z-40 bg-background/90 backdrop-blur supports-backdrop-filter:bg-background/60 md:left-sidebar\",\n\t\t\t\tprops.className,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"mx-auto w-full max-w-content\">\n\t\t\t\t<div className=\"h-0.5 bg-muted\">\n\t\t\t\t\t{props.progress !== undefined ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"h-full bg-foreground transition-[width] duration-(--duration-2) ease-standard\"\n\t\t\t\t\t\t\tstyle={{ width: `${props.progress}%` }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"mx-auto flex w-full max-w-content items-center justify-end gap-2 px-3 py-4 sm:px-6 lg:px-10\">\n\t\t\t\t{props.children}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"]}
1
+ {"version":3,"sources":["../../src/components/fixed-action-bar.tsx"],"names":[],"mappings":";;;;AAsBO,SAAS,eAAe,KAAA,EAA4B;AAC1D,EAAA,uBACC,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,wHAAA;AAAA,QACA,KAAA,CAAM;AAAA,OACP;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACd,QAAA,kBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA,KAAA,CAAM,QAAA,KAAa,MAAA,mBACnB,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACA,SAAA,EAAU,+EAAA;AAAA,YACV,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,CAAA,CAAA;AAAI;AAAA,SACtC,GACG,MACL,CAAA,EACD,CAAA;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6FAAA,EACb,gBAAM,QAAA,EACR;AAAA;AAAA;AAAA,GACD;AAEF","file":"fixed-action-bar.js","sourcesContent":["import { cn } from \"@hoardodile/ui/lib/utils\"\nimport type { ReactNode } from \"react\"\n\ntype FixedActionBarProps = {\n\treadonly children: ReactNode\n\treadonly className?: string\n\t/**\n\t * 0–100 shows the 2px top progress strip while an upload is staging;\n\t * omit when idle. The track doubles as the seam.\n\t */\n\treadonly progress?: number\n}\n\n/**\n * Fixed bottom action bar for long forms. Pinned to the viewport bottom\n * so the submit control is always reachable, starting after the sidebar\n * on md+; the top progress strip separates it from scrolling content (a\n * quiet muted track when idle, a foreground fill while staging). The\n * inner row mirrors PageScaffold's gutters and centers at `max-w-content`,\n * so the buttons right-align with the page column's edge. Forms using it\n * reserve clearance with bottom padding.\n */\nexport function FixedActionBar(props: FixedActionBarProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed inset-x-0 bottom-0 z-40 bg-background/90 backdrop-blur supports-backdrop-filter:bg-background/60 md:left-sidebar\",\n\t\t\t\tprops.className,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"mx-auto w-full max-w-content\">\n\t\t\t\t<div className=\"h-0.5 bg-muted\">\n\t\t\t\t\t{props.progress !== undefined ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"h-full bg-foreground transition-[width] duration-(--duration-2) ease-standard\"\n\t\t\t\t\t\t\tstyle={{ width: `${props.progress}%` }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"mx-auto flex w-full max-w-content items-center justify-end gap-2 px-3 py-4 sm:px-6 lg:px-10\">\n\t\t\t\t{props.children}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"]}