@hoardodile/ui 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +70 -0
  3. package/dist/components/alert.d.ts +13 -0
  4. package/dist/components/alert.js +97 -0
  5. package/dist/components/alert.js.map +1 -0
  6. package/dist/components/app-dialog.d.ts +62 -0
  7. package/dist/components/app-dialog.js +656 -0
  8. package/dist/components/app-dialog.js.map +1 -0
  9. package/dist/components/badge.d.ts +11 -0
  10. package/dist/components/badge.js +70 -0
  11. package/dist/components/badge.js.map +1 -0
  12. package/dist/components/breadcrumb.d.ts +12 -0
  13. package/dist/components/breadcrumb.js +617 -0
  14. package/dist/components/breadcrumb.js.map +1 -0
  15. package/dist/components/button.d.ts +17 -0
  16. package/dist/components/button.js +78 -0
  17. package/dist/components/button.js.map +1 -0
  18. package/dist/components/caption-bar.d.ts +44 -0
  19. package/dist/components/caption-bar.js +827 -0
  20. package/dist/components/caption-bar.js.map +1 -0
  21. package/dist/components/chart-card.d.ts +15 -0
  22. package/dist/components/chart-card.js +27 -0
  23. package/dist/components/chart-card.js.map +1 -0
  24. package/dist/components/checkbox.d.ts +6 -0
  25. package/dist/components/checkbox.js +76 -0
  26. package/dist/components/checkbox.js.map +1 -0
  27. package/dist/components/chip-button.d.ts +28 -0
  28. package/dist/components/chip-button.js +87 -0
  29. package/dist/components/chip-button.js.map +1 -0
  30. package/dist/components/close-confirm-dialog.d.ts +19 -0
  31. package/dist/components/close-confirm-dialog.js +743 -0
  32. package/dist/components/close-confirm-dialog.js.map +1 -0
  33. package/dist/components/color-picker.d.ts +32 -0
  34. package/dist/components/color-picker.js +667 -0
  35. package/dist/components/color-picker.js.map +1 -0
  36. package/dist/components/combobox.d.ts +32 -0
  37. package/dist/components/combobox.js +1211 -0
  38. package/dist/components/combobox.js.map +1 -0
  39. package/dist/components/confirm-by-typing-dialog.d.ts +48 -0
  40. package/dist/components/confirm-by-typing-dialog.js +759 -0
  41. package/dist/components/confirm-by-typing-dialog.js.map +1 -0
  42. package/dist/components/confirm-dialog.d.ts +34 -0
  43. package/dist/components/confirm-dialog.js +710 -0
  44. package/dist/components/confirm-dialog.js.map +1 -0
  45. package/dist/components/count-badge.d.ts +13 -0
  46. package/dist/components/count-badge.js +39 -0
  47. package/dist/components/count-badge.js.map +1 -0
  48. package/dist/components/dialog.d.ts +40 -0
  49. package/dist/components/dialog.js +571 -0
  50. package/dist/components/dialog.js.map +1 -0
  51. package/dist/components/dropdown-menu.d.ts +45 -0
  52. package/dist/components/dropdown-menu.js +1003 -0
  53. package/dist/components/dropdown-menu.js.map +1 -0
  54. package/dist/components/dropdown-select.d.ts +29 -0
  55. package/dist/components/dropdown-select.js +1036 -0
  56. package/dist/components/dropdown-select.js.map +1 -0
  57. package/dist/components/empty.d.ts +15 -0
  58. package/dist/components/empty.js +119 -0
  59. package/dist/components/empty.js.map +1 -0
  60. package/dist/components/filter-rail.d.ts +48 -0
  61. package/dist/components/filter-rail.js +231 -0
  62. package/dist/components/filter-rail.js.map +1 -0
  63. package/dist/components/fixed-action-bar.d.ts +24 -0
  64. package/dist/components/fixed-action-bar.js +48 -0
  65. package/dist/components/fixed-action-bar.js.map +1 -0
  66. package/dist/components/font-picker.d.ts +45 -0
  67. package/dist/components/font-picker.js +759 -0
  68. package/dist/components/font-picker.js.map +1 -0
  69. package/dist/components/form.d.ts +17 -0
  70. package/dist/components/form.js +150 -0
  71. package/dist/components/form.js.map +1 -0
  72. package/dist/components/group-label.d.ts +12 -0
  73. package/dist/components/group-label.js +10 -0
  74. package/dist/components/group-label.js.map +1 -0
  75. package/dist/components/icon-tile.d.ts +16 -0
  76. package/dist/components/icon-tile.js +67 -0
  77. package/dist/components/icon-tile.js.map +1 -0
  78. package/dist/components/icon-toggle.d.ts +24 -0
  79. package/dist/components/icon-toggle.js +81 -0
  80. package/dist/components/icon-toggle.js.map +1 -0
  81. package/dist/components/icon.d.ts +2 -0
  82. package/dist/components/icon.js +49 -0
  83. package/dist/components/icon.js.map +1 -0
  84. package/dist/components/image-crop-panel.d.ts +80 -0
  85. package/dist/components/image-crop-panel.js +1104 -0
  86. package/dist/components/image-crop-panel.js.map +1 -0
  87. package/dist/components/image-cropper.d.ts +63 -0
  88. package/dist/components/image-cropper.js +166 -0
  89. package/dist/components/image-cropper.js.map +1 -0
  90. package/dist/components/input-group.d.ts +22 -0
  91. package/dist/components/input-group.js +270 -0
  92. package/dist/components/input-group.js.map +1 -0
  93. package/dist/components/input.d.ts +16 -0
  94. package/dist/components/input.js +60 -0
  95. package/dist/components/input.js.map +1 -0
  96. package/dist/components/label.d.ts +5 -0
  97. package/dist/components/label.js +40 -0
  98. package/dist/components/label.js.map +1 -0
  99. package/dist/components/list-empty-row.d.ts +16 -0
  100. package/dist/components/list-empty-row.js +40 -0
  101. package/dist/components/list-empty-row.js.map +1 -0
  102. package/dist/components/management-empty.d.ts +14 -0
  103. package/dist/components/management-empty.js +40 -0
  104. package/dist/components/management-empty.js.map +1 -0
  105. package/dist/components/management-skeleton.d.ts +11 -0
  106. package/dist/components/management-skeleton.js +72 -0
  107. package/dist/components/management-skeleton.js.map +1 -0
  108. package/dist/components/meta-chip.d.ts +17 -0
  109. package/dist/components/meta-chip.js +49 -0
  110. package/dist/components/meta-chip.js.map +1 -0
  111. package/dist/components/mobile-drawer.d.ts +29 -0
  112. package/dist/components/mobile-drawer.js +331 -0
  113. package/dist/components/mobile-drawer.js.map +1 -0
  114. package/dist/components/page-header.d.ts +20 -0
  115. package/dist/components/page-header.js +44 -0
  116. package/dist/components/page-header.js.map +1 -0
  117. package/dist/components/page-scaffold.d.ts +34 -0
  118. package/dist/components/page-scaffold.js +157 -0
  119. package/dist/components/page-scaffold.js.map +1 -0
  120. package/dist/components/pagination-bar.d.ts +22 -0
  121. package/dist/components/pagination-bar.js +703 -0
  122. package/dist/components/pagination-bar.js.map +1 -0
  123. package/dist/components/pagination.d.ts +22 -0
  124. package/dist/components/pagination.js +680 -0
  125. package/dist/components/pagination.js.map +1 -0
  126. package/dist/components/panel-toolbar.d.ts +37 -0
  127. package/dist/components/panel-toolbar.js +781 -0
  128. package/dist/components/panel-toolbar.js.map +1 -0
  129. package/dist/components/pill-tabs.d.ts +33 -0
  130. package/dist/components/pill-tabs.js +66 -0
  131. package/dist/components/pill-tabs.js.map +1 -0
  132. package/dist/components/plugin-download-consent.d.ts +52 -0
  133. package/dist/components/plugin-download-consent.js +780 -0
  134. package/dist/components/plugin-download-consent.js.map +1 -0
  135. package/dist/components/popover.d.ts +26 -0
  136. package/dist/components/popover.js +343 -0
  137. package/dist/components/popover.js.map +1 -0
  138. package/dist/components/progress.d.ts +10 -0
  139. package/dist/components/progress.js +103 -0
  140. package/dist/components/progress.js.map +1 -0
  141. package/dist/components/query-state-view.d.ts +36 -0
  142. package/dist/components/query-state-view.js +17 -0
  143. package/dist/components/query-state-view.js.map +1 -0
  144. package/dist/components/radio-group.d.ts +8 -0
  145. package/dist/components/radio-group.js +60 -0
  146. package/dist/components/radio-group.js.map +1 -0
  147. package/dist/components/scroll-area.d.ts +7 -0
  148. package/dist/components/scroll-area.js +80 -0
  149. package/dist/components/scroll-area.js.map +1 -0
  150. package/dist/components/search-field.d.ts +49 -0
  151. package/dist/components/search-field.js +586 -0
  152. package/dist/components/search-field.js.map +1 -0
  153. package/dist/components/secondary-stat.d.ts +13 -0
  154. package/dist/components/secondary-stat.js +56 -0
  155. package/dist/components/secondary-stat.js.map +1 -0
  156. package/dist/components/section-header.d.ts +23 -0
  157. package/dist/components/section-header.js +76 -0
  158. package/dist/components/section-header.js.map +1 -0
  159. package/dist/components/section-label.d.ts +20 -0
  160. package/dist/components/section-label.js +46 -0
  161. package/dist/components/section-label.js.map +1 -0
  162. package/dist/components/section-tabs.d.ts +47 -0
  163. package/dist/components/section-tabs.js +145 -0
  164. package/dist/components/section-tabs.js.map +1 -0
  165. package/dist/components/separator.d.ts +14 -0
  166. package/dist/components/separator.js +49 -0
  167. package/dist/components/separator.js.map +1 -0
  168. package/dist/components/sheet.d.ts +22 -0
  169. package/dist/components/sheet.js +469 -0
  170. package/dist/components/sheet.js.map +1 -0
  171. package/dist/components/sidebar.d.ts +69 -0
  172. package/dist/components/sidebar.js +1645 -0
  173. package/dist/components/sidebar.js.map +1 -0
  174. package/dist/components/skeleton.d.ts +8 -0
  175. package/dist/components/skeleton.js +41 -0
  176. package/dist/components/skeleton.js.map +1 -0
  177. package/dist/components/slider.d.ts +6 -0
  178. package/dist/components/slider.js +75 -0
  179. package/dist/components/slider.js.map +1 -0
  180. package/dist/components/sortable-chip-list.d.ts +26 -0
  181. package/dist/components/sortable-chip-list.js +59 -0
  182. package/dist/components/sortable-chip-list.js.map +1 -0
  183. package/dist/components/spinner.d.ts +5 -0
  184. package/dist/components/spinner.js +65 -0
  185. package/dist/components/spinner.js.map +1 -0
  186. package/dist/components/surface.d.ts +13 -0
  187. package/dist/components/surface.js +51 -0
  188. package/dist/components/surface.js.map +1 -0
  189. package/dist/components/switch.d.ts +8 -0
  190. package/dist/components/switch.js +53 -0
  191. package/dist/components/switch.js.map +1 -0
  192. package/dist/components/table.d.ts +12 -0
  193. package/dist/components/table.js +129 -0
  194. package/dist/components/table.js.map +1 -0
  195. package/dist/components/textarea.d.ts +15 -0
  196. package/dist/components/textarea.js +58 -0
  197. package/dist/components/textarea.js.map +1 -0
  198. package/dist/components/toast.d.ts +19 -0
  199. package/dist/components/toast.js +805 -0
  200. package/dist/components/toast.js.map +1 -0
  201. package/dist/components/toggle.d.ts +12 -0
  202. package/dist/components/toggle.js +63 -0
  203. package/dist/components/toggle.js.map +1 -0
  204. package/dist/components/tooltip.d.ts +9 -0
  205. package/dist/components/tooltip.js +82 -0
  206. package/dist/components/tooltip.js.map +1 -0
  207. package/dist/hooks/use-dialog-footer-actions.d.ts +18 -0
  208. package/dist/hooks/use-dialog-footer-actions.js +11 -0
  209. package/dist/hooks/use-dialog-footer-actions.js.map +1 -0
  210. package/dist/hooks/use-form-field.d.ts +33 -0
  211. package/dist/hooks/use-form-field.js +36 -0
  212. package/dist/hooks/use-form-field.js.map +1 -0
  213. package/dist/hooks/use-mobile.d.ts +34 -0
  214. package/dist/hooks/use-mobile.js +29 -0
  215. package/dist/hooks/use-mobile.js.map +1 -0
  216. package/dist/hooks/use-pinch-pan.d.ts +56 -0
  217. package/dist/hooks/use-pinch-pan.js +223 -0
  218. package/dist/hooks/use-pinch-pan.js.map +1 -0
  219. package/dist/hooks/useMobileBackToClose.d.ts +61 -0
  220. package/dist/hooks/useMobileBackToClose.js +234 -0
  221. package/dist/hooks/useMobileBackToClose.js.map +1 -0
  222. package/dist/icon-BOgL5bpL.d.ts +85 -0
  223. package/dist/icons/actions.d.ts +4 -0
  224. package/dist/icons/actions.js +520 -0
  225. package/dist/icons/actions.js.map +1 -0
  226. package/dist/icons/icon-style.d.ts +2 -0
  227. package/dist/icons/icon-style.js +51 -0
  228. package/dist/icons/icon-style.js.map +1 -0
  229. package/dist/icons/marks.d.ts +15 -0
  230. package/dist/icons/marks.js +48 -0
  231. package/dist/icons/marks.js.map +1 -0
  232. package/dist/icons/registry.d.ts +177 -0
  233. package/dist/icons/registry.js +1180 -0
  234. package/dist/icons/registry.js.map +1 -0
  235. package/dist/index.d.ts +6 -0
  236. package/dist/index.js +653 -0
  237. package/dist/index.js.map +1 -0
  238. package/dist/lib/merge-config.d.ts +15 -0
  239. package/dist/lib/merge-config.js +20 -0
  240. package/dist/lib/merge-config.js.map +1 -0
  241. package/dist/lib/pagination.d.ts +19 -0
  242. package/dist/lib/pagination.js +26 -0
  243. package/dist/lib/pagination.js.map +1 -0
  244. package/dist/lib/utils.d.ts +5 -0
  245. package/dist/lib/utils.js +26 -0
  246. package/dist/lib/utils.js.map +1 -0
  247. package/dist/styles/theme.css +480 -0
  248. package/dist/styles/theme.css.map +1 -0
  249. package/dist/styles/theme.d.ts +2 -0
  250. package/dist/viewport.d.ts +64 -0
  251. package/dist/viewport.js +13 -0
  252. package/dist/viewport.js.map +1 -0
  253. package/package.json +122 -0
  254. package/src/components/alert.tsx +76 -0
  255. package/src/components/app-dialog.tsx +187 -0
  256. package/src/components/badge.tsx +52 -0
  257. package/src/components/breadcrumb.tsx +129 -0
  258. package/src/components/button.tsx +70 -0
  259. package/src/components/caption-bar.test.tsx +151 -0
  260. package/src/components/caption-bar.tsx +392 -0
  261. package/src/components/chart-card.tsx +31 -0
  262. package/src/components/checkbox.tsx +28 -0
  263. package/src/components/chip-button.tsx +69 -0
  264. package/src/components/close-confirm-dialog.tsx +99 -0
  265. package/src/components/color-picker.tsx +186 -0
  266. package/src/components/combobox.tsx +335 -0
  267. package/src/components/confirm-by-typing-dialog.tsx +130 -0
  268. package/src/components/confirm-dialog.test.tsx +39 -0
  269. package/src/components/confirm-dialog.tsx +98 -0
  270. package/src/components/count-badge.tsx +23 -0
  271. package/src/components/dialog.tsx +315 -0
  272. package/src/components/dropdown-menu.tsx +311 -0
  273. package/src/components/dropdown-select.tsx +211 -0
  274. package/src/components/empty.tsx +104 -0
  275. package/src/components/filter-rail.tsx +139 -0
  276. package/src/components/fixed-action-bar.tsx +46 -0
  277. package/src/components/font-picker.tsx +257 -0
  278. package/src/components/form.tsx +127 -0
  279. package/src/components/group-label.tsx +13 -0
  280. package/src/components/icon-tile.tsx +35 -0
  281. package/src/components/icon-toggle.tsx +57 -0
  282. package/src/components/icon.tsx +66 -0
  283. package/src/components/image-crop-panel.test.tsx +167 -0
  284. package/src/components/image-crop-panel.tsx +465 -0
  285. package/src/components/image-cropper.test.tsx +144 -0
  286. package/src/components/image-cropper.tsx +265 -0
  287. package/src/components/input-group.tsx +156 -0
  288. package/src/components/input.tsx +45 -0
  289. package/src/components/label.tsx +20 -0
  290. package/src/components/list-empty-row.tsx +27 -0
  291. package/src/components/management-empty.tsx +25 -0
  292. package/src/components/management-skeleton.tsx +23 -0
  293. package/src/components/meta-chip.tsx +40 -0
  294. package/src/components/mobile-drawer.test.tsx +52 -0
  295. package/src/components/mobile-drawer.tsx +98 -0
  296. package/src/components/page-header.tsx +47 -0
  297. package/src/components/page-scaffold.test.tsx +24 -0
  298. package/src/components/page-scaffold.tsx +131 -0
  299. package/src/components/pagination-bar.test.tsx +87 -0
  300. package/src/components/pagination-bar.tsx +139 -0
  301. package/src/components/pagination.tsx +139 -0
  302. package/src/components/panel-toolbar.tsx +99 -0
  303. package/src/components/pill-tabs.test.tsx +84 -0
  304. package/src/components/pill-tabs.tsx +77 -0
  305. package/src/components/plugin-download-consent.test.tsx +90 -0
  306. package/src/components/plugin-download-consent.tsx +183 -0
  307. package/src/components/popover.tsx +133 -0
  308. package/src/components/progress.tsx +88 -0
  309. package/src/components/query-state-view.tsx +47 -0
  310. package/src/components/radio-group.tsx +36 -0
  311. package/src/components/scroll-area.tsx +52 -0
  312. package/src/components/search-field.test.tsx +86 -0
  313. package/src/components/search-field.tsx +119 -0
  314. package/src/components/secondary-stat.tsx +24 -0
  315. package/src/components/section-header.tsx +54 -0
  316. package/src/components/section-label.tsx +40 -0
  317. package/src/components/section-tabs.test.tsx +154 -0
  318. package/src/components/section-tabs.tsx +190 -0
  319. package/src/components/separator.tsx +38 -0
  320. package/src/components/sheet.tsx +170 -0
  321. package/src/components/sidebar.tsx +725 -0
  322. package/src/components/skeleton.tsx +18 -0
  323. package/src/components/slider.tsx +52 -0
  324. package/src/components/sortable-chip-list.tsx +56 -0
  325. package/src/components/spinner.tsx +35 -0
  326. package/src/components/surface.tsx +37 -0
  327. package/src/components/switch.tsx +30 -0
  328. package/src/components/table.tsx +116 -0
  329. package/src/components/textarea.tsx +41 -0
  330. package/src/components/toast.tsx +239 -0
  331. package/src/components/toggle.tsx +45 -0
  332. package/src/components/tooltip.tsx +64 -0
  333. package/src/hooks/use-dialog-footer-actions.ts +23 -0
  334. package/src/hooks/use-form-field.ts +62 -0
  335. package/src/hooks/use-mobile.ts +54 -0
  336. package/src/hooks/use-pinch-pan.test.tsx +42 -0
  337. package/src/hooks/use-pinch-pan.ts +340 -0
  338. package/src/hooks/useMobileBackToClose.test.tsx +140 -0
  339. package/src/hooks/useMobileBackToClose.ts +508 -0
  340. package/src/icons/actions.ts +10 -0
  341. package/src/icons/icon-style.test.tsx +69 -0
  342. package/src/icons/icon-style.ts +104 -0
  343. package/src/icons/marks.tsx +72 -0
  344. package/src/icons/registry.test.ts +65 -0
  345. package/src/icons/registry.ts +1163 -0
  346. package/src/index.ts +22 -0
  347. package/src/lib/merge-config.test.ts +109 -0
  348. package/src/lib/merge-config.ts +22 -0
  349. package/src/lib/pagination.test.ts +55 -0
  350. package/src/lib/pagination.ts +42 -0
  351. package/src/lib/utils.ts +6 -0
  352. package/src/styles/scan-contract.test.ts +74 -0
  353. package/src/styles/theme.css +798 -0
  354. package/src/test/i18n.tsx +22 -0
  355. package/src/test/setup.ts +104 -0
  356. package/src/viewport.ts +69 -0
@@ -0,0 +1,145 @@
1
+ import { clsx } from 'clsx';
2
+ import { extendTailwindMerge } from 'tailwind-merge';
3
+ import { useId, useRef, Fragment } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ // src/lib/utils.ts
7
+ var mergeTheme = {
8
+ text: ["tiny", "ui", "doc", "doc-title", "doc-heading", "quote"],
9
+ spacing: ["chip", "control", "nav", "sidebar", "panel"],
10
+ tracking: ["label"],
11
+ shadow: ["card", "dialog"],
12
+ container: ["reading", "medium", "content"],
13
+ font: ["doc", "heading"],
14
+ ease: ["standard"],
15
+ animate: ["skel", "pop"]
16
+ };
17
+ var twMerge = extendTailwindMerge({
18
+ extend: { theme: mergeTheme }
19
+ });
20
+
21
+ // src/lib/utils.ts
22
+ function cn(...inputs) {
23
+ return twMerge(clsx(inputs));
24
+ }
25
+ var TRIGGER_CLASSES = "relative inline-flex shrink-0 items-center justify-center gap-1.5 whitespace-nowrap rounded-none border-0 bg-transparent px-0.5 pt-1 pb-3 text-xs font-semibold uppercase tracking-[0.1em] text-muted-foreground transition-colors hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 after:absolute after:inset-x-0 after:-bottom-[2px] after:h-0.5 after:bg-foreground after:opacity-0 after:transition-opacity";
26
+ function triggerClassName(active) {
27
+ return cn(TRIGGER_CLASSES, active && "text-foreground after:opacity-100");
28
+ }
29
+ function SectionTabs(props) {
30
+ const {
31
+ value,
32
+ items,
33
+ onChange,
34
+ className,
35
+ panelClassName,
36
+ listClassName,
37
+ controls,
38
+ ariaLabel
39
+ } = props;
40
+ const baseId = useId();
41
+ const listRef = useRef(null);
42
+ const activeIndex = items.findIndex((item) => item.value === value);
43
+ const activeItem = activeIndex >= 0 ? items[activeIndex] : void 0;
44
+ function activate(next) {
45
+ if (next !== value) onChange?.(next);
46
+ }
47
+ function focusTriggerAt(index) {
48
+ const trigger = listRef.current?.querySelectorAll('[role="tab"]')[index];
49
+ trigger?.focus();
50
+ }
51
+ function handleKeyDown(event) {
52
+ const from = activeIndex < 0 ? 0 : activeIndex;
53
+ const count = items.length;
54
+ let nextIndex;
55
+ switch (event.key) {
56
+ case "ArrowRight":
57
+ nextIndex = (from + 1) % count;
58
+ break;
59
+ case "ArrowLeft":
60
+ nextIndex = (from - 1 + count) % count;
61
+ break;
62
+ case "Home":
63
+ nextIndex = 0;
64
+ break;
65
+ case "End":
66
+ nextIndex = count - 1;
67
+ break;
68
+ default:
69
+ return;
70
+ }
71
+ event.preventDefault();
72
+ const next = items[nextIndex];
73
+ if (next === void 0) return;
74
+ activate(next.value);
75
+ focusTriggerAt(nextIndex);
76
+ }
77
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-col gap-2", className), children: [
78
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-6", children: [
79
+ /* @__PURE__ */ jsx(
80
+ "div",
81
+ {
82
+ ref: listRef,
83
+ role: "tablist",
84
+ "aria-label": ariaLabel,
85
+ className: cn(
86
+ // The 2px strong edge is an inset shadow over the bottom
87
+ // padding zone: the active underline (positioned 2px
88
+ // below the trigger) lands inside the padding box —
89
+ // a border would be outside it and get clipped by the
90
+ // scroll list's overflow-y-hidden. The color reads the
91
+ // runtime palette variable directly (what border-border
92
+ // compiles to), not the @theme mirror — the mirror
93
+ // lives in a cascade layer and is not reliable here.
94
+ "flex min-w-0 flex-1 items-center gap-6 overflow-x-auto overflow-y-hidden no-scrollbar pb-0.5 shadow-[inset_0_-2px_0_0_var(--border)]",
95
+ listClassName
96
+ ),
97
+ children: items.map((item, index) => {
98
+ const active = item.value === value;
99
+ const triggerProps = {
100
+ id: `${baseId}-tab-${index}`,
101
+ role: "tab",
102
+ tabIndex: active ? 0 : -1,
103
+ "aria-selected": active,
104
+ "aria-controls": item.panel !== void 0 ? `${baseId}-panel-${index}` : void 0,
105
+ "data-testid": item.testId,
106
+ onKeyDown: handleKeyDown
107
+ };
108
+ if (item.render !== void 0) {
109
+ return /* @__PURE__ */ jsx(Fragment, { children: item.render(active, triggerClassName(active), triggerProps) }, item.value);
110
+ }
111
+ return /* @__PURE__ */ jsx(
112
+ "button",
113
+ {
114
+ type: "button",
115
+ ...triggerProps,
116
+ onClick: () => activate(item.value),
117
+ className: triggerClassName(active),
118
+ children: item.label
119
+ },
120
+ item.value
121
+ );
122
+ })
123
+ }
124
+ ),
125
+ controls
126
+ ] }),
127
+ activeItem?.panel !== void 0 ? /* @__PURE__ */ jsx(
128
+ "div",
129
+ {
130
+ role: "tabpanel",
131
+ id: `${baseId}-panel-${activeIndex}`,
132
+ "aria-labelledby": `${baseId}-tab-${activeIndex}`,
133
+ className: cn(
134
+ "flex-1 text-sm outline-none",
135
+ activeItem.panelClassName ?? panelClassName ?? "mt-4"
136
+ ),
137
+ children: activeItem.panel
138
+ }
139
+ ) : null
140
+ ] });
141
+ }
142
+
143
+ export { SectionTabs };
144
+ //# sourceMappingURL=section-tabs.js.map
145
+ //# sourceMappingURL=section-tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/merge-config.ts","../../src/lib/utils.ts","../../src/components/section-tabs.tsx"],"names":[],"mappings":"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","file":"section-tabs.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 {\n\tFragment,\n\ttype KeyboardEvent,\n\ttype ReactNode,\n\tuseId,\n\tuseRef,\n} from \"react\"\n\nexport type SectionTabTriggerProps = {\n\treadonly id: string\n\treadonly role: \"tab\"\n\treadonly tabIndex: number\n\treadonly \"aria-selected\": boolean\n\treadonly \"aria-controls\": string | undefined\n\treadonly \"data-testid\": string | undefined\n\treadonly onKeyDown: (event: KeyboardEvent<HTMLElement>) => void\n}\n\nexport type SectionTabItem<T extends string> = {\n\treadonly value: T\n\treadonly label: ReactNode\n\treadonly testId?: string\n\t/** Replaces the trigger element (e.g. a router Link) — receives the\n\t active state, the trigger classes and the ARIA/keyboard props to\n\t spread onto the element. */\n\treadonly render?: (\n\t\tactive: boolean,\n\t\tclassName: string,\n\t\ttrigger: SectionTabTriggerProps,\n\t) => ReactNode\n\t/** Content panel; mounted only while the tab is active. */\n\treadonly panel?: ReactNode\n\t/** Panel wrapper classes, replacing the default `mt-4`. */\n\treadonly panelClassName?: string\n}\n\nexport type SectionTabsProps<T extends string> = {\n\treadonly value: T\n\treadonly items: readonly SectionTabItem<T>[]\n\treadonly onChange?: (value: T) => void\n\treadonly className?: string\n\treadonly panelClassName?: string\n\t/** Overrides for the tab bar itself (e.g. an indented side-panel bar). */\n\treadonly listClassName?: string\n\t/** Right-hand controls sharing the tab row (e.g. a sort toggle). */\n\treadonly controls?: ReactNode\n\treadonly ariaLabel?: string\n}\n\nconst TRIGGER_CLASSES =\n\t\"relative inline-flex shrink-0 items-center justify-center gap-1.5 whitespace-nowrap rounded-none border-0 bg-transparent px-0.5 pt-1 pb-3 text-xs font-semibold uppercase tracking-[0.1em] text-muted-foreground transition-colors hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 after:absolute after:inset-x-0 after:-bottom-[2px] after:h-0.5 after:bg-foreground after:opacity-0 after:transition-opacity\"\n\nfunction triggerClassName(active: boolean): string {\n\treturn cn(TRIGGER_CLASSES, active && \"text-foreground after:opacity-100\")\n}\n\n/**\n * Section-mode tab bar: uppercase 12px labels, a 2px underline on the\n * active tab over a 2px strong bottom edge, and a hidden horizontal\n * scrollbar on overflow. Standalone replacement for the shadcn tabs'\n * `section` variant — the group-data variant chains it leaned on were\n * too fragile to extend.\n */\nexport function SectionTabs<T extends string>(props: SectionTabsProps<T>) {\n\tconst {\n\t\tvalue,\n\t\titems,\n\t\tonChange,\n\t\tclassName,\n\t\tpanelClassName,\n\t\tlistClassName,\n\t\tcontrols,\n\t\tariaLabel,\n\t} = props\n\tconst baseId = useId()\n\tconst listRef = useRef<HTMLDivElement>(null)\n\n\tconst activeIndex = items.findIndex((item) => item.value === value)\n\tconst activeItem = activeIndex >= 0 ? items[activeIndex] : undefined\n\n\tfunction activate(next: T): void {\n\t\tif (next !== value) onChange?.(next)\n\t}\n\n\tfunction focusTriggerAt(index: number): void {\n\t\tconst trigger =\n\t\t\tlistRef.current?.querySelectorAll<HTMLElement>('[role=\"tab\"]')[index]\n\t\ttrigger?.focus()\n\t}\n\n\tfunction handleKeyDown(event: KeyboardEvent<HTMLElement>): void {\n\t\tconst from = activeIndex < 0 ? 0 : activeIndex\n\t\tconst count = items.length\n\t\tlet nextIndex: number\n\t\tswitch (event.key) {\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tnextIndex = (from + 1) % count\n\t\t\t\tbreak\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tnextIndex = (from - 1 + count) % count\n\t\t\t\tbreak\n\t\t\tcase \"Home\":\n\t\t\t\tnextIndex = 0\n\t\t\t\tbreak\n\t\t\tcase \"End\":\n\t\t\t\tnextIndex = count - 1\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\treturn\n\t\t}\n\t\tevent.preventDefault()\n\t\tconst next = items[nextIndex]\n\t\tif (next === undefined) return\n\t\tactivate(next.value)\n\t\tfocusTriggerAt(nextIndex)\n\t}\n\n\treturn (\n\t\t<div className={cn(\"flex min-w-0 flex-col gap-2\", className)}>\n\t\t\t<div className=\"flex items-center gap-6\">\n\t\t\t\t<div\n\t\t\t\t\tref={listRef}\n\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t// The 2px strong edge is an inset shadow over the bottom\n\t\t\t\t\t\t// padding zone: the active underline (positioned 2px\n\t\t\t\t\t\t// below the trigger) lands inside the padding box —\n\t\t\t\t\t\t// a border would be outside it and get clipped by the\n\t\t\t\t\t\t// scroll list's overflow-y-hidden. The color reads the\n\t\t\t\t\t\t// runtime palette variable directly (what border-border\n\t\t\t\t\t\t// compiles to), not the @theme mirror — the mirror\n\t\t\t\t\t\t// lives in a cascade layer and is not reliable here.\n\t\t\t\t\t\t\"flex min-w-0 flex-1 items-center gap-6 overflow-x-auto overflow-y-hidden no-scrollbar pb-0.5 shadow-[inset_0_-2px_0_0_var(--border)]\",\n\t\t\t\t\t\tlistClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\t\tconst active = item.value === value\n\t\t\t\t\t\tconst triggerProps: SectionTabTriggerProps = {\n\t\t\t\t\t\t\tid: `${baseId}-tab-${index}`,\n\t\t\t\t\t\t\trole: \"tab\",\n\t\t\t\t\t\t\ttabIndex: active ? 0 : -1,\n\t\t\t\t\t\t\t\"aria-selected\": active,\n\t\t\t\t\t\t\t\"aria-controls\":\n\t\t\t\t\t\t\t\titem.panel !== undefined\n\t\t\t\t\t\t\t\t\t? `${baseId}-panel-${index}`\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\"data-testid\": item.testId,\n\t\t\t\t\t\t\tonKeyDown: handleKeyDown,\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (item.render !== undefined) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Fragment key={item.value}>\n\t\t\t\t\t\t\t\t\t{item.render(active, triggerClassName(active), triggerProps)}\n\t\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={item.value}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t{...triggerProps}\n\t\t\t\t\t\t\t\tonClick={() => activate(item.value)}\n\t\t\t\t\t\t\t\tclassName={triggerClassName(active)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t\t{controls}\n\t\t\t</div>\n\t\t\t{activeItem?.panel !== undefined ? (\n\t\t\t\t<div\n\t\t\t\t\trole=\"tabpanel\"\n\t\t\t\t\tid={`${baseId}-panel-${activeIndex}`}\n\t\t\t\t\taria-labelledby={`${baseId}-tab-${activeIndex}`}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex-1 text-sm outline-none\",\n\t\t\t\t\t\tactiveItem.panelClassName ?? panelClassName ?? \"mt-4\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{activeItem.panel}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t)\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import * as React from 'react';
2
+ import { Separator as Separator$1 } from '@base-ui/react/separator';
3
+
4
+ type SeparatorSize = "hairline" | "seam";
5
+ /**
6
+ * Horizontal/vertical divider: hairlines are 1px and quiet; the 2px
7
+ * `seam` tier marks only structural seams (tab bars, panel sections,
8
+ * pinned action bars).
9
+ */
10
+ declare function Separator({ className, orientation, size, ...props }: Separator$1.Props & {
11
+ readonly size?: SeparatorSize;
12
+ }): React.JSX.Element;
13
+
14
+ export { Separator, type SeparatorSize };
@@ -0,0 +1,49 @@
1
+ import { Separator as Separator$1 } from '@base-ui/react/separator';
2
+ import { clsx } from 'clsx';
3
+ import { extendTailwindMerge } from 'tailwind-merge';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ // src/components/separator.tsx
7
+ var mergeTheme = {
8
+ text: ["tiny", "ui", "doc", "doc-title", "doc-heading", "quote"],
9
+ spacing: ["chip", "control", "nav", "sidebar", "panel"],
10
+ tracking: ["label"],
11
+ shadow: ["card", "dialog"],
12
+ container: ["reading", "medium", "content"],
13
+ font: ["doc", "heading"],
14
+ ease: ["standard"],
15
+ animate: ["skel", "pop"]
16
+ };
17
+ var twMerge = extendTailwindMerge({
18
+ extend: { theme: mergeTheme }
19
+ });
20
+
21
+ // src/lib/utils.ts
22
+ function cn(...inputs) {
23
+ return twMerge(clsx(inputs));
24
+ }
25
+ function Separator({
26
+ className,
27
+ orientation = "horizontal",
28
+ size = "hairline",
29
+ ...props
30
+ }) {
31
+ const thickness = size === "seam" ? "data-horizontal:h-0.5 data-vertical:w-0.5" : "data-horizontal:h-px data-vertical:w-px";
32
+ return /* @__PURE__ */ jsx(
33
+ Separator$1,
34
+ {
35
+ "data-slot": "separator",
36
+ orientation,
37
+ className: cn(
38
+ "shrink-0 bg-border data-horizontal:w-full data-vertical:self-stretch",
39
+ thickness,
40
+ className
41
+ ),
42
+ ...props
43
+ }
44
+ );
45
+ }
46
+
47
+ export { Separator };
48
+ //# sourceMappingURL=separator.js.map
49
+ //# sourceMappingURL=separator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/merge-config.ts","../../src/lib/utils.ts","../../src/components/separator.tsx"],"names":["SeparatorPrimitive"],"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;ACMA,SAAS,SAAA,CAAU;AAAA,EACjB,SAAA;AAAA,EACA,WAAA,GAAc,YAAA;AAAA,EACd,IAAA,GAAO,UAAA;AAAA,EACP,GAAG;AACL,CAAA,EAEG;AACD,EAAA,MAAM,SAAA,GACJ,IAAA,KAAS,MAAA,GACL,2CAAA,GACA,yCAAA;AACN,EAAA,uBACE,GAAA;AAAA,IAACA,WAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,WAAA;AAAA,MACV,WAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,sEAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"separator.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 { 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"]}
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+ import { Dialog } from '@base-ui/react/dialog';
3
+
4
+ declare function Sheet({ open, defaultOpen, onOpenChange, ...props }: Omit<Dialog.Root.Props, "onOpenChange"> & {
5
+ /**
6
+ * `eventDetails` is absent for closes triggered by the mobile back
7
+ * gesture (a synthetic close with no underlying Base UI event).
8
+ */
9
+ onOpenChange?: (open: boolean, eventDetails?: Dialog.Root.ChangeEventDetails) => void;
10
+ }): React.JSX.Element;
11
+ declare function SheetTrigger({ ...props }: Dialog.Trigger.Props): React.JSX.Element;
12
+ declare function SheetClose({ ...props }: Dialog.Close.Props): React.JSX.Element;
13
+ declare function SheetContent({ className, children, side, showCloseButton, ...props }: Dialog.Popup.Props & {
14
+ side?: "top" | "right" | "bottom" | "left";
15
+ showCloseButton?: boolean;
16
+ }): React.JSX.Element;
17
+ declare function SheetHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
18
+ declare function SheetFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
19
+ declare function SheetTitle({ className, ...props }: Dialog.Title.Props): React.JSX.Element;
20
+ declare function SheetDescription({ className, ...props }: Dialog.Description.Props): React.JSX.Element;
21
+
22
+ export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger };