@loidolt/theme-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 (55) hide show
  1. package/dist/components/Accordion.svelte +100 -0
  2. package/dist/components/Accordion.svelte.d.ts +50 -0
  3. package/dist/components/Alert.svelte +6 -3
  4. package/dist/components/Alert.svelte.d.ts +3 -2
  5. package/dist/components/AlertDialog.svelte +109 -0
  6. package/dist/components/AlertDialog.svelte.d.ts +32 -0
  7. package/dist/components/Badge.svelte +9 -2
  8. package/dist/components/Badge.svelte.d.ts +2 -1
  9. package/dist/components/Brand.svelte +29 -15
  10. package/dist/components/Brand.svelte.d.ts +8 -4
  11. package/dist/components/Breadcrumbs.svelte +53 -0
  12. package/dist/components/Breadcrumbs.svelte.d.ts +18 -0
  13. package/dist/components/Button.svelte +43 -21
  14. package/dist/components/Button.svelte.d.ts +9 -4
  15. package/dist/components/Drawer.svelte +90 -0
  16. package/dist/components/Drawer.svelte.d.ts +28 -0
  17. package/dist/components/DropdownMenu.svelte +2 -2
  18. package/dist/components/DropdownMenu.svelte.d.ts +1 -1
  19. package/dist/components/EmptyState.svelte +40 -0
  20. package/dist/components/EmptyState.svelte.d.ts +19 -0
  21. package/dist/components/Fieldset.svelte +60 -0
  22. package/dist/components/Fieldset.svelte.d.ts +19 -0
  23. package/dist/components/IconButton.svelte +1 -1
  24. package/dist/components/Input.svelte.d.ts +1 -1
  25. package/dist/components/NavMenu.svelte +6 -1
  26. package/dist/components/NavMenu.svelte.d.ts +2 -1
  27. package/dist/components/NumberField.svelte +12 -1
  28. package/dist/components/NumberField.svelte.d.ts +1 -1
  29. package/dist/components/Pagination.svelte +86 -0
  30. package/dist/components/Pagination.svelte.d.ts +22 -0
  31. package/dist/components/RadioGroup.svelte.d.ts +2 -2
  32. package/dist/components/Select.svelte.d.ts +2 -2
  33. package/dist/components/Table.svelte +30 -3
  34. package/dist/components/Table.svelte.d.ts +13 -0
  35. package/dist/components/TableHeader.svelte +72 -0
  36. package/dist/components/TableHeader.svelte.d.ts +24 -0
  37. package/dist/components/Tabs.svelte +15 -7
  38. package/dist/components/Tabs.svelte.d.ts +4 -3
  39. package/dist/components/Textarea.svelte.d.ts +1 -1
  40. package/dist/components/ThemeToggle.svelte +62 -0
  41. package/dist/components/ThemeToggle.svelte.d.ts +25 -0
  42. package/dist/components/ToggleGroup.svelte +107 -0
  43. package/dist/components/ToggleGroup.svelte.d.ts +46 -0
  44. package/dist/components/TooltipProvider.svelte +1 -0
  45. package/dist/components/Workspace.svelte +18 -5
  46. package/dist/components/Workspace.svelte.d.ts +8 -0
  47. package/dist/index.d.ts +16 -2
  48. package/dist/index.js +13 -1
  49. package/dist/media.svelte.d.ts +48 -0
  50. package/dist/media.svelte.js +69 -0
  51. package/dist/theme.svelte.d.ts +86 -0
  52. package/dist/theme.svelte.js +156 -0
  53. package/dist/toaster.svelte.js +22 -8
  54. package/dist/types.d.ts +21 -0
  55. package/package.json +5 -4
@@ -0,0 +1,72 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import type { HTMLThAttributes } from 'svelte/elements';
4
+ import type { ColumnAlign, SortDirection } from '../types.js';
5
+ import { cx } from '../utils.js';
6
+
7
+ // `align` is omitted from the base: the deprecated HTML attribute of that name takes
8
+ // physical values (`left`/`right`), and this one is logical.
9
+ interface Props extends Omit<HTMLThAttributes, 'children' | 'align'> {
10
+ /**
11
+ * Current sort state of this column. Drives `aria-sort` and the indicator; leave at `none`
12
+ * for every column that is not the sorted one, so screen readers report a single sort.
13
+ */
14
+ sort?: SortDirection;
15
+ /**
16
+ * Makes the header a sort control. Called with the direction a press asks for: `ascending`
17
+ * for an unsorted or descending column, `descending` for an ascending one.
18
+ */
19
+ onSort?: (direction: SortDirection) => void;
20
+ align?: ColumnAlign;
21
+ /** Accessible name of the sort button when the header's own text is not enough. */
22
+ sortLabel?: string;
23
+ class?: string;
24
+ children: Snippet;
25
+ ref?: HTMLTableCellElement | null;
26
+ }
27
+
28
+ let {
29
+ sort = 'none',
30
+ onSort,
31
+ align,
32
+ sortLabel,
33
+ class: className,
34
+ children,
35
+ ref = $bindable(null),
36
+ ...rest
37
+ }: Props = $props();
38
+
39
+ // Two-state cycle. A third "unsorted" step reads as a broken control far more often than it
40
+ // reads as a feature: the table has to be sorted *somehow*, so there is nothing to return to.
41
+ const next = $derived<SortDirection>(sort === 'ascending' ? 'descending' : 'ascending');
42
+ </script>
43
+
44
+ <!--
45
+ A `<th>` that can sort. `aria-sort` lives on the cell (where the spec puts it) while the
46
+ press target is a real button inside it, so the column is reachable and announced by keyboard
47
+ without turning the whole cell into a click surface.
48
+ -->
49
+ <th
50
+ bind:this={ref}
51
+ scope="col"
52
+ class={cx('ldt-table__header', className)}
53
+ data-align={align}
54
+ aria-sort={onSort ? sort : undefined}
55
+ {...rest}
56
+ >
57
+ {#if onSort}
58
+ <button
59
+ type="button"
60
+ class="ldt-table__sort"
61
+ data-sort={sort}
62
+ aria-label={sortLabel}
63
+ onclick={() => onSort(next)}
64
+ >
65
+ {@render children()}
66
+ <!-- Decorative: `aria-sort` already carries the state to assistive tech. -->
67
+ <span class="ldt-table__sort-indicator" aria-hidden="true"></span>
68
+ </button>
69
+ {:else}
70
+ {@render children()}
71
+ {/if}
72
+ </th>
@@ -0,0 +1,24 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLThAttributes } from 'svelte/elements';
3
+ import type { ColumnAlign, SortDirection } from '../types.js';
4
+ interface Props extends Omit<HTMLThAttributes, 'children' | 'align'> {
5
+ /**
6
+ * Current sort state of this column. Drives `aria-sort` and the indicator; leave at `none`
7
+ * for every column that is not the sorted one, so screen readers report a single sort.
8
+ */
9
+ sort?: SortDirection;
10
+ /**
11
+ * Makes the header a sort control. Called with the direction a press asks for: `ascending`
12
+ * for an unsorted or descending column, `descending` for an ascending one.
13
+ */
14
+ onSort?: (direction: SortDirection) => void;
15
+ align?: ColumnAlign;
16
+ /** Accessible name of the sort button when the header's own text is not enough. */
17
+ sortLabel?: string;
18
+ class?: string;
19
+ children: Snippet;
20
+ ref?: HTMLTableCellElement | null;
21
+ }
22
+ declare const TableHeader: import("svelte").Component<Props, {}, "ref">;
23
+ type TableHeader = ReturnType<typeof TableHeader>;
24
+ export default TableHeader;
@@ -1,10 +1,14 @@
1
1
  <script lang="ts" generics="T extends string = string">
2
2
  import { Tabs as TabsPrimitive } from 'bits-ui';
3
+ import type { TabsRootProps } from 'bits-ui';
3
4
  import type { Snippet } from 'svelte';
4
5
  import type { NavItem, Orientation } from '../types.js';
5
6
  import { cx } from '../utils.js';
6
7
 
7
- interface Props {
8
+ interface Props extends Omit<
9
+ TabsRootProps,
10
+ 'value' | 'onValueChange' | 'orientation' | 'children' | 'child' | 'class' | 'ref'
11
+ > {
8
12
  /** Defaults to the first tab, so a panel is always rendered. */
9
13
  value?: T;
10
14
  tabs: NavItem<T>[];
@@ -20,8 +24,10 @@
20
24
  }
21
25
 
22
26
  let {
23
- value = $bindable(),
24
27
  tabs,
28
+ // Defaulted at destructure time (not in an effect) so SSR output and the first client
29
+ // frame already agree with what a parent binding observes.
30
+ value = $bindable(tabs[0]?.value),
25
31
  label,
26
32
  orientation = 'horizontal',
27
33
  children,
@@ -30,13 +36,14 @@
30
36
  contentClass,
31
37
  onValueChange,
32
38
  ref = $bindable(null),
39
+ ...rest
33
40
  }: Props = $props();
34
41
 
35
- $effect(() => {
36
- if (value === undefined && tabs.length > 0) value = tabs[0].value;
37
- });
38
-
39
- const active = $derived(value ?? tabs[0]?.value);
42
+ // Falls back to the first tab when `value` points at a tab that no longer exists,
43
+ // so removing the selected tab cannot blank every panel.
44
+ const active = $derived(
45
+ value !== undefined && tabs.some((tab) => tab.value === value) ? value : tabs[0]?.value
46
+ );
40
47
  </script>
41
48
 
42
49
  <TabsPrimitive.Root
@@ -48,6 +55,7 @@
48
55
  }}
49
56
  {orientation}
50
57
  class={cx('ldt-tabs', className)}
58
+ {...rest}
51
59
  >
52
60
  <TabsPrimitive.List class={cx('ldt-tabs__list', listClass)} aria-label={label}
53
61
  >{#each tabs as tab (tab.value)}<TabsPrimitive.Trigger
@@ -1,7 +1,8 @@
1
+ import { Tabs as TabsPrimitive } from 'bits-ui';
1
2
  import type { Snippet } from 'svelte';
2
3
  import type { NavItem, Orientation } from '../types.js';
3
4
  declare function $$render<T extends string = string>(): {
4
- props: {
5
+ props: Omit<TabsPrimitive.RootProps, "children" | "class" | "value" | "onValueChange" | "ref" | "child" | "orientation"> & {
5
6
  /** Defaults to the first tab, so a panel is always rendered. */
6
7
  value?: T;
7
8
  tabs: NavItem<T>[];
@@ -18,7 +19,7 @@ declare function $$render<T extends string = string>(): {
18
19
  ref?: HTMLElement | null;
19
20
  };
20
21
  exports: {};
21
- bindings: "ref" | "value";
22
+ bindings: "value" | "ref";
22
23
  slots: {};
23
24
  events: {};
24
25
  };
@@ -26,7 +27,7 @@ declare class __sveltets_Render<T extends string = string> {
26
27
  props(): ReturnType<typeof $$render<T>>['props'];
27
28
  events(): ReturnType<typeof $$render<T>>['events'];
28
29
  slots(): ReturnType<typeof $$render<T>>['slots'];
29
- bindings(): "ref" | "value";
30
+ bindings(): "value" | "ref";
30
31
  exports(): {};
31
32
  }
32
33
  interface $$IsomorphicComponent {
@@ -6,6 +6,6 @@ interface Props extends Omit<HTMLTextareaAttributes, 'value'> {
6
6
  class?: string;
7
7
  ref?: HTMLTextAreaElement | null;
8
8
  }
9
- declare const Textarea: import("svelte").Component<Props, {}, "ref" | "value">;
9
+ declare const Textarea: import("svelte").Component<Props, {}, "value" | "ref">;
10
10
  type Textarea = ReturnType<typeof Textarea>;
11
11
  export default Textarea;
@@ -0,0 +1,62 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import type { ControlSize, Option } from '../types.js';
4
+ import type { Theme, ThemePreference } from '../theme.svelte.js';
5
+ import ToggleGroup from './ToggleGroup.svelte';
6
+
7
+ interface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
8
+ /** The store from `createTheme()`. */
9
+ theme: Theme;
10
+ /** Narrowed from the DOM attribute: the group this spreads onto rejects `null`. */
11
+ id?: string;
12
+ /** Accessible name of the group. */
13
+ label?: string;
14
+ lightLabel?: string;
15
+ darkLabel?: string;
16
+ systemLabel?: string;
17
+ /**
18
+ * Offers "system" alongside the two schemes. Worth keeping: without it a user who has not
19
+ * chosen is silently locked to whichever scheme they happened to land on.
20
+ */
21
+ showSystem?: boolean;
22
+ size?: ControlSize;
23
+ class?: string;
24
+ ref?: HTMLDivElement | null;
25
+ }
26
+
27
+ let {
28
+ theme,
29
+ label = 'Colour scheme',
30
+ lightLabel = 'Light',
31
+ darkLabel = 'Dark',
32
+ systemLabel = 'System',
33
+ showSystem = true,
34
+ size = 'sm',
35
+ class: className,
36
+ ref = $bindable(null),
37
+ ...rest
38
+ }: Props = $props();
39
+
40
+ const options = $derived<Option<ThemePreference>[]>([
41
+ { value: 'light', label: lightLabel },
42
+ { value: 'dark', label: darkLabel },
43
+ ...(showSystem ? [{ value: 'system' as const, label: systemLabel }] : []),
44
+ ]);
45
+ </script>
46
+
47
+ <!--
48
+ A segmented scheme picker wired to `createTheme()`. Pressing the pressed option is ignored: a
49
+ toggle group deselects on a second press, and "no colour scheme" is not a state a page can be in.
50
+ -->
51
+ <ToggleGroup
52
+ bind:ref
53
+ {options}
54
+ {label}
55
+ {size}
56
+ value={theme.preference}
57
+ onValueChange={(next) => {
58
+ if (next) theme.preference = next as ThemePreference;
59
+ }}
60
+ class={className}
61
+ {...rest}
62
+ />
@@ -0,0 +1,25 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ import type { ControlSize } from '../types.js';
3
+ import type { Theme } from '../theme.svelte.js';
4
+ interface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
5
+ /** The store from `createTheme()`. */
6
+ theme: Theme;
7
+ /** Narrowed from the DOM attribute: the group this spreads onto rejects `null`. */
8
+ id?: string;
9
+ /** Accessible name of the group. */
10
+ label?: string;
11
+ lightLabel?: string;
12
+ darkLabel?: string;
13
+ systemLabel?: string;
14
+ /**
15
+ * Offers "system" alongside the two schemes. Worth keeping: without it a user who has not
16
+ * chosen is silently locked to whichever scheme they happened to land on.
17
+ */
18
+ showSystem?: boolean;
19
+ size?: ControlSize;
20
+ class?: string;
21
+ ref?: HTMLDivElement | null;
22
+ }
23
+ declare const ThemeToggle: import("svelte").Component<Props, {}, "ref">;
24
+ type ThemeToggle = ReturnType<typeof ThemeToggle>;
25
+ export default ThemeToggle;
@@ -0,0 +1,107 @@
1
+ <script lang="ts" generics="T extends string = string">
2
+ import { ToggleGroup as ToggleGroupPrimitive } from 'bits-ui';
3
+ import type { Snippet } from 'svelte';
4
+ import type { HTMLAttributes } from 'svelte/elements';
5
+ import type { ControlSize, Option, Orientation } from '../types.js';
6
+ import { cx } from '../utils.js';
7
+
8
+ interface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
9
+ options: Option<T>[];
10
+ /** Narrowed from the DOM attribute: the Bits root this spreads onto rejects `null`. */
11
+ id?: string;
12
+ /** Lets more than one option be pressed at once. `value` is then an array. */
13
+ multiple?: boolean;
14
+ /** Pressed option, or options when `multiple`. Bindable. */
15
+ value?: T | T[];
16
+ /** Accessible name of the group. */
17
+ label?: string;
18
+ size?: ControlSize;
19
+ orientation?: Orientation;
20
+ disabled?: boolean;
21
+ /** Renders an option's contents — an icon, say — in place of its plain label. */
22
+ children?: Snippet<[Option<T>]>;
23
+ class?: string;
24
+ itemClass?: string;
25
+ onValueChange?: (value: T | T[]) => void;
26
+ ref?: HTMLDivElement | null;
27
+ }
28
+
29
+ let {
30
+ options,
31
+ multiple = false,
32
+ value = $bindable(),
33
+ label,
34
+ size = 'md',
35
+ orientation = 'horizontal',
36
+ disabled = false,
37
+ children,
38
+ class: className,
39
+ itemClass,
40
+ onValueChange,
41
+ ref = $bindable(null),
42
+ ...rest
43
+ }: Props = $props();
44
+
45
+ const classes = $derived(
46
+ cx('ldt-toggle-group', size !== 'md' && `ldt-toggle-group--${size}`, className)
47
+ );
48
+
49
+ // As with `Accordion`, only the Root's typing differs between the two modes.
50
+ const change = (next: string | string[]) => {
51
+ value = next as T | T[];
52
+ onValueChange?.(next as T | T[]);
53
+ };
54
+ </script>
55
+
56
+ <!--
57
+ A segmented control: a small, fixed set of choices shown side by side rather than folded into a
58
+ Select. Single mode is a radio group in behaviour — one press replaces the last — so reach for
59
+ it when the options are worth showing at all times.
60
+ -->
61
+ {#snippet items()}
62
+ {#each options as option (option.value)}
63
+ <ToggleGroupPrimitive.Item
64
+ value={option.value}
65
+ disabled={option.disabled}
66
+ class={cx('ldt-toggle-group__item', itemClass)}
67
+ >{#if children}{@render children(option)}{:else}{option.label}{/if}</ToggleGroupPrimitive.Item
68
+ >
69
+ {/each}
70
+ {/snippet}
71
+
72
+ {#if multiple}
73
+ <ToggleGroupPrimitive.Root
74
+ bind:ref
75
+ type="multiple"
76
+ value={(value ?? []) as string[]}
77
+ onValueChange={change}
78
+ {orientation}
79
+ {disabled}
80
+ class={classes}
81
+ aria-label={label}
82
+ {...rest}
83
+ >
84
+ {@render items()}
85
+ </ToggleGroupPrimitive.Root>
86
+ {:else}
87
+ <!--
88
+ Rendered through `child` to correct the root's role. In single mode Bits marks the items
89
+ `role="radio"` but leaves the root at `role="group"`, and a radio must be owned by a
90
+ `radiogroup` — otherwise assistive tech reports loose radios with no set and no position.
91
+ -->
92
+ <ToggleGroupPrimitive.Root
93
+ bind:ref
94
+ type="single"
95
+ value={(value ?? '') as string}
96
+ onValueChange={change}
97
+ {orientation}
98
+ {disabled}
99
+ class={classes}
100
+ aria-label={label}
101
+ {...rest}
102
+ >
103
+ {#snippet child({ props })}
104
+ <div {...props} role="radiogroup">{@render items()}</div>
105
+ {/snippet}
106
+ </ToggleGroupPrimitive.Root>
107
+ {/if}
@@ -0,0 +1,46 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import type { ControlSize, Option, Orientation } from '../types.js';
4
+ declare function $$render<T extends string = string>(): {
5
+ props: Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
6
+ options: Option<T>[];
7
+ /** Narrowed from the DOM attribute: the Bits root this spreads onto rejects `null`. */
8
+ id?: string;
9
+ /** Lets more than one option be pressed at once. `value` is then an array. */
10
+ multiple?: boolean;
11
+ /** Pressed option, or options when `multiple`. Bindable. */
12
+ value?: T | T[];
13
+ /** Accessible name of the group. */
14
+ label?: string;
15
+ size?: ControlSize;
16
+ orientation?: Orientation;
17
+ disabled?: boolean;
18
+ /** Renders an option's contents — an icon, say — in place of its plain label. */
19
+ children?: Snippet<[Option<T>]>;
20
+ class?: string;
21
+ itemClass?: string;
22
+ onValueChange?: (value: T | T[]) => void;
23
+ ref?: HTMLDivElement | null;
24
+ };
25
+ exports: {};
26
+ bindings: "value" | "ref";
27
+ slots: {};
28
+ events: {};
29
+ };
30
+ declare class __sveltets_Render<T extends string = string> {
31
+ props(): ReturnType<typeof $$render<T>>['props'];
32
+ events(): ReturnType<typeof $$render<T>>['events'];
33
+ slots(): ReturnType<typeof $$render<T>>['slots'];
34
+ bindings(): "value" | "ref";
35
+ exports(): {};
36
+ }
37
+ interface $$IsomorphicComponent {
38
+ new <T extends string = string>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
39
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
40
+ } & ReturnType<__sveltets_Render<T>['exports']>;
41
+ <T extends string = string>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
42
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
43
+ }
44
+ declare const ToggleGroup: $$IsomorphicComponent;
45
+ type ToggleGroup<T extends string = string> = InstanceType<typeof ToggleGroup<T>>;
46
+ export default ToggleGroup;
@@ -6,6 +6,7 @@
6
6
  import { Tooltip as TooltipPrimitive } from 'bits-ui';
7
7
  import { setContext, type Snippet } from 'svelte';
8
8
 
9
+ // Renderless: no element of its own, so there are no rest attributes to forward.
9
10
  interface Props {
10
11
  /** Delay before the first tooltip in the group opens. */
11
12
  delayDuration?: number;
@@ -7,6 +7,14 @@
7
7
  sidebar?: Snippet;
8
8
  children: Snippet;
9
9
  inspector?: Snippet;
10
+ /**
11
+ * Collapses the sidebar column when `false` — the toggle behind a "hide navigation" control.
12
+ * The snippet is left unrendered rather than hidden, so nothing in it holds focus or is
13
+ * reachable by the tab order while collapsed.
14
+ */
15
+ sidebarOpen?: boolean;
16
+ /** The same for the inspector column. */
17
+ inspectorOpen?: boolean;
10
18
  class?: string;
11
19
  ref?: HTMLDivElement | null;
12
20
  }
@@ -15,24 +23,29 @@
15
23
  sidebar,
16
24
  children,
17
25
  inspector,
26
+ sidebarOpen = true,
27
+ inspectorOpen = true,
18
28
  class: className,
19
29
  ref = $bindable(null),
20
30
  ...rest
21
31
  }: Props = $props();
32
+
33
+ const showSidebar = $derived(Boolean(sidebar) && sidebarOpen);
34
+ const showInspector = $derived(Boolean(inspector) && inspectorOpen);
22
35
  </script>
23
36
 
24
- <!-- The grid columns follow the snippets that are actually present. -->
37
+ <!-- The grid columns follow the panes that are actually rendered. -->
25
38
  <div
26
39
  bind:this={ref}
27
40
  class={cx(
28
41
  'ldt-workspace',
29
- sidebar && 'ldt-workspace--sidebar',
30
- inspector && 'ldt-workspace--inspector',
42
+ showSidebar && 'ldt-workspace--sidebar',
43
+ showInspector && 'ldt-workspace--inspector',
31
44
  className
32
45
  )}
33
46
  {...rest}
34
47
  >
35
- {#if sidebar}{@render sidebar()}{/if}
48
+ {#if showSidebar}{@render sidebar!()}{/if}
36
49
  <div class="ldt-workspace__main">{@render children()}</div>
37
- {#if inspector}{@render inspector()}{/if}
50
+ {#if showInspector}{@render inspector!()}{/if}
38
51
  </div>
@@ -4,6 +4,14 @@ interface Props extends HTMLAttributes<HTMLDivElement> {
4
4
  sidebar?: Snippet;
5
5
  children: Snippet;
6
6
  inspector?: Snippet;
7
+ /**
8
+ * Collapses the sidebar column when `false` — the toggle behind a "hide navigation" control.
9
+ * The snippet is left unrendered rather than hidden, so nothing in it holds focus or is
10
+ * reachable by the tab order while collapsed.
11
+ */
12
+ sidebarOpen?: boolean;
13
+ /** The same for the inspector column. */
14
+ inspectorOpen?: boolean;
7
15
  class?: string;
8
16
  ref?: HTMLDivElement | null;
9
17
  }
package/dist/index.d.ts CHANGED
@@ -1,20 +1,27 @@
1
+ export { default as Accordion } from './components/Accordion.svelte';
1
2
  export { default as Alert } from './components/Alert.svelte';
3
+ export { default as AlertDialog } from './components/AlertDialog.svelte';
2
4
  export { default as AppShell } from './components/AppShell.svelte';
3
5
  export { default as Badge } from './components/Badge.svelte';
4
6
  export { default as Brand } from './components/Brand.svelte';
7
+ export { default as Breadcrumbs } from './components/Breadcrumbs.svelte';
5
8
  export { default as Button } from './components/Button.svelte';
6
9
  export { default as Card } from './components/Card.svelte';
7
10
  export { default as Checkbox } from './components/Checkbox.svelte';
8
11
  export { default as ContextBar } from './components/ContextBar.svelte';
9
12
  export { default as Dialog } from './components/Dialog.svelte';
13
+ export { default as Drawer } from './components/Drawer.svelte';
10
14
  export { default as DropdownMenu } from './components/DropdownMenu.svelte';
15
+ export { default as EmptyState } from './components/EmptyState.svelte';
11
16
  export { default as Field } from './components/Field.svelte';
17
+ export { default as Fieldset } from './components/Fieldset.svelte';
12
18
  export { default as IconButton } from './components/IconButton.svelte';
13
19
  export { default as Input } from './components/Input.svelte';
14
20
  export { default as Label } from './components/Label.svelte';
15
21
  export { default as NavMenu } from './components/NavMenu.svelte';
16
22
  export { default as NumberField } from './components/NumberField.svelte';
17
23
  export { default as PageHeader } from './components/PageHeader.svelte';
24
+ export { default as Pagination } from './components/Pagination.svelte';
18
25
  export { default as Panel } from './components/Panel.svelte';
19
26
  export { default as Popover } from './components/Popover.svelte';
20
27
  export { default as Progress } from './components/Progress.svelte';
@@ -27,10 +34,13 @@ export { default as Skeleton } from './components/Skeleton.svelte';
27
34
  export { default as Spinner } from './components/Spinner.svelte';
28
35
  export { default as Switch } from './components/Switch.svelte';
29
36
  export { default as Table } from './components/Table.svelte';
37
+ export { default as TableHeader } from './components/TableHeader.svelte';
30
38
  export { default as Tabs } from './components/Tabs.svelte';
31
39
  export { default as Textarea } from './components/Textarea.svelte';
40
+ export { default as ThemeToggle } from './components/ThemeToggle.svelte';
32
41
  export { default as Toast } from './components/Toast.svelte';
33
42
  export { default as ToastViewport } from './components/ToastViewport.svelte';
43
+ export { default as ToggleGroup } from './components/ToggleGroup.svelte';
34
44
  export { default as Tooltip } from './components/Tooltip.svelte';
35
45
  export { default as TooltipProvider } from './components/TooltipProvider.svelte';
36
46
  export { default as Topbar } from './components/Topbar.svelte';
@@ -39,8 +49,12 @@ export { default as Workspace } from './components/Workspace.svelte';
39
49
  * Bits UI primitives behind the wrappers, for menus and overlays this package does not
40
50
  * model declaratively (checkbox/radio items, submenus, custom overlay composition).
41
51
  */
42
- export { Dialog as DialogPrimitive, DropdownMenu as DropdownMenuPrimitive, Popover as PopoverPrimitive, Tabs as TabsPrimitive, Tooltip as TooltipPrimitive, } from 'bits-ui';
52
+ export { Accordion as AccordionPrimitive, AlertDialog as AlertDialogPrimitive, Dialog as DialogPrimitive, DropdownMenu as DropdownMenuPrimitive, Pagination as PaginationPrimitive, Popover as PopoverPrimitive, Tabs as TabsPrimitive, ToggleGroup as ToggleGroupPrimitive, Tooltip as TooltipPrimitive, } from 'bits-ui';
43
53
  export { cx } from './utils.js';
44
54
  export { createToaster } from './toaster.svelte.js';
45
55
  export type { Toaster, ToasterOptions, ToastOptions, ToastRecord } from './toaster.svelte.js';
46
- export type { ActionVariant, Alignment, BadgeVariant, ControlSize, DialogSize, HeadingLevel, MenuItem, NavItem, Option, Orientation, Placement, StatusVariant, TriggerChildProps, } from './types.js';
56
+ export { createTheme, themeScript } from './theme.svelte.js';
57
+ export type { ColorScheme, Theme, ThemeOptions, ThemePreference, ThemeScriptOptions, } from './theme.svelte.js';
58
+ export { breakpointQuery, createMediaQuery } from './media.svelte.js';
59
+ export type { BreakpointName, MediaQuery, MediaQueryOptions } from './media.svelte.js';
60
+ export type { ActionVariant, Alignment, BadgeSize, BadgeVariant, ColumnAlign, Crumb, Disclosure, ControlSize, DialogSize, HeadingLevel, MenuItem, NavItem, Option, Orientation, Placement, SortDirection, StatusVariant, TriggerChildProps, } from './types.js';
package/dist/index.js CHANGED
@@ -1,20 +1,27 @@
1
+ export { default as Accordion } from './components/Accordion.svelte';
1
2
  export { default as Alert } from './components/Alert.svelte';
3
+ export { default as AlertDialog } from './components/AlertDialog.svelte';
2
4
  export { default as AppShell } from './components/AppShell.svelte';
3
5
  export { default as Badge } from './components/Badge.svelte';
4
6
  export { default as Brand } from './components/Brand.svelte';
7
+ export { default as Breadcrumbs } from './components/Breadcrumbs.svelte';
5
8
  export { default as Button } from './components/Button.svelte';
6
9
  export { default as Card } from './components/Card.svelte';
7
10
  export { default as Checkbox } from './components/Checkbox.svelte';
8
11
  export { default as ContextBar } from './components/ContextBar.svelte';
9
12
  export { default as Dialog } from './components/Dialog.svelte';
13
+ export { default as Drawer } from './components/Drawer.svelte';
10
14
  export { default as DropdownMenu } from './components/DropdownMenu.svelte';
15
+ export { default as EmptyState } from './components/EmptyState.svelte';
11
16
  export { default as Field } from './components/Field.svelte';
17
+ export { default as Fieldset } from './components/Fieldset.svelte';
12
18
  export { default as IconButton } from './components/IconButton.svelte';
13
19
  export { default as Input } from './components/Input.svelte';
14
20
  export { default as Label } from './components/Label.svelte';
15
21
  export { default as NavMenu } from './components/NavMenu.svelte';
16
22
  export { default as NumberField } from './components/NumberField.svelte';
17
23
  export { default as PageHeader } from './components/PageHeader.svelte';
24
+ export { default as Pagination } from './components/Pagination.svelte';
18
25
  export { default as Panel } from './components/Panel.svelte';
19
26
  export { default as Popover } from './components/Popover.svelte';
20
27
  export { default as Progress } from './components/Progress.svelte';
@@ -27,10 +34,13 @@ export { default as Skeleton } from './components/Skeleton.svelte';
27
34
  export { default as Spinner } from './components/Spinner.svelte';
28
35
  export { default as Switch } from './components/Switch.svelte';
29
36
  export { default as Table } from './components/Table.svelte';
37
+ export { default as TableHeader } from './components/TableHeader.svelte';
30
38
  export { default as Tabs } from './components/Tabs.svelte';
31
39
  export { default as Textarea } from './components/Textarea.svelte';
40
+ export { default as ThemeToggle } from './components/ThemeToggle.svelte';
32
41
  export { default as Toast } from './components/Toast.svelte';
33
42
  export { default as ToastViewport } from './components/ToastViewport.svelte';
43
+ export { default as ToggleGroup } from './components/ToggleGroup.svelte';
34
44
  export { default as Tooltip } from './components/Tooltip.svelte';
35
45
  export { default as TooltipProvider } from './components/TooltipProvider.svelte';
36
46
  export { default as Topbar } from './components/Topbar.svelte';
@@ -39,6 +49,8 @@ export { default as Workspace } from './components/Workspace.svelte';
39
49
  * Bits UI primitives behind the wrappers, for menus and overlays this package does not
40
50
  * model declaratively (checkbox/radio items, submenus, custom overlay composition).
41
51
  */
42
- export { Dialog as DialogPrimitive, DropdownMenu as DropdownMenuPrimitive, Popover as PopoverPrimitive, Tabs as TabsPrimitive, Tooltip as TooltipPrimitive, } from 'bits-ui';
52
+ export { Accordion as AccordionPrimitive, AlertDialog as AlertDialogPrimitive, Dialog as DialogPrimitive, DropdownMenu as DropdownMenuPrimitive, Pagination as PaginationPrimitive, Popover as PopoverPrimitive, Tabs as TabsPrimitive, ToggleGroup as ToggleGroupPrimitive, Tooltip as TooltipPrimitive, } from 'bits-ui';
43
53
  export { cx } from './utils.js';
44
54
  export { createToaster } from './toaster.svelte.js';
55
+ export { createTheme, themeScript } from './theme.svelte.js';
56
+ export { breakpointQuery, createMediaQuery } from './media.svelte.js';