@tollerud/ui 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +35 -0
  3. package/SKILL.md +5 -4
  4. package/dist/avatar.d.ts +3 -2
  5. package/dist/avatar.js +1 -1
  6. package/dist/bento-dashboard.js +6 -1
  7. package/dist/button.d.ts +1 -1
  8. package/dist/button.js +1 -1
  9. package/dist/{chunk-7TOT5ME3.js → chunk-3LTW224O.js} +6 -6
  10. package/dist/chunk-3LTW224O.js.map +1 -0
  11. package/dist/{chunk-RWJELAS6.js → chunk-ADE22JSR.js} +12 -4
  12. package/dist/chunk-ADE22JSR.js.map +1 -0
  13. package/dist/chunk-AQT3FZRQ.js +23 -0
  14. package/dist/chunk-AQT3FZRQ.js.map +1 -0
  15. package/dist/{chunk-VTRUUT5K.js → chunk-IUPVQWO5.js} +4 -4
  16. package/dist/chunk-IUPVQWO5.js.map +1 -0
  17. package/dist/{chunk-ISHZ6ZPJ.js → chunk-JFOW2DI5.js} +17 -5
  18. package/dist/chunk-JFOW2DI5.js.map +1 -0
  19. package/dist/{chunk-OONIUDST.js → chunk-OLHMMFQ7.js} +3 -8
  20. package/dist/chunk-OLHMMFQ7.js.map +1 -0
  21. package/dist/chunk-ONMTHBZ4.js +54 -0
  22. package/dist/chunk-ONMTHBZ4.js.map +1 -0
  23. package/dist/{chunk-XR5QBVEV.js → chunk-OVSIOZHJ.js} +3 -3
  24. package/dist/{chunk-XR5QBVEV.js.map → chunk-OVSIOZHJ.js.map} +1 -1
  25. package/dist/{chunk-V3P5QLLX.js → chunk-Q54CVE3W.js} +3 -3
  26. package/dist/{chunk-V3P5QLLX.js.map → chunk-Q54CVE3W.js.map} +1 -1
  27. package/dist/chunk-QEIEWGHA.js +62 -0
  28. package/dist/chunk-QEIEWGHA.js.map +1 -0
  29. package/dist/{chunk-CBQ63EBL.js → chunk-QQHBEACI.js} +9 -6
  30. package/dist/chunk-QQHBEACI.js.map +1 -0
  31. package/dist/chunk-T3UQ7G4T.js +58 -0
  32. package/dist/chunk-T3UQ7G4T.js.map +1 -0
  33. package/dist/{chunk-DGCRHVWW.js → chunk-VFS3V3VY.js} +12 -5
  34. package/dist/chunk-VFS3V3VY.js.map +1 -0
  35. package/dist/chunk-VOARBYVQ.js +44 -0
  36. package/dist/chunk-VOARBYVQ.js.map +1 -0
  37. package/dist/{chunk-3TGMGBKM.js → chunk-YPP7QHYT.js} +5 -5
  38. package/dist/{chunk-3TGMGBKM.js.map → chunk-YPP7QHYT.js.map} +1 -1
  39. package/dist/{chunk-O57QMLNI.js → chunk-YTU7BRDW.js} +16 -12
  40. package/dist/chunk-YTU7BRDW.js.map +1 -0
  41. package/dist/{chunk-DFM7UUKB.js → chunk-ZTFOR3AN.js} +4 -4
  42. package/dist/{chunk-DFM7UUKB.js.map → chunk-ZTFOR3AN.js.map} +1 -1
  43. package/dist/cta-band.js +1 -1
  44. package/dist/data-table.js +3 -3
  45. package/dist/date-picker.js +1 -1
  46. package/dist/footer.js +2 -1
  47. package/dist/form-row.d.ts +4 -0
  48. package/dist/form-row.js +1 -1
  49. package/dist/hero-block.js +3 -3
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.js +22 -21
  52. package/dist/monogram.d.ts +20 -0
  53. package/dist/monogram.js +5 -0
  54. package/dist/monogram.js.map +1 -0
  55. package/dist/noir-glow-background.d.ts +7 -1
  56. package/dist/noir-glow-background.js +1 -1
  57. package/dist/pill.d.ts +5 -2
  58. package/dist/pill.js +1 -1
  59. package/dist/pricing-card.js +2 -2
  60. package/dist/skeleton.d.ts +10 -2
  61. package/dist/skeleton.js +1 -1
  62. package/dist/slider.js +1 -1
  63. package/dist/switch.js +1 -1
  64. package/dist/timeline.js +1 -1
  65. package/globals-layers.css +84 -0
  66. package/package.json +5 -3
  67. package/registry.json +17 -1
  68. package/tokens.css +20 -0
  69. package/tollerud-avatar-full.png +0 -0
  70. package/dist/chunk-7TOT5ME3.js.map +0 -1
  71. package/dist/chunk-CBQ63EBL.js.map +0 -1
  72. package/dist/chunk-DGCRHVWW.js.map +0 -1
  73. package/dist/chunk-FGXOV2QH.js +0 -23
  74. package/dist/chunk-FGXOV2QH.js.map +0 -1
  75. package/dist/chunk-HYQGOC2E.js +0 -79
  76. package/dist/chunk-HYQGOC2E.js.map +0 -1
  77. package/dist/chunk-ISHZ6ZPJ.js.map +0 -1
  78. package/dist/chunk-O57QMLNI.js.map +0 -1
  79. package/dist/chunk-OONIUDST.js.map +0 -1
  80. package/dist/chunk-PLF3BBQI.js +0 -139
  81. package/dist/chunk-PLF3BBQI.js.map +0 -1
  82. package/dist/chunk-Q74VRQEX.js +0 -26
  83. package/dist/chunk-Q74VRQEX.js.map +0 -1
  84. package/dist/chunk-RWJELAS6.js.map +0 -1
  85. package/dist/chunk-VTRUUT5K.js.map +0 -1
  86. /package/{tia-full-figure.svg → tollerud-avatar-full.svg} +0 -0
@@ -1,23 +0,0 @@
1
- 'use client';
2
- import { cn } from './chunk-WSQNPRGN.js';
3
- import { jsx } from 'react/jsx-runtime';
4
-
5
- function Skeleton({
6
- className,
7
- ...props
8
- }) {
9
- return /* @__PURE__ */ jsx(
10
- "div",
11
- {
12
- className: cn(
13
- "animate-pulse rounded-md bg-tollerud-noir-800",
14
- className
15
- ),
16
- ...props
17
- }
18
- );
19
- }
20
-
21
- export { Skeleton };
22
- //# sourceMappingURL=chunk-FGXOV2QH.js.map
23
- //# sourceMappingURL=chunk-FGXOV2QH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/Skeleton.tsx"],"names":[],"mappings":";;;AAEA,SAAS,QAAA,CAAS;AAAA,EAChB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyC;AACvC,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,+CAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-FGXOV2QH.js","sourcesContent":["import { cn } from '@/lib/utils'\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n 'animate-pulse rounded-md bg-tollerud-noir-800',\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Skeleton }"]}
@@ -1,79 +0,0 @@
1
- 'use client';
2
- import { cn } from './chunk-WSQNPRGN.js';
3
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
-
5
- var defaultLabels = {
6
- tollerudProject: "A Tollerud Project",
7
- allRightsReserved: "All rights reserved."
8
- };
9
- var MONOGRAM_PATH = "M82.4839273,140.272626 L95.1738252,140.272626 L95.1738252,143 L34.8114657,143 L34.8114657,140.272626 L47.5013636,140.272626 L47.5013636,28.2924381 C40.1277806,26.4177752 32.9252955,25.2241422 26.4088393,25.2241422 C12.1757856,25.2241422 4.11617359,34.5982703 4.11617359,39.8821508 C4.11617359,40.9049161 4.63028596,41.5867596 5.65932936,41.5867596 C7.20248513,41.5867596 7.37440169,40.3931266 8.06043062,38.8593855 C10.4615319,33.575505 15.6059302,31.5307881 20.4073141,31.5307881 C29.152955,31.5307881 35.1552988,38.5184637 35.1552988,47.2107482 C35.1552988,56.2447681 28.8107592,62.8907084 18.0070315,62.8907084 C7.5454996,62.891522 0,53.6882617 0,43.8023442 C0,30.8497582 11.3178401,21.986606 26.5799372,21.986606 C51.1026062,21.986606 84.1989996,39.2011209 104.948509,39.2011209 C118.495534,39.2011209 126.384048,31.7016558 126.384048,19.4300996 C126.384048,10.3968933 118.667451,4.60203698 115.580321,4.60203698 C114.552096,4.60203698 113.69415,5.1130128 113.69415,6.13577809 C113.69415,7.49946515 114.552096,7.6695192 115.409223,8.01044097 C115.752237,8.18049502 122.268693,10.5669474 122.268693,19.2592319 C122.268693,28.2924381 115.238125,34.0872945 107.177694,34.0872945 C97.7460244,34.0872945 91.0584702,26.4177752 91.0584702,17.8955448 C91.0584702,6.64675391 99.9760277,0 109.749893,0 C122.268693,0 129.642276,9.88510384 129.642276,19.6001536 C129.642276,34.2581622 119.181563,42.4386572 104.947691,42.4386572 C98.0890388,42.4386572 90.5443579,40.9049161 82.4839273,38.6901451 L82.4839273,140.272626 Z";
10
- function Footer({
11
- labels,
12
- layout = "responsive",
13
- className,
14
- style,
15
- unstyled = false,
16
- accent = false,
17
- classNameInner,
18
- classNameLogo,
19
- classNameText,
20
- classNameLink
21
- }) {
22
- const t = { ...defaultLabels, ...labels };
23
- const attribution = t.attribution?.trim();
24
- const footerSurface = unstyled ? "" : accent ? "border-t border-tollerud-yellow/20 bg-tollerud-yellow/5" : "border-t border-tollerud-border bg-tollerud-noir-900/80";
25
- const innerLayoutClasses = layout === "row" ? "max-w-7xl mx-auto px-8 flex flex-row items-center justify-between gap-4" : "max-w-7xl mx-auto px-8 flex flex-col md:flex-row items-center justify-center md:justify-between gap-4 md:gap-0";
26
- const logoColor = unstyled ? "" : accent ? "text-tollerud-yellow" : "text-tollerud-text-muted";
27
- const textWrapperClasses = layout === "row" ? "flex-1 text-right ml-4" : "flex-1 text-center md:text-right md:ml-4";
28
- const textLayoutClasses = layout === "row" ? "text-sm text-tollerud-text-secondary inline-flex flex-row items-center justify-end text-right gap-0" : "text-sm text-tollerud-text-secondary flex flex-col md:flex-row md:inline gap-0";
29
- return /* @__PURE__ */ jsx("footer", { className: cn("w-full pt-4 pb-4", footerSurface, className), style, children: /* @__PURE__ */ jsxs("div", { className: cn(innerLayoutClasses, classNameInner), children: [
30
- /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 md:flex-shrink-0", children: /* @__PURE__ */ jsxs(
31
- "svg",
32
- {
33
- width: "24",
34
- height: "24",
35
- viewBox: "0 0 130 143",
36
- version: "1.1",
37
- xmlns: "http://www.w3.org/2000/svg",
38
- xmlnsXlink: "http://www.w3.org/1999/xlink",
39
- className: cn("h-5 w-5", logoColor, classNameLogo),
40
- role: "img",
41
- children: [
42
- /* @__PURE__ */ jsx("title", { children: "Tollerud Logo" }),
43
- /* @__PURE__ */ jsx("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ jsx("g", { id: "Tollerud-Monogram", transform: "translate(-86.000000, -109.000000)", fill: "currentColor", children: /* @__PURE__ */ jsx("g", { id: "Group-2", transform: "translate(32.000000, 55.000000)", children: /* @__PURE__ */ jsx("g", { id: "Group", transform: "translate(54.000000, 54.000000)", children: /* @__PURE__ */ jsx("path", { d: MONOGRAM_PATH, id: "Monogram" }) }) }) }) })
44
- ]
45
- }
46
- ) }),
47
- /* @__PURE__ */ jsx("div", { className: textWrapperClasses, children: /* @__PURE__ */ jsxs("p", { className: cn(textLayoutClasses, classNameText), children: [
48
- /* @__PURE__ */ jsxs("span", { children: [
49
- /* @__PURE__ */ jsx(
50
- "a",
51
- {
52
- href: "https://tollerud.no",
53
- target: "_blank",
54
- rel: "noopener noreferrer",
55
- className: cn(
56
- "underline decoration-tollerud-yellow decoration-[3px] underline-offset-[4px] hover:opacity-80 transition-opacity",
57
- classNameLink
58
- ),
59
- style: {
60
- textDecorationThickness: "3px",
61
- textUnderlineOffset: "4px"
62
- },
63
- children: t.tollerudProject
64
- }
65
- ),
66
- attribution ? /* @__PURE__ */ jsxs(Fragment, { children: [
67
- " ",
68
- /* @__PURE__ */ jsx("span", { children: attribution })
69
- ] }) : null,
70
- " "
71
- ] }),
72
- /* @__PURE__ */ jsx("span", { className: layout === "row" ? "ml-1" : "md:ml-1", children: t.allRightsReserved })
73
- ] }) })
74
- ] }) });
75
- }
76
-
77
- export { Footer };
78
- //# sourceMappingURL=chunk-HYQGOC2E.js.map
79
- //# sourceMappingURL=chunk-HYQGOC2E.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/Footer.tsx"],"names":[],"mappings":";;;AAgBA,IAAM,aAAA,GAA8B;AAAA,EAClC,eAAA,EAAiB,oBAAA;AAAA,EACjB,iBAAA,EAAmB;AACrB,CAAA;AAuBA,IAAM,aAAA,GACJ,0+CAAA;AAEK,SAAS,MAAA,CAAO;AAAA,EACrB,MAAA;AAAA,EACA,MAAA,GAAS,YAAA;AAAA,EACT,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,MAAA,GAAS,KAAA;AAAA,EACT,cAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,aAAA,EAAe,GAAG,MAAA,EAAO;AACxC,EAAA,MAAM,WAAA,GAAc,CAAA,CAAE,WAAA,EAAa,IAAA,EAAK;AAExC,EAAA,MAAM,aAAA,GAAgB,QAAA,GAClB,EAAA,GACA,MAAA,GACE,yDAAA,GACA,yDAAA;AAEN,EAAA,MAAM,kBAAA,GACJ,MAAA,KAAW,KAAA,GACP,yEAAA,GACA,gHAAA;AAEN,EAAA,MAAM,SAAA,GAAY,QAAA,GACd,EAAA,GACA,MAAA,GACE,sBAAA,GACA,0BAAA;AAEN,EAAA,MAAM,kBAAA,GACJ,MAAA,KAAW,KAAA,GAAQ,wBAAA,GAA2B,0CAAA;AAEhD,EAAA,MAAM,iBAAA,GACJ,MAAA,KAAW,KAAA,GACP,qGAAA,GACA,gFAAA;AAEN,EAAA,uBACE,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAW,EAAA,CAAG,oBAAoB,aAAA,EAAe,SAAS,CAAA,EAAG,KAAA,EACnE,+BAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,kBAAA,EAAoB,cAAc,CAAA,EACnD,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EACb,QAAA,kBAAA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,IAAA;AAAA,QACN,MAAA,EAAO,IAAA;AAAA,QACP,OAAA,EAAQ,aAAA;AAAA,QACR,OAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAM,4BAAA;AAAA,QACN,UAAA,EAAW,8BAAA;AAAA,QACX,SAAA,EAAW,EAAA,CAAG,SAAA,EAAW,SAAA,EAAW,aAAa,CAAA;AAAA,QACjD,IAAA,EAAK,KAAA;AAAA,QAEL,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,WAAM,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,8BACnB,GAAA,EAAA,EAAE,EAAA,EAAG,UAAS,MAAA,EAAO,MAAA,EAAO,aAAY,GAAA,EAAI,IAAA,EAAK,MAAA,EAAO,QAAA,EAAS,WAChE,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,IAAG,mBAAA,EAAoB,SAAA,EAAU,sCAAqC,IAAA,EAAK,cAAA,EAC5E,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,IAAG,SAAA,EAAU,SAAA,EAAU,mCACxB,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,IAAG,OAAA,EAAQ,SAAA,EAAU,mCACtB,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAG,aAAA,EAAe,EAAA,EAAG,YAAW,CAAA,EACxC,CAAA,EACF,GACF,CAAA,EACF;AAAA;AAAA;AAAA,KACF,EACF,CAAA;AAAA,oBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,kBAAA,EACd,QAAA,kBAAA,IAAA,CAAC,OAAE,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,aAAa,CAAA,EAC/C,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,qBAAA;AAAA,YACL,MAAA,EAAO,QAAA;AAAA,YACP,GAAA,EAAI,qBAAA;AAAA,YACJ,SAAA,EAAW,EAAA;AAAA,cACT,kHAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,KAAA,EAAO;AAAA,cACL,uBAAA,EAAyB,KAAA;AAAA,cACzB,mBAAA,EAAqB;AAAA,aACvB;AAAA,YAEC,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,SACL;AAAA,QACC,8BACC,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,0BACD,GAAA,CAAC,UAAM,QAAA,EAAA,WAAA,EAAY;AAAA,SAAA,EACrB,CAAA,GACE,IAAA;AAAA,QAAM;AAAA,OAAA,EACZ,CAAA;AAAA,sBACA,GAAA,CAAC,UAAK,SAAA,EAAW,MAAA,KAAW,QAAQ,MAAA,GAAS,SAAA,EAAY,YAAE,iBAAA,EAAkB;AAAA,KAAA,EAC/E,CAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ","file":"chunk-HYQGOC2E.js","sourcesContent":["'use client'\n\nimport type { CSSProperties, ReactElement } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport type FooterLabels = {\n /** Text for the tollerud.no link (e.g. \"A Tollerud Project\"). */\n tollerudProject: string\n /**\n * Optional middle segment after the link, before the rights line.\n * Example for Advania: `\"for Advania Norge AS.\"`\n */\n attribution?: string\n allRightsReserved: string\n}\n\nconst defaultLabels: FooterLabels = {\n tollerudProject: 'A Tollerud Project',\n allRightsReserved: 'All rights reserved.',\n}\n\nexport type FooterProps = {\n labels?: Partial<FooterLabels>\n /** Layout behavior: responsive keeps mobile-first stacking, row forces horizontal layout. */\n layout?: 'responsive' | 'row'\n /** Merged onto <footer>. Use for extra layout, padding, etc. */\n className?: string\n /** Merged onto <footer> (wins over conflicting backgroundColor from classes when needed). */\n style?: CSSProperties\n /**\n * When true, skips all default surface styling so className/style fully control the bar\n * (avoids fighting default background/border).\n */\n unstyled?: boolean\n /** When true, uses accent (yellow) surface instead of neutral dark. */\n accent?: boolean\n classNameInner?: string\n classNameLogo?: string\n classNameText?: string\n classNameLink?: string\n}\n\nconst MONOGRAM_PATH =\n 'M82.4839273,140.272626 L95.1738252,140.272626 L95.1738252,143 L34.8114657,143 L34.8114657,140.272626 L47.5013636,140.272626 L47.5013636,28.2924381 C40.1277806,26.4177752 32.9252955,25.2241422 26.4088393,25.2241422 C12.1757856,25.2241422 4.11617359,34.5982703 4.11617359,39.8821508 C4.11617359,40.9049161 4.63028596,41.5867596 5.65932936,41.5867596 C7.20248513,41.5867596 7.37440169,40.3931266 8.06043062,38.8593855 C10.4615319,33.575505 15.6059302,31.5307881 20.4073141,31.5307881 C29.152955,31.5307881 35.1552988,38.5184637 35.1552988,47.2107482 C35.1552988,56.2447681 28.8107592,62.8907084 18.0070315,62.8907084 C7.5454996,62.891522 0,53.6882617 0,43.8023442 C0,30.8497582 11.3178401,21.986606 26.5799372,21.986606 C51.1026062,21.986606 84.1989996,39.2011209 104.948509,39.2011209 C118.495534,39.2011209 126.384048,31.7016558 126.384048,19.4300996 C126.384048,10.3968933 118.667451,4.60203698 115.580321,4.60203698 C114.552096,4.60203698 113.69415,5.1130128 113.69415,6.13577809 C113.69415,7.49946515 114.552096,7.6695192 115.409223,8.01044097 C115.752237,8.18049502 122.268693,10.5669474 122.268693,19.2592319 C122.268693,28.2924381 115.238125,34.0872945 107.177694,34.0872945 C97.7460244,34.0872945 91.0584702,26.4177752 91.0584702,17.8955448 C91.0584702,6.64675391 99.9760277,0 109.749893,0 C122.268693,0 129.642276,9.88510384 129.642276,19.6001536 C129.642276,34.2581622 119.181563,42.4386572 104.947691,42.4386572 C98.0890388,42.4386572 90.5443579,40.9049161 82.4839273,38.6901451 L82.4839273,140.272626 Z'\n\nexport function Footer({\n labels,\n layout = 'responsive',\n className,\n style,\n unstyled = false,\n accent = false,\n classNameInner,\n classNameLogo,\n classNameText,\n classNameLink,\n}: FooterProps): ReactElement {\n const t = { ...defaultLabels, ...labels }\n const attribution = t.attribution?.trim()\n\n const footerSurface = unstyled\n ? ''\n : accent\n ? 'border-t border-tollerud-yellow/20 bg-tollerud-yellow/5'\n : 'border-t border-tollerud-border bg-tollerud-noir-900/80'\n\n const innerLayoutClasses =\n layout === 'row'\n ? 'max-w-7xl mx-auto px-8 flex flex-row items-center justify-between gap-4'\n : 'max-w-7xl mx-auto px-8 flex flex-col md:flex-row items-center justify-center md:justify-between gap-4 md:gap-0'\n\n const logoColor = unstyled\n ? ''\n : accent\n ? 'text-tollerud-yellow'\n : 'text-tollerud-text-muted'\n\n const textWrapperClasses =\n layout === 'row' ? 'flex-1 text-right ml-4' : 'flex-1 text-center md:text-right md:ml-4'\n\n const textLayoutClasses =\n layout === 'row'\n ? 'text-sm text-tollerud-text-secondary inline-flex flex-row items-center justify-end text-right gap-0'\n : 'text-sm text-tollerud-text-secondary flex flex-col md:flex-row md:inline gap-0'\n\n return (\n <footer className={cn('w-full pt-4 pb-4', footerSurface, className)} style={style}>\n <div className={cn(innerLayoutClasses, classNameInner)}>\n <div className=\"flex-shrink-0 md:flex-shrink-0\">\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 130 143\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n className={cn('h-5 w-5', logoColor, classNameLogo)}\n role=\"img\"\n >\n <title>Tollerud Logo</title>\n <g id=\"Page-1\" stroke=\"none\" strokeWidth=\"1\" fill=\"none\" fillRule=\"evenodd\">\n <g id=\"Tollerud-Monogram\" transform=\"translate(-86.000000, -109.000000)\" fill=\"currentColor\">\n <g id=\"Group-2\" transform=\"translate(32.000000, 55.000000)\">\n <g id=\"Group\" transform=\"translate(54.000000, 54.000000)\">\n <path d={MONOGRAM_PATH} id=\"Monogram\" />\n </g>\n </g>\n </g>\n </g>\n </svg>\n </div>\n\n <div className={textWrapperClasses}>\n <p className={cn(textLayoutClasses, classNameText)}>\n <span>\n <a\n href=\"https://tollerud.no\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'underline decoration-tollerud-yellow decoration-[3px] underline-offset-[4px] hover:opacity-80 transition-opacity',\n classNameLink,\n )}\n style={{\n textDecorationThickness: '3px',\n textUnderlineOffset: '4px',\n }}\n >\n {t.tollerudProject}\n </a>\n {attribution ? (\n <>\n {' '}\n <span>{attribution}</span>\n </>\n ) : null}{' '}\n </span>\n <span className={layout === 'row' ? 'ml-1' : 'md:ml-1'}>{t.allRightsReserved}</span>\n </p>\n </div>\n </div>\n </footer>\n )\n}"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/Pill.tsx"],"names":[],"mappings":";;;;AAGA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA,EAAS,2EAAA;AAAA,EACT,KAAA,EAAO,uDAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAMA,IAAM,IAAA,GAAO,UAAA;AAAA,EACX,CAAC,EAAE,SAAA,EAAW,OAAA,GAAU,WAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AACrD,IAAA,uBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,0FAAA;AAAA,UACA,aAAa,OAAO,CAAA;AAAA,UACpB;AAAA,SACF;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,IAAA,CAAK,WAAA,GAAc,MAAA","file":"chunk-ISHZ6ZPJ.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nconst pillVariants = {\n outline: 'bg-transparent border border-tollerud-border text-tollerud-text-secondary',\n solid: 'bg-tollerud-surface-raised text-tollerud-text-primary',\n accent: 'bg-tollerud-yellow/15 border border-tollerud-yellow/30 text-tollerud-yellow',\n} as const\n\nexport interface PillProps extends HTMLAttributes<HTMLSpanElement> {\n variant?: keyof typeof pillVariants\n}\n\nconst Pill = forwardRef<HTMLSpanElement, PillProps>(\n ({ className, variant = 'outline', ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\n 'inline-flex items-center gap-1 px-2.5 py-1 text-xs font-medium rounded-full leading-none',\n pillVariants[variant],\n className\n )}\n {...props}\n />\n )\n }\n)\nPill.displayName = 'Pill'\n\nexport { Pill }\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/Switch.tsx"],"names":[],"mappings":";;;;AASA,IAAM,MAAA,GAAS,UAAA;AAAA,EACb,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,EAAA,EAAI,QAAQ,OAAA,EAAS,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC5D,IAAA,MAAM,SAAS,KAAA,EAAM;AACrB,IAAA,MAAM,KAAK,MAAA,IAAU,MAAA;AAErB,IAAA,uBACE,IAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,EAAA;AAAA,QACT,SAAA,EAAW,EAAA;AAAA,UACT,mEAAA;AAAA,UACA,oCAAA;AAAA,UACA,MAAM,QAAA,IAAY,mDAAA;AAAA,UAClB;AAAA,SACF;AAAA,QAGA,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,sEAAA;AAAA,gBACA,yCAAA;AAAA,gBACA,UAAU,oBAAA,GAAuB,sBAAA;AAAA,gBACjC,kCAAA;AAAA,gBACA,OAAA,IAAW,qCAAA;AAAA,gBACX;AAAA,eACF;AAAA,cAGA,QAAA,EAAA;AAAA,gCAAA,GAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,GAAA;AAAA,oBACA,EAAA;AAAA,oBACA,IAAA,EAAK,UAAA;AAAA,oBACL,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA;AAAA,oBACA,SAAA,EAAU,mEAAA;AAAA,oBACT,GAAG;AAAA;AAAA,iBACN;AAAA,gCAEA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,EAAA;AAAA,sBACT,0CAAA;AAAA,sBACA,sCAAA;AAAA,sBACA,UACI,sCAAA,GACA;AAAA;AACN;AAAA;AACF;AAAA;AAAA,WACF;AAAA,UACC,KAAA,oBAAS,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,KACzB;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-O57QMLNI.js","sourcesContent":["'use client'\n\nimport { type InputHTMLAttributes, forwardRef, useId } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {\n label?: string\n}\n\nconst Switch = forwardRef<HTMLInputElement, SwitchProps>(\n ({ className, label, id: idProp, checked, ...props }, ref) => {\n const autoId = useId()\n const id = idProp ?? autoId\n\n return (\n <label\n htmlFor={id}\n className={cn(\n 'inline-flex items-center gap-2.5 cursor-pointer select-none group',\n 'text-sm text-tollerud-text-primary',\n props.disabled && 'opacity-40 pointer-events-none cursor-not-allowed',\n className\n )}\n >\n {/* Track */}\n <span\n className={cn(\n 'relative inline-flex items-center h-5 w-9 flex-shrink-0 rounded-full',\n 'transition-colors duration-200 ease-out',\n checked ? 'bg-tollerud-yellow' : 'bg-tollerud-noir-600',\n 'group-hover:bg-tollerud-noir-500',\n checked && 'group-hover:bg-tollerud-yellow-warm',\n 'peer-focus-visible:outline-2 peer-focus-visible:outline-tollerud-yellow peer-focus-visible:outline-offset-2'\n )}\n >\n {/* Hidden input (peer) */}\n <input\n ref={ref}\n id={id}\n type=\"checkbox\"\n role=\"switch\"\n checked={checked}\n className=\"peer absolute inset-0 opacity-0 w-full h-full cursor-pointer z-10\"\n {...props}\n />\n {/* Thumb */}\n <span\n className={cn(\n 'block h-3.5 w-3.5 rounded-full shadow-sm',\n 'transition-all duration-200 ease-out',\n checked\n ? 'translate-x-[18px] bg-tollerud-black'\n : 'translate-x-[3px] bg-tollerud-white'\n )}\n />\n </span>\n {label && <span>{label}</span>}\n </label>\n )\n }\n)\nSwitch.displayName = 'Switch'\n\nexport { Switch }"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/Slider.tsx"],"names":[],"mappings":";;;;AAYA,IAAM,MAAA,GAAS,UAAA;AAAA,EACb,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,IAAI,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,GAAA,GAAM,GAAG,GAAA,GAAM,GAAA,EAAK,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AACjH,IAAA,MAAM,SAAS,KAAA,EAAM;AACrB,IAAA,MAAM,KAAK,MAAA,IAAU,MAAA;AACrB,IAAA,MAAM,OAAA,GAAU,SAAS,YAAA,IAAgB,GAAA;AAEzC,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACX,QAAA,EAAA;AAAA,MAAA,CAAA,KAAA,IAAS,SAAA,qBACT,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACZ,QAAA,EAAA;AAAA,QAAA,KAAA,wBACE,OAAA,EAAA,EAAM,OAAA,EAAS,EAAA,EAAI,SAAA,EAAU,wCAC3B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,QAED,SAAA,oBAAa,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAA6C,QAAA,EAAA,OAAA,EAAQ;AAAA,OAAA,EACrF,CAAA;AAAA,sBAEF,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,EAAA;AAAA,UACA,IAAA,EAAK,OAAA;AAAA,UACL,GAAA;AAAA,UACA,GAAA;AAAA,UACA,KAAA;AAAA,UACA,YAAA;AAAA,UACA,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,GAAW,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAClD,SAAA,EAAW,EAAA;AAAA,YACT,4GAAA;AAAA,YACA,uGAAA;AAAA,YACA,8HAAA;AAAA,YACA,yFAAA;AAAA,YACA,wFAAA;AAAA,YACA,+JAAA;AAAA,YACA,uFAAA;AAAA,YACA,kDAAA;AAAA,YACA;AAAA,WACF;AAAA,UACC,GAAG;AAAA;AAAA;AACN,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-OONIUDST.js","sourcesContent":["'use client'\n\nimport { type InputHTMLAttributes, forwardRef, useId } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface SliderProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'onChange'> {\n label?: string\n /** Show the current numeric value next to the label */\n showValue?: boolean\n onChange?: (value: number) => void\n}\n\nconst Slider = forwardRef<HTMLInputElement, SliderProps>(\n ({ className, label, showValue, id: idProp, value, defaultValue, min = 0, max = 100, onChange, ...props }, ref) => {\n const autoId = useId()\n const id = idProp ?? autoId\n const current = value ?? defaultValue ?? min\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n {(label || showValue) && (\n <div className=\"flex items-center justify-between text-xs\">\n {label && (\n <label htmlFor={id} className=\"font-medium text-tollerud-text-muted\">\n {label}\n </label>\n )}\n {showValue && <span className=\"text-tollerud-text-secondary tabular-nums\">{current}</span>}\n </div>\n )}\n <input\n ref={ref}\n id={id}\n type=\"range\"\n min={min}\n max={max}\n value={value}\n defaultValue={defaultValue}\n onChange={(e) => onChange?.(Number(e.target.value))}\n className={cn(\n 'h-1.5 w-full cursor-pointer appearance-none rounded-full bg-tollerud-surface-raised accent-tollerud-yellow',\n '[&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:h-4 [&::-webkit-slider-thumb]:w-4',\n '[&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-tollerud-yellow [&::-webkit-slider-thumb]:cursor-pointer',\n '[&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-tollerud-noir-black',\n '[&::-moz-range-thumb]:h-4 [&::-moz-range-thumb]:w-4 [&::-moz-range-thumb]:rounded-full',\n '[&::-moz-range-thumb]:bg-tollerud-yellow [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-tollerud-noir-black [&::-moz-range-thumb]:cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-tollerud-yellow/50',\n 'disabled:opacity-40 disabled:pointer-events-none',\n className\n )}\n {...props}\n />\n </div>\n )\n }\n)\nSlider.displayName = 'Slider'\n\nexport { Slider }\n"]}
@@ -1,139 +0,0 @@
1
- 'use client';
2
- import { cn } from './chunk-WSQNPRGN.js';
3
- import { jsxs, jsx } from 'react/jsx-runtime';
4
-
5
- function BentoDashboard({
6
- title,
7
- hosts = [],
8
- metrics = [],
9
- services = [],
10
- incidents = [],
11
- className
12
- }) {
13
- return /* @__PURE__ */ jsxs("div", { className: cn("space-y-4", className), children: [
14
- /* @__PURE__ */ jsx("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ jsxs("div", { children: [
15
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold text-tollerud-text-primary", children: title }),
16
- /* @__PURE__ */ jsxs("p", { className: "text-xs text-tollerud-text-muted", children: [
17
- hosts.length,
18
- " hosts \xB7 ",
19
- services.length,
20
- " services",
21
- incidents.length > 0 && ` \xB7 ${incidents.length} active incident${incidents.length > 1 ? "s" : ""}`
22
- ] })
23
- ] }) }),
24
- hosts.length > 0 && /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-3", children: [
25
- /* @__PURE__ */ jsx("div", { className: "md:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsx(HostCardComponent, { host: hosts[0] }) }),
26
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-3 md:col-span-2 lg:col-span-1", children: hosts.slice(1).map((h, i) => /* @__PURE__ */ jsx(HostCardComponent, { host: h }, h.hostname ?? i)) })
27
- ] }),
28
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-3", children: [
29
- metrics.length > 0 && /* @__PURE__ */ jsxs("div", { className: "lg:col-span-2", children: [
30
- /* @__PURE__ */ jsx(SectionLabel, { children: "Metrics" }),
31
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-2", children: metrics.map((m, i) => /* @__PURE__ */ jsx(StatCardComponent, { stat: m }, m.label ?? i)) })
32
- ] }),
33
- services.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
34
- /* @__PURE__ */ jsx(SectionLabel, { children: "Services" }),
35
- /* @__PURE__ */ jsx("div", { className: "space-y-2", children: services.slice(0, 4).map((s, i) => /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-tollerud-border/20 bg-tollerud-surface p-3", children: [
36
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
37
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-tollerud-text-primary", children: s.service }),
38
- /* @__PURE__ */ jsx("span", { className: cn(
39
- "text-xs px-1.5 py-0.5 rounded-full font-medium",
40
- s.status === "online" && "text-tollerud-accent bg-tollerud-accent/10",
41
- s.status === "warning" && "text-tollerud-warning bg-tollerud-warning/10",
42
- s.status === "offline" && "text-tollerud-error bg-tollerud-error/10",
43
- s.status === "idle" && "text-tollerud-text-muted bg-tollerud-noir-800"
44
- ), children: s.status })
45
- ] }),
46
- s.responseTime && /* @__PURE__ */ jsxs("p", { className: "text-xs text-tollerud-text-muted mt-1", children: [
47
- s.responseTime,
48
- " response"
49
- ] })
50
- ] }, s.service ?? i)) })
51
- ] })
52
- ] }),
53
- incidents.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
54
- /* @__PURE__ */ jsx(SectionLabel, { children: "Recent Incidents" }),
55
- /* @__PURE__ */ jsx("div", { className: "space-y-1.5", children: incidents.slice(0, 4).map((inc, i) => /* @__PURE__ */ jsx(IncidentCardItem, { incident: inc }, inc.title + i)) })
56
- ] })
57
- ] });
58
- }
59
- function SectionLabel({ children }) {
60
- return /* @__PURE__ */ jsx("p", { className: "text-xs font-semibold text-tollerud-text-muted uppercase tracking-wider mb-2", children });
61
- }
62
- function HostCardComponent({ host }) {
63
- return /* @__PURE__ */ jsxs("div", { className: cn(
64
- "rounded-xl border p-4",
65
- host.status === "online" ? "border-tollerud-border/30 bg-tollerud-surface" : host.status === "warning" ? "border-tollerud-warning/30 bg-tollerud-warning/5" : "border-tollerud-border/20 bg-tollerud-surface opacity-70"
66
- ), children: [
67
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-3", children: [
68
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
69
- /* @__PURE__ */ jsx(StatusDotComp, { status: host.status }),
70
- /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-tollerud-text-primary", children: host.hostname })
71
- ] }),
72
- /* @__PURE__ */ jsx("span", { className: "text-xs text-tollerud-text-muted font-mono", children: host.ip })
73
- ] }),
74
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2 text-xs", children: [
75
- host.cpu && /* @__PURE__ */ jsx(MetricBadge, { label: "CPU", value: host.cpu }),
76
- host.memory && /* @__PURE__ */ jsx(MetricBadge, { label: "Mem", value: host.memory }),
77
- host.disk && /* @__PURE__ */ jsx(MetricBadge, { label: "Disk", value: host.disk }),
78
- host.uptime && /* @__PURE__ */ jsx(MetricBadge, { label: "Up", value: host.uptime })
79
- ] })
80
- ] });
81
- }
82
- function StatCardComponent({ stat }) {
83
- return /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-tollerud-border/20 bg-tollerud-surface p-3", children: [
84
- /* @__PURE__ */ jsx("p", { className: "text-xs text-tollerud-text-muted", children: stat.label }),
85
- /* @__PURE__ */ jsx("p", { className: "text-lg font-semibold text-tollerud-text-primary mt-0.5", children: stat.value }),
86
- stat.change && /* @__PURE__ */ jsx("span", { className: cn(
87
- "text-xs font-medium",
88
- stat.change.direction === "up" ? "text-tollerud-accent" : "text-tollerud-error"
89
- ), children: stat.change.value })
90
- ] });
91
- }
92
- function IncidentCardItem({ incident }) {
93
- return /* @__PURE__ */ jsxs("div", { className: cn(
94
- "flex items-start gap-3 rounded-lg border p-3",
95
- incident.acknowledged ? "border-tollerud-border/10 bg-tollerud-noir-900/50 opacity-60" : "border-tollerud-border/20 bg-tollerud-surface"
96
- ), children: [
97
- /* @__PURE__ */ jsx(SeverityDot, { severity: incident.severity }),
98
- /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
99
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
100
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-tollerud-text-primary truncate", children: incident.title }),
101
- incident.acknowledged && /* @__PURE__ */ jsx("span", { className: "text-xs text-tollerud-text-muted", children: "(acknowledged)" })
102
- ] }),
103
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs text-tollerud-text-muted mt-0.5", children: [
104
- /* @__PURE__ */ jsx("span", { children: incident.service }),
105
- /* @__PURE__ */ jsx("span", { children: "\xB7" }),
106
- /* @__PURE__ */ jsx("span", { children: incident.timestamp })
107
- ] }),
108
- incident.description && /* @__PURE__ */ jsx("p", { className: "text-xs text-tollerud-text-secondary mt-1", children: incident.description })
109
- ] })
110
- ] });
111
- }
112
- function StatusDotComp({ status }) {
113
- return /* @__PURE__ */ jsx("span", { className: cn(
114
- "inline-block w-2 h-2 rounded-full",
115
- status === "online" && "bg-tollerud-accent shadow-[0_0_4px_var(--tollerud-accent)]",
116
- status === "warning" && "bg-tollerud-warning",
117
- status === "offline" && "bg-tollerud-error"
118
- ) });
119
- }
120
- function SeverityDot({ severity }) {
121
- return /* @__PURE__ */ jsx("span", { className: cn(
122
- "inline-block w-2 h-2 rounded-full mt-1 shrink-0",
123
- severity === "critical" && "bg-tollerud-error shadow-[0_0_4px_var(--tollerud-error)]",
124
- severity === "high" && "bg-tollerud-warning",
125
- severity === "medium" && "bg-tollerud-accent",
126
- severity === "low" && "bg-tollerud-text-muted",
127
- severity === "info" && "bg-tollerud-info"
128
- ) });
129
- }
130
- function MetricBadge({ label, value }) {
131
- return /* @__PURE__ */ jsxs("div", { className: "rounded bg-tollerud-noir-800 px-2 py-1.5", children: [
132
- /* @__PURE__ */ jsx("span", { className: "text-tollerud-text-muted", children: label }),
133
- /* @__PURE__ */ jsx("span", { className: "float-right text-tollerud-text-primary font-mono", children: value })
134
- ] });
135
- }
136
-
137
- export { BentoDashboard };
138
- //# sourceMappingURL=chunk-PLF3BBQI.js.map
139
- //# sourceMappingURL=chunk-PLF3BBQI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/BentoDashboard.tsx"],"names":[],"mappings":"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","file":"chunk-PLF3BBQI.js","sourcesContent":["'use client'\n\nimport { type ReactNode } from 'react'\nimport { cn } from '@/lib/utils'\nimport type { HostCardProps } from './HostCard'\nimport type { StatCardProps } from './StatCard'\nimport type { ServiceHealthCardProps } from './ServiceHealthCard'\nimport type { IncidentSeverity } from './IncidentCard'\nimport type { BackupJob } from './BackupStatusPanel'\n\n/* ──────────────────── Bento Grid Dashboard Template ──────────────────── */\n\nexport interface BentoDashboardProps {\n title: string\n hosts?: HostCardProps[]\n metrics?: StatCardProps[]\n services?: ServiceHealthCardProps[]\n incidents?: { title: string; severity: IncidentSeverity; timestamp: string; service: string; description?: string; acknowledged?: boolean }[]\n backupJobs?: BackupJob[]\n className?: string\n /** Render the incident list footer */\n renderIncidentFooter?: () => ReactNode\n}\n\nexport function BentoDashboard({\n title,\n hosts = [],\n metrics = [],\n services = [],\n incidents = [],\n className,\n}: BentoDashboardProps) {\n return (\n <div className={cn('space-y-4', className)}>\n {/* Title bar */}\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold text-tollerud-text-primary\">{title}</h2>\n <p className=\"text-xs text-tollerud-text-muted\">\n {hosts.length} hosts · {services.length} services\n {incidents.length > 0 && ` · ${incidents.length} active incident${incidents.length > 1 ? 's' : ''}`}\n </p>\n </div>\n </div>\n\n {/* Row 1: Host cards — bento asymmetric */}\n {hosts.length > 0 && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n {/* First host spans wider */}\n <div className=\"md:col-span-2 lg:col-span-1\">\n <HostCardComponent host={hosts[0]} />\n </div>\n {/* Remaining hosts in the second column area */}\n <div className=\"grid grid-cols-1 gap-3 md:col-span-2 lg:col-span-1\">\n {hosts.slice(1).map((h, i) => (\n <HostCardComponent key={h.hostname ?? i} host={h} />\n ))}\n </div>\n </div>\n )}\n\n {/* Row 2: Metrics + Services — side by side */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-3\">\n {/* Metrics grid — 2 columns within */}\n {metrics.length > 0 && (\n <div className=\"lg:col-span-2\">\n <SectionLabel>Metrics</SectionLabel>\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-2\">\n {metrics.map((m, i) => (\n <StatCardComponent key={m.label ?? i} stat={m} />\n ))}\n </div>\n </div>\n )}\n\n {/* Services list */}\n {services.length > 0 && (\n <div>\n <SectionLabel>Services</SectionLabel>\n <div className=\"space-y-2\">\n {services.slice(0, 4).map((s, i) => (\n <div key={s.service ?? i} className=\"rounded-lg border border-tollerud-border/20 bg-tollerud-surface p-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-tollerud-text-primary\">{s.service}</span>\n <span className={cn(\n 'text-xs px-1.5 py-0.5 rounded-full font-medium',\n s.status === 'online' && 'text-tollerud-accent bg-tollerud-accent/10',\n s.status === 'warning' && 'text-tollerud-warning bg-tollerud-warning/10',\n s.status === 'offline' && 'text-tollerud-error bg-tollerud-error/10',\n s.status === 'idle' && 'text-tollerud-text-muted bg-tollerud-noir-800',\n )}>\n {s.status}\n </span>\n </div>\n {s.responseTime && (\n <p className=\"text-xs text-tollerud-text-muted mt-1\">{s.responseTime} response</p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Row 3: Incidents — full width */}\n {incidents.length > 0 && (\n <div>\n <SectionLabel>Recent Incidents</SectionLabel>\n <div className=\"space-y-1.5\">\n {incidents.slice(0, 4).map((inc, i) => (\n <IncidentCardItem key={inc.title + i} incident={inc} />\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\n/* ────────── Internal sub-components for rendering ────────── */\n\nfunction SectionLabel({ children }: { children: ReactNode }) {\n return (\n <p className=\"text-xs font-semibold text-tollerud-text-muted uppercase tracking-wider mb-2\">{children}</p>\n )\n}\n\nfunction HostCardComponent({ host }: { host: HostCardProps }) {\n return (\n <div className={cn(\n 'rounded-xl border p-4',\n host.status === 'online' ? 'border-tollerud-border/30 bg-tollerud-surface' :\n host.status === 'warning' ? 'border-tollerud-warning/30 bg-tollerud-warning/5' :\n 'border-tollerud-border/20 bg-tollerud-surface opacity-70'\n )}>\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n <StatusDotComp status={host.status as 'online' | 'offline' | 'warning'} />\n <span className=\"text-sm font-semibold text-tollerud-text-primary\">{host.hostname}</span>\n </div>\n <span className=\"text-xs text-tollerud-text-muted font-mono\">{host.ip}</span>\n </div>\n <div className=\"grid grid-cols-2 gap-2 text-xs\">\n {host.cpu && <MetricBadge label=\"CPU\" value={host.cpu} />}\n {host.memory && <MetricBadge label=\"Mem\" value={host.memory} />}\n {host.disk && <MetricBadge label=\"Disk\" value={host.disk} />}\n {host.uptime && <MetricBadge label=\"Up\" value={host.uptime} />}\n </div>\n </div>\n )\n}\n\nfunction StatCardComponent({ stat }: { stat: StatCardProps }) {\n return (\n <div className=\"rounded-lg border border-tollerud-border/20 bg-tollerud-surface p-3\">\n <p className=\"text-xs text-tollerud-text-muted\">{stat.label}</p>\n <p className=\"text-lg font-semibold text-tollerud-text-primary mt-0.5\">{stat.value}</p>\n {stat.change && (\n <span className={cn(\n 'text-xs font-medium',\n stat.change.direction === 'up' ? 'text-tollerud-accent' : 'text-tollerud-error'\n )}>\n {stat.change.value}\n </span>\n )}\n </div>\n )\n}\n\nfunction IncidentCardItem({ incident }: { incident: { title: string; severity: IncidentSeverity; timestamp: string; service: string; description?: string; acknowledged?: boolean } }) {\n return (\n <div className={cn(\n 'flex items-start gap-3 rounded-lg border p-3',\n incident.acknowledged ? 'border-tollerud-border/10 bg-tollerud-noir-900/50 opacity-60' : 'border-tollerud-border/20 bg-tollerud-surface'\n )}>\n <SeverityDot severity={incident.severity} />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-tollerud-text-primary truncate\">{incident.title}</span>\n {incident.acknowledged && (\n <span className=\"text-xs text-tollerud-text-muted\">(acknowledged)</span>\n )}\n </div>\n <div className=\"flex items-center gap-2 text-xs text-tollerud-text-muted mt-0.5\">\n <span>{incident.service}</span>\n <span>·</span>\n <span>{incident.timestamp}</span>\n </div>\n {incident.description && (\n <p className=\"text-xs text-tollerud-text-secondary mt-1\">{incident.description}</p>\n )}\n </div>\n </div>\n )\n}\n\nfunction StatusDotComp({ status }: { status: 'online' | 'offline' | 'warning' }) {\n return (\n <span className={cn(\n 'inline-block w-2 h-2 rounded-full',\n status === 'online' && 'bg-tollerud-accent shadow-[0_0_4px_var(--tollerud-accent)]',\n status === 'warning' && 'bg-tollerud-warning',\n status === 'offline' && 'bg-tollerud-error',\n )} />\n )\n}\n\nfunction SeverityDot({ severity }: { severity: IncidentSeverity }) {\n return (\n <span className={cn(\n 'inline-block w-2 h-2 rounded-full mt-1 shrink-0',\n severity === 'critical' && 'bg-tollerud-error shadow-[0_0_4px_var(--tollerud-error)]',\n severity === 'high' && 'bg-tollerud-warning',\n severity === 'medium' && 'bg-tollerud-accent',\n severity === 'low' && 'bg-tollerud-text-muted',\n severity === 'info' && 'bg-tollerud-info',\n )} />\n )\n}\n\nfunction MetricBadge({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"rounded bg-tollerud-noir-800 px-2 py-1.5\">\n <span className=\"text-tollerud-text-muted\">{label}</span>\n <span className=\"float-right text-tollerud-text-primary font-mono\">{value}</span>\n </div>\n )\n}\n\nexport default BentoDashboard"]}
@@ -1,26 +0,0 @@
1
- 'use client';
2
- import { cn } from './chunk-WSQNPRGN.js';
3
- import { forwardRef, useId } from 'react';
4
- import { jsxs, jsx } from 'react/jsx-runtime';
5
-
6
- var FormRow = forwardRef(
7
- ({ className, label, description, error, required, htmlFor, children, ...props }, ref) => {
8
- const autoId = useId();
9
- const descriptionId = description ? `${autoId}-description` : void 0;
10
- const errorId = error ? `${autoId}-error` : void 0;
11
- return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex flex-col gap-1.5", className), ...props, children: [
12
- label && /* @__PURE__ */ jsxs("label", { htmlFor, className: "text-sm font-medium text-tollerud-text-primary", children: [
13
- label,
14
- required && /* @__PURE__ */ jsx("span", { className: "ml-0.5 text-tollerud-error", children: "*" })
15
- ] }),
16
- description && /* @__PURE__ */ jsx("p", { id: descriptionId, className: "text-xs text-tollerud-text-muted", children: description }),
17
- /* @__PURE__ */ jsx("div", { "aria-describedby": [descriptionId, errorId].filter(Boolean).join(" ") || void 0, children }),
18
- error && /* @__PURE__ */ jsx("p", { id: errorId, className: "text-xs text-tollerud-error", children: error })
19
- ] });
20
- }
21
- );
22
- FormRow.displayName = "FormRow";
23
-
24
- export { FormRow };
25
- //# sourceMappingURL=chunk-Q74VRQEX.js.map
26
- //# sourceMappingURL=chunk-Q74VRQEX.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/FormRow.tsx"],"names":[],"mappings":";;;;AAeA,IAAM,OAAA,GAAU,UAAA;AAAA,EACd,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACxF,IAAA,MAAM,SAAS,KAAA,EAAM;AACrB,IAAA,MAAM,aAAA,GAAgB,WAAA,GAAc,CAAA,EAAG,MAAM,CAAA,YAAA,CAAA,GAAiB,MAAA;AAC9D,IAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAA,MAAA,CAAA,GAAW,MAAA;AAE5C,IAAA,uBACE,IAAA,CAAC,SAAI,GAAA,EAAU,SAAA,EAAW,GAAG,uBAAA,EAAyB,SAAS,CAAA,EAAI,GAAG,KAAA,EACnE,QAAA,EAAA;AAAA,MAAA,KAAA,oBACC,IAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAkB,SAAA,EAAU,gDAAA,EAChC,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,QACA,QAAA,oBAAY,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAA6B,QAAA,EAAA,GAAA,EAAC;AAAA,OAAA,EAC7D,CAAA;AAAA,MAED,+BACC,GAAA,CAAC,GAAA,EAAA,EAAE,IAAI,aAAA,EAAe,SAAA,EAAU,oCAC7B,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,sBAEF,GAAA,CAAC,KAAA,EAAA,EAAI,kBAAA,EAAkB,CAAC,eAAe,OAAO,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,QAAY,QAAA,EAAS,CAAA;AAAA,MACjG,yBACC,GAAA,CAAC,GAAA,EAAA,EAAE,IAAI,OAAA,EAAS,SAAA,EAAU,+BACvB,QAAA,EAAA,KAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AACA,OAAA,CAAQ,WAAA,GAAc,SAAA","file":"chunk-Q74VRQEX.js","sourcesContent":["'use client'\n\nimport { type HTMLAttributes, forwardRef, useId } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface FormRowProps extends HTMLAttributes<HTMLDivElement> {\n label?: React.ReactNode\n /** Hint text rendered below the label */\n description?: React.ReactNode\n error?: React.ReactNode\n required?: boolean\n /** Forwarded to the label's `htmlFor` — should match the control's `id` */\n htmlFor?: string\n}\n\nconst FormRow = forwardRef<HTMLDivElement, FormRowProps>(\n ({ className, label, description, error, required, htmlFor, children, ...props }, ref) => {\n const autoId = useId()\n const descriptionId = description ? `${autoId}-description` : undefined\n const errorId = error ? `${autoId}-error` : undefined\n\n return (\n <div ref={ref} className={cn('flex flex-col gap-1.5', className)} {...props}>\n {label && (\n <label htmlFor={htmlFor} className=\"text-sm font-medium text-tollerud-text-primary\">\n {label}\n {required && <span className=\"ml-0.5 text-tollerud-error\">*</span>}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-xs text-tollerud-text-muted\">\n {description}\n </p>\n )}\n <div aria-describedby={[descriptionId, errorId].filter(Boolean).join(' ') || undefined}>{children}</div>\n {error && (\n <p id={errorId} className=\"text-xs text-tollerud-error\">\n {error}\n </p>\n )}\n </div>\n )\n }\n)\nFormRow.displayName = 'FormRow'\n\nexport { FormRow }\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/Button.tsx"],"names":[],"mappings":";;;;;AAIA,IAAM,QAAA,GAAW;AAAA,EACf,OAAA,EAAS,mHAAA;AAAA,EACT,SAAA,EAAW,uIAAA;AAAA,EACX,KAAA,EAAO,iIAAA;AAAA,EACP,WAAA,EAAa,gGAAA;AAAA,EACb,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,KAAA,GAAQ;AAAA,EACZ,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAOO,SAAS,cAAA,CAAe,EAAE,OAAA,GAAU,WAAA,EAAa,OAAO,IAAA,EAAM,SAAA,EAAU,GAAiD,EAAC,EAAG;AAClI,EAAA,OAAO,EAAA;AAAA,IACL,kMAAA;AAAA,IACA,uBAAA;AAAA,IACA,kDAAA;AAAA,IACA,SAAS,OAAO,CAAA;AAAA,IAChB,MAAM,IAAI,CAAA;AAAA,IACV;AAAA,GACF;AACF;AAOA,IAAM,MAAA,GAAS,UAAA;AAAA,EACb,CAAC,EAAE,SAAA,EAAW,OAAA,GAAU,WAAA,EAAa,IAAA,GAAO,IAAA,EAAM,OAAA,GAAU,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACrF,IAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,QAAA;AAC9B,IAAA,uBACE,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAW,cAAA,CAAe,EAAE,OAAA,EAAS,IAAA,EAAM,WAAW,CAAA;AAAA,QACrD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-RWJELAS6.js","sourcesContent":["import { type ButtonHTMLAttributes, forwardRef } from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cn } from '@/lib/utils'\n\nconst variants = {\n primary: 'bg-tollerud-yellow text-tollerud-black border-tollerud-yellow hover:bg-tollerud-yellow hover:shadow-tollerud-glow',\n secondary: 'bg-transparent text-tollerud-text-primary border-tollerud-border hover:border-tollerud-text-secondary hover:bg-tollerud-surface-hover',\n ghost: 'bg-transparent text-tollerud-text-secondary border-transparent hover:text-tollerud-text-primary hover:bg-tollerud-surface-hover',\n destructive: 'bg-tollerud-error text-white border-tollerud-error hover:shadow-[0_0_12px_rgba(239,68,68,0.3)]',\n terminal: 'font-mono text-tollerud-yellow border-[rgba(255,255,0,0.25)] bg-transparent before:content-[\"❯_\"] before:opacity-70 hover:border-tollerud-yellow hover:shadow-tollerud-glow hover:bg-[rgba(255,255,0,0.05)]',\n} as const\n\nconst sizes = {\n sm: 'px-3 py-1 text-sm',\n md: 'px-4 py-2 text-base',\n lg: 'px-6 py-3 text-lg',\n} as const\n\nexport interface ButtonVariantProps {\n variant?: keyof typeof variants\n size?: keyof typeof sizes\n}\n\nexport function buttonVariants({ variant = 'secondary', size = 'md', className }: ButtonVariantProps & { className?: string } = {}) {\n return cn(\n 'inline-flex items-center justify-center gap-2 font-semibold rounded transition-all duration-[150ms] focus-visible:outline-2 focus-visible:outline-tollerud-yellow focus-visible:outline-offset-2',\n 'border cursor-pointer',\n 'disabled:opacity-50 disabled:pointer-events-none',\n variants[variant],\n sizes[size],\n className\n )\n}\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, ButtonVariantProps {\n /** Render as the single child element (e.g. a `<Link>`) instead of a `<button>`, merging props and styles onto it. */\n asChild?: boolean\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'secondary', size = 'md', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n ref={ref}\n className={buttonVariants({ variant, size, className })}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button }\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/CTABand.tsx"],"names":[],"mappings":";;;;AAUA,IAAM,OAAA,GAAU,UAAA;AAAA,EACd,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,SAAA,GAAY,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC/E,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,qFAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yDAAA,EAA2D,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAC9E,WAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uEACV,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,UAED,OAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAA8D,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,UAEtF,SAAA,oBACC,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yDAAA,EAA0D;AAAA;AAAA;AAAA,KAE5E;AAAA,EAEJ;AACF;AACA,OAAA,CAAQ,WAAA,GAAc,SAAA","file":"chunk-VTRUUT5K.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface CTABandProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: React.ReactNode\n description?: React.ReactNode\n actions?: React.ReactNode\n accentBar?: boolean\n}\n\nconst CTABand = forwardRef<HTMLDivElement, CTABandProps>(\n ({ className, title, description, actions, accentBar = true, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-xl border border-tollerud-border bg-tollerud-surface px-8 py-11 text-center',\n className\n )}\n {...props}\n >\n <h2 className=\"tollerud-display text-[30px] text-tollerud-text-primary\">{title}</h2>\n {description && (\n <p className=\"mx-auto mt-3 max-w-[440px] text-[15px] text-tollerud-text-secondary\">\n {description}\n </p>\n )}\n {actions && (\n <div className=\"mt-[22px] flex flex-wrap items-center justify-center gap-3\">{actions}</div>\n )}\n {accentBar && (\n <hr className=\"tollerud-accent-bar mx-auto mt-8 max-w-[320px] border-0\" />\n )}\n </div>\n )\n }\n)\nCTABand.displayName = 'CTABand'\n\nexport { CTABand }\n"]}