@w5-ui/svelte 0.2.0 → 0.3.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 (138) hide show
  1. package/README.md +116 -4
  2. package/package.json +4 -4
  3. package/src/lib/components/Accordion.svelte +1 -1
  4. package/src/lib/components/AccordionItem.svelte +6 -7
  5. package/src/lib/components/ActionMenu.svelte +17 -9
  6. package/src/lib/components/ActivityFeed.svelte +20 -14
  7. package/src/lib/components/Alert.svelte +22 -4
  8. package/src/lib/components/AppLayout.svelte +34 -0
  9. package/src/lib/components/Avatar.svelte +28 -11
  10. package/src/lib/components/AvatarGroup.svelte +21 -4
  11. package/src/lib/components/Badge.svelte +22 -6
  12. package/src/lib/components/Banner.svelte +36 -7
  13. package/src/lib/components/Body.svelte +29 -0
  14. package/src/lib/components/BodyLg.svelte +26 -0
  15. package/src/lib/components/Breadcrumb.svelte +19 -12
  16. package/src/lib/components/Button.svelte +30 -1
  17. package/src/lib/components/CIDRInput.svelte +17 -9
  18. package/src/lib/components/Callout.svelte +29 -8
  19. package/src/lib/components/Caption.svelte +26 -0
  20. package/src/lib/components/Card.svelte +11 -3
  21. package/src/lib/components/CardMore.svelte +20 -0
  22. package/src/lib/components/CardTitle.svelte +20 -0
  23. package/src/lib/components/Carousel.svelte +27 -20
  24. package/src/lib/components/Checkbox.svelte +24 -3
  25. package/src/lib/components/Code.svelte +24 -0
  26. package/src/lib/components/CodeBlock.svelte +8 -7
  27. package/src/lib/components/ColorPicker.svelte +13 -13
  28. package/src/lib/components/ColumnToggle.svelte +10 -9
  29. package/src/lib/components/Combobox.svelte +31 -17
  30. package/src/lib/components/CommandPalette.svelte +42 -26
  31. package/src/lib/components/ConfirmDialog.svelte +21 -15
  32. package/src/lib/components/ContextMenu.svelte +12 -12
  33. package/src/lib/components/ContextualHelp.svelte +11 -6
  34. package/src/lib/components/CopyButton.svelte +2 -1
  35. package/src/lib/components/DatePicker.svelte +27 -23
  36. package/src/lib/components/DateRangePicker.svelte +46 -39
  37. package/src/lib/components/Delta.svelte +25 -0
  38. package/src/lib/components/Display1.svelte +29 -0
  39. package/src/lib/components/Display2.svelte +29 -0
  40. package/src/lib/components/Drawer.svelte +6 -5
  41. package/src/lib/components/DurationInput.svelte +16 -8
  42. package/src/lib/components/EmptyState.svelte +16 -7
  43. package/src/lib/components/ExpandableRow.svelte +8 -15
  44. package/src/lib/components/Eyebrow.svelte +25 -0
  45. package/src/lib/components/Field.svelte +7 -7
  46. package/src/lib/components/FieldStack.svelte +18 -0
  47. package/src/lib/components/FileUpload.svelte +8 -10
  48. package/src/lib/components/FilterBuilder.svelte +52 -28
  49. package/src/lib/components/FormActions.svelte +18 -0
  50. package/src/lib/components/FormRow.svelte +17 -0
  51. package/src/lib/components/Grid.svelte +17 -0
  52. package/src/lib/components/GroupedList.svelte +35 -21
  53. package/src/lib/components/H1.svelte +29 -0
  54. package/src/lib/components/H2.svelte +29 -0
  55. package/src/lib/components/H3.svelte +29 -0
  56. package/src/lib/components/H4.svelte +29 -0
  57. package/src/lib/components/HealthBar.svelte +6 -3
  58. package/src/lib/components/HoverCard.svelte +16 -5
  59. package/src/lib/components/IPInput.svelte +14 -8
  60. package/src/lib/components/IconButton.svelte +1 -2
  61. package/src/lib/components/InlineEdit.svelte +25 -14
  62. package/src/lib/components/Input.svelte +13 -4
  63. package/src/lib/components/InputGroup.svelte +14 -3
  64. package/src/lib/components/JsonViewer.svelte +7 -2
  65. package/src/lib/components/JsonViewerNode.svelte +38 -32
  66. package/src/lib/components/KVTable.svelte +10 -4
  67. package/src/lib/components/KanbanBoard.svelte +29 -27
  68. package/src/lib/components/Kbd.svelte +8 -5
  69. package/src/lib/components/Label.svelte +28 -0
  70. package/src/lib/components/LogViewer.svelte +24 -20
  71. package/src/lib/components/MACInput.svelte +14 -8
  72. package/src/lib/components/Mac.svelte +23 -0
  73. package/src/lib/components/Menubar.svelte +30 -13
  74. package/src/lib/components/Modal.svelte +15 -6
  75. package/src/lib/components/Mono.svelte +28 -0
  76. package/src/lib/components/MultiSelect.svelte +43 -23
  77. package/src/lib/components/Muted.svelte +24 -0
  78. package/src/lib/components/NameCell.svelte +35 -0
  79. package/src/lib/components/NotifDot.svelte +23 -0
  80. package/src/lib/components/NotificationPanel.svelte +44 -31
  81. package/src/lib/components/NumberInput.svelte +13 -12
  82. package/src/lib/components/OTPInput.svelte +14 -8
  83. package/src/lib/components/PageHeader.svelte +25 -0
  84. package/src/lib/components/Pagination.svelte +16 -12
  85. package/src/lib/components/PasswordInput.svelte +8 -7
  86. package/src/lib/components/Pill.svelte +34 -6
  87. package/src/lib/components/Popover.svelte +91 -16
  88. package/src/lib/components/ProgressBar.svelte +10 -7
  89. package/src/lib/components/RadioGroup.svelte +22 -7
  90. package/src/lib/components/RangeSlider.svelte +17 -12
  91. package/src/lib/components/RankedList.svelte +12 -18
  92. package/src/lib/components/ResizablePanel.svelte +25 -14
  93. package/src/lib/components/RowToggle.svelte +6 -4
  94. package/src/lib/components/SearchBox.svelte +6 -2
  95. package/src/lib/components/SegmentedControl.svelte +16 -2
  96. package/src/lib/components/Select.svelte +20 -8
  97. package/src/lib/components/SelectionToolbar.svelte +13 -9
  98. package/src/lib/components/Sidebar.svelte +32 -11
  99. package/src/lib/components/Signal.svelte +3 -2
  100. package/src/lib/components/Skeleton.svelte +21 -9
  101. package/src/lib/components/SkipLink.svelte +5 -2
  102. package/src/lib/components/Slider.svelte +16 -9
  103. package/src/lib/components/SortHeader.svelte +13 -4
  104. package/src/lib/components/SortableList.svelte +17 -18
  105. package/src/lib/components/Sparkline.svelte +20 -14
  106. package/src/lib/components/Spinner.svelte +16 -1
  107. package/src/lib/components/SplitButton.svelte +27 -8
  108. package/src/lib/components/Spoiler.svelte +8 -6
  109. package/src/lib/components/SrOnly.svelte +23 -0
  110. package/src/lib/components/StackedProgress.svelte +17 -9
  111. package/src/lib/components/StarRating.svelte +35 -10
  112. package/src/lib/components/Stat.svelte +19 -5
  113. package/src/lib/components/StatNumber.svelte +22 -0
  114. package/src/lib/components/StatusIndicator.svelte +9 -2
  115. package/src/lib/components/StatusRing.svelte +36 -0
  116. package/src/lib/components/Stepper.svelte +30 -8
  117. package/src/lib/components/Submeta.svelte +19 -0
  118. package/src/lib/components/SwitchPortGrid.svelte +20 -7
  119. package/src/lib/components/TablePager.svelte +22 -0
  120. package/src/lib/components/TableShell.svelte +19 -0
  121. package/src/lib/components/Tabs.svelte +16 -5
  122. package/src/lib/components/Tag.svelte +5 -3
  123. package/src/lib/components/TagInput.svelte +9 -10
  124. package/src/lib/components/Textarea.svelte +7 -1
  125. package/src/lib/components/TimePicker.svelte +14 -8
  126. package/src/lib/components/TimeRange.svelte +20 -22
  127. package/src/lib/components/Timeline.svelte +20 -9
  128. package/src/lib/components/Toast.svelte +24 -5
  129. package/src/lib/components/Toggle.svelte +10 -4
  130. package/src/lib/components/ToggleGroup.svelte +15 -5
  131. package/src/lib/components/Tooltip.svelte +20 -5
  132. package/src/lib/components/Topbar.svelte +108 -27
  133. package/src/lib/components/TopbarActions.svelte +52 -0
  134. package/src/lib/components/TransferList.svelte +30 -22
  135. package/src/lib/components/TreeItem.svelte +11 -13
  136. package/src/lib/components/Unit.svelte +22 -0
  137. package/src/lib/components/VirtualList.svelte +12 -9
  138. package/src/lib/index.ts +35 -0
@@ -0,0 +1,52 @@
1
+ <script lang="ts">
2
+ import IconButton from './IconButton.svelte';
3
+ import Avatar from './Avatar.svelte';
4
+ import SearchIcon from '../icons/SearchIcon.svelte';
5
+ import UpdatesIcon from '../icons/UpdatesIcon.svelte';
6
+ import BellIcon from '../icons/BellIcon.svelte';
7
+ import HelpIcon from '../icons/HelpIcon.svelte';
8
+
9
+ interface Props {
10
+ /** Avatar initials shown in the trailing account chip. */
11
+ initials?: string;
12
+ /** Unread count surfaced via the bell `aria-label` and the red dot
13
+ * overlay. `0` hides the dot. */
14
+ notificationCount?: number;
15
+ }
16
+
17
+ let { initials = 'MS', notificationCount = 1 }: Props = $props();
18
+ </script>
19
+
20
+ <!--
21
+ The canonical right-side action group inside <Topbar>: Search, Updates,
22
+ Notifications (with red dot overlay when unread), Help, and the account
23
+ <Avatar>. Renders the same five controls in the same order and with the
24
+ same Tailwind chrome as the default block inside <Topbar> itself, so
25
+ passing <Topbar actions={...}>{<TopbarActions />}</> behaves identically
26
+ to omitting the snippet.
27
+
28
+ Use it when userland wants to slot extra controls (theme toggle, status
29
+ pill, environment switch) _alongside_ the canonical block rather than
30
+ replace it. Compose your custom controls plus <TopbarActions /> and the
31
+ Topbar keeps the search / bell / avatar rhythm the reference dashboard
32
+ ships without copying classes, icons, or the inline notif span.
33
+ -->
34
+ <IconButton aria-label="Search" title="Search"><SearchIcon /></IconButton>
35
+ <IconButton aria-label="Updates" title="Updates"><UpdatesIcon /></IconButton>
36
+ <IconButton
37
+ aria-label={notificationCount > 0
38
+ ? `Notifications, ${notificationCount} new`
39
+ : 'Notifications'}
40
+ title="Notifications"
41
+ class="relative"
42
+ >
43
+ <BellIcon />
44
+ {#if notificationCount > 0}
45
+ <span
46
+ aria-hidden="true"
47
+ class="absolute right-1.5 top-1.5 h-1.5 w-1.5 rounded-full border-[1.5px] border-bg-page bg-status-danger"
48
+ ></span>
49
+ {/if}
50
+ </IconButton>
51
+ <IconButton aria-label="Help" title="Help"><HelpIcon /></IconButton>
52
+ <Avatar initials={initials} size="sm" alt="Account, {initials}" class="ml-1" />
@@ -107,22 +107,30 @@
107
107
  moveLeft(selTgt);
108
108
  }
109
109
  }
110
+
111
+ const PANEL_CLS = 'flex min-w-0 flex-1 flex-col gap-1.5 rounded-lg border border-border-1 bg-divider p-2';
112
+ const HEADER_CLS = 'flex items-center justify-between px-1 text-12 font-semibold uppercase tracking-[0.05em] text-text-3';
113
+ const COUNT_CLS = 'rounded bg-row-active px-1.5 py-0.5 text-11 text-text-4 tabular-nums';
114
+ const LIST_CLS = 'm-0 flex max-h-[240px] list-none flex-col gap-0.5 overflow-y-auto p-0 focus:outline-none';
115
+ const ITEM_CLS = 'flex cursor-pointer flex-col items-start gap-0 rounded px-2 py-1.5 text-13 text-text-2 hover:bg-row-hover aria-selected:bg-brand-05/[0.18] aria-selected:text-text-1 focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-brand-05';
116
+ const EMPTY_CLS = 'rounded px-2 py-3 text-center text-11 text-text-4';
117
+ const BTN_CLS = 'inline-flex h-7 w-7 cursor-pointer items-center justify-center rounded border border-border-2 bg-transparent text-13 text-text-3 hover:bg-row-hover hover:text-text-1 disabled:cursor-not-allowed disabled:opacity-30 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand-05';
110
118
  </script>
111
119
 
112
- <div class="tl {className}">
113
- <div class="tl__panel">
114
- <div class="tl__header">
115
- {sourceLabel} <span class="tl__count">{source.length}</span>
120
+ <div class="flex items-start gap-3 {className}">
121
+ <div class={PANEL_CLS}>
122
+ <div class={HEADER_CLS}>
123
+ {sourceLabel} <span class={COUNT_CLS}>{source.length}</span>
116
124
  </div>
117
125
  <ul
118
126
  role="listbox"
119
127
  aria-label={sourceLabel}
120
128
  aria-multiselectable="true"
121
- class="tl__list"
129
+ class={LIST_CLS}
122
130
  onkeydown={srcKey}
123
131
  >
124
132
  {#if source.length === 0}
125
- <li class="tl__empty" role="option" aria-selected="false" aria-disabled="true">Empty</li>
133
+ <li class={EMPTY_CLS} role="option" aria-selected="false" aria-disabled="true">Empty</li>
126
134
  {:else}
127
135
  {#each source as item, i (item.id)}
128
136
  <li
@@ -130,46 +138,46 @@
130
138
  role="option"
131
139
  aria-selected={selSrc.has(item.id)}
132
140
  tabindex={i === focSrc ? 0 : -1}
133
- class="tl__item{selSrc.has(item.id) ? ' tl__item--sel' : ''}"
141
+ class={ITEM_CLS}
134
142
  onclick={() => { focSrc = i; toggleSrc(item.id); }}
135
143
  onkeydown={(e) => { if (e.key === ' ') { e.preventDefault(); focSrc = i; toggleSrc(item.id); } }}
136
144
  >
137
- <span class="tl__item-label">{item.label}</span>
138
- {#if item.description}<span class="tl__item-desc">{item.description}</span>{/if}
145
+ <span>{item.label}</span>
146
+ {#if item.description}<span class="text-11 text-text-4">{item.description}</span>{/if}
139
147
  </li>
140
148
  {/each}
141
149
  {/if}
142
150
  </ul>
143
151
  </div>
144
152
 
145
- <div class="tl__controls" role="group" aria-label="Transfer controls">
146
- <button type="button" class="tl__btn" aria-label="Move all to {targetLabel}"
153
+ <div class="flex flex-col items-center gap-1 pt-7" role="group" aria-label="Transfer controls">
154
+ <button type="button" class={BTN_CLS} aria-label={`Move all to ${targetLabel}`}
147
155
  disabled={source.length === 0}
148
156
  onclick={() => moveRight(new Set(source.map((i) => i.id)))}>»</button>
149
- <button type="button" class="tl__btn" aria-label="Move selected to {targetLabel}"
157
+ <button type="button" class={BTN_CLS} aria-label={`Move selected to ${targetLabel}`}
150
158
  disabled={selSrc.size === 0}
151
159
  onclick={() => moveRight(selSrc)}>›</button>
152
- <button type="button" class="tl__btn" aria-label="Move selected back to {sourceLabel}"
160
+ <button type="button" class={BTN_CLS} aria-label={`Move selected back to ${sourceLabel}`}
153
161
  disabled={selTgt.size === 0}
154
162
  onclick={() => moveLeft(selTgt)}>‹</button>
155
- <button type="button" class="tl__btn" aria-label="Move all back to {sourceLabel}"
163
+ <button type="button" class={BTN_CLS} aria-label={`Move all back to ${sourceLabel}`}
156
164
  disabled={target.length === 0}
157
165
  onclick={() => moveLeft(new Set(target.map((i) => i.id)))}>«</button>
158
166
  </div>
159
167
 
160
- <div class="tl__panel">
161
- <div class="tl__header">
162
- {targetLabel} <span class="tl__count">{target.length}</span>
168
+ <div class={PANEL_CLS}>
169
+ <div class={HEADER_CLS}>
170
+ {targetLabel} <span class={COUNT_CLS}>{target.length}</span>
163
171
  </div>
164
172
  <ul
165
173
  role="listbox"
166
174
  aria-label={targetLabel}
167
175
  aria-multiselectable="true"
168
- class="tl__list"
176
+ class={LIST_CLS}
169
177
  onkeydown={tgtKey}
170
178
  >
171
179
  {#if target.length === 0}
172
- <li class="tl__empty" role="option" aria-selected="false" aria-disabled="true">Empty</li>
180
+ <li class={EMPTY_CLS} role="option" aria-selected="false" aria-disabled="true">Empty</li>
173
181
  {:else}
174
182
  {#each target as item, i (item.id)}
175
183
  <li
@@ -177,12 +185,12 @@
177
185
  role="option"
178
186
  aria-selected={selTgt.has(item.id)}
179
187
  tabindex={i === focTgt ? 0 : -1}
180
- class="tl__item{selTgt.has(item.id) ? ' tl__item--sel' : ''}"
188
+ class={ITEM_CLS}
181
189
  onclick={() => { focTgt = i; toggleTgt(item.id); }}
182
190
  onkeydown={(e) => { if (e.key === ' ') { e.preventDefault(); focTgt = i; toggleTgt(item.id); } }}
183
191
  >
184
- <span class="tl__item-label">{item.label}</span>
185
- {#if item.description}<span class="tl__item-desc">{item.description}</span>{/if}
192
+ <span>{item.label}</span>
193
+ {#if item.description}<span class="text-11 text-text-4">{item.description}</span>{/if}
186
194
  </li>
187
195
  {/each}
188
196
  {/if}
@@ -17,12 +17,7 @@
17
17
  focusedId: string;
18
18
  }
19
19
 
20
- let {
21
- node,
22
- expanded,
23
- selected,
24
- focusedId
25
- }: Props = $props();
20
+ let { node, expanded, selected, focusedId }: Props = $props();
26
21
 
27
22
  let hasChildren = $derived(!!node.children?.length);
28
23
  let isExpanded = $derived(expanded.has(node.id));
@@ -35,15 +30,18 @@
35
30
  aria-selected={isSelected}
36
31
  tabindex={focusedId === node.id ? 0 : -1}
37
32
  data-tree-id={node.id}
38
- class="tree__item"
33
+ class="list-none"
39
34
  >
40
- <div class="tree__row{isSelected ? ' tree__row--selected' : ''}">
35
+ <div
36
+ data-selected={isSelected ? 'true' : undefined}
37
+ class="flex items-center gap-2 rounded px-2 py-1 text-13 text-text-2 hover:bg-row-hover data-[selected=true]:bg-brand-05/[0.18] data-[selected=true]:text-text-1"
38
+ >
41
39
  {#if hasChildren}
42
40
  <svg
43
- class="tree__chevron{isExpanded ? ' tree__chevron--open' : ''}"
44
41
  viewBox="0 0 12 12"
45
42
  fill="none"
46
43
  aria-hidden="true"
44
+ class="h-3 w-3 shrink-0 text-text-4 transition-transform duration-100 motion-reduce:transition-none {isExpanded ? 'rotate-90' : ''}"
47
45
  >
48
46
  <path
49
47
  d="M4 2l4 4-4 4"
@@ -54,13 +52,13 @@
54
52
  />
55
53
  </svg>
56
54
  {:else}
57
- <span class="tree__indent" aria-hidden="true"></span>
55
+ <span class="inline-block w-3 shrink-0" aria-hidden="true"></span>
58
56
  {/if}
59
- <span class="tree__label">{node.label}</span>
60
- {#if node.meta}<span class="tree__meta">{node.meta}</span>{/if}
57
+ <span class="flex-1 truncate">{node.label}</span>
58
+ {#if node.meta}<span class="text-11 text-text-4">{node.meta}</span>{/if}
61
59
  </div>
62
60
  {#if hasChildren && isExpanded && node.children}
63
- <ul role="group" class="tree__group">
61
+ <ul role="group" class="m-0 list-none pl-4">
64
62
  {#each node.children as child (child.id)}
65
63
  <TreeItem
66
64
  node={child}
@@ -0,0 +1,22 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ class?: string;
4
+ children?: import('svelte').Snippet;
5
+ }
6
+
7
+ let { class: className = '', children }: Props = $props();
8
+ </script>
9
+
10
+ <!--
11
+ Small inline label that trails a hero number inside a .stat row or a <Card>
12
+ title row (e.g. "Mbps · down", "Last 24 h", "ms · jitter band"). Renders a
13
+ <span class="unit"> so the .unit rule in @w5-ui/tokens/dashboard.css sets
14
+ the canonical muted colour, 12 px size, and inline-block rhythm. Stops
15
+ userland reaching for inline font-size / color overrides next to bare
16
+ numbers. Pair with <Stat> (which already wires this internally) for hero
17
+ tiles, or compose by hand inside a <Card> when the number sits above a
18
+ chart.
19
+ -->
20
+ <span class="unit {className}">
21
+ {@render children?.()}
22
+ </span>
@@ -14,7 +14,7 @@
14
14
  height = 400,
15
15
  label = undefined,
16
16
  overscan = 3,
17
- children
17
+ children,
18
18
  }: Props = $props();
19
19
 
20
20
  let scrollTop = $state(0);
@@ -22,27 +22,30 @@
22
22
  let totalHeight = $derived(items.length * itemHeight);
23
23
  let firstVisible = $derived(Math.floor(scrollTop / itemHeight));
24
24
  let startIndex = $derived(Math.max(0, firstVisible - overscan));
25
- let endIndex = $derived(Math.min(items.length, firstVisible + Math.ceil(height / itemHeight) + overscan + 1));
26
- let visible = $derived(items.slice(startIndex, endIndex).map((item, i) => ({ item, index: startIndex + i })));
25
+ let endIndex = $derived(
26
+ Math.min(items.length, firstVisible + Math.ceil(height / itemHeight) + overscan + 1),
27
+ );
28
+ let visible = $derived(
29
+ items.slice(startIndex, endIndex).map((item, i) => ({ item, index: startIndex + i })),
30
+ );
27
31
  </script>
28
32
 
29
33
  <div
30
34
  role="list"
31
35
  aria-label={label}
32
- class="vl"
36
+ class="relative overflow-y-auto"
33
37
  style:height="{height}px"
34
- style:overflow-y="auto"
35
38
  onscroll={(e) => (scrollTop = e.currentTarget.scrollTop)}
36
39
  >
37
- <div style:height="{totalHeight}px" style:position="relative">
38
- <div style:position="absolute" style:top="{startIndex * itemHeight}px" style:width="100%">
40
+ <div class="relative" style:height="{totalHeight}px">
41
+ <div class="absolute left-0 right-0" style:top="{startIndex * itemHeight}px">
39
42
  {#each visible as { item, index } (index)}
40
43
  <div
41
44
  role="listitem"
45
+ class="overflow-hidden"
42
46
  style:height="{itemHeight}px"
43
- style:overflow="hidden"
44
47
  >
45
- {@render children?.({ item, index, })}
48
+ {@render children?.({ item, index })}
46
49
  </div>
47
50
  {/each}
48
51
  </div>
package/src/lib/index.ts CHANGED
@@ -28,6 +28,7 @@ export { default as Signal } from './components/Signal.svelte'
28
28
  export { default as StatusIndicator } from './components/StatusIndicator.svelte'
29
29
  export { default as Donut } from './components/Donut.svelte'
30
30
  export { default as Topbar } from './components/Topbar.svelte'
31
+ export type { AppDef, TopbarStatus } from './components/Topbar.svelte'
31
32
  export { default as Sidebar } from './components/Sidebar.svelte'
32
33
  export type { SidebarSectionDef, SidebarItemDef } from './components/Sidebar.svelte'
33
34
  export { default as Skeleton } from './components/Skeleton.svelte'
@@ -271,5 +272,39 @@ export type {
271
272
  GroupedListGroup,
272
273
  GroupedListItemStatus,
273
274
  } from './components/GroupedList.svelte'
275
+ export { default as PageHeader } from './components/PageHeader.svelte'
276
+ export { default as AppLayout } from './components/AppLayout.svelte'
277
+ export { default as Grid } from './components/Grid.svelte'
278
+ export { default as FieldStack } from './components/FieldStack.svelte'
279
+ export { default as FormRow } from './components/FormRow.svelte'
280
+ export { default as FormActions } from './components/FormActions.svelte'
281
+ export { default as TableShell } from './components/TableShell.svelte'
282
+ export { default as TablePager } from './components/TablePager.svelte'
283
+ export { default as Submeta } from './components/Submeta.svelte'
284
+ export { default as Delta } from './components/Delta.svelte'
285
+ export { default as CardMore } from './components/CardMore.svelte'
286
+ export { default as Unit } from './components/Unit.svelte'
287
+ export { default as StatNumber } from './components/StatNumber.svelte'
288
+ export { default as CardTitle } from './components/CardTitle.svelte'
289
+ export { default as Mac } from './components/Mac.svelte'
290
+ export { default as NameCell } from './components/NameCell.svelte'
291
+ export { default as SrOnly } from './components/SrOnly.svelte'
292
+ export { default as NotifDot } from './components/NotifDot.svelte'
293
+ export { default as StatusRing } from './components/StatusRing.svelte'
294
+ export { default as TopbarActions } from './components/TopbarActions.svelte'
295
+ export { default as Muted } from './components/Muted.svelte'
296
+ export { default as Code } from './components/Code.svelte'
297
+ export { default as Eyebrow } from './components/Eyebrow.svelte'
298
+ export { default as Mono } from './components/Mono.svelte'
299
+ export { default as Caption } from './components/Caption.svelte'
300
+ export { default as BodyLg } from './components/BodyLg.svelte'
301
+ export { default as Body } from './components/Body.svelte'
302
+ export { default as Label } from './components/Label.svelte'
303
+ export { default as Display1 } from './components/Display1.svelte'
304
+ export { default as Display2 } from './components/Display2.svelte'
305
+ export { default as H1 } from './components/H1.svelte'
306
+ export { default as H2 } from './components/H2.svelte'
307
+ export { default as H3 } from './components/H3.svelte'
308
+ export { default as H4 } from './components/H4.svelte'
274
309
 
275
310
  export * from './icons.js'