sve-ui 0.2.1 → 0.3.1

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 (89) hide show
  1. package/README.md +5 -3
  2. package/dist/components/Accordion/AccordionContent.svelte +25 -0
  3. package/dist/components/Accordion/AccordionContent.svelte.d.ts +10 -0
  4. package/dist/components/Accordion/AccordionContent.svelte.d.ts.map +1 -0
  5. package/dist/components/Accordion/AccordionHeader.svelte +22 -0
  6. package/dist/components/Accordion/AccordionHeader.svelte.d.ts +10 -0
  7. package/dist/components/Accordion/AccordionHeader.svelte.d.ts.map +1 -0
  8. package/dist/components/Accordion/AccordionItem.svelte +22 -0
  9. package/dist/components/Accordion/AccordionItem.svelte.d.ts +10 -0
  10. package/dist/components/Accordion/AccordionItem.svelte.d.ts.map +1 -0
  11. package/dist/components/Accordion/AccordionRoot.svelte +37 -0
  12. package/dist/components/Accordion/AccordionRoot.svelte.d.ts +21 -0
  13. package/dist/components/Accordion/AccordionRoot.svelte.d.ts.map +1 -0
  14. package/dist/components/Accordion/AccordionTrigger.svelte +71 -0
  15. package/dist/components/Accordion/AccordionTrigger.svelte.d.ts +11 -0
  16. package/dist/components/Accordion/AccordionTrigger.svelte.d.ts.map +1 -0
  17. package/dist/components/Accordion/index.d.ts +14 -0
  18. package/dist/components/Accordion/index.d.ts.map +1 -0
  19. package/dist/components/Accordion/index.js +13 -0
  20. package/dist/components/Checkbox/CheckboxRoot.svelte +95 -0
  21. package/dist/components/Checkbox/CheckboxRoot.svelte.d.ts +12 -0
  22. package/dist/components/Checkbox/CheckboxRoot.svelte.d.ts.map +1 -0
  23. package/dist/components/Checkbox/index.d.ts +9 -0
  24. package/dist/components/Checkbox/index.d.ts.map +1 -0
  25. package/dist/components/Checkbox/index.js +8 -0
  26. package/dist/components/Code/Code.svelte +130 -0
  27. package/dist/components/Code/Code.svelte.d.ts +14 -0
  28. package/dist/components/Code/Code.svelte.d.ts.map +1 -0
  29. package/dist/components/Combobox/ComboboxContent.svelte +33 -0
  30. package/dist/components/Combobox/ComboboxContent.svelte.d.ts +10 -0
  31. package/dist/components/Combobox/ComboboxContent.svelte.d.ts.map +1 -0
  32. package/dist/components/Combobox/ComboboxInput.svelte +42 -0
  33. package/dist/components/Combobox/ComboboxInput.svelte.d.ts +10 -0
  34. package/dist/components/Combobox/ComboboxInput.svelte.d.ts.map +1 -0
  35. package/dist/components/Combobox/ComboboxItem.svelte +50 -0
  36. package/dist/components/Combobox/ComboboxItem.svelte.d.ts +10 -0
  37. package/dist/components/Combobox/ComboboxItem.svelte.d.ts.map +1 -0
  38. package/dist/components/Combobox/index.d.ts +17 -0
  39. package/dist/components/Combobox/index.d.ts.map +1 -0
  40. package/dist/components/Combobox/index.js +16 -0
  41. package/dist/components/RadioGroup/RadioGroupItem.svelte +58 -0
  42. package/dist/components/RadioGroup/RadioGroupItem.svelte.d.ts +10 -0
  43. package/dist/components/RadioGroup/RadioGroupItem.svelte.d.ts.map +1 -0
  44. package/dist/components/RadioGroup/RadioGroupRoot.svelte +30 -0
  45. package/dist/components/RadioGroup/RadioGroupRoot.svelte.d.ts +10 -0
  46. package/dist/components/RadioGroup/RadioGroupRoot.svelte.d.ts.map +1 -0
  47. package/dist/components/RadioGroup/index.d.ts +10 -0
  48. package/dist/components/RadioGroup/index.d.ts.map +1 -0
  49. package/dist/components/RadioGroup/index.js +9 -0
  50. package/dist/components/Select/SelectContent.svelte +33 -0
  51. package/dist/components/Select/SelectContent.svelte.d.ts +10 -0
  52. package/dist/components/Select/SelectContent.svelte.d.ts.map +1 -0
  53. package/dist/components/Select/SelectItem.svelte +51 -0
  54. package/dist/components/Select/SelectItem.svelte.d.ts +10 -0
  55. package/dist/components/Select/SelectItem.svelte.d.ts.map +1 -0
  56. package/dist/components/Select/SelectTrigger.svelte +66 -0
  57. package/dist/components/Select/SelectTrigger.svelte.d.ts +11 -0
  58. package/dist/components/Select/SelectTrigger.svelte.d.ts.map +1 -0
  59. package/dist/components/Select/index.d.ts +18 -0
  60. package/dist/components/Select/index.d.ts.map +1 -0
  61. package/dist/components/Select/index.js +17 -0
  62. package/dist/components/Slider/Slider.svelte +101 -0
  63. package/dist/components/Slider/Slider.svelte.d.ts +31 -0
  64. package/dist/components/Slider/Slider.svelte.d.ts.map +1 -0
  65. package/dist/components/Switch/SwitchRoot.svelte +87 -0
  66. package/dist/components/Switch/SwitchRoot.svelte.d.ts +12 -0
  67. package/dist/components/Switch/SwitchRoot.svelte.d.ts.map +1 -0
  68. package/dist/components/Switch/index.d.ts +8 -0
  69. package/dist/components/Switch/index.d.ts.map +1 -0
  70. package/dist/components/Switch/index.js +7 -0
  71. package/dist/components/Tabs/TabsContent.svelte +29 -0
  72. package/dist/components/Tabs/TabsContent.svelte.d.ts +10 -0
  73. package/dist/components/Tabs/TabsContent.svelte.d.ts.map +1 -0
  74. package/dist/components/Tabs/TabsList.svelte +24 -0
  75. package/dist/components/Tabs/TabsList.svelte.d.ts +10 -0
  76. package/dist/components/Tabs/TabsList.svelte.d.ts.map +1 -0
  77. package/dist/components/Tabs/TabsRoot.svelte +29 -0
  78. package/dist/components/Tabs/TabsRoot.svelte.d.ts +10 -0
  79. package/dist/components/Tabs/TabsRoot.svelte.d.ts.map +1 -0
  80. package/dist/components/Tabs/TabsTrigger.svelte +54 -0
  81. package/dist/components/Tabs/TabsTrigger.svelte.d.ts +10 -0
  82. package/dist/components/Tabs/TabsTrigger.svelte.d.ts.map +1 -0
  83. package/dist/components/Tabs/index.d.ts +12 -0
  84. package/dist/components/Tabs/index.d.ts.map +1 -0
  85. package/dist/components/Tabs/index.js +11 -0
  86. package/dist/index.d.ts +9 -0
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +16 -0
  89. package/package.json +4 -2
@@ -0,0 +1,101 @@
1
+ <script lang="ts">
2
+ import { Slider } from 'bits-ui';
3
+ import type { Component } from 'svelte';
4
+ import type { HTMLAttributes } from 'svelte/elements';
5
+
6
+ /**
7
+ * Self-contained slider: renders the track, filled range, and one thumb per
8
+ * value internally, so consumers just set `value` / `min` / `max` / `step`.
9
+ *
10
+ * Bits' Slider.Root props are a discriminated union (single vs multiple); we
11
+ * expose a flat surface and forward to a loosely-typed view of the root to
12
+ * avoid TypeScript's "union too complex" overflow.
13
+ */
14
+ interface Props extends Omit<HTMLAttributes<HTMLSpanElement>, 'class'> {
15
+ type?: 'single' | 'multiple';
16
+ value?: number | number[];
17
+ onValueChange?: (value: number & number[]) => void;
18
+ min?: number;
19
+ max?: number;
20
+ step?: number;
21
+ disabled?: boolean;
22
+ orientation?: 'horizontal' | 'vertical';
23
+ /**
24
+ * Accessible name for the thumb(s). The `role="slider"` element needs a name;
25
+ * in `multiple` mode each thumb gets the label suffixed with its position.
26
+ */
27
+ thumbLabel?: string;
28
+ class?: string;
29
+ }
30
+
31
+ let { type = 'single', thumbLabel, class: cls, ...rest }: Props = $props();
32
+
33
+ function thumbName(index: number): string | undefined {
34
+ if (!thumbLabel) return undefined;
35
+ return type === 'multiple' ? `${thumbLabel} ${index + 1}` : thumbLabel;
36
+ }
37
+
38
+ const className = $derived(['sve-slider', cls].filter(Boolean).join(' '));
39
+
40
+ const Root = Slider.Root as unknown as Component<Record<string, unknown>>;
41
+ </script>
42
+
43
+ <Root {type} class={className} data-slot="slider" {...rest}>
44
+ {#snippet children({ thumbItems }: { thumbItems: { index: number; value: number }[] })}
45
+ <span class="sve-slider__track">
46
+ <Slider.Range class="sve-slider__range" />
47
+ </span>
48
+ {#each thumbItems as thumb (thumb.index)}
49
+ <Slider.Thumb index={thumb.index} class="sve-slider__thumb" aria-label={thumbName(thumb.index)} />
50
+ {/each}
51
+ {/snippet}
52
+ </Root>
53
+
54
+ <style>
55
+ :global(.sve-slider) {
56
+ position: relative;
57
+ display: flex;
58
+ align-items: center;
59
+ width: 100%;
60
+ height: 1.25rem;
61
+ touch-action: none;
62
+ user-select: none;
63
+ cursor: pointer;
64
+ }
65
+
66
+ :global(.sve-slider__track) {
67
+ position: relative;
68
+ flex-grow: 1;
69
+ height: 0.375rem;
70
+ border-radius: var(--sve-radius-full);
71
+ background-color: var(--sve-color-default);
72
+ }
73
+
74
+ :global(.sve-slider__range) {
75
+ position: absolute;
76
+ height: 100%;
77
+ border-radius: var(--sve-radius-full);
78
+ background-color: var(--sve-color-primary);
79
+ }
80
+
81
+ :global(.sve-slider__thumb) {
82
+ display: block;
83
+ width: 1.125rem;
84
+ height: 1.125rem;
85
+ border-radius: var(--sve-radius-full);
86
+ background-color: #ffffff;
87
+ border: 1px solid var(--sve-color-default-border);
88
+ box-shadow: var(--sve-shadow-sm);
89
+ cursor: grab;
90
+ }
91
+
92
+ :global(.sve-slider__thumb:focus-visible) {
93
+ outline: 2px solid var(--sve-color-primary);
94
+ outline-offset: 2px;
95
+ }
96
+
97
+ :global(.sve-slider[data-disabled]) {
98
+ opacity: 0.5;
99
+ cursor: not-allowed;
100
+ }
101
+ </style>
@@ -0,0 +1,31 @@
1
+ import { Slider } from 'bits-ui';
2
+ import type { Component } from 'svelte';
3
+ import type { HTMLAttributes } from 'svelte/elements';
4
+ /**
5
+ * Self-contained slider: renders the track, filled range, and one thumb per
6
+ * value internally, so consumers just set `value` / `min` / `max` / `step`.
7
+ *
8
+ * Bits' Slider.Root props are a discriminated union (single vs multiple); we
9
+ * expose a flat surface and forward to a loosely-typed view of the root to
10
+ * avoid TypeScript's "union too complex" overflow.
11
+ */
12
+ interface Props extends Omit<HTMLAttributes<HTMLSpanElement>, 'class'> {
13
+ type?: 'single' | 'multiple';
14
+ value?: number | number[];
15
+ onValueChange?: (value: number & number[]) => void;
16
+ min?: number;
17
+ max?: number;
18
+ step?: number;
19
+ disabled?: boolean;
20
+ orientation?: 'horizontal' | 'vertical';
21
+ /**
22
+ * Accessible name for the thumb(s). The `role="slider"` element needs a name;
23
+ * in `multiple` mode each thumb gets the label suffixed with its position.
24
+ */
25
+ thumbLabel?: string;
26
+ class?: string;
27
+ }
28
+ declare const Slider: Component<Props, {}, "">;
29
+ type Slider = ReturnType<typeof Slider>;
30
+ export default Slider;
31
+ //# sourceMappingURL=Slider.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Slider.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Slider/Slider.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGpD;;;;;;;GAOG;AACH,UAAU,KAAM,SAAQ,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACpE,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkCH,QAAA,MAAM,MAAM,0BAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,87 @@
1
+ <script module lang="ts">
2
+ export type Size = 'sm' | 'md' | 'lg';
3
+ </script>
4
+
5
+ <script lang="ts">
6
+ import { Switch } from 'bits-ui';
7
+ import type { ComponentProps } from 'svelte';
8
+
9
+ type BitsRootProps = ComponentProps<typeof Switch.Root>;
10
+
11
+ interface Props extends Omit<BitsRootProps, 'class'> {
12
+ size?: Size;
13
+ class?: string;
14
+ }
15
+
16
+ let {
17
+ size = 'md',
18
+ checked = $bindable(false),
19
+ class: cls,
20
+ ...rest
21
+ }: Props = $props();
22
+
23
+ const className = $derived(
24
+ ['sve-switch', `sve-switch--${size}`, cls].filter(Boolean).join(' ')
25
+ );
26
+ </script>
27
+
28
+ <Switch.Root bind:checked class={className} data-slot="switch" {...rest}>
29
+ <Switch.Thumb class="sve-switch__thumb" data-slot="switch-thumb" />
30
+ </Switch.Root>
31
+
32
+ <style>
33
+ :global(.sve-switch) {
34
+ display: inline-flex;
35
+ align-items: center;
36
+ flex-shrink: 0;
37
+ padding: 2px;
38
+ border: none;
39
+ border-radius: var(--sve-radius-full);
40
+ background-color: var(--sve-color-default);
41
+ cursor: pointer;
42
+ transition: background-color 0.15s ease;
43
+ }
44
+
45
+ :global(.sve-switch[data-state='checked']) {
46
+ background-color: var(--sve-color-primary);
47
+ }
48
+
49
+ :global(.sve-switch:focus-visible) {
50
+ outline: 2px solid var(--sve-color-primary);
51
+ outline-offset: 2px;
52
+ }
53
+
54
+ :global(.sve-switch:disabled) {
55
+ opacity: 0.5;
56
+ cursor: not-allowed;
57
+ }
58
+
59
+ :global(.sve-switch__thumb) {
60
+ display: block;
61
+ border-radius: var(--sve-radius-full);
62
+ background-color: #ffffff;
63
+ box-shadow: var(--sve-shadow-sm);
64
+ transition: transform 0.15s ease;
65
+ transform: translateX(0);
66
+ }
67
+
68
+ /* --- Sizes (track height/width + thumb size + travel) --- */
69
+ :global(.sve-switch--sm) { width: 2rem; height: 1.25rem; }
70
+ :global(.sve-switch--sm .sve-switch__thumb) { width: 1rem; height: 1rem; }
71
+ :global(.sve-switch--sm[data-state='checked'] .sve-switch__thumb) { transform: translateX(0.75rem); }
72
+
73
+ :global(.sve-switch--md) { width: 2.5rem; height: 1.5rem; }
74
+ :global(.sve-switch--md .sve-switch__thumb) { width: 1.25rem; height: 1.25rem; }
75
+ :global(.sve-switch--md[data-state='checked'] .sve-switch__thumb) { transform: translateX(1rem); }
76
+
77
+ :global(.sve-switch--lg) { width: 3rem; height: 1.75rem; }
78
+ :global(.sve-switch--lg .sve-switch__thumb) { width: 1.5rem; height: 1.5rem; }
79
+ :global(.sve-switch--lg[data-state='checked'] .sve-switch__thumb) { transform: translateX(1.25rem); }
80
+
81
+ @media (prefers-reduced-motion: reduce) {
82
+ :global(.sve-switch),
83
+ :global(.sve-switch__thumb) {
84
+ transition: none;
85
+ }
86
+ }
87
+ </style>
@@ -0,0 +1,12 @@
1
+ export type Size = 'sm' | 'md' | 'lg';
2
+ import { Switch } from 'bits-ui';
3
+ import type { ComponentProps } from 'svelte';
4
+ type BitsRootProps = ComponentProps<typeof Switch.Root>;
5
+ interface Props extends Omit<BitsRootProps, 'class'> {
6
+ size?: Size;
7
+ class?: string;
8
+ }
9
+ declare const SwitchRoot: import("svelte").Component<Props, {}, "checked">;
10
+ type SwitchRoot = ReturnType<typeof SwitchRoot>;
11
+ export default SwitchRoot;
12
+ //# sourceMappingURL=SwitchRoot.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SwitchRoot.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Switch/SwitchRoot.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAGxC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAG3C,KAAK,aAAa,GAAG,cAAc,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AAExD,UAAU,KAAM,SAAQ,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC;IAClD,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA6BH,QAAA,MAAM,UAAU,kDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Switch namespace — sve-ui styled wrapper over the bits-ui Switch primitive.
3
+ *
4
+ * Root: styled track + thumb (Bits owns ARIA role="switch", keyboard, state).
5
+ * `bind:checked` is forwarded to the Bits root.
6
+ */
7
+ export { default as Root, type Size as SwitchSize } from './SwitchRoot.svelte';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Switch/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Switch namespace — sve-ui styled wrapper over the bits-ui Switch primitive.
3
+ *
4
+ * Root: styled track + thumb (Bits owns ARIA role="switch", keyboard, state).
5
+ * `bind:checked` is forwarded to the Bits root.
6
+ */
7
+ export { default as Root } from './SwitchRoot.svelte';
@@ -0,0 +1,29 @@
1
+ <script lang="ts">
2
+ import { Tabs } from 'bits-ui';
3
+ import type { ComponentProps } from 'svelte';
4
+
5
+ type BitsContentProps = ComponentProps<typeof Tabs.Content>;
6
+
7
+ interface Props extends Omit<BitsContentProps, 'class'> {
8
+ class?: string;
9
+ }
10
+
11
+ let { class: cls, ...rest }: Props = $props();
12
+
13
+ const className = $derived(['sve-tabs__content', cls].filter(Boolean).join(' '));
14
+ </script>
15
+
16
+ <Tabs.Content class={className} data-slot="tabs-content" {...rest} />
17
+
18
+ <style>
19
+ :global(.sve-tabs__content) {
20
+ color: var(--sve-color-default-foreground);
21
+ font-family: var(--sve-font-family-sans);
22
+ }
23
+
24
+ :global(.sve-tabs__content:focus-visible) {
25
+ outline: 2px solid var(--sve-color-primary);
26
+ outline-offset: 2px;
27
+ border-radius: var(--sve-radius-sm);
28
+ }
29
+ </style>
@@ -0,0 +1,10 @@
1
+ import { Tabs } from 'bits-ui';
2
+ import type { ComponentProps } from 'svelte';
3
+ type BitsContentProps = ComponentProps<typeof Tabs.Content>;
4
+ interface Props extends Omit<BitsContentProps, 'class'> {
5
+ class?: string;
6
+ }
7
+ declare const TabsContent: import("svelte").Component<Props, {}, "">;
8
+ type TabsContent = ReturnType<typeof TabsContent>;
9
+ export default TabsContent;
10
+ //# sourceMappingURL=TabsContent.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabsContent.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Tabs/TabsContent.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAG3C,KAAK,gBAAgB,GAAG,cAAc,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;AAE5D,UAAU,KAAM,SAAQ,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkBH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,24 @@
1
+ <script lang="ts">
2
+ import { Tabs } from 'bits-ui';
3
+ import type { ComponentProps } from 'svelte';
4
+
5
+ type BitsListProps = ComponentProps<typeof Tabs.List>;
6
+
7
+ interface Props extends Omit<BitsListProps, 'class'> {
8
+ class?: string;
9
+ }
10
+
11
+ let { class: cls, ...rest }: Props = $props();
12
+
13
+ const className = $derived(['sve-tabs__list', cls].filter(Boolean).join(' '));
14
+ </script>
15
+
16
+ <Tabs.List class={className} data-slot="tabs-list" {...rest} />
17
+
18
+ <style>
19
+ :global(.sve-tabs__list) {
20
+ display: flex;
21
+ gap: var(--sve-space-1);
22
+ border-bottom: 1px solid var(--sve-color-default-border);
23
+ }
24
+ </style>
@@ -0,0 +1,10 @@
1
+ import { Tabs } from 'bits-ui';
2
+ import type { ComponentProps } from 'svelte';
3
+ type BitsListProps = ComponentProps<typeof Tabs.List>;
4
+ interface Props extends Omit<BitsListProps, 'class'> {
5
+ class?: string;
6
+ }
7
+ declare const TabsList: import("svelte").Component<Props, {}, "">;
8
+ type TabsList = ReturnType<typeof TabsList>;
9
+ export default TabsList;
10
+ //# sourceMappingURL=TabsList.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabsList.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Tabs/TabsList.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAG3C,KAAK,aAAa,GAAG,cAAc,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;AAEtD,UAAU,KAAM,SAAQ,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkBH,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,29 @@
1
+ <script lang="ts">
2
+ import { Tabs } from 'bits-ui';
3
+ import type { ComponentProps } from 'svelte';
4
+
5
+ type BitsRootProps = ComponentProps<typeof Tabs.Root>;
6
+
7
+ interface Props extends Omit<BitsRootProps, 'class'> {
8
+ class?: string;
9
+ }
10
+
11
+ let { value = $bindable(), class: cls, ...rest }: Props = $props();
12
+
13
+ const className = $derived(['sve-tabs', cls].filter(Boolean).join(' '));
14
+ </script>
15
+
16
+ <Tabs.Root bind:value class={className} data-slot="tabs" {...rest} />
17
+
18
+ <style>
19
+ :global(.sve-tabs) {
20
+ display: flex;
21
+ flex-direction: column;
22
+ gap: var(--sve-space-3);
23
+ font-family: var(--sve-font-family-sans);
24
+ }
25
+
26
+ :global(.sve-tabs[data-orientation='vertical']) {
27
+ flex-direction: row;
28
+ }
29
+ </style>
@@ -0,0 +1,10 @@
1
+ import { Tabs } from 'bits-ui';
2
+ import type { ComponentProps } from 'svelte';
3
+ type BitsRootProps = ComponentProps<typeof Tabs.Root>;
4
+ interface Props extends Omit<BitsRootProps, 'class'> {
5
+ class?: string;
6
+ }
7
+ declare const TabsRoot: import("svelte").Component<Props, {}, "value">;
8
+ type TabsRoot = ReturnType<typeof TabsRoot>;
9
+ export default TabsRoot;
10
+ //# sourceMappingURL=TabsRoot.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabsRoot.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Tabs/TabsRoot.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAG3C,KAAK,aAAa,GAAG,cAAc,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;AAEtD,UAAU,KAAM,SAAQ,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkBH,QAAA,MAAM,QAAQ,gDAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,54 @@
1
+ <script lang="ts">
2
+ import { Tabs } from 'bits-ui';
3
+ import type { ComponentProps } from 'svelte';
4
+
5
+ type BitsTriggerProps = ComponentProps<typeof Tabs.Trigger>;
6
+
7
+ interface Props extends Omit<BitsTriggerProps, 'class'> {
8
+ class?: string;
9
+ }
10
+
11
+ let { class: cls, ...rest }: Props = $props();
12
+
13
+ const className = $derived(['sve-tabs__trigger', cls].filter(Boolean).join(' '));
14
+ </script>
15
+
16
+ <Tabs.Trigger class={className} data-slot="tabs-trigger" {...rest} />
17
+
18
+ <style>
19
+ :global(.sve-tabs__trigger) {
20
+ padding: var(--sve-space-2) var(--sve-space-3);
21
+ border: none;
22
+ border-bottom: 2px solid transparent;
23
+ margin-bottom: -1px;
24
+ background-color: transparent;
25
+ color: var(--sve-color-default-foreground);
26
+ opacity: 0.65;
27
+ font-family: var(--sve-font-family-sans);
28
+ font-size: var(--sve-font-size-md);
29
+ font-weight: var(--sve-font-weight-medium);
30
+ cursor: pointer;
31
+ transition: color 0.15s ease, border-color 0.15s ease, opacity 0.15s ease;
32
+ }
33
+
34
+ :global(.sve-tabs__trigger:hover:not([data-state='active'])) {
35
+ opacity: 1;
36
+ }
37
+
38
+ :global(.sve-tabs__trigger[data-state='active']) {
39
+ color: var(--sve-color-primary);
40
+ border-bottom-color: var(--sve-color-primary);
41
+ opacity: 1;
42
+ }
43
+
44
+ :global(.sve-tabs__trigger:focus-visible) {
45
+ outline: 2px solid var(--sve-color-primary);
46
+ outline-offset: -2px;
47
+ border-radius: var(--sve-radius-sm);
48
+ }
49
+
50
+ :global(.sve-tabs__trigger:disabled) {
51
+ opacity: 0.4;
52
+ cursor: not-allowed;
53
+ }
54
+ </style>
@@ -0,0 +1,10 @@
1
+ import { Tabs } from 'bits-ui';
2
+ import type { ComponentProps } from 'svelte';
3
+ type BitsTriggerProps = ComponentProps<typeof Tabs.Trigger>;
4
+ interface Props extends Omit<BitsTriggerProps, 'class'> {
5
+ class?: string;
6
+ }
7
+ declare const TabsTrigger: import("svelte").Component<Props, {}, "">;
8
+ type TabsTrigger = ReturnType<typeof TabsTrigger>;
9
+ export default TabsTrigger;
10
+ //# sourceMappingURL=TabsTrigger.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabsTrigger.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Tabs/TabsTrigger.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAG3C,KAAK,gBAAgB,GAAG,cAAc,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;AAE5D,UAAU,KAAM,SAAQ,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkBH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tabs namespace — sve-ui styled wrappers over bits-ui Tabs.
3
+ *
4
+ * Root: container; `bind:value` selects the active tab (Bits owns ARIA,
5
+ * roving focus, and keyboard navigation).
6
+ * List / Trigger / Content: styled parts. Trigger and Content pair by `value`.
7
+ */
8
+ export { default as Root } from './TabsRoot.svelte';
9
+ export { default as List } from './TabsList.svelte';
10
+ export { default as Trigger } from './TabsTrigger.svelte';
11
+ export { default as Content } from './TabsContent.svelte';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Tabs/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Tabs namespace — sve-ui styled wrappers over bits-ui Tabs.
3
+ *
4
+ * Root: container; `bind:value` selects the active tab (Bits owns ARIA,
5
+ * roving focus, and keyboard navigation).
6
+ * List / Trigger / Content: styled parts. Trigger and Content pair by `value`.
7
+ */
8
+ export { default as Root } from './TabsRoot.svelte';
9
+ export { default as List } from './TabsList.svelte';
10
+ export { default as Trigger } from './TabsTrigger.svelte';
11
+ export { default as Content } from './TabsContent.svelte';
package/dist/index.d.ts CHANGED
@@ -12,6 +12,8 @@ export { default as Heading } from './components/Heading/Heading.svelte';
12
12
  export { default as Badge } from './components/Badge/Badge.svelte';
13
13
  export { default as Spinner } from './components/Spinner/Spinner.svelte';
14
14
  export { default as Input } from './components/Input/Input.svelte';
15
+ export { default as Code } from './components/Code/Code.svelte';
16
+ export { default as Slider } from './components/Slider/Slider.svelte';
15
17
  export * as Dialog from './components/Dialog/index.js';
16
18
  export * as DropdownMenu from './components/DropdownMenu/index.js';
17
19
  export * as Tooltip from './components/Tooltip/index.js';
@@ -19,6 +21,13 @@ export * as Popover from './components/Popover/index.js';
19
21
  export * as Avatar from './components/Avatar/index.js';
20
22
  export * as Card from './components/Card/index.js';
21
23
  export * as Alert from './components/Alert/index.js';
24
+ export * as Tabs from './components/Tabs/index.js';
25
+ export * as Accordion from './components/Accordion/index.js';
26
+ export * as Switch from './components/Switch/index.js';
27
+ export * as Checkbox from './components/Checkbox/index.js';
28
+ export * as RadioGroup from './components/RadioGroup/index.js';
29
+ export * as Select from './components/Select/index.js';
30
+ export * as Combobox from './components/Combobox/index.js';
22
31
  export { buttonVariants } from './components/Button/Button.svelte';
23
32
  export { badgeVariants, type Variant as BadgeVariant, type Color as BadgeColor, type Size as BadgeSize } from './components/Badge/Badge.svelte';
24
33
  export { cardVariants, type Variant as CardVariant, type Padding as CardPadding } from './components/Card/CardRoot.svelte';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAGnE,OAAO,KAAK,MAAM,MAAM,8BAA8B,CAAC;AAGvD,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AAGnE,OAAO,KAAK,OAAO,MAAM,+BAA+B,CAAC;AAGzD,OAAO,KAAK,OAAO,MAAM,+BAA+B,CAAC;AAGzD,OAAO,KAAK,MAAM,MAAM,8BAA8B,CAAC;AAGvD,OAAO,KAAK,IAAI,MAAM,4BAA4B,CAAC;AAGnD,OAAO,KAAK,KAAK,MAAM,6BAA6B,CAAC;AAGrD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,IAAI,YAAY,EAAE,KAAK,KAAK,IAAI,UAAU,EAAE,KAAK,IAAI,IAAI,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAGhJ,OAAO,EAAE,YAAY,EAAE,KAAK,OAAO,IAAI,WAAW,EAAE,KAAK,OAAO,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAG3H,OAAO,EAAE,aAAa,EAAE,KAAK,KAAK,IAAI,UAAU,EAAE,KAAK,OAAO,IAAI,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAG5H,OAAO,EAAE,aAAa,EAAE,KAAK,IAAI,IAAI,SAAS,EAAE,KAAK,OAAO,IAAI,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAGtH,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAGxD,OAAO,EACL,WAAW,EACX,UAAU,EACV,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAGtE,OAAO,KAAK,MAAM,MAAM,8BAA8B,CAAC;AAGvD,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AAGnE,OAAO,KAAK,OAAO,MAAM,+BAA+B,CAAC;AAGzD,OAAO,KAAK,OAAO,MAAM,+BAA+B,CAAC;AAGzD,OAAO,KAAK,MAAM,MAAM,8BAA8B,CAAC;AAGvD,OAAO,KAAK,IAAI,MAAM,4BAA4B,CAAC;AAGnD,OAAO,KAAK,KAAK,MAAM,6BAA6B,CAAC;AAGrD,OAAO,KAAK,IAAI,MAAM,4BAA4B,CAAC;AAGnD,OAAO,KAAK,SAAS,MAAM,iCAAiC,CAAC;AAG7D,OAAO,KAAK,MAAM,MAAM,8BAA8B,CAAC;AAGvD,OAAO,KAAK,QAAQ,MAAM,gCAAgC,CAAC;AAG3D,OAAO,KAAK,UAAU,MAAM,kCAAkC,CAAC;AAG/D,OAAO,KAAK,MAAM,MAAM,8BAA8B,CAAC;AAGvD,OAAO,KAAK,QAAQ,MAAM,gCAAgC,CAAC;AAG3D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,IAAI,YAAY,EAAE,KAAK,KAAK,IAAI,UAAU,EAAE,KAAK,IAAI,IAAI,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAGhJ,OAAO,EAAE,YAAY,EAAE,KAAK,OAAO,IAAI,WAAW,EAAE,KAAK,OAAO,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAG3H,OAAO,EAAE,aAAa,EAAE,KAAK,KAAK,IAAI,UAAU,EAAE,KAAK,OAAO,IAAI,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAG5H,OAAO,EAAE,aAAa,EAAE,KAAK,IAAI,IAAI,SAAS,EAAE,KAAK,OAAO,IAAI,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAGtH,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAGxD,OAAO,EACL,WAAW,EACX,UAAU,EACV,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -13,6 +13,8 @@ export { default as Heading } from './components/Heading/Heading.svelte';
13
13
  export { default as Badge } from './components/Badge/Badge.svelte';
14
14
  export { default as Spinner } from './components/Spinner/Spinner.svelte';
15
15
  export { default as Input } from './components/Input/Input.svelte';
16
+ export { default as Code } from './components/Code/Code.svelte';
17
+ export { default as Slider } from './components/Slider/Slider.svelte';
16
18
  // Dialog namespace (composed over bits-ui)
17
19
  export * as Dialog from './components/Dialog/index.js';
18
20
  // DropdownMenu namespace (composed over bits-ui)
@@ -27,6 +29,20 @@ export * as Avatar from './components/Avatar/index.js';
27
29
  export * as Card from './components/Card/index.js';
28
30
  // Alert namespace
29
31
  export * as Alert from './components/Alert/index.js';
32
+ // Tabs namespace (composed over bits-ui)
33
+ export * as Tabs from './components/Tabs/index.js';
34
+ // Accordion namespace (composed over bits-ui)
35
+ export * as Accordion from './components/Accordion/index.js';
36
+ // Switch namespace (composed over bits-ui)
37
+ export * as Switch from './components/Switch/index.js';
38
+ // Checkbox namespace (composed over bits-ui)
39
+ export * as Checkbox from './components/Checkbox/index.js';
40
+ // RadioGroup namespace (composed over bits-ui)
41
+ export * as RadioGroup from './components/RadioGroup/index.js';
42
+ // Select namespace (composed over bits-ui)
43
+ export * as Select from './components/Select/index.js';
44
+ // Combobox namespace (composed over bits-ui)
45
+ export * as Combobox from './components/Combobox/index.js';
30
46
  // Button variant types
31
47
  export { buttonVariants } from './components/Button/Button.svelte';
32
48
  // Badge variant types
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sve-ui",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "type": "module",
5
5
  "description": "Styled, accessible Svelte 5 components built on Bits UI. No Tailwind, no config — install, import, and theme with CSS variables. Light and dark out of the box.",
6
6
  "author": "Rodrigo Abregu <me@rodriab.io> (https://rodriab.io/)",
@@ -27,6 +27,7 @@
27
27
  "svelte": "./dist/index.js",
28
28
  "default": "./dist/index.js"
29
29
  },
30
+ "./package.json": "./package.json",
30
31
  "./theme": {
31
32
  "types": "./dist/theme/index.d.ts",
32
33
  "svelte": "./dist/theme/index.js",
@@ -49,13 +50,13 @@
49
50
  },
50
51
  "devDependencies": {
51
52
  "@internationalized/date": "^3.8.1",
52
- "jsdom": "^26.0.0",
53
53
  "@sveltejs/kit": "^2.66.0",
54
54
  "@sveltejs/package": "^2.5.8",
55
55
  "@sveltejs/vite-plugin-svelte": "^7.1.2",
56
56
  "@testing-library/svelte": "^5.3.1",
57
57
  "eslint": "^10.5.0",
58
58
  "eslint-plugin-svelte": "^3.19.0",
59
+ "jsdom": "^26.0.0",
59
60
  "publint": "^0.3.21",
60
61
  "svelte": "^5.56.3",
61
62
  "svelte-check": "^4.0.0",
@@ -63,6 +64,7 @@
63
64
  "typescript-eslint": "^8.61.1",
64
65
  "vite": "^8.0.16",
65
66
  "vitest": "^4.1.9",
67
+ "vitest-axe": "^0.1.0",
66
68
  "@repo/eslint-config": "0.0.0",
67
69
  "@repo/typescript-config": "0.0.0"
68
70
  },