@hexclave/dashboard-ui-components 1.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/LICENSE +5 -0
- package/dist/chunk-BE-pF4vm.js +34 -0
- package/dist/components/alert.d.ts +22 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +75 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/analytics-chart/analytics-chart-pie.d.ts +67 -0
- package/dist/components/analytics-chart/analytics-chart-pie.d.ts.map +1 -0
- package/dist/components/analytics-chart/analytics-chart-pie.js +253 -0
- package/dist/components/analytics-chart/analytics-chart-pie.js.map +1 -0
- package/dist/components/analytics-chart/analytics-chart.d.ts +554 -0
- package/dist/components/analytics-chart/analytics-chart.d.ts.map +1 -0
- package/dist/components/analytics-chart/analytics-chart.js +1021 -0
- package/dist/components/analytics-chart/analytics-chart.js.map +1 -0
- package/dist/components/analytics-chart/default-analytics-chart-tooltip.d.ts +66 -0
- package/dist/components/analytics-chart/default-analytics-chart-tooltip.d.ts.map +1 -0
- package/dist/components/analytics-chart/default-analytics-chart-tooltip.js +179 -0
- package/dist/components/analytics-chart/default-analytics-chart-tooltip.js.map +1 -0
- package/dist/components/analytics-chart/format.d.ts +13 -0
- package/dist/components/analytics-chart/format.d.ts.map +1 -0
- package/dist/components/analytics-chart/format.js +138 -0
- package/dist/components/analytics-chart/format.js.map +1 -0
- package/dist/components/analytics-chart/index.d.ts +8 -0
- package/dist/components/analytics-chart/index.js +184 -0
- package/dist/components/analytics-chart/palette.d.ts +15 -0
- package/dist/components/analytics-chart/palette.d.ts.map +1 -0
- package/dist/components/analytics-chart/palette.js +60 -0
- package/dist/components/analytics-chart/palette.js.map +1 -0
- package/dist/components/analytics-chart/render-data-series.d.ts +28 -0
- package/dist/components/analytics-chart/render-data-series.d.ts.map +1 -0
- package/dist/components/analytics-chart/render-data-series.js +109 -0
- package/dist/components/analytics-chart/render-data-series.js.map +1 -0
- package/dist/components/analytics-chart/state.d.ts +54 -0
- package/dist/components/analytics-chart/state.d.ts.map +1 -0
- package/dist/components/analytics-chart/state.js +142 -0
- package/dist/components/analytics-chart/state.js.map +1 -0
- package/dist/components/analytics-chart/strings.d.ts +33 -0
- package/dist/components/analytics-chart/strings.d.ts.map +1 -0
- package/dist/components/analytics-chart/strings.js +37 -0
- package/dist/components/analytics-chart/strings.js.map +1 -0
- package/dist/components/analytics-chart/types.d.ts +157 -0
- package/dist/components/analytics-chart/types.d.ts.map +1 -0
- package/dist/components/analytics-chart/types.js +21 -0
- package/dist/components/analytics-chart/types.js.map +1 -0
- package/dist/components/badge.d.ts +40 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +75 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/button.d.ts +46 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +82 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/card.d.ts +87 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +161 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/chart-card.d.ts +50 -0
- package/dist/components/chart-card.d.ts.map +1 -0
- package/dist/components/chart-card.js +83 -0
- package/dist/components/chart-card.js.map +1 -0
- package/dist/components/chart-container.d.ts +51 -0
- package/dist/components/chart-container.d.ts.map +1 -0
- package/dist/components/chart-container.js +77 -0
- package/dist/components/chart-container.js.map +1 -0
- package/dist/components/chart-legend.d.ts +11 -0
- package/dist/components/chart-legend.d.ts.map +1 -0
- package/dist/components/chart-legend.js +37 -0
- package/dist/components/chart-legend.js.map +1 -0
- package/dist/components/chart-theme.d.ts +26 -0
- package/dist/components/chart-theme.d.ts.map +1 -0
- package/dist/components/chart-theme.js +64 -0
- package/dist/components/chart-theme.js.map +1 -0
- package/dist/components/chart-tooltip.d.ts +41 -0
- package/dist/components/chart-tooltip.d.ts.map +1 -0
- package/dist/components/chart-tooltip.js +89 -0
- package/dist/components/chart-tooltip.js.map +1 -0
- package/dist/components/cursor-blast-effect.d.ts +27 -0
- package/dist/components/cursor-blast-effect.d.ts.map +1 -0
- package/dist/components/cursor-blast-effect.js +244 -0
- package/dist/components/cursor-blast-effect.js.map +1 -0
- package/dist/components/data-grid/data-grid-sizing.d.ts +13 -0
- package/dist/components/data-grid/data-grid-sizing.d.ts.map +1 -0
- package/dist/components/data-grid/data-grid-sizing.js +44 -0
- package/dist/components/data-grid/data-grid-sizing.js.map +1 -0
- package/dist/components/data-grid/data-grid-toolbar.d.ts +31 -0
- package/dist/components/data-grid/data-grid-toolbar.d.ts.map +1 -0
- package/dist/components/data-grid/data-grid-toolbar.js +229 -0
- package/dist/components/data-grid/data-grid-toolbar.js.map +1 -0
- package/dist/components/data-grid/data-grid.d.ts +47 -0
- package/dist/components/data-grid/data-grid.d.ts.map +1 -0
- package/dist/components/data-grid/data-grid.js +927 -0
- package/dist/components/data-grid/data-grid.js.map +1 -0
- package/dist/components/data-grid/data-grid.test.d.ts +1 -0
- package/dist/components/data-grid/data-grid.test.js +297 -0
- package/dist/components/data-grid/data-grid.test.js.map +1 -0
- package/dist/components/data-grid/index.d.ts +9 -0
- package/dist/components/data-grid/index.js +148 -0
- package/dist/components/data-grid/state.d.ts +34 -0
- package/dist/components/data-grid/state.d.ts.map +1 -0
- package/dist/components/data-grid/state.js +199 -0
- package/dist/components/data-grid/state.js.map +1 -0
- package/dist/components/data-grid/strings.d.ts +8 -0
- package/dist/components/data-grid/strings.d.ts.map +1 -0
- package/dist/components/data-grid/strings.js +42 -0
- package/dist/components/data-grid/strings.js.map +1 -0
- package/dist/components/data-grid/types.d.ts +278 -0
- package/dist/components/data-grid/types.d.ts.map +1 -0
- package/dist/components/data-grid/types.js +0 -0
- package/dist/components/data-grid/use-data-source.d.ts +85 -0
- package/dist/components/data-grid/use-data-source.d.ts.map +1 -0
- package/dist/components/data-grid/use-data-source.js +244 -0
- package/dist/components/data-grid/use-data-source.js.map +1 -0
- package/dist/components/data-grid/use-url-state.d.ts +38 -0
- package/dist/components/data-grid/use-url-state.d.ts.map +1 -0
- package/dist/components/data-grid/use-url-state.js +214 -0
- package/dist/components/data-grid/use-url-state.js.map +1 -0
- package/dist/components/data-grid/use-url-state.test.d.ts +1 -0
- package/dist/components/data-grid/use-url-state.test.js +91 -0
- package/dist/components/data-grid/use-url-state.test.js.map +1 -0
- package/dist/components/dialog.d.ts +67 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +100 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/edit-mode.d.ts +12 -0
- package/dist/components/edit-mode.d.ts.map +1 -0
- package/dist/components/edit-mode.js +23 -0
- package/dist/components/edit-mode.js.map +1 -0
- package/dist/components/empty-state.d.ts +37 -0
- package/dist/components/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state.js +53 -0
- package/dist/components/empty-state.js.map +1 -0
- package/dist/components/input.d.ts +18 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +53 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/metric-card.d.ts +55 -0
- package/dist/components/metric-card.d.ts.map +1 -0
- package/dist/components/metric-card.js +112 -0
- package/dist/components/metric-card.js.map +1 -0
- package/dist/components/pill-toggle.d.ts +33 -0
- package/dist/components/pill-toggle.d.ts.map +1 -0
- package/dist/components/pill-toggle.js +86 -0
- package/dist/components/pill-toggle.js.map +1 -0
- package/dist/components/progress-bar.d.ts +35 -0
- package/dist/components/progress-bar.d.ts.map +1 -0
- package/dist/components/progress-bar.js +54 -0
- package/dist/components/progress-bar.js.map +1 -0
- package/dist/components/separator.d.ts +23 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/separator.js +29 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/skeleton.d.ts +24 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +30 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/table.d.ts +49 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +84 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +38 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +113 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/dashboard-ui-components.global.js +25539 -0
- package/dist/dashboard-ui-components.global.js.map +7 -0
- package/dist/esm/components/alert.d.ts +22 -0
- package/dist/esm/components/alert.d.ts.map +1 -0
- package/dist/esm/components/alert.js +73 -0
- package/dist/esm/components/alert.js.map +1 -0
- package/dist/esm/components/analytics-chart/analytics-chart-pie.d.ts +67 -0
- package/dist/esm/components/analytics-chart/analytics-chart-pie.d.ts.map +1 -0
- package/dist/esm/components/analytics-chart/analytics-chart-pie.js +251 -0
- package/dist/esm/components/analytics-chart/analytics-chart-pie.js.map +1 -0
- package/dist/esm/components/analytics-chart/analytics-chart.d.ts +554 -0
- package/dist/esm/components/analytics-chart/analytics-chart.d.ts.map +1 -0
- package/dist/esm/components/analytics-chart/analytics-chart.js +1019 -0
- package/dist/esm/components/analytics-chart/analytics-chart.js.map +1 -0
- package/dist/esm/components/analytics-chart/default-analytics-chart-tooltip.d.ts +66 -0
- package/dist/esm/components/analytics-chart/default-analytics-chart-tooltip.d.ts.map +1 -0
- package/dist/esm/components/analytics-chart/default-analytics-chart-tooltip.js +176 -0
- package/dist/esm/components/analytics-chart/default-analytics-chart-tooltip.js.map +1 -0
- package/dist/esm/components/analytics-chart/format.d.ts +13 -0
- package/dist/esm/components/analytics-chart/format.d.ts.map +1 -0
- package/dist/esm/components/analytics-chart/format.js +133 -0
- package/dist/esm/components/analytics-chart/format.js.map +1 -0
- package/dist/esm/components/analytics-chart/index.d.ts +8 -0
- package/dist/esm/components/analytics-chart/index.js +9 -0
- package/dist/esm/components/analytics-chart/palette.d.ts +15 -0
- package/dist/esm/components/analytics-chart/palette.d.ts.map +1 -0
- package/dist/esm/components/analytics-chart/palette.js +55 -0
- package/dist/esm/components/analytics-chart/palette.js.map +1 -0
- package/dist/esm/components/analytics-chart/render-data-series.d.ts +28 -0
- package/dist/esm/components/analytics-chart/render-data-series.d.ts.map +1 -0
- package/dist/esm/components/analytics-chart/render-data-series.js +107 -0
- package/dist/esm/components/analytics-chart/render-data-series.js.map +1 -0
- package/dist/esm/components/analytics-chart/state.d.ts +54 -0
- package/dist/esm/components/analytics-chart/state.d.ts.map +1 -0
- package/dist/esm/components/analytics-chart/state.js +126 -0
- package/dist/esm/components/analytics-chart/state.js.map +1 -0
- package/dist/esm/components/analytics-chart/strings.d.ts +33 -0
- package/dist/esm/components/analytics-chart/strings.d.ts.map +1 -0
- package/dist/esm/components/analytics-chart/strings.js +34 -0
- package/dist/esm/components/analytics-chart/strings.js.map +1 -0
- package/dist/esm/components/analytics-chart/types.d.ts +157 -0
- package/dist/esm/components/analytics-chart/types.d.ts.map +1 -0
- package/dist/esm/components/analytics-chart/types.js +18 -0
- package/dist/esm/components/analytics-chart/types.js.map +1 -0
- package/dist/esm/components/badge.d.ts +40 -0
- package/dist/esm/components/badge.d.ts.map +1 -0
- package/dist/esm/components/badge.js +73 -0
- package/dist/esm/components/badge.js.map +1 -0
- package/dist/esm/components/button.d.ts +46 -0
- package/dist/esm/components/button.d.ts.map +1 -0
- package/dist/esm/components/button.js +79 -0
- package/dist/esm/components/button.js.map +1 -0
- package/dist/esm/components/card.d.ts +87 -0
- package/dist/esm/components/card.d.ts.map +1 -0
- package/dist/esm/components/card.js +155 -0
- package/dist/esm/components/card.js.map +1 -0
- package/dist/esm/components/chart-card.d.ts +50 -0
- package/dist/esm/components/chart-card.d.ts.map +1 -0
- package/dist/esm/components/chart-card.js +80 -0
- package/dist/esm/components/chart-card.js.map +1 -0
- package/dist/esm/components/chart-container.d.ts +51 -0
- package/dist/esm/components/chart-container.d.ts.map +1 -0
- package/dist/esm/components/chart-container.js +70 -0
- package/dist/esm/components/chart-container.js.map +1 -0
- package/dist/esm/components/chart-legend.d.ts +11 -0
- package/dist/esm/components/chart-legend.d.ts.map +1 -0
- package/dist/esm/components/chart-legend.js +34 -0
- package/dist/esm/components/chart-legend.js.map +1 -0
- package/dist/esm/components/chart-theme.d.ts +26 -0
- package/dist/esm/components/chart-theme.d.ts.map +1 -0
- package/dist/esm/components/chart-theme.js +59 -0
- package/dist/esm/components/chart-theme.js.map +1 -0
- package/dist/esm/components/chart-tooltip.d.ts +41 -0
- package/dist/esm/components/chart-tooltip.d.ts.map +1 -0
- package/dist/esm/components/chart-tooltip.js +84 -0
- package/dist/esm/components/chart-tooltip.js.map +1 -0
- package/dist/esm/components/cursor-blast-effect.d.ts +27 -0
- package/dist/esm/components/cursor-blast-effect.d.ts.map +1 -0
- package/dist/esm/components/cursor-blast-effect.js +242 -0
- package/dist/esm/components/cursor-blast-effect.js.map +1 -0
- package/dist/esm/components/data-grid/data-grid-sizing.d.ts +13 -0
- package/dist/esm/components/data-grid/data-grid-sizing.d.ts.map +1 -0
- package/dist/esm/components/data-grid/data-grid-sizing.js +38 -0
- package/dist/esm/components/data-grid/data-grid-sizing.js.map +1 -0
- package/dist/esm/components/data-grid/data-grid-toolbar.d.ts +31 -0
- package/dist/esm/components/data-grid/data-grid-toolbar.d.ts.map +1 -0
- package/dist/esm/components/data-grid/data-grid-toolbar.js +226 -0
- package/dist/esm/components/data-grid/data-grid-toolbar.js.map +1 -0
- package/dist/esm/components/data-grid/data-grid.d.ts +47 -0
- package/dist/esm/components/data-grid/data-grid.d.ts.map +1 -0
- package/dist/esm/components/data-grid/data-grid.js +923 -0
- package/dist/esm/components/data-grid/data-grid.js.map +1 -0
- package/dist/esm/components/data-grid/data-grid.test.d.ts +1 -0
- package/dist/esm/components/data-grid/data-grid.test.js +297 -0
- package/dist/esm/components/data-grid/data-grid.test.js.map +1 -0
- package/dist/esm/components/data-grid/index.d.ts +9 -0
- package/dist/esm/components/data-grid/index.js +9 -0
- package/dist/esm/components/data-grid/state.d.ts +34 -0
- package/dist/esm/components/data-grid/state.d.ts.map +1 -0
- package/dist/esm/components/data-grid/state.js +187 -0
- package/dist/esm/components/data-grid/state.js.map +1 -0
- package/dist/esm/components/data-grid/strings.d.ts +8 -0
- package/dist/esm/components/data-grid/strings.d.ts.map +1 -0
- package/dist/esm/components/data-grid/strings.js +39 -0
- package/dist/esm/components/data-grid/strings.js.map +1 -0
- package/dist/esm/components/data-grid/types.d.ts +278 -0
- package/dist/esm/components/data-grid/types.d.ts.map +1 -0
- package/dist/esm/components/data-grid/types.js +1 -0
- package/dist/esm/components/data-grid/use-data-source.d.ts +85 -0
- package/dist/esm/components/data-grid/use-data-source.d.ts.map +1 -0
- package/dist/esm/components/data-grid/use-data-source.js +242 -0
- package/dist/esm/components/data-grid/use-data-source.js.map +1 -0
- package/dist/esm/components/data-grid/use-url-state.d.ts +38 -0
- package/dist/esm/components/data-grid/use-url-state.d.ts.map +1 -0
- package/dist/esm/components/data-grid/use-url-state.js +212 -0
- package/dist/esm/components/data-grid/use-url-state.js.map +1 -0
- package/dist/esm/components/data-grid/use-url-state.test.d.ts +1 -0
- package/dist/esm/components/data-grid/use-url-state.test.js +91 -0
- package/dist/esm/components/data-grid/use-url-state.test.js.map +1 -0
- package/dist/esm/components/dialog.d.ts +67 -0
- package/dist/esm/components/dialog.d.ts.map +1 -0
- package/dist/esm/components/dialog.js +92 -0
- package/dist/esm/components/dialog.js.map +1 -0
- package/dist/esm/components/edit-mode.d.ts +12 -0
- package/dist/esm/components/edit-mode.d.ts.map +1 -0
- package/dist/esm/components/edit-mode.js +20 -0
- package/dist/esm/components/edit-mode.js.map +1 -0
- package/dist/esm/components/empty-state.d.ts +37 -0
- package/dist/esm/components/empty-state.d.ts.map +1 -0
- package/dist/esm/components/empty-state.js +50 -0
- package/dist/esm/components/empty-state.js.map +1 -0
- package/dist/esm/components/input.d.ts +18 -0
- package/dist/esm/components/input.d.ts.map +1 -0
- package/dist/esm/components/input.js +50 -0
- package/dist/esm/components/input.js.map +1 -0
- package/dist/esm/components/metric-card.d.ts +55 -0
- package/dist/esm/components/metric-card.d.ts.map +1 -0
- package/dist/esm/components/metric-card.js +109 -0
- package/dist/esm/components/metric-card.js.map +1 -0
- package/dist/esm/components/pill-toggle.d.ts +33 -0
- package/dist/esm/components/pill-toggle.d.ts.map +1 -0
- package/dist/esm/components/pill-toggle.js +84 -0
- package/dist/esm/components/pill-toggle.js.map +1 -0
- package/dist/esm/components/progress-bar.d.ts +35 -0
- package/dist/esm/components/progress-bar.d.ts.map +1 -0
- package/dist/esm/components/progress-bar.js +52 -0
- package/dist/esm/components/progress-bar.js.map +1 -0
- package/dist/esm/components/separator.d.ts +23 -0
- package/dist/esm/components/separator.d.ts.map +1 -0
- package/dist/esm/components/separator.js +27 -0
- package/dist/esm/components/separator.js.map +1 -0
- package/dist/esm/components/skeleton.d.ts +24 -0
- package/dist/esm/components/skeleton.d.ts.map +1 -0
- package/dist/esm/components/skeleton.js +28 -0
- package/dist/esm/components/skeleton.js.map +1 -0
- package/dist/esm/components/table.d.ts +49 -0
- package/dist/esm/components/table.d.ts.map +1 -0
- package/dist/esm/components/table.js +76 -0
- package/dist/esm/components/table.js.map +1 -0
- package/dist/esm/components/tabs.d.ts +38 -0
- package/dist/esm/components/tabs.d.ts.map +1 -0
- package/dist/esm/components/tabs.js +111 -0
- package/dist/esm/components/tabs.js.map +1 -0
- package/dist/esm/index.d.ts +24 -0
- package/dist/esm/index.js +27 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +291 -0
- package/package.json +73 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/components/metric-card.d.ts
|
|
5
|
+
type DesignMetricCardGradient = "blue" | "cyan" | "purple" | "green" | "orange" | "default";
|
|
6
|
+
type DesignMetricCardTrend = {
|
|
7
|
+
value: number;
|
|
8
|
+
direction: "up" | "down";
|
|
9
|
+
label?: string;
|
|
10
|
+
};
|
|
11
|
+
type DesignMetricCardProps = {
|
|
12
|
+
label: string;
|
|
13
|
+
value: string | number;
|
|
14
|
+
description?: string;
|
|
15
|
+
trend?: DesignMetricCardTrend;
|
|
16
|
+
icon?: React.ElementType;
|
|
17
|
+
gradient?: DesignMetricCardGradient;
|
|
18
|
+
} & Omit<React.ComponentProps<"div">, "children">;
|
|
19
|
+
/**
|
|
20
|
+
* KPI card for big-number metrics (users, revenue, signups, etc.).
|
|
21
|
+
* Use this instead of a plain `DesignCard` when the value is the focal point.
|
|
22
|
+
*
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <DesignMetricCard
|
|
25
|
+
* label="Total Users"
|
|
26
|
+
* value="1,234"
|
|
27
|
+
* description="+12% from last month"
|
|
28
|
+
* trend={{ direction: "up", value: 12, label: "vs. last period" }}
|
|
29
|
+
* icon={UsersIcon}
|
|
30
|
+
* gradient="blue"
|
|
31
|
+
* />
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* Notes:
|
|
35
|
+
* - `label` is the short caption (NOT `title`).
|
|
36
|
+
* - `value` can be a pre-formatted string ("1,234") or a number — prefer
|
|
37
|
+
* strings so you control the format.
|
|
38
|
+
* - `description` is the subline (NOT `subtitle`).
|
|
39
|
+
* - `trend.value` is a NUMBER, not a pre-formatted "12%" string. The card
|
|
40
|
+
* renders the arrow and formatting.
|
|
41
|
+
* - `icon` is a component type (e.g. `UsersIcon`), not a rendered node.
|
|
42
|
+
*/
|
|
43
|
+
declare function DesignMetricCard({
|
|
44
|
+
label,
|
|
45
|
+
value,
|
|
46
|
+
description,
|
|
47
|
+
trend,
|
|
48
|
+
icon: Icon,
|
|
49
|
+
gradient,
|
|
50
|
+
className,
|
|
51
|
+
...props
|
|
52
|
+
}: DesignMetricCardProps): react_jsx_runtime0.JSX.Element;
|
|
53
|
+
//#endregion
|
|
54
|
+
export { DesignMetricCard, DesignMetricCardProps, DesignMetricCardTrend };
|
|
55
|
+
//# sourceMappingURL=metric-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metric-card.d.ts","names":[],"sources":["../../src/components/metric-card.tsx"],"mappings":";;;;KAKK,wBAAA;AAAA,KAWO,qBAAA;EACV,KAAA;EACA,SAAA;EACA,KAAA;AAAA;AAAA,KAGU,qBAAA;EACV,KAAA;EACA,KAAA;EACA,WAAA;EACA,KAAA,GAAQ,qBAAA;EACR,IAAA,GAAO,KAAA,CAAM,WAAA;EACb,QAAA,GAAW,wBAAA;AAAA,IACT,IAAA,CAAK,KAAA,CAAM,cAAA;;;;AAPf;;;;;;;;;;;;;;;;;;;;;iBAiCgB,gBAAA,CAAA;EACd,KAAA;EACA,KAAA;EACA,WAAA;EACA,KAAA;EACA,IAAA,EAAM,IAAA;EACN,QAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
|
+
let _stackframe_stack_ui = require("@hexclave/ui");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
let react = require("react");
|
|
8
|
+
react = require_chunk.__toESM(react);
|
|
9
|
+
|
|
10
|
+
//#region src/components/metric-card.tsx
|
|
11
|
+
const hoverTintClasses = new Map([
|
|
12
|
+
["blue", "group-hover:bg-blue-500/[0.03]"],
|
|
13
|
+
["cyan", "group-hover:bg-cyan-500/[0.03]"],
|
|
14
|
+
["purple", "group-hover:bg-purple-500/[0.03]"],
|
|
15
|
+
["green", "group-hover:bg-emerald-500/[0.03]"],
|
|
16
|
+
["orange", "group-hover:bg-orange-500/[0.03]"],
|
|
17
|
+
["default", "group-hover:bg-slate-500/[0.02]"]
|
|
18
|
+
]);
|
|
19
|
+
/**
|
|
20
|
+
* KPI card for big-number metrics (users, revenue, signups, etc.).
|
|
21
|
+
* Use this instead of a plain `DesignCard` when the value is the focal point.
|
|
22
|
+
*
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <DesignMetricCard
|
|
25
|
+
* label="Total Users"
|
|
26
|
+
* value="1,234"
|
|
27
|
+
* description="+12% from last month"
|
|
28
|
+
* trend={{ direction: "up", value: 12, label: "vs. last period" }}
|
|
29
|
+
* icon={UsersIcon}
|
|
30
|
+
* gradient="blue"
|
|
31
|
+
* />
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* Notes:
|
|
35
|
+
* - `label` is the short caption (NOT `title`).
|
|
36
|
+
* - `value` can be a pre-formatted string ("1,234") or a number — prefer
|
|
37
|
+
* strings so you control the format.
|
|
38
|
+
* - `description` is the subline (NOT `subtitle`).
|
|
39
|
+
* - `trend.value` is a NUMBER, not a pre-formatted "12%" string. The card
|
|
40
|
+
* renders the arrow and formatting.
|
|
41
|
+
* - `icon` is a component type (e.g. `UsersIcon`), not a rendered node.
|
|
42
|
+
*/
|
|
43
|
+
function DesignMetricCard({ label, value, description, trend, icon: Icon, gradient = "default", className, ...props }) {
|
|
44
|
+
const hoverTintClass = hoverTintClasses.get(gradient) ?? "group-hover:bg-slate-500/[0.02]";
|
|
45
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
46
|
+
className: (0, _stackframe_stack_ui.cn)("group relative rounded-2xl bg-white/90 dark:bg-background/60 backdrop-blur-xl transition-all duration-150 hover:transition-none overflow-hidden", "ring-1 ring-black/[0.06] hover:ring-black/[0.1] dark:ring-white/[0.06] dark:hover:ring-white/[0.1]", "shadow-sm hover:shadow-md", className),
|
|
47
|
+
...props,
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "absolute inset-0 bg-gradient-to-br from-foreground/[0.04] dark:from-foreground/[0.02] to-transparent pointer-events-none rounded-2xl" }),
|
|
50
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: (0, _stackframe_stack_ui.cn)("absolute inset-0 transition-colors duration-150 group-hover:transition-none pointer-events-none rounded-2xl", hoverTintClass) }),
|
|
51
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
52
|
+
className: "relative p-5",
|
|
53
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
54
|
+
className: "flex items-start justify-between gap-3",
|
|
55
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
56
|
+
className: "flex-1 min-w-0",
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
59
|
+
className: "flex items-center gap-2",
|
|
60
|
+
children: [Icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
61
|
+
className: "p-1.5 rounded-lg bg-foreground/[0.06] dark:bg-foreground/[0.04]",
|
|
62
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, { className: "h-3.5 w-3.5 text-foreground/70 dark:text-muted-foreground" })
|
|
63
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
64
|
+
className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider",
|
|
65
|
+
children: label
|
|
66
|
+
})]
|
|
67
|
+
}),
|
|
68
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
69
|
+
className: "mt-3 flex items-baseline gap-2",
|
|
70
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
71
|
+
className: "text-3xl font-bold tabular-nums text-foreground",
|
|
72
|
+
children: typeof value === "number" ? value.toLocaleString() : value
|
|
73
|
+
}), trend && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
74
|
+
className: (0, _stackframe_stack_ui.cn)("inline-flex items-center gap-0.5 text-xs font-medium", trend.direction === "up" ? "text-emerald-600 dark:text-emerald-400" : "text-red-600 dark:text-red-400"),
|
|
75
|
+
children: [
|
|
76
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
|
|
77
|
+
className: (0, _stackframe_stack_ui.cn)("h-3 w-3", trend.direction === "down" && "rotate-180"),
|
|
78
|
+
viewBox: "0 0 12 12",
|
|
79
|
+
fill: "none",
|
|
80
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
81
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
|
|
82
|
+
d: "M6 2.5V9.5M6 2.5L3 5.5M6 2.5L9 5.5",
|
|
83
|
+
stroke: "currentColor",
|
|
84
|
+
strokeWidth: "1.5",
|
|
85
|
+
strokeLinecap: "round",
|
|
86
|
+
strokeLinejoin: "round"
|
|
87
|
+
})
|
|
88
|
+
}),
|
|
89
|
+
trend.value,
|
|
90
|
+
"%",
|
|
91
|
+
trend.label && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
92
|
+
className: "text-muted-foreground ml-0.5",
|
|
93
|
+
children: trend.label
|
|
94
|
+
})
|
|
95
|
+
]
|
|
96
|
+
})]
|
|
97
|
+
}),
|
|
98
|
+
description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
99
|
+
className: "mt-1 text-xs text-muted-foreground",
|
|
100
|
+
children: description
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
})
|
|
104
|
+
})
|
|
105
|
+
})
|
|
106
|
+
]
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
//#endregion
|
|
111
|
+
exports.DesignMetricCard = DesignMetricCard;
|
|
112
|
+
//# sourceMappingURL=metric-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metric-card.js","names":[],"sources":["../../src/components/metric-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@stackframe/stack-ui\";\nimport React from \"react\";\n\ntype DesignMetricCardGradient = \"blue\" | \"cyan\" | \"purple\" | \"green\" | \"orange\" | \"default\";\n\nconst hoverTintClasses = new Map<DesignMetricCardGradient, string>([\n [\"blue\", \"group-hover:bg-blue-500/[0.03]\"],\n [\"cyan\", \"group-hover:bg-cyan-500/[0.03]\"],\n [\"purple\", \"group-hover:bg-purple-500/[0.03]\"],\n [\"green\", \"group-hover:bg-emerald-500/[0.03]\"],\n [\"orange\", \"group-hover:bg-orange-500/[0.03]\"],\n [\"default\", \"group-hover:bg-slate-500/[0.02]\"],\n]);\n\nexport type DesignMetricCardTrend = {\n value: number,\n direction: \"up\" | \"down\",\n label?: string,\n};\n\nexport type DesignMetricCardProps = {\n label: string,\n value: string | number,\n description?: string,\n trend?: DesignMetricCardTrend,\n icon?: React.ElementType,\n gradient?: DesignMetricCardGradient,\n} & Omit<React.ComponentProps<\"div\">, \"children\">;\n\n/**\n * KPI card for big-number metrics (users, revenue, signups, etc.).\n * Use this instead of a plain `DesignCard` when the value is the focal point.\n *\n * ```tsx\n * <DesignMetricCard\n * label=\"Total Users\"\n * value=\"1,234\"\n * description=\"+12% from last month\"\n * trend={{ direction: \"up\", value: 12, label: \"vs. last period\" }}\n * icon={UsersIcon}\n * gradient=\"blue\"\n * />\n * ```\n *\n * Notes:\n * - `label` is the short caption (NOT `title`).\n * - `value` can be a pre-formatted string (\"1,234\") or a number — prefer\n * strings so you control the format.\n * - `description` is the subline (NOT `subtitle`).\n * - `trend.value` is a NUMBER, not a pre-formatted \"12%\" string. The card\n * renders the arrow and formatting.\n * - `icon` is a component type (e.g. `UsersIcon`), not a rendered node.\n */\nexport function DesignMetricCard({\n label,\n value,\n description,\n trend,\n icon: Icon,\n gradient = \"default\",\n className,\n ...props\n}: DesignMetricCardProps) {\n const hoverTintClass = hoverTintClasses.get(gradient) ?? \"group-hover:bg-slate-500/[0.02]\";\n\n return (\n <div\n className={cn(\n \"group relative rounded-2xl bg-white/90 dark:bg-background/60 backdrop-blur-xl transition-all duration-150 hover:transition-none overflow-hidden\",\n \"ring-1 ring-black/[0.06] hover:ring-black/[0.1] dark:ring-white/[0.06] dark:hover:ring-white/[0.1]\",\n \"shadow-sm hover:shadow-md\",\n className\n )}\n {...props}\n >\n <div className=\"absolute inset-0 bg-gradient-to-br from-foreground/[0.04] dark:from-foreground/[0.02] to-transparent pointer-events-none rounded-2xl\" />\n <div\n className={cn(\n \"absolute inset-0 transition-colors duration-150 group-hover:transition-none pointer-events-none rounded-2xl\",\n hoverTintClass\n )}\n />\n <div className=\"relative p-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n {Icon && (\n <div className=\"p-1.5 rounded-lg bg-foreground/[0.06] dark:bg-foreground/[0.04]\">\n <Icon className=\"h-3.5 w-3.5 text-foreground/70 dark:text-muted-foreground\" />\n </div>\n )}\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n {label}\n </span>\n </div>\n <div className=\"mt-3 flex items-baseline gap-2\">\n <span className=\"text-3xl font-bold tabular-nums text-foreground\">\n {typeof value === \"number\" ? value.toLocaleString() : value}\n </span>\n {trend && (\n <span\n className={cn(\n \"inline-flex items-center gap-0.5 text-xs font-medium\",\n trend.direction === \"up\"\n ? \"text-emerald-600 dark:text-emerald-400\"\n : \"text-red-600 dark:text-red-400\"\n )}\n >\n <svg\n className={cn(\"h-3 w-3\", trend.direction === \"down\" && \"rotate-180\")}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 2.5V9.5M6 2.5L3 5.5M6 2.5L9 5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {trend.value}%\n {trend.label && (\n <span className=\"text-muted-foreground ml-0.5\">{trend.label}</span>\n )}\n </span>\n )}\n </div>\n {description && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAOA,MAAM,mBAAmB,IAAI,IAAsC;CACjE,CAAC,QAAQ,iCAAiC;CAC1C,CAAC,QAAQ,iCAAiC;CAC1C,CAAC,UAAU,mCAAmC;CAC9C,CAAC,SAAS,oCAAoC;CAC9C,CAAC,UAAU,mCAAmC;CAC9C,CAAC,WAAW,kCAAkC;CAC/C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AAyCF,SAAgB,iBAAiB,EAC/B,OACA,OACA,aACA,OACA,MAAM,MACN,WAAW,WACX,WACA,GAAG,SACqB;CACxB,MAAM,iBAAiB,iBAAiB,IAAI,SAAS,IAAI;AAEzD,QACE,4CAAC;EACC,wCACE,mJACA,sGACA,6BACA,UACD;EACD,GAAI;;GAEJ,2CAAC,SAAI,WAAU,yIAAyI;GACxJ,2CAAC,SACC,wCACE,+GACA,eACD,GACD;GACF,2CAAC;IAAI,WAAU;cACb,2CAAC;KAAI,WAAU;eACb,4CAAC;MAAI,WAAU;;OACb,4CAAC;QAAI,WAAU;mBACZ,QACC,2CAAC;SAAI,WAAU;mBACb,2CAAC,QAAK,WAAU,8DAA8D;UAC1E,EAER,2CAAC;SAAK,WAAU;mBACb;UACI;SACH;OACN,4CAAC;QAAI,WAAU;mBACb,2CAAC;SAAK,WAAU;mBACb,OAAO,UAAU,WAAW,MAAM,gBAAgB,GAAG;UACjD,EACN,SACC,4CAAC;SACC,wCACE,wDACA,MAAM,cAAc,OAChB,2CACA,iCACL;;UAED,2CAAC;WACC,wCAAc,WAAW,MAAM,cAAc,UAAU,aAAa;WACpE,SAAQ;WACR,MAAK;WACL,OAAM;qBAEN,2CAAC;YACC,GAAE;YACF,QAAO;YACP,aAAY;YACZ,eAAc;YACd,gBAAe;aACf;YACE;UACL,MAAM;UAAM;UACZ,MAAM,SACL,2CAAC;WAAK,WAAU;qBAAgC,MAAM;YAAa;;UAEhE;SAEL;OACL,eACC,2CAAC;QAAE,WAAU;kBACV;SACC;;OAEF;MACF;KACF;;GACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/pill-toggle.d.ts
|
|
4
|
+
type DesignPillToggleSize = "sm" | "md" | "lg";
|
|
5
|
+
type DesignPillToggleGradient = "blue" | "cyan" | "purple" | "green" | "orange" | "default";
|
|
6
|
+
type DesignPillToggleOption = {
|
|
7
|
+
id: string;
|
|
8
|
+
label: string;
|
|
9
|
+
icon?: React.ElementType;
|
|
10
|
+
};
|
|
11
|
+
type DesignPillToggleProps = {
|
|
12
|
+
options: DesignPillToggleOption[];
|
|
13
|
+
selected: string;
|
|
14
|
+
onSelect: (id: string) => void | Promise<void>;
|
|
15
|
+
size?: DesignPillToggleSize;
|
|
16
|
+
glassmorphic?: boolean;
|
|
17
|
+
gradient?: DesignPillToggleGradient; /** When false, hides labels and shows a tooltip on hover instead. Defaults to true. */
|
|
18
|
+
showLabels?: boolean;
|
|
19
|
+
className?: string;
|
|
20
|
+
};
|
|
21
|
+
declare function DesignPillToggle({
|
|
22
|
+
options,
|
|
23
|
+
selected,
|
|
24
|
+
onSelect,
|
|
25
|
+
size,
|
|
26
|
+
glassmorphic: glassmorphicProp,
|
|
27
|
+
gradient,
|
|
28
|
+
showLabels,
|
|
29
|
+
className
|
|
30
|
+
}: DesignPillToggleProps): react_jsx_runtime0.JSX.Element;
|
|
31
|
+
//#endregion
|
|
32
|
+
export { DesignPillToggle, DesignPillToggleOption, DesignPillToggleProps };
|
|
33
|
+
//# sourceMappingURL=pill-toggle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pill-toggle.d.ts","names":[],"sources":["../../src/components/pill-toggle.tsx"],"mappings":";;;KAQK,oBAAA;AAAA,KACA,wBAAA;AAAA,KAEO,sBAAA;EACV,EAAA;EACA,KAAA;EACA,IAAA,GAAO,KAAA,CAAM,WAAA;AAAA;AAAA,KAGH,qBAAA;EACV,OAAA,EAAS,sBAAA;EACT,QAAA;EACA,QAAA,GAAW,EAAA,oBAAsB,OAAA;EACjC,IAAA,GAAO,oBAAA;EACP,YAAA;EACA,QAAA,GAAW,wBAAA,EAZqB;EAchC,UAAA;EACA,SAAA;AAAA;AAAA,iBA+Bc,gBAAA,CAAA;EACd,OAAA;EACA,QAAA;EACA,QAAA;EACA,IAAA;EACA,YAAA,EAAc,gBAAA;EACd,QAAA;EACA,UAAA;EACA;AAAA,GACC,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
|
+
let _stackframe_stack_ui = require("@hexclave/ui");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
let react = require("react");
|
|
8
|
+
let _stackframe_stack_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
|
|
9
|
+
let _radix_ui_react_tooltip = require("@radix-ui/react-tooltip");
|
|
10
|
+
let __card_js = require("./card.js");
|
|
11
|
+
|
|
12
|
+
//#region src/components/pill-toggle.tsx
|
|
13
|
+
const sizeClasses = new Map([
|
|
14
|
+
["sm", {
|
|
15
|
+
button: "px-3 py-1.5 text-xs",
|
|
16
|
+
icon: "h-3.5 w-3.5"
|
|
17
|
+
}],
|
|
18
|
+
["md", {
|
|
19
|
+
button: "px-4 py-2 text-sm",
|
|
20
|
+
icon: "h-4 w-4"
|
|
21
|
+
}],
|
|
22
|
+
["lg", {
|
|
23
|
+
button: "px-5 py-2.5 text-sm",
|
|
24
|
+
icon: "h-4 w-4"
|
|
25
|
+
}]
|
|
26
|
+
]);
|
|
27
|
+
const gradientClasses = new Map([
|
|
28
|
+
["blue", "ring-blue-500/20 dark:ring-blue-400/20"],
|
|
29
|
+
["cyan", "ring-cyan-500/20 dark:ring-cyan-400/20"],
|
|
30
|
+
["purple", "ring-purple-500/20 dark:ring-purple-400/20"],
|
|
31
|
+
["green", "ring-emerald-500/20 dark:ring-emerald-400/20"],
|
|
32
|
+
["orange", "ring-amber-500/20 dark:ring-amber-400/20"],
|
|
33
|
+
["default", "ring-black/[0.12] dark:ring-white/[0.06]"]
|
|
34
|
+
]);
|
|
35
|
+
function getMapValueOrThrow(map, key, mapName) {
|
|
36
|
+
const value = map.get(key);
|
|
37
|
+
if (!value) throw new Error(`Missing ${mapName} entry for key "${String(key)}"`);
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function DesignPillToggle({ options, selected, onSelect, size = "md", glassmorphic: glassmorphicProp, gradient = "default", showLabels = true, className }) {
|
|
41
|
+
const glassmorphic = (0, __card_js.useGlassmorphicDefault)(glassmorphicProp);
|
|
42
|
+
const sizeClass = getMapValueOrThrow(sizeClasses, size, "sizeClasses");
|
|
43
|
+
const activeRingClass = getMapValueOrThrow(gradientClasses, gradient, "gradientClasses");
|
|
44
|
+
const [loadingOptionId, setLoadingOptionId] = (0, react.useState)(null);
|
|
45
|
+
const handleClick = (optionId) => {
|
|
46
|
+
const result = onSelect(optionId);
|
|
47
|
+
if (result && typeof result.then === "function") {
|
|
48
|
+
setLoadingOptionId(optionId);
|
|
49
|
+
(0, _stackframe_stack_shared_dist_utils_promises.runAsynchronouslyWithAlert)(Promise.resolve(result).finally(() => setLoadingOptionId(null)));
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
53
|
+
className: (0, _stackframe_stack_ui.cn)("inline-flex items-center gap-1 p-1 rounded-xl", glassmorphic ? "bg-foreground/[0.04] backdrop-blur-sm" : "bg-black/[0.08] dark:bg-white/[0.04]", className),
|
|
54
|
+
children: options.map((option) => {
|
|
55
|
+
const isActive = selected === option.id;
|
|
56
|
+
const Icon = option.icon;
|
|
57
|
+
const pill = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
58
|
+
onClick: () => handleClick(option.id),
|
|
59
|
+
disabled: loadingOptionId !== null,
|
|
60
|
+
className: (0, _stackframe_stack_ui.cn)("relative flex items-center gap-2 font-medium rounded-lg transition-all duration-150 hover:transition-none", sizeClass.button, isActive ? (0, _stackframe_stack_ui.cn)("bg-background text-foreground shadow-sm ring-1", glassmorphic ? "ring-foreground/[0.06] dark:bg-[hsl(240,71%,70%)]/10 dark:text-[hsl(240,71%,90%)] dark:ring-[hsl(240,71%,70%)]/20" : activeRingClass) : (0, _stackframe_stack_ui.cn)("text-muted-foreground hover:text-foreground", glassmorphic ? "hover:bg-background/50" : "hover:bg-black/[0.06] dark:hover:bg-white/[0.04]")),
|
|
61
|
+
children: [loadingOptionId === option.id && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Spinner, {
|
|
62
|
+
size: 12,
|
|
63
|
+
className: "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-none"
|
|
64
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
65
|
+
className: (0, _stackframe_stack_ui.cn)("flex items-center gap-2", loadingOptionId === option.id && "invisible"),
|
|
66
|
+
children: [Icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, { className: sizeClass.icon }), showLabels && option.label]
|
|
67
|
+
})]
|
|
68
|
+
}, option.id);
|
|
69
|
+
if (!showLabels) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_stackframe_stack_ui.Tooltip, {
|
|
70
|
+
delayDuration: 0,
|
|
71
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TooltipTrigger, {
|
|
72
|
+
asChild: true,
|
|
73
|
+
children: pill
|
|
74
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_tooltip.TooltipPortal, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.TooltipContent, {
|
|
75
|
+
side: "top",
|
|
76
|
+
children: option.label
|
|
77
|
+
}) })]
|
|
78
|
+
}, option.id);
|
|
79
|
+
return pill;
|
|
80
|
+
})
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
//#endregion
|
|
85
|
+
exports.DesignPillToggle = DesignPillToggle;
|
|
86
|
+
//# sourceMappingURL=pill-toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pill-toggle.js","names":["Spinner","Tooltip","TooltipTrigger","TooltipPortal","TooltipContent"],"sources":["../../src/components/pill-toggle.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { cn, Spinner, Tooltip, TooltipContent, TooltipTrigger } from \"@stackframe/stack-ui\";\nimport { TooltipPortal } from \"@radix-ui/react-tooltip\";\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { useGlassmorphicDefault } from \"./card\";\n\ntype DesignPillToggleSize = \"sm\" | \"md\" | \"lg\";\ntype DesignPillToggleGradient = \"blue\" | \"cyan\" | \"purple\" | \"green\" | \"orange\" | \"default\";\n\nexport type DesignPillToggleOption = {\n id: string,\n label: string,\n icon?: React.ElementType,\n};\n\nexport type DesignPillToggleProps = {\n options: DesignPillToggleOption[],\n selected: string,\n onSelect: (id: string) => void | Promise<void>,\n size?: DesignPillToggleSize,\n glassmorphic?: boolean,\n gradient?: DesignPillToggleGradient,\n /** When false, hides labels and shows a tooltip on hover instead. Defaults to true. */\n showLabels?: boolean,\n className?: string,\n};\n\ntype SizeClass = {\n button: string,\n icon: string,\n};\n\nconst sizeClasses = new Map<DesignPillToggleSize, SizeClass>([\n [\"sm\", { button: \"px-3 py-1.5 text-xs\", icon: \"h-3.5 w-3.5\" }],\n [\"md\", { button: \"px-4 py-2 text-sm\", icon: \"h-4 w-4\" }],\n [\"lg\", { button: \"px-5 py-2.5 text-sm\", icon: \"h-4 w-4\" }],\n]);\n\nconst gradientClasses = new Map<DesignPillToggleGradient, string>([\n [\"blue\", \"ring-blue-500/20 dark:ring-blue-400/20\"],\n [\"cyan\", \"ring-cyan-500/20 dark:ring-cyan-400/20\"],\n [\"purple\", \"ring-purple-500/20 dark:ring-purple-400/20\"],\n [\"green\", \"ring-emerald-500/20 dark:ring-emerald-400/20\"],\n [\"orange\", \"ring-amber-500/20 dark:ring-amber-400/20\"],\n [\"default\", \"ring-black/[0.12] dark:ring-white/[0.06]\"],\n]);\n\nfunction getMapValueOrThrow<TKey, TValue>(map: Map<TKey, TValue>, key: TKey, mapName: string) {\n const value = map.get(key);\n if (!value) {\n throw new Error(`Missing ${mapName} entry for key \"${String(key)}\"`);\n }\n return value;\n}\n\nexport function DesignPillToggle({\n options,\n selected,\n onSelect,\n size = \"md\",\n glassmorphic: glassmorphicProp,\n gradient = \"default\",\n showLabels = true,\n className,\n}: DesignPillToggleProps) {\n const glassmorphic = useGlassmorphicDefault(glassmorphicProp);\n const sizeClass = getMapValueOrThrow(sizeClasses, size, \"sizeClasses\");\n const activeRingClass = getMapValueOrThrow(gradientClasses, gradient, \"gradientClasses\");\n\n const [loadingOptionId, setLoadingOptionId] = useState<string | null>(null);\n\n const handleClick = (optionId: string) => {\n const result = onSelect(optionId);\n if (result && typeof (result as Promise<void>).then === \"function\") {\n setLoadingOptionId(optionId);\n runAsynchronouslyWithAlert(\n Promise.resolve(result).finally(() => setLoadingOptionId(null))\n );\n }\n };\n\n return (\n <div\n className={cn(\n \"inline-flex items-center gap-1 p-1 rounded-xl\",\n glassmorphic\n ? \"bg-foreground/[0.04] backdrop-blur-sm\"\n : \"bg-black/[0.08] dark:bg-white/[0.04]\",\n className\n )}\n >\n {options.map((option) => {\n const isActive = selected === option.id;\n const Icon = option.icon;\n\n const pill = (\n <button\n key={option.id}\n onClick={() => handleClick(option.id)}\n disabled={loadingOptionId !== null}\n className={cn(\n \"relative flex items-center gap-2 font-medium rounded-lg transition-all duration-150 hover:transition-none\",\n sizeClass.button,\n isActive\n ? cn(\n \"bg-background text-foreground shadow-sm ring-1\",\n glassmorphic\n ? \"ring-foreground/[0.06] dark:bg-[hsl(240,71%,70%)]/10 dark:text-[hsl(240,71%,90%)] dark:ring-[hsl(240,71%,70%)]/20\"\n : activeRingClass\n )\n : cn(\n \"text-muted-foreground hover:text-foreground\",\n glassmorphic\n ? \"hover:bg-background/50\"\n : \"hover:bg-black/[0.06] dark:hover:bg-white/[0.04]\"\n )\n )}\n >\n {loadingOptionId === option.id && (\n <Spinner\n size={12}\n className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-none\"\n />\n )}\n <span className={cn(\n \"flex items-center gap-2\",\n loadingOptionId === option.id && \"invisible\"\n )}>\n {Icon && <Icon className={sizeClass.icon} />}\n {showLabels && option.label}\n </span>\n </button>\n );\n\n if (!showLabels) {\n return (\n <Tooltip key={option.id} delayDuration={0}>\n <TooltipTrigger asChild>\n {pill}\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent side=\"top\">\n {option.label}\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n );\n }\n\n return pill;\n })}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAkCA,MAAM,cAAc,IAAI,IAAqC;CAC3D,CAAC,MAAM;EAAE,QAAQ;EAAuB,MAAM;EAAe,CAAC;CAC9D,CAAC,MAAM;EAAE,QAAQ;EAAqB,MAAM;EAAW,CAAC;CACxD,CAAC,MAAM;EAAE,QAAQ;EAAuB,MAAM;EAAW,CAAC;CAC3D,CAAC;AAEF,MAAM,kBAAkB,IAAI,IAAsC;CAChE,CAAC,QAAQ,yCAAyC;CAClD,CAAC,QAAQ,yCAAyC;CAClD,CAAC,UAAU,6CAA6C;CACxD,CAAC,SAAS,+CAA+C;CACzD,CAAC,UAAU,2CAA2C;CACtD,CAAC,WAAW,2CAA2C;CACxD,CAAC;AAEF,SAAS,mBAAiC,KAAwB,KAAW,SAAiB;CAC5F,MAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,WAAW,QAAQ,kBAAkB,OAAO,IAAI,CAAC,GAAG;AAEtE,QAAO;;AAGT,SAAgB,iBAAiB,EAC/B,SACA,UACA,UACA,OAAO,MACP,cAAc,kBACd,WAAW,WACX,aAAa,MACb,aACwB;CACxB,MAAM,qDAAsC,iBAAiB;CAC7D,MAAM,YAAY,mBAAmB,aAAa,MAAM,cAAc;CACtE,MAAM,kBAAkB,mBAAmB,iBAAiB,UAAU,kBAAkB;CAExF,MAAM,CAAC,iBAAiB,0CAA8C,KAAK;CAE3E,MAAM,eAAe,aAAqB;EACxC,MAAM,SAAS,SAAS,SAAS;AACjC,MAAI,UAAU,OAAQ,OAAyB,SAAS,YAAY;AAClE,sBAAmB,SAAS;AAC5B,gFACE,QAAQ,QAAQ,OAAO,CAAC,cAAc,mBAAmB,KAAK,CAAC,CAChE;;;AAIL,QACE,2CAAC;EACC,wCACE,iDACA,eACI,0CACA,wCACJ,UACD;YAEA,QAAQ,KAAK,WAAW;GACvB,MAAM,WAAW,aAAa,OAAO;GACrC,MAAM,OAAO,OAAO;GAEpB,MAAM,OACJ,4CAAC;IAEC,eAAe,YAAY,OAAO,GAAG;IACrC,UAAU,oBAAoB;IAC9B,wCACE,6GACA,UAAU,QACV,wCAEI,kDACA,eACI,sHACA,gBACL,gCAEC,+CACA,eACI,2BACA,mDACL,CACJ;eAEA,oBAAoB,OAAO,MAC1B,2CAACA;KACC,MAAM;KACN,WAAU;MACV,EAEJ,4CAAC;KAAK,wCACJ,2BACA,oBAAoB,OAAO,MAAM,YAClC;gBACE,QAAQ,2CAAC,QAAK,WAAW,UAAU,OAAQ,EAC3C,cAAc,OAAO;MACjB;MAjCF,OAAO,GAkCL;AAGX,OAAI,CAAC,WACH,QACE,4CAACC;IAAwB,eAAe;eACtC,2CAACC;KAAe;eACb;MACc,EACjB,2CAACC,mDACC,2CAACC;KAAe,MAAK;eAClB,OAAO;MACO,GACH;MARJ,OAAO,GASX;AAId,UAAO;IACP;GACE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/progress-bar.d.ts
|
|
4
|
+
type DesignProgressBarGradient = "blue" | "cyan" | "purple" | "green" | "orange" | "default";
|
|
5
|
+
type DesignProgressBarProps = {
|
|
6
|
+
value: number;
|
|
7
|
+
max?: number;
|
|
8
|
+
gradient?: DesignProgressBarGradient;
|
|
9
|
+
label?: string;
|
|
10
|
+
showPercentage?: boolean;
|
|
11
|
+
size?: "sm" | "md" | "lg";
|
|
12
|
+
className?: string;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Horizontal progress bar for quota / fill-level indicators. Takes a
|
|
16
|
+
* `value` and optional `max` (defaults to 100 — pass raw values, the
|
|
17
|
+
* component computes the percentage). Optional label + percentage display.
|
|
18
|
+
*
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <DesignProgressBar value={usedSeats} max={totalSeats} label="Seats used" showPercentage />
|
|
21
|
+
* <DesignProgressBar value={75} gradient="green" />
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
declare function DesignProgressBar({
|
|
25
|
+
value,
|
|
26
|
+
max,
|
|
27
|
+
gradient,
|
|
28
|
+
label,
|
|
29
|
+
showPercentage,
|
|
30
|
+
size,
|
|
31
|
+
className
|
|
32
|
+
}: DesignProgressBarProps): react_jsx_runtime0.JSX.Element;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { DesignProgressBar, DesignProgressBarProps };
|
|
35
|
+
//# sourceMappingURL=progress-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-bar.d.ts","names":[],"sources":["../../src/components/progress-bar.tsx"],"mappings":";;;KAIK,yBAAA;AAAA,KAWO,sBAAA;EACV,KAAA;EACA,GAAA;EACA,QAAA,GAAW,yBAAA;EACX,KAAA;EACA,cAAA;EACA,IAAA;EACA,SAAA;AAAA;;;;;;;;;;;iBAac,iBAAA,CAAA;EACd,KAAA;EACA,GAAA;EACA,QAAA;EACA,KAAA;EACA,cAAA;EACA,IAAA;EACA;AAAA,GACC,sBAAA,GAAsB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
|
+
let _stackframe_stack_ui = require("@hexclave/ui");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
|
|
8
|
+
//#region src/components/progress-bar.tsx
|
|
9
|
+
const fillClasses = new Map([
|
|
10
|
+
["blue", "bg-blue-500 dark:bg-blue-400"],
|
|
11
|
+
["cyan", "bg-cyan-500 dark:bg-cyan-400"],
|
|
12
|
+
["purple", "bg-purple-500 dark:bg-purple-400"],
|
|
13
|
+
["green", "bg-emerald-500 dark:bg-emerald-400"],
|
|
14
|
+
["orange", "bg-amber-500 dark:bg-amber-400"],
|
|
15
|
+
["default", "bg-foreground/60"]
|
|
16
|
+
]);
|
|
17
|
+
/**
|
|
18
|
+
* Horizontal progress bar for quota / fill-level indicators. Takes a
|
|
19
|
+
* `value` and optional `max` (defaults to 100 — pass raw values, the
|
|
20
|
+
* component computes the percentage). Optional label + percentage display.
|
|
21
|
+
*
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <DesignProgressBar value={usedSeats} max={totalSeats} label="Seats used" showPercentage />
|
|
24
|
+
* <DesignProgressBar value={75} gradient="green" />
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
function DesignProgressBar({ value, max = 100, gradient = "default", label, showPercentage = false, size = "md", className }) {
|
|
28
|
+
const percentage = max > 0 ? Math.min(Math.max(value / max * 100, 0), 100) : 0;
|
|
29
|
+
const fillClass = fillClasses.get(gradient) ?? "bg-foreground/60";
|
|
30
|
+
const trackHeight = size === "sm" ? "h-1.5" : size === "lg" ? "h-3" : "h-2";
|
|
31
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
32
|
+
className: (0, _stackframe_stack_ui.cn)("w-full", className),
|
|
33
|
+
children: [(label || showPercentage) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
34
|
+
className: "flex items-center justify-between mb-2",
|
|
35
|
+
children: [label && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
36
|
+
className: "text-xs font-medium text-muted-foreground",
|
|
37
|
+
children: label
|
|
38
|
+
}), showPercentage && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
39
|
+
className: "text-xs font-medium tabular-nums text-foreground",
|
|
40
|
+
children: [Math.round(percentage), "%"]
|
|
41
|
+
})]
|
|
42
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
43
|
+
className: (0, _stackframe_stack_ui.cn)("w-full rounded-full bg-black/[0.06] dark:bg-white/[0.06] overflow-hidden", trackHeight),
|
|
44
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
45
|
+
className: (0, _stackframe_stack_ui.cn)("h-full rounded-full transition-all duration-300 ease-out", fillClass),
|
|
46
|
+
style: { width: `${percentage}%` }
|
|
47
|
+
})
|
|
48
|
+
})]
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
exports.DesignProgressBar = DesignProgressBar;
|
|
54
|
+
//# sourceMappingURL=progress-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-bar.js","names":[],"sources":["../../src/components/progress-bar.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@stackframe/stack-ui\";\n\ntype DesignProgressBarGradient = \"blue\" | \"cyan\" | \"purple\" | \"green\" | \"orange\" | \"default\";\n\nconst fillClasses = new Map<DesignProgressBarGradient, string>([\n [\"blue\", \"bg-blue-500 dark:bg-blue-400\"],\n [\"cyan\", \"bg-cyan-500 dark:bg-cyan-400\"],\n [\"purple\", \"bg-purple-500 dark:bg-purple-400\"],\n [\"green\", \"bg-emerald-500 dark:bg-emerald-400\"],\n [\"orange\", \"bg-amber-500 dark:bg-amber-400\"],\n [\"default\", \"bg-foreground/60\"],\n]);\n\nexport type DesignProgressBarProps = {\n value: number,\n max?: number,\n gradient?: DesignProgressBarGradient,\n label?: string,\n showPercentage?: boolean,\n size?: \"sm\" | \"md\" | \"lg\",\n className?: string,\n};\n\n/**\n * Horizontal progress bar for quota / fill-level indicators. Takes a\n * `value` and optional `max` (defaults to 100 — pass raw values, the\n * component computes the percentage). Optional label + percentage display.\n *\n * ```tsx\n * <DesignProgressBar value={usedSeats} max={totalSeats} label=\"Seats used\" showPercentage />\n * <DesignProgressBar value={75} gradient=\"green\" />\n * ```\n */\nexport function DesignProgressBar({\n value,\n max = 100,\n gradient = \"default\",\n label,\n showPercentage = false,\n size = \"md\",\n className,\n}: DesignProgressBarProps) {\n const percentage = max > 0 ? Math.min(Math.max((value / max) * 100, 0), 100) : 0;\n const fillClass = fillClasses.get(gradient) ?? \"bg-foreground/60\";\n\n const trackHeight = size === \"sm\" ? \"h-1.5\" : size === \"lg\" ? \"h-3\" : \"h-2\";\n\n return (\n <div className={cn(\"w-full\", className)}>\n {(label || showPercentage) && (\n <div className=\"flex items-center justify-between mb-2\">\n {label && (\n <span className=\"text-xs font-medium text-muted-foreground\">\n {label}\n </span>\n )}\n {showPercentage && (\n <span className=\"text-xs font-medium tabular-nums text-foreground\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n <div\n className={cn(\n \"w-full rounded-full bg-black/[0.06] dark:bg-white/[0.06] overflow-hidden\",\n trackHeight\n )}\n >\n <div\n className={cn(\n \"h-full rounded-full transition-all duration-300 ease-out\",\n fillClass\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAMA,MAAM,cAAc,IAAI,IAAuC;CAC7D,CAAC,QAAQ,+BAA+B;CACxC,CAAC,QAAQ,+BAA+B;CACxC,CAAC,UAAU,mCAAmC;CAC9C,CAAC,SAAS,qCAAqC;CAC/C,CAAC,UAAU,iCAAiC;CAC5C,CAAC,WAAW,mBAAmB;CAChC,CAAC;;;;;;;;;;;AAsBF,SAAgB,kBAAkB,EAChC,OACA,MAAM,KACN,WAAW,WACX,OACA,iBAAiB,OACjB,OAAO,MACP,aACyB;CACzB,MAAM,aAAa,MAAM,IAAI,KAAK,IAAI,KAAK,IAAK,QAAQ,MAAO,KAAK,EAAE,EAAE,IAAI,GAAG;CAC/E,MAAM,YAAY,YAAY,IAAI,SAAS,IAAI;CAE/C,MAAM,cAAc,SAAS,OAAO,UAAU,SAAS,OAAO,QAAQ;AAEtE,QACE,4CAAC;EAAI,wCAAc,UAAU,UAAU;cACnC,SAAS,mBACT,4CAAC;GAAI,WAAU;cACZ,SACC,2CAAC;IAAK,WAAU;cACb;KACI,EAER,kBACC,4CAAC;IAAK,WAAU;eACb,KAAK,MAAM,WAAW,EAAC;KACnB;IAEL,EAER,2CAAC;GACC,wCACE,4EACA,YACD;aAED,2CAAC;IACC,wCACE,4DACA,UACD;IACD,OAAO,EAAE,OAAO,GAAG,WAAW,IAAI;KAClC;IACE;GACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/separator.d.ts
|
|
4
|
+
type DesignSeparatorProps = {
|
|
5
|
+
orientation?: "horizontal" | "vertical";
|
|
6
|
+
} & React.HTMLAttributes<HTMLDivElement>;
|
|
7
|
+
/**
|
|
8
|
+
* Thin divider line. Use `orientation="vertical"` inside a flex row to
|
|
9
|
+
* separate inline groups, or omit for a horizontal rule between sections.
|
|
10
|
+
*
|
|
11
|
+
* ```tsx
|
|
12
|
+
* <DesignSeparator />
|
|
13
|
+
* <DesignSeparator orientation="vertical" className="h-6" />
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
declare function DesignSeparator({
|
|
17
|
+
orientation,
|
|
18
|
+
className,
|
|
19
|
+
...props
|
|
20
|
+
}: DesignSeparatorProps): react_jsx_runtime0.JSX.Element;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { DesignSeparator, DesignSeparatorProps };
|
|
23
|
+
//# sourceMappingURL=separator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"separator.d.ts","names":[],"sources":["../../src/components/separator.tsx"],"mappings":";;;KAIY,oBAAA;EACV,WAAA;AAAA,IACE,KAAA,CAAM,cAAA,CAAe,cAAA;AAFzB;;;;;;;;;AAAA,iBAagB,eAAA,CAAA;EACd,WAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,oBAAA,GAAoB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
|
+
let _stackframe_stack_ui = require("@hexclave/ui");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
|
|
8
|
+
//#region src/components/separator.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Thin divider line. Use `orientation="vertical"` inside a flex row to
|
|
11
|
+
* separate inline groups, or omit for a horizontal rule between sections.
|
|
12
|
+
*
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <DesignSeparator />
|
|
15
|
+
* <DesignSeparator orientation="vertical" className="h-6" />
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
function DesignSeparator({ orientation = "horizontal", className, ...props }) {
|
|
19
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
20
|
+
role: "separator",
|
|
21
|
+
"aria-orientation": orientation,
|
|
22
|
+
className: (0, _stackframe_stack_ui.cn)(orientation === "horizontal" ? "h-[1px] w-full bg-black/[0.08] dark:bg-white/[0.06]" : "w-[1px] h-full bg-black/[0.08] dark:bg-white/[0.06]", className),
|
|
23
|
+
...props
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
exports.DesignSeparator = DesignSeparator;
|
|
29
|
+
//# sourceMappingURL=separator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"separator.js","names":[],"sources":["../../src/components/separator.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@stackframe/stack-ui\";\n\nexport type DesignSeparatorProps = {\n orientation?: \"horizontal\" | \"vertical\",\n} & React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Thin divider line. Use `orientation=\"vertical\"` inside a flex row to\n * separate inline groups, or omit for a horizontal rule between sections.\n *\n * ```tsx\n * <DesignSeparator />\n * <DesignSeparator orientation=\"vertical\" className=\"h-6\" />\n * ```\n */\nexport function DesignSeparator({\n orientation = \"horizontal\",\n className,\n ...props\n}: DesignSeparatorProps) {\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n className={cn(\n orientation === \"horizontal\"\n ? \"h-[1px] w-full bg-black/[0.08] dark:bg-white/[0.06]\"\n : \"w-[1px] h-full bg-black/[0.08] dark:bg-white/[0.06]\",\n className\n )}\n {...props}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,SAAgB,gBAAgB,EAC9B,cAAc,cACd,WACA,GAAG,SACoB;AACvB,QACE,2CAAC;EACC,MAAK;EACL,oBAAkB;EAClB,wCACE,gBAAgB,eACZ,wDACA,uDACJ,UACD;EACD,GAAI;GACJ"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/components/skeleton.d.ts
|
|
5
|
+
type DesignSkeletonProps = React.HTMLAttributes<HTMLDivElement>;
|
|
6
|
+
/**
|
|
7
|
+
* Animated placeholder block. Use while data is loading — size it via
|
|
8
|
+
* `className` to match the content it's standing in for.
|
|
9
|
+
*
|
|
10
|
+
* ```tsx
|
|
11
|
+
* <DesignSkeleton className="h-4 w-[200px]" />
|
|
12
|
+
* <DesignSkeleton className="h-24 w-full rounded-lg" />
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Rule: always show a skeleton during initial load, not a spinner or
|
|
16
|
+
* "Loading..." text. Skeletons preserve layout and feel faster.
|
|
17
|
+
*/
|
|
18
|
+
declare function DesignSkeleton({
|
|
19
|
+
className,
|
|
20
|
+
...props
|
|
21
|
+
}: DesignSkeletonProps): react_jsx_runtime0.JSX.Element;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { DesignSkeleton, DesignSkeletonProps };
|
|
24
|
+
//# sourceMappingURL=skeleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton.d.ts","names":[],"sources":["../../src/components/skeleton.tsx"],"mappings":";;;;KAKY,mBAAA,GAAsB,KAAA,CAAM,cAAA,CAAe,cAAA;;;AAAvD;;;;;;;;;AAcA;iBAAgB,cAAA,CAAA;EAAiB,SAAA;EAAA,GAAc;AAAA,GAAS,mBAAA,GAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
|
+
let _stackframe_stack_ui = require("@hexclave/ui");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
|
|
8
|
+
//#region src/components/skeleton.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Animated placeholder block. Use while data is loading — size it via
|
|
11
|
+
* `className` to match the content it's standing in for.
|
|
12
|
+
*
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <DesignSkeleton className="h-4 w-[200px]" />
|
|
15
|
+
* <DesignSkeleton className="h-24 w-full rounded-lg" />
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Rule: always show a skeleton during initial load, not a spinner or
|
|
19
|
+
* "Loading..." text. Skeletons preserve layout and feel faster.
|
|
20
|
+
*/
|
|
21
|
+
function DesignSkeleton({ className, ...props }) {
|
|
22
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
23
|
+
className: (0, _stackframe_stack_ui.cn)("animate-pulse rounded-md bg-black/[0.06] dark:bg-white/[0.06]", className),
|
|
24
|
+
...props
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
exports.DesignSkeleton = DesignSkeleton;
|
|
30
|
+
//# sourceMappingURL=skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton.js","names":[],"sources":["../../src/components/skeleton.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@stackframe/stack-ui\";\nimport type React from \"react\";\n\nexport type DesignSkeletonProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Animated placeholder block. Use while data is loading — size it via\n * `className` to match the content it's standing in for.\n *\n * ```tsx\n * <DesignSkeleton className=\"h-4 w-[200px]\" />\n * <DesignSkeleton className=\"h-24 w-full rounded-lg\" />\n * ```\n *\n * Rule: always show a skeleton during initial load, not a spinner or\n * \"Loading...\" text. Skeletons preserve layout and feel faster.\n */\nexport function DesignSkeleton({ className, ...props }: DesignSkeletonProps) {\n return (\n <div\n className={cn(\n \"animate-pulse rounded-md bg-black/[0.06] dark:bg-white/[0.06]\",\n className\n )}\n {...props}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,eAAe,EAAE,WAAW,GAAG,SAA8B;AAC3E,QACE,2CAAC;EACC,wCACE,iEACA,UACD;EACD,GAAI;GACJ"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
//#region src/components/table.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Simple static table — header + rows + cells. Use this for small,
|
|
6
|
+
* read-only lists (< 20 rows, no interaction). For anything that needs
|
|
7
|
+
* sorting, filtering, pagination, or virtualization, use `DataGrid` +
|
|
8
|
+
* `useDataSource` instead.
|
|
9
|
+
*
|
|
10
|
+
* ```tsx
|
|
11
|
+
* <DesignTable>
|
|
12
|
+
* <DesignTableHeader>
|
|
13
|
+
* <DesignTableRow>
|
|
14
|
+
* <DesignTableHead>Name</DesignTableHead>
|
|
15
|
+
* <DesignTableHead>Email</DesignTableHead>
|
|
16
|
+
* </DesignTableRow>
|
|
17
|
+
* </DesignTableHeader>
|
|
18
|
+
* <DesignTableBody>
|
|
19
|
+
* {rows.map(row => (
|
|
20
|
+
* <DesignTableRow key={row.id}>
|
|
21
|
+
* <DesignTableCell>{row.name}</DesignTableCell>
|
|
22
|
+
* <DesignTableCell>{row.email}</DesignTableCell>
|
|
23
|
+
* </DesignTableRow>
|
|
24
|
+
* ))}
|
|
25
|
+
* </DesignTableBody>
|
|
26
|
+
* </DesignTable>
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
declare const DesignTable: React.FC<React.HTMLAttributes<HTMLTableElement> & {
|
|
30
|
+
ref?: React.Ref<HTMLTableElement> | undefined;
|
|
31
|
+
}>;
|
|
32
|
+
declare const DesignTableHeader: React.FC<React.HTMLAttributes<HTMLTableSectionElement> & {
|
|
33
|
+
ref?: React.Ref<HTMLTableSectionElement> | undefined;
|
|
34
|
+
}>;
|
|
35
|
+
declare const DesignTableBody: React.FC<React.HTMLAttributes<HTMLTableSectionElement> & {
|
|
36
|
+
ref?: React.Ref<HTMLTableSectionElement> | undefined;
|
|
37
|
+
}>;
|
|
38
|
+
declare const DesignTableRow: React.FC<React.HTMLAttributes<HTMLTableRowElement> & {
|
|
39
|
+
ref?: React.Ref<HTMLTableRowElement> | undefined;
|
|
40
|
+
}>;
|
|
41
|
+
declare const DesignTableHead: React.FC<React.ThHTMLAttributes<HTMLTableCellElement> & {
|
|
42
|
+
ref?: React.Ref<HTMLTableCellElement> | undefined;
|
|
43
|
+
}>;
|
|
44
|
+
declare const DesignTableCell: React.FC<React.TdHTMLAttributes<HTMLTableCellElement> & {
|
|
45
|
+
ref?: React.Ref<HTMLTableCellElement> | undefined;
|
|
46
|
+
}>;
|
|
47
|
+
//#endregion
|
|
48
|
+
export { DesignTable, DesignTableBody, DesignTableCell, DesignTableHead, DesignTableHeader, DesignTableRow };
|
|
49
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","names":[],"sources":["../../src/components/table.tsx"],"mappings":";;;;;AA+BA;;;;;;;;;;;;;;;;;;;;;AAcA;;cAda,WAAA,EAAW,KAAA,CAAA,EAAA,CAAA,KAAA,CAAA,cAAA,CAAA,gBAAA;;;cAcX,iBAAA,EAAiB,KAAA,CAAA,EAAA,CAAA,KAAA,CAAA,cAAA,CAAA,uBAAA;;;cAYjB,eAAA,EAAe,KAAA,CAAA,EAAA,CAAA,KAAA,CAAA,cAAA,CAAA,uBAAA;;;cAYf,cAAA,EAAc,KAAA,CAAA,EAAA,CAAA,KAAA,CAAA,cAAA,CAAA,mBAAA;;;cAed,eAAA,EAAe,KAAA,CAAA,EAAA,CAAA,KAAA,CAAA,gBAAA,CAAA,oBAAA;;;cAef,eAAA,EAAe,KAAA,CAAA,EAAA,CAAA,KAAA,CAAA,gBAAA,CAAA,oBAAA"}
|