@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,36 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { cn } from './chunk-WSQNPRGN.js';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var Textarea = forwardRef(
|
|
7
|
+
({ className, label, error, id, ...props }, ref) => {
|
|
8
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
9
|
+
label && /* @__PURE__ */ jsx("label", { htmlFor: id, className: "text-xs font-medium text-tollerud-text-muted", children: label }),
|
|
10
|
+
/* @__PURE__ */ jsx(
|
|
11
|
+
"textarea",
|
|
12
|
+
{
|
|
13
|
+
ref,
|
|
14
|
+
id,
|
|
15
|
+
className: cn(
|
|
16
|
+
"font-sans text-base px-3 py-2 rounded min-h-[80px] resize-y",
|
|
17
|
+
"bg-tollerud-surface-raised border",
|
|
18
|
+
"text-tollerud-text-primary",
|
|
19
|
+
"placeholder:text-tollerud-text-muted",
|
|
20
|
+
"transition-[border-color] duration-[150ms]",
|
|
21
|
+
"focus:outline-none focus:border-tollerud-yellow focus:shadow-[0_0_0_1px_#E8D500]",
|
|
22
|
+
error ? "border-tollerud-error" : "border-tollerud-border",
|
|
23
|
+
className
|
|
24
|
+
),
|
|
25
|
+
...props
|
|
26
|
+
}
|
|
27
|
+
),
|
|
28
|
+
error && /* @__PURE__ */ jsx("p", { className: "text-xs text-tollerud-error mt-0.5", children: error })
|
|
29
|
+
] });
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
Textarea.displayName = "Textarea";
|
|
33
|
+
|
|
34
|
+
export { Textarea };
|
|
35
|
+
//# sourceMappingURL=chunk-HWJVRTWO.js.map
|
|
36
|
+
//# sourceMappingURL=chunk-HWJVRTWO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/Textarea.tsx"],"names":[],"mappings":";;;;AAQA,IAAM,QAAA,GAAW,UAAA;AAAA,EACf,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,OAAO,EAAA,EAAI,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAClD,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,wBACE,OAAA,EAAA,EAAM,OAAA,EAAS,EAAA,EAAI,SAAA,EAAU,gDAC3B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBAEF,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,EAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,6DAAA;AAAA,YACA,mCAAA;AAAA,YACA,4BAAA;AAAA,YACA,sCAAA;AAAA,YACA,4CAAA;AAAA,YACA,kFAAA;AAAA,YACA,QAAQ,uBAAA,GAA0B,wBAAA;AAAA,YAClC;AAAA,WACF;AAAA,UACC,GAAG;AAAA;AAAA,OACN;AAAA,MACC,KAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAE7D,CAAA;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-HWJVRTWO.js","sourcesContent":["import { type TextareaHTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string\n error?: string\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, label, error, id, ...props }, ref) => {\n return (\n <div className=\"flex flex-col gap-1\">\n {label && (\n <label htmlFor={id} className=\"text-xs font-medium text-tollerud-text-muted\">\n {label}\n </label>\n )}\n <textarea\n ref={ref}\n id={id}\n className={cn(\n 'font-sans text-base px-3 py-2 rounded min-h-[80px] resize-y',\n 'bg-tollerud-surface-raised border',\n 'text-tollerud-text-primary',\n 'placeholder:text-tollerud-text-muted',\n 'transition-[border-color] duration-[150ms]',\n 'focus:outline-none focus:border-tollerud-yellow focus:shadow-[0_0_0_1px_#E8D500]',\n error ? 'border-tollerud-error' : 'border-tollerud-border',\n className\n )}\n {...props}\n />\n {error && (\n <p className=\"text-xs text-tollerud-error mt-0.5\">{error}</p>\n )}\n </div>\n )\n }\n)\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }"]}
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/Footer.tsx"],"names":[],"mappings":"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","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}"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { cn } from './chunk-WSQNPRGN.js';
|
|
3
|
+
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var Sheet = ({ open, onOpenChange, children }) => /* @__PURE__ */ jsx(DialogPrimitive.Root, { open, onOpenChange, children });
|
|
8
|
+
var SheetTrigger = DialogPrimitive.Trigger;
|
|
9
|
+
var SheetClose = DialogPrimitive.Close;
|
|
10
|
+
var SheetOverlay = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
11
|
+
DialogPrimitive.Overlay,
|
|
12
|
+
{
|
|
13
|
+
ref,
|
|
14
|
+
className: cn(
|
|
15
|
+
"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm",
|
|
16
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
17
|
+
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
18
|
+
className
|
|
19
|
+
),
|
|
20
|
+
...props
|
|
21
|
+
}
|
|
22
|
+
));
|
|
23
|
+
SheetOverlay.displayName = "SheetOverlay";
|
|
24
|
+
var SheetContent = forwardRef(({ className, children, side = "right", ...props }, ref) => /* @__PURE__ */ jsx(SheetOverlay, { children: /* @__PURE__ */ jsxs(
|
|
25
|
+
DialogPrimitive.Content,
|
|
26
|
+
{
|
|
27
|
+
ref,
|
|
28
|
+
className: cn(
|
|
29
|
+
"fixed z-50 gap-4 bg-tollerud-noir-900 border-tollerud-border/30 p-6 shadow-lg",
|
|
30
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
31
|
+
side === "right" && [
|
|
32
|
+
"inset-y-0 right-0 h-full w-full max-w-md border-l",
|
|
33
|
+
"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right"
|
|
34
|
+
],
|
|
35
|
+
side === "left" && [
|
|
36
|
+
"inset-y-0 left-0 h-full w-full max-w-md border-r",
|
|
37
|
+
"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left"
|
|
38
|
+
],
|
|
39
|
+
className
|
|
40
|
+
),
|
|
41
|
+
...props,
|
|
42
|
+
children: [
|
|
43
|
+
children,
|
|
44
|
+
/* @__PURE__ */ jsxs(SheetClose, { className: "absolute right-4 top-4 rounded-sm opacity-70 hover:opacity-100 transition-opacity text-tollerud-text-muted hover:text-tollerud-text-primary", children: [
|
|
45
|
+
/* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
46
|
+
/* @__PURE__ */ jsx("path", { d: "M18 6 6 18" }),
|
|
47
|
+
/* @__PURE__ */ jsx("path", { d: "m6 6 12 12" })
|
|
48
|
+
] }),
|
|
49
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
50
|
+
] })
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
) }));
|
|
54
|
+
SheetContent.displayName = "SheetContent";
|
|
55
|
+
var SheetHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("flex flex-col space-y-1.5 text-left", className), ...props });
|
|
56
|
+
var SheetTitle = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
57
|
+
DialogPrimitive.Title,
|
|
58
|
+
{
|
|
59
|
+
ref,
|
|
60
|
+
className: cn("text-base font-semibold text-tollerud-text-primary", className),
|
|
61
|
+
...props
|
|
62
|
+
}
|
|
63
|
+
));
|
|
64
|
+
SheetTitle.displayName = "SheetTitle";
|
|
65
|
+
var SheetDescription = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
66
|
+
DialogPrimitive.Description,
|
|
67
|
+
{
|
|
68
|
+
ref,
|
|
69
|
+
className: cn("text-sm text-tollerud-text-secondary", className),
|
|
70
|
+
...props
|
|
71
|
+
}
|
|
72
|
+
));
|
|
73
|
+
SheetDescription.displayName = "SheetDescription";
|
|
74
|
+
|
|
75
|
+
export { Sheet, SheetClose, SheetContent, SheetDescription, SheetHeader, SheetTitle, SheetTrigger };
|
|
76
|
+
//# sourceMappingURL=chunk-ILADNTUB.js.map
|
|
77
|
+
//# sourceMappingURL=chunk-ILADNTUB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/Sheet.tsx"],"names":[],"mappings":"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","file":"chunk-ILADNTUB.js","sourcesContent":["'use client'\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { type ComponentPropsWithoutRef, type ReactNode, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\n/* ──────────────────── Sheet (slide-in panel) ──────────────────── */\n\nexport type SheetSide = 'left' | 'right'\n\nexport interface SheetProps {\n open?: boolean\n onOpenChange?: (open: boolean) => void\n children: ReactNode\n}\n\nconst Sheet = ({ open, onOpenChange, children }: SheetProps) => (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n {children}\n </DialogPrimitive.Root>\n)\n\nconst SheetTrigger = DialogPrimitive.Trigger\n\nconst SheetClose = DialogPrimitive.Close\n\ninterface SheetContentProps extends ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n side?: SheetSide\n}\n\nconst SheetOverlay = forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/60 backdrop-blur-sm',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n))\nSheetOverlay.displayName = 'SheetOverlay'\n\nconst SheetContent = forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n SheetContentProps\n>(({ className, children, side = 'right', ...props }, ref) => (\n <SheetOverlay>\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed z-50 gap-4 bg-tollerud-noir-900 border-tollerud-border/30 p-6 shadow-lg',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n side === 'right' && [\n 'inset-y-0 right-0 h-full w-full max-w-md border-l',\n 'data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right',\n ],\n side === 'left' && [\n 'inset-y-0 left-0 h-full w-full max-w-md border-r',\n 'data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left',\n ],\n className\n )}\n {...props}\n >\n {children}\n <SheetClose className=\"absolute right-4 top-4 rounded-sm opacity-70 hover:opacity-100 transition-opacity text-tollerud-text-muted hover:text-tollerud-text-primary\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n <span className=\"sr-only\">Close</span>\n </SheetClose>\n </DialogPrimitive.Content>\n </SheetOverlay>\n))\nSheetContent.displayName = 'SheetContent'\n\nconst SheetHeader = ({ className, ...props }: { className?: string; children?: ReactNode }) => (\n <div className={cn('flex flex-col space-y-1.5 text-left', className)} {...props} />\n)\n\nconst SheetTitle = forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-base font-semibold text-tollerud-text-primary', className)}\n {...props}\n />\n))\nSheetTitle.displayName = 'SheetTitle'\n\nconst SheetDescription = forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-tollerud-text-secondary', className)}\n {...props}\n />\n))\nSheetDescription.displayName = 'SheetDescription'\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n}"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
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 pillVariants = {
|
|
7
|
+
outline: "bg-transparent border border-tollerud-border text-tollerud-text-secondary",
|
|
8
|
+
solid: "bg-tollerud-surface-raised text-tollerud-text-primary",
|
|
9
|
+
accent: "bg-tollerud-yellow/15 border border-tollerud-yellow/30 text-tollerud-yellow"
|
|
10
|
+
};
|
|
11
|
+
var Pill = forwardRef(
|
|
12
|
+
({ className, variant = "outline", ...props }, ref) => {
|
|
13
|
+
return /* @__PURE__ */ jsx(
|
|
14
|
+
"span",
|
|
15
|
+
{
|
|
16
|
+
ref,
|
|
17
|
+
className: cn(
|
|
18
|
+
"inline-flex items-center gap-1 px-2.5 py-1 text-xs font-medium rounded-full leading-none",
|
|
19
|
+
pillVariants[variant],
|
|
20
|
+
className
|
|
21
|
+
),
|
|
22
|
+
...props
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
Pill.displayName = "Pill";
|
|
28
|
+
|
|
29
|
+
export { Pill };
|
|
30
|
+
//# sourceMappingURL=chunk-ISHZ6ZPJ.js.map
|
|
31
|
+
//# sourceMappingURL=chunk-ISHZ6ZPJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1,66 @@
|
|
|
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 BackupStatusPanel = forwardRef(
|
|
8
|
+
({ className, jobs, totalSize, lastFullBackup, loading, ...props }, ref) => {
|
|
9
|
+
const failed = jobs.filter((j) => j.status === "offline").length;
|
|
10
|
+
return /* @__PURE__ */ jsxs(
|
|
11
|
+
"div",
|
|
12
|
+
{
|
|
13
|
+
ref,
|
|
14
|
+
className: cn(
|
|
15
|
+
"rounded-lg border border-tollerud-border bg-tollerud-surface-raised",
|
|
16
|
+
loading && "animate-pulse",
|
|
17
|
+
className
|
|
18
|
+
),
|
|
19
|
+
...props,
|
|
20
|
+
children: [
|
|
21
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b border-tollerud-border", children: [
|
|
22
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-tollerud-foreground", children: "Backups" }),
|
|
23
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 text-[11px] text-tollerud-text-muted", children: [
|
|
24
|
+
totalSize && /* @__PURE__ */ jsx("span", { children: totalSize }),
|
|
25
|
+
lastFullBackup && /* @__PURE__ */ jsxs("span", { children: [
|
|
26
|
+
"Last full: ",
|
|
27
|
+
lastFullBackup
|
|
28
|
+
] })
|
|
29
|
+
] })
|
|
30
|
+
] }),
|
|
31
|
+
/* @__PURE__ */ jsxs("div", { className: "p-1", children: [
|
|
32
|
+
jobs.length === 0 && /* @__PURE__ */ jsx("div", { className: "px-3 py-6 text-xs text-center text-tollerud-text-muted", children: "No backup jobs configured" }),
|
|
33
|
+
jobs.map((job) => /* @__PURE__ */ jsxs(
|
|
34
|
+
"div",
|
|
35
|
+
{
|
|
36
|
+
className: "flex items-center justify-between px-3 py-2 rounded-md hover:bg-tollerud-noir-800/50 transition-colors",
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 min-w-0 flex-1", children: [
|
|
39
|
+
/* @__PURE__ */ jsx(StatusDot, { status: job.status }),
|
|
40
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-tollerud-foreground truncate", children: job.name })
|
|
41
|
+
] }),
|
|
42
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 text-[11px] text-tollerud-text-muted flex-shrink-0 ml-2", children: [
|
|
43
|
+
job.size && /* @__PURE__ */ jsx("span", { children: job.size }),
|
|
44
|
+
job.target && /* @__PURE__ */ jsx("span", { className: "hidden sm:inline font-mono", children: job.target })
|
|
45
|
+
] })
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
job.name
|
|
49
|
+
))
|
|
50
|
+
] }),
|
|
51
|
+
failed > 0 && /* @__PURE__ */ jsx("div", { className: "px-4 py-2 border-t border-tollerud-border", children: /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-tollerud-error", children: [
|
|
52
|
+
failed,
|
|
53
|
+
" job",
|
|
54
|
+
failed !== 1 ? "s" : "",
|
|
55
|
+
" failed \u2014 check logs"
|
|
56
|
+
] }) })
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
BackupStatusPanel.displayName = "BackupStatusPanel";
|
|
63
|
+
|
|
64
|
+
export { BackupStatusPanel };
|
|
65
|
+
//# sourceMappingURL=chunk-JRFSUVSO.js.map
|
|
66
|
+
//# sourceMappingURL=chunk-JRFSUVSO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/BackupStatusPanel.tsx"],"names":[],"mappings":";;;;;AAwBA,IAAM,iBAAA,GAAoB,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,gBAAgB,OAAA,EAAS,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC1E,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAE1D,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,qEAAA;AAAA,UACA,OAAA,IAAW,eAAA;AAAA,UACX;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAGJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6EAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EAAiD,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BACxE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACZ,QAAA,EAAA;AAAA,cAAA,SAAA,oBAAa,GAAA,CAAC,UAAM,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,cAC9B,cAAA,yBAAmB,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,gBAAA,aAAA;AAAA,gBAAY;AAAA,eAAA,EAAe;AAAA,aAAA,EACtD;AAAA,WAAA,EACF,CAAA;AAAA,0BAGA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACZ,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,WAAW,CAAA,oBACf,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAyD,QAAA,EAAA,2BAAA,EAAyB,CAAA;AAAA,YAElG,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACT,IAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,wGAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,oCAAA,GAAA,CAAC,SAAA,EAAA,EAAU,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,CAAA;AAAA,oCAC/B,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uDAAA,EAAyD,cAAI,IAAA,EAAK;AAAA,mBAAA,EACpF,CAAA;AAAA,kCACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAI,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,GAAA,CAAI,IAAA,EAAK,CAAA;AAAA,oBAC5B,IAAI,MAAA,oBAAU,GAAA,CAAC,UAAK,SAAA,EAAU,4BAAA,EAA8B,cAAI,MAAA,EAAO;AAAA,mBAAA,EAC1E;AAAA;AAAA,eAAA;AAAA,cAVK,GAAA,CAAI;AAAA,aAYZ;AAAA,WAAA,EACH,CAAA;AAAA,UAGE,MAAA,GAAS,qBACT,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EACb,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,YAAA,MAAA;AAAA,YAAO,MAAA;AAAA,YAAK,MAAA,KAAW,IAAI,GAAA,GAAM,EAAA;AAAA,YAAG;AAAA,WAAA,EACvC,CAAA,EACF;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AACA,iBAAA,CAAkB,WAAA,GAAc,mBAAA","file":"chunk-JRFSUVSO.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\nimport { StatusDot, type Status } from './StatusDot'\n\nexport interface BackupJob {\n name: string\n status: Status\n lastRun?: string\n nextRun?: string\n size?: string\n target?: string\n}\n\nexport interface BackupStatusPanelProps extends HTMLAttributes<HTMLDivElement> {\n /** List of backup jobs */\n jobs: BackupJob[]\n /** Total size of all backups */\n totalSize?: string\n /** Last full backup timestamp */\n lastFullBackup?: string\n /** Whether the panel is loading */\n loading?: boolean\n}\n\nconst BackupStatusPanel = forwardRef<HTMLDivElement, BackupStatusPanelProps>(\n ({ className, jobs, totalSize, lastFullBackup, loading, ...props }, ref) => {\n const failed = jobs.filter((j) => j.status === 'offline').length\n\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-lg border border-tollerud-border bg-tollerud-surface-raised',\n loading && 'animate-pulse',\n className\n )}\n {...props}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-tollerud-border\">\n <span className=\"text-sm font-semibold text-tollerud-foreground\">Backups</span>\n <div className=\"flex items-center gap-3 text-[11px] text-tollerud-text-muted\">\n {totalSize && <span>{totalSize}</span>}\n {lastFullBackup && <span>Last full: {lastFullBackup}</span>}\n </div>\n </div>\n\n {/* Job list */}\n <div className=\"p-1\">\n {jobs.length === 0 && (\n <div className=\"px-3 py-6 text-xs text-center text-tollerud-text-muted\">No backup jobs configured</div>\n )}\n {jobs.map((job) => (\n <div\n key={job.name}\n className=\"flex items-center justify-between px-3 py-2 rounded-md hover:bg-tollerud-noir-800/50 transition-colors\"\n >\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <StatusDot status={job.status} />\n <span className=\"text-xs font-medium text-tollerud-foreground truncate\">{job.name}</span>\n </div>\n <div className=\"flex items-center gap-3 text-[11px] text-tollerud-text-muted flex-shrink-0 ml-2\">\n {job.size && <span>{job.size}</span>}\n {job.target && <span className=\"hidden sm:inline font-mono\">{job.target}</span>}\n </div>\n </div>\n ))}\n </div>\n\n {/* Footer — schedule summary */}\n {(failed > 0) && (\n <div className=\"px-4 py-2 border-t border-tollerud-border\">\n <span className=\"text-[11px] text-tollerud-error\">\n {failed} job{failed !== 1 ? 's' : ''} failed — check logs\n </span>\n </div>\n )}\n </div>\n )\n }\n)\nBackupStatusPanel.displayName = 'BackupStatusPanel'\n\nexport { BackupStatusPanel }\n"]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { cn } from './chunk-WSQNPRGN.js';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
5
|
+
import { X } from 'lucide-react';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var Dialog = DialogPrimitive.Root;
|
|
9
|
+
var DialogTrigger = DialogPrimitive.Trigger;
|
|
10
|
+
var DialogPortal = DialogPrimitive.Portal;
|
|
11
|
+
var DialogClose = DialogPrimitive.Close;
|
|
12
|
+
var DialogOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
13
|
+
DialogPrimitive.Overlay,
|
|
14
|
+
{
|
|
15
|
+
ref,
|
|
16
|
+
className: cn(
|
|
17
|
+
"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm",
|
|
18
|
+
className
|
|
19
|
+
),
|
|
20
|
+
...props
|
|
21
|
+
}
|
|
22
|
+
));
|
|
23
|
+
DialogOverlay.displayName = "DialogOverlay";
|
|
24
|
+
var DialogContent = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DialogPortal, { children: [
|
|
25
|
+
/* @__PURE__ */ jsx(DialogOverlay, {}),
|
|
26
|
+
/* @__PURE__ */ jsxs(
|
|
27
|
+
DialogPrimitive.Content,
|
|
28
|
+
{
|
|
29
|
+
ref,
|
|
30
|
+
className: cn(
|
|
31
|
+
"fixed top-1/2 left-1/2 z-50 w-full max-w-lg -translate-x-1/2 -translate-y-1/2",
|
|
32
|
+
"rounded-lg border border-tollerud-border/30 bg-tollerud-noir-900 p-6 shadow-xl",
|
|
33
|
+
"data-[state=open]:animate-none data-[state=closed]:animate-none",
|
|
34
|
+
className
|
|
35
|
+
),
|
|
36
|
+
...props,
|
|
37
|
+
children: [
|
|
38
|
+
children,
|
|
39
|
+
/* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "absolute top-4 right-4 rounded-sm p-1 text-tollerud-text-muted hover:text-tollerud-foreground transition-colors cursor-pointer", children: [
|
|
40
|
+
/* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
|
|
41
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
42
|
+
] })
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
)
|
|
46
|
+
] }));
|
|
47
|
+
DialogContent.displayName = "DialogContent";
|
|
48
|
+
var DialogHeader = ({
|
|
49
|
+
className,
|
|
50
|
+
...props
|
|
51
|
+
}) => /* @__PURE__ */ jsx(
|
|
52
|
+
"div",
|
|
53
|
+
{
|
|
54
|
+
className: cn("flex flex-col gap-1.5 mb-4", className),
|
|
55
|
+
...props
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
DialogHeader.displayName = "DialogHeader";
|
|
59
|
+
var DialogFooter = ({
|
|
60
|
+
className,
|
|
61
|
+
...props
|
|
62
|
+
}) => /* @__PURE__ */ jsx(
|
|
63
|
+
"div",
|
|
64
|
+
{
|
|
65
|
+
className: cn("flex flex-col-reverse sm:flex-row sm:justify-end gap-2 mt-6", className),
|
|
66
|
+
...props
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
DialogFooter.displayName = "DialogFooter";
|
|
70
|
+
var DialogTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
71
|
+
DialogPrimitive.Title,
|
|
72
|
+
{
|
|
73
|
+
ref,
|
|
74
|
+
className: cn("text-base font-semibold text-tollerud-foreground", className),
|
|
75
|
+
...props
|
|
76
|
+
}
|
|
77
|
+
));
|
|
78
|
+
DialogTitle.displayName = "DialogTitle";
|
|
79
|
+
var DialogDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
80
|
+
DialogPrimitive.Description,
|
|
81
|
+
{
|
|
82
|
+
ref,
|
|
83
|
+
className: cn("text-sm text-tollerud-text-secondary", className),
|
|
84
|
+
...props
|
|
85
|
+
}
|
|
86
|
+
));
|
|
87
|
+
DialogDescription.displayName = "DialogDescription";
|
|
88
|
+
|
|
89
|
+
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger };
|
|
90
|
+
//# sourceMappingURL=chunk-KI6OTVID.js.map
|
|
91
|
+
//# sourceMappingURL=chunk-KI6OTVID.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/Dialog.tsx"],"names":[],"mappings":";;;;;;AAOA,IAAM,MAAA,GAAyB,eAAA,CAAA;AAC/B,IAAM,aAAA,GAAgC,eAAA,CAAA;AACtC,IAAM,YAAA,GAA+B,eAAA,CAAA;AACrC,IAAM,WAAA,GAA8B,eAAA,CAAA;AAEpC,IAAM,aAAA,GAAsB,iBAG1B,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAiB,eAAA,CAAA,OAAA;AAAA,EAAhB;AAAA,IACG,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,iDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACH;AACD,aAAA,CAAc,WAAA,GAAc,eAAA;AAE5B,IAAM,aAAA,GAAsB,KAAA,CAAA,UAAA,CAG1B,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,qBACpC,IAAA,CAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,CAAA;AAAA,kBACf,IAAA;AAAA,IAAiB,eAAA,CAAA,OAAA;AAAA,IAAhB;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,+EAAA;AAAA,QACA,gFAAA;AAAA,QACA,iEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACD,IAAA,CAAiB,eAAA,CAAA,KAAA,EAAhB,EAAsB,SAAA,EAAU,gIAAA,EAC/B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,CAAA,EAAA,EAAE,WAAU,SAAA,EAAU,CAAA;AAAA,0BACvB,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,OAAA,EAAK;AAAA,SAAA,EACjC;AAAA;AAAA;AAAA;AACF,CAAA,EACF,CACD;AACD,aAAA,CAAc,WAAA,GAAc,eAAA;AAE5B,IAAM,eAAe,CAAC;AAAA,EACpB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,qBACE,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA;AAAA,IACpD,GAAG;AAAA;AACN;AAEF,YAAA,CAAa,WAAA,GAAc,cAAA;AAE3B,IAAM,eAAe,CAAC;AAAA,EACpB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,qBACE,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,SAAA,EAAW,EAAA,CAAG,6DAAA,EAA+D,SAAS,CAAA;AAAA,IACrF,GAAG;AAAA;AACN;AAEF,YAAA,CAAa,WAAA,GAAc,cAAA;AAE3B,IAAM,WAAA,GAAoB,iBAGxB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAiB,eAAA,CAAA,KAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,kDAAA,EAAoD,SAAS,CAAA;AAAA,IAC1E,GAAG;AAAA;AACN,CACD;AACD,WAAA,CAAY,WAAA,GAAc,aAAA;AAE1B,IAAM,iBAAA,GAA0B,iBAG9B,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAiB,eAAA,CAAA,WAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,sCAAA,EAAwC,SAAS,CAAA;AAAA,IAC9D,GAAG;AAAA;AACN,CACD;AACD,iBAAA,CAAkB,WAAA,GAAc,mBAAA","file":"chunk-KI6OTVID.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\nimport { cn } from '@/lib/utils'\n\nconst Dialog = DialogPrimitive.Root\nconst DialogTrigger = DialogPrimitive.Trigger\nconst DialogPortal = DialogPrimitive.Portal\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/60 backdrop-blur-sm',\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = 'DialogOverlay'\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed top-1/2 left-1/2 z-50 w-full max-w-lg -translate-x-1/2 -translate-y-1/2',\n 'rounded-lg border border-tollerud-border/30 bg-tollerud-noir-900 p-6 shadow-xl',\n 'data-[state=open]:animate-none data-[state=closed]:animate-none',\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute top-4 right-4 rounded-sm p-1 text-tollerud-text-muted hover:text-tollerud-foreground transition-colors cursor-pointer\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = 'DialogContent'\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col gap-1.5 mb-4', className)}\n {...props}\n />\n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end gap-2 mt-6', className)}\n {...props}\n />\n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-base font-semibold text-tollerud-foreground', className)}\n {...props}\n />\n))\nDialogTitle.displayName = 'DialogTitle'\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-tollerud-text-secondary', className)}\n {...props}\n />\n))\nDialogDescription.displayName = 'DialogDescription'\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { cn } from './chunk-WSQNPRGN.js';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var StatCard = forwardRef(
|
|
7
|
+
({ className, label, value, change, accent, ...props }, ref) => {
|
|
8
|
+
return /* @__PURE__ */ jsxs(
|
|
9
|
+
"div",
|
|
10
|
+
{
|
|
11
|
+
ref,
|
|
12
|
+
className: cn(
|
|
13
|
+
"group relative rounded-lg border p-4",
|
|
14
|
+
"bg-tollerud-surface-raised",
|
|
15
|
+
"transition-all duration-200 ease-out",
|
|
16
|
+
"hover:translate-y-[-1px]",
|
|
17
|
+
accent ? "border-tollerud-yellow/20 hover:border-tollerud-yellow/40 hover:shadow-[0_0_20px_rgba(232,213,0,0.08)]" : "border-tollerud-border hover:border-tollerud-noir-500 hover:shadow-[0_4px_12px_rgba(0,0,0,0.3)]",
|
|
18
|
+
className
|
|
19
|
+
),
|
|
20
|
+
...props,
|
|
21
|
+
children: [
|
|
22
|
+
accent && /* @__PURE__ */ jsx("span", { className: "absolute top-0 left-4 right-4 h-px bg-gradient-to-r from-transparent via-tollerud-yellow/60 to-transparent" }),
|
|
23
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-2", children: [
|
|
24
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-medium uppercase tracking-wider text-tollerud-text-muted", children: label }),
|
|
25
|
+
change && /* @__PURE__ */ jsxs(
|
|
26
|
+
"span",
|
|
27
|
+
{
|
|
28
|
+
className: cn(
|
|
29
|
+
"inline-flex items-center gap-0.5 text-[11px] font-semibold whitespace-nowrap",
|
|
30
|
+
change.direction === "up" ? "text-tollerud-success" : "text-tollerud-error"
|
|
31
|
+
),
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ jsx(
|
|
34
|
+
"svg",
|
|
35
|
+
{
|
|
36
|
+
className: cn(
|
|
37
|
+
"w-3 h-3",
|
|
38
|
+
change.direction === "down" && "rotate-180"
|
|
39
|
+
),
|
|
40
|
+
viewBox: "0 0 24 24",
|
|
41
|
+
fill: "none",
|
|
42
|
+
stroke: "currentColor",
|
|
43
|
+
strokeWidth: 2.5,
|
|
44
|
+
strokeLinecap: "round",
|
|
45
|
+
strokeLinejoin: "round",
|
|
46
|
+
children: /* @__PURE__ */ jsx("path", { d: "M12 5v14M5 12l7 7 7-7" })
|
|
47
|
+
}
|
|
48
|
+
),
|
|
49
|
+
change.value
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
] }),
|
|
54
|
+
/* @__PURE__ */ jsx(
|
|
55
|
+
"p",
|
|
56
|
+
{
|
|
57
|
+
className: cn(
|
|
58
|
+
"text-2xl font-bold tracking-tight mt-1",
|
|
59
|
+
accent ? "text-tollerud-yellow" : "text-tollerud-text-primary"
|
|
60
|
+
),
|
|
61
|
+
children: value
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
StatCard.displayName = "StatCard";
|
|
70
|
+
|
|
71
|
+
export { StatCard };
|
|
72
|
+
//# sourceMappingURL=chunk-LUM2YJBH.js.map
|
|
73
|
+
//# sourceMappingURL=chunk-LUM2YJBH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/StatCard.tsx"],"names":[],"mappings":";;;;AAUA,IAAM,QAAA,GAAW,UAAA;AAAA,EACf,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,QAAQ,MAAA,EAAQ,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC9D,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,sCAAA;AAAA,UACA,4BAAA;AAAA,UACA,sCAAA;AAAA,UACA,0BAAA;AAAA,UACA,SACI,wGAAA,GACA,iGAAA;AAAA,UACJ;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAGH,QAAA,EAAA;AAAA,UAAA,MAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4GAAA,EAA6G,CAAA;AAAA,0BAG/H,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uEAAA,EACV,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,YACC,MAAA,oBACC,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,8EAAA;AAAA,kBACA,MAAA,CAAO,SAAA,KAAc,IAAA,GAAO,uBAAA,GAA0B;AAAA,iBACxD;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAA,GAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAW,EAAA;AAAA,wBACT,SAAA;AAAA,wBACA,MAAA,CAAO,cAAc,MAAA,IAAU;AAAA,uBACjC;AAAA,sBACA,OAAA,EAAQ,WAAA;AAAA,sBACR,IAAA,EAAK,MAAA;AAAA,sBACL,MAAA,EAAO,cAAA;AAAA,sBACP,WAAA,EAAa,GAAA;AAAA,sBACb,aAAA,EAAc,OAAA;AAAA,sBACd,cAAA,EAAe,OAAA;AAAA,sBAEf,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uBAAA,EAAwB;AAAA;AAAA,mBAClC;AAAA,kBACC,MAAA,CAAO;AAAA;AAAA;AAAA;AACV,WAAA,EAEJ,CAAA;AAAA,0BAEA,GAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,wCAAA;AAAA,gBACA,SAAS,sBAAA,GAAyB;AAAA,eACpC;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-LUM2YJBH.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface StatCardProps extends HTMLAttributes<HTMLDivElement> {\n label: string\n value: string | number\n change?: { value: string; direction: 'up' | 'down' }\n accent?: boolean\n}\n\nconst StatCard = forwardRef<HTMLDivElement, StatCardProps>(\n ({ className, label, value, change, accent, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'group relative rounded-lg border p-4',\n 'bg-tollerud-surface-raised',\n 'transition-all duration-200 ease-out',\n 'hover:translate-y-[-1px]',\n accent\n ? 'border-tollerud-yellow/20 hover:border-tollerud-yellow/40 hover:shadow-[0_0_20px_rgba(232,213,0,0.08)]'\n : 'border-tollerud-border hover:border-tollerud-noir-500 hover:shadow-[0_4px_12px_rgba(0,0,0,0.3)]',\n className\n )}\n {...props}\n >\n {/* Accent top bar */}\n {accent && (\n <span className=\"absolute top-0 left-4 right-4 h-px bg-gradient-to-r from-transparent via-tollerud-yellow/60 to-transparent\" />\n )}\n\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"text-xs font-medium uppercase tracking-wider text-tollerud-text-muted\">\n {label}\n </p>\n {change && (\n <span\n className={cn(\n 'inline-flex items-center gap-0.5 text-[11px] font-semibold whitespace-nowrap',\n change.direction === 'up' ? 'text-tollerud-success' : 'text-tollerud-error'\n )}\n >\n <svg\n className={cn(\n 'w-3 h-3',\n change.direction === 'down' && 'rotate-180'\n )}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 5v14M5 12l7 7 7-7\" />\n </svg>\n {change.value}\n </span>\n )}\n </div>\n\n <p\n className={cn(\n 'text-2xl font-bold tracking-tight mt-1',\n accent ? 'text-tollerud-yellow' : 'text-tollerud-text-primary'\n )}\n >\n {value}\n </p>\n </div>\n )\n }\n)\nStatCard.displayName = 'StatCard'\n\nexport { StatCard }"]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { cn } from './chunk-WSQNPRGN.js';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { motion } from 'framer-motion';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var statusColors = {
|
|
8
|
+
online: "bg-tollerud-success",
|
|
9
|
+
offline: "bg-tollerud-error",
|
|
10
|
+
warning: "bg-tollerud-yellow",
|
|
11
|
+
idle: "bg-tollerud-noir-400"
|
|
12
|
+
};
|
|
13
|
+
var pulseColors = {
|
|
14
|
+
online: "rgba(34,197,94,0.5)",
|
|
15
|
+
warning: "rgba(232,213,0,0.45)",
|
|
16
|
+
offline: "rgba(239,68,68,0.5)"
|
|
17
|
+
};
|
|
18
|
+
var animationKeyframes = `
|
|
19
|
+
@keyframes tollerud-dot-pulse {
|
|
20
|
+
0%, 100% { box-shadow: 0 0 0 0 var(--pulse-color, rgba(34,197,94,0.5)); }
|
|
21
|
+
50% { box-shadow: 0 0 0 5px var(--pulse-color, rgba(34,197,94,0)); }
|
|
22
|
+
}
|
|
23
|
+
`;
|
|
24
|
+
var StatusDot = forwardRef(
|
|
25
|
+
({ className, status = "idle", label, noPulse, ...props }, ref) => {
|
|
26
|
+
const shouldPulse = !noPulse && (status === "online" || status === "warning" || status === "offline");
|
|
27
|
+
const pulseColor = pulseColors[status];
|
|
28
|
+
return /* @__PURE__ */ jsxs(
|
|
29
|
+
"span",
|
|
30
|
+
{
|
|
31
|
+
ref,
|
|
32
|
+
className: cn("inline-flex items-center gap-1.5 text-xs font-medium", className),
|
|
33
|
+
...props,
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ jsx("style", { children: animationKeyframes }),
|
|
36
|
+
/* @__PURE__ */ jsx(
|
|
37
|
+
motion.span,
|
|
38
|
+
{
|
|
39
|
+
layout: true,
|
|
40
|
+
animate: {
|
|
41
|
+
scaleX: [1, 1.6, 1],
|
|
42
|
+
scaleY: [1, 0.6, 1]
|
|
43
|
+
},
|
|
44
|
+
transition: {
|
|
45
|
+
duration: 0.4,
|
|
46
|
+
ease: "easeOut",
|
|
47
|
+
times: [0, 0.3, 1]
|
|
48
|
+
},
|
|
49
|
+
className: cn(
|
|
50
|
+
"inline-block w-2 h-2 rounded-full",
|
|
51
|
+
statusColors[status],
|
|
52
|
+
shouldPulse && "animate-tollerud-dot-pulse"
|
|
53
|
+
),
|
|
54
|
+
style: {
|
|
55
|
+
...shouldPulse && pulseColor ? { "--pulse-color": pulseColor } : {},
|
|
56
|
+
animation: shouldPulse ? "tollerud-dot-pulse 2s ease-in-out infinite" : void 0
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
status
|
|
60
|
+
),
|
|
61
|
+
label && /* @__PURE__ */ jsx("span", { children: label })
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
StatusDot.displayName = "StatusDot";
|
|
68
|
+
|
|
69
|
+
export { StatusDot };
|
|
70
|
+
//# sourceMappingURL=chunk-NHPISZWS.js.map
|
|
71
|
+
//# sourceMappingURL=chunk-NHPISZWS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/StatusDot.tsx"],"names":[],"mappings":";;;;;AAQA,IAAM,YAAA,GAAuC;AAAA,EAC3C,MAAA,EAAQ,qBAAA;AAAA,EACR,OAAA,EAAS,mBAAA;AAAA,EACT,OAAA,EAAS,oBAAA;AAAA,EACT,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,WAAA,GAA+C;AAAA,EACnD,MAAA,EAAQ,qBAAA;AAAA,EACR,OAAA,EAAS,sBAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,kBAAA,GAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAc3B,IAAM,SAAA,GAAY,UAAA;AAAA,EAChB,CAAC,EAAE,SAAA,EAAW,MAAA,GAAS,MAAA,EAAQ,OAAO,OAAA,EAAS,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACjE,IAAA,MAAM,cAAc,CAAC,OAAA,KAAY,WAAW,QAAA,IAAY,MAAA,KAAW,aAAa,MAAA,KAAW,SAAA,CAAA;AAC3F,IAAA,MAAM,UAAA,GAAa,YAAY,MAAM,CAAA;AAErC,IAAA,uBACE,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,sDAAA,EAAwD,SAAS,CAAA;AAAA,QAC9E,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,WAAO,QAAA,EAAA,kBAAA,EAAmB,CAAA;AAAA,0BAC3B,GAAA;AAAA,YAAC,MAAA,CAAO,IAAA;AAAA,YAAP;AAAA,cACC,MAAA,EAAM,IAAA;AAAA,cAEN,OAAA,EAAS;AAAA,gBACP,MAAA,EAAQ,CAAC,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA;AAAA,gBAClB,MAAA,EAAQ,CAAC,CAAA,EAAG,GAAA,EAAK,CAAC;AAAA,eACpB;AAAA,cACA,UAAA,EAAY;AAAA,gBACV,QAAA,EAAU,GAAA;AAAA,gBACV,IAAA,EAAM,SAAA;AAAA,gBACN,KAAA,EAAO,CAAC,CAAA,EAAG,GAAA,EAAK,CAAC;AAAA,eACnB;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACT,mCAAA;AAAA,gBACA,aAAa,MAAM,CAAA;AAAA,gBACnB,WAAA,IAAe;AAAA,eACjB;AAAA,cACA,KAAA,EAAO;AAAA,gBACL,GAAI,WAAA,IAAe,UAAA,GAAc,EAAE,eAAA,EAAiB,UAAA,KAAuC,EAAC;AAAA,gBAC5F,SAAA,EAAW,cAAc,4CAAA,GAA+C;AAAA;AAC1E,aAAA;AAAA,YAlBK;AAAA,WAmBP;AAAA,UACC,KAAA,oBAAS,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,KACzB;AAAA,EAEJ;AACF;AACA,SAAA,CAAU,WAAA,GAAc,WAAA","file":"chunk-NHPISZWS.js","sourcesContent":["'use client'\n\nimport { type HTMLAttributes, forwardRef } from 'react'\nimport { motion } from 'framer-motion'\nimport { cn } from '@/lib/utils'\n\ntype Status = 'online' | 'offline' | 'warning' | 'idle'\n\nconst statusColors: Record<Status, string> = {\n online: 'bg-tollerud-success',\n offline: 'bg-tollerud-error',\n warning: 'bg-tollerud-yellow',\n idle: 'bg-tollerud-noir-400',\n}\n\nconst pulseColors: Partial<Record<Status, string>> = {\n online: 'rgba(34,197,94,0.5)',\n warning: 'rgba(232,213,0,0.45)',\n offline: 'rgba(239,68,68,0.5)',\n}\n\nconst animationKeyframes = `\n@keyframes tollerud-dot-pulse {\n 0%, 100% { box-shadow: 0 0 0 0 var(--pulse-color, rgba(34,197,94,0.5)); }\n 50% { box-shadow: 0 0 0 5px var(--pulse-color, rgba(34,197,94,0)); }\n}\n`\n\nexport interface StatusDotProps extends HTMLAttributes<HTMLSpanElement> {\n status?: Status\n label?: string\n /** Disable the pulsing animation */\n noPulse?: boolean\n}\n\nconst StatusDot = forwardRef<HTMLSpanElement, StatusDotProps>(\n ({ className, status = 'idle', label, noPulse, ...props }, ref) => {\n const shouldPulse = !noPulse && (status === 'online' || status === 'warning' || status === 'offline')\n const pulseColor = pulseColors[status]\n\n return (\n <span\n ref={ref}\n className={cn('inline-flex items-center gap-1.5 text-xs font-medium', className)}\n {...props}\n >\n <style>{animationKeyframes}</style>\n <motion.span\n layout\n key={status}\n animate={{\n scaleX: [1, 1.6, 1],\n scaleY: [1, 0.6, 1],\n }}\n transition={{\n duration: 0.4,\n ease: 'easeOut',\n times: [0, 0.3, 1],\n }}\n className={cn(\n 'inline-block w-2 h-2 rounded-full',\n statusColors[status],\n shouldPulse && 'animate-tollerud-dot-pulse'\n )}\n style={{\n ...(shouldPulse && pulseColor ? ({ '--pulse-color': pulseColor } as React.CSSProperties) : {}),\n animation: shouldPulse ? 'tollerud-dot-pulse 2s ease-in-out infinite' : undefined,\n } as React.CSSProperties}\n />\n {label && <span>{label}</span>}\n </span>\n )\n }\n)\nStatusDot.displayName = 'StatusDot'\n\nexport { StatusDot }\nexport type { Status }"]}
|