@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/special/gold.tsx","../../src/components/special/kintsugi.tsx","../../src/components/special/oilslick.tsx","../../src/components/special/rainbow.tsx","../../src/components/special/silver.tsx","../../src/components/special-tag-surface.tsx","../../src/lib/colors.ts","../../src/lib/tag-surface.ts"],"names":["jsx","jsxs"],"mappings":"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","file":"tag-surface.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\"\n\nimport type { SpecialTagStyleConfig } from \"./types\"\n\nfunction GoldSurface({\n\tid,\n\tactive,\n}: {\n\treadonly id: string\n\treadonly active?: boolean\n}) {\n\tconst gradientId = `${id}-gold-gradient`\n\treturn (\n\t\t<svg\n\t\t\tclassName={cn(\n\t\t\t\t\"size-full\",\n\t\t\t\t!active &&\n\t\t\t\t\t\"[filter:brightness(1.1)] group-hover:[filter:brightness(1.16)]\",\n\t\t\t)}\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t\tviewBox=\"0 0 100 100\"\n\t\t\tpreserveAspectRatio=\"none\"\n\t\t>\n\t\t\t<defs>\n\t\t\t\t<linearGradient\n\t\t\t\t\tid={gradientId}\n\t\t\t\t\tx1=\"0%\"\n\t\t\t\t\ty1=\"0%\"\n\t\t\t\t\tx2=\"100%\"\n\t\t\t\t\ty2=\"0%\"\n\t\t\t\t\tgradientTransform=\"rotate(30, 0.5, 0.5)\"\n\t\t\t\t>\n\t\t\t\t\t<stop offset=\"10%\" stopColor=\"#daa520\" />\n\t\t\t\t\t<stop offset=\"30%\" stopColor=\"#ffd700\" />\n\t\t\t\t\t<stop offset=\"50%\" stopColor=\"#f0e68c\" />\n\t\t\t\t\t<stop offset=\"70%\" stopColor=\"#ffd700\" />\n\t\t\t\t\t<stop offset=\"90%\" stopColor=\"#daa520\" />\n\t\t\t\t</linearGradient>\n\t\t\t</defs>\n\t\t\t<rect\n\t\t\t\twidth=\"100\"\n\t\t\t\theight=\"100\"\n\t\t\t\tfill={active ? \"#8a6d1f\" : `url(#${gradientId})`}\n\t\t\t/>\n\t\t\t{!active && (\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"100\"\n\t\t\t\t\theight=\"8\"\n\t\t\t\t\tfill=\"#ffffff\"\n\t\t\t\t\topacity=\"0.12\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</svg>\n\t)\n}\n\nexport const goldConfig: SpecialTagStyleConfig = {\n\trender: GoldSurface,\n\tdefault: {\n\t\tstyle: {\n\t\t\tcolor: \"#725603\",\n\t\t\tboxShadow: \"inset 0 0 0 1px rgba(114, 86, 3, 0.2)\",\n\t\t},\n\t},\n\tactive: {\n\t\tstyle: {\n\t\t\tcolor: \"#ffffff\",\n\t\t},\n\t},\n}\n","import { cn } from \"@hoardodile/ui/lib/utils\"\n\nimport type { SpecialTagStyleConfig } from \"./types\"\n\nfunction KintsugiSurface({\n\tid,\n\tactive,\n}: {\n\treadonly id: string\n\treadonly active?: boolean\n}) {\n\tif (active) {\n\t\treturn (\n\t\t\t<svg\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"size-full\",\n\t\t\t\t\t!active &&\n\t\t\t\t\t\t\"[filter:brightness(1.02)] group-hover:[filter:brightness(1.06)]\",\n\t\t\t\t)}\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t\tviewBox=\"0 0 100 100\"\n\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t>\n\t\t\t\t<rect width=\"100\" height=\"100\" fill=\"#9a9a8a\" />\n\t\t\t</svg>\n\t\t)\n\t}\n\n\tconst goldGradientId = `${id}-kintsugi-gold`\n\n\treturn (\n\t\t<svg\n\t\t\tclassName={cn(\n\t\t\t\t\"size-full\",\n\t\t\t\t!active &&\n\t\t\t\t\t\"[filter:brightness(1.02)] group-hover:[filter:brightness(1.06)]\",\n\t\t\t)}\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t\tviewBox=\"0 0 100 100\"\n\t\t\tpreserveAspectRatio=\"none\"\n\t\t>\n\t\t\t<style>{`\n\t\t\t\t@keyframes ${id}-gold-shimmer {\n\t\t\t\t\t0% { stroke-dashoffset: 60; }\n\t\t\t\t\t100% { stroke-dashoffset: 0; }\n\t\t\t\t}\n\t\t\t\t.${id}-gold-vein {\n\t\t\t\t\tstroke-dasharray: 30 30;\n\t\t\t\t\tanimation: ${id}-gold-shimmer 5s linear infinite;\n\t\t\t\t}\n\t\t\t\t@media (prefers-reduced-motion: reduce) {\n\t\t\t\t\t.${id}-gold-vein {\n\t\t\t\t\t\tanimation: none;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t`}</style>\n\n\t\t\t<defs>\n\t\t\t\t<linearGradient id={goldGradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n\t\t\t\t\t<stop offset=\"0%\" stopColor=\"#b8860b\" />\n\t\t\t\t\t<stop offset=\"35%\" stopColor=\"#ffd700\" />\n\t\t\t\t\t<stop offset=\"50%\" stopColor=\"#fffacd\" />\n\t\t\t\t\t<stop offset=\"65%\" stopColor=\"#ffd700\" />\n\t\t\t\t\t<stop offset=\"100%\" stopColor=\"#b8860b\" />\n\t\t\t\t</linearGradient>\n\t\t\t</defs>\n\n\t\t\t{/* Celadon/cream ceramic base */}\n\t\t\t<rect width=\"100\" height=\"100\" fill=\"#d8d4c5\" />\n\t\t\t<rect width=\"100\" height=\"100\" fill=\"#b8c4b8\" opacity=\"0.35\" />\n\n\t\t\t{/* Subtle surface texture */}\n\t\t\t<ellipse cx=\"30\" cy=\"25\" rx=\"40\" ry=\"25\" fill=\"#ffffff\" opacity=\"0.08\" />\n\t\t\t<ellipse cx=\"75\" cy=\"70\" rx=\"35\" ry=\"28\" fill=\"#000000\" opacity=\"0.04\" />\n\n\t\t\t{/* Crack lines (dark) */}\n\t\t\t<path\n\t\t\t\td=\"M 5 20 Q 25 22 35 45 T 60 80\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"#5a5650\"\n\t\t\t\tstrokeWidth=\"0.7\"\n\t\t\t\topacity=\"0.45\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M 80 10 Q 70 35 85 55 T 55 95\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"#5a5650\"\n\t\t\t\tstrokeWidth=\"0.6\"\n\t\t\t\topacity=\"0.40\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M 10 70 Q 30 68 45 55 T 75 45\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"#5a5650\"\n\t\t\t\tstrokeWidth=\"0.5\"\n\t\t\t\topacity=\"0.38\"\n\t\t\t/>\n\n\t\t\t{/* Gold repair veins */}\n\t\t\t<path\n\t\t\t\tclassName={`${id}-gold-vein`}\n\t\t\t\td=\"M 4 18 Q 24 20 34 43 T 58 78\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={`url(#${goldGradientId})`}\n\t\t\t\tstrokeWidth=\"1.4\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\tclassName={`${id}-gold-vein`}\n\t\t\t\td=\"M 82 8 Q 72 33 87 53 T 53 93\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={`url(#${goldGradientId})`}\n\t\t\t\tstrokeWidth=\"1.2\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\tclassName={`${id}-gold-vein`}\n\t\t\t\td=\"M 8 68 Q 28 66 43 53 T 73 43\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={`url(#${goldGradientId})`}\n\t\t\t\tstrokeWidth=\"1.0\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n\nexport const kintsugiConfig: SpecialTagStyleConfig = {\n\trender: KintsugiSurface,\n\tdefault: {\n\t\tstyle: {\n\t\t\tcolor: \"#4a4030\",\n\t\t\tboxShadow: \"inset 0 0 0 1px rgba(74, 64, 48, 0.12)\",\n\t\t},\n\t},\n\tactive: {\n\t\tstyle: {\n\t\t\tcolor: \"#ffffff\",\n\t\t},\n\t},\n}\n","import { cn } from \"@hoardodile/ui/lib/utils\"\n\nimport type { SpecialTagStyleConfig } from \"./types\"\n\nfunction OilslickSurface({\n\tid,\n\tactive,\n}: {\n\treadonly id: string\n\treadonly active?: boolean\n}) {\n\tif (active) {\n\t\treturn (\n\t\t\t<svg\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"size-full\",\n\t\t\t\t\t!active &&\n\t\t\t\t\t\t\"[filter:saturate(1.15)] group-hover:[filter:saturate(1.3)_brightness(1.08)]\",\n\t\t\t\t)}\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t\tviewBox=\"0 0 100 100\"\n\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t>\n\t\t\t\t<rect width=\"100\" height=\"100\" fill=\"#1a1a2e\" />\n\t\t\t</svg>\n\t\t)\n\t}\n\n\tconst gradientA = `${id}-oilslick-a`\n\tconst gradientB = `${id}-oilslick-b`\n\tconst gradientC = `${id}-oilslick-c`\n\n\treturn (\n\t\t<svg\n\t\t\tclassName={cn(\n\t\t\t\t\"size-full\",\n\t\t\t\t!active &&\n\t\t\t\t\t\"[filter:saturate(1.15)] group-hover:[filter:saturate(1.3)_brightness(1.08)]\",\n\t\t\t)}\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t\tviewBox=\"0 0 100 100\"\n\t\t\tpreserveAspectRatio=\"none\"\n\t\t>\n\t\t\t<defs>\n\t\t\t\t<radialGradient id={gradientA} cx=\"30%\" cy=\"30%\" r=\"70%\">\n\t\t\t\t\t<stop offset=\"0%\" stopColor=\"#8b5cf6\">\n\t\t\t\t\t\t<animate\n\t\t\t\t\t\t\tattributeName=\"stop-color\"\n\t\t\t\t\t\t\tvalues=\"#8b5cf6;#06b6d4;#8b5cf6\"\n\t\t\t\t\t\t\tdur=\"8s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</stop>\n\t\t\t\t\t<stop offset=\"60%\" stopColor=\"#1e1b4b\" stopOpacity=\"0.9\" />\n\t\t\t\t\t<stop offset=\"100%\" stopColor=\"#0f0f1a\" stopOpacity=\"0\" />\n\t\t\t\t</radialGradient>\n\t\t\t\t<radialGradient id={gradientB} cx=\"70%\" cy=\"60%\" r=\"60%\">\n\t\t\t\t\t<stop offset=\"0%\" stopColor=\"#10b981\">\n\t\t\t\t\t\t<animate\n\t\t\t\t\t\t\tattributeName=\"stop-color\"\n\t\t\t\t\t\t\tvalues=\"#10b981;#f59e0b;#ec4899;#10b981\"\n\t\t\t\t\t\t\tdur=\"10s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</stop>\n\t\t\t\t\t<stop offset=\"55%\" stopColor=\"#1e1b4b\" stopOpacity=\"0.8\" />\n\t\t\t\t\t<stop offset=\"100%\" stopColor=\"#0f0f1a\" stopOpacity=\"0\" />\n\t\t\t\t</radialGradient>\n\t\t\t\t<radialGradient id={gradientC} cx=\"50%\" cy=\"80%\" r=\"55%\">\n\t\t\t\t\t<stop offset=\"0%\" stopColor=\"#ec4899\">\n\t\t\t\t\t\t<animate\n\t\t\t\t\t\t\tattributeName=\"stop-color\"\n\t\t\t\t\t\t\tvalues=\"#ec4899;#8b5cf6;#06b6d4;#ec4899\"\n\t\t\t\t\t\t\tdur=\"7s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</stop>\n\t\t\t\t\t<stop offset=\"50%\" stopColor=\"#1e1b4b\" stopOpacity=\"0.7\" />\n\t\t\t\t\t<stop offset=\"100%\" stopColor=\"#0f0f1a\" stopOpacity=\"0\" />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\n\t\t\t<rect width=\"100\" height=\"100\" fill=\"#0a0a12\" />\n\t\t\t<rect\n\t\t\t\twidth=\"100\"\n\t\t\t\theight=\"100\"\n\t\t\t\tfill={`url(#${gradientA})`}\n\t\t\t\topacity=\"0.85\"\n\t\t\t/>\n\t\t\t<rect\n\t\t\t\twidth=\"100\"\n\t\t\t\theight=\"100\"\n\t\t\t\tfill={`url(#${gradientB})`}\n\t\t\t\topacity=\"0.75\"\n\t\t\t/>\n\t\t\t<rect\n\t\t\t\twidth=\"100\"\n\t\t\t\theight=\"100\"\n\t\t\t\tfill={`url(#${gradientC})`}\n\t\t\t\topacity=\"0.70\"\n\t\t\t/>\n\n\t\t\t{/* Thin oily film highlights */}\n\t\t\t<path\n\t\t\t\td=\"M -10 60 Q 25 45 50 60 T 110 55\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"#ffffff\"\n\t\t\t\tstrokeWidth=\"0.8\"\n\t\t\t\topacity=\"0.12\"\n\t\t\t>\n\t\t\t\t<animate\n\t\t\t\t\tattributeName=\"d\"\n\t\t\t\t\tvalues=\"M -10 60 Q 25 45 50 60 T 110 55;M -10 55 Q 30 70 55 50 T 110 65;M -10 60 Q 25 45 50 60 T 110 55\"\n\t\t\t\t\tdur=\"12s\"\n\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t/>\n\t\t\t</path>\n\t\t</svg>\n\t)\n}\n\nexport const oilslickConfig: SpecialTagStyleConfig = {\n\trender: OilslickSurface,\n\tdefault: {\n\t\tstyle: {\n\t\t\tcolor: \"#ffffff\",\n\t\t\tboxShadow:\n\t\t\t\t\"inset 0 0 0 1px rgba(255, 255, 255, 0.08), 0 0 10px rgba(139, 92, 246, 0.20)\",\n\t\t},\n\t},\n\tactive: {\n\t\tstyle: {\n\t\t\tcolor: \"#ffffff\",\n\t\t},\n\t},\n}\n","import { cn } from \"@hoardodile/ui/lib/utils\"\n\nimport type { SpecialTagStyleConfig } from \"./types\"\n\nfunction RainbowSurface({\n\tid,\n\tactive,\n}: {\n\treadonly id: string\n\treadonly active?: boolean\n}) {\n\tconst gradientId = `${id}-rainbow-gradient`\n\treturn (\n\t\t<svg\n\t\t\tclassName={cn(\n\t\t\t\t\"size-full\",\n\t\t\t\t!active && \"group-hover:[filter:brightness(1.08)]\",\n\t\t\t)}\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t\tviewBox=\"0 0 100 100\"\n\t\t\tpreserveAspectRatio=\"none\"\n\t\t>\n\t\t\t<defs>\n\t\t\t\t<linearGradient\n\t\t\t\t\tid={gradientId}\n\t\t\t\t\tx1=\"0%\"\n\t\t\t\t\ty1=\"0%\"\n\t\t\t\t\tx2=\"100%\"\n\t\t\t\t\ty2=\"0%\"\n\t\t\t\t\tgradientTransform=\"rotate(30, 0.5, 0.5)\"\n\t\t\t\t>\n\t\t\t\t\t<stop offset=\"0%\" stopColor=\"#fbffca\" />\n\t\t\t\t\t<stop offset=\"33%\" stopColor=\"#baffbf\" />\n\t\t\t\t\t<stop offset=\"66%\" stopColor=\"#a7efff\" />\n\t\t\t\t\t<stop offset=\"100%\" stopColor=\"#ffabff\" />\n\t\t\t\t</linearGradient>\n\t\t\t</defs>\n\t\t\t<rect\n\t\t\t\twidth=\"100\"\n\t\t\t\theight=\"100\"\n\t\t\t\tfill={active ? \"#005458\" : `url(#${gradientId})`}\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n\nexport const rainbowConfig: SpecialTagStyleConfig = {\n\trender: RainbowSurface,\n\tdefault: {\n\t\tclassName: \"font-bold dark:[text-shadow:0_0_5px_rgba(0,0,0,0.5)]\",\n\t\tstyle: {\n\t\t\tcolor: \"#ffffff\",\n\t\t\ttextShadow: \"0 0 5px rgba(0, 0, 0, 0.2)\",\n\t\t\tboxShadow: \"inset 0 0 0 1px rgba(0, 247, 255, 0.1)\",\n\t\t},\n\t},\n\tactive: {\n\t\tstyle: {\n\t\t\tcolor: \"#ffffff\",\n\t\t},\n\t},\n}\n","import { cn } from \"@hoardodile/ui/lib/utils\"\n\nimport type { SpecialTagStyleConfig } from \"./types\"\n\nfunction SilverSurface({\n\tid,\n\tactive,\n}: {\n\treadonly id: string\n\treadonly active?: boolean\n}) {\n\tconst gradientId = `${id}-silver-gradient`\n\treturn (\n\t\t<svg\n\t\t\tclassName={cn(\n\t\t\t\t\"size-full\",\n\t\t\t\t!active &&\n\t\t\t\t\t\"[filter:brightness(1.1)] group-hover:[filter:brightness(1.16)]\",\n\t\t\t)}\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t\tviewBox=\"0 0 100 100\"\n\t\t\tpreserveAspectRatio=\"none\"\n\t\t>\n\t\t\t<defs>\n\t\t\t\t<linearGradient\n\t\t\t\t\tid={gradientId}\n\t\t\t\t\tx1=\"0%\"\n\t\t\t\t\ty1=\"0%\"\n\t\t\t\t\tx2=\"100%\"\n\t\t\t\t\ty2=\"0%\"\n\t\t\t\t\tgradientTransform=\"rotate(30, 0.5, 0.5)\"\n\t\t\t\t>\n\t\t\t\t\t<stop offset=\"10%\" stopColor=\"#afaeae\" />\n\t\t\t\t\t<stop offset=\"30%\" stopColor=\"#d6d6d6\" />\n\t\t\t\t\t<stop offset=\"50%\" stopColor=\"#eeeeee\" />\n\t\t\t\t\t<stop offset=\"70%\" stopColor=\"#d6d6d6\" />\n\t\t\t\t\t<stop offset=\"90%\" stopColor=\"#afaeae\" />\n\t\t\t\t</linearGradient>\n\t\t\t</defs>\n\t\t\t<rect\n\t\t\t\twidth=\"100\"\n\t\t\t\theight=\"100\"\n\t\t\t\tfill={active ? \"#5a5a5a\" : `url(#${gradientId})`}\n\t\t\t/>\n\t\t\t{!active && (\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"100\"\n\t\t\t\t\theight=\"8\"\n\t\t\t\t\tfill=\"#ffffff\"\n\t\t\t\t\topacity=\"0.16\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</svg>\n\t)\n}\n\nexport const silverConfig: SpecialTagStyleConfig = {\n\trender: SilverSurface,\n\tdefault: {\n\t\tstyle: {\n\t\t\tcolor: \"#2a2a2a\",\n\t\t\tboxShadow: \"inset 0 0 0 1px rgba(0, 0, 0, 0.08)\",\n\t\t},\n\t},\n\tactive: {\n\t\tstyle: {\n\t\t\tcolor: \"#ffffff\",\n\t\t},\n\t},\n}\n","import { cn } from \"@hoardodile/ui/lib/utils\"\nimport { useId } from \"react\"\nimport type { TagSpecialStyle } from \"@hoardodile/ui/lib/colors\"\nimport { goldConfig } from \"./special/gold\"\nimport { kintsugiConfig } from \"./special/kintsugi\"\nimport { oilslickConfig } from \"./special/oilslick\"\nimport { rainbowConfig } from \"./special/rainbow\"\nimport { silverConfig } from \"./special/silver\"\nimport type { SpecialTagStyleConfig } from \"./special/types\"\n\nexport type SpecialTagSurfaceProps = {\n\treadonly style: TagSpecialStyle\n\treadonly active?: boolean\n\treadonly className?: string\n}\n\nconst SPECIAL_TAG_CONFIG: Record<TagSpecialStyle, SpecialTagStyleConfig> = {\n\tsilver: silverConfig,\n\tgold: goldConfig,\n\trainbow: rainbowConfig,\n\toilslick: oilslickConfig,\n\tkintsugi: kintsugiConfig,\n}\n\nexport function getSpecialTagStyleConfig(\n\tstyle: TagSpecialStyle,\n): SpecialTagStyleConfig {\n\treturn SPECIAL_TAG_CONFIG[style]\n}\n\n/**\n * SVG background surface for special tag styles.\n *\n * Each style owns a self-contained SVG renderer in `src/components/special/`.\n * This component only picks the right renderer from the registry and applies\n * positioning; all styling (filters, colors, shadows) lives in the renderer or\n * the chip container config.\n */\nexport function SpecialTagSurface(props: SpecialTagSurfaceProps) {\n\tconst { style, active, className } = props\n\tconst config = SPECIAL_TAG_CONFIG[style]\n\tconst Renderer = config.render\n\tconst reactId = useId()\n\t// React useId() can produce ids containing colons, which break SVG\n\t// url(#id) references in some browsers. Replace them with a safe delimiter.\n\tconst safeId = reactId.replace(/:/g, \"-\")\n\n\treturn (\n\t\t<span className={cn(className)} aria-hidden=\"true\">\n\t\t\t<Renderer id={safeId} active={active} />\n\t\t</span>\n\t)\n}\n","/**\n * Pure color utilities used by tag/category chip rendering.\n *\n * Centralized here so chip components, color pickers, and tests share\n * one definition for \"looks white\"/\"looks black\" and the color-mix\n * blending used to keep chips subtle on cards and sidebars.\n */\n\nexport const TAG_SPECIAL_STYLES = [\n\t\"silver\",\n\t\"gold\",\n\t\"rainbow\",\n\t\"oilslick\",\n\t\"kintsugi\",\n] as const\n\n/** Default color presets shared by every color picker in the app. */\nexport const DEFAULT_COLOR_PRESETS = [\n\t\"#9D9D9D\",\n\t\"#000000\",\n\t\"#FFFFFF\",\n\t\"#27AE60\",\n\t\"#0070DD\",\n\t\"#00BCD4\",\n\t\"#8E44AD\",\n\t\"#FF8000\",\n\t\"#F1C40F\",\n\t\"#E74C3C\",\n] as const\n\nexport type TagSpecialStyle = (typeof TAG_SPECIAL_STYLES)[number]\n\nexport function isSpecialTagStyle(color: string): color is TagSpecialStyle {\n\treturn TAG_SPECIAL_STYLES.includes(color as TagSpecialStyle)\n}\n\nexport type TagChipColors = {\n\treadonly baseBg: string\n\treadonly hoverBg: string\n\treadonly fg: string\n}\n\nconst WHITE_COLOR_PATTERN =\n\t/^(?:#fff(?:fff)?|white|rgba?\\(\\s*255\\s*,\\s*255\\s*,\\s*255\\b)/i\nconst BLACK_COLOR_PATTERN =\n\t/^(?:#000(?:000)?|black|rgba?\\(\\s*0\\s*,\\s*0\\s*,\\s*0\\b)/i\n\n/**\n * Tests whether a CSS color string visually resolves to white in any\n * common short form (`#fff`, `#ffffff`, `white`, `rgb(255,255,255,…)`).\n */\nexport function isWhiteHex(color: string): boolean {\n\tif (color === \"\") return false\n\treturn WHITE_COLOR_PATTERN.test(color.trim())\n}\n\n/** Mirror of {@link isWhiteHex} for black. */\nexport function isBlackHex(color: string): boolean {\n\tif (color === \"\") return false\n\treturn BLACK_COLOR_PATTERN.test(color.trim())\n}\n\n/**\n * Resolve a chip's background/hover/foreground triple for the given\n * `color`. White and black are special-cased so they remain visibly\n * black/white in both light and dark themes instead of vanishing into\n * the chip background.\n */\nexport function computeTagChipColors(color: string): TagChipColors {\n\tif (color === \"\") {\n\t\treturn {\n\t\t\tbaseBg: \"var(--color-muted)\",\n\t\t\thoverBg: \"var(--color-accent)\",\n\t\t\tfg: \"var(--color-foreground)\",\n\t\t}\n\t}\n\tif (isWhiteHex(color)) {\n\t\treturn {\n\t\t\tbaseBg: \"#ffffff\",\n\t\t\thoverBg: \"#f1f5f9\",\n\t\t\tfg: \"#0a0a0a\",\n\t\t}\n\t}\n\tif (isBlackHex(color)) {\n\t\treturn {\n\t\t\tbaseBg: \"#0a0a0a\",\n\t\t\thoverBg: \"#262626\",\n\t\t\tfg: \"#ffffff\",\n\t\t}\n\t}\n\treturn {\n\t\tbaseBg: `color-mix(in srgb, ${color} 6%, var(--color-card))`,\n\t\thoverBg: `color-mix(in srgb, ${color} 20%, var(--color-card))`,\n\t\tfg: color,\n\t}\n}\n","import { getSpecialTagStyleConfig } from \"@hoardodile/ui/components/special-tag-surface\"\nimport {\n\tcomputeTagChipColors,\n\tisSpecialTagStyle,\n\ttype TagSpecialStyle,\n} from \"@hoardodile/ui/lib/colors\"\nimport { cn } from \"@hoardodile/ui/lib/utils\"\nimport type { CSSProperties } from \"react\"\n\nexport type ResolvedTagChipSurface = {\n\treadonly className: string\n\treadonly style: CSSProperties | undefined\n\t/** The special SVG texture to layer under the chip's content, or null. */\n\treadonly texture: TagSpecialStyle | null\n}\n\n/**\n * Resolves a chip's visual surface for a user-assigned color — the single\n * source of chip coloring shared by every tag/category pill in the app.\n *\n * A plain color tints the whole chip (a 6% wash as fill, the color as ink,\n * deepening to the hover tint when `active`); the five special styles\n * (silver, gold, rainbow, oilslick, kintsugi) render their SVG texture;\n * an empty color falls back to the default muted chip, taking the primary\n * fill when `active`.\n */\nexport function resolveTagChipSurface(\n\tcolor: string,\n\tactive: boolean,\n): ResolvedTagChipSurface {\n\tif (isSpecialTagStyle(color)) {\n\t\tconst config = getSpecialTagStyleConfig(color)\n\t\treturn {\n\t\t\tclassName: cn(\n\t\t\t\t\"relative isolate group\",\n\t\t\t\tconfig.default.className,\n\t\t\t\tactive ? config.active?.className : undefined,\n\t\t\t),\n\t\t\tstyle: {\n\t\t\t\t...config.default.style,\n\t\t\t\t...(active ? config.active?.style : {}),\n\t\t\t},\n\t\t\ttexture: color,\n\t\t}\n\t}\n\n\tif (color === \"\") {\n\t\treturn active\n\t\t\t? {\n\t\t\t\t\tclassName: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n\t\t\t\t\tstyle: undefined,\n\t\t\t\t\ttexture: null,\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\tclassName: \"bg-muted text-foreground hover:bg-accent\",\n\t\t\t\t\tstyle: undefined,\n\t\t\t\t\ttexture: null,\n\t\t\t\t}\n\t}\n\n\tconst chipColors = computeTagChipColors(color)\n\treturn {\n\t\tclassName: \"bg-(--chip-bg) hover:bg-(--chip-hover-bg)\",\n\t\tstyle: {\n\t\t\t[\"--chip-bg\" as string]: active ? chipColors.hoverBg : chipColors.baseBg,\n\t\t\t[\"--chip-hover-bg\" as string]: chipColors.hoverBg,\n\t\t\tcolor: chipColors.fg,\n\t\t},\n\t\ttexture: null,\n\t}\n}\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"tag-surface.js"}
package/dist/lib/utils.js CHANGED
@@ -1,26 +1,4 @@
1
- import { clsx } from 'clsx';
2
- import { extendTailwindMerge } from 'tailwind-merge';
3
-
4
- // src/lib/utils.ts
5
- var mergeTheme = {
6
- text: ["tiny", "ui", "doc", "doc-title", "doc-heading", "quote"],
7
- spacing: ["chip", "control", "nav", "sidebar", "panel"],
8
- tracking: ["label"],
9
- shadow: ["card", "dialog"],
10
- container: ["reading", "medium", "content"],
11
- font: ["doc", "heading"],
12
- ease: ["standard"],
13
- animate: ["skel", "pop"]
14
- };
15
- var twMerge = extendTailwindMerge({
16
- extend: { theme: mergeTheme }
17
- });
18
-
19
- // src/lib/utils.ts
20
- function cn(...inputs) {
21
- return twMerge(clsx(inputs));
22
- }
23
-
24
- export { cn };
1
+ export { cn } from '../chunk-M5OJN54O.js';
2
+ import '../chunk-2HWSCY4T.js';
25
3
  //# sourceMappingURL=utils.js.map
26
4
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/merge-config.ts","../../src/lib/utils.ts"],"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","file":"utils.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"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"utils.js"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Format a non-negative byte count as a short human-readable string
3
+ * via {@link prettyBytes} with binary conversion (base 1024) and JEDEC
4
+ * labels (`4.5 KB`, `1.2 MB`, `930 GB`) — IEC `KiB`/`MiB`/`GiB` mapped
5
+ * to `KB`/`MB`/`GB`. Matches how Windows and most disk tools report
6
+ * sizes, without switching to decimal (base 1000) units.
7
+ *
8
+ * Returns the empty string for `undefined` so callers can splat the value
9
+ * into a template without conditional checks. Negative or non-finite
10
+ * inputs are clamped to `0 B`.
11
+ */
12
+ declare function formatBytes(bytes: number | undefined): string;
13
+ /**
14
+ * Format a duration in milliseconds as a media clock — `m:ss`, or
15
+ * `h:mm:ss` past the hour. Used by the plugin card templates
16
+ * (`{{duration(...)}}`) and the card's inline audio player, so both
17
+ * read the same way.
18
+ */
19
+ declare function formatClockDuration(ms: number): string;
20
+
21
+ export { formatBytes, formatClockDuration };
@@ -0,0 +1,3 @@
1
+ export { formatBytes, formatClockDuration } from '../chunk-UEVND7AS.js';
2
+ //# sourceMappingURL=format.js.map
3
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"format.js"}
@@ -0,0 +1,38 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ /**
4
+ * A resolved template-icon reference: a Solar glyph name, or an
5
+ * asset image URL derived from a manifest-relative path.
6
+ */
7
+ type IconRef = {
8
+ readonly kind: "icon";
9
+ readonly name: string;
10
+ } | {
11
+ readonly kind: "asset";
12
+ readonly url: string;
13
+ };
14
+ /**
15
+ * Normalize a raw icon name to Solar kebab-case, or `undefined` when the
16
+ * string cannot name a glyph at all (schemes, separators, punctuation).
17
+ * This is syntax only — membership in the Solar glyph index is left to
18
+ * the renderer that consumes the name.
19
+ */
20
+ declare function normalizeSolarGlyphName(raw: string): string | undefined;
21
+ /**
22
+ * Parse a manifest-level icon string into a render-ready ref.
23
+ *
24
+ * `<SolarGlyph>` — Solar glyph name (manifest/template icons are
25
+ * Solar-only; PascalCase and the legacy whitelist
26
+ * names normalize to the kebab glyph)
27
+ * `<relative/path>` — resolved through `buildAssetUrl(pluginId, path)`
28
+ * (leading `./` stripped)
29
+ *
30
+ * Empty inputs, schemes (`http(s)`, `data:`), `..`-shaped paths and any
31
+ * string that cannot name a glyph return `undefined`. The renderer treats
32
+ * that as "nothing" — icon resolution never throws.
33
+ */
34
+ declare function parseIconRef(raw: string, pluginId: string, buildAssetUrl: (pluginId: string, path: string) => string): IconRef | undefined;
35
+ /** How a parsed {@link IconRef} is drawn inside a rendered badge/template. */
36
+ type RenderIcon = (ref: IconRef, className?: string) => ReactNode;
37
+
38
+ export { type IconRef, type RenderIcon, normalizeSolarGlyphName, parseIconRef };
@@ -0,0 +1,3 @@
1
+ export { normalizeSolarGlyphName, parseIconRef } from '../chunk-POX7TXBH.js';
2
+ //# sourceMappingURL=icon.js.map
3
+ //# sourceMappingURL=icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"icon.js"}
@@ -0,0 +1,4 @@
1
+ export { formatBytes, formatClockDuration } from './format.js';
2
+ export { IconRef, RenderIcon, normalizeSolarGlyphName, parseIconRef } from './icon.js';
3
+ export { TemplateContext, renderCardTemplate, renderSlotBadges, resolveLocaleString } from './template.js';
4
+ import 'react';
@@ -0,0 +1,5 @@
1
+ export { renderCardTemplate, renderSlotBadges, resolveLocaleString } from '../chunk-4D36OO5W.js';
2
+ export { normalizeSolarGlyphName, parseIconRef } from '../chunk-POX7TXBH.js';
3
+ export { formatBytes, formatClockDuration } from '../chunk-UEVND7AS.js';
4
+ //# sourceMappingURL=index.js.map
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,48 @@
1
+ import { ReactNode } from 'react';
2
+ import { RenderIcon } from './icon.js';
3
+
4
+ /** How a referenced icon is drawn; the caller owns the SVG/image resolution. */
5
+ type TemplateContext = {
6
+ readonly locale: string;
7
+ readonly pluginId: string;
8
+ readonly manifest: {
9
+ readonly i18n?: Record<string, string | Record<string, string>>;
10
+ readonly ui?: {
11
+ readonly search?: {
12
+ readonly kinds?: readonly {
13
+ readonly key: string;
14
+ readonly icon?: string;
15
+ }[];
16
+ };
17
+ };
18
+ };
19
+ readonly iconClassName?: string;
20
+ /** Renders a parsed {@link IconRef} (glyph or asset) inside the template. */
21
+ readonly renderIcon: RenderIcon;
22
+ /** Resolves a manifest-relative `asset('path')` reference to a URL. */
23
+ readonly buildAssetUrl: (pluginId: string, path: string) => string;
24
+ };
25
+ type TemplateScope = {
26
+ readonly file: unknown;
27
+ readonly source: unknown;
28
+ readonly searchMeta?: unknown;
29
+ readonly data?: unknown;
30
+ readonly coverMeta?: unknown;
31
+ };
32
+ /**
33
+ * Resolve a locale-aware template value: if the value is a plain string,
34
+ * return it directly; if it is a `Record<locale, string>`, pick the best
35
+ * match for the current language. Falls back to the first available key
36
+ * when nothing matches.
37
+ */
38
+ declare function resolveLocaleString(value: string | Record<string, string>, locale: string): string;
39
+ /**
40
+ * Render one res-card template string. Returns a ReactNode so that
41
+ * icon-producing functions (`icon`, `asset`, `kind`) can inject
42
+ * components inline with text.
43
+ */
44
+ declare function renderCardTemplate(template: string, scope: TemplateScope, ctx: TemplateContext): ReactNode;
45
+ /** Render every badge in a {@link CoverKindUi} slot array. */
46
+ declare function renderSlotBadges(slotValues: readonly string[], scope: TemplateScope, ctx: TemplateContext): readonly ReactNode[];
47
+
48
+ export { type TemplateContext, renderCardTemplate, renderSlotBadges, resolveLocaleString };
@@ -0,0 +1,5 @@
1
+ export { renderCardTemplate, renderSlotBadges, resolveLocaleString } from '../chunk-4D36OO5W.js';
2
+ import '../chunk-POX7TXBH.js';
3
+ import '../chunk-UEVND7AS.js';
4
+ //# sourceMappingURL=template.js.map
5
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"template.js"}
package/dist/viewport.js CHANGED
@@ -1,13 +1,3 @@
1
- // src/viewport.ts
2
- var MOBILE_INITIAL_SCALE = 0.8;
3
- var MOBILE_BREAKPOINT_PX = 768;
4
- var MOBILE_BREAKPOINT_REM = MOBILE_BREAKPOINT_PX / 16;
5
- var MOBILE_QUERY = `(max-width: ${MOBILE_BREAKPOINT_PX - 1}px)`;
6
- var SIDEBAR_BREAKPOINT_PX = 1150;
7
- var SIDEBAR_QUERY = `(max-width: ${SIDEBAR_BREAKPOINT_PX - 1}px)`;
8
- var PANEL_BREAKPOINT_PX = 1440;
9
- var PANEL_QUERY = `(max-width: ${PANEL_BREAKPOINT_PX - 1}px)`;
10
-
11
- export { MOBILE_BREAKPOINT_PX, MOBILE_BREAKPOINT_REM, MOBILE_INITIAL_SCALE, MOBILE_QUERY, PANEL_BREAKPOINT_PX, PANEL_QUERY, SIDEBAR_BREAKPOINT_PX, SIDEBAR_QUERY };
1
+ export { MOBILE_BREAKPOINT_PX, MOBILE_BREAKPOINT_REM, MOBILE_INITIAL_SCALE, MOBILE_QUERY, PANEL_BREAKPOINT_PX, PANEL_QUERY, SIDEBAR_BREAKPOINT_PX, SIDEBAR_QUERY } from './chunk-KNPRUZ4H.js';
12
2
  //# sourceMappingURL=viewport.js.map
13
3
  //# sourceMappingURL=viewport.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/viewport.ts"],"names":[],"mappings":";AAKO,IAAM,oBAAA,GAAuB;AAU7B,IAAM,oBAAA,GAAuB;AAM7B,IAAM,wBAAwB,oBAAA,GAAuB;AAUrD,IAAM,YAAA,GAAe,CAAA,YAAA,EAAe,oBAAA,GAAuB,CAAC,CAAA,GAAA;AAW5D,IAAM,qBAAA,GAAwB;AAQ9B,IAAM,aAAA,GAAgB,CAAA,YAAA,EAAe,qBAAA,GAAwB,CAAC,CAAA,GAAA;AAW9D,IAAM,mBAAA,GAAsB;AAO5B,IAAM,WAAA,GAAc,CAAA,YAAA,EAAe,mBAAA,GAAsB,CAAC,CAAA,GAAA","file":"viewport.js","sourcesContent":["/**\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"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"viewport.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hoardodile/ui",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "license": "MIT",
5
5
  "description": "shadcn/ui component library for hoardodile plugin iframes.",
6
6
  "keywords": [
@@ -46,6 +46,11 @@
46
46
  "development": "./src/hooks/*",
47
47
  "default": "./dist/hooks/*.js"
48
48
  },
49
+ "./res-card-template": {
50
+ "types": "./dist/res-card-template/index.d.ts",
51
+ "development": "./src/res-card-template/index.ts",
52
+ "default": "./dist/res-card-template/index.js"
53
+ },
49
54
  "./viewport": {
50
55
  "types": "./dist/viewport.d.ts",
51
56
  "development": "./src/viewport.ts",
@@ -72,12 +77,14 @@
72
77
  "@dnd-kit/utilities": "^3.2.2",
73
78
  "@solar-icons/react": "^2.1.0",
74
79
  "class-variance-authority": "^0.7.1",
80
+ "pretty-bytes": "^7.1.1",
75
81
  "clsx": "^2.1.1",
76
82
  "react-hook-form": "^7.86.0",
77
83
  "react-image-crop": "^11.1.2",
78
84
  "react-use": "^17.6.1",
79
85
  "tailwind-merge": "^3.6.0",
80
- "@hoardodile/i18n": "0.1.6"
86
+ "@hoardodile/i18n": "0.1.8",
87
+ "@hoardodile/sdk-types": "0.1.8"
81
88
  },
82
89
  "peerDependencies": {
83
90
  "i18next": "^26.4.0",
@@ -0,0 +1,54 @@
1
+ import { existsSync } from "node:fs"
2
+ import { resolve } from "node:path"
3
+ import { screen, within } from "@testing-library/react"
4
+ import { describe, expect, it, vi } from "vitest"
5
+ import { renderWithI18n } from "../test/i18n"
6
+
7
+ const TALL_IMAGE_SRC =
8
+ "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1000' height='2000'%3E%3Crect width='100%25' height='100%25' fill='red'/%3E%3C/svg%3E"
9
+
10
+ // This suite exercises the PUBLISHED bundle (`dist/`), not `src/`. The
11
+ // `DialogFooterActions` routing relies on a single React context shared by
12
+ // `AppDialog` (the provider) and `ImageCropPanel` (the consumer). With
13
+ // `splitting: false` (see tsup.config.ts) tsup inlines that shared module into
14
+ // every entry, so the dist carries TWO copies of the context and production
15
+ // bundles give the provider and consumer different instances — the crop action
16
+ // then falls back to an inline row instead of the dialog footer. When the
17
+ // package has not been built there is no dist to test, so skip gracefully.
18
+ const distAppDialog = resolve(process.cwd(), "dist/components/app-dialog.js")
19
+ const built = existsSync(distAppDialog)
20
+
21
+ describe.skipIf(!built)("ImageCropPanel (production dist)", () => {
22
+ it("lands the crop action on the same dialog footer row as cancel", async () => {
23
+ const { AppDialog } = await import("../../dist/components/app-dialog")
24
+ const { ImageCropPanel } = await import("../../dist/components/image-crop-panel")
25
+
26
+ renderWithI18n(
27
+ <AppDialog
28
+ open
29
+ title="Cover"
30
+ onOpenChange={() => {}}
31
+ footer={
32
+ <button type="button" data-testid="dialog-cancel">
33
+ Cancel
34
+ </button>
35
+ }
36
+ >
37
+ <ImageCropPanel initialSrc={TALL_IMAGE_SRC} onSave={vi.fn()} />
38
+ </AppDialog>,
39
+ )
40
+
41
+ await screen.findByRole("img")
42
+ const footer = document.querySelector('[data-slot="dialog-footer"]')
43
+ expect(footer).not.toBeNull()
44
+ // The crop action must be contributed into the SAME footer row as
45
+ // cancel — this is what breaks when the dist duplicates the
46
+ // `DialogFooterActionsContext` across entries.
47
+ expect(
48
+ within(footer as HTMLElement).getByTestId("image-crop-save"),
49
+ ).toBeInTheDocument()
50
+ expect(
51
+ within(footer as HTMLElement).getByTestId("dialog-cancel"),
52
+ ).toBeInTheDocument()
53
+ })
54
+ })
@@ -170,6 +170,7 @@ import { UserPlusIcon as UserPlusBoldWeight } from "@solar-icons/react/bold/user
170
170
  import { UsersGroupRoundedIcon as UsersGroupRoundedBoldWeight } from "@solar-icons/react/bold/users-group-rounded"
171
171
  import { UsersGroupTwoRoundedIcon as UsersGroupTwoRoundedBoldWeight } from "@solar-icons/react/bold/users-group-two-rounded"
172
172
  import { VideoFrameIcon as VideoFrameBoldWeight } from "@solar-icons/react/bold/video-frame"
173
+ import { VideoFramePlayHorizontalIcon as VideoFramePlayHorizontalBoldWeight } from "@solar-icons/react/bold/video-frame-play-horizontal"
173
174
  import { Widget2Icon as Widget2BoldWeight } from "@solar-icons/react/bold/widget-2"
174
175
  import { Widget5Icon as Widget5BoldWeight } from "@solar-icons/react/bold/widget-5"
175
176
  import { WindowFrameIcon as WindowFrameBoldWeight } from "@solar-icons/react/bold/window-frame"
@@ -312,6 +313,7 @@ import { UserPlusIcon as UserPlusBoldDuotone } from "@solar-icons/react/bold-duo
312
313
  import { UsersGroupRoundedIcon as UsersGroupRoundedBoldDuotone } from "@solar-icons/react/bold-duotone/users-group-rounded"
313
314
  import { UsersGroupTwoRoundedIcon as UsersGroupTwoRoundedBoldDuotone } from "@solar-icons/react/bold-duotone/users-group-two-rounded"
314
315
  import { VideoFrameIcon as VideoFrameBoldDuotone } from "@solar-icons/react/bold-duotone/video-frame"
316
+ import { VideoFramePlayHorizontalIcon as VideoFramePlayHorizontalBoldDuotone } from "@solar-icons/react/bold-duotone/video-frame-play-horizontal"
315
317
  import { Widget2Icon as Widget2BoldDuotone } from "@solar-icons/react/bold-duotone/widget-2"
316
318
  import { Widget5Icon as Widget5BoldDuotone } from "@solar-icons/react/bold-duotone/widget-5"
317
319
  import { WindowFrameIcon as WindowFrameBoldDuotone } from "@solar-icons/react/bold-duotone/window-frame"
@@ -453,6 +455,7 @@ import { UserPlusIcon as UserPlusLinear } from "@solar-icons/react/linear/user-p
453
455
  import { UsersGroupRoundedIcon as UsersGroupRoundedLinear } from "@solar-icons/react/linear/users-group-rounded"
454
456
  import { UsersGroupTwoRoundedIcon as UsersGroupTwoRoundedLinear } from "@solar-icons/react/linear/users-group-two-rounded"
455
457
  import { VideoFrameIcon as VideoFrameLinear } from "@solar-icons/react/linear/video-frame"
458
+ import { VideoFramePlayHorizontalIcon as VideoFramePlayHorizontalLinear } from "@solar-icons/react/linear/video-frame-play-horizontal"
456
459
  import { Widget2Icon as Widget2Linear } from "@solar-icons/react/linear/widget-2"
457
460
  import { Widget5Icon as Widget5Linear } from "@solar-icons/react/linear/widget-5"
458
461
  import { WindowFrameIcon as WindowFrameLinear } from "@solar-icons/react/linear/window-frame"
@@ -1154,6 +1157,11 @@ export const VideoFrame = createIcon({
1154
1157
  boldDuotone: VideoFrameBoldDuotone,
1155
1158
  linear: VideoFrameLinear,
1156
1159
  })
1160
+ export const VideoFramePlayHorizontal = createIcon({
1161
+ bold: VideoFramePlayHorizontalBoldWeight,
1162
+ boldDuotone: VideoFramePlayHorizontalBoldDuotone,
1163
+ linear: VideoFramePlayHorizontalLinear,
1164
+ })
1157
1165
  export const Widget2 = createIcon({
1158
1166
  bold: Widget2BoldWeight,
1159
1167
  boldDuotone: Widget2BoldDuotone,
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @vitest-environment node
3
+ */
4
+
5
+ import { describe, expect, test } from "vitest"
6
+ import { formatBytes, formatClockDuration } from "./index.ts"
7
+
8
+ describe("formatBytes", () => {
9
+ test("returns empty for undefined", () => {
10
+ expect(formatBytes(undefined)).toBe("")
11
+ })
12
+
13
+ test("clamps zero, negative and non-finite to 0 B", () => {
14
+ expect(formatBytes(0)).toBe("0 B")
15
+ expect(formatBytes(-1)).toBe("0 B")
16
+ expect(formatBytes(Number.NaN)).toBe("0 B")
17
+ expect(formatBytes(Number.POSITIVE_INFINITY)).toBe("0 B")
18
+ })
19
+
20
+ test("formats kibibytes with JEDEC labels", () => {
21
+ expect(formatBytes(1024)).toBe("1 KB")
22
+ expect(formatBytes(1536)).toBe("1.5 KB")
23
+ })
24
+
25
+ test("formats megabytes and gigabytes", () => {
26
+ expect(formatBytes(1024 ** 2)).toBe("1 MB")
27
+ expect(formatBytes(1024 ** 3)).toBe("1 GB")
28
+ })
29
+ })
30
+
31
+ describe("formatClockDuration", () => {
32
+ test("formats sub-hour as m:ss", () => {
33
+ expect(formatClockDuration(0)).toBe("0:00")
34
+ expect(formatClockDuration(125_000)).toBe("2:05")
35
+ })
36
+
37
+ test("formats past the hour as h:mm:ss", () => {
38
+ expect(formatClockDuration(3_661_000)).toBe("1:01:01")
39
+ })
40
+
41
+ test("returns empty for negative or non-finite input", () => {
42
+ expect(formatClockDuration(-1)).toBe("")
43
+ expect(formatClockDuration(Number.NaN)).toBe("")
44
+ })
45
+ })
@@ -0,0 +1,36 @@
1
+ import prettyBytes from "pretty-bytes"
2
+
3
+ /**
4
+ * Format a non-negative byte count as a short human-readable string
5
+ * via {@link prettyBytes} with binary conversion (base 1024) and JEDEC
6
+ * labels (`4.5 KB`, `1.2 MB`, `930 GB`) — IEC `KiB`/`MiB`/`GiB` mapped
7
+ * to `KB`/`MB`/`GB`. Matches how Windows and most disk tools report
8
+ * sizes, without switching to decimal (base 1000) units.
9
+ *
10
+ * Returns the empty string for `undefined` so callers can splat the value
11
+ * into a template without conditional checks. Negative or non-finite
12
+ * inputs are clamped to `0 B`.
13
+ */
14
+ export function formatBytes(bytes: number | undefined): string {
15
+ if (bytes === undefined) return ""
16
+ if (!Number.isFinite(bytes) || bytes <= 0) return "0 B"
17
+ return prettyBytes(bytes, { binary: true }).replaceAll("iB", "B")
18
+ }
19
+
20
+ /**
21
+ * Format a duration in milliseconds as a media clock — `m:ss`, or
22
+ * `h:mm:ss` past the hour. Used by the plugin card templates
23
+ * (`{{duration(...)}}`) and the card's inline audio player, so both
24
+ * read the same way.
25
+ */
26
+ export function formatClockDuration(ms: number): string {
27
+ if (!Number.isFinite(ms) || ms < 0) return ""
28
+ const totalSeconds = Math.floor(ms / 1000)
29
+ const hours = Math.floor(totalSeconds / 3600)
30
+ const minutes = Math.floor((totalSeconds % 3600) / 60)
31
+ const seconds = totalSeconds % 60
32
+ if (hours > 0) {
33
+ return `${hours}:${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`
34
+ }
35
+ return `${minutes}:${String(seconds).padStart(2, "0")}`
36
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @vitest-environment node
3
+ */
4
+
5
+ import { describe, expect, test } from "vitest"
6
+ import { normalizeSolarGlyphName, parseIconRef } from "./index.ts"
7
+
8
+ const buildAssetUrl = (pluginId: string, path: string) =>
9
+ `/api/plugins/${pluginId}/${path}`
10
+
11
+ describe("normalizeSolarGlyphName", () => {
12
+ test("passes kebab through", () => {
13
+ expect(normalizeSolarGlyphName("video-frame")).toBe("video-frame")
14
+ })
15
+
16
+ test("converts PascalCase to kebab", () => {
17
+ expect(normalizeSolarGlyphName("Heart")).toBe("heart")
18
+ expect(normalizeSolarGlyphName("VideoFrame")).toBe("video-frame")
19
+ })
20
+
21
+ test("maps legacy whitelist aliases", () => {
22
+ expect(normalizeSolarGlyphName("Image")).toBe("gallery")
23
+ expect(normalizeSolarGlyphName("FileText")).toBe("file-text")
24
+ expect(normalizeSolarGlyphName("Film")).toBe("video-frame")
25
+ })
26
+
27
+ test("returns undefined for empty, whitespace and prefixed input", () => {
28
+ expect(normalizeSolarGlyphName("")).toBeUndefined()
29
+ expect(normalizeSolarGlyphName(" ")).toBeUndefined()
30
+ expect(normalizeSolarGlyphName("icon:Heart")).toBeUndefined()
31
+ })
32
+ })
33
+
34
+ describe("parseIconRef", () => {
35
+ test("plain name → normalized Solar glyph name", () => {
36
+ expect(parseIconRef("Heart", "pid", buildAssetUrl)).toEqual({
37
+ kind: "icon",
38
+ name: "heart",
39
+ })
40
+ })
41
+
42
+ test("trims whitespace", () => {
43
+ expect(parseIconRef(" Heart ", "pid", buildAssetUrl)).toEqual({
44
+ kind: "icon",
45
+ name: "heart",
46
+ })
47
+ })
48
+
49
+ test("legacy whitelist names normalize to their Solar glyph", () => {
50
+ expect(parseIconRef("Image", "pid", buildAssetUrl)).toEqual({
51
+ kind: "icon",
52
+ name: "gallery",
53
+ })
54
+ expect(parseIconRef("FileText", "pid", buildAssetUrl)).toEqual({
55
+ kind: "icon",
56
+ name: "file-text",
57
+ })
58
+ })
59
+
60
+ test("the name: prefix is rejected outright", () => {
61
+ expect(parseIconRef("icon:Heart", "pid", buildAssetUrl)).toBeUndefined()
62
+ })
63
+
64
+ test("parses a relative asset path through the URL builder", () => {
65
+ expect(parseIconRef("icons/heart.gif", "pid", buildAssetUrl)).toEqual({
66
+ kind: "asset",
67
+ url: "/api/plugins/pid/icons/heart.gif",
68
+ })
69
+ })
70
+
71
+ test("strips leading ./ from asset path", () => {
72
+ expect(parseIconRef("./icons/heart.gif", "pid", buildAssetUrl)).toEqual({
73
+ kind: "asset",
74
+ url: "/api/plugins/pid/icons/heart.gif",
75
+ })
76
+ })
77
+
78
+ test("returns undefined for empty and dot asset paths", () => {
79
+ expect(parseIconRef("./", "pid", buildAssetUrl)).toBeUndefined()
80
+ expect(parseIconRef("", "pid", buildAssetUrl)).toBeUndefined()
81
+ expect(parseIconRef(" ", "pid", buildAssetUrl)).toBeUndefined()
82
+ })
83
+
84
+ test("returns undefined for .. asset paths", () => {
85
+ expect(parseIconRef("../x.svg", "pid", buildAssetUrl)).toBeUndefined()
86
+ expect(parseIconRef("icons/../x.svg", "pid", buildAssetUrl)).toBeUndefined()
87
+ })
88
+
89
+ test("returns undefined for http/https/data schemes", () => {
90
+ expect(
91
+ parseIconRef("http://example.com/icon.png", "pid", buildAssetUrl),
92
+ ).toBeUndefined()
93
+ expect(
94
+ parseIconRef("https://example.com/icon.png", "pid", buildAssetUrl),
95
+ ).toBeUndefined()
96
+ expect(
97
+ parseIconRef("data:image/png;base64,abc", "pid", buildAssetUrl),
98
+ ).toBeUndefined()
99
+ })
100
+ })