@tollerud/ui 1.1.4 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/AGENTS.md +34 -11
  2. package/CHANGELOG.md +376 -0
  3. package/COMPONENTS.md +951 -0
  4. package/GETTING_STARTED.md +159 -0
  5. package/README.md +51 -43
  6. package/SKILL.md +55 -19
  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 +27 -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 +5 -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-3TGMGBKM.js +393 -0
  59. package/dist/chunk-3TGMGBKM.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-7TOT5ME3.js +53 -0
  83. package/dist/chunk-7TOT5ME3.js.map +1 -0
  84. package/dist/chunk-A6L5C3IJ.js +47 -0
  85. package/dist/chunk-A6L5C3IJ.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-AZADSX4Z.js +85 -0
  91. package/dist/chunk-AZADSX4Z.js.map +1 -0
  92. package/dist/chunk-BPCH5LJ3.js +36 -0
  93. package/dist/chunk-BPCH5LJ3.js.map +1 -0
  94. package/dist/chunk-CBQ63EBL.js +85 -0
  95. package/dist/chunk-CBQ63EBL.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-DFM7UUKB.js +79 -0
  101. package/dist/chunk-DFM7UUKB.js.map +1 -0
  102. package/dist/chunk-DGCRHVWW.js +84 -0
  103. package/dist/chunk-DGCRHVWW.js.map +1 -0
  104. package/dist/chunk-DNJI65VQ.js +22 -0
  105. package/dist/chunk-DNJI65VQ.js.map +1 -0
  106. package/dist/chunk-DOUDJU4P.js +63 -0
  107. package/dist/chunk-DOUDJU4P.js.map +1 -0
  108. package/dist/chunk-DRCMGIQ6.js +64 -0
  109. package/dist/chunk-DRCMGIQ6.js.map +1 -0
  110. package/dist/chunk-DZOBXK2S.js +28 -0
  111. package/dist/chunk-DZOBXK2S.js.map +1 -0
  112. package/dist/chunk-EN4OJCEF.js +54 -0
  113. package/dist/chunk-EN4OJCEF.js.map +1 -0
  114. package/dist/chunk-EVHZFYWX.js +33 -0
  115. package/dist/chunk-EVHZFYWX.js.map +1 -0
  116. package/dist/chunk-FGXOV2QH.js +23 -0
  117. package/dist/chunk-FGXOV2QH.js.map +1 -0
  118. package/dist/chunk-G2VKWNZA.js +53 -0
  119. package/dist/chunk-G2VKWNZA.js.map +1 -0
  120. package/dist/chunk-GTM2DE4C.js +156 -0
  121. package/dist/chunk-GTM2DE4C.js.map +1 -0
  122. package/dist/chunk-H3ZVGTJM.js +165 -0
  123. package/dist/chunk-H3ZVGTJM.js.map +1 -0
  124. package/dist/chunk-HWAWUEHC.js +28 -0
  125. package/dist/chunk-HWAWUEHC.js.map +1 -0
  126. package/dist/chunk-HWJVRTWO.js +36 -0
  127. package/dist/chunk-HWJVRTWO.js.map +1 -0
  128. package/dist/chunk-HYQGOC2E.js +79 -0
  129. package/dist/chunk-HYQGOC2E.js.map +1 -0
  130. package/dist/chunk-ILADNTUB.js +77 -0
  131. package/dist/chunk-ILADNTUB.js.map +1 -0
  132. package/dist/chunk-ISHZ6ZPJ.js +31 -0
  133. package/dist/chunk-ISHZ6ZPJ.js.map +1 -0
  134. package/dist/chunk-JRFSUVSO.js +66 -0
  135. package/dist/chunk-JRFSUVSO.js.map +1 -0
  136. package/dist/chunk-KI6OTVID.js +91 -0
  137. package/dist/chunk-KI6OTVID.js.map +1 -0
  138. package/dist/chunk-LUM2YJBH.js +73 -0
  139. package/dist/chunk-LUM2YJBH.js.map +1 -0
  140. package/dist/chunk-NHPISZWS.js +71 -0
  141. package/dist/chunk-NHPISZWS.js.map +1 -0
  142. package/dist/chunk-NOLWJJHT.js +52 -0
  143. package/dist/chunk-NOLWJJHT.js.map +1 -0
  144. package/dist/chunk-NPVINX3Q.js +20 -0
  145. package/dist/chunk-NPVINX3Q.js.map +1 -0
  146. package/dist/chunk-NSMU66ZX.js +47 -0
  147. package/dist/chunk-NSMU66ZX.js.map +1 -0
  148. package/dist/chunk-O57QMLNI.js +68 -0
  149. package/dist/chunk-O57QMLNI.js.map +1 -0
  150. package/dist/chunk-O5SWPHUQ.js +79 -0
  151. package/dist/chunk-O5SWPHUQ.js.map +1 -0
  152. package/dist/chunk-OGVSZ7NV.js +53 -0
  153. package/dist/chunk-OGVSZ7NV.js.map +1 -0
  154. package/dist/chunk-OONIUDST.js +48 -0
  155. package/dist/chunk-OONIUDST.js.map +1 -0
  156. package/dist/chunk-PLF3BBQI.js +139 -0
  157. package/dist/chunk-PLF3BBQI.js.map +1 -0
  158. package/dist/chunk-Q74VRQEX.js +26 -0
  159. package/dist/chunk-Q74VRQEX.js.map +1 -0
  160. package/dist/chunk-QEHTPQHL.js +35 -0
  161. package/dist/chunk-QEHTPQHL.js.map +1 -0
  162. package/dist/chunk-RJTDQOT2.js +73 -0
  163. package/dist/chunk-RJTDQOT2.js.map +1 -0
  164. package/dist/chunk-RQ3RXKAZ.js +203 -0
  165. package/dist/chunk-RQ3RXKAZ.js.map +1 -0
  166. package/dist/chunk-RWJELAS6.js +46 -0
  167. package/dist/chunk-RWJELAS6.js.map +1 -0
  168. package/dist/chunk-RZK2S2OO.js +126 -0
  169. package/dist/chunk-RZK2S2OO.js.map +1 -0
  170. package/dist/chunk-SAP7JSSO.js +106 -0
  171. package/dist/chunk-SAP7JSSO.js.map +1 -0
  172. package/dist/chunk-T3TQPOVM.js +79 -0
  173. package/dist/chunk-T3TQPOVM.js.map +1 -0
  174. package/dist/chunk-T56TTOI6.js +53 -0
  175. package/dist/chunk-T56TTOI6.js.map +1 -0
  176. package/dist/chunk-T7EFDE2L.js +36 -0
  177. package/dist/chunk-T7EFDE2L.js.map +1 -0
  178. package/dist/chunk-V3P5QLLX.js +154 -0
  179. package/dist/chunk-V3P5QLLX.js.map +1 -0
  180. package/dist/chunk-VTRUUT5K.js +31 -0
  181. package/dist/chunk-VTRUUT5K.js.map +1 -0
  182. package/dist/chunk-WDANALHD.js +95 -0
  183. package/dist/chunk-WDANALHD.js.map +1 -0
  184. package/dist/chunk-WSQNPRGN.js +12 -0
  185. package/dist/chunk-WSQNPRGN.js.map +1 -0
  186. package/dist/chunk-XR5QBVEV.js +56 -0
  187. package/dist/chunk-XR5QBVEV.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/code-block.d.ts +14 -0
  193. package/dist/code-block.js +5 -0
  194. package/dist/code-block.js.map +1 -0
  195. package/dist/combobox.d.ts +26 -0
  196. package/dist/combobox.js +5 -0
  197. package/dist/combobox.js.map +1 -0
  198. package/dist/command-menu.d.ts +52 -0
  199. package/dist/command-menu.js +7 -0
  200. package/dist/command-menu.js.map +1 -0
  201. package/dist/container.d.ts +9 -0
  202. package/dist/container.js +5 -0
  203. package/dist/container.js.map +1 -0
  204. package/dist/cta-band.d.ts +12 -0
  205. package/dist/cta-band.js +5 -0
  206. package/dist/cta-band.js.map +1 -0
  207. package/dist/data-table.d.ts +58 -0
  208. package/dist/data-table.js +12 -0
  209. package/dist/data-table.js.map +1 -0
  210. package/dist/date-picker.d.ts +20 -0
  211. package/dist/date-picker.js +5 -0
  212. package/dist/date-picker.js.map +1 -0
  213. package/dist/dialog.d.ts +21 -0
  214. package/dist/dialog.js +5 -0
  215. package/dist/dialog.js.map +1 -0
  216. package/dist/divider.d.ts +12 -0
  217. package/dist/divider.js +5 -0
  218. package/dist/divider.js.map +1 -0
  219. package/dist/docker-stack-card.d.ts +21 -0
  220. package/dist/docker-stack-card.js +6 -0
  221. package/dist/docker-stack-card.js.map +1 -0
  222. package/dist/donut.d.ts +15 -0
  223. package/dist/donut.js +5 -0
  224. package/dist/donut.js.map +1 -0
  225. package/dist/dropdown-menu.d.ts +15 -0
  226. package/dist/dropdown-menu.js +5 -0
  227. package/dist/dropdown-menu.js.map +1 -0
  228. package/dist/empty.d.ts +12 -0
  229. package/dist/empty.js +5 -0
  230. package/dist/empty.js.map +1 -0
  231. package/dist/feature-card.d.ts +11 -0
  232. package/dist/feature-card.js +6 -0
  233. package/dist/feature-card.js.map +1 -0
  234. package/dist/file-upload.d.ts +20 -0
  235. package/dist/file-upload.js +5 -0
  236. package/dist/file-upload.js.map +1 -0
  237. package/dist/footer.d.ts +35 -0
  238. package/dist/footer.js +5 -0
  239. package/dist/footer.js.map +1 -0
  240. package/dist/form-row.d.ts +15 -0
  241. package/dist/form-row.js +5 -0
  242. package/dist/form-row.js.map +1 -0
  243. package/dist/glow-card.d.ts +14 -0
  244. package/dist/glow-card.js +5 -0
  245. package/dist/glow-card.js.map +1 -0
  246. package/dist/hero-block.d.ts +16 -0
  247. package/dist/hero-block.js +7 -0
  248. package/dist/hero-block.js.map +1 -0
  249. package/dist/host-card.d.ts +27 -0
  250. package/dist/host-card.js +6 -0
  251. package/dist/host-card.js.map +1 -0
  252. package/dist/incident-card.d.ts +23 -0
  253. package/dist/incident-card.js +5 -0
  254. package/dist/incident-card.js.map +1 -0
  255. package/dist/index.d.ts +76 -960
  256. package/dist/index.js +68 -3812
  257. package/dist/index.js.map +1 -1
  258. package/dist/input.d.ts +10 -0
  259. package/dist/input.js +5 -0
  260. package/dist/input.js.map +1 -0
  261. package/dist/kbd.d.ts +24 -0
  262. package/dist/kbd.js +5 -0
  263. package/dist/kbd.js.map +1 -0
  264. package/dist/log-viewer.d.ts +35 -0
  265. package/dist/log-viewer.js +5 -0
  266. package/dist/log-viewer.js.map +1 -0
  267. package/dist/meter.d.ts +23 -0
  268. package/dist/meter.js +5 -0
  269. package/dist/meter.js.map +1 -0
  270. package/dist/noir-glow-background.d.ts +50 -0
  271. package/dist/noir-glow-background.js +4 -0
  272. package/dist/noir-glow-background.js.map +1 -0
  273. package/dist/pagination.d.ts +16 -0
  274. package/dist/pagination.js +5 -0
  275. package/dist/pagination.js.map +1 -0
  276. package/dist/panel.d.ts +12 -0
  277. package/dist/panel.js +5 -0
  278. package/dist/panel.js.map +1 -0
  279. package/dist/password-input.d.ts +10 -0
  280. package/dist/password-input.js +5 -0
  281. package/dist/password-input.js.map +1 -0
  282. package/dist/pill.d.ts +14 -0
  283. package/dist/pill.js +5 -0
  284. package/dist/pill.js.map +1 -0
  285. package/dist/pricing-card.d.ts +20 -0
  286. package/dist/pricing-card.js +6 -0
  287. package/dist/pricing-card.js.map +1 -0
  288. package/dist/progress.d.ts +6 -0
  289. package/dist/progress.js +5 -0
  290. package/dist/progress.js.map +1 -0
  291. package/dist/radio-group.d.ts +18 -0
  292. package/dist/radio-group.js +5 -0
  293. package/dist/radio-group.js.map +1 -0
  294. package/dist/rollback-plan.d.ts +23 -0
  295. package/dist/rollback-plan.js +5 -0
  296. package/dist/rollback-plan.js.map +1 -0
  297. package/dist/segmented.d.ts +17 -0
  298. package/dist/segmented.js +5 -0
  299. package/dist/segmented.js.map +1 -0
  300. package/dist/select.d.ts +18 -0
  301. package/dist/select.js +5 -0
  302. package/dist/select.js.map +1 -0
  303. package/dist/service-health-card.d.ts +21 -0
  304. package/dist/service-health-card.js +6 -0
  305. package/dist/service-health-card.js.map +1 -0
  306. package/dist/sheet.d.ts +25 -0
  307. package/dist/sheet.js +5 -0
  308. package/dist/sheet.js.map +1 -0
  309. package/dist/skeleton.d.ts +5 -0
  310. package/dist/skeleton.js +5 -0
  311. package/dist/skeleton.js.map +1 -0
  312. package/dist/slider.d.ts +12 -0
  313. package/dist/slider.js +5 -0
  314. package/dist/slider.js.map +1 -0
  315. package/dist/sparkline.d.ts +16 -0
  316. package/dist/sparkline.js +5 -0
  317. package/dist/sparkline.js.map +1 -0
  318. package/dist/stat-card.d.ts +15 -0
  319. package/dist/stat-card.js +5 -0
  320. package/dist/stat-card.js.map +1 -0
  321. package/dist/status-dot.d.ts +13 -0
  322. package/dist/status-dot.js +5 -0
  323. package/dist/status-dot.js.map +1 -0
  324. package/dist/stepper.d.ts +16 -0
  325. package/dist/stepper.js +5 -0
  326. package/dist/stepper.js.map +1 -0
  327. package/dist/switch.d.ts +9 -0
  328. package/dist/switch.js +5 -0
  329. package/dist/switch.js.map +1 -0
  330. package/dist/tabs.d.ts +9 -0
  331. package/dist/tabs.js +5 -0
  332. package/dist/tabs.js.map +1 -0
  333. package/dist/tag-input.d.ts +20 -0
  334. package/dist/tag-input.js +5 -0
  335. package/dist/tag-input.js.map +1 -0
  336. package/dist/textarea.d.ts +10 -0
  337. package/dist/textarea.js +5 -0
  338. package/dist/textarea.js.map +1 -0
  339. package/dist/timeline.d.ts +30 -0
  340. package/dist/timeline.js +5 -0
  341. package/dist/timeline.js.map +1 -0
  342. package/dist/toaster.d.ts +10 -0
  343. package/dist/toaster.js +4 -0
  344. package/dist/toaster.js.map +1 -0
  345. package/dist/tooltip.d.ts +12 -0
  346. package/dist/tooltip.js +5 -0
  347. package/dist/tooltip.js.map +1 -0
  348. package/dist/utils.d.ts +5 -0
  349. package/dist/utils.js +4 -0
  350. package/dist/utils.js.map +1 -0
  351. package/globals-layers.css +935 -0
  352. package/globals-v3.css +17 -0
  353. package/globals-v4.css +2 -0
  354. package/globals.css +12 -939
  355. package/package.json +82 -17
  356. package/registry.json +920 -0
  357. package/tailwind.css +9 -0
  358. package/tollerud-preset.js +55 -50
  359. package/dist/index.cjs +0 -3938
  360. package/dist/index.cjs.map +0 -1
  361. package/dist/index.d.cts +0 -960
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,6 +130,7 @@ 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'
@@ -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,376 @@
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.0.0 — 2026-06-09 — ESM-only and rich DataTable
11
+
12
+ Ships the full table pattern in npm, drops CommonJS builds, and adds release/props tooling.
13
+
14
+ ### Breaking change
15
+
16
+ - Package is **ESM-only** — `require('@tollerud/ui')` and `.cjs` subpath bundles are removed. Use `import` in apps and bundlers that support ES modules.
17
+
18
+ ### New features
19
+
20
+ - `DataTable` — search, segmented filter, row selection, bulk actions, per-row menus, pagination, loading skeletons, and custom empty states (optional; simple sort/filter mode unchanged)
21
+ - `npm run docs:props` — generates `PROPS.generated.md` from component `*Props` interfaces
22
+ - `npm run test:props` — drift check in `validate` / `prepublishOnly`
23
+ - Changesets — `npm run changeset` and `npm run version:release` (runs `sync:registry`)
24
+
25
+ ### Docs
26
+
27
+ - Retired docs-only `rich-datatable.jsx`; docs `DataTable` is an adapter over npm `DataTable`
28
+ - `PackageDataTable` remains the direct npm import alias on the components page
29
+
30
+ ### Migration
31
+
32
+ Replace `require('@tollerud/ui')` with ESM imports. For rich tables, pass the new optional props on `DataTable` instead of copying docs-only table code.
33
+
34
+ ---
35
+
36
+ ## 2.0.0 — 2026-06-09 — Peer dependency model
37
+
38
+ Radix, Lucide, Framer Motion, and Sonner move to peer dependencies so consumer apps do not bundle duplicate copies.
39
+
40
+ ### Breaking change
41
+
42
+ Install peers explicitly alongside `@tollerud/ui`:
43
+
44
+ ```bash
45
+ npm install @tollerud/ui clsx tailwind-merge tailwindcss@4 \
46
+ @radix-ui/react-dialog @radix-ui/react-dropdown-menu @radix-ui/react-progress \
47
+ @radix-ui/react-slot @radix-ui/react-tabs @radix-ui/react-tooltip \
48
+ lucide-react framer-motion sonner
49
+ ```
50
+
51
+ ### New features
52
+
53
+ - `@tollerud/ui/tailwind.css` — convenience import with documented `@source` hint
54
+ - `npm run test:package` — publint + `@arethetypeswrong/cli` on the package
55
+ - `npm run test:size` — size-limit budget on `dist/button.js` and `dist/index.js`
56
+ - `npm run sync:registry` — align `registry.json` version with `package.json` before publish
57
+
58
+ ### Docs
59
+
60
+ - Retired docs-only `grain-gl.jsx`; backgrounds and overview use npm `NoirGlowBackground`
61
+ - Publish workflow runs drift, package quality, size budget, docs build, and Playwright E2E
62
+
63
+ ### Migration
64
+
65
+ 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.
66
+
67
+ ## 1.4.0 — 2026-06-09 — Charts and marketing blocks
68
+
69
+ Palette-aware charts and landing-page blocks ship in the npm package. Docs site reorganized into `pages/`, `kit/`, `blocks/`, and `backgrounds/`.
70
+
71
+ ### New components
72
+
73
+ - `BarChart` — vertical bars with optional yellow accent series
74
+ - `AreaChart` — gradient area/line chart with grid lines
75
+ - `Donut` — donut chart with segment legend
76
+ - `Sparkline` — compact inline trend line
77
+ - `HeroBlock` — landing hero on noir glow (`intense` uses `NoirGlowBackground`)
78
+ - `FeatureCard` — icon chip + title + description
79
+ - `CTABand` — closing CTA with optional accent bar
80
+
81
+ ### Docs
82
+
83
+ - Charts and marketing import from `@tollerud/ui` (no duplicate `charts.jsx` / `marketing.jsx`)
84
+ - `docs-app/components/` taxonomy: routable `pages/page-*.jsx`, `kit/`, `blocks/rich-datatable.jsx`, `backgrounds/grain-gl.jsx`
85
+
86
+ ### Migration
87
+
88
+ Nothing breaking. Import charts and blocks from `@tollerud/ui` as named exports.
89
+
90
+ ## 1.3.0 — 2026-06-09 — Tailwind v4 as default CSS entry
91
+
92
+ `@tollerud/ui/globals.css` is now the Tailwind v4 bundle (tokens + component layers + `@import "tailwindcss"`). v3 projects move to `@tollerud/ui/globals-v3.css`.
93
+
94
+ ### Breaking change
95
+
96
+ 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.
97
+
98
+ ### Migration (v4 — recommended)
99
+
100
+ ```css
101
+ @import "@tollerud/ui/globals.css";
102
+ @source "../node_modules/@tollerud/ui/dist";
103
+ ```
104
+
105
+ `@tollerud/ui/globals-v4.css` remains as an alias for `globals.css`.
106
+
107
+ ### Docs
108
+
109
+ Install instructions, README, GETTING_STARTED, AGENTS.md, and SKILL.md now lead with Tailwind v4.
110
+
111
+ ## 1.2.0 — 2026-06-09 — Subpath exports, Tailwind v4 CSS, Playwright E2E
112
+
113
+ Per-component subpath imports, a dedicated Tailwind v4 stylesheet, expanded unit tests, and docs-site E2E smoke tests.
114
+
115
+ ### New features
116
+
117
+ - Subpath exports — `@tollerud/ui/button`, `@tollerud/ui/dialog`, `@tollerud/ui/utils`, and one entry per component (61 total)
118
+ - `@tollerud/ui/globals-v4.css` — single import for Tailwind v4 + tokens + component layers
119
+ - `@tollerud/ui/globals-layers.css` — shared component CSS layers (also imported by v3 `globals.css`)
120
+ - `npm run changelog:draft` — draft a CHANGELOG entry from commits since the latest version
121
+
122
+ ### Tests & CI
123
+
124
+ - Vitest coverage for `Dialog`, `DataTable`, and `CommandMenu`
125
+ - Playwright E2E smoke tests for the docs site (`npm run test:e2e`)
126
+ - CI verifies subpath bundles and `globals-v4.css` in the npm tarball
127
+
128
+ ### Migration
129
+
130
+ 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"`.
131
+
132
+ ## 1.1.5 — 2026-06-09 — Fix Tailwind preset color namespace
133
+
134
+ ### Bug fix
135
+
136
+ 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.).
137
+
138
+ Previously the preset exposed the same palette under `tia.*`, so consumer projects following the docs could miss generated `tollerud-*` utilities.
139
+
140
+ ### Details
141
+
142
+ - Renamed the preset color namespace from `tia` to `tollerud`
143
+ - Renamed the default package shadow token from `shadow-tia` to `shadow-tollerud`
144
+ - Added missing documented/component color aliases: `tollerud.accent`, `tollerud.foreground`, `tollerud.black`, `tollerud.white`, `tollerud.noir-950`, and `tollerud.noir-850`
145
+
146
+ ### Migration
147
+
148
+ Replace any `text-tia-*`, `bg-tia-*`, `border-tia-*`, or `shadow-tia` utilities with their `tollerud` equivalents.
149
+
150
+ ## 1.1.4 — 2026-06-09 — Fix: Alert tone colors missing in Tailwind v4
151
+
152
+ ### Bug fix
153
+
154
+ 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.
155
+
156
+ **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.
157
+
158
+ **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.
159
+
160
+ 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`
161
+
162
+ No API changes.
163
+
164
+ ## 1.1.3 — 2026-06-09 — Fix: registry deps, source 'use client', React 19 devdep, docs drift
165
+
166
+ No component API changes. Six quality fixes from a review audit:
167
+
168
+ **1. registry.json — missing runtime dependencies**
169
+ 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.
170
+
171
+ Entries updated: `button`, `status-dot`, `accordion`, `breadcrumb`, `combobox`, `date-picker`, `dialog`, `file-upload`, `pagination`, `password-input`, `pricing-card`, `stepper`, `tag-input`
172
+
173
+ **2. Source components — added `'use client'` directive**
174
+ 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.
175
+
176
+ Added `'use client'` to: `Accordion`, `Avatar`, `Checkbox`, `Combobox`, `DatePicker`, `FileUpload`, `FormRow`, `PasswordInput`, `RadioGroup`, `Slider`, `Switch`, `TagInput`
177
+
178
+ **3. package.json — aligned React 19 devDependencies**
179
+ `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.
180
+
181
+ **4. docs Getting Started page — rewritten to npm-package-first**
182
+ Was: manual file-copy instructions, wrong token value (`--tollerud-yellow` = `#E8D500`), old component list (29 components).
183
+ Now: `npm install @tollerud/ui`, Tailwind v3 + v4 snippets, full 61-component import block, correct yellow token docs, RSC safety note.
184
+
185
+ **5. docs Brand page — corrected monogram color**
186
+ `#FFF200` → `#FFFF00` (two references: description text and inline style). This now matches `BRAND.md`, `SKILL.md`, and the package tokens.
187
+
188
+ **6. .gitignore — added `*.tsbuildinfo`**
189
+ `examples/docs-nextjs/tsconfig.json` has `"incremental": true`, generating a `.tsbuildinfo` file that was untracked. Suppressed globally.
190
+
191
+ ## 1.1.2 — 2026-06-09 — Ship AGENTS.md + SKILL.md inside the npm package
192
+
193
+ `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:
194
+
195
+ - `node_modules/@tollerud/ui/AGENTS.md`
196
+ - `node_modules/@tollerud/ui/SKILL.md`
197
+
198
+ This lets Claude Code (and other agents) read them directly without needing a separate `curl` or a GitHub URL.
199
+
200
+ ## 1.1.1 — 2026-06-09 — Docs: AGENTS.md package update + migration instructions
201
+
202
+ No component or API changes. Documentation only.
203
+
204
+ - `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
205
+
206
+ ## 1.1.0 — 2026-06-09 — Fix: Combobox + DatePicker close on window resize
207
+
208
+ `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.
209
+
210
+ `DropdownMenu` was unaffected (Radix handles this internally).
211
+
212
+ **Migration:** no API changes — behaviour only.
213
+
214
+ ## 1.0.9 — 2026-06-08 — Ship the 19 components that only existed in the docs site
215
+
216
+ Closes the long-standing gap between the marketing/docs site and the installable
217
+ `@tollerud/ui` package — every component previously listed under "still missing"
218
+ in `COMPLETENESS_ROADMAP.md` now ships from `components/index.ts`:
219
+
220
+ - **New primitives:** `Divider`, `Pill`, `Avatar` / `AvatarGroup`, `Breadcrumb`, `Pagination`, `Segmented`, `Stepper`
221
+ - **New layout/display:** `Panel`, `Meter`, `FormRow`, `PricingCard`
222
+ - **New form controls:** `Accordion` (+ `AccordionItem`/`AccordionTrigger`/`AccordionContent`), `Slider`, `PasswordInput`, `Combobox`, `DatePicker`, `FileUpload`, `TagInput`
223
+
224
+ All built from scratch as accessible, theme-aware components following existing
225
+ conventions (`forwardRef`, `cn`, `tollerud-*` design tokens) — no new runtime
226
+ dependencies were added.
227
+
228
+ ## 1.0.8 — 2026-06-08 — Fix: mark package as Client Components for RSC/SSR
229
+
230
+ **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.).
231
+
232
+ - `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
233
+ - 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)
234
+
235
+ **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).
236
+
237
+ ## 1.0.7 — 2026-06-08 — Button `asChild` + `buttonVariants`
238
+
239
+ - `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>`
240
+ - Exported `buttonVariants({ variant, size, className })` — returns the Button class string directly, for cases where wrapping with `asChild` is awkward
241
+ - Exported `ButtonVariantProps` type
242
+ - Added `@radix-ui/react-slot` as a direct dependency
243
+
244
+ ## 1.0.6 — 2026-06-08 — Fix brand color docs
245
+
246
+ - Fixed brand color swatches in `ds/page-foundations.jsx` — "Yellow" now correctly shows `#FFFF00` / `--tollerud-yellow`, "Yellow warm" shows `#E8D500` / `--tollerud-yellow-warm`
247
+ - Updated `BRAND.md` — monogram color corrected to `#FFFF00`
248
+
249
+ ## 1.0.5 — 2026-06-08 — Yellow token rename + AGENTS.md
250
+
251
+ **Breaking token changes:**
252
+ - `--tollerud-yellow` is now `#FFFF00` (was `#E8D500`) — the brighter, high-voltage yellow is now the primary accent
253
+ - `--tollerud-yellow-bright` removed — replaced by `--tollerud-yellow-warm: #E8D500` for the warmer secondary yellow
254
+ - Tailwind: `tollerud.yellow` → `#FFFF00`, `tollerud.yellow-bright` → renamed to `tollerud.yellow-warm: #E8D500`
255
+ - All glow `rgba` values updated from `rgba(232,213,0,...)` to `rgba(255,255,0,...)`
256
+ - Semantic tokens `--primary`, `--ring`, `--chart-1`, `--border-accent` updated to `#FFFF00`
257
+
258
+ **Migration:** replace `tollerud-yellow-bright` → `tollerud-yellow`, and `tollerud-yellow` → `tollerud-yellow-warm` wherever you relied on the old warm `#E8D500` value.
259
+
260
+ **New files:**
261
+ - Added `AGENTS.md` — cross-tool AI agent guide (Claude Code, Cursor, Copilot, Codex)
262
+ - Added `.github/copilot-instructions.md` — GitHub Copilot native instructions
263
+
264
+ ## 2026-05-26 — Form Primitives + Footer
265
+
266
+ - Added **Textarea** — multiline input with label/error support, same pattern as Input
267
+ - Added **Select** — styled native `<select>` with placeholder, label/error, custom chevron
268
+ - Added **Checkbox** — custom-styled checkbox with checkmark SVG, label, focus-visible ring
269
+ - Added **Switch** — toggle switch with role="switch", animated thumb, label
270
+ - Added **RadioGroup / Radio** — fieldset-based radio group with custom dot indicator, label/error
271
+ - Added **Footer** — ported from `@tollerud/footer` (v1.1.2), uses Tollerud Design System design tokens, supports `accent` variant, responsive/row layouts, unstyled mode
272
+ - 6 new components → total **29 components** now
273
+
274
+ ## 2026-05-26 — Phase 5: Docs App
275
+
276
+ - Created `examples/docs-nextjs/` — a full Geist-inspired documentation site:
277
+ - Foundations: Color, Typography, Motion, Accessibility
278
+ - Components: Catalog with all 23 components organized by category
279
+ - Patterns: Dashboard and Approval Flow templates
280
+ - Brand: Tia avatar, voice, and Tollerud glow guide
281
+ - Changelog: Version history timeline
282
+ - Docs use the same design system components for consistent preview
283
+ - Dark theme with sidebar navigation, responsive layout
284
+
285
+ ## 2026-05-26 — Phase 4: shadcn Registry Compatibility
286
+
287
+ - Added `components.json` — shadcn UI registry format for tooling compatibility
288
+ - Added `registry.json` — component registry with all 23 components, dependencies, and metadata
289
+ - Added `GETTING_STARTED.md` — one-command install guide with Tailwind setup and component import examples
290
+ - Portable import paths documented: `@/components/ui` and `@/lib/utils`
291
+
292
+ ## 2026-05-26 — Phase 3: Homelab Operational Components
293
+
294
+ 11 new homelab-specific components for infrastructure management:
295
+
296
+ **Health & Monitoring**
297
+ - `ServiceHealthCard` — service status card with uptime, response time, version
298
+ - `HostCard` — server/VM card with CPU, RAM, disk, containers, IP
299
+ - `DockerStackCard` — Docker Compose stack overview with per-service health
300
+ - `IncidentCard` — severity-graded incident/alert card (critical→info)
301
+
302
+ **Actions & Approval**
303
+ - `ApprovalCard` — approve/reject card for pending operations
304
+ - `ActionDiff` — unified diff viewer with line numbers, add/remove/context
305
+ - `RollbackPlan` — ordered rollback steps with execution status
306
+
307
+ **Logs & Alerts**
308
+ - `LogViewer` — terminal-style scrollable log viewer with search, live follow, level coloring
309
+ - `AlertInbox` — alert feed with count badges, severity filter, acknowledge action
310
+
311
+ **Feed & History**
312
+ - `Timeline` — vertical timeline with status dots, connecting lines, metadata badges
313
+ - `BackupStatusPanel` — backup job overview with per-job status and schedule
314
+
315
+ ## 2026-05-26 — Phase 2: Command-First Shell
316
+
317
+ - **Kbd** — Raycast-style keyboard shortcut chip (`⌘K`, `⌘⇧S`, etc.), 2 sizes.
318
+ - **ActionRow** — Command/action item row with icon, label, description, shortcut, keyboard navigation (`highlighted` prop).
319
+ - **CommandMenu** — Full command palette: search, groups, arrow key nav, `Enter`/`Esc`, auto-focus, body scroll lock, footer hints, custom filter support.
320
+ - **CSS classes**: `.tollerud-kbd`, `.tollerud-action-row`, `.tollerud-cmd`, `.tollerud-cmd-overlay`, `.tollerud-cmd__*` — in both `globals.css` and `tokens.css`.
321
+ - **KEYBOARD.md** — Keyboard contract document: global shortcuts, component contracts, accessibility requirements, implementation rules.
322
+
323
+ ## 2026-05-26 — NoirGlowBackground
324
+
325
+ - Ported the real Tollerud.no background source from `MathiasOki/tollerud-landing`.
326
+ - Added `components/NoirGlowBackground.tsx` using `@paper-design/shaders-react` / `GrainGradient`.
327
+ - Added CSS fallback classes: `.tollerud-noir-glow-root`, `.tollerud-noir-glow-bg`, `.tollerud-noir-glow-vignette`, `.tollerud-noir-noise`.
328
+ - Added acid-yellow token `--tollerud-acid` / `tollerud-acid` for Tollerud voltage.
329
+ - Updated `preview.html` and the Next.js example hero to use the glow background.
330
+ - Added `BACKGROUNDS.md` documentation.
331
+
332
+ ## 2026-05-25 — v1.0 Next.js Release
333
+
334
+ - **Tailwind preset** (`tollerud-preset.js`) — drop into any Next.js project
335
+ - **Globals.css** with shadcn-compatible semantic tokens (`--background`, `--primary`, `--ring`, etc.)
336
+ - **React components** — Button, Card, Badge, StatusDot, Input, CodeBlock, StatCard, Container
337
+ - **ACCESSIBILITY.md** — contrast ratios, focus rings, touch targets, reduced motion
338
+ - **COMPONENTS.md** — usage matrix for all component variants
339
+ - **VOICE.md** — copy guidelines, terminal-style CTAs, tone rules
340
+ - **CHANGELOG.md** — this file
341
+ - **Graphify-inspired additions**: grid backgrounds, glass nav, terminal CTAs, gradient accents, pills, tight display typography
342
+ - **Motion tokens**: duration, easing, reduced-motion support
343
+ - **Chart tokens**: accessible color palette for data viz
344
+
345
+ ### What shipped
346
+
347
+ ```
348
+ design-system/
349
+ ├── package.json
350
+ ├── README.md
351
+ ├── CHANGELOG.md
352
+ ├── ACCESSIBILITY.md
353
+ ├── COMPONENTS.md
354
+ ├── VOICE.md
355
+ ├── COMPLETENESS_ROADMAP.md
356
+ ├── tollerud-preset.js # ← drop-in Tailwind preset
357
+ ├── tailwind.config.js # (backward compat)
358
+ ├── tokens.css # (backward compat)
359
+ ├── globals.css # ← full semantic tokens + components
360
+ ├── preview.html
361
+ ├── tollerud-avatar.svg
362
+ ├── components/
363
+ │ ├── index.ts
364
+ │ ├── Button.tsx
365
+ │ ├── Card.tsx
366
+ │ ├── Badge.tsx
367
+ │ ├── StatusDot.tsx
368
+ │ ├── Input.tsx
369
+ │ ├── CodeBlock.tsx
370
+ │ ├── StatCard.tsx
371
+ │ └── Container.tsx
372
+ ├── examples/
373
+ │ └── nextjs/
374
+ │ └── tailwind.config.ts
375
+ └── components.css
376
+ ```