@tollerud/ui 1.1.5 → 3.1.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 (368) hide show
  1. package/AGENTS.md +36 -13
  2. package/CHANGELOG.md +411 -0
  3. package/COMPONENTS.md +951 -0
  4. package/GETTING_STARTED.md +159 -0
  5. package/README.md +51 -43
  6. package/SKILL.md +59 -24
  7. package/components.json +18 -0
  8. package/dist/accordion.d.ts +20 -0
  9. package/dist/accordion.js +5 -0
  10. package/dist/accordion.js.map +1 -0
  11. package/dist/action-diff.d.ts +26 -0
  12. package/dist/action-diff.js +5 -0
  13. package/dist/action-diff.js.map +1 -0
  14. package/dist/action-row.d.ts +36 -0
  15. package/dist/action-row.js +6 -0
  16. package/dist/action-row.js.map +1 -0
  17. package/dist/alert-inbox.d.ts +23 -0
  18. package/dist/alert-inbox.js +6 -0
  19. package/dist/alert-inbox.js.map +1 -0
  20. package/dist/alert.d.ts +33 -0
  21. package/dist/alert.js +5 -0
  22. package/dist/alert.js.map +1 -0
  23. package/dist/approval-card.d.ts +27 -0
  24. package/dist/approval-card.js +5 -0
  25. package/dist/approval-card.js.map +1 -0
  26. package/dist/area-chart.d.ts +10 -0
  27. package/dist/area-chart.js +5 -0
  28. package/dist/area-chart.js.map +1 -0
  29. package/dist/avatar.d.ts +28 -0
  30. package/dist/avatar.js +5 -0
  31. package/dist/avatar.js.map +1 -0
  32. package/dist/backup-status-panel.d.ts +25 -0
  33. package/dist/backup-status-panel.js +6 -0
  34. package/dist/backup-status-panel.js.map +1 -0
  35. package/dist/badge.d.ts +17 -0
  36. package/dist/badge.js +5 -0
  37. package/dist/badge.js.map +1 -0
  38. package/dist/bar-chart.d.ts +15 -0
  39. package/dist/bar-chart.js +5 -0
  40. package/dist/bar-chart.js.map +1 -0
  41. package/dist/bento-dashboard.d.ts +30 -0
  42. package/dist/bento-dashboard.js +10 -0
  43. package/dist/bento-dashboard.js.map +1 -0
  44. package/dist/breadcrumb.d.ts +16 -0
  45. package/dist/breadcrumb.js +5 -0
  46. package/dist/breadcrumb.js.map +1 -0
  47. package/dist/button.d.ts +29 -0
  48. package/dist/button.js +5 -0
  49. package/dist/button.js.map +1 -0
  50. package/dist/card.d.ts +10 -0
  51. package/dist/card.js +5 -0
  52. package/dist/card.js.map +1 -0
  53. package/dist/checkbox.d.ts +9 -0
  54. package/dist/checkbox.js +5 -0
  55. package/dist/checkbox.js.map +1 -0
  56. package/dist/chunk-2QWKOCWF.js +79 -0
  57. package/dist/chunk-2QWKOCWF.js.map +1 -0
  58. package/dist/chunk-3LTW224O.js +53 -0
  59. package/dist/chunk-3LTW224O.js.map +1 -0
  60. package/dist/chunk-3XTZPDNV.js +94 -0
  61. package/dist/chunk-3XTZPDNV.js.map +1 -0
  62. package/dist/chunk-435JHF7G.js +65 -0
  63. package/dist/chunk-435JHF7G.js.map +1 -0
  64. package/dist/chunk-4PA2ACNF.js +52 -0
  65. package/dist/chunk-4PA2ACNF.js.map +1 -0
  66. package/dist/chunk-5GWHUJ5D.js +29 -0
  67. package/dist/chunk-5GWHUJ5D.js.map +1 -0
  68. package/dist/chunk-6FUKJD3W.js +123 -0
  69. package/dist/chunk-6FUKJD3W.js.map +1 -0
  70. package/dist/chunk-6IS2AYYG.js +106 -0
  71. package/dist/chunk-6IS2AYYG.js.map +1 -0
  72. package/dist/chunk-6PZKU6ZL.js +78 -0
  73. package/dist/chunk-6PZKU6ZL.js.map +1 -0
  74. package/dist/chunk-6SKTH45H.js +75 -0
  75. package/dist/chunk-6SKTH45H.js.map +1 -0
  76. package/dist/chunk-6UXW5YUC.js +77 -0
  77. package/dist/chunk-6UXW5YUC.js.map +1 -0
  78. package/dist/chunk-7EP2T3OW.js +52 -0
  79. package/dist/chunk-7EP2T3OW.js.map +1 -0
  80. package/dist/chunk-7J5QXUQN.js +38 -0
  81. package/dist/chunk-7J5QXUQN.js.map +1 -0
  82. package/dist/chunk-A6L5C3IJ.js +47 -0
  83. package/dist/chunk-A6L5C3IJ.js.map +1 -0
  84. package/dist/chunk-ADE22JSR.js +54 -0
  85. package/dist/chunk-ADE22JSR.js.map +1 -0
  86. package/dist/chunk-ANW6J6PV.js +42 -0
  87. package/dist/chunk-ANW6J6PV.js.map +1 -0
  88. package/dist/chunk-APFFKNPS.js +80 -0
  89. package/dist/chunk-APFFKNPS.js.map +1 -0
  90. package/dist/chunk-AQT3FZRQ.js +23 -0
  91. package/dist/chunk-AQT3FZRQ.js.map +1 -0
  92. package/dist/chunk-AZADSX4Z.js +85 -0
  93. package/dist/chunk-AZADSX4Z.js.map +1 -0
  94. package/dist/chunk-BPCH5LJ3.js +36 -0
  95. package/dist/chunk-BPCH5LJ3.js.map +1 -0
  96. package/dist/chunk-CDI7353B.js +40 -0
  97. package/dist/chunk-CDI7353B.js.map +1 -0
  98. package/dist/chunk-CKNWXYMA.js +53 -0
  99. package/dist/chunk-CKNWXYMA.js.map +1 -0
  100. package/dist/chunk-DNJI65VQ.js +22 -0
  101. package/dist/chunk-DNJI65VQ.js.map +1 -0
  102. package/dist/chunk-DOUDJU4P.js +63 -0
  103. package/dist/chunk-DOUDJU4P.js.map +1 -0
  104. package/dist/chunk-DRCMGIQ6.js +64 -0
  105. package/dist/chunk-DRCMGIQ6.js.map +1 -0
  106. package/dist/chunk-DZOBXK2S.js +28 -0
  107. package/dist/chunk-DZOBXK2S.js.map +1 -0
  108. package/dist/chunk-EN4OJCEF.js +54 -0
  109. package/dist/chunk-EN4OJCEF.js.map +1 -0
  110. package/dist/chunk-EVHZFYWX.js +33 -0
  111. package/dist/chunk-EVHZFYWX.js.map +1 -0
  112. package/dist/chunk-G2VKWNZA.js +53 -0
  113. package/dist/chunk-G2VKWNZA.js.map +1 -0
  114. package/dist/chunk-GTM2DE4C.js +156 -0
  115. package/dist/chunk-GTM2DE4C.js.map +1 -0
  116. package/dist/chunk-H3ZVGTJM.js +165 -0
  117. package/dist/chunk-H3ZVGTJM.js.map +1 -0
  118. package/dist/chunk-HWAWUEHC.js +28 -0
  119. package/dist/chunk-HWAWUEHC.js.map +1 -0
  120. package/dist/chunk-HWJVRTWO.js +36 -0
  121. package/dist/chunk-HWJVRTWO.js.map +1 -0
  122. package/dist/chunk-ILADNTUB.js +77 -0
  123. package/dist/chunk-ILADNTUB.js.map +1 -0
  124. package/dist/chunk-IUPVQWO5.js +31 -0
  125. package/dist/chunk-IUPVQWO5.js.map +1 -0
  126. package/dist/chunk-JFOW2DI5.js +43 -0
  127. package/dist/chunk-JFOW2DI5.js.map +1 -0
  128. package/dist/chunk-JRFSUVSO.js +66 -0
  129. package/dist/chunk-JRFSUVSO.js.map +1 -0
  130. package/dist/chunk-KI6OTVID.js +91 -0
  131. package/dist/chunk-KI6OTVID.js.map +1 -0
  132. package/dist/chunk-LUM2YJBH.js +73 -0
  133. package/dist/chunk-LUM2YJBH.js.map +1 -0
  134. package/dist/chunk-NHPISZWS.js +71 -0
  135. package/dist/chunk-NHPISZWS.js.map +1 -0
  136. package/dist/chunk-NOLWJJHT.js +52 -0
  137. package/dist/chunk-NOLWJJHT.js.map +1 -0
  138. package/dist/chunk-NPVINX3Q.js +20 -0
  139. package/dist/chunk-NPVINX3Q.js.map +1 -0
  140. package/dist/chunk-NSMU66ZX.js +47 -0
  141. package/dist/chunk-NSMU66ZX.js.map +1 -0
  142. package/dist/chunk-O5SWPHUQ.js +79 -0
  143. package/dist/chunk-O5SWPHUQ.js.map +1 -0
  144. package/dist/chunk-OGVSZ7NV.js +53 -0
  145. package/dist/chunk-OGVSZ7NV.js.map +1 -0
  146. package/dist/chunk-OLHMMFQ7.js +43 -0
  147. package/dist/chunk-OLHMMFQ7.js.map +1 -0
  148. package/dist/chunk-ONMTHBZ4.js +54 -0
  149. package/dist/chunk-ONMTHBZ4.js.map +1 -0
  150. package/dist/chunk-OVSIOZHJ.js +56 -0
  151. package/dist/chunk-OVSIOZHJ.js.map +1 -0
  152. package/dist/chunk-Q54CVE3W.js +154 -0
  153. package/dist/chunk-Q54CVE3W.js.map +1 -0
  154. package/dist/chunk-QEHTPQHL.js +35 -0
  155. package/dist/chunk-QEHTPQHL.js.map +1 -0
  156. package/dist/chunk-QEIEWGHA.js +62 -0
  157. package/dist/chunk-QEIEWGHA.js.map +1 -0
  158. package/dist/chunk-QQHBEACI.js +88 -0
  159. package/dist/chunk-QQHBEACI.js.map +1 -0
  160. package/dist/chunk-RJTDQOT2.js +73 -0
  161. package/dist/chunk-RJTDQOT2.js.map +1 -0
  162. package/dist/chunk-RQ3RXKAZ.js +203 -0
  163. package/dist/chunk-RQ3RXKAZ.js.map +1 -0
  164. package/dist/chunk-RZK2S2OO.js +126 -0
  165. package/dist/chunk-RZK2S2OO.js.map +1 -0
  166. package/dist/chunk-SAP7JSSO.js +106 -0
  167. package/dist/chunk-SAP7JSSO.js.map +1 -0
  168. package/dist/chunk-T3TQPOVM.js +79 -0
  169. package/dist/chunk-T3TQPOVM.js.map +1 -0
  170. package/dist/chunk-T3UQ7G4T.js +58 -0
  171. package/dist/chunk-T3UQ7G4T.js.map +1 -0
  172. package/dist/chunk-T56TTOI6.js +53 -0
  173. package/dist/chunk-T56TTOI6.js.map +1 -0
  174. package/dist/chunk-T7EFDE2L.js +36 -0
  175. package/dist/chunk-T7EFDE2L.js.map +1 -0
  176. package/dist/chunk-VFS3V3VY.js +91 -0
  177. package/dist/chunk-VFS3V3VY.js.map +1 -0
  178. package/dist/chunk-VOARBYVQ.js +44 -0
  179. package/dist/chunk-VOARBYVQ.js.map +1 -0
  180. package/dist/chunk-WDANALHD.js +95 -0
  181. package/dist/chunk-WDANALHD.js.map +1 -0
  182. package/dist/chunk-WSQNPRGN.js +12 -0
  183. package/dist/chunk-WSQNPRGN.js.map +1 -0
  184. package/dist/chunk-YPP7QHYT.js +393 -0
  185. package/dist/chunk-YPP7QHYT.js.map +1 -0
  186. package/dist/chunk-YTU7BRDW.js +72 -0
  187. package/dist/chunk-YTU7BRDW.js.map +1 -0
  188. package/dist/chunk-YYWODLER.js +111 -0
  189. package/dist/chunk-YYWODLER.js.map +1 -0
  190. package/dist/chunk-ZOXO3G3I.js +50 -0
  191. package/dist/chunk-ZOXO3G3I.js.map +1 -0
  192. package/dist/chunk-ZTFOR3AN.js +79 -0
  193. package/dist/chunk-ZTFOR3AN.js.map +1 -0
  194. package/dist/code-block.d.ts +14 -0
  195. package/dist/code-block.js +5 -0
  196. package/dist/code-block.js.map +1 -0
  197. package/dist/combobox.d.ts +26 -0
  198. package/dist/combobox.js +5 -0
  199. package/dist/combobox.js.map +1 -0
  200. package/dist/command-menu.d.ts +52 -0
  201. package/dist/command-menu.js +7 -0
  202. package/dist/command-menu.js.map +1 -0
  203. package/dist/container.d.ts +9 -0
  204. package/dist/container.js +5 -0
  205. package/dist/container.js.map +1 -0
  206. package/dist/cta-band.d.ts +12 -0
  207. package/dist/cta-band.js +5 -0
  208. package/dist/cta-band.js.map +1 -0
  209. package/dist/data-table.d.ts +58 -0
  210. package/dist/data-table.js +12 -0
  211. package/dist/data-table.js.map +1 -0
  212. package/dist/date-picker.d.ts +20 -0
  213. package/dist/date-picker.js +5 -0
  214. package/dist/date-picker.js.map +1 -0
  215. package/dist/dialog.d.ts +21 -0
  216. package/dist/dialog.js +5 -0
  217. package/dist/dialog.js.map +1 -0
  218. package/dist/divider.d.ts +12 -0
  219. package/dist/divider.js +5 -0
  220. package/dist/divider.js.map +1 -0
  221. package/dist/docker-stack-card.d.ts +21 -0
  222. package/dist/docker-stack-card.js +6 -0
  223. package/dist/docker-stack-card.js.map +1 -0
  224. package/dist/donut.d.ts +15 -0
  225. package/dist/donut.js +5 -0
  226. package/dist/donut.js.map +1 -0
  227. package/dist/dropdown-menu.d.ts +15 -0
  228. package/dist/dropdown-menu.js +5 -0
  229. package/dist/dropdown-menu.js.map +1 -0
  230. package/dist/empty.d.ts +12 -0
  231. package/dist/empty.js +5 -0
  232. package/dist/empty.js.map +1 -0
  233. package/dist/feature-card.d.ts +11 -0
  234. package/dist/feature-card.js +6 -0
  235. package/dist/feature-card.js.map +1 -0
  236. package/dist/file-upload.d.ts +20 -0
  237. package/dist/file-upload.js +5 -0
  238. package/dist/file-upload.js.map +1 -0
  239. package/dist/footer.d.ts +35 -0
  240. package/dist/footer.js +6 -0
  241. package/dist/footer.js.map +1 -0
  242. package/dist/form-row.d.ts +19 -0
  243. package/dist/form-row.js +5 -0
  244. package/dist/form-row.js.map +1 -0
  245. package/dist/glow-card.d.ts +14 -0
  246. package/dist/glow-card.js +5 -0
  247. package/dist/glow-card.js.map +1 -0
  248. package/dist/hero-block.d.ts +16 -0
  249. package/dist/hero-block.js +7 -0
  250. package/dist/hero-block.js.map +1 -0
  251. package/dist/host-card.d.ts +27 -0
  252. package/dist/host-card.js +6 -0
  253. package/dist/host-card.js.map +1 -0
  254. package/dist/incident-card.d.ts +23 -0
  255. package/dist/incident-card.js +5 -0
  256. package/dist/incident-card.js.map +1 -0
  257. package/dist/index.d.ts +77 -960
  258. package/dist/index.js +69 -3812
  259. package/dist/index.js.map +1 -1
  260. package/dist/input.d.ts +10 -0
  261. package/dist/input.js +5 -0
  262. package/dist/input.js.map +1 -0
  263. package/dist/kbd.d.ts +24 -0
  264. package/dist/kbd.js +5 -0
  265. package/dist/kbd.js.map +1 -0
  266. package/dist/log-viewer.d.ts +35 -0
  267. package/dist/log-viewer.js +5 -0
  268. package/dist/log-viewer.js.map +1 -0
  269. package/dist/meter.d.ts +23 -0
  270. package/dist/meter.js +5 -0
  271. package/dist/meter.js.map +1 -0
  272. package/dist/monogram.d.ts +20 -0
  273. package/dist/monogram.js +5 -0
  274. package/dist/monogram.js.map +1 -0
  275. package/dist/noir-glow-background.d.ts +56 -0
  276. package/dist/noir-glow-background.js +4 -0
  277. package/dist/noir-glow-background.js.map +1 -0
  278. package/dist/pagination.d.ts +16 -0
  279. package/dist/pagination.js +5 -0
  280. package/dist/pagination.js.map +1 -0
  281. package/dist/panel.d.ts +12 -0
  282. package/dist/panel.js +5 -0
  283. package/dist/panel.js.map +1 -0
  284. package/dist/password-input.d.ts +10 -0
  285. package/dist/password-input.js +5 -0
  286. package/dist/password-input.js.map +1 -0
  287. package/dist/pill.d.ts +17 -0
  288. package/dist/pill.js +5 -0
  289. package/dist/pill.js.map +1 -0
  290. package/dist/pricing-card.d.ts +20 -0
  291. package/dist/pricing-card.js +6 -0
  292. package/dist/pricing-card.js.map +1 -0
  293. package/dist/progress.d.ts +6 -0
  294. package/dist/progress.js +5 -0
  295. package/dist/progress.js.map +1 -0
  296. package/dist/radio-group.d.ts +18 -0
  297. package/dist/radio-group.js +5 -0
  298. package/dist/radio-group.js.map +1 -0
  299. package/dist/rollback-plan.d.ts +23 -0
  300. package/dist/rollback-plan.js +5 -0
  301. package/dist/rollback-plan.js.map +1 -0
  302. package/dist/segmented.d.ts +17 -0
  303. package/dist/segmented.js +5 -0
  304. package/dist/segmented.js.map +1 -0
  305. package/dist/select.d.ts +18 -0
  306. package/dist/select.js +5 -0
  307. package/dist/select.js.map +1 -0
  308. package/dist/service-health-card.d.ts +21 -0
  309. package/dist/service-health-card.js +6 -0
  310. package/dist/service-health-card.js.map +1 -0
  311. package/dist/sheet.d.ts +25 -0
  312. package/dist/sheet.js +5 -0
  313. package/dist/sheet.js.map +1 -0
  314. package/dist/skeleton.d.ts +13 -0
  315. package/dist/skeleton.js +5 -0
  316. package/dist/skeleton.js.map +1 -0
  317. package/dist/slider.d.ts +12 -0
  318. package/dist/slider.js +5 -0
  319. package/dist/slider.js.map +1 -0
  320. package/dist/sparkline.d.ts +16 -0
  321. package/dist/sparkline.js +5 -0
  322. package/dist/sparkline.js.map +1 -0
  323. package/dist/stat-card.d.ts +15 -0
  324. package/dist/stat-card.js +5 -0
  325. package/dist/stat-card.js.map +1 -0
  326. package/dist/status-dot.d.ts +13 -0
  327. package/dist/status-dot.js +5 -0
  328. package/dist/status-dot.js.map +1 -0
  329. package/dist/stepper.d.ts +16 -0
  330. package/dist/stepper.js +5 -0
  331. package/dist/stepper.js.map +1 -0
  332. package/dist/switch.d.ts +9 -0
  333. package/dist/switch.js +5 -0
  334. package/dist/switch.js.map +1 -0
  335. package/dist/tabs.d.ts +9 -0
  336. package/dist/tabs.js +5 -0
  337. package/dist/tabs.js.map +1 -0
  338. package/dist/tag-input.d.ts +20 -0
  339. package/dist/tag-input.js +5 -0
  340. package/dist/tag-input.js.map +1 -0
  341. package/dist/textarea.d.ts +10 -0
  342. package/dist/textarea.js +5 -0
  343. package/dist/textarea.js.map +1 -0
  344. package/dist/timeline.d.ts +30 -0
  345. package/dist/timeline.js +5 -0
  346. package/dist/timeline.js.map +1 -0
  347. package/dist/toaster.d.ts +10 -0
  348. package/dist/toaster.js +4 -0
  349. package/dist/toaster.js.map +1 -0
  350. package/dist/tooltip.d.ts +12 -0
  351. package/dist/tooltip.js +5 -0
  352. package/dist/tooltip.js.map +1 -0
  353. package/dist/utils.d.ts +5 -0
  354. package/dist/utils.js +4 -0
  355. package/dist/utils.js.map +1 -0
  356. package/globals-layers.css +1019 -0
  357. package/globals-v3.css +17 -0
  358. package/globals-v4.css +2 -0
  359. package/globals.css +12 -939
  360. package/package.json +85 -17
  361. package/registry.json +936 -0
  362. package/tailwind.css +9 -0
  363. package/tokens.css +20 -0
  364. package/tollerud-avatar-full.png +0 -0
  365. package/dist/index.cjs +0 -3938
  366. package/dist/index.cjs.map +0 -1
  367. package/dist/index.d.cts +0 -960
  368. /package/{tia-full-figure.svg → tollerud-avatar-full.svg} +0 -0
package/AGENTS.md CHANGED
@@ -19,7 +19,10 @@ Re-sync it whenever you bump the `@tollerud/ui` version and notice the local cop
19
19
  ## Install
20
20
 
21
21
  ```bash
22
- npm install @tollerud/ui clsx tailwind-merge tailwindcss
22
+ npm install @tollerud/ui clsx tailwind-merge tailwindcss@4 \
23
+ @radix-ui/react-dialog @radix-ui/react-dropdown-menu @radix-ui/react-progress \
24
+ @radix-ui/react-slot @radix-ui/react-tabs @radix-ui/react-tooltip \
25
+ lucide-react framer-motion sonner
23
26
  # Optional — only if using NoirGlowBackground
24
27
  npm install @paper-design/shaders-react
25
28
  ```
@@ -31,26 +34,44 @@ npm install @tollerud/footer
31
34
 
32
35
  ## Tailwind Setup
33
36
 
34
- The design system ships a Tailwind preset that provides all tokens. **Always apply it** without it, `text-tollerud-yellow`, `bg-tollerud-noir-900`, etc. will not resolve.
37
+ **Default: Tailwind v4.** One CSS importtokens, component layers, and Tailwind itself:
38
+
39
+ ```css
40
+ /* app/globals.css */
41
+ @import "@tollerud/ui/globals.css";
42
+ @source "../node_modules/@tollerud/ui/dist";
43
+ ```
44
+
45
+ Adjust `@source` relative to your CSS file. Without it, classes used only inside `@tollerud/ui` dist may be purged.
46
+
47
+ **Optional preset shim** — extra utilities from `tollerud-preset.js`:
35
48
 
36
49
  ```ts
37
50
  // tailwind.config.ts
51
+ import tollerudPreset from '@tollerud/ui/preset'
52
+ export default { presets: [tollerudPreset] }
53
+ ```
54
+
55
+ **Tailwind v3 (legacy)** — preset in config + `@tollerud/ui/globals-v3.css` after preflight/utilities:
56
+
57
+ ```ts
38
58
  import type { Config } from 'tailwindcss'
39
59
  import tollerudPreset from '@tollerud/ui/preset'
40
60
 
41
61
  const config: Config = {
42
62
  presets: [tollerudPreset],
43
- content: ['./src/**/*.{ts,tsx}'],
63
+ content: ['./src/**/*.{ts,tsx}', './node_modules/@tollerud/ui/dist/**/*.{js,mjs}'],
44
64
  }
45
65
  export default config
46
66
  ```
47
67
 
48
- Import the CSS in your root layout or `globals.css`:
49
68
  ```css
50
69
  @import "tailwindcss/preflight";
51
70
  @import "tailwindcss/utilities";
71
+ @import "@tollerud/ui/globals-v3.css";
52
72
  ```
53
- And import the design system tokens/base styles from `@tollerud/ui/globals.css` or copy them locally.
73
+
74
+ **Subpath imports:** `import { Button } from '@tollerud/ui/button'` — one entry per component for tree-shaking; the main `@tollerud/ui` barrel still works.
54
75
 
55
76
  ---
56
77
 
@@ -109,11 +130,12 @@ import { Tabs, TabsList, TabsTrigger, TabsContent } from '@tollerud/ui'
109
130
  import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from '@tollerud/ui'
110
131
  import { Sheet, SheetTrigger, SheetContent, SheetHeader, SheetTitle } from '@tollerud/ui'
111
132
  import { Skeleton, Progress, Toaster, GlowCard, NoirGlowBackground, BentoDashboard, Alert } from '@tollerud/ui'
133
+ import { BarChart, AreaChart, Donut, Sparkline, HeroBlock, FeatureCard, CTABand } from '@tollerud/ui'
112
134
  // Infra / homelab set
113
135
  import { HostCard, ServiceHealthCard, DockerStackCard, IncidentCard } from '@tollerud/ui'
114
136
  import { ApprovalCard, ActionDiff, AlertInbox, RollbackPlan, BackupStatusPanel } from '@tollerud/ui'
115
- // Footer
116
- import { Footer } from '@tollerud/ui' // or: import { Footer } from '@tollerud/footer'
137
+ // Footer & branding
138
+ import { Footer, Monogram } from '@tollerud/ui' // or: import { Footer } from '@tollerud/footer'
117
139
  ```
118
140
 
119
141
  ### Button
@@ -223,7 +245,7 @@ Built-in `⌘K` / `Ctrl+K` listener, arrow navigation, Esc to close, search acro
223
245
  ```tsx
224
246
  <DataTable
225
247
  columns={[
226
- { key: 'hostname', label: 'Host', sortable: true },
248
+ { key: 'hostname', label: 'Host', sortable: true, filterable: true },
227
249
  { key: 'status', label: 'Status', render: (_v, row) => <Badge variant={row.status === 'online' ? 'success' : 'error'}>{row.status}</Badge> },
228
250
  ]}
229
251
  data={hosts}
@@ -231,6 +253,8 @@ Built-in `⌘K` / `Ctrl+K` listener, arrow navigation, Esc to close, search acro
231
253
  onRowClick={(row) => {}}
232
254
  emptyMessage="No hosts found"
233
255
  />
256
+
257
+ // Optional rich mode: searchable, filter, selectable, pageSize, bulkActions, rowMenu, toolbarRight, emptyState
234
258
  ```
235
259
 
236
260
  ### Empty (empty states)
@@ -367,11 +391,10 @@ Use borders as the primary separation method. Only add shadows to lift overlays.
367
391
 
368
392
  When asked to add components, fix bugs, or cut a release:
369
393
 
370
- ### 1. Build and typecheck before committing
394
+ ### 1. Build and validate before committing
371
395
 
372
396
  ```bash
373
- npx tsc --noEmit -p tsconfig.build.json # must be clean
374
- npx tsup # verify the bundle builds
397
+ npm run validate # typecheck + lint + test + build
375
398
  ```
376
399
 
377
400
  ### 2. Every new component needs all four of these
@@ -381,7 +404,7 @@ npx tsup # verify the bundle builds
381
404
  | Component file | `components/ComponentName.tsx` |
382
405
  | Named export + type export | `components/index.ts` |
383
406
  | Registry entry | `registry.json` — add a `kebab-case` key with `name`, `description`, `files`, `dependencies`, `registryDependencies`, `type: "components:ui"` |
384
- | Docs preview | `examples/docs-nextjs/components/ComponentPreviews.tsx` (export function) + `examples/docs-nextjs/app/components/page.tsx` (section entry + import) |
407
+ | Docs preview | Add a `<Section>` + `<Demo>` in `docs-app/components/pages/page-*.jsx`. Register routes in `docs-app/components/docs-shell.jsx` (`NAV`, `PAGES`, `PAGE_TITLES`). Support code lives in `kit/`, `blocks/`, `backgrounds/`. Build: `npm run build:docs` → `_site/`. |
385
408
 
386
409
  ### 3. Version bump rules
387
410
 
@@ -394,7 +417,7 @@ npx tsup # verify the bundle builds
394
417
  Edit `package.json` version, then update these to match:
395
418
  - `COMPLETENESS_ROADMAP.md` — header line `### npm package (components/*.tsx) — vX.X.X`
396
419
  - `registry.json` — top-level `"version"` field
397
- - `ds/app.jsx` — sidebar brand line `user interface · vX.X.X`
420
+ - `docs/app.jsx` — sidebar brand line `user interface · vX.X.X`
398
421
 
399
422
  ### 4. Always update these files in the same commit
400
423
 
package/CHANGELOG.md ADDED
@@ -0,0 +1,411 @@
1
+ # Changelog
2
+
3
+ <!-- FORMAT RULES — the docs site parses this file at runtime.
4
+ • Entry heading: ## version — YYYY-MM-DD — Title
5
+ • Blank line between EVERY block (paragraph, heading, list, code fence)
6
+ • Section headings: ### Heading OR **Bold line** on its own line after a blank line
7
+ • Never write bold mid-paragraph as a heading substitute — it merges into surrounding text
8
+ -->
9
+
10
+ ## 3.1.0 — 2026-06-09 — Monogram component and docs fixes
11
+
12
+ Restores component styling in the docs site, ships the monogram as an npm component, and renames brand avatar assets.
13
+
14
+ ### New components
15
+
16
+ - `Monogram` — inline SVG with `color`: `yellow` | `black` | `white`, optional `size` and `title`
17
+
18
+ ### Fixes
19
+
20
+ - `Button` — `terminal` variant uses layer classes again
21
+ - `Pill`, `Avatar`, `Skeleton`, `Timeline`, `Switch`, `Slider`, `FormRow` — layer-class / prop adapter fixes
22
+ - `DatePicker` — calendar popover `z-50`
23
+ - `DataTable` — explicit `text-left` on column headers
24
+ - `CTABand` — inline accent bar margin
25
+ - `BentoDashboard` — real infra cards instead of placeholders
26
+ - `Footer` — uses `<Monogram color="yellow" />`
27
+ - `NoirGlowBackground` — `scale` and `offsetX` for edge-biased shader placement
28
+
29
+ ### Brand assets
30
+
31
+ - `tia-full-figure.svg` renamed to `tollerud-avatar-full.svg` (plus PNG export)
32
+ - npm exports: `@tollerud/ui/tollerud-avatar-full.svg` and `@tollerud/ui/tollerud-avatar-full.png`
33
+
34
+ ### Docs
35
+
36
+ - Docs-only brand layer: `Monogram`, `TiaPortrait`, `TollerudAvatarFull`, `NavLockup` under `@/components/brand`
37
+ - Tailwind `@source` fix, light-mode monogram via `currentColor`, onboarding/auth/foundations page updates
38
+
39
+ ### Migration
40
+
41
+ Drop-in. Replace any copied `tia-full-figure` paths with `tollerud-avatar-full`. Use `<Monogram />` instead of inline SVG or `<img src={logo}>` where you need theme-aware fill.
42
+
43
+ ---
44
+
45
+ ## 3.0.0 — 2026-06-09 — ESM-only and rich DataTable
46
+
47
+ Ships the full table pattern in npm, drops CommonJS builds, and adds release/props tooling.
48
+
49
+ ### Breaking change
50
+
51
+ - Package is **ESM-only** — `require('@tollerud/ui')` and `.cjs` subpath bundles are removed. Use `import` in apps and bundlers that support ES modules.
52
+
53
+ ### New features
54
+
55
+ - `DataTable` — search, segmented filter, row selection, bulk actions, per-row menus, pagination, loading skeletons, and custom empty states (optional; simple sort/filter mode unchanged)
56
+ - `npm run docs:props` — generates `PROPS.generated.md` from component `*Props` interfaces
57
+ - `npm run test:props` — drift check in `validate` / `prepublishOnly`
58
+ - Changesets — `npm run changeset` and `npm run version:release` (runs `sync:registry`)
59
+
60
+ ### Docs
61
+
62
+ - Retired docs-only `rich-datatable.jsx`; docs `DataTable` is an adapter over npm `DataTable`
63
+ - `PackageDataTable` remains the direct npm import alias on the components page
64
+
65
+ ### Migration
66
+
67
+ Replace `require('@tollerud/ui')` with ESM imports. For rich tables, pass the new optional props on `DataTable` instead of copying docs-only table code.
68
+
69
+ ---
70
+
71
+ ## 2.0.0 — 2026-06-09 — Peer dependency model
72
+
73
+ Radix, Lucide, Framer Motion, and Sonner move to peer dependencies so consumer apps do not bundle duplicate copies.
74
+
75
+ ### Breaking change
76
+
77
+ Install peers explicitly alongside `@tollerud/ui`:
78
+
79
+ ```bash
80
+ npm install @tollerud/ui clsx tailwind-merge tailwindcss@4 \
81
+ @radix-ui/react-dialog @radix-ui/react-dropdown-menu @radix-ui/react-progress \
82
+ @radix-ui/react-slot @radix-ui/react-tabs @radix-ui/react-tooltip \
83
+ lucide-react framer-motion sonner
84
+ ```
85
+
86
+ ### New features
87
+
88
+ - `@tollerud/ui/tailwind.css` — convenience import with documented `@source` hint
89
+ - `npm run test:package` — publint + `@arethetypeswrong/cli` on the package
90
+ - `npm run test:size` — size-limit budget on `dist/button.js` and `dist/index.js`
91
+ - `npm run sync:registry` — align `registry.json` version with `package.json` before publish
92
+
93
+ ### Docs
94
+
95
+ - Retired docs-only `grain-gl.jsx`; backgrounds and overview use npm `NoirGlowBackground`
96
+ - Publish workflow runs drift, package quality, size budget, docs build, and Playwright E2E
97
+
98
+ ### Migration
99
+
100
+ If you already had Radix/Lucide/Motion/Sonner in your app, add them to `package.json` if npm no longer hoists them from `@tollerud/ui`. No component API changes.
101
+
102
+ ## 1.4.0 — 2026-06-09 — Charts and marketing blocks
103
+
104
+ Palette-aware charts and landing-page blocks ship in the npm package. Docs site reorganized into `pages/`, `kit/`, `blocks/`, and `backgrounds/`.
105
+
106
+ ### New components
107
+
108
+ - `BarChart` — vertical bars with optional yellow accent series
109
+ - `AreaChart` — gradient area/line chart with grid lines
110
+ - `Donut` — donut chart with segment legend
111
+ - `Sparkline` — compact inline trend line
112
+ - `HeroBlock` — landing hero on noir glow (`intense` uses `NoirGlowBackground`)
113
+ - `FeatureCard` — icon chip + title + description
114
+ - `CTABand` — closing CTA with optional accent bar
115
+
116
+ ### Docs
117
+
118
+ - Charts and marketing import from `@tollerud/ui` (no duplicate `charts.jsx` / `marketing.jsx`)
119
+ - `docs-app/components/` taxonomy: routable `pages/page-*.jsx`, `kit/`, `blocks/rich-datatable.jsx`, `backgrounds/grain-gl.jsx`
120
+
121
+ ### Migration
122
+
123
+ Nothing breaking. Import charts and blocks from `@tollerud/ui` as named exports.
124
+
125
+ ## 1.3.0 — 2026-06-09 — Tailwind v4 as default CSS entry
126
+
127
+ `@tollerud/ui/globals.css` is now the Tailwind v4 bundle (tokens + component layers + `@import "tailwindcss"`). v3 projects move to `@tollerud/ui/globals-v3.css`.
128
+
129
+ ### Breaking change
130
+
131
+ If you were on Tailwind v3 and importing `@tollerud/ui/globals.css`, switch to `@tollerud/ui/globals-v3.css` and keep your v3 `tailwind.config.ts` preset setup.
132
+
133
+ ### Migration (v4 — recommended)
134
+
135
+ ```css
136
+ @import "@tollerud/ui/globals.css";
137
+ @source "../node_modules/@tollerud/ui/dist";
138
+ ```
139
+
140
+ `@tollerud/ui/globals-v4.css` remains as an alias for `globals.css`.
141
+
142
+ ### Docs
143
+
144
+ Install instructions, README, GETTING_STARTED, AGENTS.md, and SKILL.md now lead with Tailwind v4.
145
+
146
+ ## 1.2.0 — 2026-06-09 — Subpath exports, Tailwind v4 CSS, Playwright E2E
147
+
148
+ Per-component subpath imports, a dedicated Tailwind v4 stylesheet, expanded unit tests, and docs-site E2E smoke tests.
149
+
150
+ ### New features
151
+
152
+ - Subpath exports — `@tollerud/ui/button`, `@tollerud/ui/dialog`, `@tollerud/ui/utils`, and one entry per component (61 total)
153
+ - `@tollerud/ui/globals-v4.css` — single import for Tailwind v4 + tokens + component layers
154
+ - `@tollerud/ui/globals-layers.css` — shared component CSS layers (also imported by v3 `globals.css`)
155
+ - `npm run changelog:draft` — draft a CHANGELOG entry from commits since the latest version
156
+
157
+ ### Tests & CI
158
+
159
+ - Vitest coverage for `Dialog`, `DataTable`, and `CommandMenu`
160
+ - Playwright E2E smoke tests for the docs site (`npm run test:e2e`)
161
+ - CI verifies subpath bundles and `globals-v4.css` in the npm tarball
162
+
163
+ ### Migration
164
+
165
+ Nothing breaking. Existing `@tollerud/ui` barrel imports continue to work. For tree-shaking, switch to subpath imports. Tailwind v4 projects should prefer `@import "@tollerud/ui/globals-v4.css"`.
166
+
167
+ ## 1.1.5 — 2026-06-09 — Fix Tailwind preset color namespace
168
+
169
+ ### Bug fix
170
+
171
+ The Tailwind preset now exposes design-system colors under `tollerud.*`, matching the shipped component classes and documentation (`text-tollerud-yellow`, `bg-tollerud-noir-900`, `border-tollerud-border`, etc.).
172
+
173
+ Previously the preset exposed the same palette under `tia.*`, so consumer projects following the docs could miss generated `tollerud-*` utilities.
174
+
175
+ ### Details
176
+
177
+ - Renamed the preset color namespace from `tia` to `tollerud`
178
+ - Renamed the default package shadow token from `shadow-tia` to `shadow-tollerud`
179
+ - Added missing documented/component color aliases: `tollerud.accent`, `tollerud.foreground`, `tollerud.black`, `tollerud.white`, `tollerud.noir-950`, and `tollerud.noir-850`
180
+
181
+ ### Migration
182
+
183
+ Replace any `text-tia-*`, `bg-tia-*`, `border-tia-*`, or `shadow-tia` utilities with their `tollerud` equivalents.
184
+
185
+ ## 1.1.4 — 2026-06-09 — Fix: Alert tone colors missing in Tailwind v4
186
+
187
+ ### Bug fix
188
+
189
+ Alert `tone` prop colors (`danger`, `info`, `success`) were invisible in Tailwind v4 consumer projects when the `@source` path in `globals.css` pointed to the wrong `node_modules` location.
190
+
191
+ **Root cause:** Tailwind v4 resolves `@source` relative to the CSS file. When `globals.css` lives in `app/`, the path `../../node_modules/@tollerud/ui/dist/**` resolves to `app/node_modules/...` (which doesn't exist) instead of the root `node_modules`. The 9 tone utility classes were never scanned and therefore never generated.
192
+
193
+ **Fix:** Added an explicit `@layer utilities` block to `globals.css` that defines all 9 Alert tone classes unconditionally, bypassing scanning entirely. Classes are always emitted regardless of `@source` path configuration.
194
+
195
+ Classes added to safelist: `bg-red-500/5`, `bg-blue-500/5`, `bg-green-500/5`, `border-red-500/30`, `border-blue-500/30`, `border-green-500/30`, `text-red-400`, `text-blue-400`, `text-green-400`
196
+
197
+ No API changes.
198
+
199
+ ## 1.1.3 — 2026-06-09 — Fix: registry deps, source 'use client', React 19 devdep, docs drift
200
+
201
+ No component API changes. Six quality fixes from a review audit:
202
+
203
+ **1. registry.json — missing runtime dependencies**
204
+ All icon-using components now list `lucide-react` in their registry entry; `button` lists `@radix-ui/react-slot`; `status-dot` lists `framer-motion`; `dialog` lists `lucide-react`. Affects manual/registry-copy installs only — the npm bundle was already correct.
205
+
206
+ Entries updated: `button`, `status-dot`, `accordion`, `breadcrumb`, `combobox`, `date-picker`, `dialog`, `file-upload`, `pagination`, `password-input`, `pricing-card`, `stepper`, `tag-input`
207
+
208
+ **2. Source components — added `'use client'` directive**
209
+ 12 hook-using source files were missing the directive. The bundled package was protected by the tsup post-build injection, but copied source files (registry/manual flow) would fail in Next.js App Router.
210
+
211
+ Added `'use client'` to: `Accordion`, `Avatar`, `Checkbox`, `Combobox`, `DatePicker`, `FileUpload`, `FormRow`, `PasswordInput`, `RadioGroup`, `Slider`, `Switch`, `TagInput`
212
+
213
+ **3. package.json — aligned React 19 devDependencies**
214
+ `react-dom` dev dep bumped from `^18.3.1` → `^19.2.7` to match `react: ^19.2.7`, eliminating the `ELSPROBLEMS` peer conflict in local dev.
215
+
216
+ **4. docs Getting Started page — rewritten to npm-package-first**
217
+ Was: manual file-copy instructions, wrong token value (`--tollerud-yellow` = `#E8D500`), old component list (29 components).
218
+ Now: `npm install @tollerud/ui`, Tailwind v3 + v4 snippets, full 61-component import block, correct yellow token docs, RSC safety note.
219
+
220
+ **5. docs Brand page — corrected monogram color**
221
+ `#FFF200` → `#FFFF00` (two references: description text and inline style). This now matches `BRAND.md`, `SKILL.md`, and the package tokens.
222
+
223
+ **6. .gitignore — added `*.tsbuildinfo`**
224
+ `examples/docs-nextjs/tsconfig.json` has `"incremental": true`, generating a `.tsbuildinfo` file that was untracked. Suppressed globally.
225
+
226
+ ## 1.1.2 — 2026-06-09 — Ship AGENTS.md + SKILL.md inside the npm package
227
+
228
+ `AGENTS.md` and `SKILL.md` are now included in the published package (`files` in `package.json`). After `npm install @tollerud/ui`, both files are available at:
229
+
230
+ - `node_modules/@tollerud/ui/AGENTS.md`
231
+ - `node_modules/@tollerud/ui/SKILL.md`
232
+
233
+ This lets Claude Code (and other agents) read them directly without needing a separate `curl` or a GitHub URL.
234
+
235
+ ## 1.1.1 — 2026-06-09 — Docs: AGENTS.md package update + migration instructions
236
+
237
+ No component or API changes. Documentation only.
238
+
239
+ - `AGENTS.md` — added "Updating the npm package" checklist (component checklist, version bump rules, required file updates, build/push steps) and "Fixing copy/paste component patterns" guide (detection, migration, prop drift checks, common patterns table) for agents working in consumer projects
240
+
241
+ ## 1.1.0 — 2026-06-09 — Fix: Combobox + DatePicker close on window resize
242
+
243
+ `Combobox` and `DatePicker` rendered their popover as `position: absolute` with no awareness of window resize — if the viewport changed while a popover was open it would stay in place, misaligned from its trigger. Both now close on `window resize`, consistent with the existing close-on-scroll behaviour.
244
+
245
+ `DropdownMenu` was unaffected (Radix handles this internally).
246
+
247
+ **Migration:** no API changes — behaviour only.
248
+
249
+ ## 1.0.9 — 2026-06-08 — Ship the 19 components that only existed in the docs site
250
+
251
+ Closes the long-standing gap between the marketing/docs site and the installable
252
+ `@tollerud/ui` package — every component previously listed under "still missing"
253
+ in `COMPLETENESS_ROADMAP.md` now ships from `components/index.ts`:
254
+
255
+ - **New primitives:** `Divider`, `Pill`, `Avatar` / `AvatarGroup`, `Breadcrumb`, `Pagination`, `Segmented`, `Stepper`
256
+ - **New layout/display:** `Panel`, `Meter`, `FormRow`, `PricingCard`
257
+ - **New form controls:** `Accordion` (+ `AccordionItem`/`AccordionTrigger`/`AccordionContent`), `Slider`, `PasswordInput`, `Combobox`, `DatePicker`, `FileUpload`, `TagInput`
258
+
259
+ All built from scratch as accessible, theme-aware components following existing
260
+ conventions (`forwardRef`, `cn`, `tollerud-*` design tokens) — no new runtime
261
+ dependencies were added.
262
+
263
+ ## 1.0.8 — 2026-06-08 — Fix: mark package as Client Components for RSC/SSR
264
+
265
+ **Fixes a breaking issue introduced in earlier versions:** importing *anything* from `@tollerud/ui` — even a plain helper like `buttonVariants` — into a Next.js Server Component crashed at build/runtime. The package is bundled into a single `dist/index.js`/`.cjs` file, and esbuild silently drops module-level `"use client"` directives during bundling, so the bundle was never marked as client code even though it's full of components using hooks (`useState`, `useEffect`, etc.).
266
+
267
+ - `dist/index.js` and `dist/index.cjs` now start with `'use client'` (injected via a post-build step in `tsup.config.ts`, since esbuild rejects it as a bundling banner) — this correctly tells Next.js's RSC bundler that the whole package is client code
268
+ - Added missing `'use client'` directives to `ActionDiff`, `AlertInbox`, `Select`, and `LogViewer` source files (they used hooks without declaring the boundary — harmless pre-bundling, but good hygiene and required if these are ever built unbundled)
269
+
270
+ **Migration:** just update to `1.0.8` — no code changes required. Server Components can now safely import from `@tollerud/ui` (you'll just be importing client-bundled code, which is fine for things like `buttonVariants` that are plain functions).
271
+
272
+ ## 1.0.7 — 2026-06-08 — Button `asChild` + `buttonVariants`
273
+
274
+ - `Button` now supports an `asChild` prop (via `@radix-ui/react-slot`) — renders its single child element instead of a `<button>`, merging Button's classes/props onto it. Lets you style a `<Link>` (or any other element) as a button without invalid `<a>`-in-`<button>` nesting: `<Button asChild variant="primary"><Link href="/foo">Go</Link></Button>`
275
+ - Exported `buttonVariants({ variant, size, className })` — returns the Button class string directly, for cases where wrapping with `asChild` is awkward
276
+ - Exported `ButtonVariantProps` type
277
+ - Added `@radix-ui/react-slot` as a direct dependency
278
+
279
+ ## 1.0.6 — 2026-06-08 — Fix brand color docs
280
+
281
+ - Fixed brand color swatches in `ds/page-foundations.jsx` — "Yellow" now correctly shows `#FFFF00` / `--tollerud-yellow`, "Yellow warm" shows `#E8D500` / `--tollerud-yellow-warm`
282
+ - Updated `BRAND.md` — monogram color corrected to `#FFFF00`
283
+
284
+ ## 1.0.5 — 2026-06-08 — Yellow token rename + AGENTS.md
285
+
286
+ **Breaking token changes:**
287
+ - `--tollerud-yellow` is now `#FFFF00` (was `#E8D500`) — the brighter, high-voltage yellow is now the primary accent
288
+ - `--tollerud-yellow-bright` removed — replaced by `--tollerud-yellow-warm: #E8D500` for the warmer secondary yellow
289
+ - Tailwind: `tollerud.yellow` → `#FFFF00`, `tollerud.yellow-bright` → renamed to `tollerud.yellow-warm: #E8D500`
290
+ - All glow `rgba` values updated from `rgba(232,213,0,...)` to `rgba(255,255,0,...)`
291
+ - Semantic tokens `--primary`, `--ring`, `--chart-1`, `--border-accent` updated to `#FFFF00`
292
+
293
+ **Migration:** replace `tollerud-yellow-bright` → `tollerud-yellow`, and `tollerud-yellow` → `tollerud-yellow-warm` wherever you relied on the old warm `#E8D500` value.
294
+
295
+ **New files:**
296
+ - Added `AGENTS.md` — cross-tool AI agent guide (Claude Code, Cursor, Copilot, Codex)
297
+ - Added `.github/copilot-instructions.md` — GitHub Copilot native instructions
298
+
299
+ ## 2026-05-26 — Form Primitives + Footer
300
+
301
+ - Added **Textarea** — multiline input with label/error support, same pattern as Input
302
+ - Added **Select** — styled native `<select>` with placeholder, label/error, custom chevron
303
+ - Added **Checkbox** — custom-styled checkbox with checkmark SVG, label, focus-visible ring
304
+ - Added **Switch** — toggle switch with role="switch", animated thumb, label
305
+ - Added **RadioGroup / Radio** — fieldset-based radio group with custom dot indicator, label/error
306
+ - Added **Footer** — ported from `@tollerud/footer` (v1.1.2), uses Tollerud Design System design tokens, supports `accent` variant, responsive/row layouts, unstyled mode
307
+ - 6 new components → total **29 components** now
308
+
309
+ ## 2026-05-26 — Phase 5: Docs App
310
+
311
+ - Created `examples/docs-nextjs/` — a full Geist-inspired documentation site:
312
+ - Foundations: Color, Typography, Motion, Accessibility
313
+ - Components: Catalog with all 23 components organized by category
314
+ - Patterns: Dashboard and Approval Flow templates
315
+ - Brand: Tia avatar, voice, and Tollerud glow guide
316
+ - Changelog: Version history timeline
317
+ - Docs use the same design system components for consistent preview
318
+ - Dark theme with sidebar navigation, responsive layout
319
+
320
+ ## 2026-05-26 — Phase 4: shadcn Registry Compatibility
321
+
322
+ - Added `components.json` — shadcn UI registry format for tooling compatibility
323
+ - Added `registry.json` — component registry with all 23 components, dependencies, and metadata
324
+ - Added `GETTING_STARTED.md` — one-command install guide with Tailwind setup and component import examples
325
+ - Portable import paths documented: `@/components/ui` and `@/lib/utils`
326
+
327
+ ## 2026-05-26 — Phase 3: Homelab Operational Components
328
+
329
+ 11 new homelab-specific components for infrastructure management:
330
+
331
+ **Health & Monitoring**
332
+ - `ServiceHealthCard` — service status card with uptime, response time, version
333
+ - `HostCard` — server/VM card with CPU, RAM, disk, containers, IP
334
+ - `DockerStackCard` — Docker Compose stack overview with per-service health
335
+ - `IncidentCard` — severity-graded incident/alert card (critical→info)
336
+
337
+ **Actions & Approval**
338
+ - `ApprovalCard` — approve/reject card for pending operations
339
+ - `ActionDiff` — unified diff viewer with line numbers, add/remove/context
340
+ - `RollbackPlan` — ordered rollback steps with execution status
341
+
342
+ **Logs & Alerts**
343
+ - `LogViewer` — terminal-style scrollable log viewer with search, live follow, level coloring
344
+ - `AlertInbox` — alert feed with count badges, severity filter, acknowledge action
345
+
346
+ **Feed & History**
347
+ - `Timeline` — vertical timeline with status dots, connecting lines, metadata badges
348
+ - `BackupStatusPanel` — backup job overview with per-job status and schedule
349
+
350
+ ## 2026-05-26 — Phase 2: Command-First Shell
351
+
352
+ - **Kbd** — Raycast-style keyboard shortcut chip (`⌘K`, `⌘⇧S`, etc.), 2 sizes.
353
+ - **ActionRow** — Command/action item row with icon, label, description, shortcut, keyboard navigation (`highlighted` prop).
354
+ - **CommandMenu** — Full command palette: search, groups, arrow key nav, `Enter`/`Esc`, auto-focus, body scroll lock, footer hints, custom filter support.
355
+ - **CSS classes**: `.tollerud-kbd`, `.tollerud-action-row`, `.tollerud-cmd`, `.tollerud-cmd-overlay`, `.tollerud-cmd__*` — in both `globals.css` and `tokens.css`.
356
+ - **KEYBOARD.md** — Keyboard contract document: global shortcuts, component contracts, accessibility requirements, implementation rules.
357
+
358
+ ## 2026-05-26 — NoirGlowBackground
359
+
360
+ - Ported the real Tollerud.no background source from `MathiasOki/tollerud-landing`.
361
+ - Added `components/NoirGlowBackground.tsx` using `@paper-design/shaders-react` / `GrainGradient`.
362
+ - Added CSS fallback classes: `.tollerud-noir-glow-root`, `.tollerud-noir-glow-bg`, `.tollerud-noir-glow-vignette`, `.tollerud-noir-noise`.
363
+ - Added acid-yellow token `--tollerud-acid` / `tollerud-acid` for Tollerud voltage.
364
+ - Updated `preview.html` and the Next.js example hero to use the glow background.
365
+ - Added `BACKGROUNDS.md` documentation.
366
+
367
+ ## 2026-05-25 — v1.0 Next.js Release
368
+
369
+ - **Tailwind preset** (`tollerud-preset.js`) — drop into any Next.js project
370
+ - **Globals.css** with shadcn-compatible semantic tokens (`--background`, `--primary`, `--ring`, etc.)
371
+ - **React components** — Button, Card, Badge, StatusDot, Input, CodeBlock, StatCard, Container
372
+ - **ACCESSIBILITY.md** — contrast ratios, focus rings, touch targets, reduced motion
373
+ - **COMPONENTS.md** — usage matrix for all component variants
374
+ - **VOICE.md** — copy guidelines, terminal-style CTAs, tone rules
375
+ - **CHANGELOG.md** — this file
376
+ - **Graphify-inspired additions**: grid backgrounds, glass nav, terminal CTAs, gradient accents, pills, tight display typography
377
+ - **Motion tokens**: duration, easing, reduced-motion support
378
+ - **Chart tokens**: accessible color palette for data viz
379
+
380
+ ### What shipped
381
+
382
+ ```
383
+ design-system/
384
+ ├── package.json
385
+ ├── README.md
386
+ ├── CHANGELOG.md
387
+ ├── ACCESSIBILITY.md
388
+ ├── COMPONENTS.md
389
+ ├── VOICE.md
390
+ ├── COMPLETENESS_ROADMAP.md
391
+ ├── tollerud-preset.js # ← drop-in Tailwind preset
392
+ ├── tailwind.config.js # (backward compat)
393
+ ├── tokens.css # (backward compat)
394
+ ├── globals.css # ← full semantic tokens + components
395
+ ├── preview.html
396
+ ├── tollerud-avatar.svg
397
+ ├── components/
398
+ │ ├── index.ts
399
+ │ ├── Button.tsx
400
+ │ ├── Card.tsx
401
+ │ ├── Badge.tsx
402
+ │ ├── StatusDot.tsx
403
+ │ ├── Input.tsx
404
+ │ ├── CodeBlock.tsx
405
+ │ ├── StatCard.tsx
406
+ │ └── Container.tsx
407
+ ├── examples/
408
+ │ └── nextjs/
409
+ │ └── tailwind.config.ts
410
+ └── components.css
411
+ ```