@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
@@ -0,0 +1,85 @@
1
+ 'use client';
2
+ import { lazy, Suspense } from 'react';
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+
5
+ // components/NoirGlowBackground.tsx
6
+ var GrainGradient = lazy(
7
+ () => import('@paper-design/shaders-react').then((module) => ({
8
+ default: module.GrainGradient
9
+ }))
10
+ );
11
+ var intensityMap = {
12
+ subtle: 0.24,
13
+ medium: 0.45,
14
+ loud: 0.68
15
+ };
16
+ var speedMap = {
17
+ still: 0,
18
+ slow: 0.45,
19
+ medium: 1,
20
+ fast: 1.8
21
+ };
22
+ var grainMap = {
23
+ none: 0,
24
+ soft: 0.12,
25
+ high: 0.28
26
+ };
27
+ function cx(...classes) {
28
+ return classes.filter(Boolean).join(" ");
29
+ }
30
+ function CssFallback({ preserveCenter = true, noiseOverlay = true }) {
31
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
32
+ /* @__PURE__ */ jsx("div", { className: "tollerud-noir-glow-bg", "aria-hidden": "true" }),
33
+ preserveCenter && /* @__PURE__ */ jsx("div", { className: "tollerud-noir-glow-vignette", "aria-hidden": "true" }),
34
+ noiseOverlay && /* @__PURE__ */ jsx("div", { className: "tollerud-noir-noise", "aria-hidden": "true" })
35
+ ] });
36
+ }
37
+ function NoirGlowBackground({
38
+ className,
39
+ style,
40
+ shape = "corners",
41
+ intensity = "medium",
42
+ speed = "medium",
43
+ grain = "none",
44
+ softness = 0.76,
45
+ colorBack = "hsl(0, 0%, 0%)",
46
+ colors = ["hsl(54, 85%, 66%)", "hsl(56, 100%, 80%)", "hsl(56, 100%, 50%)"],
47
+ preserveCenter = false,
48
+ noiseOverlay = false,
49
+ forceCssFallback = false,
50
+ inert = true
51
+ }) {
52
+ const wrapperClassName = cx(
53
+ "tollerud-noir-glow-root absolute inset-0 z-0 overflow-hidden",
54
+ inert && "pointer-events-none",
55
+ className
56
+ );
57
+ if (forceCssFallback) {
58
+ return /* @__PURE__ */ jsx("div", { className: wrapperClassName, style, "aria-hidden": "true", children: /* @__PURE__ */ jsx(CssFallback, { preserveCenter, noiseOverlay }) });
59
+ }
60
+ return /* @__PURE__ */ jsxs("div", { className: wrapperClassName, style, "aria-hidden": "true", children: [
61
+ /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(CssFallback, { preserveCenter, noiseOverlay }), children: /* @__PURE__ */ jsx(
62
+ GrainGradient,
63
+ {
64
+ style: { height: "100%", width: "100%" },
65
+ colorBack,
66
+ softness,
67
+ intensity: intensityMap[intensity],
68
+ noise: grainMap[grain],
69
+ shape,
70
+ offsetX: 0,
71
+ offsetY: 0,
72
+ scale: 1,
73
+ rotation: 0,
74
+ speed: speedMap[speed],
75
+ colors
76
+ }
77
+ ) }),
78
+ preserveCenter && /* @__PURE__ */ jsx("div", { className: "tollerud-noir-glow-vignette", "aria-hidden": "true" }),
79
+ noiseOverlay && /* @__PURE__ */ jsx("div", { className: "tollerud-noir-noise", "aria-hidden": "true" })
80
+ ] });
81
+ }
82
+
83
+ export { NoirGlowBackground };
84
+ //# sourceMappingURL=chunk-CBQ63EBL.js.map
85
+ //# sourceMappingURL=chunk-CBQ63EBL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/NoirGlowBackground.tsx"],"names":[],"mappings":"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","file":"chunk-CBQ63EBL.js","sourcesContent":["\"use client\"\n\nimport { lazy, Suspense, type CSSProperties } from \"react\"\n\nconst GrainGradient = lazy(() =>\n import(\"@paper-design/shaders-react\").then((module) => ({\n default: module.GrainGradient,\n }))\n)\n\ntype ShaderShape = \"corners\" | \"wave\" | \"dots\" | \"truchet\" | \"ripple\" | \"blob\" | \"sphere\"\ntype Intensity = \"subtle\" | \"medium\" | \"loud\"\ntype Speed = \"still\" | \"slow\" | \"medium\" | \"fast\"\ntype Grain = \"none\" | \"soft\" | \"high\"\n\nexport interface NoirGlowBackgroundProps {\n /** Extra class names for the outer positioning wrapper. */\n className?: string\n /** Inline style for the outer positioning wrapper. */\n style?: CSSProperties\n /** Canvas/WebGL shape. `corners` matches Tollerud.no. */\n shape?: ShaderShape\n /** Visual strength of the yellow glow. */\n intensity?: Intensity\n /** Ambient animation speed. */\n speed?: Speed\n /** Shader grain/noise amount. */\n grain?: Grain\n /** Softness/falloff of the glow blooms. */\n softness?: number\n /** Background color behind the glow. */\n colorBack?: string\n /** Glow colors. Defaults to the Tollerud/Tia yellow ramp. */\n colors?: string[]\n /** Whether to render a readable center vignette on top of the shader. */\n preserveCenter?: boolean\n /** Add the grain/noise CSS overlay. */\n noiseOverlay?: boolean\n /** Prefer the CSS fallback even if shaders are available. Useful for docs/static contexts. */\n forceCssFallback?: boolean\n /** Disable pointer events so content above remains clickable. */\n inert?: boolean\n}\n\nconst intensityMap: Record<Intensity, number> = {\n subtle: 0.24,\n medium: 0.45,\n loud: 0.68,\n}\n\nconst speedMap: Record<Speed, number> = {\n still: 0,\n slow: 0.45,\n medium: 1,\n fast: 1.8,\n}\n\nconst grainMap: Record<Grain, number> = {\n none: 0,\n soft: 0.12,\n high: 0.28,\n}\n\nfunction cx(...classes: Array<string | false | null | undefined>) {\n return classes.filter(Boolean).join(\" \")\n}\n\nfunction CssFallback({ preserveCenter = true, noiseOverlay = true }: Pick<NoirGlowBackgroundProps, \"preserveCenter\" | \"noiseOverlay\">) {\n return (\n <>\n <div className=\"tollerud-noir-glow-bg\" aria-hidden=\"true\" />\n {preserveCenter && <div className=\"tollerud-noir-glow-vignette\" aria-hidden=\"true\" />}\n {noiseOverlay && <div className=\"tollerud-noir-noise\" aria-hidden=\"true\" />}\n </>\n )\n}\n\n/**\n * NoirGlowBackground\n *\n * Tia/Tollerud signature background primitive. The defaults replicate\n * MathiasOki/tollerud-landing's `GradientBackground` component.\n *\n * Install dependency in consuming Next.js apps:\n * npm install @paper-design/shaders-react\n *\n * The CSS fallback classes live in `globals.css` and are used during Suspense,\n * reduced-motion contexts, or when `forceCssFallback` is true.\n */\nexport function NoirGlowBackground({\n className,\n style,\n shape = \"corners\",\n intensity = \"medium\",\n speed = \"medium\",\n grain = \"none\",\n softness = 0.76,\n colorBack = \"hsl(0, 0%, 0%)\",\n colors = [\"hsl(54, 85%, 66%)\", \"hsl(56, 100%, 80%)\", \"hsl(56, 100%, 50%)\"],\n preserveCenter = false,\n noiseOverlay = false,\n forceCssFallback = false,\n inert = true,\n}: NoirGlowBackgroundProps) {\n const wrapperClassName = cx(\n \"tollerud-noir-glow-root absolute inset-0 z-0 overflow-hidden\",\n inert && \"pointer-events-none\",\n className\n )\n\n if (forceCssFallback) {\n return (\n <div className={wrapperClassName} style={style} aria-hidden=\"true\">\n <CssFallback preserveCenter={preserveCenter} noiseOverlay={noiseOverlay} />\n </div>\n )\n }\n\n return (\n <div className={wrapperClassName} style={style} aria-hidden=\"true\">\n <Suspense fallback={<CssFallback preserveCenter={preserveCenter} noiseOverlay={noiseOverlay} />}>\n <GrainGradient\n style={{ height: \"100%\", width: \"100%\" }}\n colorBack={colorBack}\n softness={softness}\n intensity={intensityMap[intensity]}\n noise={grainMap[grain]}\n shape={shape}\n offsetX={0}\n offsetY={0}\n scale={1}\n rotation={0}\n speed={speedMap[speed]}\n colors={colors}\n />\n </Suspense>\n {preserveCenter && <div className=\"tollerud-noir-glow-vignette\" aria-hidden=\"true\" />}\n {noiseOverlay && <div className=\"tollerud-noir-noise\" aria-hidden=\"true\" />}\n </div>\n )\n}\n"]}
@@ -0,0 +1,40 @@
1
+ 'use client';
2
+ import { Toaster as Toaster$1 } from 'sonner';
3
+ import { useState, useEffect } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ // components/Toaster.tsx
7
+ var Toaster = ({ theme = "dark", ...props }) => {
8
+ const [mobile, setMobile] = useState(false);
9
+ useEffect(() => {
10
+ const check = () => setMobile(window.innerWidth < 640);
11
+ check();
12
+ window.addEventListener("resize", check);
13
+ return () => window.removeEventListener("resize", check);
14
+ }, []);
15
+ return /* @__PURE__ */ jsx(
16
+ Toaster$1,
17
+ {
18
+ position: mobile ? "top-center" : "top-right",
19
+ theme,
20
+ className: "toaster group",
21
+ toastOptions: {
22
+ classNames: {
23
+ toast: "group toast group-[.toaster]:bg-tollerud-noir-900 group-[.toaster]:text-tollerud-foreground group-[.toaster]:border group-[.toaster]:border-tollerud-border/30 group-[.toaster]:shadow-lg",
24
+ description: "group-[.toast]:text-tollerud-text-muted text-xs",
25
+ actionButton: "group-[.toast]:bg-tollerud-yellow group-[.toast]:text-tollerud-black group-[.toast]:text-xs group-[.toast]:font-medium group-[.toast]:px-3 group-[.toast]:py-1 group-[.toast]:rounded",
26
+ cancelButton: "group-[.toast]:bg-tollerud-noir-800 group-[.toast]:text-tollerud-text-muted group-[.toast]:text-xs group-[.toast]:px-3 group-[.toast]:py-1 group-[.toast]:rounded",
27
+ success: "group-[.toast]:border-l-tollerud-success group-[.toast]:border-l-2",
28
+ error: "group-[.toast]:border-l-tollerud-error group-[.toast]:border-l-2",
29
+ warning: "group-[.toast]:border-l-tollerud-yellow group-[.toast]:border-l-2",
30
+ info: "group-[.toast]:border-l-tollerud-info group-[.toast]:border-l-2"
31
+ }
32
+ },
33
+ ...props
34
+ }
35
+ );
36
+ };
37
+
38
+ export { Toaster };
39
+ //# sourceMappingURL=chunk-CDI7353B.js.map
40
+ //# sourceMappingURL=chunk-CDI7353B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/Toaster.tsx"],"names":["SonnerToaster"],"mappings":";;;;;AAUA,IAAM,UAAU,CAAC,EAAE,QAAQ,MAAA,EAAQ,GAAG,OAAM,KAA4B;AACtE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAE1C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,MAAA,CAAO,aAAa,GAAG,CAAA;AACrD,IAAA,KAAA,EAAM;AACN,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,KAAK,CAAA;AACvC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,KAAK,CAAA;AAAA,EACzD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACE,GAAA;AAAA,IAACA,SAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAU,SAAS,YAAA,GAAe,WAAA;AAAA,MAClC,KAAA;AAAA,MACA,SAAA,EAAU,eAAA;AAAA,MACV,YAAA,EAAc;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,KAAA,EACE,2LAAA;AAAA,UAGF,WAAA,EAAa,iDAAA;AAAA,UACb,YAAA,EACE,uLAAA;AAAA,UAEF,YAAA,EACE,mKAAA;AAAA,UAEF,OAAA,EAAS,oEAAA;AAAA,UACT,KAAA,EAAO,kEAAA;AAAA,UACP,OAAA,EAAS,mEAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-CDI7353B.js","sourcesContent":["'use client'\n\nimport { Toaster as SonnerToaster, type ToasterProps } from 'sonner'\nimport { useEffect, useState } from 'react'\n\nexport type TollerudToasterProps = ToasterProps & {\n /** Toast color theme. Wire to your app theme when you have one. */\n theme?: ToasterProps['theme']\n}\n\nconst Toaster = ({ theme = 'dark', ...props }: TollerudToasterProps) => {\n const [mobile, setMobile] = useState(false)\n\n useEffect(() => {\n const check = () => setMobile(window.innerWidth < 640)\n check()\n window.addEventListener('resize', check)\n return () => window.removeEventListener('resize', check)\n }, [])\n\n return (\n <SonnerToaster\n position={mobile ? 'top-center' : 'top-right'}\n theme={theme as ToasterProps['theme']}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n 'group toast group-[.toaster]:bg-tollerud-noir-900 group-[.toaster]:text-tollerud-foreground ' +\n 'group-[.toaster]:border group-[.toaster]:border-tollerud-border/30 ' +\n 'group-[.toaster]:shadow-lg',\n description: 'group-[.toast]:text-tollerud-text-muted text-xs',\n actionButton:\n 'group-[.toast]:bg-tollerud-yellow group-[.toast]:text-tollerud-black group-[.toast]:text-xs ' +\n 'group-[.toast]:font-medium group-[.toast]:px-3 group-[.toast]:py-1 group-[.toast]:rounded',\n cancelButton:\n 'group-[.toast]:bg-tollerud-noir-800 group-[.toast]:text-tollerud-text-muted ' +\n 'group-[.toast]:text-xs group-[.toast]:px-3 group-[.toast]:py-1 group-[.toast]:rounded',\n success: 'group-[.toast]:border-l-tollerud-success group-[.toast]:border-l-2',\n error: 'group-[.toast]:border-l-tollerud-error group-[.toast]:border-l-2',\n warning: 'group-[.toast]:border-l-tollerud-yellow group-[.toast]:border-l-2',\n info: 'group-[.toast]:border-l-tollerud-info group-[.toast]:border-l-2',\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster }"]}
@@ -0,0 +1,53 @@
1
+ 'use client';
2
+ import { cn } from './chunk-WSQNPRGN.js';
3
+ import { forwardRef } from 'react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ var Divider = forwardRef(
7
+ ({ className, orientation = "horizontal", label, ...props }, ref) => {
8
+ if (orientation === "vertical") {
9
+ return /* @__PURE__ */ jsx(
10
+ "div",
11
+ {
12
+ ref,
13
+ role: "separator",
14
+ "aria-orientation": "vertical",
15
+ className: cn("w-px self-stretch bg-tollerud-border", className),
16
+ ...props
17
+ }
18
+ );
19
+ }
20
+ if (label) {
21
+ return /* @__PURE__ */ jsxs(
22
+ "div",
23
+ {
24
+ ref,
25
+ role: "separator",
26
+ "aria-orientation": "horizontal",
27
+ className: cn("flex items-center gap-3 text-xs text-tollerud-text-muted", className),
28
+ ...props,
29
+ children: [
30
+ /* @__PURE__ */ jsx("span", { className: "h-px flex-1 bg-tollerud-border" }),
31
+ /* @__PURE__ */ jsx("span", { children: label }),
32
+ /* @__PURE__ */ jsx("span", { className: "h-px flex-1 bg-tollerud-border" })
33
+ ]
34
+ }
35
+ );
36
+ }
37
+ return /* @__PURE__ */ jsx(
38
+ "div",
39
+ {
40
+ ref,
41
+ role: "separator",
42
+ "aria-orientation": "horizontal",
43
+ className: cn("h-px w-full bg-tollerud-border", className),
44
+ ...props
45
+ }
46
+ );
47
+ }
48
+ );
49
+ Divider.displayName = "Divider";
50
+
51
+ export { Divider };
52
+ //# sourceMappingURL=chunk-CKNWXYMA.js.map
53
+ //# sourceMappingURL=chunk-CKNWXYMA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/Divider.tsx"],"names":[],"mappings":";;;;AAUA,IAAM,OAAA,GAAU,UAAA;AAAA,EACd,CAAC,EAAE,SAAA,EAAW,WAAA,GAAc,cAAc,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACnE,IAAA,IAAI,gBAAgB,UAAA,EAAY;AAC9B,MAAA,uBACE,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,IAAA,EAAK,WAAA;AAAA,UACL,kBAAA,EAAiB,UAAA;AAAA,UACjB,SAAA,EAAW,EAAA,CAAG,sCAAA,EAAwC,SAAS,CAAA;AAAA,UAC9D,GAAG;AAAA;AAAA,OACN;AAAA,IAEJ;AAEA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,uBACE,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,IAAA,EAAK,WAAA;AAAA,UACL,kBAAA,EAAiB,YAAA;AAAA,UACjB,SAAA,EAAW,EAAA,CAAG,0DAAA,EAA4D,SAAS,CAAA;AAAA,UAClF,GAAG,KAAA;AAAA,UAEJ,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gCAAA,EAAiC,CAAA;AAAA,4BACjD,GAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,4BACb,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EAAiC;AAAA;AAAA;AAAA,OACnD;AAAA,IAEJ;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,WAAA;AAAA,QACL,kBAAA,EAAiB,YAAA;AAAA,QACjB,SAAA,EAAW,EAAA,CAAG,gCAAA,EAAkC,SAAS,CAAA;AAAA,QACxD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,OAAA,CAAQ,WAAA,GAAc,SAAA","file":"chunk-CKNWXYMA.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface DividerProps extends HTMLAttributes<HTMLDivElement> {\n /** Layout direction */\n orientation?: 'horizontal' | 'vertical'\n /** Optional label rendered inline (horizontal orientation only) */\n label?: React.ReactNode\n}\n\nconst Divider = forwardRef<HTMLDivElement, DividerProps>(\n ({ className, orientation = 'horizontal', label, ...props }, ref) => {\n if (orientation === 'vertical') {\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation=\"vertical\"\n className={cn('w-px self-stretch bg-tollerud-border', className)}\n {...props}\n />\n )\n }\n\n if (label) {\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n className={cn('flex items-center gap-3 text-xs text-tollerud-text-muted', className)}\n {...props}\n >\n <span className=\"h-px flex-1 bg-tollerud-border\" />\n <span>{label}</span>\n <span className=\"h-px flex-1 bg-tollerud-border\" />\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n className={cn('h-px w-full bg-tollerud-border', className)}\n {...props}\n />\n )\n }\n)\nDivider.displayName = 'Divider'\n\nexport { Divider }\n"]}
@@ -0,0 +1,79 @@
1
+ 'use client';
2
+ import { NoirGlowBackground } from './chunk-CBQ63EBL.js';
3
+ import { Pill } from './chunk-ISHZ6ZPJ.js';
4
+ import { cn } from './chunk-WSQNPRGN.js';
5
+ import { forwardRef } from 'react';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ var HeroBlock = forwardRef(
9
+ ({
10
+ className,
11
+ eyebrow,
12
+ title,
13
+ description,
14
+ actions,
15
+ media,
16
+ minHeight = 280,
17
+ intense = false,
18
+ ...props
19
+ }, ref) => {
20
+ const hasMedia = !!media;
21
+ return /* @__PURE__ */ jsxs(
22
+ "div",
23
+ {
24
+ ref,
25
+ className: cn(
26
+ "relative overflow-hidden rounded-xl border border-tollerud-border bg-black",
27
+ className
28
+ ),
29
+ style: { minHeight },
30
+ ...props,
31
+ children: [
32
+ intense ? /* @__PURE__ */ jsx(NoirGlowBackground, { intensity: "loud", speed: "medium" }) : /* @__PURE__ */ jsx("div", { className: "tollerud-noir-glow-bg absolute inset-0 opacity-50", "aria-hidden": "true" }),
33
+ /* @__PURE__ */ jsx(
34
+ "div",
35
+ {
36
+ className: cn(
37
+ "tollerud-grid-bg absolute inset-0",
38
+ intense ? "opacity-25" : "opacity-50"
39
+ ),
40
+ "aria-hidden": "true"
41
+ }
42
+ ),
43
+ /* @__PURE__ */ jsxs(
44
+ "div",
45
+ {
46
+ className: cn(
47
+ "relative flex items-center gap-6 px-11 py-12",
48
+ hasMedia ? "grid grid-cols-[1.4fr_1fr]" : "block"
49
+ ),
50
+ children: [
51
+ /* @__PURE__ */ jsxs("div", { className: cn(!hasMedia && "max-w-[560px]"), children: [
52
+ eyebrow && /* @__PURE__ */ jsx(Pill, { variant: "outline", className: "mb-0", children: eyebrow }),
53
+ /* @__PURE__ */ jsx(
54
+ "h2",
55
+ {
56
+ className: cn(
57
+ "tollerud-display text-[40px] text-tollerud-text-primary",
58
+ eyebrow && "mt-[18px]"
59
+ ),
60
+ children: title
61
+ }
62
+ ),
63
+ description && /* @__PURE__ */ jsx("p", { className: "mt-3.5 text-[15.5px] leading-relaxed text-tollerud-text-primary/70", children: description }),
64
+ actions && /* @__PURE__ */ jsx("div", { className: "mt-6 flex flex-wrap items-center gap-3", children: actions })
65
+ ] }),
66
+ hasMedia && /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: media })
67
+ ]
68
+ }
69
+ )
70
+ ]
71
+ }
72
+ );
73
+ }
74
+ );
75
+ HeroBlock.displayName = "HeroBlock";
76
+
77
+ export { HeroBlock };
78
+ //# sourceMappingURL=chunk-DFM7UUKB.js.map
79
+ //# sourceMappingURL=chunk-DFM7UUKB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/HeroBlock.tsx"],"names":[],"mappings":";;;;;;AAgBA,IAAM,SAAA,GAAY,UAAA;AAAA,EAChB,CACE;AAAA,IACE,SAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA,GAAY,GAAA;AAAA,IACZ,OAAA,GAAU,KAAA;AAAA,IACV,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,QAAA,GAAW,CAAC,CAAC,KAAA;AAEnB,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,4EAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA,EAAO,EAAE,SAAA,EAAU;AAAA,QAClB,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,OAAA,mBACC,GAAA,CAAC,kBAAA,EAAA,EAAmB,SAAA,EAAU,MAAA,EAAO,KAAA,EAAM,QAAA,EAAS,CAAA,mBAEpD,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EAAoD,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,0BAExF,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,mCAAA;AAAA,gBACA,UAAU,YAAA,GAAe;AAAA,eAC3B;AAAA,cACA,aAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,8CAAA;AAAA,gBACA,WAAW,4BAAA,GAA+B;AAAA,eAC5C;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAA,IAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,CAAC,QAAA,IAAY,eAAe,CAAA,EAC5C,QAAA,EAAA;AAAA,kBAAA,OAAA,wBACE,IAAA,EAAA,EAAK,OAAA,EAAQ,SAAA,EAAU,SAAA,EAAU,QAC/B,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,kCAEF,GAAA;AAAA,oBAAC,IAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAW,EAAA;AAAA,wBACT,yDAAA;AAAA,wBACA,OAAA,IAAW;AAAA,uBACb;AAAA,sBAEC,QAAA,EAAA;AAAA;AAAA,mBACH;AAAA,kBACC,WAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sEACV,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,kBAED,OAAA,oBAAW,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAA0C,QAAA,EAAA,OAAA,EAAQ;AAAA,iBAAA,EAC/E,CAAA;AAAA,gBACC,QAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAoC,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA;AAE7D;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,SAAA,CAAU,WAAA,GAAc,WAAA","file":"chunk-DFM7UUKB.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\nimport { Pill } from './Pill'\nimport { NoirGlowBackground } from './NoirGlowBackground'\n\nexport interface HeroBlockProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n eyebrow?: React.ReactNode\n title: React.ReactNode\n description?: React.ReactNode\n actions?: React.ReactNode\n media?: React.ReactNode\n minHeight?: number\n /** When true, renders the live shader background via NoirGlowBackground. */\n intense?: boolean\n}\n\nconst HeroBlock = forwardRef<HTMLDivElement, HeroBlockProps>(\n (\n {\n className,\n eyebrow,\n title,\n description,\n actions,\n media,\n minHeight = 280,\n intense = false,\n ...props\n },\n ref\n ) => {\n const hasMedia = !!media\n\n return (\n <div\n ref={ref}\n className={cn(\n 'relative overflow-hidden rounded-xl border border-tollerud-border bg-black',\n className\n )}\n style={{ minHeight }}\n {...props}\n >\n {intense ? (\n <NoirGlowBackground intensity=\"loud\" speed=\"medium\" />\n ) : (\n <div className=\"tollerud-noir-glow-bg absolute inset-0 opacity-50\" aria-hidden=\"true\" />\n )}\n <div\n className={cn(\n 'tollerud-grid-bg absolute inset-0',\n intense ? 'opacity-25' : 'opacity-50'\n )}\n aria-hidden=\"true\"\n />\n <div\n className={cn(\n 'relative flex items-center gap-6 px-11 py-12',\n hasMedia ? 'grid grid-cols-[1.4fr_1fr]' : 'block'\n )}\n >\n <div className={cn(!hasMedia && 'max-w-[560px]')}>\n {eyebrow && (\n <Pill variant=\"outline\" className=\"mb-0\">\n {eyebrow}\n </Pill>\n )}\n <h2\n className={cn(\n 'tollerud-display text-[40px] text-tollerud-text-primary',\n eyebrow && 'mt-[18px]'\n )}\n >\n {title}\n </h2>\n {description && (\n <p className=\"mt-3.5 text-[15.5px] leading-relaxed text-tollerud-text-primary/70\">\n {description}\n </p>\n )}\n {actions && <div className=\"mt-6 flex flex-wrap items-center gap-3\">{actions}</div>}\n </div>\n {hasMedia && (\n <div className=\"flex items-center justify-center\">{media}</div>\n )}\n </div>\n </div>\n )\n }\n)\nHeroBlock.displayName = 'HeroBlock'\n\nexport { HeroBlock }\n"]}
@@ -0,0 +1,84 @@
1
+ 'use client';
2
+ import { cn } from './chunk-WSQNPRGN.js';
3
+ import { forwardRef, useState } from 'react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ var avatarSizes = {
7
+ sm: "h-6 w-6 text-[10px]",
8
+ md: "h-8 w-8 text-xs",
9
+ lg: "h-11 w-11 text-sm"
10
+ };
11
+ function initialsFrom(name) {
12
+ const parts = name.trim().split(/\s+/).filter(Boolean);
13
+ if (parts.length === 0) return "";
14
+ if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();
15
+ return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
16
+ }
17
+ var Avatar = forwardRef(
18
+ ({ className, src, name, fallback, size = "md", ...props }, ref) => {
19
+ const [errored, setErrored] = useState(false);
20
+ const showImage = !!src && !errored;
21
+ return /* @__PURE__ */ jsx(
22
+ "span",
23
+ {
24
+ ref,
25
+ className: cn(
26
+ "relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full select-none",
27
+ "bg-tollerud-surface-raised text-tollerud-text-secondary font-medium",
28
+ "ring-1 ring-tollerud-border",
29
+ avatarSizes[size],
30
+ className
31
+ ),
32
+ ...props,
33
+ children: showImage ? /* @__PURE__ */ jsx(
34
+ "img",
35
+ {
36
+ src,
37
+ alt: name ?? "",
38
+ className: "h-full w-full object-cover",
39
+ onError: () => setErrored(true)
40
+ }
41
+ ) : /* @__PURE__ */ jsx("span", { "aria-hidden": !!name, children: fallback ?? (name ? initialsFrom(name) : null) })
42
+ }
43
+ );
44
+ }
45
+ );
46
+ Avatar.displayName = "Avatar";
47
+ var AvatarGroup = forwardRef(
48
+ ({ className, max, size = "md", children, ...props }, ref) => {
49
+ const items = Array.isArray(children) ? children : [children];
50
+ const visible = max ? items.slice(0, max) : items;
51
+ const overflow = max ? items.length - max : 0;
52
+ return /* @__PURE__ */ jsxs(
53
+ "div",
54
+ {
55
+ ref,
56
+ className: cn("flex items-center -space-x-2", className),
57
+ ...props,
58
+ children: [
59
+ visible.map((child, i) => /* @__PURE__ */ jsx("span", { className: "ring-2 ring-tollerud-surface rounded-full", children: child }, i)),
60
+ overflow > 0 && /* @__PURE__ */ jsxs(
61
+ "span",
62
+ {
63
+ className: cn(
64
+ "relative inline-flex shrink-0 items-center justify-center rounded-full select-none",
65
+ "bg-tollerud-surface-raised text-tollerud-text-muted font-medium",
66
+ "ring-2 ring-tollerud-surface",
67
+ avatarSizes[size]
68
+ ),
69
+ children: [
70
+ "+",
71
+ overflow
72
+ ]
73
+ }
74
+ )
75
+ ]
76
+ }
77
+ );
78
+ }
79
+ );
80
+ AvatarGroup.displayName = "AvatarGroup";
81
+
82
+ export { Avatar, AvatarGroup };
83
+ //# sourceMappingURL=chunk-DGCRHVWW.js.map
84
+ //# sourceMappingURL=chunk-DGCRHVWW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/Avatar.tsx"],"names":[],"mappings":"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","file":"chunk-DGCRHVWW.js","sourcesContent":["'use client'\n\nimport { type HTMLAttributes, forwardRef, useState } from 'react'\nimport { cn } from '@/lib/utils'\n\nconst avatarSizes = {\n sm: 'h-6 w-6 text-[10px]',\n md: 'h-8 w-8 text-xs',\n lg: 'h-11 w-11 text-sm',\n} as const\n\nfunction initialsFrom(name: string) {\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n if (parts.length === 0) return ''\n if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase()\n return (parts[0]![0] + parts[parts.length - 1]![0]).toUpperCase()\n}\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n /** Image source */\n src?: string\n /** Accessible name / used to derive initials fallback */\n name?: string\n /** Explicit fallback content (overrides derived initials) */\n fallback?: React.ReactNode\n size?: keyof typeof avatarSizes\n}\n\nconst Avatar = forwardRef<HTMLSpanElement, AvatarProps>(\n ({ className, src, name, fallback, size = 'md', ...props }, ref) => {\n const [errored, setErrored] = useState(false)\n const showImage = !!src && !errored\n\n return (\n <span\n ref={ref}\n className={cn(\n 'relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full select-none',\n 'bg-tollerud-surface-raised text-tollerud-text-secondary font-medium',\n 'ring-1 ring-tollerud-border',\n avatarSizes[size],\n className\n )}\n {...props}\n >\n {showImage ? (\n <img\n src={src}\n alt={name ?? ''}\n className=\"h-full w-full object-cover\"\n onError={() => setErrored(true)}\n />\n ) : (\n <span aria-hidden={!!name}>{fallback ?? (name ? initialsFrom(name) : null)}</span>\n )}\n </span>\n )\n }\n)\nAvatar.displayName = 'Avatar'\n\nexport interface AvatarGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Maximum avatars to render before collapsing into a \"+N\" overflow indicator */\n max?: number\n size?: keyof typeof avatarSizes\n children: React.ReactNode\n}\n\nconst AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(\n ({ className, max, size = 'md', children, ...props }, ref) => {\n const items = Array.isArray(children) ? children : [children]\n const visible = max ? items.slice(0, max) : items\n const overflow = max ? items.length - max : 0\n\n return (\n <div\n ref={ref}\n className={cn('flex items-center -space-x-2', className)}\n {...props}\n >\n {visible.map((child, i) => (\n <span key={i} className=\"ring-2 ring-tollerud-surface rounded-full\">\n {child}\n </span>\n ))}\n {overflow > 0 && (\n <span\n className={cn(\n 'relative inline-flex shrink-0 items-center justify-center rounded-full select-none',\n 'bg-tollerud-surface-raised text-tollerud-text-muted font-medium',\n 'ring-2 ring-tollerud-surface',\n avatarSizes[size]\n )}\n >\n +{overflow}\n </span>\n )}\n </div>\n )\n }\n)\nAvatarGroup.displayName = 'AvatarGroup'\n\nexport { Avatar, AvatarGroup }\n"]}
@@ -0,0 +1,22 @@
1
+ 'use client';
2
+ import { cn } from './chunk-WSQNPRGN.js';
3
+ import { forwardRef } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var Container = forwardRef(
7
+ ({ className, as: Tag = "div", ...props }, ref) => {
8
+ return /* @__PURE__ */ jsx(
9
+ Tag,
10
+ {
11
+ ref,
12
+ className: cn("mx-auto w-full max-w-[1100px] px-6", className),
13
+ ...props
14
+ }
15
+ );
16
+ }
17
+ );
18
+ Container.displayName = "Container";
19
+
20
+ export { Container };
21
+ //# sourceMappingURL=chunk-DNJI65VQ.js.map
22
+ //# sourceMappingURL=chunk-DNJI65VQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/Container.tsx"],"names":[],"mappings":";;;;AAOA,IAAM,SAAA,GAAY,UAAA;AAAA,EAChB,CAAC,EAAE,SAAA,EAAW,EAAA,EAAI,MAAM,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACjD,IAAA,uBACE,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,oCAAA,EAAsC,SAAS,CAAA;AAAA,QAC5D,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,SAAA,CAAU,WAAA,GAAc,WAAA","file":"chunk-DNJI65VQ.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface ContainerProps extends HTMLAttributes<HTMLDivElement> {\n as?: 'div' | 'section' | 'article' | 'main' | 'header' | 'footer'\n}\n\nconst Container = forwardRef<HTMLDivElement, ContainerProps>(\n ({ className, as: Tag = 'div', ...props }, ref) => {\n return (\n <Tag\n ref={ref}\n className={cn('mx-auto w-full max-w-[1100px] px-6', className)}\n {...props}\n />\n )\n }\n)\nContainer.displayName = 'Container'\n\nexport { Container }\n"]}
@@ -0,0 +1,63 @@
1
+ 'use client';
2
+ import { StatusDot } from './chunk-NHPISZWS.js';
3
+ import { cn } from './chunk-WSQNPRGN.js';
4
+ import { forwardRef } from 'react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ var HostCard = forwardRef(
8
+ ({ className, hostname, ip, status = "online", cpu, memory, disk, uptime, containers, loading, ...props }, ref) => {
9
+ return /* @__PURE__ */ jsxs(
10
+ "div",
11
+ {
12
+ ref,
13
+ className: cn(
14
+ "rounded-lg border bg-tollerud-surface-raised p-4",
15
+ "transition-[border-color] duration-[150ms]",
16
+ status === "offline" && "border-tollerud-error/40",
17
+ status === "warning" && "border-tollerud-yellow/30",
18
+ status === "online" && "border-tollerud-border hover:border-tollerud-noir-500",
19
+ loading && "animate-pulse",
20
+ className
21
+ ),
22
+ ...props,
23
+ children: [
24
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
25
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [
26
+ /* @__PURE__ */ jsx(StatusDot, { status }),
27
+ /* @__PURE__ */ jsx("span", { className: "font-semibold text-sm text-tollerud-foreground truncate", children: hostname })
28
+ ] }),
29
+ containers !== void 0 && /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-tollerud-text-muted whitespace-nowrap ml-2", children: [
30
+ containers,
31
+ " container",
32
+ containers !== 1 ? "s" : ""
33
+ ] })
34
+ ] }),
35
+ ip && /* @__PURE__ */ jsx("div", { className: "text-xs text-tollerud-text-muted mb-2 font-mono", children: ip }),
36
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-x-4 gap-y-1 text-xs text-tollerud-text-muted", children: [
37
+ cpu && /* @__PURE__ */ jsxs("span", { children: [
38
+ "CPU: ",
39
+ /* @__PURE__ */ jsx("span", { className: "text-tollerud-text-secondary", children: cpu })
40
+ ] }),
41
+ memory && /* @__PURE__ */ jsxs("span", { children: [
42
+ "RAM: ",
43
+ /* @__PURE__ */ jsx("span", { className: "text-tollerud-text-secondary", children: memory })
44
+ ] }),
45
+ disk && /* @__PURE__ */ jsxs("span", { children: [
46
+ "Disk: ",
47
+ /* @__PURE__ */ jsx("span", { className: "text-tollerud-text-secondary", children: disk })
48
+ ] }),
49
+ uptime && /* @__PURE__ */ jsxs("span", { children: [
50
+ "Up: ",
51
+ /* @__PURE__ */ jsx("span", { className: "text-tollerud-text-secondary", children: uptime })
52
+ ] })
53
+ ] })
54
+ ]
55
+ }
56
+ );
57
+ }
58
+ );
59
+ HostCard.displayName = "HostCard";
60
+
61
+ export { HostCard };
62
+ //# sourceMappingURL=chunk-DOUDJU4P.js.map
63
+ //# sourceMappingURL=chunk-DOUDJU4P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/HostCard.tsx"],"names":[],"mappings":";;;;;AAyBA,IAAM,QAAA,GAAW,UAAA;AAAA,EACf,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,SAAS,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,UAAA,EAAY,OAAA,EAAS,GAAG,KAAA,IAAS,GAAA,KAAQ;AACjH,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,kDAAA;AAAA,UACA,4CAAA;AAAA,UACA,WAAW,SAAA,IAAa,0BAAA;AAAA,UACxB,WAAW,SAAA,IAAa,2BAAA;AAAA,UACxB,WAAW,QAAA,IAAY,uDAAA;AAAA,UACvB,OAAA,IAAW,eAAA;AAAA,UACX;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,aAAU,MAAA,EAAgB,CAAA;AAAA,8BAC3B,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAA,EACb,QAAA,EAAA,QAAA,EACH;AAAA,aAAA,EACF,CAAA;AAAA,YACC,UAAA,KAAe,MAAA,oBACd,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6DAAA,EACb,QAAA,EAAA;AAAA,cAAA,UAAA;AAAA,cAAW,YAAA;AAAA,cAAW,UAAA,KAAe,IAAI,GAAA,GAAM;AAAA,aAAA,EAClD;AAAA,WAAA,EAEJ,CAAA;AAAA,UACC,EAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAmD,QAAA,EAAA,EAAA,EAAG,CAAA;AAAA,0BAEvE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACZ,QAAA,EAAA;AAAA,YAAA,GAAA,yBAAQ,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,OAAA;AAAA,8BAAK,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,GAAA,EAAI;AAAA,aAAA,EAAO,CAAA;AAAA,YAC7E,MAAA,yBAAW,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,OAAA;AAAA,8BAAK,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,MAAA,EAAO;AAAA,aAAA,EAAO,CAAA;AAAA,YACnF,IAAA,yBAAS,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,8BAAM,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,IAAA,EAAK;AAAA,aAAA,EAAO,CAAA;AAAA,YAChF,MAAA,yBAAW,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,MAAA;AAAA,8BAAI,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,MAAA,EAAO;AAAA,aAAA,EAAO;AAAA,WAAA,EACrF;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-DOUDJU4P.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\nimport { StatusDot, type Status } from './StatusDot'\n\nexport interface HostCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Hostname */\n hostname: string\n /** IP address */\n ip?: string\n /** Status */\n status?: Status\n /** CPU load (e.g. '23%') */\n cpu?: string\n /** Memory usage (e.g. '6.2/16 GB') */\n memory?: string\n /** Disk usage (e.g. '45%') */\n disk?: string\n /** Uptime */\n uptime?: string\n /** Number of containers running */\n containers?: number\n /** Whether the card is loading */\n loading?: boolean\n}\n\nconst HostCard = forwardRef<HTMLDivElement, HostCardProps>(\n ({ className, hostname, ip, status = 'online', cpu, memory, disk, uptime, containers, loading, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-lg border bg-tollerud-surface-raised p-4',\n 'transition-[border-color] duration-[150ms]',\n status === 'offline' && 'border-tollerud-error/40',\n status === 'warning' && 'border-tollerud-yellow/30',\n status === 'online' && 'border-tollerud-border hover:border-tollerud-noir-500',\n loading && 'animate-pulse',\n className\n )}\n {...props}\n >\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <StatusDot status={status} />\n <span className=\"font-semibold text-sm text-tollerud-foreground truncate\">\n {hostname}\n </span>\n </div>\n {containers !== undefined && (\n <span className=\"text-[11px] text-tollerud-text-muted whitespace-nowrap ml-2\">\n {containers} container{containers !== 1 ? 's' : ''}\n </span>\n )}\n </div>\n {ip && (\n <div className=\"text-xs text-tollerud-text-muted mb-2 font-mono\">{ip}</div>\n )}\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 text-xs text-tollerud-text-muted\">\n {cpu && <span>CPU: <span className=\"text-tollerud-text-secondary\">{cpu}</span></span>}\n {memory && <span>RAM: <span className=\"text-tollerud-text-secondary\">{memory}</span></span>}\n {disk && <span>Disk: <span className=\"text-tollerud-text-secondary\">{disk}</span></span>}\n {uptime && <span>Up: <span className=\"text-tollerud-text-secondary\">{uptime}</span></span>}\n </div>\n </div>\n )\n }\n)\nHostCard.displayName = 'HostCard'\n\nexport { HostCard }\n"]}
@@ -0,0 +1,64 @@
1
+ 'use client';
2
+ import { cn } from './chunk-WSQNPRGN.js';
3
+ import { forwardRef, useState, useCallback } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var CodeBlock = forwardRef(
7
+ ({ className, children, code, promptPrefix: _promptPrefix, showCopy = true, ...props }, ref) => {
8
+ const [copied, setCopied] = useState(false);
9
+ const content = code ? /* @__PURE__ */ jsx("code", { className: "text-tollerud-noir-200", children: code }) : children;
10
+ const handleCopy = useCallback(async () => {
11
+ const text = code ?? (typeof children === "string" ? children : "");
12
+ if (!text) return;
13
+ try {
14
+ await navigator.clipboard.writeText(text);
15
+ } catch {
16
+ const textarea = document.createElement("textarea");
17
+ textarea.value = text;
18
+ textarea.style.position = "fixed";
19
+ textarea.style.opacity = "0";
20
+ document.body.appendChild(textarea);
21
+ textarea.select();
22
+ document.execCommand("copy");
23
+ document.body.removeChild(textarea);
24
+ }
25
+ setCopied(true);
26
+ setTimeout(() => setCopied(false), 1500);
27
+ }, [code, children]);
28
+ return /* @__PURE__ */ jsxs("div", { className: "relative group", children: [
29
+ /* @__PURE__ */ jsx(
30
+ "pre",
31
+ {
32
+ ref,
33
+ className: cn(
34
+ "font-mono text-sm leading-relaxed overflow-x-auto rounded border p-4",
35
+ "bg-tollerud-noir-900 border-tollerud-border text-tollerud-noir-200",
36
+ className
37
+ ),
38
+ ...props,
39
+ children: content
40
+ }
41
+ ),
42
+ showCopy && /* @__PURE__ */ jsx(
43
+ "button",
44
+ {
45
+ onClick: handleCopy,
46
+ className: cn(
47
+ "absolute top-2 right-2 px-2 py-1 rounded text-xs font-medium",
48
+ "opacity-0 group-hover:opacity-100 transition-all",
49
+ "bg-tollerud-noir-800 border border-tollerud-border/30 text-tollerud-text-muted",
50
+ "hover:bg-tollerud-surface-raised hover:text-tollerud-text-primary",
51
+ copied && "opacity-100 bg-tollerud-success/15 text-tollerud-success border-tollerud-success/40"
52
+ ),
53
+ "aria-label": copied ? "Copied" : "Copy code",
54
+ children: copied ? "\u2713 Copied" : "Copy"
55
+ }
56
+ )
57
+ ] });
58
+ }
59
+ );
60
+ CodeBlock.displayName = "CodeBlock";
61
+
62
+ export { CodeBlock };
63
+ //# sourceMappingURL=chunk-DRCMGIQ6.js.map
64
+ //# sourceMappingURL=chunk-DRCMGIQ6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/CodeBlock.tsx"],"names":[],"mappings":";;;;AAcA,IAAM,SAAA,GAAY,UAAA;AAAA,EAChB,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,QAAA,GAAW,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC9F,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAE1C,IAAA,MAAM,UAAU,IAAA,mBACd,GAAA,CAAC,UAAK,SAAA,EAAU,wBAAA,EAA0B,gBAAK,CAAA,GAE/C,QAAA;AAGF,IAAA,MAAM,UAAA,GAAa,YAAY,YAAY;AACzC,MAAA,MAAM,IAAA,GAAO,IAAA,KAAS,OAAO,QAAA,KAAa,WAAW,QAAA,GAAW,EAAA,CAAA;AAChE,MAAA,IAAI,CAAC,IAAA,EAAM;AAGX,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AAAA,MAC1C,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAClD,QAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AACjB,QAAA,QAAA,CAAS,MAAM,QAAA,GAAW,OAAA;AAC1B,QAAA,QAAA,CAAS,MAAM,OAAA,GAAU,GAAA;AACzB,QAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,QAAA,QAAA,CAAS,MAAA,EAAO;AAChB,QAAA,QAAA,CAAS,YAAY,MAAM,CAAA;AAC3B,QAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAAA,MACpC;AAEA,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,IAAI,CAAA;AAAA,IACzC,CAAA,EAAG,CAAC,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEnB,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,sEAAA;AAAA,YACA,oEAAA;AAAA,YACA;AAAA,WACF;AAAA,UACC,GAAG,KAAA;AAAA,UAEH,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,MACC,QAAA,oBACC,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAW,EAAA;AAAA,YACT,8DAAA;AAAA,YACA,kDAAA;AAAA,YACA,gFAAA;AAAA,YACA,mEAAA;AAAA,YACA,MAAA,IAAU;AAAA,WACZ;AAAA,UACA,YAAA,EAAY,SAAS,QAAA,GAAW,WAAA;AAAA,UAE/B,mBAAS,eAAA,GAAa;AAAA;AAAA;AACzB,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AACA,SAAA,CAAU,WAAA,GAAc,WAAA","file":"chunk-DRCMGIQ6.js","sourcesContent":["'use client'\n\nimport { type HTMLAttributes, forwardRef, useState, useCallback } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface CodeBlockProps extends HTMLAttributes<HTMLPreElement> {\n /** Optional string content to render inside <code> tags */\n code?: string\n /** When true, prepends a prompt symbol ($) before text content */\n promptPrefix?: boolean\n /** When false, hides the copy-to-clipboard button (default: true) */\n showCopy?: boolean\n}\n\nconst CodeBlock = forwardRef<HTMLPreElement, CodeBlockProps>(\n ({ className, children, code, promptPrefix: _promptPrefix, showCopy = true, ...props }, ref) => {\n const [copied, setCopied] = useState(false)\n\n const content = code ? (\n <code className=\"text-tollerud-noir-200\">{code}</code>\n ) : (\n children\n )\n\n const handleCopy = useCallback(async () => {\n const text = code ?? (typeof children === 'string' ? children : '')\n if (!text) return\n\n // Try clipboard API first, fallback to execCommand for broader compat\n try {\n await navigator.clipboard.writeText(text)\n } catch {\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.style.position = 'fixed'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n textarea.select()\n document.execCommand('copy')\n document.body.removeChild(textarea)\n }\n\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n }, [code, children])\n\n return (\n <div className=\"relative group\">\n <pre\n ref={ref}\n className={cn(\n 'font-mono text-sm leading-relaxed overflow-x-auto rounded border p-4',\n 'bg-tollerud-noir-900 border-tollerud-border text-tollerud-noir-200',\n className\n )}\n {...props}\n >\n {content}\n </pre>\n {showCopy && (\n <button\n onClick={handleCopy}\n className={cn(\n 'absolute top-2 right-2 px-2 py-1 rounded text-xs font-medium',\n 'opacity-0 group-hover:opacity-100 transition-all',\n 'bg-tollerud-noir-800 border border-tollerud-border/30 text-tollerud-text-muted',\n 'hover:bg-tollerud-surface-raised hover:text-tollerud-text-primary',\n copied && 'opacity-100 bg-tollerud-success/15 text-tollerud-success border-tollerud-success/40'\n )}\n aria-label={copied ? 'Copied' : 'Copy code'}\n >\n {copied ? '✓ Copied' : 'Copy'}\n </button>\n )}\n </div>\n )\n }\n)\nCodeBlock.displayName = 'CodeBlock'\n\nexport { CodeBlock }\n"]}
@@ -0,0 +1,28 @@
1
+ 'use client';
2
+ import { cn } from './chunk-WSQNPRGN.js';
3
+ import { forwardRef } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var Card = forwardRef(
7
+ ({ className, accent, density, ...props }, ref) => {
8
+ return /* @__PURE__ */ jsx(
9
+ "div",
10
+ {
11
+ ref,
12
+ "data-density": density ?? void 0,
13
+ className: cn(
14
+ "rounded-lg border bg-tollerud-surface-raised p-6 transition-[border-color] duration-[150ms]",
15
+ accent ? "border-tollerud-yellow/25" : "border-tollerud-border",
16
+ "hover:border-tollerud-noir-500",
17
+ className
18
+ ),
19
+ ...props
20
+ }
21
+ );
22
+ }
23
+ );
24
+ Card.displayName = "Card";
25
+
26
+ export { Card };
27
+ //# sourceMappingURL=chunk-DZOBXK2S.js.map
28
+ //# sourceMappingURL=chunk-DZOBXK2S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/Card.tsx"],"names":[],"mappings":";;;;AAQA,IAAM,IAAA,GAAO,UAAA;AAAA,EACX,CAAC,EAAE,SAAA,EAAW,MAAA,EAAQ,SAAS,GAAG,KAAA,IAAS,GAAA,KAAQ;AACjD,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,gBAAc,OAAA,IAAW,MAAA;AAAA,QACzB,SAAA,EAAW,EAAA;AAAA,UACT,6FAAA;AAAA,UACA,SAAS,2BAAA,GAA8B,wBAAA;AAAA,UACvC,gCAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,IAAA,CAAK,WAAA,GAAc,MAAA","file":"chunk-DZOBXK2S.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n accent?: boolean\n density?: 'comfortable' | 'compact'\n}\n\nconst Card = forwardRef<HTMLDivElement, CardProps>(\n ({ className, accent, density, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-density={density ?? undefined}\n className={cn(\n 'rounded-lg border bg-tollerud-surface-raised p-6 transition-[border-color] duration-[150ms]',\n accent ? 'border-tollerud-yellow/25' : 'border-tollerud-border',\n 'hover:border-tollerud-noir-500',\n className\n )}\n {...props}\n />\n )\n }\n)\nCard.displayName = 'Card'\n\nexport { Card }\n"]}