@ceebee/ui 0.2.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 +21 -0
- package/README.md +31 -0
- package/dist/client.d.ts +932 -0
- package/dist/client.js +2104 -0
- package/dist/index.d.ts +417 -0
- package/dist/index.js +486 -0
- package/dist/skins/astra.css +30 -0
- package/dist/styles.css +2498 -0
- package/package.json +68 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
/** Joins class names, dropping falsy values. No merge logic: the library never emits
|
|
5
|
+
* conflicting utility classes, so the "last wins" problem tailwind-merge solves does not exist. */
|
|
6
|
+
declare function cn(...parts: Array<string | false | null | undefined>): string;
|
|
7
|
+
type Tone = 'neutral' | 'brand' | 'info' | 'success' | 'warning' | 'danger';
|
|
8
|
+
type Size = 'sm' | 'md' | 'lg';
|
|
9
|
+
type DecorHue = 'violet' | 'blue' | 'teal' | 'green' | 'amber' | 'rose';
|
|
10
|
+
|
|
11
|
+
type SurfaceVariant = 'plain' | 'tinted' | 'glass' | 'gradient';
|
|
12
|
+
interface SurfaceProps {
|
|
13
|
+
variant?: SurfaceVariant;
|
|
14
|
+
/** Semantic colour for `tinted`; ignored by `plain`. */
|
|
15
|
+
tone?: Tone;
|
|
16
|
+
/** Decorative hue for `tinted` / `gradient` — the pastel card set. Wins over `tone`. */
|
|
17
|
+
hue?: DecorHue;
|
|
18
|
+
elevation?: 'none' | 'sm' | 'md' | 'lg';
|
|
19
|
+
radius?: 'sm' | 'md' | 'lg' | 'xl';
|
|
20
|
+
padding?: 'none' | 'sm' | 'md' | 'lg';
|
|
21
|
+
bordered?: boolean;
|
|
22
|
+
className?: string;
|
|
23
|
+
children?: ReactNode;
|
|
24
|
+
/** Renders a different element; the library ships no polymorphic `as` beyond this. */
|
|
25
|
+
asSection?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The panel every raised or tinted thing is built on. Glass and gradient live here as
|
|
29
|
+
* variants rather than being baked into the brand (ADR 0002), so one Skin reproduces the
|
|
30
|
+
* reference board and another produces something sober without touching a component.
|
|
31
|
+
*/
|
|
32
|
+
declare function Surface({ variant, tone, hue, elevation, radius, padding, bordered, className, children, asSection, }: SurfaceProps): react.JSX.Element;
|
|
33
|
+
|
|
34
|
+
type SpaceStep = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
|
|
35
|
+
interface StackProps {
|
|
36
|
+
direction?: 'row' | 'column';
|
|
37
|
+
gap?: SpaceStep;
|
|
38
|
+
align?: 'start' | 'center' | 'end' | 'stretch' | 'baseline';
|
|
39
|
+
justify?: 'start' | 'center' | 'end' | 'between';
|
|
40
|
+
wrap?: boolean;
|
|
41
|
+
className?: string;
|
|
42
|
+
children?: ReactNode;
|
|
43
|
+
}
|
|
44
|
+
/** Flex layout whose gap can only be a spacing token — the reason the library has no raw padding. */
|
|
45
|
+
declare function Stack({ direction, gap, align, justify, wrap, className, children, }: StackProps): react.JSX.Element;
|
|
46
|
+
interface GridProps {
|
|
47
|
+
/** Column count at the widest breakpoint; the grid collapses on its own below it. */
|
|
48
|
+
columns?: 1 | 2 | 3 | 4 | 6 | 12;
|
|
49
|
+
gap?: SpaceStep;
|
|
50
|
+
minItemWidth?: string;
|
|
51
|
+
className?: string;
|
|
52
|
+
children?: ReactNode;
|
|
53
|
+
}
|
|
54
|
+
declare function Grid({ columns, gap, minItemWidth, className, children }: GridProps): react.JSX.Element;
|
|
55
|
+
interface ContainerProps {
|
|
56
|
+
size?: 'sm' | 'md' | 'lg' | 'full';
|
|
57
|
+
className?: string;
|
|
58
|
+
children?: ReactNode;
|
|
59
|
+
}
|
|
60
|
+
declare function Container({ size, className, children }: ContainerProps): react.JSX.Element;
|
|
61
|
+
|
|
62
|
+
interface TextProps {
|
|
63
|
+
size?: 'xs' | 'sm' | 'md' | 'lg';
|
|
64
|
+
tone?: Tone | 'muted' | 'subtle';
|
|
65
|
+
weight?: 'regular' | 'medium' | 'semibold';
|
|
66
|
+
as?: 'p' | 'span' | 'div';
|
|
67
|
+
numeric?: boolean;
|
|
68
|
+
className?: string;
|
|
69
|
+
children?: ReactNode;
|
|
70
|
+
}
|
|
71
|
+
declare function Text({ size, tone, weight, as: Tag, numeric, className, children, }: TextProps): react.JSX.Element;
|
|
72
|
+
interface HeadingProps {
|
|
73
|
+
level?: 1 | 2 | 3 | 4;
|
|
74
|
+
size?: 'lg' | 'xl' | '2xl' | '3xl';
|
|
75
|
+
className?: string;
|
|
76
|
+
children?: ReactNode;
|
|
77
|
+
}
|
|
78
|
+
/** Level and size are separate on purpose: document structure is not a font size. */
|
|
79
|
+
declare function Heading({ level, size, className, children }: HeadingProps): react.JSX.Element;
|
|
80
|
+
|
|
81
|
+
interface BadgeProps {
|
|
82
|
+
children: ReactNode;
|
|
83
|
+
tone?: Tone;
|
|
84
|
+
variant?: 'soft' | 'solid' | 'outline';
|
|
85
|
+
size?: 'sm' | 'md';
|
|
86
|
+
/** Leading dot — for status, where the colour alone would be the only signal. */
|
|
87
|
+
dot?: boolean;
|
|
88
|
+
className?: string;
|
|
89
|
+
}
|
|
90
|
+
/** A label, not a button. If it can be clicked or removed, it is a Tag and needs a control. */
|
|
91
|
+
declare function Badge({ children, tone, variant, size, dot, className }: BadgeProps): react.JSX.Element;
|
|
92
|
+
|
|
93
|
+
interface EmptyStateProps {
|
|
94
|
+
title: ReactNode;
|
|
95
|
+
description?: ReactNode;
|
|
96
|
+
icon?: ReactNode;
|
|
97
|
+
actions?: ReactNode;
|
|
98
|
+
/** `search` reads as "nothing matched", `first-run` as "nothing here yet" — they differ. */
|
|
99
|
+
variant?: 'first-run' | 'search' | 'error';
|
|
100
|
+
className?: string;
|
|
101
|
+
}
|
|
102
|
+
declare function EmptyState({ title, description, icon, actions, variant, className }: EmptyStateProps): react.JSX.Element;
|
|
103
|
+
|
|
104
|
+
interface SpinnerProps {
|
|
105
|
+
size?: 'sm' | 'md' | 'lg';
|
|
106
|
+
tone?: Tone;
|
|
107
|
+
/** Accessible name. Omit only when a nearby live region already says what is loading. */
|
|
108
|
+
label?: string;
|
|
109
|
+
className?: string;
|
|
110
|
+
}
|
|
111
|
+
/** Server-safe: a CSS animation, no state. It stops turning under reduced motion. */
|
|
112
|
+
declare function Spinner({ size, tone, label, className }: SpinnerProps): react.JSX.Element;
|
|
113
|
+
interface ProgressBarProps {
|
|
114
|
+
/** Omit for an indeterminate bar — "something is happening, duration unknown". */
|
|
115
|
+
value?: number;
|
|
116
|
+
max?: number;
|
|
117
|
+
tone?: Tone;
|
|
118
|
+
size?: 'sm' | 'md';
|
|
119
|
+
label: string;
|
|
120
|
+
/** Prints the percentage at the end of the track. */
|
|
121
|
+
showValue?: boolean;
|
|
122
|
+
className?: string;
|
|
123
|
+
}
|
|
124
|
+
declare function ProgressBar({ value, max, tone, size, label, showValue, className }: ProgressBarProps): react.JSX.Element;
|
|
125
|
+
|
|
126
|
+
interface TimelineEntry {
|
|
127
|
+
/** When it happened. Already formatted — the library does not decide date format. */
|
|
128
|
+
time: ReactNode;
|
|
129
|
+
title: ReactNode;
|
|
130
|
+
description?: ReactNode;
|
|
131
|
+
icon?: ReactNode;
|
|
132
|
+
tone?: Tone;
|
|
133
|
+
}
|
|
134
|
+
interface TimelineProps {
|
|
135
|
+
entries: TimelineEntry[];
|
|
136
|
+
className?: string;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* An ordered list of things that happened. Server-safe, and an `<ol>` rather than divs, so the
|
|
140
|
+
* order is a fact a screen reader reads out rather than a visual convention.
|
|
141
|
+
*/
|
|
142
|
+
declare function TimelineRoot({ entries, className }: TimelineProps): react.JSX.Element;
|
|
143
|
+
interface TimelineSkeletonProps {
|
|
144
|
+
entries?: number;
|
|
145
|
+
className?: string;
|
|
146
|
+
}
|
|
147
|
+
declare function TimelineSkeleton({ entries, className }: TimelineSkeletonProps): react.JSX.Element;
|
|
148
|
+
declare const Timeline: typeof TimelineRoot & {
|
|
149
|
+
Skeleton: typeof TimelineSkeleton;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
interface SkeletonProps {
|
|
153
|
+
width?: string;
|
|
154
|
+
height?: string;
|
|
155
|
+
radius?: 'sm' | 'md' | 'lg' | 'full';
|
|
156
|
+
className?: string;
|
|
157
|
+
}
|
|
158
|
+
declare function box({ width, height, radius, className }: SkeletonProps): react.JSX.Element;
|
|
159
|
+
interface SkeletonTextProps {
|
|
160
|
+
lines?: number;
|
|
161
|
+
/** Width of the last line, which is short in real text and should be short here too. */
|
|
162
|
+
lastLineWidth?: string;
|
|
163
|
+
className?: string;
|
|
164
|
+
}
|
|
165
|
+
declare function text({ lines, lastLineWidth, className }: SkeletonTextProps): react.JSX.Element;
|
|
166
|
+
declare function circle({ size, className }: {
|
|
167
|
+
size?: string;
|
|
168
|
+
className?: string;
|
|
169
|
+
}): react.JSX.Element;
|
|
170
|
+
/**
|
|
171
|
+
* Placeholder shapes. Free-form cases use these; every Composition also ships its own
|
|
172
|
+
* `.Skeleton` built from the same tokens as the real thing, so the two cannot drift (ADR 0009).
|
|
173
|
+
*/
|
|
174
|
+
declare const Skeleton: typeof box & {
|
|
175
|
+
Text: typeof text;
|
|
176
|
+
Circle: typeof circle;
|
|
177
|
+
Rect: typeof box;
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
interface ProgressRingProps {
|
|
181
|
+
value: number;
|
|
182
|
+
max?: number;
|
|
183
|
+
size?: number;
|
|
184
|
+
thickness?: number;
|
|
185
|
+
tone?: Tone;
|
|
186
|
+
hue?: DecorHue;
|
|
187
|
+
/** Content in the middle of the ring. Defaults to the rounded percentage. */
|
|
188
|
+
children?: ReactNode;
|
|
189
|
+
/** Accessible name; required because a bare percentage tells a screen reader nothing. */
|
|
190
|
+
label: string;
|
|
191
|
+
className?: string;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* The 84%-style ring the reference board leans on. Hand-written SVG, no charting
|
|
195
|
+
* dependency — it has no axis and no scale, so it is a Widget, not a Chart (ADR 0007).
|
|
196
|
+
*/
|
|
197
|
+
declare function ProgressRing({ value, max, size, thickness, tone, hue, children, label, className, }: ProgressRingProps): react.JSX.Element;
|
|
198
|
+
|
|
199
|
+
/** The ring's geometry, kept out of the component so it can be asserted (ADR 0012). */
|
|
200
|
+
interface RingGeometry {
|
|
201
|
+
radius: number;
|
|
202
|
+
circumference: number;
|
|
203
|
+
/** Stroke offset that renders `value` of `max` as a filled arc. */
|
|
204
|
+
dashOffset: number;
|
|
205
|
+
/** Value clamped into range, for the accessible label and the printed number. */
|
|
206
|
+
clamped: number;
|
|
207
|
+
}
|
|
208
|
+
declare function ringGeometry(value: number, max: number, size: number, thickness: number): RingGeometry;
|
|
209
|
+
|
|
210
|
+
/** Donut arithmetic, kept pure so the awkward inputs are asserted (ADR 0012). */
|
|
211
|
+
interface DonutSlice {
|
|
212
|
+
value: number;
|
|
213
|
+
label: string;
|
|
214
|
+
}
|
|
215
|
+
interface DonutArc extends DonutSlice {
|
|
216
|
+
/** Fraction of the whole, 0–1. */
|
|
217
|
+
fraction: number;
|
|
218
|
+
/** Stroke dash length for this arc, in circumference units. */
|
|
219
|
+
length: number;
|
|
220
|
+
/** Stroke dash offset that positions it after the arcs before it. */
|
|
221
|
+
offset: number;
|
|
222
|
+
index: number;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Turns values into arcs. Negative values are dropped rather than drawn backwards, and a set
|
|
226
|
+
* that sums to zero produces no arcs at all instead of dividing by it.
|
|
227
|
+
*/
|
|
228
|
+
declare function donutArcs(slices: DonutSlice[], circumference: number): DonutArc[];
|
|
229
|
+
|
|
230
|
+
interface DonutProps {
|
|
231
|
+
slices: DonutSlice[];
|
|
232
|
+
size?: number;
|
|
233
|
+
thickness?: number;
|
|
234
|
+
/** Colour per slice, in order. Falls back to the decorative palette. */
|
|
235
|
+
hues?: DecorHue[];
|
|
236
|
+
/** Content in the hole — a total, usually. */
|
|
237
|
+
children?: React.ReactNode;
|
|
238
|
+
label: string;
|
|
239
|
+
className?: string;
|
|
240
|
+
}
|
|
241
|
+
/** A proportion widget, not a chart: no axis, no scale, no tooltip (ADR 0007). */
|
|
242
|
+
declare function Donut({ slices, size, thickness, hues, children, label, className }: DonutProps): react.JSX.Element;
|
|
243
|
+
|
|
244
|
+
interface SparklineProps {
|
|
245
|
+
values: number[];
|
|
246
|
+
width?: number;
|
|
247
|
+
height?: number;
|
|
248
|
+
tone?: Tone;
|
|
249
|
+
hue?: DecorHue;
|
|
250
|
+
/** Fills under the line. Use it when the shape matters more than the exact values. */
|
|
251
|
+
filled?: boolean;
|
|
252
|
+
/** Marks the final point — the "where it ended up" dot. */
|
|
253
|
+
showLast?: boolean;
|
|
254
|
+
label: string;
|
|
255
|
+
className?: string;
|
|
256
|
+
}
|
|
257
|
+
/** Trend at a glance. No axis, no scale, so it is a Widget rather than a Chart (ADR 0007). */
|
|
258
|
+
declare function Sparkline({ values, width, height, tone, hue, filled, showLast, label, className, }: SparklineProps): react.JSX.Element;
|
|
259
|
+
interface BarMiniProps {
|
|
260
|
+
values: number[];
|
|
261
|
+
width?: number;
|
|
262
|
+
height?: number;
|
|
263
|
+
tone?: Tone;
|
|
264
|
+
hue?: DecorHue;
|
|
265
|
+
label: string;
|
|
266
|
+
className?: string;
|
|
267
|
+
}
|
|
268
|
+
/** The same idea in bars, for counts rather than a continuous series. */
|
|
269
|
+
declare function BarMini({ values, width, height, tone, hue, label, className }: BarMiniProps): react.JSX.Element;
|
|
270
|
+
|
|
271
|
+
/** Sparkline geometry. Pure, because an off-by-one here silently draws a wrong shape. */
|
|
272
|
+
interface SparklineGeometry {
|
|
273
|
+
/** `M…L…` path through every point. Empty when there is nothing to draw. */
|
|
274
|
+
line: string;
|
|
275
|
+
/** The same path closed along the baseline, for the filled variant. */
|
|
276
|
+
area: string;
|
|
277
|
+
points: Array<{
|
|
278
|
+
x: number;
|
|
279
|
+
y: number;
|
|
280
|
+
}>;
|
|
281
|
+
}
|
|
282
|
+
declare function sparklineGeometry(values: number[], width: number, height: number, padding?: number): SparklineGeometry;
|
|
283
|
+
|
|
284
|
+
interface LeaderboardEntry {
|
|
285
|
+
id: string;
|
|
286
|
+
name: string;
|
|
287
|
+
/** Already formatted — the library does not decide what a score looks like. */
|
|
288
|
+
score: ReactNode;
|
|
289
|
+
avatarSrc?: string;
|
|
290
|
+
detail?: ReactNode;
|
|
291
|
+
/** Movement since the last ranking. */
|
|
292
|
+
delta?: {
|
|
293
|
+
value: string;
|
|
294
|
+
direction: 'up' | 'down' | 'flat';
|
|
295
|
+
};
|
|
296
|
+
/** Marks the viewer's own row, wherever it sits. */
|
|
297
|
+
you?: boolean;
|
|
298
|
+
hue?: DecorHue;
|
|
299
|
+
}
|
|
300
|
+
interface LeaderboardProps {
|
|
301
|
+
entries: LeaderboardEntry[];
|
|
302
|
+
/** Names the list; required, because a bare ranked list says nothing on its own. */
|
|
303
|
+
label: string;
|
|
304
|
+
/** Ranks 1–3 get a medal tint. Turn it off for a plain ranked list. */
|
|
305
|
+
medals?: boolean;
|
|
306
|
+
className?: string;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* A ranked list — the gamified board pattern. Server-safe, and an `<ol>`, so the ranking is a
|
|
310
|
+
* fact a screen reader reads out rather than a column of numbers it has to infer.
|
|
311
|
+
*/
|
|
312
|
+
declare function LeaderboardRoot({ entries, label, medals, className }: LeaderboardProps): react.JSX.Element;
|
|
313
|
+
interface LeaderboardSkeletonProps {
|
|
314
|
+
rows?: number;
|
|
315
|
+
className?: string;
|
|
316
|
+
}
|
|
317
|
+
/** Same row geometry as the real list, so the panel does not resize on load (ADR 0009). */
|
|
318
|
+
declare function LeaderboardSkeleton({ rows, className }: LeaderboardSkeletonProps): react.JSX.Element;
|
|
319
|
+
declare const Leaderboard: typeof LeaderboardRoot & {
|
|
320
|
+
Skeleton: typeof LeaderboardSkeleton;
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
interface AvatarProps {
|
|
324
|
+
/** The person or thing. Used for the accessible name, the initials, and the fallback hue. */
|
|
325
|
+
name: string;
|
|
326
|
+
src?: string;
|
|
327
|
+
size?: 'sm' | 'md' | 'lg' | 'xl';
|
|
328
|
+
/** Overrides the hue derived from the name. */
|
|
329
|
+
hue?: DecorHue;
|
|
330
|
+
/** Presence dot. */
|
|
331
|
+
status?: 'online' | 'busy' | 'away' | 'offline';
|
|
332
|
+
className?: string;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Server-safe: no image-load state, no hooks. The initials render underneath and the image
|
|
336
|
+
* covers them when it loads, so a broken URL degrades to initials without JavaScript.
|
|
337
|
+
*/
|
|
338
|
+
declare function Avatar({ name, src, size, hue, status, className }: AvatarProps): react.JSX.Element;
|
|
339
|
+
interface AvatarGroupProps {
|
|
340
|
+
children: ReactNode;
|
|
341
|
+
/** Rendered as "+N" after the stack. */
|
|
342
|
+
overflow?: number;
|
|
343
|
+
size?: AvatarProps['size'];
|
|
344
|
+
className?: string;
|
|
345
|
+
}
|
|
346
|
+
declare function AvatarGroup({ children, overflow, size, className }: AvatarGroupProps): react.JSX.Element;
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* First letter of the first and last word. Two letters at most, because three stop fitting
|
|
350
|
+
* in the small size and a clipped initial reads as a rendering bug.
|
|
351
|
+
*/
|
|
352
|
+
declare function initialsOf(name: string): string;
|
|
353
|
+
/** Stable hue per name, so the same person keeps their colour across sessions and devices. */
|
|
354
|
+
declare function hueForName(name: string): DecorHue;
|
|
355
|
+
|
|
356
|
+
interface Crumb {
|
|
357
|
+
label: ReactNode;
|
|
358
|
+
href?: string;
|
|
359
|
+
onClick?: () => void;
|
|
360
|
+
}
|
|
361
|
+
interface BreadcrumbsProps {
|
|
362
|
+
items: Crumb[];
|
|
363
|
+
/** Collapses the middle when the trail is longer than this. */
|
|
364
|
+
maxItems?: number;
|
|
365
|
+
className?: string;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Server-safe. The last crumb is the current page: it is text with `aria-current`, not a link,
|
|
369
|
+
* because a link to where you already are is a dead end for keyboard and screen reader users.
|
|
370
|
+
*/
|
|
371
|
+
declare function Breadcrumbs({ items, maxItems, className }: BreadcrumbsProps): react.JSX.Element;
|
|
372
|
+
|
|
373
|
+
interface Step {
|
|
374
|
+
label: ReactNode;
|
|
375
|
+
description?: ReactNode;
|
|
376
|
+
}
|
|
377
|
+
interface StepperProps {
|
|
378
|
+
steps: Step[];
|
|
379
|
+
/** Zero-based index of the step in progress. */
|
|
380
|
+
current: number;
|
|
381
|
+
orientation?: 'horizontal' | 'vertical';
|
|
382
|
+
className?: string;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Progress through an ordered sequence — the thing Tabs must not be used for. Server-safe:
|
|
386
|
+
* it displays position, it does not navigate.
|
|
387
|
+
*/
|
|
388
|
+
declare function Stepper({ steps, current, orientation, className }: StepperProps): react.JSX.Element;
|
|
389
|
+
|
|
390
|
+
interface StatCardProps {
|
|
391
|
+
label: string;
|
|
392
|
+
value: ReactNode;
|
|
393
|
+
/** Signed change, e.g. `+12.4%`. Direction decides the colour, not the caller. */
|
|
394
|
+
delta?: {
|
|
395
|
+
value: string;
|
|
396
|
+
direction: 'up' | 'down' | 'flat';
|
|
397
|
+
};
|
|
398
|
+
caption?: string;
|
|
399
|
+
hue?: DecorHue;
|
|
400
|
+
icon?: ReactNode;
|
|
401
|
+
/** A Widget (ProgressRing, Sparkline) shown to the side. */
|
|
402
|
+
visual?: ReactNode;
|
|
403
|
+
className?: string;
|
|
404
|
+
}
|
|
405
|
+
/** The tinted metric tile the reference board repeats on every dashboard. */
|
|
406
|
+
declare function StatCard({ label, value, delta, caption, hue, icon, visual, className }: StatCardProps): react.JSX.Element;
|
|
407
|
+
declare namespace StatCard {
|
|
408
|
+
var Skeleton: typeof StatCardSkeleton;
|
|
409
|
+
}
|
|
410
|
+
interface StatCardSkeletonProps {
|
|
411
|
+
withVisual?: boolean;
|
|
412
|
+
className?: string;
|
|
413
|
+
}
|
|
414
|
+
/** Built from StatCard's own spacing, so the tile does not resize when data arrives (ADR 0009). */
|
|
415
|
+
declare function StatCardSkeleton({ withVisual, className }: StatCardSkeletonProps): react.JSX.Element;
|
|
416
|
+
|
|
417
|
+
export { Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, Badge, type BadgeProps, BarMini, type BarMiniProps, Breadcrumbs, type BreadcrumbsProps, Container, type ContainerProps, type Crumb, type DecorHue, Donut, type DonutArc, type DonutProps, type DonutSlice, EmptyState, type EmptyStateProps, Grid, type GridProps, Heading, type HeadingProps, Leaderboard, type LeaderboardEntry, type LeaderboardProps, type LeaderboardSkeletonProps, ProgressBar, type ProgressBarProps, ProgressRing, type ProgressRingProps, type RingGeometry, type Size, Skeleton, type SkeletonProps, type SkeletonTextProps, Sparkline, type SparklineGeometry, type SparklineProps, Spinner, type SpinnerProps, Stack, type StackProps, StatCard, type StatCardProps, type StatCardSkeletonProps, type Step, Stepper, type StepperProps, Surface, type SurfaceProps, type SurfaceVariant, Text, type TextProps, Timeline, type TimelineEntry, type TimelineProps, type TimelineSkeletonProps, type Tone, cn, donutArcs, hueForName, initialsOf, ringGeometry, sparklineGeometry };
|