@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,77 @@
1
+ 'use client';
2
+ import { cn } from './chunk-WSQNPRGN.js';
3
+ import * as React from 'react';
4
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ var TooltipProvider = TooltipPrimitive.Provider;
8
+ var TooltipContext = React.createContext(null);
9
+ function Tooltip({
10
+ children,
11
+ defaultOpen,
12
+ open: controlledOpen,
13
+ onOpenChange: controlledOnOpenChange,
14
+ ...props
15
+ }) {
16
+ const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false);
17
+ const isControlled = controlledOpen !== void 0;
18
+ const open = isControlled ? controlledOpen : internalOpen;
19
+ const setOpen = isControlled ? controlledOnOpenChange ?? setInternalOpen : setInternalOpen;
20
+ return /* @__PURE__ */ jsx(TooltipContext.Provider, { value: { open, setOpen }, children: /* @__PURE__ */ jsx(TooltipPrimitive.Root, { open, onOpenChange: (v) => setOpen(v), ...props, children }) });
21
+ }
22
+ Tooltip.displayName = "Tooltip";
23
+ var TooltipTrigger = React.forwardRef(({ onClick, onTouchStart, children, ...props }, ref) => {
24
+ const ctx = React.useContext(TooltipContext);
25
+ const touchFired = React.useRef(false);
26
+ return /* @__PURE__ */ jsx(
27
+ TooltipPrimitive.Trigger,
28
+ {
29
+ ref,
30
+ onClick: (e) => {
31
+ if (touchFired.current) {
32
+ touchFired.current = false;
33
+ return;
34
+ }
35
+ if (ctx) {
36
+ ctx.setOpen(!ctx.open);
37
+ }
38
+ onClick?.(e);
39
+ },
40
+ onTouchStart: (e) => {
41
+ touchFired.current = true;
42
+ if (ctx && !ctx.open) {
43
+ ctx.setOpen(true);
44
+ }
45
+ onTouchStart?.(e);
46
+ },
47
+ ...props,
48
+ children
49
+ }
50
+ );
51
+ });
52
+ TooltipTrigger.displayName = "TooltipTrigger";
53
+ var TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(
54
+ TooltipPrimitive.Content,
55
+ {
56
+ ref,
57
+ sideOffset,
58
+ className: cn(
59
+ "z-50 overflow-hidden rounded-md border border-tollerud-border/30",
60
+ "bg-tollerud-noir-800 px-3 py-1.5 text-xs text-tollerud-foreground",
61
+ "shadow-md",
62
+ "animate-in fade-in-0 zoom-in-95",
63
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
64
+ "data-[side=bottom]:slide-in-from-top-1",
65
+ "data-[side=left]:slide-in-from-right-1",
66
+ "data-[side=right]:slide-in-from-left-1",
67
+ "data-[side=top]:slide-in-from-bottom-1",
68
+ className
69
+ ),
70
+ ...props
71
+ }
72
+ ));
73
+ TooltipContent.displayName = "TooltipContent";
74
+
75
+ export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
76
+ //# sourceMappingURL=chunk-6UXW5YUC.js.map
77
+ //# sourceMappingURL=chunk-6UXW5YUC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/Tooltip.tsx"],"names":[],"mappings":";;;;;AAMA,IAAM,eAAA,GAAmC,gBAAA,CAAA;AAYzC,IAAM,cAAA,GAAuB,oBAA0C,IAAI,CAAA;AAE3E,SAAS,OAAA,CAAQ;AAAA,EACf,QAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA,EAAM,cAAA;AAAA,EACN,YAAA,EAAc,sBAAA;AAAA,EACd,GAAG;AACL,CAAA,EAAiE;AAC/D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,KAAA,CAAA,QAAA,CAAS,eAAe,KAAK,CAAA;AAC3E,EAAA,MAAM,eAAe,cAAA,KAAmB,MAAA;AACxC,EAAA,MAAM,IAAA,GAAO,eAAe,cAAA,GAAiB,YAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,YAAA,GAAgB,sBAAA,IAA0B,eAAA,GAAmB,eAAA;AAE7E,EAAA,uBACE,GAAA,CAAC,eAAe,QAAA,EAAf,EAAwB,OAAO,EAAE,IAAA,EAAM,OAAA,EAAQ,EAC9C,QAAA,kBAAA,GAAA,CAAkB,gBAAA,CAAA,IAAA,EAAjB,EAAsB,IAAA,EAAY,YAAA,EAAc,CAAC,CAAA,KAAe,OAAA,CAAQ,CAAC,CAAA,EAAI,GAAG,KAAA,EAC9E,QAAA,EACH,CAAA,EACF,CAAA;AAEJ;AACA,OAAA,CAAQ,WAAA,GAAc,SAAA;AAEtB,IAAM,cAAA,GAAuB,KAAA,CAAA,UAAA,CAG3B,CAAC,EAAE,OAAA,EAAS,cAAc,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACxD,EAAA,MAAM,GAAA,GAAY,iBAAW,cAAc,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAmB,aAAO,KAAK,CAAA;AAErC,EAAA,uBACE,GAAA;AAAA,IAAkB,gBAAA,CAAA,OAAA;AAAA,IAAjB;AAAA,MACC,GAAA;AAAA,MACA,OAAA,EAAS,CAAC,CAAA,KAAM;AAEd,QAAA,IAAI,WAAW,OAAA,EAAS;AACtB,UAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AACrB,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,GAAA,CAAI,IAAI,CAAA;AAAA,QACvB;AACA,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb,CAAA;AAAA,MACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAErB,QAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,IAAA,EAAM;AACpB,UAAA,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,QAClB;AACA,QAAA,YAAA,GAAe,CAAC,CAAA;AAAA,MAClB,CAAA;AAAA,MACC,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC;AACD,cAAA,CAAe,WAAA,GAAc,gBAAA;AAE7B,IAAM,cAAA,GAAuB,KAAA,CAAA,UAAA,CAG3B,CAAC,EAAE,SAAA,EAAW,aAAa,CAAA,EAAG,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1C,GAAA;AAAA,EAAkB,gBAAA,CAAA,OAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,kEAAA;AAAA,MACA,mEAAA;AAAA,MACA,WAAA;AAAA,MACA,iCAAA;AAAA,MACA,gGAAA;AAAA,MACA,wCAAA;AAAA,MACA,wCAAA;AAAA,MACA,wCAAA;AAAA,MACA,wCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,cAAA,CAAe,WAAA,GAAc,gBAAA","file":"chunk-6UXW5YUC.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\nimport { cn } from '@/lib/utils'\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\n/* ── Mobile-friendly Tooltip ──\n Opens on hover (desktop) AND on click/tap (mobile).\n Uses React context so the Trigger can toggle Root's open state.\n Closes on second click/tap or click outside. */\n\ntype TooltipContextValue = {\n open: boolean\n setOpen: (open: boolean) => void\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null)\n\nfunction Tooltip({\n children,\n defaultOpen,\n open: controlledOpen,\n onOpenChange: controlledOnOpenChange,\n ...props\n}: React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>) {\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false)\n const isControlled = controlledOpen !== undefined\n const open = isControlled ? controlledOpen : internalOpen\n const setOpen = isControlled ? (controlledOnOpenChange ?? setInternalOpen) : setInternalOpen\n\n return (\n <TooltipContext.Provider value={{ open, setOpen }}>\n <TooltipPrimitive.Root open={open} onOpenChange={(v: boolean) => setOpen(v)} {...props}>\n {children}\n </TooltipPrimitive.Root>\n </TooltipContext.Provider>\n )\n}\nTooltip.displayName = 'Tooltip'\n\nconst TooltipTrigger = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>\n>(({ onClick, onTouchStart, children, ...props }, ref) => {\n const ctx = React.useContext(TooltipContext)\n const touchFired = React.useRef(false)\n\n return (\n <TooltipPrimitive.Trigger\n ref={ref}\n onClick={(e) => {\n // Skip click if this was triggered by a touch (already handled)\n if (touchFired.current) {\n touchFired.current = false\n return\n }\n // Toggle tooltip on click — covers mobile where hover doesn't fire\n if (ctx) {\n ctx.setOpen(!ctx.open)\n }\n onClick?.(e)\n }}\n onTouchStart={(e) => {\n touchFired.current = true\n // Open on touch for mobile\n if (ctx && !ctx.open) {\n ctx.setOpen(true)\n }\n onTouchStart?.(e)\n }}\n {...props}\n >\n {children}\n </TooltipPrimitive.Trigger>\n )\n})\nTooltipTrigger.displayName = 'TooltipTrigger'\n\nconst TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 overflow-hidden rounded-md border border-tollerud-border/30',\n 'bg-tollerud-noir-800 px-3 py-1.5 text-xs text-tollerud-foreground',\n 'shadow-md',\n 'animate-in fade-in-0 zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n 'data-[side=bottom]:slide-in-from-top-1',\n 'data-[side=left]:slide-in-from-right-1',\n 'data-[side=right]:slide-in-from-left-1',\n 'data-[side=top]:slide-in-from-bottom-1',\n className\n )}\n {...props}\n />\n))\nTooltipContent.displayName = 'TooltipContent'\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }"]}
@@ -0,0 +1,52 @@
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 ServiceHealthCard = forwardRef(
8
+ ({ className, service, status = "online", uptime, responseTime, version, 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
+ status === "idle" && "border-tollerud-border opacity-60",
20
+ loading && "animate-pulse",
21
+ className
22
+ ),
23
+ ...props,
24
+ children: [
25
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
26
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-tollerud-foreground truncate", children: service }),
27
+ /* @__PURE__ */ jsx(StatusDot, { status })
28
+ ] }),
29
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-x-4 gap-y-1 text-xs text-tollerud-text-muted", children: [
30
+ uptime && /* @__PURE__ */ jsxs("span", { children: [
31
+ "Uptime: ",
32
+ /* @__PURE__ */ jsx("span", { className: "text-tollerud-text-secondary", children: uptime })
33
+ ] }),
34
+ responseTime && /* @__PURE__ */ jsxs("span", { children: [
35
+ "Response: ",
36
+ /* @__PURE__ */ jsx("span", { className: "text-tollerud-text-secondary", children: responseTime })
37
+ ] }),
38
+ version && /* @__PURE__ */ jsxs("span", { children: [
39
+ "Version: ",
40
+ /* @__PURE__ */ jsx("span", { className: "text-tollerud-text-secondary", children: version })
41
+ ] })
42
+ ] })
43
+ ]
44
+ }
45
+ );
46
+ }
47
+ );
48
+ ServiceHealthCard.displayName = "ServiceHealthCard";
49
+
50
+ export { ServiceHealthCard };
51
+ //# sourceMappingURL=chunk-7EP2T3OW.js.map
52
+ //# sourceMappingURL=chunk-7EP2T3OW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/ServiceHealthCard.tsx"],"names":[],"mappings":";;;;;AAmBA,IAAM,iBAAA,GAAoB,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,MAAA,GAAS,QAAA,EAAU,MAAA,EAAQ,YAAA,EAAc,OAAA,EAAS,OAAA,EAAS,GAAG,KAAA,IAAS,GAAA,KAAQ;AACpG,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,WAAW,MAAA,IAAU,mCAAA;AAAA,UACrB,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,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAA,EACb,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,4BACA,GAAA,CAAC,aAAU,MAAA,EAAgB;AAAA,WAAA,EAC7B,CAAA;AAAA,0BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACZ,QAAA,EAAA;AAAA,YAAA,MAAA,yBAAW,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,UAAA;AAAA,8BAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,MAAA,EAAO;AAAA,aAAA,EAAO,CAAA;AAAA,YACtF,YAAA,yBAAiB,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,YAAA;AAAA,8BAAU,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,YAAA,EAAa;AAAA,aAAA,EAAO,CAAA;AAAA,YACpG,OAAA,yBAAY,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,WAAA;AAAA,8BAAS,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,OAAA,EAAQ;AAAA,aAAA,EAAO;AAAA,WAAA,EAC5F;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,iBAAA,CAAkB,WAAA,GAAc,mBAAA","file":"chunk-7EP2T3OW.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\nimport { StatusDot, type Status } from './StatusDot'\n\nexport interface ServiceHealthCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Service name */\n service: string\n /** Health status */\n status?: Status\n /** Uptime string (e.g. '14d 3h') */\n uptime?: string\n /** Response time in ms */\n responseTime?: string\n /** Current version */\n version?: string\n /** Whether the card is in a loading state */\n loading?: boolean\n}\n\nconst ServiceHealthCard = forwardRef<HTMLDivElement, ServiceHealthCardProps>(\n ({ className, service, status = 'online', uptime, responseTime, version, 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 status === 'idle' && 'border-tollerud-border opacity-60',\n loading && 'animate-pulse',\n className\n )}\n {...props}\n >\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-semibold text-tollerud-foreground truncate\">\n {service}\n </span>\n <StatusDot status={status} />\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 text-xs text-tollerud-text-muted\">\n {uptime && <span>Uptime: <span className=\"text-tollerud-text-secondary\">{uptime}</span></span>}\n {responseTime && <span>Response: <span className=\"text-tollerud-text-secondary\">{responseTime}</span></span>}\n {version && <span>Version: <span className=\"text-tollerud-text-secondary\">{version}</span></span>}\n </div>\n </div>\n )\n }\n)\nServiceHealthCard.displayName = 'ServiceHealthCard'\n\nexport { ServiceHealthCard }\n"]}
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ import { cn } from './chunk-WSQNPRGN.js';
3
+ import { forwardRef, Fragment } from 'react';
4
+ import { ChevronRight } from 'lucide-react';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ var Breadcrumb = forwardRef(
8
+ ({ className, items, separator, ...props }, ref) => {
9
+ return /* @__PURE__ */ jsx("nav", { ref, "aria-label": "Breadcrumb", className: cn("text-sm", className), ...props, children: /* @__PURE__ */ jsx("ol", { className: "flex items-center gap-1.5 flex-wrap", children: items.map((item, i) => {
10
+ const isLast = i === items.length - 1;
11
+ const content = !isLast && (item.href || item.onClick) ? /* @__PURE__ */ jsx(
12
+ "a",
13
+ {
14
+ href: item.href,
15
+ onClick: item.onClick,
16
+ className: "text-tollerud-text-secondary hover:text-tollerud-text-primary transition-colors duration-[150ms]",
17
+ children: item.label
18
+ }
19
+ ) : /* @__PURE__ */ jsx(
20
+ "span",
21
+ {
22
+ "aria-current": isLast ? "page" : void 0,
23
+ className: isLast ? "text-tollerud-text-primary font-medium" : "text-tollerud-text-secondary",
24
+ children: item.label
25
+ }
26
+ );
27
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
28
+ /* @__PURE__ */ jsx("li", { className: "flex items-center gap-1.5", children: content }),
29
+ !isLast && /* @__PURE__ */ jsx("li", { "aria-hidden": "true", className: "flex items-center text-tollerud-text-muted", children: separator ?? /* @__PURE__ */ jsx(ChevronRight, { size: 14 }) })
30
+ ] }, i);
31
+ }) }) });
32
+ }
33
+ );
34
+ Breadcrumb.displayName = "Breadcrumb";
35
+
36
+ export { Breadcrumb };
37
+ //# sourceMappingURL=chunk-7J5QXUQN.js.map
38
+ //# sourceMappingURL=chunk-7J5QXUQN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/Breadcrumb.tsx"],"names":[],"mappings":";;;;;AAgBA,IAAM,UAAA,GAAa,UAAA;AAAA,EACjB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,WAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAClD,IAAA,uBACE,GAAA,CAAC,SAAI,GAAA,EAAU,YAAA,EAAW,cAAa,SAAA,EAAW,EAAA,CAAG,WAAW,SAAS,CAAA,EAAI,GAAG,KAAA,EAC9E,QAAA,kBAAA,GAAA,CAAC,QAAG,SAAA,EAAU,qCAAA,EACX,gBAAM,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AACtB,MAAA,MAAM,MAAA,GAAS,CAAA,KAAM,KAAA,CAAM,MAAA,GAAS,CAAA;AACpC,MAAA,MAAM,UACJ,CAAC,MAAA,KAAW,IAAA,CAAK,IAAA,IAAQ,KAAK,OAAA,CAAA,mBAC5B,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,SAAA,EAAU,kGAAA;AAAA,UAET,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,OACR,mBAEA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,cAAA,EAAc,SAAS,MAAA,GAAS,MAAA;AAAA,UAChC,SAAA,EAAW,SAAS,wCAAA,GAA2C,8BAAA;AAAA,UAE9D,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,OACR;AAGJ,MAAA,4BACG,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,QAClD,CAAC,MAAA,oBACA,GAAA,CAAC,IAAA,EAAA,EAAG,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,4CAAA,EAC9B,QAAA,EAAA,SAAA,oBAAa,GAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,IAAI,CAAA,EACxC;AAAA,OAAA,EAAA,EALW,CAOf,CAAA;AAAA,IAEJ,CAAC,GACH,CAAA,EACF,CAAA;AAAA,EAEJ;AACF;AACA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-7J5QXUQN.js","sourcesContent":["import { type HTMLAttributes, Fragment, forwardRef } from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport { cn } from '@/lib/utils'\n\nexport interface BreadcrumbItem {\n label: React.ReactNode\n href?: string\n onClick?: () => void\n}\n\nexport interface BreadcrumbProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {\n items: BreadcrumbItem[]\n /** Custom separator (defaults to a chevron) */\n separator?: React.ReactNode\n}\n\nconst Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(\n ({ className, items, separator, ...props }, ref) => {\n return (\n <nav ref={ref} aria-label=\"Breadcrumb\" className={cn('text-sm', className)} {...props}>\n <ol className=\"flex items-center gap-1.5 flex-wrap\">\n {items.map((item, i) => {\n const isLast = i === items.length - 1\n const content =\n !isLast && (item.href || item.onClick) ? (\n <a\n href={item.href}\n onClick={item.onClick}\n className=\"text-tollerud-text-secondary hover:text-tollerud-text-primary transition-colors duration-[150ms]\"\n >\n {item.label}\n </a>\n ) : (\n <span\n aria-current={isLast ? 'page' : undefined}\n className={isLast ? 'text-tollerud-text-primary font-medium' : 'text-tollerud-text-secondary'}\n >\n {item.label}\n </span>\n )\n\n return (\n <Fragment key={i}>\n <li className=\"flex items-center gap-1.5\">{content}</li>\n {!isLast && (\n <li aria-hidden=\"true\" className=\"flex items-center text-tollerud-text-muted\">\n {separator ?? <ChevronRight size={14} />}\n </li>\n )}\n </Fragment>\n )\n })}\n </ol>\n </nav>\n )\n }\n)\nBreadcrumb.displayName = 'Breadcrumb'\n\nexport { Breadcrumb }\n"]}
@@ -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 Timeline = forwardRef(
7
+ ({ className, items, active, loading, ...props }, ref) => {
8
+ return /* @__PURE__ */ jsx(
9
+ "div",
10
+ {
11
+ ref,
12
+ className: cn("tollerud-timeline", loading && "animate-pulse", className),
13
+ role: "list",
14
+ "aria-label": "Activity timeline",
15
+ ...props,
16
+ children: items.map((item, i) => {
17
+ const isLast = i === items.length - 1;
18
+ return /* @__PURE__ */ jsxs("div", { className: "tollerud-timeline__item", role: "listitem", children: [
19
+ /* @__PURE__ */ jsx("div", { className: "tollerud-timeline__marker", children: /* @__PURE__ */ jsxs("div", { className: "tollerud-timeline__dot-group", children: [
20
+ item.icon ? /* @__PURE__ */ jsx("span", { className: "tollerud-timeline__icon", children: item.icon }) : /* @__PURE__ */ jsx(
21
+ "span",
22
+ {
23
+ className: cn(
24
+ "tollerud-timeline__dot",
25
+ active && "tollerud-timeline__dot--active",
26
+ item.status === "online" && "bg-tollerud-success shadow-[0_0_6px_rgba(34,197,94,0.5)]",
27
+ item.status === "offline" && "bg-tollerud-error",
28
+ item.status === "warning" && "bg-tollerud-yellow shadow-[0_0_6px_rgba(232,213,0,0.5)]",
29
+ !item.status && "bg-tollerud-noir-500"
30
+ )
31
+ }
32
+ ),
33
+ !isLast && /* @__PURE__ */ jsx("div", { className: "tollerud-timeline__line" })
34
+ ] }) }),
35
+ /* @__PURE__ */ jsxs("div", { className: "tollerud-timeline__content", children: [
36
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-2", children: [
37
+ /* @__PURE__ */ jsx("span", { className: "tollerud-timeline__title", children: item.title }),
38
+ /* @__PURE__ */ jsx("span", { className: "tollerud-timeline__time", children: item.time })
39
+ ] }),
40
+ item.description && /* @__PURE__ */ jsx("p", { className: "tollerud-timeline__description", children: item.description }),
41
+ item.meta && item.meta.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5 mt-1", children: item.meta.map((m) => /* @__PURE__ */ jsx("span", { className: "tollerud-timeline__meta", children: m }, m)) })
42
+ ] })
43
+ ] }, item.id);
44
+ })
45
+ }
46
+ );
47
+ }
48
+ );
49
+ Timeline.displayName = "Timeline";
50
+
51
+ export { Timeline };
52
+ //# sourceMappingURL=chunk-7TOT5ME3.js.map
53
+ //# sourceMappingURL=chunk-7TOT5ME3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/Timeline.tsx"],"names":[],"mappings":";;;;AA6BA,IAAM,QAAA,GAAW,UAAA;AAAA,EACf,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,QAAQ,OAAA,EAAS,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACxD,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,OAAA,IAAW,iBAAiB,SAAS,CAAA;AAAA,QACxE,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAW,mBAAA;AAAA,QACV,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM;AACtB,UAAA,MAAM,MAAA,GAAS,CAAA,KAAM,KAAA,CAAM,MAAA,GAAS,CAAA;AAEpC,UAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAkB,SAAA,EAAU,yBAAA,EAA0B,MAAK,UAAA,EAE1D,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,2BAAA,EACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACZ,QAAA,EAAA;AAAA,cAAA,IAAA,CAAK,uBACJ,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yBAAA,EAA2B,QAAA,EAAA,IAAA,CAAK,MAAK,CAAA,mBAErD,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,EAAA;AAAA,oBACT,wBAAA;AAAA,oBACA,MAAA,IAAU,gCAAA;AAAA,oBACV,IAAA,CAAK,WAAW,QAAA,IAAY,0DAAA;AAAA,oBAC5B,IAAA,CAAK,WAAW,SAAA,IAAa,mBAAA;AAAA,oBAC7B,IAAA,CAAK,WAAW,SAAA,IAAa,yDAAA;AAAA,oBAC7B,CAAC,KAAK,MAAA,IAAU;AAAA;AAClB;AAAA,eACF;AAAA,cAED,CAAC,MAAA,oBAAU,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EAA0B;AAAA,aAAA,EACvD,CAAA,EACF,CAAA;AAAA,4BAGA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA4B,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,gCACvD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA2B,eAAK,IAAA,EAAK;AAAA,eAAA,EACvD,CAAA;AAAA,cACC,KAAK,WAAA,oBACJ,GAAA,CAAC,OAAE,SAAA,EAAU,gCAAA,EAAkC,eAAK,WAAA,EAAY,CAAA;AAAA,cAEjE,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,oBAC/B,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA,IAAA,CAAK,KAAK,GAAA,CAAI,CAAC,sBACd,GAAA,CAAC,MAAA,EAAA,EAAa,WAAU,yBAAA,EAA2B,QAAA,EAAA,CAAA,EAAA,EAAxC,CAA0C,CACtD,CAAA,EACH;AAAA,aAAA,EAEJ;AAAA,WAAA,EAAA,EAtCQ,KAAK,EAuCf,CAAA;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-7TOT5ME3.js","sourcesContent":["import { type HTMLAttributes, type ReactNode, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\nimport type { Status } from './StatusDot'\n\nexport interface TimelineItemData {\n id: string\n /** Timestamp label */\n time: string\n /** Title/headline of the event */\n title: string\n /** Description */\n description?: string\n /** Status indicator dot */\n status?: Status\n /** Optional icon to replace dot */\n icon?: ReactNode\n /** Optional metadata badges */\n meta?: string[]\n}\n\nexport interface TimelineProps extends HTMLAttributes<HTMLDivElement> {\n /** Timeline events */\n items: TimelineItemData[]\n /** Whether items are active (show animated dot pulse) */\n active?: boolean\n /** Whether the timeline is loading */\n loading?: boolean\n}\n\nconst Timeline = forwardRef<HTMLDivElement, TimelineProps>(\n ({ className, items, active, loading, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('tollerud-timeline', loading && 'animate-pulse', className)}\n role=\"list\"\n aria-label=\"Activity timeline\"\n {...props}\n >\n {items.map((item, i) => {\n const isLast = i === items.length - 1\n\n return (\n <div key={item.id} className=\"tollerud-timeline__item\" role=\"listitem\">\n {/* Dot column */}\n <div className=\"tollerud-timeline__marker\">\n <div className=\"tollerud-timeline__dot-group\">\n {item.icon ? (\n <span className=\"tollerud-timeline__icon\">{item.icon}</span>\n ) : (\n <span\n className={cn(\n 'tollerud-timeline__dot',\n active && 'tollerud-timeline__dot--active',\n item.status === 'online' && 'bg-tollerud-success shadow-[0_0_6px_rgba(34,197,94,0.5)]',\n item.status === 'offline' && 'bg-tollerud-error',\n item.status === 'warning' && 'bg-tollerud-yellow shadow-[0_0_6px_rgba(232,213,0,0.5)]',\n !item.status && 'bg-tollerud-noir-500'\n )}\n />\n )}\n {!isLast && <div className=\"tollerud-timeline__line\" />}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"tollerud-timeline__content\">\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"tollerud-timeline__title\">{item.title}</span>\n <span className=\"tollerud-timeline__time\">{item.time}</span>\n </div>\n {item.description && (\n <p className=\"tollerud-timeline__description\">{item.description}</p>\n )}\n {item.meta && item.meta.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {item.meta.map((m) => (\n <span key={m} className=\"tollerud-timeline__meta\">{m}</span>\n ))}\n </div>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )\n }\n)\nTimeline.displayName = 'Timeline'\n\nexport { Timeline }"]}
@@ -0,0 +1,47 @@
1
+ 'use client';
2
+ import { cn } from './chunk-WSQNPRGN.js';
3
+ import { forwardRef } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var meterTones = {
7
+ default: "bg-tollerud-yellow",
8
+ success: "bg-tollerud-success",
9
+ warning: "bg-tollerud-warning",
10
+ error: "bg-tollerud-error"
11
+ };
12
+ var Meter = forwardRef(
13
+ ({ className, value, max = 100, label, showValue, tone = "default", ...props }, ref) => {
14
+ const pct = Math.min(100, Math.max(0, value / max * 100));
15
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex flex-col gap-1.5", className), ...props, children: [
16
+ (label || showValue) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between text-xs", children: [
17
+ label && /* @__PURE__ */ jsx("span", { className: "text-tollerud-text-secondary", children: label }),
18
+ showValue && /* @__PURE__ */ jsxs("span", { className: "text-tollerud-text-muted tabular-nums", children: [
19
+ Math.round(pct),
20
+ "%"
21
+ ] })
22
+ ] }),
23
+ /* @__PURE__ */ jsx(
24
+ "div",
25
+ {
26
+ role: "meter",
27
+ "aria-valuenow": value,
28
+ "aria-valuemin": 0,
29
+ "aria-valuemax": max,
30
+ className: "h-1.5 w-full overflow-hidden rounded-full bg-tollerud-surface-raised",
31
+ children: /* @__PURE__ */ jsx(
32
+ "div",
33
+ {
34
+ className: cn("h-full rounded-full transition-[width] duration-300", meterTones[tone]),
35
+ style: { width: `${pct}%` }
36
+ }
37
+ )
38
+ }
39
+ )
40
+ ] });
41
+ }
42
+ );
43
+ Meter.displayName = "Meter";
44
+
45
+ export { Meter };
46
+ //# sourceMappingURL=chunk-A6L5C3IJ.js.map
47
+ //# sourceMappingURL=chunk-A6L5C3IJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/Meter.tsx"],"names":[],"mappings":";;;;AAGA,IAAM,UAAA,GAAa;AAAA,EACjB,OAAA,EAAS,oBAAA;AAAA,EACT,OAAA,EAAS,qBAAA;AAAA,EACT,OAAA,EAAS,qBAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAcA,IAAM,KAAA,GAAQ,UAAA;AAAA,EACZ,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,GAAA,GAAM,GAAA,EAAK,KAAA,EAAO,SAAA,EAAW,IAAA,GAAO,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AACtF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAI,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAE1D,IAAA,uBACE,IAAA,CAAC,SAAI,GAAA,EAAU,SAAA,EAAW,GAAG,uBAAA,EAAyB,SAAS,CAAA,EAAI,GAAG,KAAA,EAClE,QAAA,EAAA;AAAA,MAAA,CAAA,KAAA,IAAS,SAAA,qBACT,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACZ,QAAA,EAAA;AAAA,QAAA,KAAA,oBAAS,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QAC/D,SAAA,oBAAa,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC;AAAA,OAAA,EAC1F,CAAA;AAAA,sBAEF,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,eAAA,EAAe,KAAA;AAAA,UACf,eAAA,EAAe,CAAA;AAAA,UACf,eAAA,EAAe,GAAA;AAAA,UACf,SAAA,EAAU,sEAAA;AAAA,UAEV,QAAA,kBAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA,CAAG,qDAAA,EAAuD,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,cACrF,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA;AAAI;AAAA;AAC5B;AAAA;AACF,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AACA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-A6L5C3IJ.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nconst meterTones = {\n default: 'bg-tollerud-yellow',\n success: 'bg-tollerud-success',\n warning: 'bg-tollerud-warning',\n error: 'bg-tollerud-error',\n} as const\n\nexport interface MeterProps extends HTMLAttributes<HTMLDivElement> {\n /** Current value */\n value: number\n /** Maximum value (defaults to 100) */\n max?: number\n /** Optional label rendered above the bar */\n label?: React.ReactNode\n /** Show the numeric value/percentage to the right of the label */\n showValue?: boolean\n tone?: keyof typeof meterTones\n}\n\nconst Meter = forwardRef<HTMLDivElement, MeterProps>(\n ({ className, value, max = 100, label, showValue, tone = 'default', ...props }, ref) => {\n const pct = Math.min(100, Math.max(0, (value / max) * 100))\n\n return (\n <div ref={ref} className={cn('flex flex-col gap-1.5', className)} {...props}>\n {(label || showValue) && (\n <div className=\"flex items-center justify-between text-xs\">\n {label && <span className=\"text-tollerud-text-secondary\">{label}</span>}\n {showValue && <span className=\"text-tollerud-text-muted tabular-nums\">{Math.round(pct)}%</span>}\n </div>\n )}\n <div\n role=\"meter\"\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={max}\n className=\"h-1.5 w-full overflow-hidden rounded-full bg-tollerud-surface-raised\"\n >\n <div\n className={cn('h-full rounded-full transition-[width] duration-300', meterTones[tone])}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n )\n }\n)\nMeter.displayName = 'Meter'\n\nexport { Meter }\n"]}
@@ -0,0 +1,42 @@
1
+ 'use client';
2
+ import { cn } from './chunk-WSQNPRGN.js';
3
+ import { forwardRef } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var toneStyles = {
7
+ default: { wrapper: "border-tollerud-border bg-tollerud-surface-raised", icon: "text-tollerud-text-muted" },
8
+ accent: { wrapper: "border-tollerud-yellow/30 bg-tollerud-yellow/5", icon: "text-tollerud-yellow" },
9
+ info: { wrapper: "border-blue-500/30 bg-blue-500/5", icon: "text-blue-400" },
10
+ success: { wrapper: "border-green-500/30 bg-green-500/5", icon: "text-green-400" },
11
+ error: { wrapper: "border-red-500/30 bg-red-500/5", icon: "text-red-400" }
12
+ };
13
+ var Alert = forwardRef(
14
+ ({ className, tone = "default", title, icon, children, ...props }, ref) => {
15
+ const styles = toneStyles[tone];
16
+ return /* @__PURE__ */ jsxs(
17
+ "div",
18
+ {
19
+ ref,
20
+ role: "alert",
21
+ className: cn(
22
+ "flex gap-3 rounded-md border p-4",
23
+ styles.wrapper,
24
+ className
25
+ ),
26
+ ...props,
27
+ children: [
28
+ icon && /* @__PURE__ */ jsx("span", { className: cn("mt-0.5 flex-shrink-0 w-[18px] h-[18px]", styles.icon), children: icon }),
29
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
30
+ title && /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold text-tollerud-text-primary leading-snug", children: title }),
31
+ children && /* @__PURE__ */ jsx("p", { className: cn("text-sm text-tollerud-text-secondary leading-relaxed", title && "mt-1"), children })
32
+ ] })
33
+ ]
34
+ }
35
+ );
36
+ }
37
+ );
38
+ Alert.displayName = "Alert";
39
+
40
+ export { Alert };
41
+ //# sourceMappingURL=chunk-ANW6J6PV.js.map
42
+ //# sourceMappingURL=chunk-ANW6J6PV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/Alert.tsx"],"names":[],"mappings":";;;;AAGA,IAAM,UAAA,GAAa;AAAA,EACjB,OAAA,EAAS,EAAE,OAAA,EAAS,mDAAA,EAAqD,MAAM,0BAAA,EAA2B;AAAA,EAC1G,MAAA,EAAS,EAAE,OAAA,EAAS,gDAAA,EAAqD,MAAM,sBAAA,EAAuB;AAAA,EACtG,IAAA,EAAS,EAAE,OAAA,EAAS,kCAAA,EAAqD,MAAM,eAAA,EAAgB;AAAA,EAC/F,OAAA,EAAS,EAAE,OAAA,EAAS,oCAAA,EAAqD,MAAM,gBAAA,EAAiB;AAAA,EAChG,KAAA,EAAS,EAAE,OAAA,EAAS,gCAAA,EAAqD,MAAM,cAAA;AACjF,CAAA;AAQA,IAAM,KAAA,GAAQ,UAAA;AAAA,EACZ,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,SAAA,EAAW,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACzE,IAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,OAAA;AAAA,QACL,SAAA,EAAW,EAAA;AAAA,UACT,kCAAA;AAAA,UACA,MAAA,CAAO,OAAA;AAAA,UACP;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,IAAA,oBACC,GAAA,CAAC,UAAK,SAAA,EAAW,EAAA,CAAG,0CAA0C,MAAA,CAAO,IAAI,GACtE,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,0BAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACZ,QAAA,EAAA;AAAA,YAAA,KAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+DAAA,EACV,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,YAED,QAAA,wBACE,GAAA,EAAA,EAAE,SAAA,EAAW,GAAG,sDAAA,EAAwD,KAAA,IAAS,MAAM,CAAA,EACrF,QAAA,EACH;AAAA,WAAA,EAEJ;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-ANW6J6PV.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nconst toneStyles = {\n default: { wrapper: 'border-tollerud-border bg-tollerud-surface-raised', icon: 'text-tollerud-text-muted' },\n accent: { wrapper: 'border-tollerud-yellow/30 bg-tollerud-yellow/5', icon: 'text-tollerud-yellow' },\n info: { wrapper: 'border-blue-500/30 bg-blue-500/5', icon: 'text-blue-400' },\n success: { wrapper: 'border-green-500/30 bg-green-500/5', icon: 'text-green-400' },\n error: { wrapper: 'border-red-500/30 bg-red-500/5', icon: 'text-red-400' },\n} as const\n\nexport interface AlertProps extends HTMLAttributes<HTMLDivElement> {\n tone?: keyof typeof toneStyles\n title?: string\n icon?: React.ReactNode\n}\n\nconst Alert = forwardRef<HTMLDivElement, AlertProps>(\n ({ className, tone = 'default', title, icon, children, ...props }, ref) => {\n const styles = toneStyles[tone]\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(\n 'flex gap-3 rounded-md border p-4',\n styles.wrapper,\n className\n )}\n {...props}\n >\n {icon && (\n <span className={cn('mt-0.5 flex-shrink-0 w-[18px] h-[18px]', styles.icon)}>\n {icon}\n </span>\n )}\n <div className=\"min-w-0\">\n {title && (\n <p className=\"text-sm font-semibold text-tollerud-text-primary leading-snug\">\n {title}\n </p>\n )}\n {children && (\n <p className={cn('text-sm text-tollerud-text-secondary leading-relaxed', title && 'mt-1')}>\n {children}\n </p>\n )}\n </div>\n </div>\n )\n }\n)\nAlert.displayName = 'Alert'\n\nexport { Alert }\n"]}
@@ -0,0 +1,80 @@
1
+ 'use client';
2
+ import { cn } from './chunk-WSQNPRGN.js';
3
+ import { forwardRef } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var stateStyles = {
7
+ pending: "border-tollerud-yellow/30 hover:border-tollerud-yellow/50",
8
+ approved: "border-tollerud-success/40 opacity-70",
9
+ rejected: "border-tollerud-error/40 opacity-70"
10
+ };
11
+ var stateLabels = {
12
+ pending: { text: "Awaiting approval", cls: "text-tollerud-yellow" },
13
+ approved: { text: "Approved", cls: "text-tollerud-success" },
14
+ rejected: { text: "Rejected", cls: "text-tollerud-error" }
15
+ };
16
+ var ApprovalCard = forwardRef(
17
+ ({ className, action, description, source, state = "pending", timestamp, onApprove, onReject, disabled, loading, ...props }, ref) => {
18
+ const label = stateLabels[state];
19
+ return /* @__PURE__ */ jsxs(
20
+ "div",
21
+ {
22
+ ref,
23
+ className: cn(
24
+ "rounded-lg border bg-tollerud-surface-raised p-4",
25
+ "transition-all duration-[150ms]",
26
+ stateStyles[state],
27
+ loading && "animate-pulse",
28
+ className
29
+ ),
30
+ ...props,
31
+ children: [
32
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-1.5", children: [
33
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-tollerud-foreground truncate", children: action }),
34
+ /* @__PURE__ */ jsx("span", { className: cn("text-[11px] font-medium whitespace-nowrap ml-2", label.cls), children: label.text })
35
+ ] }),
36
+ description && /* @__PURE__ */ jsx("p", { className: "text-xs text-tollerud-text-secondary mb-1.5 leading-relaxed", children: description }),
37
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-x-4 gap-y-0.5 text-[11px] text-tollerud-text-muted mb-3", children: [
38
+ source && /* @__PURE__ */ jsx("span", { className: "font-mono", children: source }),
39
+ timestamp && /* @__PURE__ */ jsx("span", { children: timestamp })
40
+ ] }),
41
+ state === "pending" && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
42
+ /* @__PURE__ */ jsx(
43
+ "button",
44
+ {
45
+ type: "button",
46
+ disabled,
47
+ onClick: onApprove,
48
+ className: cn(
49
+ "flex-1 rounded-md px-3 py-1.5 text-xs font-semibold transition-all",
50
+ "bg-tollerud-success text-tollerud-text-inverse",
51
+ "hover:brightness-110 disabled:opacity-40 disabled:cursor-not-allowed"
52
+ ),
53
+ children: "Approve"
54
+ }
55
+ ),
56
+ /* @__PURE__ */ jsx(
57
+ "button",
58
+ {
59
+ type: "button",
60
+ disabled,
61
+ onClick: onReject,
62
+ className: cn(
63
+ "flex-1 rounded-md px-3 py-1.5 text-xs font-semibold transition-all",
64
+ "bg-tollerud-error text-white",
65
+ "hover:brightness-110 disabled:opacity-40 disabled:cursor-not-allowed"
66
+ ),
67
+ children: "Reject"
68
+ }
69
+ )
70
+ ] })
71
+ ]
72
+ }
73
+ );
74
+ }
75
+ );
76
+ ApprovalCard.displayName = "ApprovalCard";
77
+
78
+ export { ApprovalCard };
79
+ //# sourceMappingURL=chunk-APFFKNPS.js.map
80
+ //# sourceMappingURL=chunk-APFFKNPS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/ApprovalCard.tsx"],"names":[],"mappings":";;;;AA0BA,IAAM,WAAA,GAA6C;AAAA,EACjD,OAAA,EAAU,2DAAA;AAAA,EACV,QAAA,EAAU,uCAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,WAAA,GAAoE;AAAA,EACxE,OAAA,EAAU,EAAE,IAAA,EAAM,mBAAA,EAAqB,KAAK,sBAAA,EAAuB;AAAA,EACnE,QAAA,EAAU,EAAE,IAAA,EAAM,UAAA,EAAY,KAAK,uBAAA,EAAwB;AAAA,EAC3D,QAAA,EAAU,EAAE,IAAA,EAAM,UAAA,EAAY,KAAK,qBAAA;AACrC,CAAA;AAEA,IAAM,YAAA,GAAe,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,MAAA,EAAQ,WAAA,EAAa,QAAQ,KAAA,GAAQ,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,UAAU,QAAA,EAAU,OAAA,EAAS,GAAG,KAAA,IAAS,GAAA,KAAQ;AACnI,IAAA,MAAM,KAAA,GAAQ,YAAY,KAAK,CAAA;AAE/B,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,kDAAA;AAAA,UACA,iCAAA;AAAA,UACA,YAAY,KAAK,CAAA;AAAA,UACjB,OAAA,IAAW,eAAA;AAAA,UACX;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0CAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAA,EAA2D,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,4BAClF,GAAA,CAAC,UAAK,SAAA,EAAW,EAAA,CAAG,kDAAkD,KAAA,CAAM,GAAG,CAAA,EAAI,QAAA,EAAA,KAAA,CAAM,IAAA,EAAK;AAAA,WAAA,EAChG,CAAA;AAAA,UACC,WAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+DAA+D,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,0BAE1F,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EACZ,QAAA,EAAA;AAAA,YAAA,MAAA,oBAAU,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAa,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,YAC9C,SAAA,oBAAa,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,SAAA,EAAU;AAAA,WAAA,EACjC,CAAA;AAAA,UACC,KAAA,KAAU,SAAA,oBACT,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA;AAAA,gBACA,OAAA,EAAS,SAAA;AAAA,gBACT,SAAA,EAAW,EAAA;AAAA,kBACT,oEAAA;AAAA,kBACA,gDAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BACA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA;AAAA,gBACA,OAAA,EAAS,QAAA;AAAA,gBACT,SAAA,EAAW,EAAA;AAAA,kBACT,oEAAA;AAAA,kBACA,8BAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AACA,YAAA,CAAa,WAAA,GAAc,cAAA","file":"chunk-APFFKNPS.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport type ApprovalState = 'pending' | 'approved' | 'rejected'\n\nexport interface ApprovalCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Action being approved */\n action: string\n /** Description of what will happen */\n description?: string\n /** Source (e.g. 'Emma → backup.sh') */\n source?: string\n /** Current approval state */\n state?: ApprovalState\n /** Timestamp of the request */\n timestamp?: string\n /** Called when user approves */\n onApprove?: () => void\n /** Called when user rejects */\n onReject?: () => void\n /** Whether actions are disabled */\n disabled?: boolean\n /** Whether the card is loading */\n loading?: boolean\n}\n\nconst stateStyles: Record<ApprovalState, string> = {\n pending: 'border-tollerud-yellow/30 hover:border-tollerud-yellow/50',\n approved: 'border-tollerud-success/40 opacity-70',\n rejected: 'border-tollerud-error/40 opacity-70',\n}\n\nconst stateLabels: Record<ApprovalState, { text: string; cls: string }> = {\n pending: { text: 'Awaiting approval', cls: 'text-tollerud-yellow' },\n approved: { text: 'Approved', cls: 'text-tollerud-success' },\n rejected: { text: 'Rejected', cls: 'text-tollerud-error' },\n}\n\nconst ApprovalCard = forwardRef<HTMLDivElement, ApprovalCardProps>(\n ({ className, action, description, source, state = 'pending', timestamp, onApprove, onReject, disabled, loading, ...props }, ref) => {\n const label = stateLabels[state]\n\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-lg border bg-tollerud-surface-raised p-4',\n 'transition-all duration-[150ms]',\n stateStyles[state],\n loading && 'animate-pulse',\n className\n )}\n {...props}\n >\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-sm font-semibold text-tollerud-foreground truncate\">{action}</span>\n <span className={cn('text-[11px] font-medium whitespace-nowrap ml-2', label.cls)}>{label.text}</span>\n </div>\n {description && (\n <p className=\"text-xs text-tollerud-text-secondary mb-1.5 leading-relaxed\">{description}</p>\n )}\n <div className=\"flex flex-wrap gap-x-4 gap-y-0.5 text-[11px] text-tollerud-text-muted mb-3\">\n {source && <span className=\"font-mono\">{source}</span>}\n {timestamp && <span>{timestamp}</span>}\n </div>\n {state === 'pending' && (\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onApprove}\n className={cn(\n 'flex-1 rounded-md px-3 py-1.5 text-xs font-semibold transition-all',\n 'bg-tollerud-success text-tollerud-text-inverse',\n 'hover:brightness-110 disabled:opacity-40 disabled:cursor-not-allowed'\n )}\n >\n Approve\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onReject}\n className={cn(\n 'flex-1 rounded-md px-3 py-1.5 text-xs font-semibold transition-all',\n 'bg-tollerud-error text-white',\n 'hover:brightness-110 disabled:opacity-40 disabled:cursor-not-allowed'\n )}\n >\n Reject\n </button>\n </div>\n )}\n </div>\n )\n }\n)\nApprovalCard.displayName = 'ApprovalCard'\n\nexport { ApprovalCard }\n"]}
@@ -0,0 +1,85 @@
1
+ 'use client';
2
+ import { IncidentCard } from './chunk-EN4OJCEF.js';
3
+ import { cn } from './chunk-WSQNPRGN.js';
4
+ import { forwardRef } from 'react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ var AlertInbox = forwardRef(
8
+ ({ className, alerts, filterSeverity = "", onAcknowledge, loading, emptyMessage = "All clear \u2014 no incidents", ...props }, ref) => {
9
+ const filtered = filterSeverity ? alerts.filter((a) => a.severity === filterSeverity) : alerts;
10
+ const counts = {
11
+ total: alerts.length,
12
+ unacknowledged: alerts.filter((a) => !a.acknowledged).length,
13
+ critical: alerts.filter((a) => a.severity === "critical" && !a.acknowledged).length
14
+ };
15
+ return /* @__PURE__ */ jsxs(
16
+ "div",
17
+ {
18
+ ref,
19
+ className: cn(
20
+ "rounded-lg border border-tollerud-border bg-tollerud-surface-raised overflow-hidden",
21
+ loading && "animate-pulse",
22
+ className
23
+ ),
24
+ ...props,
25
+ children: [
26
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b border-tollerud-border", children: [
27
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
28
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-tollerud-foreground", children: "Alerts" }),
29
+ counts.unacknowledged > 0 && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-[11px] text-tollerud-error font-medium", children: [
30
+ /* @__PURE__ */ jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-tollerud-error animate-pulse" }),
31
+ counts.unacknowledged,
32
+ " unread"
33
+ ] }),
34
+ counts.critical > 0 && /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-tollerud-error font-bold", children: [
35
+ counts.critical,
36
+ " critical"
37
+ ] })
38
+ ] }),
39
+ /* @__PURE__ */ jsxs("span", { className: "text-xs text-tollerud-text-muted", children: [
40
+ filtered.length,
41
+ " of ",
42
+ alerts.length
43
+ ] })
44
+ ] }),
45
+ /* @__PURE__ */ jsxs("div", { className: "divide-y divide-tollerud-border/50 max-h-[480px] overflow-y-auto", children: [
46
+ filtered.length === 0 && /* @__PURE__ */ jsx("div", { className: "px-4 py-8 text-xs text-center text-tollerud-text-muted", children: emptyMessage }),
47
+ filtered.map((alert) => /* @__PURE__ */ jsxs("div", { className: "relative group", children: [
48
+ /* @__PURE__ */ jsx(
49
+ IncidentCard,
50
+ {
51
+ title: alert.title,
52
+ severity: alert.severity,
53
+ timestamp: alert.timestamp,
54
+ description: alert.description,
55
+ service: alert.service,
56
+ acknowledged: alert.acknowledged,
57
+ className: "border-0 rounded-none bg-transparent hover:bg-tollerud-noir-800/30"
58
+ }
59
+ ),
60
+ alert.acknowledged && /* @__PURE__ */ jsx("span", { className: "absolute bottom-2 right-3 text-[10px] font-medium text-tollerud-text-muted/50", children: "Acknowledged" }),
61
+ !alert.acknowledged && onAcknowledge && /* @__PURE__ */ jsx(
62
+ "button",
63
+ {
64
+ type: "button",
65
+ onClick: () => onAcknowledge(alert.id),
66
+ className: cn(
67
+ "absolute bottom-2 right-3 text-[10px] font-medium px-2 py-0.5 rounded",
68
+ "text-tollerud-yellow/70 hover:text-tollerud-yellow hover:bg-tollerud-yellow/10",
69
+ "opacity-0 group-hover:opacity-100 transition-opacity duration-150"
70
+ ),
71
+ children: "Acknowledge"
72
+ }
73
+ )
74
+ ] }, alert.id))
75
+ ] })
76
+ ]
77
+ }
78
+ );
79
+ }
80
+ );
81
+ AlertInbox.displayName = "AlertInbox";
82
+
83
+ export { AlertInbox };
84
+ //# sourceMappingURL=chunk-AZADSX4Z.js.map
85
+ //# sourceMappingURL=chunk-AZADSX4Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/AlertInbox.tsx"],"names":[],"mappings":";;;;;AAwBA,IAAM,UAAA,GAAa,UAAA;AAAA,EACjB,CAAC,EAAE,SAAA,EAAW,MAAA,EAAQ,cAAA,GAAiB,EAAA,EAAI,aAAA,EAAe,OAAA,EAAS,YAAA,GAAe,+BAAA,EAA4B,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChI,IAAA,MAAM,QAAA,GAAW,iBACb,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,cAAc,CAAA,GAClD,MAAA;AAEJ,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,OAAO,MAAA,CAAO,MAAA;AAAA,MACd,cAAA,EAAgB,OAAO,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,YAAY,CAAA,CAAE,MAAA;AAAA,MACtD,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,UAAA,IAAc,CAAC,CAAA,CAAE,YAAY,CAAA,CAAE;AAAA,KAC/E;AAEA,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,qFAAA;AAAA,UACA,OAAA,IAAW,eAAA;AAAA,UACX;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAGJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6EAAA,EACb,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EAAiD,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,cACtE,OAAO,cAAA,GAAiB,CAAA,oBACvB,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4EAAA,EACd,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0DAAA,EAA2D,CAAA;AAAA,gBAC1E,MAAA,CAAO,cAAA;AAAA,gBAAe;AAAA,eAAA,EACzB,CAAA;AAAA,cAED,OAAO,QAAA,GAAW,CAAA,oBACjB,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,2CAAA,EAA6C,QAAA,EAAA;AAAA,gBAAA,MAAA,CAAO,QAAA;AAAA,gBAAS;AAAA,eAAA,EAAS;AAAA,aAAA,EAE1F,CAAA;AAAA,4BACA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,MAAA;AAAA,cAAO,MAAA;AAAA,cAAK,MAAA,CAAO;AAAA,aAAA,EAAO;AAAA,WAAA,EACzF,CAAA;AAAA,0BAGA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACZ,QAAA,EAAA;AAAA,YAAA,QAAA,CAAS,WAAW,CAAA,oBACnB,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAA0D,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,YAEvF,SAAS,GAAA,CAAI,CAAC,0BACb,IAAA,CAAC,KAAA,EAAA,EAAmB,WAAU,gBAAA,EAC5B,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBACC,OAAO,KAAA,CAAM,KAAA;AAAA,kBACb,UAAU,KAAA,CAAM,QAAA;AAAA,kBAChB,WAAW,KAAA,CAAM,SAAA;AAAA,kBACjB,aAAa,KAAA,CAAM,WAAA;AAAA,kBACnB,SAAS,KAAA,CAAM,OAAA;AAAA,kBACf,cAAc,KAAA,CAAM,YAAA;AAAA,kBACpB,SAAA,EAAU;AAAA;AAAA,eACZ;AAAA,cAEC,MAAM,YAAA,oBACL,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iFAAgF,QAAA,EAAA,cAAA,EAEhG,CAAA;AAAA,cAGD,CAAC,KAAA,CAAM,YAAA,IAAgB,aAAA,oBACtB,GAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,MAAM,aAAA,CAAc,KAAA,CAAM,EAAE,CAAA;AAAA,kBACrC,SAAA,EAAW,EAAA;AAAA,oBACT,uEAAA;AAAA,oBACA,gFAAA;AAAA,oBACA;AAAA,mBACF;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA;AAED,aAAA,EAAA,EA5BM,KAAA,CAAM,EA8BhB,CACD;AAAA,WAAA,EACH;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-AZADSX4Z.js","sourcesContent":["'use client'\n\nimport { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\nimport { IncidentCard, type IncidentSeverity } from './IncidentCard'\n\nexport interface AlertItem {\n id: string\n title: string\n severity: IncidentSeverity\n timestamp: string\n description?: string\n service?: string\n acknowledged?: boolean\n}\n\nexport interface AlertInboxProps extends HTMLAttributes<HTMLDivElement> {\n alerts: AlertItem[]\n filterSeverity?: IncidentSeverity | ''\n onAcknowledge?: (id: string) => void\n loading?: boolean\n emptyMessage?: string\n}\n\nconst AlertInbox = forwardRef<HTMLDivElement, AlertInboxProps>(\n ({ className, alerts, filterSeverity = '', onAcknowledge, loading, emptyMessage = 'All clear — no incidents', ...props }, ref) => {\n const filtered = filterSeverity\n ? alerts.filter((a) => a.severity === filterSeverity)\n : alerts\n\n const counts = {\n total: alerts.length,\n unacknowledged: alerts.filter((a) => !a.acknowledged).length,\n critical: alerts.filter((a) => a.severity === 'critical' && !a.acknowledged).length,\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-lg border border-tollerud-border bg-tollerud-surface-raised overflow-hidden',\n loading && 'animate-pulse',\n className\n )}\n {...props}\n >\n {/* Header bar */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-tollerud-border\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-tollerud-foreground\">Alerts</span>\n {counts.unacknowledged > 0 && (\n <span className=\"inline-flex items-center gap-1 text-[11px] text-tollerud-error font-medium\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-tollerud-error animate-pulse\" />\n {counts.unacknowledged} unread\n </span>\n )}\n {counts.critical > 0 && (\n <span className=\"text-[11px] text-tollerud-error font-bold\">{counts.critical} critical</span>\n )}\n </div>\n <span className=\"text-xs text-tollerud-text-muted\">{filtered.length} of {alerts.length}</span>\n </div>\n\n {/* Alert list */}\n <div className=\"divide-y divide-tollerud-border/50 max-h-[480px] overflow-y-auto\">\n {filtered.length === 0 && (\n <div className=\"px-4 py-8 text-xs text-center text-tollerud-text-muted\">{emptyMessage}</div>\n )}\n {filtered.map((alert) => (\n <div key={alert.id} className=\"relative group\">\n <IncidentCard\n title={alert.title}\n severity={alert.severity}\n timestamp={alert.timestamp}\n description={alert.description}\n service={alert.service}\n acknowledged={alert.acknowledged}\n className=\"border-0 rounded-none bg-transparent hover:bg-tollerud-noir-800/30\"\n />\n {/* Acknowledged indicator */}\n {alert.acknowledged && (\n <span className=\"absolute bottom-2 right-3 text-[10px] font-medium text-tollerud-text-muted/50\">\n Acknowledged\n </span>\n )}\n {/* Acknowledge button */}\n {!alert.acknowledged && onAcknowledge && (\n <button\n type=\"button\"\n onClick={() => onAcknowledge(alert.id)}\n className={cn(\n 'absolute bottom-2 right-3 text-[10px] font-medium px-2 py-0.5 rounded',\n 'text-tollerud-yellow/70 hover:text-tollerud-yellow hover:bg-tollerud-yellow/10',\n 'opacity-0 group-hover:opacity-100 transition-opacity duration-150'\n )}\n >\n Acknowledge\n </button>\n )}\n </div>\n ))}\n </div>\n </div>\n )\n }\n)\nAlertInbox.displayName = 'AlertInbox'\n\nexport { AlertInbox }"]}
@@ -0,0 +1,36 @@
1
+ 'use client';
2
+ import { cn } from './chunk-WSQNPRGN.js';
3
+ import { forwardRef } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var Input = forwardRef(
7
+ ({ className, label, error, id, ...props }, ref) => {
8
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
9
+ label && /* @__PURE__ */ jsx("label", { htmlFor: id, className: "text-xs font-medium text-tollerud-text-muted", children: label }),
10
+ /* @__PURE__ */ jsx(
11
+ "input",
12
+ {
13
+ ref,
14
+ id,
15
+ className: cn(
16
+ "font-sans text-base px-3 py-2 rounded",
17
+ "bg-tollerud-surface-raised border",
18
+ "text-tollerud-text-primary",
19
+ "placeholder:text-tollerud-text-muted",
20
+ "transition-[border-color] duration-[150ms]",
21
+ "focus:outline-none focus:border-tollerud-yellow focus:shadow-[0_0_0_1px_#E8D500]",
22
+ error ? "border-tollerud-error" : "border-tollerud-border",
23
+ className
24
+ ),
25
+ ...props
26
+ }
27
+ ),
28
+ error && /* @__PURE__ */ jsx("p", { className: "text-xs text-tollerud-error mt-0.5", children: error })
29
+ ] });
30
+ }
31
+ );
32
+ Input.displayName = "Input";
33
+
34
+ export { Input };
35
+ //# sourceMappingURL=chunk-BPCH5LJ3.js.map
36
+ //# sourceMappingURL=chunk-BPCH5LJ3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/Input.tsx"],"names":[],"mappings":";;;;AAQA,IAAM,KAAA,GAAQ,UAAA;AAAA,EACZ,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,OAAO,EAAA,EAAI,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAClD,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,wBACE,OAAA,EAAA,EAAM,OAAA,EAAS,EAAA,EAAI,SAAA,EAAU,gDAC3B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBAEF,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,EAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,uCAAA;AAAA,YACA,mCAAA;AAAA,YACA,4BAAA;AAAA,YACA,sCAAA;AAAA,YACA,4CAAA;AAAA,YACA,kFAAA;AAAA,YACA,QAAQ,uBAAA,GAA0B,wBAAA;AAAA,YAClC;AAAA,WACF;AAAA,UACC,GAAG;AAAA;AAAA,OACN;AAAA,MACC,KAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAE7D,CAAA;AAAA,EAEJ;AACF;AACA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-BPCH5LJ3.js","sourcesContent":["import { type InputHTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n label?: string\n error?: string\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, label, error, id, ...props }, ref) => {\n return (\n <div className=\"flex flex-col gap-1\">\n {label && (\n <label htmlFor={id} className=\"text-xs font-medium text-tollerud-text-muted\">\n {label}\n </label>\n )}\n <input\n ref={ref}\n id={id}\n className={cn(\n 'font-sans text-base px-3 py-2 rounded',\n 'bg-tollerud-surface-raised border',\n 'text-tollerud-text-primary',\n 'placeholder:text-tollerud-text-muted',\n 'transition-[border-color] duration-[150ms]',\n 'focus:outline-none focus:border-tollerud-yellow focus:shadow-[0_0_0_1px_#E8D500]',\n error ? 'border-tollerud-error' : 'border-tollerud-border',\n className\n )}\n {...props}\n />\n {error && (\n <p className=\"text-xs text-tollerud-error mt-0.5\">{error}</p>\n )}\n </div>\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n"]}