@tollerud/ui 1.1.5 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +36 -13
- package/CHANGELOG.md +411 -0
- package/COMPONENTS.md +951 -0
- package/GETTING_STARTED.md +159 -0
- package/README.md +51 -43
- package/SKILL.md +59 -24
- 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 +28 -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 +10 -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-3LTW224O.js +53 -0
- package/dist/chunk-3LTW224O.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-A6L5C3IJ.js +47 -0
- package/dist/chunk-A6L5C3IJ.js.map +1 -0
- package/dist/chunk-ADE22JSR.js +54 -0
- package/dist/chunk-ADE22JSR.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-AQT3FZRQ.js +23 -0
- package/dist/chunk-AQT3FZRQ.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-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-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-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-ILADNTUB.js +77 -0
- package/dist/chunk-ILADNTUB.js.map +1 -0
- package/dist/chunk-IUPVQWO5.js +31 -0
- package/dist/chunk-IUPVQWO5.js.map +1 -0
- package/dist/chunk-JFOW2DI5.js +43 -0
- package/dist/chunk-JFOW2DI5.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-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-OLHMMFQ7.js +43 -0
- package/dist/chunk-OLHMMFQ7.js.map +1 -0
- package/dist/chunk-ONMTHBZ4.js +54 -0
- package/dist/chunk-ONMTHBZ4.js.map +1 -0
- package/dist/chunk-OVSIOZHJ.js +56 -0
- package/dist/chunk-OVSIOZHJ.js.map +1 -0
- package/dist/chunk-Q54CVE3W.js +154 -0
- package/dist/chunk-Q54CVE3W.js.map +1 -0
- package/dist/chunk-QEHTPQHL.js +35 -0
- package/dist/chunk-QEHTPQHL.js.map +1 -0
- package/dist/chunk-QEIEWGHA.js +62 -0
- package/dist/chunk-QEIEWGHA.js.map +1 -0
- package/dist/chunk-QQHBEACI.js +88 -0
- package/dist/chunk-QQHBEACI.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-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-T3UQ7G4T.js +58 -0
- package/dist/chunk-T3UQ7G4T.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-VFS3V3VY.js +91 -0
- package/dist/chunk-VFS3V3VY.js.map +1 -0
- package/dist/chunk-VOARBYVQ.js +44 -0
- package/dist/chunk-VOARBYVQ.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-YPP7QHYT.js +393 -0
- package/dist/chunk-YPP7QHYT.js.map +1 -0
- package/dist/chunk-YTU7BRDW.js +72 -0
- package/dist/chunk-YTU7BRDW.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/chunk-ZTFOR3AN.js +79 -0
- package/dist/chunk-ZTFOR3AN.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 +6 -0
- package/dist/footer.js.map +1 -0
- package/dist/form-row.d.ts +19 -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 +77 -960
- package/dist/index.js +69 -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/monogram.d.ts +20 -0
- package/dist/monogram.js +5 -0
- package/dist/monogram.js.map +1 -0
- package/dist/noir-glow-background.d.ts +56 -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 +17 -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 +13 -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 +1019 -0
- package/globals-v3.css +17 -0
- package/globals-v4.css +2 -0
- package/globals.css +12 -939
- package/package.json +85 -17
- package/registry.json +936 -0
- package/tailwind.css +9 -0
- package/tokens.css +20 -0
- package/tollerud-avatar-full.png +0 -0
- package/dist/index.cjs +0 -3938
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -960
- /package/{tia-full-figure.svg → tollerud-avatar-full.svg} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/CTABand.tsx"],"names":[],"mappings":";;;;AAUA,IAAM,OAAA,GAAU,UAAA;AAAA,EACd,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,SAAA,GAAY,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC/E,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,mGAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yDAAA,EAA2D,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAC9E,WAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uEACV,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,UAED,OAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAA8D,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,UAEtF,SAAA,oBACC,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qFAAA,EAAsF;AAAA;AAAA;AAAA,KAExG;AAAA,EAEJ;AACF;AACA,OAAA,CAAQ,WAAA,GAAc,SAAA","file":"chunk-IUPVQWO5.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface CTABandProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: React.ReactNode\n description?: React.ReactNode\n actions?: React.ReactNode\n accentBar?: boolean\n}\n\nconst CTABand = forwardRef<HTMLDivElement, CTABandProps>(\n ({ className, title, description, actions, accentBar = true, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'tollerud-card rounded-xl border border-tollerud-border bg-tollerud-surface px-8 py-11 text-center',\n className\n )}\n {...props}\n >\n <h2 className=\"tollerud-display text-[30px] text-tollerud-text-primary\">{title}</h2>\n {description && (\n <p className=\"mx-auto mt-3 max-w-[440px] text-[15px] text-tollerud-text-secondary\">\n {description}\n </p>\n )}\n {actions && (\n <div className=\"mt-[22px] flex flex-wrap items-center justify-center gap-3\">{actions}</div>\n )}\n {accentBar && (\n <hr className=\"tollerud-accent-bar tollerud-accent-bar--inline mx-auto mt-8 max-w-[320px] border-0\" />\n )}\n </div>\n )\n }\n)\nCTABand.displayName = 'CTABand'\n\nexport { CTABand }\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
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 pillLayers = {
|
|
7
|
+
outline: "tollerud-pill--outline",
|
|
8
|
+
muted: "tollerud-pill--muted",
|
|
9
|
+
success: "tollerud-pill--success",
|
|
10
|
+
error: "tollerud-pill--error",
|
|
11
|
+
solid: "",
|
|
12
|
+
accent: ""
|
|
13
|
+
};
|
|
14
|
+
var pillVariants = {
|
|
15
|
+
outline: "",
|
|
16
|
+
muted: "",
|
|
17
|
+
success: "",
|
|
18
|
+
error: "",
|
|
19
|
+
solid: "bg-tollerud-surface-raised text-tollerud-text-primary border-transparent",
|
|
20
|
+
accent: "bg-tollerud-yellow/15 border border-tollerud-yellow/30 text-tollerud-yellow"
|
|
21
|
+
};
|
|
22
|
+
var Pill = forwardRef(
|
|
23
|
+
({ className, variant = "outline", ...props }, ref) => {
|
|
24
|
+
return /* @__PURE__ */ jsx(
|
|
25
|
+
"span",
|
|
26
|
+
{
|
|
27
|
+
ref,
|
|
28
|
+
className: cn(
|
|
29
|
+
"tollerud-pill inline-flex items-center gap-1 leading-none",
|
|
30
|
+
pillLayers[variant],
|
|
31
|
+
pillVariants[variant],
|
|
32
|
+
className
|
|
33
|
+
),
|
|
34
|
+
...props
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
Pill.displayName = "Pill";
|
|
40
|
+
|
|
41
|
+
export { Pill };
|
|
42
|
+
//# sourceMappingURL=chunk-JFOW2DI5.js.map
|
|
43
|
+
//# sourceMappingURL=chunk-JFOW2DI5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/Pill.tsx"],"names":[],"mappings":";;;;AAIA,IAAM,UAAA,GAAa;AAAA,EACjB,OAAA,EAAS,wBAAA;AAAA,EACT,KAAA,EAAO,sBAAA;AAAA,EACP,OAAA,EAAS,wBAAA;AAAA,EACT,KAAA,EAAO,sBAAA;AAAA,EACP,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA,EAAS,EAAA;AAAA,EACT,KAAA,EAAO,EAAA;AAAA,EACP,OAAA,EAAS,EAAA;AAAA,EACT,KAAA,EAAO,EAAA;AAAA,EACP,KAAA,EAAO,0EAAA;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,2DAAA;AAAA,UACA,WAAW,OAAO,CAAA;AAAA,UAClB,aAAa,OAAO,CAAA;AAAA,UACpB;AAAA,SACF;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,IAAA,CAAK,WAAA,GAAc,MAAA","file":"chunk-JFOW2DI5.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\n/** Layer classes from globals-layers.css — colored mono tags */\nconst pillLayers = {\n outline: 'tollerud-pill--outline',\n muted: 'tollerud-pill--muted',\n success: 'tollerud-pill--success',\n error: 'tollerud-pill--error',\n solid: '',\n accent: '',\n} as const\n\nconst pillVariants = {\n outline: '',\n muted: '',\n success: '',\n error: '',\n solid: 'bg-tollerud-surface-raised text-tollerud-text-primary border-transparent',\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 'tollerud-pill inline-flex items-center gap-1 leading-none',\n pillLayers[variant],\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 }"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { cn } from './chunk-WSQNPRGN.js';
|
|
3
|
+
import { forwardRef, useState } from 'react';
|
|
4
|
+
import { EyeOff, Eye } from 'lucide-react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var PasswordInput = forwardRef(
|
|
8
|
+
({ className, label, error, id, ...props }, ref) => {
|
|
9
|
+
const [visible, setVisible] = useState(false);
|
|
10
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
11
|
+
label && /* @__PURE__ */ jsx("label", { htmlFor: id, className: "text-xs font-medium text-tollerud-text-muted", children: label }),
|
|
12
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
13
|
+
/* @__PURE__ */ jsx(
|
|
14
|
+
"input",
|
|
15
|
+
{
|
|
16
|
+
ref,
|
|
17
|
+
id,
|
|
18
|
+
type: visible ? "text" : "password",
|
|
19
|
+
className: cn(
|
|
20
|
+
"w-full font-sans text-base px-3 py-2 pr-10 rounded",
|
|
21
|
+
"bg-tollerud-surface-raised border",
|
|
22
|
+
"text-tollerud-text-primary",
|
|
23
|
+
"placeholder:text-tollerud-text-muted",
|
|
24
|
+
"transition-[border-color] duration-[150ms]",
|
|
25
|
+
"focus:outline-none focus:border-tollerud-yellow focus:shadow-[0_0_0_1px_#E8D500]",
|
|
26
|
+
error ? "border-tollerud-error" : "border-tollerud-border",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
...props
|
|
30
|
+
}
|
|
31
|
+
),
|
|
32
|
+
/* @__PURE__ */ jsx(
|
|
33
|
+
"button",
|
|
34
|
+
{
|
|
35
|
+
type: "button",
|
|
36
|
+
onClick: () => setVisible((v) => !v),
|
|
37
|
+
"aria-label": visible ? "Hide password" : "Show password",
|
|
38
|
+
"aria-pressed": visible,
|
|
39
|
+
className: "absolute right-2.5 top-1/2 -translate-y-1/2 text-tollerud-text-muted hover:text-tollerud-text-secondary transition-colors duration-[150ms]",
|
|
40
|
+
children: visible ? /* @__PURE__ */ jsx(EyeOff, { size: 16 }) : /* @__PURE__ */ jsx(Eye, { size: 16 })
|
|
41
|
+
}
|
|
42
|
+
)
|
|
43
|
+
] }),
|
|
44
|
+
error && /* @__PURE__ */ jsx("p", { className: "text-xs text-tollerud-error mt-0.5", children: error })
|
|
45
|
+
] });
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
PasswordInput.displayName = "PasswordInput";
|
|
49
|
+
|
|
50
|
+
export { PasswordInput };
|
|
51
|
+
//# sourceMappingURL=chunk-NOLWJJHT.js.map
|
|
52
|
+
//# sourceMappingURL=chunk-NOLWJJHT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/PasswordInput.tsx"],"names":[],"mappings":";;;;;AAWA,IAAM,aAAA,GAAgB,UAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,OAAO,EAAA,EAAI,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAClD,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAE5C,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,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,EAAA;AAAA,YACA,IAAA,EAAM,UAAU,MAAA,GAAS,UAAA;AAAA,YACzB,SAAA,EAAW,EAAA;AAAA,cACT,oDAAA;AAAA,cACA,mCAAA;AAAA,cACA,4BAAA;AAAA,cACA,sCAAA;AAAA,cACA,4CAAA;AAAA,cACA,kFAAA;AAAA,cACA,QAAQ,uBAAA,GAA0B,wBAAA;AAAA,cAClC;AAAA,aACF;AAAA,YACC,GAAG;AAAA;AAAA,SACN;AAAA,wBACA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAS,MAAM,UAAA,CAAW,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,YACnC,YAAA,EAAY,UAAU,eAAA,GAAkB,eAAA;AAAA,YACxC,cAAA,EAAc,OAAA;AAAA,YACd,SAAA,EAAU,4IAAA;AAAA,YAET,QAAA,EAAA,OAAA,uBAAW,MAAA,EAAA,EAAO,IAAA,EAAM,IAAI,CAAA,mBAAK,GAAA,CAAC,GAAA,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA;AACnD,OAAA,EACF,CAAA;AAAA,MACC,KAAA,oBAAS,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EACrE,CAAA;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA","file":"chunk-NOLWJJHT.js","sourcesContent":["'use client'\n\nimport { type InputHTMLAttributes, forwardRef, useState } from 'react'\nimport { Eye, EyeOff } from 'lucide-react'\nimport { cn } from '@/lib/utils'\n\nexport interface PasswordInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {\n label?: string\n error?: string\n}\n\nconst PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n ({ className, label, error, id, ...props }, ref) => {\n const [visible, setVisible] = useState(false)\n\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 <div className=\"relative\">\n <input\n ref={ref}\n id={id}\n type={visible ? 'text' : 'password'}\n className={cn(\n 'w-full font-sans text-base px-3 py-2 pr-10 rounded',\n 'bg-tollerud-surface-raised border',\n 'text-tollerud-text-primary',\n 'placeholder:text-tollerud-text-muted',\n 'transition-[border-color] duration-[150ms]',\n 'focus:outline-none focus:border-tollerud-yellow focus:shadow-[0_0_0_1px_#E8D500]',\n error ? 'border-tollerud-error' : 'border-tollerud-border',\n className\n )}\n {...props}\n />\n <button\n type=\"button\"\n onClick={() => setVisible((v) => !v)}\n aria-label={visible ? 'Hide password' : 'Show password'}\n aria-pressed={visible}\n className=\"absolute right-2.5 top-1/2 -translate-y-1/2 text-tollerud-text-muted hover:text-tollerud-text-secondary transition-colors duration-[150ms]\"\n >\n {visible ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n </div>\n {error && <p className=\"text-xs text-tollerud-error mt-0.5\">{error}</p>}\n </div>\n )\n }\n)\nPasswordInput.displayName = 'PasswordInput'\n\nexport { PasswordInput }\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { Card } from './chunk-DZOBXK2S.js';
|
|
3
|
+
import { cn } from './chunk-WSQNPRGN.js';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var FeatureCard = forwardRef(
|
|
8
|
+
({ className, icon, title, description, ...props }, ref) => {
|
|
9
|
+
return /* @__PURE__ */ jsxs(Card, { ref, className: cn("p-5", className), ...props, children: [
|
|
10
|
+
icon && /* @__PURE__ */ jsx("span", { className: "mb-3.5 inline-flex h-[38px] w-[38px] items-center justify-center rounded-[9px] bg-tollerud-yellow/12 text-tollerud-yellow", children: icon }),
|
|
11
|
+
/* @__PURE__ */ jsx("div", { className: "mb-1.5 text-base font-semibold text-tollerud-text-primary", children: title }),
|
|
12
|
+
/* @__PURE__ */ jsx("p", { className: "m-0 text-[13.5px] leading-snug text-tollerud-text-secondary", children: description })
|
|
13
|
+
] });
|
|
14
|
+
}
|
|
15
|
+
);
|
|
16
|
+
FeatureCard.displayName = "FeatureCard";
|
|
17
|
+
|
|
18
|
+
export { FeatureCard };
|
|
19
|
+
//# sourceMappingURL=chunk-NPVINX3Q.js.map
|
|
20
|
+
//# sourceMappingURL=chunk-NPVINX3Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/FeatureCard.tsx"],"names":[],"mappings":";;;;;AAUA,IAAM,WAAA,GAAc,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,OAAO,WAAA,EAAa,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC1D,IAAA,uBACE,IAAA,CAAC,QAAK,GAAA,EAAU,SAAA,EAAW,GAAG,KAAA,EAAO,SAAS,CAAA,EAAI,GAAG,KAAA,EAClD,QAAA,EAAA;AAAA,MAAA,IAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2HAAA,EACb,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,sBAEF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2DAAA,EAA6D,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAClF,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6DAAA,EACV,QAAA,EAAA,WAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AACA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-NPVINX3Q.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\nimport { Card } from './Card'\n\nexport interface FeatureCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n icon?: React.ReactNode\n title: React.ReactNode\n description: React.ReactNode\n}\n\nconst FeatureCard = forwardRef<HTMLDivElement, FeatureCardProps>(\n ({ className, icon, title, description, ...props }, ref) => {\n return (\n <Card ref={ref} className={cn('p-5', className)} {...props}>\n {icon && (\n <span className=\"mb-3.5 inline-flex h-[38px] w-[38px] items-center justify-center rounded-[9px] bg-tollerud-yellow/12 text-tollerud-yellow\">\n {icon}\n </span>\n )}\n <div className=\"mb-1.5 text-base font-semibold text-tollerud-text-primary\">{title}</div>\n <p className=\"m-0 text-[13.5px] leading-snug text-tollerud-text-secondary\">\n {description}\n </p>\n </Card>\n )\n }\n)\nFeatureCard.displayName = 'FeatureCard'\n\nexport { FeatureCard }\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
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 Segmented = forwardRef(
|
|
7
|
+
({ className, options, value, onChange, size = "md", ...props }, ref) => {
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
"div",
|
|
10
|
+
{
|
|
11
|
+
ref,
|
|
12
|
+
role: "radiogroup",
|
|
13
|
+
className: cn(
|
|
14
|
+
"inline-flex items-center gap-0.5 rounded-lg p-1 bg-tollerud-surface-raised border border-tollerud-border",
|
|
15
|
+
className
|
|
16
|
+
),
|
|
17
|
+
...props,
|
|
18
|
+
children: options.map((opt) => {
|
|
19
|
+
const active = opt.value === value;
|
|
20
|
+
return /* @__PURE__ */ jsx(
|
|
21
|
+
"button",
|
|
22
|
+
{
|
|
23
|
+
type: "button",
|
|
24
|
+
role: "radio",
|
|
25
|
+
"aria-checked": active,
|
|
26
|
+
disabled: opt.disabled,
|
|
27
|
+
onClick: () => !opt.disabled && onChange(opt.value),
|
|
28
|
+
className: cn(
|
|
29
|
+
"rounded-md font-medium transition-colors duration-[150ms]",
|
|
30
|
+
size === "sm" ? "px-2.5 py-1 text-xs" : "px-3.5 py-1.5 text-sm",
|
|
31
|
+
active ? "bg-tollerud-yellow text-tollerud-noir-black" : "text-tollerud-text-secondary hover:text-tollerud-text-primary",
|
|
32
|
+
opt.disabled && "opacity-40 pointer-events-none"
|
|
33
|
+
),
|
|
34
|
+
children: opt.label
|
|
35
|
+
},
|
|
36
|
+
opt.value
|
|
37
|
+
);
|
|
38
|
+
})
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
Segmented.displayName = "Segmented";
|
|
44
|
+
|
|
45
|
+
export { Segmented };
|
|
46
|
+
//# sourceMappingURL=chunk-NSMU66ZX.js.map
|
|
47
|
+
//# sourceMappingURL=chunk-NSMU66ZX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/Segmented.tsx"],"names":[],"mappings":";;;;AAgBA,IAAM,SAAA,GAAY,UAAA;AAAA,EAChB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,IAAA,GAAO,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACvE,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,YAAA;AAAA,QACL,SAAA,EAAW,EAAA;AAAA,UACT,0GAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACpB,UAAA,MAAM,MAAA,GAAS,IAAI,KAAA,KAAU,KAAA;AAC7B,UAAA,uBACE,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,OAAA;AAAA,cACL,cAAA,EAAc,MAAA;AAAA,cACd,UAAU,GAAA,CAAI,QAAA;AAAA,cACd,SAAS,MAAM,CAAC,IAAI,QAAA,IAAY,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,cAClD,SAAA,EAAW,EAAA;AAAA,gBACT,2DAAA;AAAA,gBACA,IAAA,KAAS,OAAO,qBAAA,GAAwB,uBAAA;AAAA,gBACxC,SACI,6CAAA,GACA,+DAAA;AAAA,gBACJ,IAAI,QAAA,IAAY;AAAA,eAClB;AAAA,cAEC,QAAA,EAAA,GAAA,CAAI;AAAA,aAAA;AAAA,YAfA,GAAA,CAAI;AAAA,WAgBX;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AACA,SAAA,CAAU,WAAA,GAAc,WAAA","file":"chunk-NSMU66ZX.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface SegmentedOption {\n value: string\n label: React.ReactNode\n disabled?: boolean\n}\n\nexport interface SegmentedProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n options: SegmentedOption[]\n value: string\n onChange: (value: string) => void\n size?: 'sm' | 'md'\n}\n\nconst Segmented = forwardRef<HTMLDivElement, SegmentedProps>(\n ({ className, options, value, onChange, size = 'md', ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"radiogroup\"\n className={cn(\n 'inline-flex items-center gap-0.5 rounded-lg p-1 bg-tollerud-surface-raised border border-tollerud-border',\n className\n )}\n {...props}\n >\n {options.map((opt) => {\n const active = opt.value === value\n return (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n disabled={opt.disabled}\n onClick={() => !opt.disabled && onChange(opt.value)}\n className={cn(\n 'rounded-md font-medium transition-colors duration-[150ms]',\n size === 'sm' ? 'px-2.5 py-1 text-xs' : 'px-3.5 py-1.5 text-sm',\n active\n ? 'bg-tollerud-yellow text-tollerud-noir-black'\n : 'text-tollerud-text-secondary hover:text-tollerud-text-primary',\n opt.disabled && 'opacity-40 pointer-events-none'\n )}\n >\n {opt.label}\n </button>\n )\n })}\n </div>\n )\n }\n)\nSegmented.displayName = 'Segmented'\n\nexport { Segmented }\n"]}
|
|
@@ -0,0 +1,79 @@
|
|
|
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 Donut = forwardRef(
|
|
7
|
+
({ className, segments, size = 160, ...props }, ref) => {
|
|
8
|
+
const total = segments.reduce((a, s) => a + s.value, 0) || 1;
|
|
9
|
+
const r = size / 2 - 14;
|
|
10
|
+
const c = 2 * Math.PI * r;
|
|
11
|
+
let offset = 0;
|
|
12
|
+
return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex items-center gap-6", className), ...props, children: [
|
|
13
|
+
/* @__PURE__ */ jsxs(
|
|
14
|
+
"svg",
|
|
15
|
+
{
|
|
16
|
+
width: size,
|
|
17
|
+
height: size,
|
|
18
|
+
viewBox: `0 0 ${size} ${size}`,
|
|
19
|
+
className: "-rotate-90",
|
|
20
|
+
role: "img",
|
|
21
|
+
"aria-hidden": "true",
|
|
22
|
+
children: [
|
|
23
|
+
/* @__PURE__ */ jsx(
|
|
24
|
+
"circle",
|
|
25
|
+
{
|
|
26
|
+
cx: size / 2,
|
|
27
|
+
cy: size / 2,
|
|
28
|
+
r,
|
|
29
|
+
fill: "none",
|
|
30
|
+
stroke: "var(--muted)",
|
|
31
|
+
strokeWidth: "14"
|
|
32
|
+
}
|
|
33
|
+
),
|
|
34
|
+
segments.map((s, i) => {
|
|
35
|
+
const len = s.value / total * c;
|
|
36
|
+
const gap = len > 10 ? 4 : 0;
|
|
37
|
+
const el = /* @__PURE__ */ jsx(
|
|
38
|
+
"circle",
|
|
39
|
+
{
|
|
40
|
+
cx: size / 2,
|
|
41
|
+
cy: size / 2,
|
|
42
|
+
r,
|
|
43
|
+
fill: "none",
|
|
44
|
+
stroke: s.color,
|
|
45
|
+
strokeWidth: "14",
|
|
46
|
+
strokeDasharray: `${Math.max(0.1, len - gap)} ${c - (len - gap)}`,
|
|
47
|
+
strokeDashoffset: -offset,
|
|
48
|
+
strokeLinecap: "butt"
|
|
49
|
+
},
|
|
50
|
+
i
|
|
51
|
+
);
|
|
52
|
+
offset += len;
|
|
53
|
+
return el;
|
|
54
|
+
})
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
),
|
|
58
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: segments.map((s, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-[13px]", children: [
|
|
59
|
+
/* @__PURE__ */ jsx(
|
|
60
|
+
"span",
|
|
61
|
+
{
|
|
62
|
+
className: "h-2.5 w-2.5 shrink-0 rounded-[3px]",
|
|
63
|
+
style: { background: s.color }
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-[70px] text-tollerud-text-primary", children: s.label }),
|
|
67
|
+
/* @__PURE__ */ jsxs("span", { className: "font-mono text-tollerud-text-muted", children: [
|
|
68
|
+
Math.round(s.value / total * 100),
|
|
69
|
+
"%"
|
|
70
|
+
] })
|
|
71
|
+
] }, i)) })
|
|
72
|
+
] });
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
Donut.displayName = "Donut";
|
|
76
|
+
|
|
77
|
+
export { Donut };
|
|
78
|
+
//# sourceMappingURL=chunk-O5SWPHUQ.js.map
|
|
79
|
+
//# sourceMappingURL=chunk-O5SWPHUQ.js.map
|