@sero-ai/ui 0.3.2 → 0.4.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/.turbo/turbo-build.log +628 -0
- package/.turbo/turbo-typecheck.log +1 -1
- package/CHANGELOG.md +38 -0
- package/dist/components/context-editor/CapabilitySection.cjs +57 -0
- package/dist/components/context-editor/CapabilitySection.d.cts +20 -0
- package/dist/components/context-editor/CapabilitySection.d.ts +20 -0
- package/dist/components/context-editor/CapabilitySection.js +57 -0
- package/dist/components/context-editor/ContextEditor.cjs +108 -0
- package/dist/components/context-editor/ContextEditor.d.cts +26 -0
- package/dist/components/context-editor/ContextEditor.d.ts +26 -0
- package/dist/components/context-editor/ContextEditor.js +108 -0
- package/dist/components/context-editor/PresetBar.cjs +71 -0
- package/dist/components/context-editor/PresetBar.d.cts +19 -0
- package/dist/components/context-editor/PresetBar.d.ts +19 -0
- package/dist/components/context-editor/PresetBar.js +71 -0
- package/dist/components/context-editor/SkillsSection.cjs +31 -0
- package/dist/components/context-editor/SkillsSection.d.cts +14 -0
- package/dist/components/context-editor/SkillsSection.d.ts +14 -0
- package/dist/components/context-editor/SkillsSection.js +31 -0
- package/dist/components/context-editor/SystemPromptSection.cjs +58 -0
- package/dist/components/context-editor/SystemPromptSection.d.cts +25 -0
- package/dist/components/context-editor/SystemPromptSection.d.ts +25 -0
- package/dist/components/context-editor/SystemPromptSection.js +58 -0
- package/dist/components/context-editor/ToolsSection.cjs +31 -0
- package/dist/components/context-editor/ToolsSection.d.cts +14 -0
- package/dist/components/context-editor/ToolsSection.d.ts +14 -0
- package/dist/components/context-editor/ToolsSection.js +31 -0
- package/dist/components/context-editor/index.cjs +8 -0
- package/dist/components/context-editor/index.d.cts +5 -0
- package/dist/components/context-editor/index.d.ts +5 -0
- package/dist/components/context-editor/index.js +8 -0
- package/dist/components/context-editor/parts.cjs +184 -0
- package/dist/components/context-editor/parts.d.cts +32 -0
- package/dist/components/context-editor/parts.d.ts +32 -0
- package/dist/components/context-editor/parts.js +184 -0
- package/dist/components/context-editor/use-context-editor-model.cjs +194 -0
- package/dist/components/context-editor/use-context-editor-model.d.cts +57 -0
- package/dist/components/context-editor/use-context-editor-model.d.ts +57 -0
- package/dist/components/context-editor/use-context-editor-model.js +194 -0
- package/dist/components/dashboard/activity-list.cjs +59 -0
- package/dist/components/dashboard/activity-list.d.cts +27 -0
- package/dist/components/dashboard/activity-list.d.ts +27 -0
- package/dist/components/dashboard/activity-list.js +59 -0
- package/dist/components/dashboard/catalog.cjs +322 -0
- package/dist/components/dashboard/catalog.d.cts +14 -0
- package/dist/components/dashboard/catalog.d.ts +14 -0
- package/dist/components/dashboard/catalog.js +322 -0
- package/dist/components/dashboard/data-boundary.cjs +29 -0
- package/dist/components/dashboard/data-boundary.d.cts +21 -0
- package/dist/components/dashboard/data-boundary.d.ts +21 -0
- package/dist/components/dashboard/data-boundary.js +29 -0
- package/dist/components/dashboard/empty-state.cjs +49 -0
- package/dist/components/dashboard/empty-state.d.cts +20 -0
- package/dist/components/dashboard/empty-state.d.ts +20 -0
- package/dist/components/dashboard/empty-state.js +49 -0
- package/dist/components/dashboard/icon-button.cjs +40 -0
- package/dist/components/dashboard/icon-button.d.cts +24 -0
- package/dist/components/dashboard/icon-button.d.ts +24 -0
- package/dist/components/dashboard/icon-button.js +40 -0
- package/dist/components/dashboard/index.cjs +15 -0
- package/dist/components/dashboard/index.d.cts +24 -0
- package/dist/components/dashboard/index.d.ts +24 -0
- package/dist/components/dashboard/index.js +15 -0
- package/dist/components/dashboard/item-list.cjs +71 -0
- package/dist/components/dashboard/item-list.d.cts +28 -0
- package/dist/components/dashboard/item-list.d.ts +28 -0
- package/dist/components/dashboard/item-list.js +71 -0
- package/dist/components/dashboard/key-value.cjs +39 -0
- package/dist/components/dashboard/key-value.d.cts +17 -0
- package/dist/components/dashboard/key-value.d.ts +17 -0
- package/dist/components/dashboard/key-value.js +39 -0
- package/dist/components/dashboard/layout.cjs +193 -0
- package/dist/components/dashboard/layout.d.cts +91 -0
- package/dist/components/dashboard/layout.d.ts +91 -0
- package/dist/components/dashboard/layout.js +193 -0
- package/dist/components/dashboard/metric.cjs +98 -0
- package/dist/components/dashboard/metric.d.cts +44 -0
- package/dist/components/dashboard/metric.d.ts +44 -0
- package/dist/components/dashboard/metric.js +98 -0
- package/dist/components/dashboard/progress-ring.cjs +77 -0
- package/dist/components/dashboard/progress-ring.d.cts +25 -0
- package/dist/components/dashboard/progress-ring.d.ts +25 -0
- package/dist/components/dashboard/progress-ring.js +77 -0
- package/dist/components/dashboard/skeletons.cjs +54 -0
- package/dist/components/dashboard/skeletons.d.cts +15 -0
- package/dist/components/dashboard/skeletons.d.ts +15 -0
- package/dist/components/dashboard/skeletons.js +54 -0
- package/dist/components/dashboard/spacing.cjs +10 -0
- package/dist/components/dashboard/spacing.d.cts +4 -0
- package/dist/components/dashboard/spacing.d.ts +4 -0
- package/dist/components/dashboard/spacing.js +10 -0
- package/dist/components/dashboard/stale-indicator.cjs +42 -0
- package/dist/components/dashboard/stale-indicator.d.cts +15 -0
- package/dist/components/dashboard/stale-indicator.d.ts +15 -0
- package/dist/components/dashboard/stale-indicator.js +42 -0
- package/dist/components/dashboard/status.cjs +62 -0
- package/dist/components/dashboard/status.d.cts +15 -0
- package/dist/components/dashboard/status.d.ts +15 -0
- package/dist/components/dashboard/status.js +62 -0
- package/dist/components/dashboard/tone.cjs +26 -0
- package/dist/components/dashboard/tone.d.cts +9 -0
- package/dist/components/dashboard/tone.d.ts +9 -0
- package/dist/components/dashboard/tone.js +26 -0
- package/dist/components/dashboard/typography.cjs +99 -0
- package/dist/components/dashboard/typography.d.cts +57 -0
- package/dist/components/dashboard/typography.d.ts +57 -0
- package/dist/components/dashboard/typography.js +99 -0
- package/dist/components/reference/ActivityExample.cjs +47 -0
- package/dist/components/reference/ActivityExample.d.cts +5 -0
- package/dist/components/reference/ActivityExample.d.ts +5 -0
- package/dist/components/reference/ActivityExample.js +47 -0
- package/dist/components/reference/ResourceExample.cjs +54 -0
- package/dist/components/reference/ResourceExample.d.cts +5 -0
- package/dist/components/reference/ResourceExample.d.ts +5 -0
- package/dist/components/reference/ResourceExample.js +54 -0
- package/dist/components/reference/SchedulerExample.cjs +68 -0
- package/dist/components/reference/SchedulerExample.d.cts +5 -0
- package/dist/components/reference/SchedulerExample.d.ts +5 -0
- package/dist/components/reference/SchedulerExample.js +68 -0
- package/dist/components/reference/StarterExample.cjs +34 -0
- package/dist/components/reference/StarterExample.d.cts +5 -0
- package/dist/components/reference/StarterExample.d.ts +5 -0
- package/dist/components/reference/StarterExample.js +34 -0
- package/dist/components/reference/index.cjs +10 -0
- package/dist/components/reference/index.d.cts +5 -0
- package/dist/components/reference/index.d.ts +5 -0
- package/dist/components/reference/index.js +10 -0
- package/dist/components/ui/badge.cjs +5 -1
- package/dist/components/ui/badge.d.cts +1 -1
- package/dist/components/ui/badge.d.ts +1 -1
- package/dist/components/ui/badge.js +5 -1
- package/dist/dashboard-catalog.cjs +8 -0
- package/dist/dashboard-catalog.d.cts +1 -0
- package/dist/dashboard-catalog.d.ts +1 -0
- package/dist/dashboard-catalog.js +8 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +1 -0
- package/dist/reference.cjs +12 -0
- package/dist/reference.d.cts +5 -0
- package/dist/reference.d.ts +5 -0
- package/dist/reference.js +12 -0
- package/dist/styles/glass-board.css +43 -0
- package/dist/styles/globals.css +59 -0
- package/package.json +70 -41
- package/src/components/context-editor/CapabilitySection.tsx +85 -0
- package/src/components/context-editor/ContextEditor.tsx +138 -0
- package/src/components/context-editor/PresetBar.tsx +94 -0
- package/src/components/context-editor/SkillsSection.tsx +37 -0
- package/src/components/context-editor/SystemPromptSection.tsx +88 -0
- package/src/components/context-editor/ToolsSection.tsx +37 -0
- package/src/components/context-editor/index.ts +7 -0
- package/src/components/context-editor/parts.tsx +217 -0
- package/src/components/context-editor/use-context-editor-model.ts +296 -0
- package/src/components/dashboard/__tests__/catalog.test.ts +57 -0
- package/src/components/dashboard/__tests__/glass.test.tsx +42 -0
- package/src/components/dashboard/__tests__/state.test.tsx +110 -0
- package/src/components/dashboard/__tests__/variants.test.tsx +95 -0
- package/src/components/dashboard/activity-list.tsx +99 -0
- package/src/components/dashboard/catalog.ts +351 -0
- package/src/components/dashboard/data-boundary.tsx +54 -0
- package/src/components/dashboard/empty-state.tsx +70 -0
- package/src/components/dashboard/icon-button.tsx +58 -0
- package/src/components/dashboard/index.ts +21 -0
- package/src/components/dashboard/item-list.tsx +106 -0
- package/src/components/dashboard/key-value.tsx +54 -0
- package/src/components/dashboard/layout.tsx +286 -0
- package/src/components/dashboard/metric.tsx +139 -0
- package/src/components/dashboard/progress-ring.tsx +100 -0
- package/src/components/dashboard/skeletons.tsx +73 -0
- package/src/components/dashboard/spacing.ts +14 -0
- package/src/components/dashboard/stale-indicator.tsx +55 -0
- package/src/components/dashboard/status.tsx +75 -0
- package/src/components/dashboard/tone.ts +35 -0
- package/src/components/dashboard/typography.tsx +151 -0
- package/src/components/reference/ActivityExample.tsx +68 -0
- package/src/components/reference/ResourceExample.tsx +78 -0
- package/src/components/reference/SchedulerExample.tsx +88 -0
- package/src/components/reference/StarterExample.tsx +48 -0
- package/src/components/reference/index.ts +10 -0
- package/src/components/ui/badge.tsx +6 -0
- package/src/dashboard-catalog.ts +13 -0
- package/src/index.ts +5 -0
- package/src/reference.ts +15 -0
- package/src/styles/glass-board.css +43 -0
- package/src/styles/globals.css +59 -0
- package/tsup.config.ts +6 -2
- package/vitest.config.ts +8 -0
- package/LICENSE +0 -201
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { VariantProps } from 'class-variance-authority';
|
|
5
|
+
import { Separator } from '../ui/separator.cjs';
|
|
6
|
+
import { Gap } from './spacing.cjs';
|
|
7
|
+
import 'radix-ui';
|
|
8
|
+
|
|
9
|
+
declare const widgetContentVariants: (props?: ({
|
|
10
|
+
padding?: "sm" | "md" | "lg" | "none" | null | undefined;
|
|
11
|
+
scroll?: boolean | null | undefined;
|
|
12
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
13
|
+
interface WidgetContentProps extends React.ComponentProps<"div">, VariantProps<typeof widgetContentVariants> {
|
|
14
|
+
/**
|
|
15
|
+
* Apply the glass token scope so surfaces read as translucent on the
|
|
16
|
+
* frosted dashboard tile. On by default; set `false` for solid full
|
|
17
|
+
* plugin views (outside a dashboard tile).
|
|
18
|
+
*/
|
|
19
|
+
glass?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** Full-height widget content frame with standard padding + a container query. */
|
|
22
|
+
declare function WidgetContent({ className, padding, scroll, glass, ...props }: WidgetContentProps): react_jsx_runtime.JSX.Element;
|
|
23
|
+
declare const alignClass: {
|
|
24
|
+
readonly start: "items-start";
|
|
25
|
+
readonly center: "items-center";
|
|
26
|
+
readonly end: "items-end";
|
|
27
|
+
readonly stretch: "items-stretch";
|
|
28
|
+
};
|
|
29
|
+
declare const justifyClass: {
|
|
30
|
+
readonly start: "justify-start";
|
|
31
|
+
readonly center: "justify-center";
|
|
32
|
+
readonly end: "justify-end";
|
|
33
|
+
readonly between: "justify-between";
|
|
34
|
+
readonly around: "justify-around";
|
|
35
|
+
};
|
|
36
|
+
interface StackProps extends React.ComponentProps<"div"> {
|
|
37
|
+
gap?: Gap;
|
|
38
|
+
align?: keyof typeof alignClass;
|
|
39
|
+
justify?: keyof typeof justifyClass;
|
|
40
|
+
/**
|
|
41
|
+
* Grow to fill the remaining height of a flex parent (e.g. the top-level
|
|
42
|
+
* Stack under `WidgetContent`, so a nested `scroll` region can bound).
|
|
43
|
+
*/
|
|
44
|
+
fill?: boolean;
|
|
45
|
+
/** Fill remaining height and scroll overflow. Use for the main content flow. */
|
|
46
|
+
scroll?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/** Vertical layout with semantic spacing, alignment and optional scrolling. */
|
|
49
|
+
declare function Stack({ className, gap, align, justify, fill, scroll, ...props }: StackProps): react_jsx_runtime.JSX.Element;
|
|
50
|
+
interface InlineProps extends React.ComponentProps<"div"> {
|
|
51
|
+
gap?: Gap;
|
|
52
|
+
align?: keyof typeof alignClass;
|
|
53
|
+
justify?: keyof typeof justifyClass;
|
|
54
|
+
wrap?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/** Horizontal layout with semantic spacing, alignment, wrap and justify. */
|
|
57
|
+
declare function Inline({ className, gap, align, justify, wrap, ...props }: InlineProps): react_jsx_runtime.JSX.Element;
|
|
58
|
+
declare const columnsClass: {
|
|
59
|
+
readonly 1: "grid-cols-1";
|
|
60
|
+
readonly 2: "grid-cols-2";
|
|
61
|
+
readonly 3: "grid-cols-3";
|
|
62
|
+
readonly 4: "grid-cols-4";
|
|
63
|
+
};
|
|
64
|
+
interface GridProps extends React.ComponentProps<"div"> {
|
|
65
|
+
/** Fixed column count, or `auto` for a responsive min-width fill. */
|
|
66
|
+
columns?: keyof typeof columnsClass | "auto";
|
|
67
|
+
gap?: Gap;
|
|
68
|
+
/** Minimum column width for `columns="auto"`. */
|
|
69
|
+
minColumnWidth?: number;
|
|
70
|
+
}
|
|
71
|
+
/** Responsive grid with bounded columns for metric and summary layouts. */
|
|
72
|
+
declare function Grid({ className, columns, gap, minColumnWidth, style, ...props }: GridProps): react_jsx_runtime.JSX.Element;
|
|
73
|
+
interface SectionProps extends React.ComponentProps<"div"> {
|
|
74
|
+
/** Section heading text or node. Omit for an unlabelled group. */
|
|
75
|
+
heading?: React.ReactNode;
|
|
76
|
+
/** Supporting text shown under the heading. */
|
|
77
|
+
description?: React.ReactNode;
|
|
78
|
+
/** Trailing action aligned to the heading row (e.g. an IconButton). */
|
|
79
|
+
action?: React.ReactNode;
|
|
80
|
+
gap?: Gap;
|
|
81
|
+
}
|
|
82
|
+
/** Compact section with optional heading, description and trailing action. */
|
|
83
|
+
declare function Section({ className, heading, description, action, gap, children, ...props }: SectionProps): react_jsx_runtime.JSX.Element;
|
|
84
|
+
interface DividerProps extends React.ComponentProps<typeof Separator> {
|
|
85
|
+
/** Vertical spacing around a horizontal divider. */
|
|
86
|
+
spacing?: "none" | "sm" | "md";
|
|
87
|
+
}
|
|
88
|
+
/** Compact divider built on the Separator primitive. */
|
|
89
|
+
declare function Divider({ className, orientation, spacing, ...props }: DividerProps): react_jsx_runtime.JSX.Element;
|
|
90
|
+
|
|
91
|
+
export { Divider, type DividerProps, Grid, type GridProps, Inline, type InlineProps, Section, type SectionProps, Stack, type StackProps, WidgetContent, type WidgetContentProps };
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { VariantProps } from 'class-variance-authority';
|
|
5
|
+
import { Separator } from '../ui/separator.js';
|
|
6
|
+
import { Gap } from './spacing.js';
|
|
7
|
+
import 'radix-ui';
|
|
8
|
+
|
|
9
|
+
declare const widgetContentVariants: (props?: ({
|
|
10
|
+
padding?: "sm" | "md" | "lg" | "none" | null | undefined;
|
|
11
|
+
scroll?: boolean | null | undefined;
|
|
12
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
13
|
+
interface WidgetContentProps extends React.ComponentProps<"div">, VariantProps<typeof widgetContentVariants> {
|
|
14
|
+
/**
|
|
15
|
+
* Apply the glass token scope so surfaces read as translucent on the
|
|
16
|
+
* frosted dashboard tile. On by default; set `false` for solid full
|
|
17
|
+
* plugin views (outside a dashboard tile).
|
|
18
|
+
*/
|
|
19
|
+
glass?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** Full-height widget content frame with standard padding + a container query. */
|
|
22
|
+
declare function WidgetContent({ className, padding, scroll, glass, ...props }: WidgetContentProps): react_jsx_runtime.JSX.Element;
|
|
23
|
+
declare const alignClass: {
|
|
24
|
+
readonly start: "items-start";
|
|
25
|
+
readonly center: "items-center";
|
|
26
|
+
readonly end: "items-end";
|
|
27
|
+
readonly stretch: "items-stretch";
|
|
28
|
+
};
|
|
29
|
+
declare const justifyClass: {
|
|
30
|
+
readonly start: "justify-start";
|
|
31
|
+
readonly center: "justify-center";
|
|
32
|
+
readonly end: "justify-end";
|
|
33
|
+
readonly between: "justify-between";
|
|
34
|
+
readonly around: "justify-around";
|
|
35
|
+
};
|
|
36
|
+
interface StackProps extends React.ComponentProps<"div"> {
|
|
37
|
+
gap?: Gap;
|
|
38
|
+
align?: keyof typeof alignClass;
|
|
39
|
+
justify?: keyof typeof justifyClass;
|
|
40
|
+
/**
|
|
41
|
+
* Grow to fill the remaining height of a flex parent (e.g. the top-level
|
|
42
|
+
* Stack under `WidgetContent`, so a nested `scroll` region can bound).
|
|
43
|
+
*/
|
|
44
|
+
fill?: boolean;
|
|
45
|
+
/** Fill remaining height and scroll overflow. Use for the main content flow. */
|
|
46
|
+
scroll?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/** Vertical layout with semantic spacing, alignment and optional scrolling. */
|
|
49
|
+
declare function Stack({ className, gap, align, justify, fill, scroll, ...props }: StackProps): react_jsx_runtime.JSX.Element;
|
|
50
|
+
interface InlineProps extends React.ComponentProps<"div"> {
|
|
51
|
+
gap?: Gap;
|
|
52
|
+
align?: keyof typeof alignClass;
|
|
53
|
+
justify?: keyof typeof justifyClass;
|
|
54
|
+
wrap?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/** Horizontal layout with semantic spacing, alignment, wrap and justify. */
|
|
57
|
+
declare function Inline({ className, gap, align, justify, wrap, ...props }: InlineProps): react_jsx_runtime.JSX.Element;
|
|
58
|
+
declare const columnsClass: {
|
|
59
|
+
readonly 1: "grid-cols-1";
|
|
60
|
+
readonly 2: "grid-cols-2";
|
|
61
|
+
readonly 3: "grid-cols-3";
|
|
62
|
+
readonly 4: "grid-cols-4";
|
|
63
|
+
};
|
|
64
|
+
interface GridProps extends React.ComponentProps<"div"> {
|
|
65
|
+
/** Fixed column count, or `auto` for a responsive min-width fill. */
|
|
66
|
+
columns?: keyof typeof columnsClass | "auto";
|
|
67
|
+
gap?: Gap;
|
|
68
|
+
/** Minimum column width for `columns="auto"`. */
|
|
69
|
+
minColumnWidth?: number;
|
|
70
|
+
}
|
|
71
|
+
/** Responsive grid with bounded columns for metric and summary layouts. */
|
|
72
|
+
declare function Grid({ className, columns, gap, minColumnWidth, style, ...props }: GridProps): react_jsx_runtime.JSX.Element;
|
|
73
|
+
interface SectionProps extends React.ComponentProps<"div"> {
|
|
74
|
+
/** Section heading text or node. Omit for an unlabelled group. */
|
|
75
|
+
heading?: React.ReactNode;
|
|
76
|
+
/** Supporting text shown under the heading. */
|
|
77
|
+
description?: React.ReactNode;
|
|
78
|
+
/** Trailing action aligned to the heading row (e.g. an IconButton). */
|
|
79
|
+
action?: React.ReactNode;
|
|
80
|
+
gap?: Gap;
|
|
81
|
+
}
|
|
82
|
+
/** Compact section with optional heading, description and trailing action. */
|
|
83
|
+
declare function Section({ className, heading, description, action, gap, children, ...props }: SectionProps): react_jsx_runtime.JSX.Element;
|
|
84
|
+
interface DividerProps extends React.ComponentProps<typeof Separator> {
|
|
85
|
+
/** Vertical spacing around a horizontal divider. */
|
|
86
|
+
spacing?: "none" | "sm" | "md";
|
|
87
|
+
}
|
|
88
|
+
/** Compact divider built on the Separator primitive. */
|
|
89
|
+
declare function Divider({ className, orientation, spacing, ...props }: DividerProps): react_jsx_runtime.JSX.Element;
|
|
90
|
+
|
|
91
|
+
export { Divider, type DividerProps, Grid, type GridProps, Inline, type InlineProps, Section, type SectionProps, Stack, type StackProps, WidgetContent, type WidgetContentProps };
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
import { cn } from "../../lib/utils";
|
|
4
|
+
import { Separator } from "../ui/separator";
|
|
5
|
+
import { gapClass } from "./spacing";
|
|
6
|
+
const widgetContentVariants = cva(
|
|
7
|
+
// Full-height frame with a container-query boundary so child components can
|
|
8
|
+
// respond to the widget's own size rather than the viewport.
|
|
9
|
+
"@container/widget flex h-full min-h-0 flex-col",
|
|
10
|
+
{
|
|
11
|
+
variants: {
|
|
12
|
+
padding: {
|
|
13
|
+
none: "p-0",
|
|
14
|
+
sm: "p-2",
|
|
15
|
+
md: "p-3",
|
|
16
|
+
lg: "p-4"
|
|
17
|
+
},
|
|
18
|
+
scroll: {
|
|
19
|
+
true: "overflow-auto",
|
|
20
|
+
false: "overflow-hidden"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
defaultVariants: { padding: "md", scroll: false }
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
function WidgetContent({
|
|
27
|
+
className,
|
|
28
|
+
padding,
|
|
29
|
+
scroll,
|
|
30
|
+
glass = true,
|
|
31
|
+
...props
|
|
32
|
+
}) {
|
|
33
|
+
return /* @__PURE__ */ jsx(
|
|
34
|
+
"div",
|
|
35
|
+
{
|
|
36
|
+
"data-slot": "widget-content",
|
|
37
|
+
className: cn(widgetContentVariants({ padding, scroll }), glass && "glass", className),
|
|
38
|
+
...props
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
const alignClass = {
|
|
43
|
+
start: "items-start",
|
|
44
|
+
center: "items-center",
|
|
45
|
+
end: "items-end",
|
|
46
|
+
stretch: "items-stretch"
|
|
47
|
+
};
|
|
48
|
+
const justifyClass = {
|
|
49
|
+
start: "justify-start",
|
|
50
|
+
center: "justify-center",
|
|
51
|
+
end: "justify-end",
|
|
52
|
+
between: "justify-between",
|
|
53
|
+
around: "justify-around"
|
|
54
|
+
};
|
|
55
|
+
function Stack({
|
|
56
|
+
className,
|
|
57
|
+
gap = "sm",
|
|
58
|
+
align,
|
|
59
|
+
justify,
|
|
60
|
+
fill = false,
|
|
61
|
+
scroll = false,
|
|
62
|
+
...props
|
|
63
|
+
}) {
|
|
64
|
+
return /* @__PURE__ */ jsx(
|
|
65
|
+
"div",
|
|
66
|
+
{
|
|
67
|
+
"data-slot": "stack",
|
|
68
|
+
className: cn(
|
|
69
|
+
"flex flex-col",
|
|
70
|
+
gapClass[gap],
|
|
71
|
+
align && alignClass[align],
|
|
72
|
+
justify && justifyClass[justify],
|
|
73
|
+
(fill || scroll) && "min-h-0 flex-1",
|
|
74
|
+
scroll && "overflow-auto",
|
|
75
|
+
className
|
|
76
|
+
),
|
|
77
|
+
...props
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
function Inline({
|
|
82
|
+
className,
|
|
83
|
+
gap = "sm",
|
|
84
|
+
align = "center",
|
|
85
|
+
justify,
|
|
86
|
+
wrap = false,
|
|
87
|
+
...props
|
|
88
|
+
}) {
|
|
89
|
+
return /* @__PURE__ */ jsx(
|
|
90
|
+
"div",
|
|
91
|
+
{
|
|
92
|
+
"data-slot": "inline",
|
|
93
|
+
className: cn(
|
|
94
|
+
"flex flex-row",
|
|
95
|
+
gapClass[gap],
|
|
96
|
+
alignClass[align],
|
|
97
|
+
justify && justifyClass[justify],
|
|
98
|
+
wrap ? "flex-wrap" : "min-w-0",
|
|
99
|
+
className
|
|
100
|
+
),
|
|
101
|
+
...props
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
const columnsClass = {
|
|
106
|
+
1: "grid-cols-1",
|
|
107
|
+
2: "grid-cols-2",
|
|
108
|
+
3: "grid-cols-3",
|
|
109
|
+
4: "grid-cols-4"
|
|
110
|
+
};
|
|
111
|
+
function Grid({
|
|
112
|
+
className,
|
|
113
|
+
columns = "auto",
|
|
114
|
+
gap = "sm",
|
|
115
|
+
minColumnWidth = 120,
|
|
116
|
+
style,
|
|
117
|
+
...props
|
|
118
|
+
}) {
|
|
119
|
+
const auto = columns === "auto";
|
|
120
|
+
return /* @__PURE__ */ jsx(
|
|
121
|
+
"div",
|
|
122
|
+
{
|
|
123
|
+
"data-slot": "grid",
|
|
124
|
+
className: cn(
|
|
125
|
+
"grid",
|
|
126
|
+
gapClass[gap],
|
|
127
|
+
!auto && columnsClass[columns],
|
|
128
|
+
className
|
|
129
|
+
),
|
|
130
|
+
style: auto ? {
|
|
131
|
+
gridTemplateColumns: `repeat(auto-fill, minmax(${minColumnWidth}px, 1fr))`,
|
|
132
|
+
...style
|
|
133
|
+
} : style,
|
|
134
|
+
...props
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
function Section({
|
|
139
|
+
className,
|
|
140
|
+
heading,
|
|
141
|
+
description,
|
|
142
|
+
action,
|
|
143
|
+
gap = "sm",
|
|
144
|
+
children,
|
|
145
|
+
...props
|
|
146
|
+
}) {
|
|
147
|
+
return /* @__PURE__ */ jsxs(
|
|
148
|
+
"section",
|
|
149
|
+
{
|
|
150
|
+
"data-slot": "section",
|
|
151
|
+
className: cn("flex flex-col", gapClass[gap], className),
|
|
152
|
+
...props,
|
|
153
|
+
children: [
|
|
154
|
+
(heading || action) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
155
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [
|
|
156
|
+
heading && /* @__PURE__ */ jsx("h3", { className: "truncate text-[11px] font-semibold uppercase tracking-wider text-[var(--text-muted)]", children: heading }),
|
|
157
|
+
description && /* @__PURE__ */ jsx("p", { className: "truncate text-xs text-[var(--text-muted)]", children: description })
|
|
158
|
+
] }),
|
|
159
|
+
action && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: action })
|
|
160
|
+
] }),
|
|
161
|
+
children
|
|
162
|
+
]
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
const dividerSpacing = { none: "my-0", sm: "my-1", md: "my-2" };
|
|
167
|
+
function Divider({
|
|
168
|
+
className,
|
|
169
|
+
orientation = "horizontal",
|
|
170
|
+
spacing = "sm",
|
|
171
|
+
...props
|
|
172
|
+
}) {
|
|
173
|
+
return /* @__PURE__ */ jsx(
|
|
174
|
+
Separator,
|
|
175
|
+
{
|
|
176
|
+
"data-slot": "divider",
|
|
177
|
+
orientation,
|
|
178
|
+
className: cn(
|
|
179
|
+
orientation === "horizontal" ? dividerSpacing[spacing] : "mx-1",
|
|
180
|
+
className
|
|
181
|
+
),
|
|
182
|
+
...props
|
|
183
|
+
}
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
export {
|
|
187
|
+
Divider,
|
|
188
|
+
Grid,
|
|
189
|
+
Inline,
|
|
190
|
+
Section,
|
|
191
|
+
Stack,
|
|
192
|
+
WidgetContent
|
|
193
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _jsxruntime = require('react/jsx-runtime');
|
|
2
|
+
var _lucidereact = require('lucide-react');
|
|
3
|
+
var _utils = require('../../lib/utils');
|
|
4
|
+
var _typography = require('./typography');
|
|
5
|
+
var _tone = require('./tone');
|
|
6
|
+
var _layout = require('./layout');
|
|
7
|
+
const trendIcon = {
|
|
8
|
+
up: _lucidereact.ArrowUp,
|
|
9
|
+
down: _lucidereact.ArrowDown,
|
|
10
|
+
flat: _lucidereact.ArrowRight
|
|
11
|
+
};
|
|
12
|
+
function Metric({
|
|
13
|
+
className,
|
|
14
|
+
label,
|
|
15
|
+
value,
|
|
16
|
+
icon,
|
|
17
|
+
supporting,
|
|
18
|
+
trend,
|
|
19
|
+
tone,
|
|
20
|
+
orientation = "vertical",
|
|
21
|
+
...props
|
|
22
|
+
}) {
|
|
23
|
+
const TrendIcon = trend ? trendIcon[trend.direction] : null;
|
|
24
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
25
|
+
"div",
|
|
26
|
+
{
|
|
27
|
+
"data-slot": "metric",
|
|
28
|
+
className: _utils.cn.call(void 0,
|
|
29
|
+
"flex min-w-0",
|
|
30
|
+
orientation === "vertical" ? "flex-col gap-0.5" : "items-center justify-between gap-2",
|
|
31
|
+
className
|
|
32
|
+
),
|
|
33
|
+
...props,
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-1.5", children: [
|
|
36
|
+
icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _typography.Icon, { icon, size: "sm" }),
|
|
37
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "truncate text-[11px] font-medium uppercase tracking-wide text-[var(--text-muted)]", children: label })
|
|
38
|
+
] }),
|
|
39
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-baseline gap-1.5", children: [
|
|
40
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
41
|
+
"span",
|
|
42
|
+
{
|
|
43
|
+
className: _utils.cn.call(void 0,
|
|
44
|
+
"text-lg font-semibold leading-none tabular-nums",
|
|
45
|
+
tone ? _tone.toneColor[tone] : "text-[var(--text-primary)]"
|
|
46
|
+
),
|
|
47
|
+
children: value
|
|
48
|
+
}
|
|
49
|
+
),
|
|
50
|
+
trend && TrendIcon && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
51
|
+
"span",
|
|
52
|
+
{
|
|
53
|
+
className: _utils.cn.call(void 0,
|
|
54
|
+
"inline-flex items-center gap-0.5 text-xs font-medium tabular-nums",
|
|
55
|
+
trend.tone ? _tone.toneColor[trend.tone] : "text-[var(--text-muted)]"
|
|
56
|
+
),
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, TrendIcon, { className: "size-3", "aria-hidden": true }),
|
|
59
|
+
trend.value
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
)
|
|
63
|
+
] }),
|
|
64
|
+
supporting && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "truncate text-xs text-[var(--text-muted)]", children: supporting })
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
function MetricCard({ className, ...props }) {
|
|
70
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
71
|
+
"div",
|
|
72
|
+
{
|
|
73
|
+
"data-slot": "metric-card",
|
|
74
|
+
className: _utils.cn.call(void 0,
|
|
75
|
+
"flex min-w-0 flex-col rounded-lg border border-[var(--surface-line)] bg-[var(--surface-raised)] p-3 shadow-[inset_0_1px_0_var(--surface-rim)]",
|
|
76
|
+
className
|
|
77
|
+
),
|
|
78
|
+
...props
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
function MetricGroup({ columns = "auto", gap = "sm", minColumnWidth = 96, ...props }) {
|
|
83
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
84
|
+
_layout.Grid,
|
|
85
|
+
{
|
|
86
|
+
"data-slot": "metric-group",
|
|
87
|
+
columns,
|
|
88
|
+
gap,
|
|
89
|
+
minColumnWidth,
|
|
90
|
+
...props
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
exports.Metric = Metric; exports.MetricCard = MetricCard; exports.MetricGroup = MetricGroup;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Tone } from './tone.cjs';
|
|
4
|
+
import { GridProps } from './layout.cjs';
|
|
5
|
+
import 'class-variance-authority/types';
|
|
6
|
+
import 'class-variance-authority';
|
|
7
|
+
import '../ui/separator.cjs';
|
|
8
|
+
import 'radix-ui';
|
|
9
|
+
import './spacing.cjs';
|
|
10
|
+
|
|
11
|
+
interface MetricTrend {
|
|
12
|
+
direction: "up" | "down" | "flat";
|
|
13
|
+
/** Change label, e.g. "+12%". */
|
|
14
|
+
value?: React.ReactNode;
|
|
15
|
+
/** Colour of the trend. Defaults to neutral — "up" is not always good. */
|
|
16
|
+
tone?: Tone;
|
|
17
|
+
}
|
|
18
|
+
interface MetricProps extends Omit<React.ComponentProps<"div">, "title"> {
|
|
19
|
+
label: React.ReactNode;
|
|
20
|
+
value: React.ReactNode;
|
|
21
|
+
/** Leading icon component (e.g. a lucide-react icon). */
|
|
22
|
+
icon?: React.ComponentType<{
|
|
23
|
+
className?: string;
|
|
24
|
+
}>;
|
|
25
|
+
/** Supporting text under the value. */
|
|
26
|
+
supporting?: React.ReactNode;
|
|
27
|
+
trend?: MetricTrend;
|
|
28
|
+
/** Semantic colour for the value. */
|
|
29
|
+
tone?: Tone;
|
|
30
|
+
/** Vertical (default) or horizontal label/value arrangement. */
|
|
31
|
+
orientation?: "vertical" | "horizontal";
|
|
32
|
+
}
|
|
33
|
+
/** A single label + value metric, usable inline or inside a MetricCard. */
|
|
34
|
+
declare function Metric({ className, label, value, icon, supporting, trend, tone, orientation, ...props }: MetricProps): react_jsx_runtime.JSX.Element;
|
|
35
|
+
interface MetricCardProps extends React.ComponentProps<"div"> {
|
|
36
|
+
}
|
|
37
|
+
/** A contained surface for a Metric (or any compact summary content). */
|
|
38
|
+
declare function MetricCard({ className, ...props }: MetricCardProps): react_jsx_runtime.JSX.Element;
|
|
39
|
+
interface MetricGroupProps extends GridProps {
|
|
40
|
+
}
|
|
41
|
+
/** Arranges multiple metrics responsively in a bounded grid. */
|
|
42
|
+
declare function MetricGroup({ columns, gap, minColumnWidth, ...props }: MetricGroupProps): react_jsx_runtime.JSX.Element;
|
|
43
|
+
|
|
44
|
+
export { Metric, MetricCard, type MetricCardProps, MetricGroup, type MetricGroupProps, type MetricProps, type MetricTrend };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Tone } from './tone.js';
|
|
4
|
+
import { GridProps } from './layout.js';
|
|
5
|
+
import 'class-variance-authority/types';
|
|
6
|
+
import 'class-variance-authority';
|
|
7
|
+
import '../ui/separator.js';
|
|
8
|
+
import 'radix-ui';
|
|
9
|
+
import './spacing.js';
|
|
10
|
+
|
|
11
|
+
interface MetricTrend {
|
|
12
|
+
direction: "up" | "down" | "flat";
|
|
13
|
+
/** Change label, e.g. "+12%". */
|
|
14
|
+
value?: React.ReactNode;
|
|
15
|
+
/** Colour of the trend. Defaults to neutral — "up" is not always good. */
|
|
16
|
+
tone?: Tone;
|
|
17
|
+
}
|
|
18
|
+
interface MetricProps extends Omit<React.ComponentProps<"div">, "title"> {
|
|
19
|
+
label: React.ReactNode;
|
|
20
|
+
value: React.ReactNode;
|
|
21
|
+
/** Leading icon component (e.g. a lucide-react icon). */
|
|
22
|
+
icon?: React.ComponentType<{
|
|
23
|
+
className?: string;
|
|
24
|
+
}>;
|
|
25
|
+
/** Supporting text under the value. */
|
|
26
|
+
supporting?: React.ReactNode;
|
|
27
|
+
trend?: MetricTrend;
|
|
28
|
+
/** Semantic colour for the value. */
|
|
29
|
+
tone?: Tone;
|
|
30
|
+
/** Vertical (default) or horizontal label/value arrangement. */
|
|
31
|
+
orientation?: "vertical" | "horizontal";
|
|
32
|
+
}
|
|
33
|
+
/** A single label + value metric, usable inline or inside a MetricCard. */
|
|
34
|
+
declare function Metric({ className, label, value, icon, supporting, trend, tone, orientation, ...props }: MetricProps): react_jsx_runtime.JSX.Element;
|
|
35
|
+
interface MetricCardProps extends React.ComponentProps<"div"> {
|
|
36
|
+
}
|
|
37
|
+
/** A contained surface for a Metric (or any compact summary content). */
|
|
38
|
+
declare function MetricCard({ className, ...props }: MetricCardProps): react_jsx_runtime.JSX.Element;
|
|
39
|
+
interface MetricGroupProps extends GridProps {
|
|
40
|
+
}
|
|
41
|
+
/** Arranges multiple metrics responsively in a bounded grid. */
|
|
42
|
+
declare function MetricGroup({ columns, gap, minColumnWidth, ...props }: MetricGroupProps): react_jsx_runtime.JSX.Element;
|
|
43
|
+
|
|
44
|
+
export { Metric, MetricCard, type MetricCardProps, MetricGroup, type MetricGroupProps, type MetricProps, type MetricTrend };
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ArrowDown, ArrowRight, ArrowUp } from "lucide-react";
|
|
3
|
+
import { cn } from "../../lib/utils";
|
|
4
|
+
import { Icon } from "./typography";
|
|
5
|
+
import { toneColor } from "./tone";
|
|
6
|
+
import { Grid } from "./layout";
|
|
7
|
+
const trendIcon = {
|
|
8
|
+
up: ArrowUp,
|
|
9
|
+
down: ArrowDown,
|
|
10
|
+
flat: ArrowRight
|
|
11
|
+
};
|
|
12
|
+
function Metric({
|
|
13
|
+
className,
|
|
14
|
+
label,
|
|
15
|
+
value,
|
|
16
|
+
icon,
|
|
17
|
+
supporting,
|
|
18
|
+
trend,
|
|
19
|
+
tone,
|
|
20
|
+
orientation = "vertical",
|
|
21
|
+
...props
|
|
22
|
+
}) {
|
|
23
|
+
const TrendIcon = trend ? trendIcon[trend.direction] : null;
|
|
24
|
+
return /* @__PURE__ */ jsxs(
|
|
25
|
+
"div",
|
|
26
|
+
{
|
|
27
|
+
"data-slot": "metric",
|
|
28
|
+
className: cn(
|
|
29
|
+
"flex min-w-0",
|
|
30
|
+
orientation === "vertical" ? "flex-col gap-0.5" : "items-center justify-between gap-2",
|
|
31
|
+
className
|
|
32
|
+
),
|
|
33
|
+
...props,
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
36
|
+
icon && /* @__PURE__ */ jsx(Icon, { icon, size: "sm" }),
|
|
37
|
+
/* @__PURE__ */ jsx("span", { className: "truncate text-[11px] font-medium uppercase tracking-wide text-[var(--text-muted)]", children: label })
|
|
38
|
+
] }),
|
|
39
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-1.5", children: [
|
|
40
|
+
/* @__PURE__ */ jsx(
|
|
41
|
+
"span",
|
|
42
|
+
{
|
|
43
|
+
className: cn(
|
|
44
|
+
"text-lg font-semibold leading-none tabular-nums",
|
|
45
|
+
tone ? toneColor[tone] : "text-[var(--text-primary)]"
|
|
46
|
+
),
|
|
47
|
+
children: value
|
|
48
|
+
}
|
|
49
|
+
),
|
|
50
|
+
trend && TrendIcon && /* @__PURE__ */ jsxs(
|
|
51
|
+
"span",
|
|
52
|
+
{
|
|
53
|
+
className: cn(
|
|
54
|
+
"inline-flex items-center gap-0.5 text-xs font-medium tabular-nums",
|
|
55
|
+
trend.tone ? toneColor[trend.tone] : "text-[var(--text-muted)]"
|
|
56
|
+
),
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ jsx(TrendIcon, { className: "size-3", "aria-hidden": true }),
|
|
59
|
+
trend.value
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
)
|
|
63
|
+
] }),
|
|
64
|
+
supporting && /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-[var(--text-muted)]", children: supporting })
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
function MetricCard({ className, ...props }) {
|
|
70
|
+
return /* @__PURE__ */ jsx(
|
|
71
|
+
"div",
|
|
72
|
+
{
|
|
73
|
+
"data-slot": "metric-card",
|
|
74
|
+
className: cn(
|
|
75
|
+
"flex min-w-0 flex-col rounded-lg border border-[var(--surface-line)] bg-[var(--surface-raised)] p-3 shadow-[inset_0_1px_0_var(--surface-rim)]",
|
|
76
|
+
className
|
|
77
|
+
),
|
|
78
|
+
...props
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
function MetricGroup({ columns = "auto", gap = "sm", minColumnWidth = 96, ...props }) {
|
|
83
|
+
return /* @__PURE__ */ jsx(
|
|
84
|
+
Grid,
|
|
85
|
+
{
|
|
86
|
+
"data-slot": "metric-group",
|
|
87
|
+
columns,
|
|
88
|
+
gap,
|
|
89
|
+
minColumnWidth,
|
|
90
|
+
...props
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
export {
|
|
95
|
+
Metric,
|
|
96
|
+
MetricCard,
|
|
97
|
+
MetricGroup
|
|
98
|
+
};
|