@x33025/sveltely 0.0.58 → 0.1.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 (188) hide show
  1. package/dist/actions/tooltip.d.ts +10 -0
  2. package/dist/actions/tooltip.js +255 -0
  3. package/dist/components/{AnimatedNumber.demo.svelte → Library/AnimatedNumber/AnimatedNumber.demo.svelte} +6 -10
  4. package/dist/components/{AnimatedNumber.demo.svelte.d.ts → Library/AnimatedNumber/AnimatedNumber.demo.svelte.d.ts} +0 -1
  5. package/dist/components/Library/AnimatedNumber/AnimatedNumber.svelte +29 -0
  6. package/dist/components/Library/AnimatedNumber/AnimatedNumber.svelte.d.ts +9 -0
  7. package/dist/components/Library/AnimatedNumber/index.d.ts +1 -0
  8. package/dist/components/Library/AnimatedNumber/index.js +1 -0
  9. package/dist/components/{AsyncButton.demo.svelte → Library/AsyncButton/AsyncButton.demo.svelte} +0 -1
  10. package/dist/components/Library/AsyncButton/AsyncButton.svelte +178 -0
  11. package/dist/components/{AsyncButton.svelte.d.ts → Library/AsyncButton/AsyncButton.svelte.d.ts} +7 -2
  12. package/dist/components/Library/AsyncButton/index.d.ts +1 -0
  13. package/dist/components/Library/AsyncButton/index.js +1 -0
  14. package/dist/components/Library/Button/Button.demo.svelte +17 -0
  15. package/dist/components/Library/Button/Button.demo.svelte.d.ts +23 -0
  16. package/dist/components/Library/Button/Button.svelte +134 -0
  17. package/dist/components/Library/Button/Button.svelte.d.ts +17 -0
  18. package/dist/components/Library/Button/index.d.ts +1 -0
  19. package/dist/components/Library/Button/index.js +1 -0
  20. package/dist/components/Library/Calendar/Calendar.demo.svelte +30 -0
  21. package/dist/components/Library/Calendar/Calendar.demo.svelte.d.ts +10 -0
  22. package/dist/components/Library/Calendar/Calendar.svelte +310 -0
  23. package/dist/components/Library/Calendar/Calendar.svelte.d.ts +10 -0
  24. package/dist/components/Library/Calendar/index.d.ts +1 -0
  25. package/dist/components/Library/Calendar/index.js +1 -0
  26. package/dist/components/Library/Checkbox/Checkbox.demo.svelte +20 -0
  27. package/dist/components/Library/Checkbox/Checkbox.demo.svelte.d.ts +8 -0
  28. package/dist/components/Library/Checkbox/Checkbox.svelte +134 -0
  29. package/dist/components/Library/Checkbox/Checkbox.svelte.d.ts +11 -0
  30. package/dist/components/Library/Checkbox/index.d.ts +1 -0
  31. package/dist/components/Library/Checkbox/index.js +1 -0
  32. package/dist/components/{ChipInput.demo.svelte → Library/ChipInput/ChipInput.demo.svelte} +1 -2
  33. package/dist/components/{ChipInput.demo.svelte.d.ts → Library/ChipInput/ChipInput.demo.svelte.d.ts} +0 -1
  34. package/dist/components/{ChipInput.svelte → Library/ChipInput/ChipInput.svelte} +77 -3
  35. package/dist/components/{ChipInput.svelte.d.ts → Library/ChipInput/ChipInput.svelte.d.ts} +2 -1
  36. package/dist/components/Library/ChipInput/index.d.ts +1 -0
  37. package/dist/components/Library/ChipInput/index.js +1 -0
  38. package/dist/components/Library/Dropdown/Dropdown.demo.svelte +54 -0
  39. package/dist/components/Library/Dropdown/Dropdown.demo.svelte.d.ts +8 -0
  40. package/dist/components/Library/Dropdown/Dropdown.svelte +346 -0
  41. package/dist/components/Library/Dropdown/Dropdown.svelte.d.ts +40 -0
  42. package/dist/components/Library/Dropdown/index.d.ts +2 -0
  43. package/dist/components/Library/Dropdown/index.js +1 -0
  44. package/dist/components/Library/Dropdown/types.d.ts +27 -0
  45. package/dist/components/Library/Dropdown/types.js +1 -0
  46. package/dist/components/{Popover/Popover.svelte → Library/Floating/Floating.svelte} +155 -101
  47. package/dist/components/Library/Floating/Floating.svelte.d.ts +30 -0
  48. package/dist/components/Library/Floating/registry.svelte.d.ts +6 -0
  49. package/dist/components/{Popover → Library/Floating}/registry.svelte.js +2 -23
  50. package/dist/components/{GlowEffect.svelte → Library/GlowEffect/GlowEffect.svelte} +15 -6
  51. package/dist/components/{GlowEffect.svelte.d.ts → Library/GlowEffect/GlowEffect.svelte.d.ts} +3 -2
  52. package/dist/components/Library/GlowEffect/index.d.ts +1 -0
  53. package/dist/components/Library/GlowEffect/index.js +1 -0
  54. package/dist/components/Library/NavigationStack/NavigationStack.svelte +242 -0
  55. package/dist/components/Library/NavigationStack/NavigationStack.svelte.d.ts +15 -0
  56. package/dist/components/Library/NavigationStack/SidebarToggle.svelte +52 -0
  57. package/dist/components/Library/NavigationStack/SidebarToggle.svelte.d.ts +10 -0
  58. package/dist/components/Library/NavigationStack/Toolbar.svelte +59 -0
  59. package/dist/components/Library/NavigationStack/Toolbar.svelte.d.ts +11 -0
  60. package/dist/components/{Pagination.demo.svelte → Library/Pagination/Pagination.demo.svelte} +0 -1
  61. package/dist/components/{Pagination.demo.svelte.d.ts → Library/Pagination/Pagination.demo.svelte.d.ts} +0 -1
  62. package/dist/components/Library/Pagination/Pagination.svelte +227 -0
  63. package/dist/components/{Pagination.svelte.d.ts → Library/Pagination/Pagination.svelte.d.ts} +3 -3
  64. package/dist/components/Library/Pagination/index.d.ts +1 -0
  65. package/dist/components/Library/Pagination/index.js +1 -0
  66. package/dist/components/Library/Popover/Popover.demo.svelte +21 -0
  67. package/dist/components/Library/Popover/Popover.svelte +92 -0
  68. package/dist/components/Library/Popover/Popover.svelte.d.ts +14 -0
  69. package/dist/components/{Popover → Library/Popover}/PopoverDebugOverlay.svelte +1 -1
  70. package/dist/components/Library/Popover/index.d.ts +1 -0
  71. package/dist/components/Library/Popover/index.js +1 -0
  72. package/dist/components/Library/ScrollView/ScrollView.svelte +89 -0
  73. package/dist/components/Library/ScrollView/ScrollView.svelte.d.ts +12 -0
  74. package/dist/components/Library/ScrollView/index.d.ts +1 -0
  75. package/dist/components/Library/ScrollView/index.js +1 -0
  76. package/dist/components/{SearchInput.demo.svelte → Library/SearchInput/SearchInput.demo.svelte} +2 -3
  77. package/dist/components/{SearchInput.demo.svelte.d.ts → Library/SearchInput/SearchInput.demo.svelte.d.ts} +0 -1
  78. package/dist/components/Library/SearchInput/SearchInput.svelte +88 -0
  79. package/dist/components/{SearchInput.svelte.d.ts → Library/SearchInput/SearchInput.svelte.d.ts} +3 -3
  80. package/dist/components/Library/SearchInput/index.d.ts +1 -0
  81. package/dist/components/Library/SearchInput/index.js +1 -0
  82. package/dist/components/{SegmentedPicker.demo.svelte → Library/SegmentedPicker/SegmentedPicker.demo.svelte} +1 -2
  83. package/dist/components/{SegmentedPicker.demo.svelte.d.ts → Library/SegmentedPicker/SegmentedPicker.demo.svelte.d.ts} +0 -1
  84. package/dist/components/Library/SegmentedPicker/SegmentedPicker.svelte +106 -0
  85. package/dist/components/{SegmentedPicker.svelte.d.ts → Library/SegmentedPicker/SegmentedPicker.svelte.d.ts} +2 -2
  86. package/dist/components/Library/SegmentedPicker/index.d.ts +1 -0
  87. package/dist/components/Library/SegmentedPicker/index.js +1 -0
  88. package/dist/components/{Sheet → Library/Sheet}/Sheet.demo.svelte +4 -17
  89. package/dist/components/Library/Sheet/Sheet.demo.svelte.d.ts +23 -0
  90. package/dist/components/Library/Sheet/Sheet.svelte +113 -0
  91. package/dist/components/{Sheet → Library/Sheet}/Sheet.svelte.d.ts +4 -2
  92. package/dist/components/{Slider.demo.svelte → Library/Slider/Slider.demo.svelte} +2 -3
  93. package/dist/components/{Slider.demo.svelte.d.ts → Library/Slider/Slider.demo.svelte.d.ts} +0 -1
  94. package/dist/components/Library/Slider/Slider.svelte +122 -0
  95. package/dist/components/{Slider.svelte.d.ts → Library/Slider/Slider.svelte.d.ts} +2 -3
  96. package/dist/components/Library/Slider/index.d.ts +1 -0
  97. package/dist/components/Library/Slider/index.js +1 -0
  98. package/dist/components/{Spinner.demo.svelte → Library/Spinner/Spinner.demo.svelte} +3 -1
  99. package/dist/components/Library/Spinner/Spinner.svelte +32 -0
  100. package/dist/components/{Spinner.svelte.d.ts → Library/Spinner/Spinner.svelte.d.ts} +3 -2
  101. package/dist/components/Library/Spinner/index.d.ts +1 -0
  102. package/dist/components/Library/Spinner/index.js +1 -0
  103. package/dist/components/Library/Switch/Switch.demo.svelte +20 -0
  104. package/dist/components/Library/Switch/Switch.demo.svelte.d.ts +8 -0
  105. package/dist/components/Library/Switch/Switch.svelte +168 -0
  106. package/dist/components/Library/Switch/Switch.svelte.d.ts +11 -0
  107. package/dist/components/Library/Switch/index.d.ts +1 -0
  108. package/dist/components/Library/Switch/index.js +1 -0
  109. package/dist/components/Library/TextShimmer/TextShimmer.demo.svelte +14 -0
  110. package/dist/components/Library/TextShimmer/TextShimmer.demo.svelte.d.ts +23 -0
  111. package/dist/components/Library/TextShimmer/TextShimmer.svelte +88 -0
  112. package/dist/components/Library/TextShimmer/TextShimmer.svelte.d.ts +11 -0
  113. package/dist/components/Library/TextShimmer/index.d.ts +1 -0
  114. package/dist/components/Library/TextShimmer/index.js +1 -0
  115. package/dist/components/Library/TimePicker/TimePicker.demo.svelte +18 -0
  116. package/dist/components/Library/TimePicker/TimePicker.demo.svelte.d.ts +10 -0
  117. package/dist/components/Library/TimePicker/TimePicker.svelte +143 -0
  118. package/dist/components/Library/TimePicker/TimePicker.svelte.d.ts +13 -0
  119. package/dist/components/Library/TimePicker/index.d.ts +2 -0
  120. package/dist/components/Library/TimePicker/index.js +1 -0
  121. package/dist/components/{TokenSearchInput.demo.svelte → Library/TokenSearchInput/TokenSearchInput.demo.svelte} +1 -2
  122. package/dist/components/{TokenSearchInput.demo.svelte.d.ts → Library/TokenSearchInput/TokenSearchInput.demo.svelte.d.ts} +0 -1
  123. package/dist/components/Library/TokenSearchInput/TokenSearchInput.svelte +230 -0
  124. package/dist/components/{TokenSearchInput.svelte.d.ts → Library/TokenSearchInput/TokenSearchInput.svelte.d.ts} +2 -3
  125. package/dist/components/Library/TokenSearchInput/index.d.ts +1 -0
  126. package/dist/components/Library/TokenSearchInput/index.js +1 -0
  127. package/dist/components/Library/Tooltip/Tooltip.demo.svelte +14 -0
  128. package/dist/components/{Tooltip.demo.svelte.d.ts → Library/Tooltip/Tooltip.demo.svelte.d.ts} +0 -1
  129. package/dist/components/Library/Tooltip/index.d.ts +2 -0
  130. package/dist/components/Library/Tooltip/index.js +1 -0
  131. package/dist/components/Library/WheelPicker/WheelColumn.svelte +302 -0
  132. package/dist/components/Library/WheelPicker/WheelColumn.svelte.d.ts +29 -0
  133. package/dist/components/Library/WheelPicker/WheelPicker.svelte +114 -0
  134. package/dist/components/Library/WheelPicker/WheelPicker.svelte.d.ts +9 -0
  135. package/dist/components/Library/WheelPicker/index.d.ts +2 -0
  136. package/dist/components/Library/WheelPicker/index.js +1 -0
  137. package/dist/components/Library/WheelPicker/types.d.ts +10 -0
  138. package/dist/components/Library/WheelPicker/types.js +1 -0
  139. package/dist/components/Local/ComponentGrid.svelte +7 -6
  140. package/dist/components/Local/ComponentGrid.svelte.d.ts +1 -1
  141. package/dist/components/Local/HeroCard.svelte +18 -8
  142. package/dist/components/Local/HeroCard.svelte.d.ts +1 -1
  143. package/dist/components/Local/StyleControls.svelte +119 -0
  144. package/dist/components/Local/StyleControls.svelte.d.ts +15 -0
  145. package/dist/index.d.ts +24 -15
  146. package/dist/index.js +23 -15
  147. package/dist/style/index.css +61 -325
  148. package/dist/style/surface.d.ts +17 -0
  149. package/dist/style/surface.js +54 -0
  150. package/dist/style.css +86 -601
  151. package/dist/utils/positioning.d.ts +3 -2
  152. package/dist/utils/positioning.js +9 -5
  153. package/package.json +1 -1
  154. package/dist/components/AnimatedNumber.svelte +0 -18
  155. package/dist/components/AnimatedNumber.svelte.d.ts +0 -8
  156. package/dist/components/AsyncButton.svelte +0 -93
  157. package/dist/components/NavigationStack/NavigationStack.svelte +0 -76
  158. package/dist/components/NavigationStack/NavigationStack.svelte.d.ts +0 -10
  159. package/dist/components/NavigationStack/SidebarToggle.svelte +0 -36
  160. package/dist/components/NavigationStack/SidebarToggle.svelte.d.ts +0 -9
  161. package/dist/components/NavigationStack/Toolbar.svelte +0 -25
  162. package/dist/components/NavigationStack/Toolbar.svelte.d.ts +0 -9
  163. package/dist/components/Pagination.svelte +0 -144
  164. package/dist/components/Popover/Popover.demo.svelte +0 -35
  165. package/dist/components/Popover/Popover.svelte.d.ts +0 -13
  166. package/dist/components/Popover/index.d.ts +0 -2
  167. package/dist/components/Popover/index.js +0 -2
  168. package/dist/components/Popover/registry.svelte.d.ts +0 -18
  169. package/dist/components/SearchInput.svelte +0 -39
  170. package/dist/components/SegmentedPicker.svelte +0 -51
  171. package/dist/components/Sheet/Sheet.demo.svelte.d.ts +0 -8
  172. package/dist/components/Sheet/Sheet.svelte +0 -60
  173. package/dist/components/Slider.svelte +0 -47
  174. package/dist/components/Spinner.svelte +0 -7
  175. package/dist/components/TextShimmer.svelte +0 -60
  176. package/dist/components/TextShimmer.svelte.d.ts +0 -10
  177. package/dist/components/TokenSearchInput.svelte +0 -124
  178. package/dist/components/Tooltip.demo.svelte +0 -16
  179. package/dist/components/Tooltip.svelte +0 -79
  180. package/dist/components/Tooltip.svelte.d.ts +0 -12
  181. /package/dist/components/{AsyncButton.demo.svelte.d.ts → Library/AsyncButton/AsyncButton.demo.svelte.d.ts} +0 -0
  182. /package/dist/components/{NavigationStack → Library/NavigationStack}/index.d.ts +0 -0
  183. /package/dist/components/{NavigationStack → Library/NavigationStack}/index.js +0 -0
  184. /package/dist/components/{Popover → Library/Popover}/Popover.demo.svelte.d.ts +0 -0
  185. /package/dist/components/{Popover → Library/Popover}/PopoverDebugOverlay.svelte.d.ts +0 -0
  186. /package/dist/components/{Sheet → Library/Sheet}/index.d.ts +0 -0
  187. /package/dist/components/{Sheet → Library/Sheet}/index.js +0 -0
  188. /package/dist/components/{Spinner.demo.svelte.d.ts → Library/Spinner/Spinner.demo.svelte.d.ts} +0 -0
@@ -0,0 +1,88 @@
1
+ <script lang="ts">
2
+ import { extractStyleProps, surfaceStyle, type StyleProps } from '../../../style/surface';
3
+
4
+ interface Props {
5
+ text: string;
6
+ as?: keyof HTMLElementTagNameMap;
7
+ duration?: number;
8
+ spread?: number;
9
+ }
10
+
11
+ let {
12
+ text,
13
+ as = 'span',
14
+ duration = 2,
15
+ spread = 2,
16
+ ...restProps
17
+ }: Props & StyleProps & Record<string, unknown> = $props();
18
+
19
+ let dynamicSpread = $derived(text.length * spread);
20
+ const extractedStyleProps = $derived.by(() => extractStyleProps(restProps));
21
+ const styleProps = $derived(extractedStyleProps.styleProps);
22
+ const props = $derived(extractedStyleProps.restProps);
23
+ const shimmerStyle = $derived.by(() => {
24
+ const declarations = [
25
+ `--spread: ${dynamicSpread}px;`,
26
+ `animation-duration: ${duration}s;`,
27
+ 'background-image: var(--bg), linear-gradient(var(--base-color), var(--base-color));'
28
+ ];
29
+ const stylePropDeclarations = surfaceStyle(styleProps, 'text-shimmer');
30
+
31
+ if (stylePropDeclarations) {
32
+ declarations.push(stylePropDeclarations);
33
+ }
34
+
35
+ return declarations.join(' ');
36
+ });
37
+ </script>
38
+
39
+ <svelte:element
40
+ this={as}
41
+ class="text-shimmer"
42
+ style={shimmerStyle}
43
+ {...props}
44
+ >
45
+ {text}
46
+ </svelte:element>
47
+
48
+ <style>
49
+ @keyframes shimmer {
50
+ 0% {
51
+ background-position: 100% center;
52
+ }
53
+ 100% {
54
+ background-position: 0% center;
55
+ }
56
+ }
57
+
58
+ :global(.text-shimmer) {
59
+ --text-shimmer-font-size: var(--sveltely-font-size);
60
+ position: relative;
61
+ display: inline-block;
62
+ width: max-content;
63
+ max-width: 100%;
64
+ font-size: var(--text-shimmer-font-size);
65
+ line-height: 1.1;
66
+ background-size:
67
+ 250% 100%,
68
+ auto;
69
+ background-clip: text;
70
+ -webkit-background-clip: text;
71
+ color: transparent;
72
+ --base-color: #a1a1aa;
73
+ --base-gradient-color: #000;
74
+ background-repeat: no-repeat, padding-box;
75
+ --bg: linear-gradient(
76
+ 90deg,
77
+ #0000 calc(50% - var(--spread)),
78
+ var(--base-gradient-color),
79
+ #0000 calc(50% + var(--spread))
80
+ );
81
+ animation: shimmer linear infinite;
82
+ }
83
+
84
+ :global(.dark .text-shimmer) {
85
+ --base-color: #71717a;
86
+ --base-gradient-color: #ffffff;
87
+ }
88
+ </style>
@@ -0,0 +1,11 @@
1
+ import { type StyleProps } from '../../../style/surface';
2
+ interface Props {
3
+ text: string;
4
+ as?: keyof HTMLElementTagNameMap;
5
+ duration?: number;
6
+ spread?: number;
7
+ }
8
+ type $$ComponentProps = Props & StyleProps & Record<string, unknown>;
9
+ declare const TextShimmer: import("svelte").Component<$$ComponentProps, {}, "">;
10
+ type TextShimmer = ReturnType<typeof TextShimmer>;
11
+ export default TextShimmer;
@@ -0,0 +1 @@
1
+ export { default } from './TextShimmer.svelte';
@@ -0,0 +1 @@
1
+ export { default } from './TextShimmer.svelte';
@@ -0,0 +1,18 @@
1
+ <script module lang="ts">
2
+ export const demo = {
3
+ name: 'TimePicker',
4
+ description: 'Wheel-based time picker with hour, minute, and period columns.',
5
+ columnSpan: 1,
6
+ rowSpan: 2
7
+ };
8
+ </script>
9
+
10
+ <script lang="ts">
11
+ import TimePicker from './TimePicker.svelte';
12
+
13
+ let value = $state<Date | null>(new Date());
14
+ </script>
15
+
16
+ <div class="vstack gap-4">
17
+ <TimePicker bind:value />
18
+ </div>
@@ -0,0 +1,10 @@
1
+ export declare const demo: {
2
+ name: string;
3
+ description: string;
4
+ columnSpan: number;
5
+ rowSpan: number;
6
+ };
7
+ import TimePicker from './TimePicker.svelte';
8
+ declare const TimePicker: import("svelte").Component<Record<string, never>, {}, "">;
9
+ type TimePicker = ReturnType<typeof TimePicker>;
10
+ export default TimePicker;
@@ -0,0 +1,143 @@
1
+ <script lang="ts">
2
+ import WheelPicker from '../WheelPicker';
3
+ import type { WheelColumn, WheelOption } from '../WheelPicker';
4
+ import { extractStyleProps, surfaceStyle, type StyleProps } from '../../../style/surface';
5
+
6
+ export type TimeMeridiem = 'AM' | 'PM';
7
+
8
+ type Props = {
9
+ value?: Date | null;
10
+ minuteStep?: number;
11
+ height?: number | string;
12
+ hourLabel?: string;
13
+ minuteLabel?: string;
14
+ periodLabel?: string;
15
+ } & StyleProps & Record<string, unknown>;
16
+
17
+ const meridiemOptions: TimeMeridiem[] = ['AM', 'PM'];
18
+
19
+ const clampMinuteStep = (value: number) => {
20
+ const normalized = Math.max(1, Math.floor(value));
21
+ return normalized > 60 ? 60 : normalized;
22
+ };
23
+
24
+ const hourOptions: WheelOption<number>[] = Array.from({ length: 12 }, (_, index) => ({
25
+ value: index + 1,
26
+ label: String(index + 1).padStart(2, '0')
27
+ }));
28
+ const periodOptions: WheelOption<TimeMeridiem>[] = meridiemOptions.map((value) => ({
29
+ value,
30
+ label: value
31
+ }));
32
+ const getHour12 = (value: Date) => {
33
+ const hour = value.getHours() % 12;
34
+ return hour === 0 ? 12 : hour;
35
+ };
36
+
37
+ const getMeridiem = (value: Date): TimeMeridiem => (value.getHours() >= 12 ? 'PM' : 'AM');
38
+
39
+ const to24Hour = (hour12: number, meridiem: TimeMeridiem) => {
40
+ if (meridiem === 'AM') {
41
+ return hour12 === 12 ? 0 : hour12;
42
+ }
43
+ return hour12 === 12 ? 12 : hour12 + 12;
44
+ };
45
+
46
+ const toCssLength = (value: number | string | undefined) =>
47
+ value === undefined ? undefined : typeof value === 'number' ? `${value}px` : value;
48
+
49
+ let {
50
+ value = $bindable<Date | null>(new Date()),
51
+ minuteStep = 1,
52
+ height,
53
+ hourLabel = 'Hour',
54
+ minuteLabel = 'Minute',
55
+ periodLabel = 'Period',
56
+ ...restProps
57
+ }: Props = $props();
58
+
59
+ const extractedStyleProps = $derived.by(() => extractStyleProps(restProps));
60
+ const styleProps = $derived(extractedStyleProps.styleProps);
61
+ const props = $derived(extractedStyleProps.restProps);
62
+ const rootStyle = $derived.by(() => surfaceStyle(styleProps, 'time-picker'));
63
+ const resolvedMinuteStep = $derived(clampMinuteStep(minuteStep));
64
+ const minuteOptions = $derived.by<WheelOption<number>[]>(() =>
65
+ Array.from({ length: Math.ceil(60 / resolvedMinuteStep) }, (_, index) => {
66
+ const nextValue = Math.min(index * resolvedMinuteStep, 59);
67
+ return {
68
+ value: nextValue,
69
+ label: String(nextValue).padStart(2, '0')
70
+ };
71
+ })
72
+ );
73
+ const activeDateTime = $derived(value ?? new Date());
74
+ const selectedHour = $derived(getHour12(activeDateTime));
75
+ const selectedMinute = $derived.by(() => {
76
+ const currentMinute = activeDateTime.getMinutes();
77
+ const match = minuteOptions.find((option) => option.value === currentMinute);
78
+ return match ? match.value : minuteOptions[0]?.value ?? 0;
79
+ });
80
+ const selectedMeridiem = $derived(getMeridiem(activeDateTime));
81
+ const pickerStyle = $derived.by(() => {
82
+ const resolvedHeight = toCssLength(height);
83
+ if (!resolvedHeight) return rootStyle;
84
+ const heightStyle = `--time-picker-height: ${resolvedHeight};`;
85
+ return rootStyle ? `${rootStyle} ${heightStyle}` : heightStyle;
86
+ });
87
+
88
+ const updateTime = (hour12: number, minute: number, meridiem: TimeMeridiem) => {
89
+ const base = activeDateTime;
90
+ value = new Date(
91
+ base.getFullYear(),
92
+ base.getMonth(),
93
+ base.getDate(),
94
+ to24Hour(hour12, meridiem),
95
+ minute,
96
+ 0,
97
+ 0
98
+ );
99
+ };
100
+ const columns = $derived.by<WheelColumn[]>(() => [
101
+ {
102
+ label: hourLabel,
103
+ value: selectedHour,
104
+ options: hourOptions,
105
+ onChange: (hour) => updateTime(hour as number, selectedMinute, selectedMeridiem)
106
+ },
107
+ {
108
+ label: minuteLabel,
109
+ value: selectedMinute,
110
+ options: minuteOptions,
111
+ onChange: (minute) => updateTime(selectedHour, minute as number, selectedMeridiem)
112
+ },
113
+ {
114
+ label: periodLabel,
115
+ value: selectedMeridiem,
116
+ options: periodOptions,
117
+ onChange: (meridiem) =>
118
+ updateTime(selectedHour, selectedMinute, meridiem as TimeMeridiem)
119
+ }
120
+ ]);
121
+
122
+ </script>
123
+
124
+ <div class="time-picker" style={pickerStyle} {...props}>
125
+ <WheelPicker columns={columns} height="100%" />
126
+ </div>
127
+
128
+ <style>
129
+ :global(.time-picker) {
130
+ --wheel-picker-font-size: var(--sveltely-font-size);
131
+ --wheel-picker-scale: calc(var(--wheel-picker-font-size) / 1rem);
132
+ --wheel-picker-option-height: calc(
133
+ (calc(var(--wheel-picker-font-size) * 0.875) * 1.2) +
134
+ (calc(var(--sveltely-padding-y) * 0.67 * var(--wheel-picker-scale)) * 2) + 2px
135
+ );
136
+ height: var(--time-picker-height, calc(var(--wheel-picker-option-height) * 10));
137
+ }
138
+
139
+ :global(.time-picker .wheel-picker-label-column:last-child),
140
+ :global(.time-picker .wheel-picker-column:last-child) {
141
+ --wheel-picker-column-flex: 0.85;
142
+ }
143
+ </style>
@@ -0,0 +1,13 @@
1
+ import { type StyleProps } from '../../../style/surface';
2
+ export type TimeMeridiem = 'AM' | 'PM';
3
+ type Props = {
4
+ value?: Date | null;
5
+ minuteStep?: number;
6
+ height?: number | string;
7
+ hourLabel?: string;
8
+ minuteLabel?: string;
9
+ periodLabel?: string;
10
+ } & StyleProps & Record<string, unknown>;
11
+ declare const TimePicker: import("svelte").Component<Props, {}, "value">;
12
+ type TimePicker = ReturnType<typeof TimePicker>;
13
+ export default TimePicker;
@@ -0,0 +1,2 @@
1
+ export { default } from './TimePicker.svelte';
2
+ export type { TimeMeridiem } from './TimePicker.svelte';
@@ -0,0 +1 @@
1
+ export { default } from './TimePicker.svelte';
@@ -2,7 +2,6 @@
2
2
  export const demo = {
3
3
  name: 'TokenSearchInput',
4
4
  description: 'Search field that turns comma-separated entries into removable tokens.',
5
- isProminent: false,
6
5
  columnSpan: 2
7
6
  };
8
7
  </script>
@@ -15,6 +14,6 @@
15
14
  </script>
16
15
 
17
16
  <div class="vstack w-full max-w-md gap-2">
18
- <TokenSearchInput bind:tokens bind:value placeholder="Search keywords" class="w-full" />
17
+ <TokenSearchInput bind:tokens bind:value placeholder="Search keywords" />
19
18
  <p class="text-xs text-zinc-500">Tokens: {tokens.join(', ') || 'empty'}</p>
20
19
  </div>
@@ -1,7 +1,6 @@
1
1
  export declare const demo: {
2
2
  name: string;
3
3
  description: string;
4
- isProminent: boolean;
5
4
  columnSpan: number;
6
5
  };
7
6
  import TokenSearchInput from './TokenSearchInput.svelte';
@@ -0,0 +1,230 @@
1
+ <script lang="ts">
2
+ import { SearchIcon, X } from '@lucide/svelte';
3
+ import type { HTMLInputAttributes } from 'svelte/elements';
4
+ import { extractStyleProps, surfaceStyle, type StyleProps } from '../../../style/surface';
5
+
6
+ type Props = {
7
+ tokens?: string[];
8
+ value?: string;
9
+ confirmText?: string | null;
10
+ placeholder?: string;
11
+ tokenPlaceholder?: string;
12
+ normalizeToken?: (value: string) => string;
13
+ showIcon?: boolean;
14
+ } & StyleProps & Omit<HTMLInputAttributes, 'children' | 'type' | 'value' | 'placeholder' | 'class' | 'style'>;
15
+
16
+ const defaultNormalizeToken = (value: string) => value.trim().replace(/\s+/g, ' ');
17
+
18
+ let {
19
+ tokens = $bindable<string[]>([]),
20
+ value = $bindable(''),
21
+ confirmText = null,
22
+ placeholder = 'Search',
23
+ tokenPlaceholder = 'Add search token',
24
+ normalizeToken = defaultNormalizeToken,
25
+ showIcon = false,
26
+ disabled = false,
27
+ ...restProps
28
+ }: Props = $props();
29
+
30
+ const extractedStyleProps = $derived.by(() => extractStyleProps(restProps));
31
+ const styleProps = $derived(extractedStyleProps.styleProps);
32
+ const props = $derived(extractedStyleProps.restProps);
33
+ const rootStyle = $derived.by(() => surfaceStyle(styleProps, 'token-search-input'));
34
+
35
+ const addToken = (rawValue: string) => {
36
+ const token = normalizeToken(rawValue);
37
+ if (!token || tokens.includes(token)) return;
38
+ tokens = [...tokens, token];
39
+ };
40
+
41
+ const commitValue = () => {
42
+ addToken(value);
43
+ value = '';
44
+ };
45
+
46
+ const removeToken = (index: number) => {
47
+ if (index < 0 || index >= tokens.length) return;
48
+ tokens = tokens.filter((_, currentIndex) => currentIndex !== index);
49
+ };
50
+
51
+ const onKeydown = (event: KeyboardEvent) => {
52
+ if (event.key === 'Enter' || event.key === ',') {
53
+ event.preventDefault();
54
+ commitValue();
55
+ return;
56
+ }
57
+
58
+ if (event.key === 'Backspace' && value.length === 0 && tokens.length > 0) {
59
+ event.preventDefault();
60
+ tokens = tokens.slice(0, -1);
61
+ }
62
+ };
63
+
64
+ const onPaste = (event: ClipboardEvent) => {
65
+ const pasted = event.clipboardData?.getData('text') ?? '';
66
+ if (!pasted.includes(',')) return;
67
+
68
+ event.preventDefault();
69
+
70
+ const nextTokens = [...tokens];
71
+ const seen = new Set(nextTokens);
72
+ for (const part of pasted.split(',')) {
73
+ const token = normalizeToken(part);
74
+ if (!token || seen.has(token)) continue;
75
+ nextTokens.push(token);
76
+ seen.add(token);
77
+ }
78
+
79
+ tokens = nextTokens;
80
+ value = '';
81
+ };
82
+ </script>
83
+
84
+ <div
85
+ class="token-search-input hstack w-full flex-nowrap items-center overflow-x-auto overflow-y-hidden whitespace-nowrap"
86
+ class:token-search-input-has-tokens={tokens.length > 0}
87
+ style={rootStyle}
88
+ data-disabled={disabled ? 'true' : 'false'}
89
+ >
90
+ {#if showIcon}
91
+ <span class="token-search-input-icon" aria-hidden="true">
92
+ <SearchIcon class="token-search-input-search-icon" />
93
+ </span>
94
+ {/if}
95
+
96
+ {#each tokens as token, index (`${token}-${index}`)}
97
+ <button
98
+ type="button"
99
+ class="token-search-input-token"
100
+ onclick={() => removeToken(index)}
101
+ aria-label={`Remove search token ${token}`}
102
+ {disabled}
103
+ >
104
+ <span>{token}</span>
105
+ <X class="token-search-input-remove-icon" aria-hidden="true" />
106
+ </button>
107
+ {/each}
108
+
109
+ <input
110
+ type="search"
111
+ bind:value
112
+ {disabled}
113
+ placeholder={tokens.length === 0 ? placeholder : tokenPlaceholder}
114
+ class="token-search-input-field"
115
+ onkeydown={onKeydown}
116
+ onpaste={onPaste}
117
+ onblur={commitValue}
118
+ {...props}
119
+ />
120
+
121
+ {#if confirmText}
122
+ <span class="token-search-input-confirm">
123
+ {confirmText}
124
+ </span>
125
+ {/if}
126
+ </div>
127
+
128
+ <style>
129
+ .token-search-input {
130
+ --token-search-input-inset: var(--sveltely-inset);
131
+ --token-search-input-font-size: calc(var(--sveltely-font-size) * 0.875);
132
+ --token-search-input-scale: calc(var(--token-search-input-font-size) / 0.875rem);
133
+ --token-search-input-line-height: calc(var(--token-search-input-font-size) * 1.429);
134
+ --token-search-input-search-icon-size: calc(var(--token-search-input-font-size) * 1.143);
135
+ --token-search-input-remove-icon-size: calc(var(--token-search-input-font-size) * 0.857);
136
+ --token-search-input-confirm-font-size: calc(var(--token-search-input-font-size) * 0.857);
137
+ --sveltely-nested-inset: var(--token-search-input-inset);
138
+ min-width: 0;
139
+ border: 1px solid var(--sveltely-border-color);
140
+ border-radius: var(--sveltely-border-radius);
141
+ color: var(--color-zinc-900);
142
+ gap: var(--token-search-input-inset);
143
+ padding:
144
+ calc(var(--sveltely-padding-y) * 0.58 * var(--token-search-input-scale))
145
+ calc(var(--sveltely-padding-x) * var(--token-search-input-scale));
146
+ font-size: var(--token-search-input-font-size);
147
+ line-height: var(--token-search-input-line-height);
148
+ outline: none;
149
+ transition: color 150ms, border-color 150ms, background-color 150ms, box-shadow 150ms;
150
+ }
151
+
152
+ .token-search-input:focus-within {
153
+ border-color: color-mix(in oklab, var(--sveltely-primary-color) 50%, white);
154
+ }
155
+
156
+ .token-search-input-has-tokens {
157
+ padding: var(--token-search-input-inset);
158
+ }
159
+
160
+ .token-search-input[data-disabled='true'] {
161
+ cursor: not-allowed;
162
+ opacity: 0.6;
163
+ }
164
+
165
+ .token-search-input-icon {
166
+ flex-shrink: 0;
167
+ color: var(--color-zinc-500);
168
+ }
169
+
170
+ :global(.token-search-input-search-icon) {
171
+ width: var(--token-search-input-search-icon-size);
172
+ height: var(--token-search-input-search-icon-size);
173
+ }
174
+
175
+ .token-search-input-field {
176
+ field-sizing: content;
177
+ min-width: 0;
178
+ flex: 1 1 auto;
179
+ background: transparent;
180
+ outline: none;
181
+ }
182
+
183
+ .token-search-input-field::-webkit-search-cancel-button {
184
+ appearance: none;
185
+ }
186
+
187
+ .token-search-input-token {
188
+ display: inline-flex;
189
+ flex-shrink: 0;
190
+ align-items: center;
191
+ border: 1px solid var(--sveltely-border-color);
192
+ border-radius: var(--sveltely-border-radius-nested);
193
+ background: var(--color-zinc-100);
194
+ color: var(--color-zinc-700);
195
+ font-size: inherit;
196
+ line-height: inherit;
197
+ gap: calc(var(--sveltely-padding-x) * 0.66 * var(--token-search-input-scale));
198
+ padding:
199
+ calc(var(--sveltely-padding-y) * 0.17 * var(--token-search-input-scale))
200
+ calc(var(--sveltely-padding-y) * 0.33 * var(--token-search-input-scale))
201
+ calc(var(--sveltely-padding-y) * 0.17 * var(--token-search-input-scale))
202
+ calc(var(--sveltely-padding-x) * 0.66 * var(--token-search-input-scale));
203
+ transition: color 150ms, border-color 150ms, background-color 150ms;
204
+ }
205
+
206
+ :global(.token-search-input-remove-icon) {
207
+ width: var(--token-search-input-remove-icon-size);
208
+ height: var(--token-search-input-remove-icon-size);
209
+ }
210
+
211
+ .token-search-input-token:hover:not(:disabled) {
212
+ border-color: var(--color-zinc-300);
213
+ background: var(--sveltely-hover-color);
214
+ }
215
+
216
+ .token-search-input-token:disabled {
217
+ cursor: not-allowed;
218
+ opacity: 0.6;
219
+ }
220
+
221
+ .token-search-input-confirm {
222
+ flex-shrink: 0;
223
+ color: var(--color-zinc-500);
224
+ font-size: var(--token-search-input-confirm-font-size);
225
+ font-weight: 500;
226
+ line-height: calc(var(--token-search-input-confirm-font-size) * 1.333);
227
+ letter-spacing: 0.18em;
228
+ text-transform: uppercase;
229
+ }
230
+ </style>
@@ -1,15 +1,14 @@
1
1
  import type { HTMLInputAttributes } from 'svelte/elements';
2
+ import { type StyleProps } from '../../../style/surface';
2
3
  type Props = {
3
4
  tokens?: string[];
4
5
  value?: string;
5
6
  confirmText?: string | null;
6
- inputClass?: string;
7
- tokenClass?: string;
8
7
  placeholder?: string;
9
8
  tokenPlaceholder?: string;
10
9
  normalizeToken?: (value: string) => string;
11
10
  showIcon?: boolean;
12
- } & Omit<HTMLInputAttributes, 'children' | 'type' | 'value' | 'placeholder'>;
11
+ } & StyleProps & Omit<HTMLInputAttributes, 'children' | 'type' | 'value' | 'placeholder' | 'class' | 'style'>;
13
12
  declare const TokenSearchInput: import("svelte").Component<Props, {}, "value" | "tokens">;
14
13
  type TokenSearchInput = ReturnType<typeof TokenSearchInput>;
15
14
  export default TokenSearchInput;
@@ -0,0 +1 @@
1
+ export { default } from './TokenSearchInput.svelte';
@@ -0,0 +1 @@
1
+ export { default } from './TokenSearchInput.svelte';
@@ -0,0 +1,14 @@
1
+ <script module lang="ts">
2
+ export const demo = {
3
+ name: 'Tooltip',
4
+ description: 'Hover or focus a trigger to reveal contextual text.'
5
+ };
6
+ </script>
7
+
8
+ <script lang="ts">
9
+ import { tooltip } from '../../../actions/tooltip';
10
+ </script>
11
+
12
+ <button type="button" class="action" use:tooltip={'This is a tooltip'}>
13
+ Hover me
14
+ </button>
@@ -2,7 +2,6 @@ export declare const demo: {
2
2
  name: string;
3
3
  description: string;
4
4
  };
5
- import Tooltip from './Tooltip.svelte';
6
5
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
7
6
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
8
7
  $$bindings?: Bindings;
@@ -0,0 +1,2 @@
1
+ export { tooltip } from '../../../actions/tooltip';
2
+ export type { TooltipOptions } from '../../../actions/tooltip';
@@ -0,0 +1 @@
1
+ export { tooltip } from '../../../actions/tooltip';