@makolabs/ripple 2.5.8 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +403 -497
- package/dist/adapters/storage/S3Adapter.d.ts +49 -1
- package/dist/adapters/storage/S3Adapter.js +38 -1
- package/dist/adapters/storage/types.d.ts +20 -0
- package/dist/ai/AIChatInterface.svelte +2 -1
- package/dist/ai/AIChatInterface.svelte.d.ts +2 -1
- package/dist/ai/CodeRenderer.svelte +7 -2
- package/dist/ai/CodeRenderer.svelte.d.ts +2 -1
- package/dist/ai/ComposeDropdown.svelte +1 -1
- package/dist/ai/MessageBox.svelte +3 -3
- package/dist/ai/MessageBox.svelte.d.ts +3 -2
- package/dist/ai/ThinkingDisplay.svelte +4 -3
- package/dist/ai/ThinkingDisplay.svelte.d.ts +2 -1
- package/dist/ai/ai-types.d.ts +55 -1
- package/dist/button/Button.svelte +5 -5
- package/dist/button/button-types.d.ts +49 -4
- package/dist/button/button.d.ts +9 -9
- package/dist/button/button.js +6 -6
- package/dist/charts/Chart.svelte +8 -16
- package/dist/charts/chart-types.d.ts +78 -1
- package/dist/drawer/Drawer.svelte +6 -26
- package/dist/drawer/drawer-types.d.ts +33 -12
- package/dist/drawer/drawer.d.ts +3 -3
- package/dist/drawer/drawer.js +1 -1
- package/dist/elements/accordion/Accordion.svelte +6 -17
- package/dist/elements/accordion/accordion-types.d.ts +53 -6
- package/dist/elements/alert/Alert.svelte +3 -0
- package/dist/elements/badge/Badge.svelte +1 -1
- package/dist/elements/badge/badge-types.d.ts +22 -0
- package/dist/elements/badge/badge.d.ts +3 -3
- package/dist/elements/badge/badge.js +1 -1
- package/dist/elements/combobox/ComboBox.svelte +247 -0
- package/dist/elements/combobox/ComboBox.svelte.d.ts +4 -0
- package/dist/elements/combobox/combobox-types.d.ts +41 -0
- package/dist/elements/combobox/combobox-types.js +1 -0
- package/dist/elements/context-menu/ContextMenu.svelte +137 -0
- package/dist/elements/context-menu/ContextMenu.svelte.d.ts +4 -0
- package/dist/elements/context-menu/context-menu-types.d.ts +40 -0
- package/dist/elements/context-menu/context-menu-types.js +1 -0
- package/dist/elements/dropdown/Dropdown.svelte +1 -1
- package/dist/elements/dropdown/Select.svelte +4 -1
- package/dist/elements/dropdown/dropdown-types.d.ts +114 -0
- package/dist/elements/dropdown/dropdown.d.ts +3 -3
- package/dist/elements/dropdown/dropdown.js +2 -2
- package/dist/elements/dropdown/select.d.ts +3 -3
- package/dist/elements/dropdown/select.js +2 -2
- package/dist/elements/empty-state/EmptyState.svelte +1 -1
- package/dist/elements/empty-state/empty-state-types.d.ts +32 -1
- package/dist/elements/empty-state/empty-state.d.ts +3 -3
- package/dist/elements/empty-state/empty-state.js +2 -2
- package/dist/elements/file-upload/FileUpload.svelte +5 -0
- package/dist/elements/file-upload/file-upload-types.d.ts +59 -0
- package/dist/elements/pagination/Pagination.svelte +53 -21
- package/dist/elements/pagination/Pagination.svelte.d.ts +33 -5
- package/dist/elements/popover/Popover.svelte +234 -0
- package/dist/elements/popover/Popover.svelte.d.ts +4 -0
- package/dist/elements/popover/index.d.ts +2 -0
- package/dist/elements/popover/index.js +1 -0
- package/dist/elements/popover/popover-types.d.ts +60 -0
- package/dist/elements/popover/popover-types.js +1 -0
- package/dist/elements/progress/Progress.svelte +32 -7
- package/dist/elements/progress/progress-types.d.ts +48 -1
- package/dist/elements/skeleton/Skeleton.svelte +56 -0
- package/dist/elements/skeleton/Skeleton.svelte.d.ts +4 -0
- package/dist/elements/skeleton/index.d.ts +2 -0
- package/dist/elements/skeleton/index.js +1 -0
- package/dist/elements/skeleton/skeleton-types.d.ts +50 -0
- package/dist/elements/skeleton/skeleton-types.js +1 -0
- package/dist/elements/spinner/Spinner.svelte +1 -1
- package/dist/elements/spinner/spinner-types.d.ts +20 -0
- package/dist/elements/spinner/spinner.d.ts +3 -3
- package/dist/elements/spinner/spinner.js +2 -2
- package/dist/elements/tooltip/Tooltip.svelte +108 -11
- package/dist/elements/tooltip/tooltip-types.d.ts +49 -1
- package/dist/file-browser/FileBrowser.svelte +21 -12
- package/dist/filters/CompactFilters.svelte +221 -33
- package/dist/filters/CompactFilters.svelte.d.ts +1 -1
- package/dist/filters/FilterBar.svelte +184 -0
- package/dist/filters/FilterBar.svelte.d.ts +4 -0
- package/dist/filters/FilterPopover.svelte +346 -0
- package/dist/filters/FilterPopover.svelte.d.ts +4 -0
- package/dist/filters/date-presets.d.ts +15 -0
- package/dist/filters/date-presets.js +107 -0
- package/dist/filters/filter-types.d.ts +69 -3
- package/dist/filters/index.d.ts +5 -0
- package/dist/filters/index.js +4 -0
- package/dist/filters/sync-filters-to-url.svelte.d.ts +37 -0
- package/dist/filters/sync-filters-to-url.svelte.js +114 -0
- package/dist/forms/DateRange.svelte +4 -2
- package/dist/forms/Input.svelte +2 -2
- package/dist/forms/MarketSelector.svelte +8 -3
- package/dist/forms/NumberInput.svelte +4 -4
- package/dist/forms/RadioGroup.svelte +123 -0
- package/dist/forms/RadioGroup.svelte.d.ts +4 -0
- package/dist/forms/SegmentedControl.svelte +11 -4
- package/dist/forms/Slider.svelte +72 -3
- package/dist/forms/Tags.svelte +14 -5
- package/dist/forms/Textarea.svelte +126 -0
- package/dist/forms/Textarea.svelte.d.ts +4 -0
- package/dist/forms/Toggle.svelte +8 -8
- package/dist/forms/calendar/Calendar.svelte +218 -0
- package/dist/forms/calendar/Calendar.svelte.d.ts +4 -0
- package/dist/forms/calendar/calendar-types.d.ts +46 -0
- package/dist/forms/calendar/calendar-types.js +1 -0
- package/dist/forms/calendar/index.d.ts +2 -0
- package/dist/forms/calendar/index.js +1 -0
- package/dist/forms/date-picker/DatePicker.svelte +144 -0
- package/dist/forms/date-picker/DatePicker.svelte.d.ts +4 -0
- package/dist/forms/date-picker/date-picker-types.d.ts +29 -0
- package/dist/forms/date-picker/date-picker-types.js +1 -0
- package/dist/forms/form-types.d.ts +425 -6
- package/dist/forms/market/market-selector-types.d.ts +52 -1
- package/dist/forms/segmented-control.d.ts +5 -2
- package/dist/forms/segmented-control.js +16 -5
- package/dist/forms/slider.d.ts +3 -3
- package/dist/forms/slider.js +2 -2
- package/dist/funcs/user-management.remote.d.ts +1 -1
- package/dist/funcs/user-management.remote.js +2 -2
- package/dist/header/Breadcrumbs.svelte +4 -20
- package/dist/header/PageHeader.svelte +6 -14
- package/dist/header/breadcrumbs.d.ts +3 -11
- package/dist/header/breadcrumbs.js +10 -5
- package/dist/header/header-types.d.ts +62 -11
- package/dist/index.d.ts +35 -9
- package/dist/index.js +24 -4
- package/dist/layout/activity-list/ActivityList.svelte +13 -7
- package/dist/layout/activity-list/activity-list-types.d.ts +46 -7
- package/dist/layout/card/Card.svelte +12 -15
- package/dist/layout/card/MetricCard.svelte +50 -32
- package/dist/layout/card/card-types.d.ts +114 -4
- package/dist/layout/navbar/navbar-types.d.ts +48 -0
- package/dist/layout/navbar/navbar.d.ts +3 -3
- package/dist/layout/navbar/navbar.js +2 -2
- package/dist/layout/sidebar/Sidebar.svelte +87 -11
- package/dist/layout/sidebar/sidebar-types.d.ts +60 -1
- package/dist/layout/stepper/Stepper.svelte +288 -0
- package/dist/layout/stepper/Stepper.svelte.d.ts +4 -0
- package/dist/layout/stepper/stepper-types.d.ts +80 -0
- package/dist/layout/stepper/stepper-types.js +1 -0
- package/dist/layout/table/Table.svelte +91 -85
- package/dist/layout/table/table-types.d.ts +148 -24
- package/dist/layout/table/table.d.ts +3 -3
- package/dist/layout/table/table.js +2 -2
- package/dist/layout/tabs/Tab.svelte +6 -2
- package/dist/layout/tabs/Tab.svelte.d.ts +4 -1
- package/dist/layout/tabs/TabGroup.svelte +9 -2
- package/dist/layout/tabs/tabs-types.d.ts +63 -0
- package/dist/layout/tabs/tabs.d.ts +3 -3
- package/dist/layout/tabs/tabs.js +12 -6
- package/dist/modal/ConfirmDialog.svelte +65 -0
- package/dist/modal/ConfirmDialog.svelte.d.ts +4 -0
- package/dist/modal/Modal.svelte +6 -26
- package/dist/modal/confirm-dialog-types.d.ts +39 -0
- package/dist/modal/confirm-dialog-types.js +1 -0
- package/dist/modal/modal-types.d.ts +51 -12
- package/dist/modal/modal.d.ts +3 -3
- package/dist/modal/modal.js +3 -3
- package/dist/pipeline/Pipeline.svelte +8 -3
- package/dist/pipeline/pipeline-types.d.ts +55 -3
- package/dist/pipeline/pipeline.d.ts +18 -3
- package/dist/pipeline/pipeline.js +7 -2
- package/dist/server/s3.d.ts +35 -3
- package/dist/sonner/Toaster.svelte +29 -0
- package/dist/sonner/Toaster.svelte.d.ts +4 -0
- package/dist/sonner/index.d.ts +21 -0
- package/dist/sonner/index.js +20 -0
- package/dist/user-management/UserManagement.svelte +22 -16
- package/dist/user-management/UserModal.svelte +10 -7
- package/dist/user-management/UserTable.svelte +16 -17
- package/dist/user-management/UserViewModal.svelte +11 -11
- package/dist/user-management/user-management-types.d.ts +118 -31
- package/dist/variants.d.ts +1 -1
- package/dist/variants.js +1 -1
- package/package.json +7 -4
- package/dist/config/ai.d.ts +0 -13
- package/dist/config/ai.js +0 -44
- package/dist/elements/empty-state/EmptyStateTestWrapper.svelte +0 -25
- package/dist/elements/empty-state/EmptyStateTestWrapper.svelte.d.ts +0 -8
- package/dist/elements/tooltip/TooltipTestWrapper.svelte +0 -14
- package/dist/elements/tooltip/TooltipTestWrapper.svelte.d.ts +0 -7
- package/dist/helper/deprecation.d.ts +0 -14
- package/dist/helper/deprecation.js +0 -24
- package/dist/modal/ModalFooterTestWrapper.svelte +0 -17
- package/dist/modal/ModalFooterTestWrapper.svelte.d.ts +0 -8
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
titleClass = '',
|
|
24
24
|
contentClass = '',
|
|
25
25
|
itemClass = '',
|
|
26
|
-
|
|
26
|
+
onitemclick,
|
|
27
27
|
children,
|
|
28
28
|
customContent
|
|
29
29
|
}: ActivityListProps = $props();
|
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
<div class="flex flex-wrap items-center gap-2">
|
|
117
117
|
<button
|
|
118
118
|
class="text-default-900 text-sm font-medium"
|
|
119
|
-
onclick={() =>
|
|
119
|
+
onclick={() => onitemclick?.(activityItem, index)}
|
|
120
120
|
>
|
|
121
121
|
{activityItem.title}
|
|
122
122
|
</button>
|
|
@@ -126,7 +126,10 @@
|
|
|
126
126
|
<Badge color={badge.color} size={Size.SM}>{badge.text}</Badge>
|
|
127
127
|
{:else if badge.class}
|
|
128
128
|
<span
|
|
129
|
-
class=
|
|
129
|
+
class={cn(
|
|
130
|
+
'inline-flex rounded-full px-2 py-1 text-xs font-medium',
|
|
131
|
+
badge.class
|
|
132
|
+
)}
|
|
130
133
|
>
|
|
131
134
|
{badge.text}
|
|
132
135
|
</span>
|
|
@@ -152,7 +155,7 @@
|
|
|
152
155
|
size={Size.XS}
|
|
153
156
|
variant={action.variant ?? 'outline'}
|
|
154
157
|
color={action.color ?? Color.DEFAULT}
|
|
155
|
-
onclick={() => action.
|
|
158
|
+
onclick={() => action.onclick?.()}
|
|
156
159
|
>
|
|
157
160
|
{action.label}
|
|
158
161
|
</Button>
|
|
@@ -164,7 +167,7 @@
|
|
|
164
167
|
<div class={itemContent()}>
|
|
165
168
|
<div class={itemMain()}>
|
|
166
169
|
<div class={itemHeader()}>
|
|
167
|
-
<button class={itemTitle()} onclick={() =>
|
|
170
|
+
<button class={itemTitle()} onclick={() => onitemclick?.(activityItem, index)}>
|
|
168
171
|
{activityItem.title}
|
|
169
172
|
</button>
|
|
170
173
|
{#if activityItem.badges}
|
|
@@ -173,7 +176,10 @@
|
|
|
173
176
|
<Badge color={badge.color} size={Size.SM}>{badge.text}</Badge>
|
|
174
177
|
{:else if badge.class}
|
|
175
178
|
<span
|
|
176
|
-
class=
|
|
179
|
+
class={cn(
|
|
180
|
+
'inline-flex rounded-full px-2 py-1 text-xs font-medium',
|
|
181
|
+
badge.class
|
|
182
|
+
)}
|
|
177
183
|
>
|
|
178
184
|
{badge.text}
|
|
179
185
|
</span>
|
|
@@ -203,7 +209,7 @@
|
|
|
203
209
|
size={Size.XS}
|
|
204
210
|
variant={action.variant ?? 'outline'}
|
|
205
211
|
color={action.color ?? Color.DEFAULT}
|
|
206
|
-
onclick={() => action.
|
|
212
|
+
onclick={() => action.onclick?.()}
|
|
207
213
|
>
|
|
208
214
|
{action.label}
|
|
209
215
|
</Button>
|
|
@@ -1,28 +1,30 @@
|
|
|
1
1
|
import type { ClassValue } from 'tailwind-variants';
|
|
2
2
|
import type { Snippet, Component } from 'svelte';
|
|
3
3
|
import type { VariantColors } from '../../index.js';
|
|
4
|
+
/** A small label attached to an `ActivityItem` (status, type, priority). */
|
|
4
5
|
export type ActivityItemBadge = {
|
|
5
6
|
text: string;
|
|
6
7
|
/**
|
|
7
8
|
* Ripple color for the badge. Renders as a `<Badge color={color}>`
|
|
8
|
-
* in ripple's design system. Preferred over `class` for
|
|
9
|
+
* in ripple's design system. Preferred over `class` for arbitrary styling.
|
|
9
10
|
*/
|
|
10
11
|
color?: VariantColors;
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* and `class` are provided, `color` wins.
|
|
13
|
+
* Tailwind class string for ad-hoc badge styling (e.g. 'bg-green-100
|
|
14
|
+
* text-green-800'). If both `color` and `class` are provided, `color` wins.
|
|
15
15
|
*/
|
|
16
|
-
class?:
|
|
16
|
+
class?: ClassValue;
|
|
17
17
|
};
|
|
18
|
+
/** Button-style action attached to an `ActivityItem` (e.g. "View details", "Mark done"). */
|
|
18
19
|
export type ActivityItemAction = {
|
|
19
20
|
label: string;
|
|
20
|
-
|
|
21
|
+
onclick?: () => void;
|
|
21
22
|
/** Optional ripple button color variant. @default 'default' */
|
|
22
23
|
color?: VariantColors;
|
|
23
24
|
/** Optional ripple button variant. @default 'outline' */
|
|
24
25
|
variant?: 'solid' | 'outline' | 'ghost' | 'link';
|
|
25
26
|
};
|
|
27
|
+
/** Single entry in an `<ActivityList>`. Many fields are optional — use what you need. */
|
|
26
28
|
export type ActivityItem = {
|
|
27
29
|
title: string;
|
|
28
30
|
subtitle?: string;
|
|
@@ -75,7 +77,44 @@ export type ActivityItem = {
|
|
|
75
77
|
*/
|
|
76
78
|
custom?: boolean;
|
|
77
79
|
};
|
|
80
|
+
/** Density variants specific to ActivityList. */
|
|
78
81
|
export type ActivityListSize = 'sm' | 'md';
|
|
82
|
+
/**
|
|
83
|
+
* Props for `<ActivityList>` — a feed of recent events / actions (audit
|
|
84
|
+
* trails, user activity, timeline views). Each `ActivityItem` has a
|
|
85
|
+
* title/subtitle, optional icon, badges, actions, and can be rendered
|
|
86
|
+
* as a connected timeline.
|
|
87
|
+
*
|
|
88
|
+
* For a single metric card use `<MetricCard>`; for tabular data with
|
|
89
|
+
* sorting/selection use `<Table>`.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```svelte
|
|
93
|
+
* <ActivityList
|
|
94
|
+
* title="Recent activity"
|
|
95
|
+
* items={[
|
|
96
|
+
* {
|
|
97
|
+
* title: 'Order #1284 shipped',
|
|
98
|
+
* subtitle: '3 packages · Tracking ACN-2931',
|
|
99
|
+
* icon: ShippedIcon,
|
|
100
|
+
* iconColor: 'success',
|
|
101
|
+
* timestamp: '2m ago',
|
|
102
|
+
* badges: [{ text: 'Shipped', color: 'success' }]
|
|
103
|
+
* }
|
|
104
|
+
* ]}
|
|
105
|
+
* />
|
|
106
|
+
* ```
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```svelte
|
|
110
|
+
* <!-- Timeline with a per-row custom cell (chart/progress) -->
|
|
111
|
+
* <ActivityList items={richItems} timeline>
|
|
112
|
+
* {#snippet customContent(item, i)}
|
|
113
|
+
* <Chart data={item.chart} config={miniChartConfig} />
|
|
114
|
+
* {/snippet}
|
|
115
|
+
* </ActivityList>
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
79
118
|
export type ActivityListProps = {
|
|
80
119
|
title?: string;
|
|
81
120
|
items?: ActivityItem[];
|
|
@@ -98,7 +137,7 @@ export type ActivityListProps = {
|
|
|
98
137
|
titleClass?: ClassValue;
|
|
99
138
|
contentClass?: ClassValue;
|
|
100
139
|
itemClass?: ClassValue;
|
|
101
|
-
|
|
140
|
+
onitemclick?: (item: ActivityItem, index: number) => void;
|
|
102
141
|
children?: Snippet;
|
|
103
142
|
/**
|
|
104
143
|
* Optional snippet used to render the content area of any item
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { cn } from '../../helper/cls.js';
|
|
3
3
|
import { buildTestId } from '../../helper/testid.js';
|
|
4
|
-
import { warnDeprecatedProps } from '../../helper/deprecation.js';
|
|
5
4
|
import { card } from './card.js';
|
|
5
|
+
import Skeleton from '../../elements/skeleton/Skeleton.svelte';
|
|
6
6
|
import type { CardProps } from '../../index.js';
|
|
7
7
|
import { Color } from '../../variants.js';
|
|
8
8
|
|
|
@@ -12,22 +12,12 @@
|
|
|
12
12
|
title,
|
|
13
13
|
color = Color.DEFAULT,
|
|
14
14
|
class: className = '',
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
bodyClass = bodyclass ?? '',
|
|
15
|
+
titleClass = '',
|
|
16
|
+
bodyClass = '',
|
|
17
|
+
loading = false,
|
|
19
18
|
testId
|
|
20
19
|
}: CardProps = $props();
|
|
21
20
|
|
|
22
|
-
warnDeprecatedProps(
|
|
23
|
-
'Card',
|
|
24
|
-
{ titleclass, bodyclass },
|
|
25
|
-
{
|
|
26
|
-
titleclass: 'titleClass',
|
|
27
|
-
bodyclass: 'bodyClass'
|
|
28
|
-
}
|
|
29
|
-
);
|
|
30
|
-
|
|
31
21
|
const { base, title: titleSlot, body: bodySlot } = $derived(card({ color }));
|
|
32
22
|
|
|
33
23
|
const baseClass = $derived(cn(base(), className));
|
|
@@ -36,7 +26,14 @@
|
|
|
36
26
|
</script>
|
|
37
27
|
|
|
38
28
|
<div class={baseClass} data-testid={buildTestId('card', undefined, testId)}>
|
|
39
|
-
{#if
|
|
29
|
+
{#if loading}
|
|
30
|
+
<Skeleton class="mb-3 h-5 w-1/2" />
|
|
31
|
+
<div class="space-y-2">
|
|
32
|
+
<Skeleton class="h-3 w-full" />
|
|
33
|
+
<Skeleton class="h-3 w-5/6" />
|
|
34
|
+
<Skeleton class="h-3 w-3/4" />
|
|
35
|
+
</div>
|
|
36
|
+
{:else if custom}
|
|
40
37
|
{@render custom()}
|
|
41
38
|
{:else}
|
|
42
39
|
{#if title}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { metricCard } from './metric-card.js';
|
|
4
4
|
import type { MetricCardProps } from '../../index.js';
|
|
5
5
|
import Progress from '../../elements/progress/Progress.svelte';
|
|
6
|
+
import Skeleton from '../../elements/skeleton/Skeleton.svelte';
|
|
6
7
|
import { Size, Color } from '../../variants.js';
|
|
7
8
|
|
|
8
9
|
let {
|
|
@@ -14,7 +15,8 @@
|
|
|
14
15
|
class: className = '',
|
|
15
16
|
onclick,
|
|
16
17
|
action,
|
|
17
|
-
actionHover
|
|
18
|
+
actionHover,
|
|
19
|
+
loading = false
|
|
18
20
|
}: MetricCardProps = $props();
|
|
19
21
|
|
|
20
22
|
const interactive = $derived(!!onclick);
|
|
@@ -72,40 +74,56 @@
|
|
|
72
74
|
{/if}
|
|
73
75
|
{/if}
|
|
74
76
|
|
|
75
|
-
{#if
|
|
76
|
-
<
|
|
77
|
-
|
|
77
|
+
{#if loading}
|
|
78
|
+
<Skeleton class="h-3 w-1/2" />
|
|
79
|
+
<Skeleton class="mt-2 h-9 w-2/3" />
|
|
80
|
+
<div class="mt-3 space-y-2">
|
|
81
|
+
<div class="flex justify-between">
|
|
82
|
+
<Skeleton class="h-3 w-20" /><Skeleton class="h-3 w-12" />
|
|
83
|
+
</div>
|
|
84
|
+
<div class="flex justify-between">
|
|
85
|
+
<Skeleton class="h-3 w-24" /><Skeleton class="h-3 w-10" />
|
|
86
|
+
</div>
|
|
87
|
+
<div class="flex justify-between">
|
|
88
|
+
<Skeleton class="h-3 w-16" /><Skeleton class="h-3 w-14" />
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
{:else}
|
|
92
|
+
{#if title}
|
|
93
|
+
<div class={titleSlot()}>{title}</div>
|
|
94
|
+
{/if}
|
|
78
95
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
96
|
+
{#if value !== undefined}
|
|
97
|
+
<div class={valueSlot()}>{value}</div>
|
|
98
|
+
{/if}
|
|
82
99
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
100
|
+
{#if details.length > 0}
|
|
101
|
+
<div class={detailSlot()}>
|
|
102
|
+
{#each details as detail, index (detail.label + index)}
|
|
103
|
+
<div class="flex justify-between text-xs">
|
|
104
|
+
<span class="text-default-500">{detail.label}</span>
|
|
105
|
+
<span class="font-medium {detail.color || 'text-default-900'}">{detail.value}</span>
|
|
106
|
+
</div>
|
|
107
|
+
{/each}
|
|
108
|
+
</div>
|
|
109
|
+
{/if}
|
|
93
110
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
111
|
+
{#if segments}
|
|
112
|
+
<div class={cn(progressSlot(), 'pt-2')}>
|
|
113
|
+
<Progress
|
|
114
|
+
value={0}
|
|
115
|
+
{segments}
|
|
116
|
+
size={Size.SM}
|
|
117
|
+
showLabels={false}
|
|
118
|
+
showValues={false}
|
|
119
|
+
showLabel={false}
|
|
120
|
+
/>
|
|
121
|
+
</div>
|
|
122
|
+
{:else if percent !== undefined}
|
|
123
|
+
<div class={cn(progressSlot(), 'pt-2')}>
|
|
124
|
+
<Progress value={percent} size={Size.SM} color={Color.SUCCESS} showLabel={false} />
|
|
125
|
+
</div>
|
|
126
|
+
{/if}
|
|
109
127
|
{/if}
|
|
110
128
|
{/snippet}
|
|
111
129
|
|
|
@@ -3,40 +3,145 @@ import type { Snippet } from 'svelte';
|
|
|
3
3
|
import type { Component } from 'svelte';
|
|
4
4
|
import type { VariantColors } from '../../index.js';
|
|
5
5
|
import type { ProgressSegment } from '../../elements/progress/progress-types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Props for `<Card>` — a generic bordered container with optional
|
|
8
|
+
* title and color tint. Use for grouping related content, often with
|
|
9
|
+
* a skeleton placeholder while loading.
|
|
10
|
+
*
|
|
11
|
+
* For number-focused cards (KPIs, metrics), use `<MetricCard>` instead.
|
|
12
|
+
* For ranked lists (leaderboards), use `<RankedCard>`.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```svelte
|
|
16
|
+
* <Card title="Recent activity" color="info">
|
|
17
|
+
* <ul>
|
|
18
|
+
* {#each items as item}
|
|
19
|
+
* <li>{item.title}</li>
|
|
20
|
+
* {/each}
|
|
21
|
+
* </ul>
|
|
22
|
+
* </Card>
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```svelte
|
|
27
|
+
* <!-- Skeleton placeholder while fetching -->
|
|
28
|
+
* <Card title="Portfolio" {loading}>
|
|
29
|
+
* {#if data}<Chart {data} {config} />{/if}
|
|
30
|
+
* </Card>
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
6
33
|
export type CardProps = {
|
|
34
|
+
/** Background tint. @default 'default' */
|
|
7
35
|
color?: VariantColors;
|
|
36
|
+
/** Heading shown at the top. */
|
|
8
37
|
title?: string;
|
|
9
38
|
class?: ClassValue;
|
|
10
|
-
/**
|
|
11
|
-
titleclass?: ClassValue;
|
|
39
|
+
/** Classes for the title element only. */
|
|
12
40
|
titleClass?: ClassValue;
|
|
13
|
-
/**
|
|
14
|
-
bodyclass?: ClassValue;
|
|
41
|
+
/** Classes for the body container only. */
|
|
15
42
|
bodyClass?: ClassValue;
|
|
43
|
+
/** Default body content. */
|
|
16
44
|
children?: Snippet;
|
|
45
|
+
/**
|
|
46
|
+
* Override the entire card body with arbitrary markup. When provided,
|
|
47
|
+
* `children` is ignored. Use for custom card shells that still want
|
|
48
|
+
* the Card's border/shadow but not the title+body scaffolding.
|
|
49
|
+
*/
|
|
17
50
|
custom?: Snippet;
|
|
51
|
+
/**
|
|
52
|
+
* Show a skeleton placeholder (title + body) instead of the children
|
|
53
|
+
* while data is loading. @default false
|
|
54
|
+
*/
|
|
55
|
+
loading?: boolean;
|
|
18
56
|
testId?: string;
|
|
19
57
|
};
|
|
58
|
+
/**
|
|
59
|
+
* Props for `<Alert>` — a prominent inline banner for success / warning /
|
|
60
|
+
* error / info messages. Use at the top of a page or above a form. For
|
|
61
|
+
* transient notifications prefer `toast()`; for system-level callouts
|
|
62
|
+
* (page offline, session expiring) use Alert.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```svelte
|
|
66
|
+
* <Alert title="Saved" message="Your changes have been saved." color="success" />
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```svelte
|
|
71
|
+
* <!-- Dismissable with a custom footer action -->
|
|
72
|
+
* <Alert color="warning" message="Your trial ends in 3 days." onclose={() => {}}>
|
|
73
|
+
* {#snippet footer()}
|
|
74
|
+
* <Button size="sm">Upgrade now</Button>
|
|
75
|
+
* {/snippet}
|
|
76
|
+
* </Alert>
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
20
79
|
export type AlertProps = {
|
|
80
|
+
/** Heading shown above the message in bold. */
|
|
21
81
|
title?: string;
|
|
82
|
+
/** Primary message text. */
|
|
22
83
|
message: string;
|
|
84
|
+
/** Semantic color — drives icon, border, and background tint. @default 'info' */
|
|
23
85
|
color?: VariantColors;
|
|
24
86
|
class?: ClassValue;
|
|
87
|
+
/** When provided, renders a × dismiss button. */
|
|
25
88
|
onclose?: () => void;
|
|
89
|
+
/** Additional content below the message (e.g. action buttons). */
|
|
26
90
|
footer?: Snippet;
|
|
91
|
+
/** Override the default color-appropriate icon. */
|
|
27
92
|
icon?: Component;
|
|
28
93
|
testId?: string;
|
|
29
94
|
};
|
|
95
|
+
/**
|
|
96
|
+
* A single metric shown in `<MetricCard>`'s detail list (e.g.
|
|
97
|
+
* breaking a total into sub-metrics).
|
|
98
|
+
*/
|
|
30
99
|
export type MetricDetail = {
|
|
31
100
|
label: string;
|
|
32
101
|
value: string | number;
|
|
102
|
+
/** Visual accent for the value. */
|
|
33
103
|
color?: VariantColors;
|
|
34
104
|
};
|
|
105
|
+
/**
|
|
106
|
+
* Props for `<MetricCard>` — a KPI-focused card that shows a single
|
|
107
|
+
* primary value, optional percentage/progress bar, and optional detail
|
|
108
|
+
* breakdowns. Becomes clickable when `onclick` is provided.
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```svelte
|
|
112
|
+
* <MetricCard title="Revenue (MTD)" value="$142K" percent={68} />
|
|
113
|
+
* ```
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```svelte
|
|
117
|
+
* <!-- Clickable KPI with a hover action -->
|
|
118
|
+
* <MetricCard
|
|
119
|
+
* title="Active users"
|
|
120
|
+
* value={users.toLocaleString()}
|
|
121
|
+
* onclick={() => goto('/users')}
|
|
122
|
+
* details={[
|
|
123
|
+
* { label: 'New', value: 42, color: 'success' },
|
|
124
|
+
* { label: 'Churned', value: 7, color: 'danger' }
|
|
125
|
+
* ]}
|
|
126
|
+
* />
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
35
129
|
export type MetricCardProps = {
|
|
130
|
+
/** Small label above the headline value. */
|
|
36
131
|
title: string;
|
|
132
|
+
/** Headline value — the big number. */
|
|
37
133
|
value: string | number;
|
|
134
|
+
/** Optional breakdown rendered as a small list below the value. */
|
|
38
135
|
details?: MetricDetail[];
|
|
136
|
+
/**
|
|
137
|
+
* Progress bar percentage (0-100). When set, renders a single-segment
|
|
138
|
+
* progress bar below the value.
|
|
139
|
+
*/
|
|
39
140
|
percent?: number;
|
|
141
|
+
/**
|
|
142
|
+
* Multi-segment progress (e.g. "50% healthy / 30% warning / 20% danger").
|
|
143
|
+
* Takes precedence over `percent` when both are set.
|
|
144
|
+
*/
|
|
40
145
|
segments?: ProgressSegment[];
|
|
41
146
|
class?: ClassValue;
|
|
42
147
|
/**
|
|
@@ -58,5 +163,10 @@ export type MetricCardProps = {
|
|
|
58
163
|
* is set.
|
|
59
164
|
*/
|
|
60
165
|
actionHover?: Snippet;
|
|
166
|
+
/**
|
|
167
|
+
* Show a skeleton placeholder instead of the title/value/details while
|
|
168
|
+
* data is loading. @default false
|
|
169
|
+
*/
|
|
170
|
+
loading?: boolean;
|
|
61
171
|
testId?: string;
|
|
62
172
|
};
|
|
@@ -1,19 +1,67 @@
|
|
|
1
1
|
import type { ClassValue } from 'tailwind-variants';
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import type { Component } from 'svelte';
|
|
4
|
+
/**
|
|
5
|
+
* Single navbar link — may have nested children for dropdown menus.
|
|
6
|
+
* Active state is typically driven by your router; this type carries
|
|
7
|
+
* an `active` flag for consumers to set explicitly when needed.
|
|
8
|
+
*/
|
|
4
9
|
export type NavbarLinkItem = {
|
|
5
10
|
label: string;
|
|
11
|
+
/** Target URL. */
|
|
6
12
|
href: string;
|
|
7
13
|
icon?: Component;
|
|
14
|
+
/** Render as the current route (active styling). */
|
|
8
15
|
active?: boolean;
|
|
16
|
+
/** Nested links — when set, the item renders a dropdown menu. */
|
|
9
17
|
children?: NavbarLinkItem[];
|
|
10
18
|
};
|
|
19
|
+
/**
|
|
20
|
+
* Props for `<Navbar>` — a horizontal top-of-page navigation bar.
|
|
21
|
+
* For a side-rail navigation, use `<Sidebar>` instead. Many apps use
|
|
22
|
+
* both (Navbar for global, Sidebar for within-app).
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```svelte
|
|
26
|
+
* <Navbar
|
|
27
|
+
* logo="/logo.svg"
|
|
28
|
+
* links={[
|
|
29
|
+
* { label: 'Dashboard', href: '/', active: true },
|
|
30
|
+
* { label: 'Reports', href: '/reports' },
|
|
31
|
+
* {
|
|
32
|
+
* label: 'Settings',
|
|
33
|
+
* href: '/settings',
|
|
34
|
+
* children: [
|
|
35
|
+
* { label: 'Profile', href: '/settings/profile' },
|
|
36
|
+
* { label: 'Billing', href: '/settings/billing' }
|
|
37
|
+
* ]
|
|
38
|
+
* }
|
|
39
|
+
* ]}
|
|
40
|
+
* >
|
|
41
|
+
* {#snippet actions()}
|
|
42
|
+
* <Button variant="ghost">Sign out</Button>
|
|
43
|
+
* {/snippet}
|
|
44
|
+
* </Navbar>
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
11
47
|
export type NavbarProps = {
|
|
48
|
+
/**
|
|
49
|
+
* Logo to render on the left. Pass a string path for an `<img>` or a
|
|
50
|
+
* Component for inline SVG. Prefer the `brand` snippet for fully
|
|
51
|
+
* custom branding (logo + wordmark + tagline, etc.).
|
|
52
|
+
*/
|
|
12
53
|
logo?: string | Component;
|
|
54
|
+
/** Main navigation links. */
|
|
13
55
|
links?: NavbarLinkItem[];
|
|
14
56
|
class?: ClassValue;
|
|
57
|
+
/**
|
|
58
|
+
* Custom brand content (takes precedence over `logo`). Render whatever
|
|
59
|
+
* markup you want for the brand area.
|
|
60
|
+
*/
|
|
15
61
|
brand?: Snippet;
|
|
62
|
+
/** Fallback slot — rendered between the links and `actions`. */
|
|
16
63
|
children?: Snippet;
|
|
64
|
+
/** Right-aligned action area — profile menu, notifications, sign-out, etc. */
|
|
17
65
|
actions?: Snippet;
|
|
18
66
|
testId?: string;
|
|
19
67
|
};
|
|
@@ -38,7 +38,7 @@ export declare const navbar: import("tailwind-variants").TVReturnType<{
|
|
|
38
38
|
link: string;
|
|
39
39
|
mobileLink: string;
|
|
40
40
|
};
|
|
41
|
-
|
|
41
|
+
md: {
|
|
42
42
|
container: string;
|
|
43
43
|
link: string;
|
|
44
44
|
mobileLink: string;
|
|
@@ -100,7 +100,7 @@ export declare const navbar: import("tailwind-variants").TVReturnType<{
|
|
|
100
100
|
link: string;
|
|
101
101
|
mobileLink: string;
|
|
102
102
|
};
|
|
103
|
-
|
|
103
|
+
md: {
|
|
104
104
|
container: string;
|
|
105
105
|
link: string;
|
|
106
106
|
mobileLink: string;
|
|
@@ -162,7 +162,7 @@ export declare const navbar: import("tailwind-variants").TVReturnType<{
|
|
|
162
162
|
link: string;
|
|
163
163
|
mobileLink: string;
|
|
164
164
|
};
|
|
165
|
-
|
|
165
|
+
md: {
|
|
166
166
|
container: string;
|
|
167
167
|
link: string;
|
|
168
168
|
mobileLink: string;
|
|
@@ -50,7 +50,7 @@ export const navbar = tv({
|
|
|
50
50
|
link: 'text-xs',
|
|
51
51
|
mobileLink: 'text-xs'
|
|
52
52
|
},
|
|
53
|
-
[Size.
|
|
53
|
+
[Size.MD]: {
|
|
54
54
|
container: 'h-16',
|
|
55
55
|
link: 'text-sm',
|
|
56
56
|
mobileLink: 'text-sm'
|
|
@@ -93,7 +93,7 @@ export const navbar = tv({
|
|
|
93
93
|
],
|
|
94
94
|
defaultVariants: {
|
|
95
95
|
color: Color.DEFAULT,
|
|
96
|
-
size: Size.
|
|
96
|
+
size: Size.MD,
|
|
97
97
|
active: false
|
|
98
98
|
}
|
|
99
99
|
});
|