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