@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.
Files changed (184) hide show
  1. package/README.md +403 -497
  2. package/dist/adapters/storage/S3Adapter.d.ts +49 -1
  3. package/dist/adapters/storage/S3Adapter.js +38 -1
  4. package/dist/adapters/storage/types.d.ts +20 -0
  5. package/dist/ai/AIChatInterface.svelte +2 -1
  6. package/dist/ai/AIChatInterface.svelte.d.ts +2 -1
  7. package/dist/ai/CodeRenderer.svelte +7 -2
  8. package/dist/ai/CodeRenderer.svelte.d.ts +2 -1
  9. package/dist/ai/ComposeDropdown.svelte +1 -1
  10. package/dist/ai/MessageBox.svelte +3 -3
  11. package/dist/ai/MessageBox.svelte.d.ts +3 -2
  12. package/dist/ai/ThinkingDisplay.svelte +4 -3
  13. package/dist/ai/ThinkingDisplay.svelte.d.ts +2 -1
  14. package/dist/ai/ai-types.d.ts +55 -1
  15. package/dist/button/Button.svelte +5 -5
  16. package/dist/button/button-types.d.ts +49 -4
  17. package/dist/button/button.d.ts +9 -9
  18. package/dist/button/button.js +6 -6
  19. package/dist/charts/Chart.svelte +8 -16
  20. package/dist/charts/chart-types.d.ts +78 -1
  21. package/dist/drawer/Drawer.svelte +6 -26
  22. package/dist/drawer/drawer-types.d.ts +33 -12
  23. package/dist/drawer/drawer.d.ts +3 -3
  24. package/dist/drawer/drawer.js +1 -1
  25. package/dist/elements/accordion/Accordion.svelte +6 -17
  26. package/dist/elements/accordion/accordion-types.d.ts +53 -6
  27. package/dist/elements/alert/Alert.svelte +3 -0
  28. package/dist/elements/badge/Badge.svelte +1 -1
  29. package/dist/elements/badge/badge-types.d.ts +22 -0
  30. package/dist/elements/badge/badge.d.ts +3 -3
  31. package/dist/elements/badge/badge.js +1 -1
  32. package/dist/elements/combobox/ComboBox.svelte +247 -0
  33. package/dist/elements/combobox/ComboBox.svelte.d.ts +4 -0
  34. package/dist/elements/combobox/combobox-types.d.ts +41 -0
  35. package/dist/elements/combobox/combobox-types.js +1 -0
  36. package/dist/elements/context-menu/ContextMenu.svelte +137 -0
  37. package/dist/elements/context-menu/ContextMenu.svelte.d.ts +4 -0
  38. package/dist/elements/context-menu/context-menu-types.d.ts +40 -0
  39. package/dist/elements/context-menu/context-menu-types.js +1 -0
  40. package/dist/elements/dropdown/Dropdown.svelte +1 -1
  41. package/dist/elements/dropdown/Select.svelte +4 -1
  42. package/dist/elements/dropdown/dropdown-types.d.ts +114 -0
  43. package/dist/elements/dropdown/dropdown.d.ts +3 -3
  44. package/dist/elements/dropdown/dropdown.js +2 -2
  45. package/dist/elements/dropdown/select.d.ts +3 -3
  46. package/dist/elements/dropdown/select.js +2 -2
  47. package/dist/elements/empty-state/EmptyState.svelte +1 -1
  48. package/dist/elements/empty-state/empty-state-types.d.ts +32 -1
  49. package/dist/elements/empty-state/empty-state.d.ts +3 -3
  50. package/dist/elements/empty-state/empty-state.js +2 -2
  51. package/dist/elements/file-upload/FileUpload.svelte +5 -0
  52. package/dist/elements/file-upload/file-upload-types.d.ts +59 -0
  53. package/dist/elements/pagination/Pagination.svelte +53 -21
  54. package/dist/elements/pagination/Pagination.svelte.d.ts +33 -5
  55. package/dist/elements/popover/Popover.svelte +234 -0
  56. package/dist/elements/popover/Popover.svelte.d.ts +4 -0
  57. package/dist/elements/popover/index.d.ts +2 -0
  58. package/dist/elements/popover/index.js +1 -0
  59. package/dist/elements/popover/popover-types.d.ts +60 -0
  60. package/dist/elements/popover/popover-types.js +1 -0
  61. package/dist/elements/progress/Progress.svelte +32 -7
  62. package/dist/elements/progress/progress-types.d.ts +48 -1
  63. package/dist/elements/skeleton/Skeleton.svelte +56 -0
  64. package/dist/elements/skeleton/Skeleton.svelte.d.ts +4 -0
  65. package/dist/elements/skeleton/index.d.ts +2 -0
  66. package/dist/elements/skeleton/index.js +1 -0
  67. package/dist/elements/skeleton/skeleton-types.d.ts +50 -0
  68. package/dist/elements/skeleton/skeleton-types.js +1 -0
  69. package/dist/elements/spinner/Spinner.svelte +1 -1
  70. package/dist/elements/spinner/spinner-types.d.ts +20 -0
  71. package/dist/elements/spinner/spinner.d.ts +3 -3
  72. package/dist/elements/spinner/spinner.js +2 -2
  73. package/dist/elements/tooltip/Tooltip.svelte +108 -11
  74. package/dist/elements/tooltip/tooltip-types.d.ts +49 -1
  75. package/dist/file-browser/FileBrowser.svelte +21 -12
  76. package/dist/filters/CompactFilters.svelte +221 -33
  77. package/dist/filters/CompactFilters.svelte.d.ts +1 -1
  78. package/dist/filters/FilterBar.svelte +184 -0
  79. package/dist/filters/FilterBar.svelte.d.ts +4 -0
  80. package/dist/filters/FilterPopover.svelte +346 -0
  81. package/dist/filters/FilterPopover.svelte.d.ts +4 -0
  82. package/dist/filters/date-presets.d.ts +15 -0
  83. package/dist/filters/date-presets.js +107 -0
  84. package/dist/filters/filter-types.d.ts +69 -3
  85. package/dist/filters/index.d.ts +5 -0
  86. package/dist/filters/index.js +4 -0
  87. package/dist/filters/sync-filters-to-url.svelte.d.ts +37 -0
  88. package/dist/filters/sync-filters-to-url.svelte.js +114 -0
  89. package/dist/forms/DateRange.svelte +4 -2
  90. package/dist/forms/Input.svelte +2 -2
  91. package/dist/forms/MarketSelector.svelte +8 -3
  92. package/dist/forms/NumberInput.svelte +4 -4
  93. package/dist/forms/RadioGroup.svelte +123 -0
  94. package/dist/forms/RadioGroup.svelte.d.ts +4 -0
  95. package/dist/forms/SegmentedControl.svelte +11 -4
  96. package/dist/forms/Slider.svelte +72 -3
  97. package/dist/forms/Tags.svelte +14 -5
  98. package/dist/forms/Textarea.svelte +126 -0
  99. package/dist/forms/Textarea.svelte.d.ts +4 -0
  100. package/dist/forms/Toggle.svelte +8 -8
  101. package/dist/forms/calendar/Calendar.svelte +218 -0
  102. package/dist/forms/calendar/Calendar.svelte.d.ts +4 -0
  103. package/dist/forms/calendar/calendar-types.d.ts +46 -0
  104. package/dist/forms/calendar/calendar-types.js +1 -0
  105. package/dist/forms/calendar/index.d.ts +2 -0
  106. package/dist/forms/calendar/index.js +1 -0
  107. package/dist/forms/date-picker/DatePicker.svelte +144 -0
  108. package/dist/forms/date-picker/DatePicker.svelte.d.ts +4 -0
  109. package/dist/forms/date-picker/date-picker-types.d.ts +29 -0
  110. package/dist/forms/date-picker/date-picker-types.js +1 -0
  111. package/dist/forms/form-types.d.ts +425 -6
  112. package/dist/forms/market/market-selector-types.d.ts +52 -1
  113. package/dist/forms/segmented-control.d.ts +5 -2
  114. package/dist/forms/segmented-control.js +16 -5
  115. package/dist/forms/slider.d.ts +3 -3
  116. package/dist/forms/slider.js +2 -2
  117. package/dist/funcs/user-management.remote.d.ts +1 -1
  118. package/dist/funcs/user-management.remote.js +2 -2
  119. package/dist/header/Breadcrumbs.svelte +4 -20
  120. package/dist/header/PageHeader.svelte +6 -14
  121. package/dist/header/breadcrumbs.d.ts +3 -11
  122. package/dist/header/breadcrumbs.js +10 -5
  123. package/dist/header/header-types.d.ts +62 -11
  124. package/dist/index.d.ts +35 -9
  125. package/dist/index.js +24 -4
  126. package/dist/layout/activity-list/ActivityList.svelte +13 -7
  127. package/dist/layout/activity-list/activity-list-types.d.ts +46 -7
  128. package/dist/layout/card/Card.svelte +12 -15
  129. package/dist/layout/card/MetricCard.svelte +50 -32
  130. package/dist/layout/card/card-types.d.ts +114 -4
  131. package/dist/layout/navbar/navbar-types.d.ts +48 -0
  132. package/dist/layout/navbar/navbar.d.ts +3 -3
  133. package/dist/layout/navbar/navbar.js +2 -2
  134. package/dist/layout/sidebar/Sidebar.svelte +87 -11
  135. package/dist/layout/sidebar/sidebar-types.d.ts +60 -1
  136. package/dist/layout/stepper/Stepper.svelte +288 -0
  137. package/dist/layout/stepper/Stepper.svelte.d.ts +4 -0
  138. package/dist/layout/stepper/stepper-types.d.ts +80 -0
  139. package/dist/layout/stepper/stepper-types.js +1 -0
  140. package/dist/layout/table/Table.svelte +91 -85
  141. package/dist/layout/table/table-types.d.ts +148 -24
  142. package/dist/layout/table/table.d.ts +3 -3
  143. package/dist/layout/table/table.js +2 -2
  144. package/dist/layout/tabs/Tab.svelte +6 -2
  145. package/dist/layout/tabs/Tab.svelte.d.ts +4 -1
  146. package/dist/layout/tabs/TabGroup.svelte +9 -2
  147. package/dist/layout/tabs/tabs-types.d.ts +63 -0
  148. package/dist/layout/tabs/tabs.d.ts +3 -3
  149. package/dist/layout/tabs/tabs.js +12 -6
  150. package/dist/modal/ConfirmDialog.svelte +65 -0
  151. package/dist/modal/ConfirmDialog.svelte.d.ts +4 -0
  152. package/dist/modal/Modal.svelte +6 -26
  153. package/dist/modal/confirm-dialog-types.d.ts +39 -0
  154. package/dist/modal/confirm-dialog-types.js +1 -0
  155. package/dist/modal/modal-types.d.ts +51 -12
  156. package/dist/modal/modal.d.ts +3 -3
  157. package/dist/modal/modal.js +3 -3
  158. package/dist/pipeline/Pipeline.svelte +8 -3
  159. package/dist/pipeline/pipeline-types.d.ts +55 -3
  160. package/dist/pipeline/pipeline.d.ts +18 -3
  161. package/dist/pipeline/pipeline.js +7 -2
  162. package/dist/server/s3.d.ts +35 -3
  163. package/dist/sonner/Toaster.svelte +29 -0
  164. package/dist/sonner/Toaster.svelte.d.ts +4 -0
  165. package/dist/sonner/index.d.ts +21 -0
  166. package/dist/sonner/index.js +20 -0
  167. package/dist/user-management/UserManagement.svelte +22 -16
  168. package/dist/user-management/UserModal.svelte +10 -7
  169. package/dist/user-management/UserTable.svelte +16 -17
  170. package/dist/user-management/UserViewModal.svelte +11 -11
  171. package/dist/user-management/user-management-types.d.ts +118 -31
  172. package/dist/variants.d.ts +1 -1
  173. package/dist/variants.js +1 -1
  174. package/package.json +7 -4
  175. package/dist/config/ai.d.ts +0 -13
  176. package/dist/config/ai.js +0 -44
  177. package/dist/elements/empty-state/EmptyStateTestWrapper.svelte +0 -25
  178. package/dist/elements/empty-state/EmptyStateTestWrapper.svelte.d.ts +0 -8
  179. package/dist/elements/tooltip/TooltipTestWrapper.svelte +0 -14
  180. package/dist/elements/tooltip/TooltipTestWrapper.svelte.d.ts +0 -7
  181. package/dist/helper/deprecation.d.ts +0 -14
  182. package/dist/helper/deprecation.js +0 -24
  183. package/dist/modal/ModalFooterTestWrapper.svelte +0 -17
  184. package/dist/modal/ModalFooterTestWrapper.svelte.d.ts +0 -8
@@ -23,7 +23,7 @@
23
23
  titleClass = '',
24
24
  contentClass = '',
25
25
  itemClass = '',
26
- onItemClick,
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={() => onItemClick?.(activityItem, index)}
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="inline-flex rounded-full px-2 py-1 text-xs font-medium {badge.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.onClick?.()}
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={() => onItemClick?.(activityItem, index)}>
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="inline-flex rounded-full px-2 py-1 text-xs font-medium {badge.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.onClick?.()}
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 new code.
9
+ * in ripple's design system. Preferred over `class` for arbitrary styling.
9
10
  */
10
11
  color?: VariantColors;
11
12
  /**
12
- * Legacy Tailwind class string for the badge (e.g. 'bg-green-100 text-green-800').
13
- * Kept for backward compatibility with pre-v2.1 callers. If both `color`
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?: string;
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
- onClick?: () => void;
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
- onItemClick?: (item: ActivityItem, index: number) => void;
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
- titleclass,
16
- titleClass = titleclass ?? '',
17
- bodyclass,
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 custom}
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 title}
76
- <div class={titleSlot()}>{title}</div>
77
- {/if}
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
- {#if value !== undefined}
80
- <div class={valueSlot()}>{value}</div>
81
- {/if}
96
+ {#if value !== undefined}
97
+ <div class={valueSlot()}>{value}</div>
98
+ {/if}
82
99
 
83
- {#if details.length > 0}
84
- <div class={detailSlot()}>
85
- {#each details as detail, index (detail.label + index)}
86
- <div class="flex justify-between text-xs">
87
- <span class="text-default-500">{detail.label}</span>
88
- <span class="font-medium {detail.color || 'text-default-900'}">{detail.value}</span>
89
- </div>
90
- {/each}
91
- </div>
92
- {/if}
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
- {#if segments}
95
- <div class={cn(progressSlot(), 'pt-2')}>
96
- <Progress
97
- value={0}
98
- {segments}
99
- size={Size.SM}
100
- showLabels={false}
101
- showValues={false}
102
- showLabel={false}
103
- />
104
- </div>
105
- {:else if percent !== undefined}
106
- <div class={cn(progressSlot(), 'pt-2')}>
107
- <Progress value={percent} size={Size.SM} color={Color.SUCCESS} showLabel={false} />
108
- </div>
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
- /** @deprecated Use titleClass instead */
11
- titleclass?: ClassValue;
39
+ /** Classes for the title element only. */
12
40
  titleClass?: ClassValue;
13
- /** @deprecated Use bodyClass instead */
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
- base: {
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
- base: {
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
- base: {
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.BASE]: {
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.BASE,
96
+ size: Size.MD,
97
97
  active: false
98
98
  }
99
99
  });