kosui 0.1.2 → 0.4.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 (238) hide show
  1. package/README.md +34 -3
  2. package/dist/alert/alert.svelte +16 -157
  3. package/dist/alert/alert.svelte.d.ts +3 -26
  4. package/dist/alert/index.d.ts +1 -1
  5. package/dist/alert/index.js +1 -1
  6. package/dist/autocomplete/autocomplete.svelte +126 -12
  7. package/dist/autocomplete/autocomplete.svelte.d.ts +30 -6
  8. package/dist/autocomplete/index.d.ts +1 -5
  9. package/dist/autocomplete/index.js +1 -5
  10. package/dist/avatar/avatar.svelte +16 -10
  11. package/dist/badge/badge.svelte +31 -20
  12. package/dist/badge/badge.svelte.d.ts +8 -4
  13. package/dist/badge/index.d.ts +1 -1
  14. package/dist/base.d.ts +4 -8
  15. package/dist/base.js +14 -28
  16. package/dist/box/box.svelte +2 -14
  17. package/dist/box/box.svelte.d.ts +0 -2
  18. package/dist/breadcrumbs/breadcrumbs.svelte +38 -19
  19. package/dist/breadcrumbs/breadcrumbs.svelte.d.ts +6 -4
  20. package/dist/breadcrumbs/index.d.ts +1 -1
  21. package/dist/breadcrumbs/index.js +1 -1
  22. package/dist/button/button.svelte +96 -31
  23. package/dist/button/button.svelte.d.ts +11 -5
  24. package/dist/button/index.d.ts +1 -1
  25. package/dist/button/index.js +1 -1
  26. package/dist/chip/chip.svelte +62 -14
  27. package/dist/chip/chip.svelte.d.ts +2 -1
  28. package/dist/command/action.svelte.js +13 -18
  29. package/dist/command/command-palette.svelte +163 -0
  30. package/dist/command/command-palette.svelte.d.ts +11 -0
  31. package/dist/command/index.d.ts +1 -8
  32. package/dist/command/index.js +1 -8
  33. package/dist/common/divider.svelte +10 -5
  34. package/dist/common/divider.svelte.d.ts +3 -3
  35. package/dist/common/index.d.ts +0 -2
  36. package/dist/common/index.js +0 -2
  37. package/dist/dialog/dialog-provider.svelte +70 -0
  38. package/dist/dialog/dialog-provider.svelte.d.ts +7 -0
  39. package/dist/dialog/dialog.svelte +33 -35
  40. package/dist/dialog/dialog.svelte.d.ts +4 -8
  41. package/dist/dialog/dialogs.svelte.d.ts +49 -0
  42. package/dist/dialog/dialogs.svelte.js +73 -0
  43. package/dist/dialog/index.d.ts +2 -3
  44. package/dist/dialog/index.js +2 -3
  45. package/dist/fab/fab.svelte +30 -10
  46. package/dist/fab/fab.svelte.d.ts +3 -2
  47. package/dist/index.d.ts +0 -1
  48. package/dist/index.js +0 -1
  49. package/dist/input/field.d.ts +8 -0
  50. package/dist/input/field.js +7 -0
  51. package/dist/input/index.d.ts +2 -1
  52. package/dist/input/index.js +2 -1
  53. package/dist/input/input.svelte +21 -66
  54. package/dist/input/input.svelte.d.ts +6 -16
  55. package/dist/link/link.svelte +33 -42
  56. package/dist/link/link.svelte.d.ts +4 -3
  57. package/dist/markdown/index.d.ts +2 -25
  58. package/dist/markdown/index.js +0 -24
  59. package/dist/markdown/markdown-tokens.svelte +166 -6
  60. package/dist/markdown/markdown-tokens.svelte.d.ts +2 -0
  61. package/dist/markdown/markdown.svelte +62 -173
  62. package/dist/markdown/markdown.svelte.d.ts +7 -27
  63. package/dist/markdown/parse.d.ts +5 -0
  64. package/dist/markdown/parse.js +30 -0
  65. package/dist/markdown/types.d.ts +28 -0
  66. package/dist/markdown/types.js +1 -0
  67. package/dist/menu/index.d.ts +3 -6
  68. package/dist/menu/index.js +3 -6
  69. package/dist/menu/menu-actions.svelte +44 -38
  70. package/dist/menu/menu-context.d.ts +4 -0
  71. package/dist/menu/menu-context.js +2 -0
  72. package/dist/menu/menu-group.svelte +40 -0
  73. package/dist/menu/menu-group.svelte.d.ts +11 -0
  74. package/dist/menu/menu-item.svelte +31 -54
  75. package/dist/menu/menu-item.svelte.d.ts +7 -5
  76. package/dist/menu/menu.svelte +160 -15
  77. package/dist/menu/menu.svelte.d.ts +15 -4
  78. package/dist/merge-props.d.ts +1 -1
  79. package/dist/merge-props.js +10 -5
  80. package/dist/modal/modal.svelte +60 -83
  81. package/dist/modal/modal.svelte.d.ts +5 -4
  82. package/dist/popover/index.d.ts +1 -1
  83. package/dist/popover/index.js +1 -1
  84. package/dist/popover/popover.svelte +58 -111
  85. package/dist/popover/popover.svelte.d.ts +6 -8
  86. package/dist/progress/circular-progress.svelte +64 -30
  87. package/dist/progress/circular-progress.svelte.d.ts +7 -8
  88. package/dist/shortcut/index.d.ts +2 -2
  89. package/dist/shortcut/index.js +1 -1
  90. package/dist/shortcut/shortcut-hint.svelte +36 -0
  91. package/dist/shortcut/shortcut-hint.svelte.d.ts +9 -0
  92. package/dist/shortcut/shortcut.d.ts +19 -14
  93. package/dist/shortcut/shortcut.js +105 -52
  94. package/dist/skeleton/skeleton.svelte +13 -8
  95. package/dist/skeleton/skeleton.svelte.d.ts +2 -5
  96. package/dist/slider/index.d.ts +1 -8
  97. package/dist/slider/index.js +1 -8
  98. package/dist/slider/slider.svelte +180 -211
  99. package/dist/slider/slider.svelte.d.ts +11 -32
  100. package/dist/switch/index.d.ts +1 -2
  101. package/dist/switch/index.js +1 -2
  102. package/dist/switch/switch.svelte +36 -60
  103. package/dist/switch/switch.svelte.d.ts +6 -17
  104. package/dist/textarea/index.d.ts +1 -1
  105. package/dist/textarea/index.js +1 -1
  106. package/dist/textarea/textarea.svelte +23 -63
  107. package/dist/textarea/textarea.svelte.d.ts +8 -18
  108. package/dist/theme.css +191 -0
  109. package/dist/toggle/index.d.ts +0 -1
  110. package/dist/toggle/index.js +0 -1
  111. package/dist/toggle/toggle-button.svelte +72 -38
  112. package/dist/toggle/toggle-button.svelte.d.ts +4 -4
  113. package/dist/toggle/toggle-context.d.ts +10 -0
  114. package/dist/toggle/toggle-context.js +2 -0
  115. package/dist/toggle/toggle-group.svelte +41 -22
  116. package/dist/toggle/toggle-group.svelte.d.ts +7 -4
  117. package/dist/tooltip/tooltip.svelte +67 -26
  118. package/dist/tooltip/tooltip.svelte.d.ts +10 -4
  119. package/dist/utils.d.ts +9 -3
  120. package/dist/utils.js +10 -0
  121. package/package.json +21 -13
  122. package/dist/autocomplete/autocomplete-content.svelte +0 -47
  123. package/dist/autocomplete/autocomplete-content.svelte.d.ts +0 -10
  124. package/dist/autocomplete/autocomplete-context.svelte.d.ts +0 -12
  125. package/dist/autocomplete/autocomplete-context.svelte.js +0 -34
  126. package/dist/autocomplete/autocomplete-input.svelte +0 -36
  127. package/dist/autocomplete/autocomplete-input.svelte.d.ts +0 -5
  128. package/dist/autocomplete/autocomplete-item.svelte +0 -68
  129. package/dist/autocomplete/autocomplete-item.svelte.d.ts +0 -11
  130. package/dist/base.css +0 -71
  131. package/dist/bindable.svelte.d.ts +0 -7
  132. package/dist/bindable.svelte.js +0 -25
  133. package/dist/command/command-content.svelte +0 -15
  134. package/dist/command/command-content.svelte.d.ts +0 -8
  135. package/dist/command/command-context.svelte.d.ts +0 -5
  136. package/dist/command/command-context.svelte.js +0 -13
  137. package/dist/command/command-input.svelte +0 -44
  138. package/dist/command/command-input.svelte.d.ts +0 -7
  139. package/dist/command/command-item.svelte +0 -66
  140. package/dist/command/command-item.svelte.d.ts +0 -11
  141. package/dist/command/command-search.svelte +0 -28
  142. package/dist/command/command-search.svelte.d.ts +0 -5
  143. package/dist/command/command.svelte +0 -19
  144. package/dist/command/command.svelte.d.ts +0 -8
  145. package/dist/command/commander.svelte +0 -107
  146. package/dist/command/commander.svelte.d.ts +0 -9
  147. package/dist/common/header.svelte +0 -35
  148. package/dist/common/header.svelte.d.ts +0 -10
  149. package/dist/common/item-context.svelte.d.ts +0 -12
  150. package/dist/common/item-context.svelte.js +0 -77
  151. package/dist/dialog/dialog-button.svelte +0 -25
  152. package/dist/dialog/dialog-button.svelte.d.ts +0 -32
  153. package/dist/dialog/dialoguer-context.svelte.d.ts +0 -53
  154. package/dist/dialog/dialoguer-context.svelte.js +0 -85
  155. package/dist/dialog/dialoguer.svelte +0 -65
  156. package/dist/dialog/dialoguer.svelte.d.ts +0 -7
  157. package/dist/markdown/markdown-blockquote.svelte +0 -14
  158. package/dist/markdown/markdown-blockquote.svelte.d.ts +0 -7
  159. package/dist/markdown/markdown-br.svelte +0 -12
  160. package/dist/markdown/markdown-br.svelte.d.ts +0 -7
  161. package/dist/markdown/markdown-code.svelte +0 -14
  162. package/dist/markdown/markdown-code.svelte.d.ts +0 -7
  163. package/dist/markdown/markdown-codespan.svelte +0 -15
  164. package/dist/markdown/markdown-codespan.svelte.d.ts +0 -7
  165. package/dist/markdown/markdown-context.svelte.d.ts +0 -26
  166. package/dist/markdown/markdown-context.svelte.js +0 -30
  167. package/dist/markdown/markdown-def.svelte +0 -15
  168. package/dist/markdown/markdown-def.svelte.d.ts +0 -7
  169. package/dist/markdown/markdown-del.svelte +0 -14
  170. package/dist/markdown/markdown-del.svelte.d.ts +0 -7
  171. package/dist/markdown/markdown-em.svelte +0 -14
  172. package/dist/markdown/markdown-em.svelte.d.ts +0 -7
  173. package/dist/markdown/markdown-escape.svelte +0 -8
  174. package/dist/markdown/markdown-escape.svelte.d.ts +0 -5
  175. package/dist/markdown/markdown-heading.svelte +0 -16
  176. package/dist/markdown/markdown-heading.svelte.d.ts +0 -7
  177. package/dist/markdown/markdown-hr.svelte +0 -12
  178. package/dist/markdown/markdown-hr.svelte.d.ts +0 -7
  179. package/dist/markdown/markdown-html.svelte +0 -9
  180. package/dist/markdown/markdown-html.svelte.d.ts +0 -5
  181. package/dist/markdown/markdown-image.svelte +0 -12
  182. package/dist/markdown/markdown-image.svelte.d.ts +0 -7
  183. package/dist/markdown/markdown-link.svelte +0 -17
  184. package/dist/markdown/markdown-link.svelte.d.ts +0 -7
  185. package/dist/markdown/markdown-list-item.svelte +0 -14
  186. package/dist/markdown/markdown-list-item.svelte.d.ts +0 -7
  187. package/dist/markdown/markdown-list.svelte +0 -19
  188. package/dist/markdown/markdown-list.svelte.d.ts +0 -7
  189. package/dist/markdown/markdown-paragraph.svelte +0 -16
  190. package/dist/markdown/markdown-paragraph.svelte.d.ts +0 -7
  191. package/dist/markdown/markdown-space.svelte +0 -8
  192. package/dist/markdown/markdown-space.svelte.d.ts +0 -5
  193. package/dist/markdown/markdown-strong.svelte +0 -15
  194. package/dist/markdown/markdown-strong.svelte.d.ts +0 -7
  195. package/dist/markdown/markdown-table-cell.svelte +0 -16
  196. package/dist/markdown/markdown-table-cell.svelte.d.ts +0 -7
  197. package/dist/markdown/markdown-table.svelte +0 -36
  198. package/dist/markdown/markdown-table.svelte.d.ts +0 -7
  199. package/dist/markdown/markdown-text.svelte +0 -8
  200. package/dist/markdown/markdown-text.svelte.d.ts +0 -5
  201. package/dist/markdown/markdown-token.svelte +0 -25
  202. package/dist/markdown/markdown-token.svelte.d.ts +0 -7
  203. package/dist/menu/menu-content.svelte +0 -47
  204. package/dist/menu/menu-content.svelte.d.ts +0 -10
  205. package/dist/menu/menu-context.svelte.d.ts +0 -18
  206. package/dist/menu/menu-context.svelte.js +0 -118
  207. package/dist/menu/menu-trigger-button.svelte +0 -31
  208. package/dist/menu/menu-trigger-button.svelte.d.ts +0 -5
  209. package/dist/menu/menu-trigger.svelte +0 -42
  210. package/dist/menu/menu-trigger.svelte.d.ts +0 -10
  211. package/dist/ordered-html-elements.d.ts +0 -7
  212. package/dist/ordered-html-elements.js +0 -29
  213. package/dist/portal/index.d.ts +0 -2
  214. package/dist/portal/index.js +0 -2
  215. package/dist/portal/portal.svelte +0 -15
  216. package/dist/portal/portal.svelte.d.ts +0 -8
  217. package/dist/portal/proxy.svelte +0 -13
  218. package/dist/portal/proxy.svelte.d.ts +0 -7
  219. package/dist/shortcut/shortcut-badge.svelte +0 -41
  220. package/dist/shortcut/shortcut-badge.svelte.d.ts +0 -11
  221. package/dist/slider/slider-context.svelte.d.ts +0 -50
  222. package/dist/slider/slider-context.svelte.js +0 -198
  223. package/dist/slider/slider-handle-label-arrow.svelte +0 -18
  224. package/dist/slider/slider-handle-label-arrow.svelte.d.ts +0 -6
  225. package/dist/slider/slider-handle-label.svelte +0 -35
  226. package/dist/slider/slider-handle-label.svelte.d.ts +0 -6
  227. package/dist/slider/slider-handle.svelte +0 -54
  228. package/dist/slider/slider-handle.svelte.d.ts +0 -6
  229. package/dist/slider/slider-mark-dot.svelte +0 -25
  230. package/dist/slider/slider-mark-dot.svelte.d.ts +0 -6
  231. package/dist/slider/slider-mark-label.svelte +0 -37
  232. package/dist/slider/slider-mark-label.svelte.d.ts +0 -9
  233. package/dist/slider/slider-mark.svelte +0 -33
  234. package/dist/slider/slider-mark.svelte.d.ts +0 -9
  235. package/dist/switch/switch-thumb.svelte +0 -52
  236. package/dist/switch/switch-thumb.svelte.d.ts +0 -7
  237. package/dist/toggle/toggle-context.svelte.d.ts +0 -9
  238. package/dist/toggle/toggle-context.svelte.js +0 -32
@@ -1,50 +1,16 @@
1
1
  <script lang="ts" module>
2
2
  import {
3
- COLORS,
4
- RADII,
5
- SIZES,
6
3
  type Color,
7
4
  type ColorProp,
8
- type Radius,
9
- type RadiusProp,
5
+ type Shape,
6
+ type ShapeProp,
10
7
  type Size,
11
8
  type SizeProp,
12
9
  } from "../base.js";
13
- import { mergeProps } from "../merge-props.js";
14
- import {
15
- setSliderContext,
16
- SliderContext,
17
- SliderHandle,
18
- SliderHandleLabel,
19
- SliderHandleLabelArrow,
20
- SliderMark,
21
- SliderMarkDot,
22
- SliderMarkLabel,
23
- type SliderHandleLabelArrowProps,
24
- type SliderHandleLabelProps,
25
- type SliderHandleProps,
26
- type SliderMarkDotProps,
27
- type SliderMarkLabelProps,
28
- type SliderMarkProps,
29
- } from "./index.js";
30
- import type { ClassName } from "../utils.js";
31
- import type { Snippet } from "svelte";
32
- import type { HTMLAttributes } from "svelte/elements";
33
- import { twMerge } from "tailwind-merge";
34
-
35
- export const SLIDER_COLORS = COLORS;
36
- export type SliderColor = Color;
37
- export type SliderColorProp = ColorProp;
38
-
39
- export const SLIDER_SIZES = SIZES;
40
- export type SliderSize = Size;
41
- export type SliderSizeProp = SizeProp;
42
-
43
- export const SLIDER_RADII = RADII;
44
- export type SliderRadius = Radius;
45
- export type SliderRadiusProp = RadiusProp;
46
-
47
- export type Mark = {
10
+ import { cn, type ClassName } from "../utils.js";
11
+ import type { HTMLInputAttributes } from "svelte/elements";
12
+
13
+ export type SliderMark = {
48
14
  value: number;
49
15
  label?: string;
50
16
  };
@@ -53,197 +19,200 @@
53
19
  value?: number;
54
20
  min?: number;
55
21
  max?: number;
56
- step?: number;
57
- marks?: Mark[];
58
- disabled?: boolean;
59
- label?: (value: number) => string;
60
- labelAlwaysOn?: boolean;
61
- inverted?: boolean;
62
- restrictToMarks?: boolean;
63
- onChange?: (value: number) => void;
64
- onChangeEnd?: (value: number) => void;
65
- sliderHandle?: Snippet<[SliderHandleProps]>;
66
- sliderHandleLabel?: Snippet<[SliderHandleLabelProps]>;
67
- sliderHandleLabelArrow?: Snippet<[SliderHandleLabelArrowProps]>;
68
- sliderMark?: Snippet<[SliderMarkProps]>;
69
- sliderMarkDot?: Snippet<[SliderMarkDotProps]>;
70
- sliderMarkLabel?: Snippet<[SliderMarkLabelProps]>;
22
+ step?: number | "any";
23
+ marks?: SliderMark[];
24
+ format?: (value: number) => string;
25
+ showValue?: boolean;
26
+ el?: HTMLInputElement;
71
27
  } & ClassName &
72
- SliderColorProp &
73
- SliderSizeProp &
74
- SliderRadiusProp &
75
- HTMLAttributes<HTMLDivElement>;
28
+ ColorProp &
29
+ SizeProp &
30
+ ShapeProp &
31
+ Omit<
32
+ HTMLInputAttributes,
33
+ "type" | "value" | "min" | "max" | "step" | "size" | "class"
34
+ >;
35
+
36
+ const SIZES: Record<Size, string> = {
37
+ xs: "[--height:1.25rem] [--thumb:0.75rem] [--track:0.25rem]",
38
+ sm: "[--height:1.5rem] [--thumb:1rem] [--track:0.375rem]",
39
+ md: "[--height:1.75rem] [--thumb:1.25rem] [--track:0.5rem]",
40
+ lg: "[--height:2rem] [--thumb:1.5rem] [--track:0.625rem]",
41
+ xl: "[--height:2.25rem] [--thumb:1.75rem] [--track:0.75rem]",
42
+ };
43
+
44
+ const SHAPES: Record<Shape, string> = {
45
+ none: "[--radius:0]",
46
+ xs: "[--radius:0.25rem]",
47
+ sm: "[--radius:0.5rem]",
48
+ md: "[--radius:0.75rem]",
49
+ lg: "[--radius:1rem]",
50
+ xl: "[--radius:1.75rem]",
51
+ full: "[--radius:9999px]",
52
+ };
53
+
54
+ const COLORS: Record<Color, string> = {
55
+ primary: "text-m3-primary",
56
+ secondary: "text-m3-secondary",
57
+ tertiary: "text-m3-tertiary",
58
+ error: "text-m3-error",
59
+ plain: "",
60
+ inherit: "",
61
+ };
62
+
63
+ const clamp = (value: number, min: number, max: number) =>
64
+ Math.min(Math.max(value, min), max);
76
65
  </script>
77
66
 
78
67
  <script lang="ts">
79
68
  let {
80
- value = $bindable(0),
69
+ value = $bindable(),
81
70
  min = 0,
82
71
  max = 100,
83
72
  step = 1,
84
73
  marks = [],
85
- disabled = false,
86
- label = (val: number) => val.toString(),
87
- labelAlwaysOn = false,
88
- inverted = false,
89
- restrictToMarks = false,
90
- onChange,
91
- onChangeEnd,
92
- sliderHandle = defaultSliderHandle,
93
- sliderHandleLabel = defaultSliderHandleLabel,
94
- sliderHandleLabelArrow = defaultSliderHandleLabelArrow,
95
- sliderMark = defaultSliderMark,
96
- sliderMarkDot = defaultSliderMarkDot,
97
- sliderMarkLabel = defaultSliderMarkLabel,
74
+ format = String,
75
+ showValue = false,
76
+ el = $bindable(),
98
77
  class: className,
99
78
  color = "primary",
100
- size = "md",
101
- radius = "full",
79
+ size = "sm",
80
+ shape = "full",
81
+ disabled,
102
82
  ...restProps
103
83
  }: SliderProps = $props();
104
84
 
105
- const ctx = setSliderContext(
106
- new SliderContext(
107
- () => value,
108
- (newValue) => (value = newValue),
109
- () => min,
110
- () => max,
111
- () => step,
112
- () => marks,
113
- () => disabled,
114
- (val) => label(val),
115
- () => labelAlwaysOn,
116
- () => inverted,
117
- () => restrictToMarks,
118
- () => color,
119
- () => size,
120
- () => radius,
121
- (val) => onChange?.(val),
122
- (val) => onChangeEnd?.(val),
123
- sliderHandle,
124
- sliderHandleLabel,
125
- sliderHandleLabelArrow,
126
- sliderMark,
127
- sliderMarkDot,
128
- sliderMarkLabel,
129
- ),
130
- );
131
-
132
- const SIZE_RATIO: Record<Size, number> = {
133
- xs: 1.5,
134
- sm: 2,
135
- md: 2.5,
136
- lg: 3,
137
- xl: 3.5,
138
- };
85
+ const fractionOf = (at: number) =>
86
+ max > min ? (clamp(at, min, max) - min) / (max - min) : 0;
139
87
 
140
- let ratio = $derived(SIZE_RATIO[ctx.size]);
88
+ let current = $derived(value ?? (min + max) / 2);
89
+ let text = $derived(format(current));
141
90
  </script>
142
91
 
143
- {#snippet defaultSliderHandle(props: SliderHandleProps)}
144
- <SliderHandle {...props} />
145
- {/snippet}
146
-
147
- {#snippet defaultSliderHandleLabel(props: SliderHandleLabelProps)}
148
- <SliderHandleLabel {...props} />
149
- {/snippet}
150
-
151
- {#snippet defaultSliderHandleLabelArrow(props: SliderHandleLabelArrowProps)}
152
- <SliderHandleLabelArrow {...props} />
153
- {/snippet}
154
-
155
- {#snippet defaultSliderMark(props: SliderMarkProps)}
156
- <SliderMark {...props} />
157
- {/snippet}
158
-
159
- {#snippet defaultSliderMarkDot(props: SliderMarkDotProps)}
160
- <SliderMarkDot {...props} />
161
- {/snippet}
162
-
163
- {#snippet defaultSliderMarkLabel(props: SliderMarkLabelProps)}
164
- <SliderMarkLabel {...props} />
165
- {/snippet}
166
-
167
- <!-- Track -->
168
92
  <div
169
- class={twMerge(
170
- "cursor-pointer bg-m3-surface-container-highest px-2 select-none",
171
-
172
- ctx.disabled && "cursor-not-allowed opacity-50",
173
-
174
- ctx.radius === "none" && "rounded-none",
175
- ctx.radius === "xs" && "rounded-xs",
176
- ctx.radius === "sm" && "rounded-sm",
177
- ctx.radius === "md" && "rounded-lg",
178
- ctx.radius === "lg" && "rounded-2xl",
179
- ctx.radius === "xl" && "rounded-4xl",
180
- ctx.radius === "full" && "rounded-full",
181
-
182
- ctx.size === "xs" && "my-1 h-0.5 px-1.5",
183
- ctx.size === "sm" && "my-1 h-1 px-2",
184
- ctx.size === "md" && "my-1 h-2 px-2.5",
185
- ctx.size === "lg" && "my-1 h-3 px-3",
186
- ctx.size === "xl" && "my-1 h-4 px-3.5",
187
-
188
- marks.length > 0 && "mb-6",
189
-
93
+ class={cn(
94
+ "slider relative w-full",
95
+ SIZES[size],
96
+ SHAPES[shape],
97
+ COLORS[color],
98
+ marks.some((mark) => mark.label) && "pb-5",
99
+ disabled && "opacity-38",
190
100
  className,
191
101
  )}
192
- {...mergeProps(restProps, {
193
- role: "slider",
194
- tabindex: ctx.disabled ? -1 : 0,
195
- "aria-valuenow": ctx.value,
196
- "aria-valuemin": ctx.min,
197
- "aria-valuemax": ctx.max,
198
- "aria-disabled": ctx.disabled,
199
- onpointerdown: ctx.pointerDown,
200
- onpointermove: ctx.pointerMove,
201
- onpointerup: ctx.pointerUp,
202
- onkeydown: ctx.keyDown,
203
- onfocus: ctx.focus,
204
- onblur: ctx.blur,
205
- })}
102
+ style:--fraction={fractionOf(current)}
206
103
  >
207
- <div bind:this={ctx.sliderEl} class="relative h-full">
208
- <!-- Filled track -->
209
- <div
210
- class={twMerge(
211
- "absolute h-full",
212
-
213
- ctx.animated && "transition-all",
214
-
215
- ctx.color === "primary" && "bg-m3-primary",
216
- ctx.color === "secondary" && "bg-m3-secondary",
217
- ctx.color === "tertiary" && "bg-m3-tertiary",
218
- ctx.color === "error" && "bg-m3-error",
219
-
220
- ctx.radius === "none" && "rounded-none",
221
- ctx.radius === "xs" && "rounded-xs",
222
- ctx.radius === "sm" && "rounded-sm",
223
- ctx.radius === "md" && "rounded-lg",
224
- ctx.radius === "lg" && "rounded-2xl",
225
- ctx.radius === "xl" && "rounded-4xl",
226
- ctx.radius === "full" && "rounded-full",
227
- )}
228
- style={ctx.inverted
229
- ? `right: 0; margin-right: calc(var(--spacing) * -${ratio}); width: calc(${100 - ctx.position}% + var(--spacing) * ${ratio})`
230
- : `left: 0; margin-left: calc(var(--spacing) * -${ratio}); width: calc(${ctx.position}% + var(--spacing) * ${ratio})`}
231
- ></div>
232
-
233
- <!-- Marks -->
234
- {#each marks as { value, label } (value)}
235
- {@render ctx.markRenderer({ value, label })}
236
- {/each}
237
-
238
- <!-- Handle -->
239
- <div
240
- class={twMerge(
241
- "absolute top-1/2 -translate-x-1/2 -translate-y-1/2",
242
- ctx.animated && "transition-all",
243
- )}
244
- style={`left: ${ctx.position}%`}
245
- >
246
- {@render ctx.handleRenderer({})}
104
+ <input
105
+ bind:this={el}
106
+ bind:value
107
+ type="range"
108
+ {min}
109
+ {max}
110
+ {step}
111
+ {disabled}
112
+ aria-valuetext={text}
113
+ class="peer block h-(--height) w-full cursor-pointer appearance-none bg-transparent disabled:cursor-not-allowed"
114
+ {...restProps}
115
+ />
116
+
117
+ {#if marks.length > 0}
118
+ <div aria-hidden="true" class="pointer-events-none">
119
+ {#each marks as mark (mark.value)}
120
+ {#if mark.value !== current}
121
+ <span
122
+ class="at dot absolute top-[calc(var(--height)/2)] size-1 -translate-1/2 rounded-full"
123
+ class:filled={mark.value <= current}
124
+ style:--at={fractionOf(mark.value)}
125
+ ></span>
126
+ {/if}
127
+ {#if mark.label}
128
+ <span
129
+ class="at absolute top-(--height) -translate-x-1/2 pt-1 text-xs whitespace-nowrap text-m3-on-surface-variant"
130
+ style:--at={fractionOf(mark.value)}
131
+ >
132
+ {mark.label}
133
+ </span>
134
+ {/if}
135
+ {/each}
247
136
  </div>
248
- </div>
137
+ {/if}
138
+
139
+ <span
140
+ aria-hidden="true"
141
+ class={cn(
142
+ "at pointer-events-none absolute bottom-full mb-1 -translate-x-1/2 rounded-md bg-m3-inverse-surface px-2 py-1 text-xs whitespace-nowrap text-m3-inverse-on-surface opacity-0 transition-opacity peer-hover:opacity-100 peer-focus-visible:opacity-100 peer-active:opacity-100",
143
+ showValue && "opacity-100",
144
+ disabled && "hidden",
145
+ )}
146
+ style:--at={fractionOf(current)}
147
+ >
148
+ {text}
149
+ </span>
249
150
  </div>
151
+
152
+ <style>@layer components {
153
+ .slider {
154
+ --fill-at: calc(var(--thumb) / 2 + (100% - var(--thumb)) * var(--fraction));
155
+ --track-fill: linear-gradient(
156
+ to right,
157
+ currentColor var(--fill-at),
158
+ color-mix(in oklab, currentColor 24%, transparent) var(--fill-at)
159
+ );
160
+ }
161
+
162
+ .at {
163
+ left: calc(var(--thumb) / 2 + (100% - var(--thumb)) * var(--at));
164
+ }
165
+
166
+ .dot {
167
+ background: currentColor;
168
+ }
169
+
170
+ .dot.filled {
171
+ background: var(--md-sys-color-surface);
172
+ }
173
+
174
+ input::-webkit-slider-runnable-track {
175
+ height: var(--track);
176
+ border-radius: var(--radius);
177
+ background: var(--track-fill);
178
+ }
179
+
180
+ input::-moz-range-track {
181
+ height: var(--track);
182
+ border-radius: var(--radius);
183
+ background: var(--track-fill);
184
+ }
185
+
186
+ input::-webkit-slider-thumb {
187
+ appearance: none;
188
+ width: var(--thumb);
189
+ height: var(--thumb);
190
+ margin-top: calc((var(--track) - var(--thumb)) / 2);
191
+ border-radius: var(--radius);
192
+ background: currentColor;
193
+ box-shadow: 0 0 0 2px var(--md-sys-color-surface);
194
+ }
195
+
196
+ input::-moz-range-thumb {
197
+ width: var(--thumb);
198
+ height: var(--thumb);
199
+ border: none;
200
+ border-radius: var(--radius);
201
+ background: currentColor;
202
+ box-shadow: 0 0 0 2px var(--md-sys-color-surface);
203
+ }
204
+
205
+ input:focus-visible {
206
+ outline: none;
207
+ }
208
+
209
+ input:focus-visible::-webkit-slider-thumb {
210
+ outline: 2px solid currentColor;
211
+ outline-offset: 3px;
212
+ }
213
+
214
+ input:focus-visible::-moz-range-thumb {
215
+ outline: 2px solid currentColor;
216
+ outline-offset: 3px;
217
+ }
218
+ }</style>
@@ -1,18 +1,7 @@
1
- import { type Color, type ColorProp, type Radius, type RadiusProp, type Size, type SizeProp } from "../base.js";
2
- import { type SliderHandleLabelArrowProps, type SliderHandleLabelProps, type SliderHandleProps, type SliderMarkDotProps, type SliderMarkLabelProps, type SliderMarkProps } from "./index.js";
3
- import type { ClassName } from "../utils.js";
4
- import type { Snippet } from "svelte";
5
- import type { HTMLAttributes } from "svelte/elements";
6
- export declare const SLIDER_COLORS: readonly ["primary", "secondary", "tertiary", "error", "plain", "inherit"];
7
- export type SliderColor = Color;
8
- export type SliderColorProp = ColorProp;
9
- export declare const SLIDER_SIZES: readonly ["xs", "sm", "md", "lg", "xl"];
10
- export type SliderSize = Size;
11
- export type SliderSizeProp = SizeProp;
12
- export declare const SLIDER_RADII: readonly ["none", "xs", "sm", "md", "lg", "xl", "2xl", "3xl", "4xl", "full"];
13
- export type SliderRadius = Radius;
14
- export type SliderRadiusProp = RadiusProp;
15
- export type Mark = {
1
+ import { type ColorProp, type ShapeProp, type SizeProp } from "../base.js";
2
+ import { type ClassName } from "../utils.js";
3
+ import type { HTMLInputAttributes } from "svelte/elements";
4
+ export type SliderMark = {
16
5
  value: number;
17
6
  label?: string;
18
7
  };
@@ -20,22 +9,12 @@ export type SliderProps = {
20
9
  value?: number;
21
10
  min?: number;
22
11
  max?: number;
23
- step?: number;
24
- marks?: Mark[];
25
- disabled?: boolean;
26
- label?: (value: number) => string;
27
- labelAlwaysOn?: boolean;
28
- inverted?: boolean;
29
- restrictToMarks?: boolean;
30
- onChange?: (value: number) => void;
31
- onChangeEnd?: (value: number) => void;
32
- sliderHandle?: Snippet<[SliderHandleProps]>;
33
- sliderHandleLabel?: Snippet<[SliderHandleLabelProps]>;
34
- sliderHandleLabelArrow?: Snippet<[SliderHandleLabelArrowProps]>;
35
- sliderMark?: Snippet<[SliderMarkProps]>;
36
- sliderMarkDot?: Snippet<[SliderMarkDotProps]>;
37
- sliderMarkLabel?: Snippet<[SliderMarkLabelProps]>;
38
- } & ClassName & SliderColorProp & SliderSizeProp & SliderRadiusProp & HTMLAttributes<HTMLDivElement>;
39
- declare const Slider: import("svelte").Component<SliderProps, {}, "value">;
12
+ step?: number | "any";
13
+ marks?: SliderMark[];
14
+ format?: (value: number) => string;
15
+ showValue?: boolean;
16
+ el?: HTMLInputElement;
17
+ } & ClassName & ColorProp & SizeProp & ShapeProp & Omit<HTMLInputAttributes, "type" | "value" | "min" | "max" | "step" | "size" | "class">;
18
+ declare const Slider: import("svelte").Component<SliderProps, {}, "el" | "value">;
40
19
  type Slider = ReturnType<typeof Slider>;
41
20
  export default Slider;
@@ -1,2 +1 @@
1
- export { default as SwitchThumb, type SwitchThumbProps, } from "./switch-thumb.svelte";
2
- export { default as Switch, SWITCH_COLORS, SWITCH_RADII, SWITCH_SIZES, type SwitchColor, type SwitchColorProp, type SwitchProps, type SwitchRadius, type SwitchRadiusProp, type SwitchSize, type SwitchSizeProp, } from "./switch.svelte";
1
+ export { default as Switch, type SwitchProps } from "./switch.svelte";
@@ -1,2 +1 @@
1
- export { default as SwitchThumb, } from "./switch-thumb.svelte";
2
- export { default as Switch, SWITCH_COLORS, SWITCH_RADII, SWITCH_SIZES, } from "./switch.svelte";
1
+ export { default as Switch } from "./switch.svelte";
@@ -1,91 +1,67 @@
1
1
  <script lang="ts" module>
2
2
  import {
3
- COLORS,
4
- RADII,
5
- SIZES,
6
- type Color,
3
+ baseClasses,
7
4
  type ColorProp,
8
- type Radius,
9
- type RadiusProp,
5
+ type ShapeProp,
10
6
  type Size,
11
7
  type SizeProp,
12
8
  } from "../base.js";
13
- import { mergeProps } from "../merge-props.js";
14
- import type { ClassName } from "../utils.js";
15
- import type { Snippet } from "svelte";
16
- import type { HTMLButtonAttributes } from "svelte/elements";
17
- import { twMerge } from "tailwind-merge";
18
- import SwitchThumb, { type SwitchThumbProps } from "./switch-thumb.svelte";
19
-
20
- export const SWITCH_COLORS = COLORS;
21
- export type SwitchColor = Color;
22
- export type SwitchColorProp = ColorProp;
23
-
24
- export const SWITCH_SIZES = SIZES;
25
- export type SwitchSize = Size;
26
- export type SwitchSizeProp = SizeProp;
27
-
28
- export const SWITCH_RADII = RADII;
29
- export type SwitchRadius = Radius;
30
- export type SwitchRadiusProp = RadiusProp;
9
+ import { cn, type ClassName } from "../utils.js";
10
+ import type { HTMLInputAttributes } from "svelte/elements";
31
11
 
32
12
  export type SwitchProps = {
33
13
  checked?: boolean;
34
- thumb?: Snippet<[SwitchThumbProps]>;
14
+ el?: HTMLInputElement;
35
15
  } & ClassName &
36
- SwitchColorProp &
37
- SwitchSizeProp &
38
- SwitchRadiusProp &
39
- HTMLButtonAttributes;
16
+ ColorProp &
17
+ SizeProp &
18
+ ShapeProp &
19
+ Omit<HTMLInputAttributes, "type" | "role" | "size" | "class" | "checked">;
20
+
21
+ const SIZES: Record<Size, string> = {
22
+ xs: "h-4 w-7 before:size-2 checked:before:translate-x-3",
23
+ sm: "h-6 w-10 before:size-4 checked:before:translate-x-4",
24
+ md: "h-7 w-12 before:size-5 checked:before:translate-x-5",
25
+ lg: "h-8 w-13 before:size-6 checked:before:translate-x-5",
26
+ xl: "h-9 w-15 before:size-7 checked:before:translate-x-6",
27
+ };
40
28
  </script>
41
29
 
42
30
  <script lang="ts">
43
31
  let {
44
- checked = $bindable(false),
45
- thumb = defaultThumb,
32
+ checked = $bindable(),
33
+ el = $bindable(),
46
34
  class: className,
47
35
  color = "primary",
48
36
  size = "sm",
49
- radius = "xl",
37
+ shape = "full",
50
38
  ...restProps
51
39
  }: SwitchProps = $props();
52
40
  </script>
53
41
 
54
- {#snippet defaultThumb(props: SwitchThumbProps)}
55
- <SwitchThumb {...props} />
56
- {/snippet}
57
-
58
- <button
59
- type="button"
42
+ <input
43
+ bind:this={el}
44
+ bind:checked
45
+ type="checkbox"
60
46
  role="switch"
61
- aria-checked={checked}
62
- class={twMerge(
63
- "group relative inline-flex cursor-pointer bg-m3-surface-container-highest transition-all focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
47
+ class={cn(
48
+ "relative inline-block shrink-0 cursor-pointer appearance-none bg-m3-surface-container-highest align-middle ring-2 ring-m3-outline ring-inset before:absolute before:top-1 before:left-1 before:rounded-[inherit] before:bg-m3-outline focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-38 motion-safe:transition-colors motion-safe:before:transition-all",
64
49
 
65
50
  color === "primary" &&
66
- "focus-visible:outline-m3-primary aria-checked:bg-m3-primary",
51
+ "checked:bg-m3-primary checked:ring-m3-primary checked:before:bg-m3-on-primary focus-visible:outline-m3-primary",
67
52
  color === "secondary" &&
68
- "focus-visible:outline-m3-secondary aria-checked:bg-m3-secondary",
53
+ "checked:bg-m3-secondary checked:ring-m3-secondary checked:before:bg-m3-on-secondary focus-visible:outline-m3-secondary",
69
54
  color === "tertiary" &&
70
- "focus-visible:outline-m3-tertiary aria-checked:bg-m3-tertiary",
55
+ "checked:bg-m3-tertiary checked:ring-m3-tertiary checked:before:bg-m3-on-tertiary focus-visible:outline-m3-tertiary",
71
56
  color === "error" &&
72
- "focus-visible:outline-m3-error aria-checked:bg-m3-error",
73
-
74
- size === "xs" && "h-4 w-8",
75
- size === "sm" && "h-5 w-10",
76
- size === "md" && "h-6 w-12",
77
- size === "lg" && "h-7 w-14",
78
- size === "xl" && "h-8 w-16",
57
+ "checked:bg-m3-error checked:ring-m3-error checked:before:bg-m3-on-error focus-visible:outline-m3-error",
58
+ (color === "plain" || color === "inherit") &&
59
+ "checked:bg-current checked:ring-current checked:before:bg-m3-surface focus-visible:outline-current",
79
60
 
80
- radius === "xs" && "rounded-xs",
81
- radius === "sm" && "rounded-sm",
82
- radius === "md" && "rounded-lg",
83
- radius === "lg" && "rounded-2xl",
84
- radius === "xl" && "rounded-4xl",
61
+ SIZES[size],
62
+ baseClasses({ shape }),
85
63
 
86
64
  className,
87
65
  )}
88
- {...mergeProps(restProps, { onclick: () => (checked = !checked) })}
89
- >
90
- {@render thumb({ color, size, radius })}
91
- </button>
66
+ {...restProps}
67
+ />
@@ -1,21 +1,10 @@
1
- import { type Color, type ColorProp, type Radius, type RadiusProp, type Size, type SizeProp } from "../base.js";
2
- import type { ClassName } from "../utils.js";
3
- import type { Snippet } from "svelte";
4
- import type { HTMLButtonAttributes } from "svelte/elements";
5
- import { type SwitchThumbProps } from "./switch-thumb.svelte";
6
- export declare const SWITCH_COLORS: readonly ["primary", "secondary", "tertiary", "error", "plain", "inherit"];
7
- export type SwitchColor = Color;
8
- export type SwitchColorProp = ColorProp;
9
- export declare const SWITCH_SIZES: readonly ["xs", "sm", "md", "lg", "xl"];
10
- export type SwitchSize = Size;
11
- export type SwitchSizeProp = SizeProp;
12
- export declare const SWITCH_RADII: readonly ["none", "xs", "sm", "md", "lg", "xl", "2xl", "3xl", "4xl", "full"];
13
- export type SwitchRadius = Radius;
14
- export type SwitchRadiusProp = RadiusProp;
1
+ import { type ColorProp, type ShapeProp, type SizeProp } from "../base.js";
2
+ import { type ClassName } from "../utils.js";
3
+ import type { HTMLInputAttributes } from "svelte/elements";
15
4
  export type SwitchProps = {
16
5
  checked?: boolean;
17
- thumb?: Snippet<[SwitchThumbProps]>;
18
- } & ClassName & SwitchColorProp & SwitchSizeProp & SwitchRadiusProp & HTMLButtonAttributes;
19
- declare const Switch: import("svelte").Component<SwitchProps, {}, "checked">;
6
+ el?: HTMLInputElement;
7
+ } & ClassName & ColorProp & SizeProp & ShapeProp & Omit<HTMLInputAttributes, "type" | "role" | "size" | "class" | "checked">;
8
+ declare const Switch: import("svelte").Component<SwitchProps, {}, "el" | "checked">;
20
9
  type Switch = ReturnType<typeof Switch>;
21
10
  export default Switch;
@@ -1 +1 @@
1
- export { default as Textarea, TEXTAREA_COLORS, TEXTAREA_RADII, TEXTAREA_SIZES, TEXTAREA_VARIANTS, type TextareaColor, type TextareaColorProp, type TextareaProps, type TextareaRadius, type TextareaRadiusProp, type TextareaSize, type TextareaSizeProp, type TextareaVariant, type TextareaVariantProp, } from "./textarea.svelte";
1
+ export { default as Textarea, type TextareaProps } from "./textarea.svelte";
@@ -1 +1 @@
1
- export { default as Textarea, TEXTAREA_COLORS, TEXTAREA_RADII, TEXTAREA_SIZES, TEXTAREA_VARIANTS, } from "./textarea.svelte";
1
+ export { default as Textarea } from "./textarea.svelte";