dialkit 1.0.0 → 1.2.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 (97) hide show
  1. package/README.md +293 -2
  2. package/dist/index.cjs +905 -363
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +46 -9
  5. package/dist/index.d.ts +46 -9
  6. package/dist/index.js +910 -370
  7. package/dist/index.js.map +1 -1
  8. package/dist/solid/index.cjs +1042 -532
  9. package/dist/solid/index.cjs.map +1 -1
  10. package/dist/solid/index.d.cts +36 -3
  11. package/dist/solid/index.d.ts +36 -3
  12. package/dist/solid/index.js +911 -402
  13. package/dist/solid/index.js.map +1 -1
  14. package/dist/store/index.cjs +490 -0
  15. package/dist/store/index.cjs.map +1 -0
  16. package/dist/store/index.d.cts +146 -0
  17. package/dist/store/index.d.ts +146 -0
  18. package/dist/store/index.js +465 -0
  19. package/dist/store/index.js.map +1 -0
  20. package/dist/styles.css +287 -25
  21. package/dist/svelte/Portal.svelte +30 -0
  22. package/dist/svelte/Portal.svelte.d.ts +9 -0
  23. package/dist/svelte/Portal.svelte.d.ts.map +1 -0
  24. package/dist/svelte/components/ButtonGroup.svelte +16 -0
  25. package/dist/svelte/components/ButtonGroup.svelte.d.ts +11 -0
  26. package/dist/svelte/components/ButtonGroup.svelte.d.ts.map +1 -0
  27. package/dist/svelte/components/ColorControl.svelte +81 -0
  28. package/dist/svelte/components/ColorControl.svelte.d.ts +9 -0
  29. package/dist/svelte/components/ColorControl.svelte.d.ts.map +1 -0
  30. package/dist/svelte/components/ControlRenderer.svelte +96 -0
  31. package/dist/svelte/components/ControlRenderer.svelte.d.ts +11 -0
  32. package/dist/svelte/components/ControlRenderer.svelte.d.ts.map +1 -0
  33. package/dist/svelte/components/DialRoot.svelte +79 -0
  34. package/dist/svelte/components/DialRoot.svelte.d.ts +14 -0
  35. package/dist/svelte/components/DialRoot.svelte.d.ts.map +1 -0
  36. package/dist/svelte/components/EasingVisualization.svelte +50 -0
  37. package/dist/svelte/components/EasingVisualization.svelte.d.ts +10 -0
  38. package/dist/svelte/components/EasingVisualization.svelte.d.ts.map +1 -0
  39. package/dist/svelte/components/Folder.svelte +213 -0
  40. package/dist/svelte/components/Folder.svelte.d.ts +14 -0
  41. package/dist/svelte/components/Folder.svelte.d.ts.map +1 -0
  42. package/dist/svelte/components/Panel.svelte +149 -0
  43. package/dist/svelte/components/Panel.svelte.d.ts +10 -0
  44. package/dist/svelte/components/Panel.svelte.d.ts.map +1 -0
  45. package/dist/svelte/components/PresetManager.svelte +157 -0
  46. package/dist/svelte/components/PresetManager.svelte.d.ts +10 -0
  47. package/dist/svelte/components/PresetManager.svelte.d.ts.map +1 -0
  48. package/dist/svelte/components/SegmentedControl.svelte +62 -0
  49. package/dist/svelte/components/SegmentedControl.svelte.d.ts +13 -0
  50. package/dist/svelte/components/SegmentedControl.svelte.d.ts.map +1 -0
  51. package/dist/svelte/components/SelectControl.svelte +152 -0
  52. package/dist/svelte/components/SelectControl.svelte.d.ts +14 -0
  53. package/dist/svelte/components/SelectControl.svelte.d.ts.map +1 -0
  54. package/dist/svelte/components/ShortcutListener.svelte +265 -0
  55. package/dist/svelte/components/ShortcutListener.svelte.d.ts +13 -0
  56. package/dist/svelte/components/ShortcutListener.svelte.d.ts.map +1 -0
  57. package/dist/svelte/components/ShortcutsMenu.svelte +128 -0
  58. package/dist/svelte/components/ShortcutsMenu.svelte.d.ts +7 -0
  59. package/dist/svelte/components/ShortcutsMenu.svelte.d.ts.map +1 -0
  60. package/dist/svelte/components/Slider.svelte +332 -0
  61. package/dist/svelte/components/Slider.svelte.d.ts +16 -0
  62. package/dist/svelte/components/Slider.svelte.d.ts.map +1 -0
  63. package/dist/svelte/components/SpringControl.svelte +126 -0
  64. package/dist/svelte/components/SpringControl.svelte.d.ts +12 -0
  65. package/dist/svelte/components/SpringControl.svelte.d.ts.map +1 -0
  66. package/dist/svelte/components/SpringVisualization.svelte +115 -0
  67. package/dist/svelte/components/SpringVisualization.svelte.d.ts +9 -0
  68. package/dist/svelte/components/SpringVisualization.svelte.d.ts.map +1 -0
  69. package/dist/svelte/components/TextControl.svelte +19 -0
  70. package/dist/svelte/components/TextControl.svelte.d.ts +10 -0
  71. package/dist/svelte/components/TextControl.svelte.d.ts.map +1 -0
  72. package/dist/svelte/components/Toggle.svelte +32 -0
  73. package/dist/svelte/components/Toggle.svelte.d.ts +12 -0
  74. package/dist/svelte/components/Toggle.svelte.d.ts.map +1 -0
  75. package/dist/svelte/components/TransitionControl.svelte +203 -0
  76. package/dist/svelte/components/TransitionControl.svelte.d.ts +12 -0
  77. package/dist/svelte/components/TransitionControl.svelte.d.ts.map +1 -0
  78. package/dist/svelte/components/transitions.d.ts +6 -0
  79. package/dist/svelte/components/transitions.d.ts.map +1 -0
  80. package/dist/svelte/components/transitions.js +14 -0
  81. package/dist/svelte/createDialKit.svelte.d.ts +8 -0
  82. package/dist/svelte/createDialKit.svelte.d.ts.map +1 -0
  83. package/dist/svelte/createDialKit.svelte.js +82 -0
  84. package/dist/svelte/index.d.ts +23 -0
  85. package/dist/svelte/index.d.ts.map +1 -0
  86. package/dist/svelte/index.js +23 -0
  87. package/dist/svelte/shims.d.ts +9 -0
  88. package/dist/svelte/theme-css.d.ts +2 -0
  89. package/dist/svelte/theme-css.d.ts.map +1 -0
  90. package/dist/svelte/theme-css.js +1328 -0
  91. package/dist/vue/index.cjs +3056 -0
  92. package/dist/vue/index.cjs.map +1 -0
  93. package/dist/vue/index.d.cts +675 -0
  94. package/dist/vue/index.d.ts +675 -0
  95. package/dist/vue/index.js +3014 -0
  96. package/dist/vue/index.js.map +1 -0
  97. package/package.json +50 -6
@@ -0,0 +1,10 @@
1
+ import type { PanelConfig } from 'dialkit/store';
2
+ type $$ComponentProps = {
3
+ panel: PanelConfig;
4
+ defaultOpen?: boolean;
5
+ inline?: boolean;
6
+ };
7
+ declare const Panel: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type Panel = ReturnType<typeof Panel>;
9
+ export default Panel;
10
+ //# sourceMappingURL=Panel.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Panel.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/Panel.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAa,WAAW,EAAU,MAAM,eAAe,CAAC;AAOnE,KAAK,gBAAgB,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAqHzF,QAAA,MAAM,KAAK,sDAAwC,CAAC;AACpD,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACtC,eAAe,KAAK,CAAC"}
@@ -0,0 +1,157 @@
1
+ <script lang="ts">
2
+ import { Spring } from 'svelte/motion';
3
+ import Portal from '../Portal.svelte';
4
+ import { DialStore } from 'dialkit/store';
5
+ import type { Preset } from 'dialkit/store';
6
+ import { dropdownTransition } from './transitions';
7
+ import { ICON_CHEVRON, ICON_TRASH } from '../../icons';
8
+
9
+ let { panelId, presets, activePresetId } = $props<{
10
+ panelId: string;
11
+ presets: Preset[];
12
+ activePresetId: string | null;
13
+ }>();
14
+
15
+ let isOpen = $state(false);
16
+ let pos = $state({ top: 0, left: 0, width: 0 });
17
+ let portalTarget = $state<HTMLElement | null>(null);
18
+ let triggerRef: HTMLButtonElement | undefined;
19
+ let dropdownRef: HTMLDivElement | undefined;
20
+
21
+ const chevronRotation = new Spring(0, { stiffness: 0.2, damping: 0.6 });
22
+ const chevronOpacity = new Spring(0.25, { stiffness: 0.2, damping: 0.6 });
23
+
24
+ const hasPresets = $derived(presets.length > 0);
25
+ const activePreset = $derived(presets.find((p: Preset) => p.id === activePresetId));
26
+
27
+ const updatePos = () => {
28
+ const rect = triggerRef?.getBoundingClientRect();
29
+ if (!rect) return;
30
+ pos = { top: rect.bottom + 4, left: rect.left, width: rect.width };
31
+ };
32
+
33
+ const openDropdown = () => {
34
+ if (!hasPresets) return;
35
+ updatePos();
36
+ isOpen = true;
37
+ };
38
+
39
+ const closeDropdown = () => {
40
+ isOpen = false;
41
+ };
42
+
43
+ $effect(() => {
44
+ if (typeof document === 'undefined' || !triggerRef) return;
45
+ portalTarget = (triggerRef.closest('.dialkit-root') as HTMLElement | null) ?? document.body;
46
+ });
47
+
48
+ $effect(() => {
49
+ chevronRotation.set(isOpen ? 180 : 0);
50
+ chevronOpacity.set(hasPresets ? 0.6 : 0.25);
51
+ });
52
+
53
+ $effect(() => {
54
+ if (!isOpen || typeof window === 'undefined') return;
55
+
56
+ const handleViewportChange = () => updatePos();
57
+ const handler = (e: MouseEvent) => {
58
+ const target = e.target as Node;
59
+ if (triggerRef?.contains(target) || dropdownRef?.contains(target)) return;
60
+ closeDropdown();
61
+ };
62
+
63
+ updatePos();
64
+ document.addEventListener('mousedown', handler);
65
+ window.addEventListener('resize', handleViewportChange);
66
+ window.addEventListener('scroll', handleViewportChange, true);
67
+
68
+ return () => {
69
+ document.removeEventListener('mousedown', handler);
70
+ window.removeEventListener('resize', handleViewportChange);
71
+ window.removeEventListener('scroll', handleViewportChange, true);
72
+ };
73
+ });
74
+
75
+ const handleSelect = (presetId: string | null) => {
76
+ if (presetId) DialStore.loadPreset(panelId, presetId);
77
+ else DialStore.clearActivePreset(panelId);
78
+ closeDropdown();
79
+ };
80
+
81
+ const handleDelete = (e: MouseEvent, presetId: string) => {
82
+ e.stopPropagation();
83
+ DialStore.deletePreset(panelId, presetId);
84
+ };
85
+ </script>
86
+
87
+ <div class="dialkit-preset-manager">
88
+ <button
89
+ bind:this={triggerRef}
90
+ class="dialkit-preset-trigger"
91
+ onclick={() => (isOpen ? closeDropdown() : openDropdown())}
92
+ data-open={String(isOpen)}
93
+ data-has-preset={String(!!activePreset)}
94
+ data-disabled={String(!hasPresets)}
95
+ >
96
+ <span class="dialkit-preset-label">
97
+ {activePreset ? activePreset.name : 'Version 1'}
98
+ </span>
99
+ <svg
100
+ class="dialkit-select-chevron"
101
+ viewBox="0 0 24 24"
102
+ fill="none"
103
+ stroke="currentColor"
104
+ stroke-width="2.5"
105
+ stroke-linecap="round"
106
+ stroke-linejoin="round"
107
+ style:transform={`rotate(${chevronRotation.current}deg)`}
108
+ style:opacity={chevronOpacity.current}
109
+ >
110
+ <path d={ICON_CHEVRON} />
111
+ </svg>
112
+ </button>
113
+
114
+ {#if portalTarget}
115
+ <Portal target={portalTarget}>
116
+ {#if isOpen}
117
+ <div
118
+ bind:this={dropdownRef}
119
+ class="dialkit-root dialkit-preset-dropdown"
120
+ style={`position:fixed;top:${pos.top}px;left:${pos.left}px;min-width:${pos.width}px;`}
121
+ transition:dropdownTransition={{ above: false }}
122
+ >
123
+ <div
124
+ class="dialkit-preset-item"
125
+ data-active={String(!activePresetId)}
126
+ onclick={() => handleSelect(null)}
127
+ >
128
+ <span class="dialkit-preset-name">Version 1</span>
129
+ </div>
130
+
131
+ {#each presets as preset (preset.id)}
132
+ <div
133
+ class="dialkit-preset-item"
134
+ data-active={String(preset.id === activePresetId)}
135
+ onclick={() => handleSelect(preset.id)}
136
+ >
137
+ <span class="dialkit-preset-name">{preset.name}</span>
138
+ <button
139
+ class="dialkit-preset-delete"
140
+ onclick={(e) => handleDelete(e, preset.id)}
141
+ title="Delete preset"
142
+ >
143
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
144
+ <path d={ICON_TRASH[0]} />
145
+ <path d={ICON_TRASH[1]} />
146
+ <path d={ICON_TRASH[2]} />
147
+ <path d={ICON_TRASH[3]} />
148
+ <path d={ICON_TRASH[4]} />
149
+ </svg>
150
+ </button>
151
+ </div>
152
+ {/each}
153
+ </div>
154
+ {/if}
155
+ </Portal>
156
+ {/if}
157
+ </div>
@@ -0,0 +1,10 @@
1
+ import type { Preset } from 'dialkit/store';
2
+ type $$ComponentProps = {
3
+ panelId: string;
4
+ presets: Preset[];
5
+ activePresetId: string | null;
6
+ };
7
+ declare const PresetManager: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type PresetManager = ReturnType<typeof PresetManager>;
9
+ export default PresetManager;
10
+ //# sourceMappingURL=PresetManager.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PresetManager.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/PresetManager.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI3C,KAAK,gBAAgB,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AA2HJ,QAAA,MAAM,aAAa,sDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -0,0 +1,62 @@
1
+ <script lang="ts">
2
+ export interface SegmentedControlOption<T extends string = string> {
3
+ value: T;
4
+ label: string;
5
+ }
6
+
7
+ let { options, value, onChange } = $props<{
8
+ options: SegmentedControlOption[];
9
+ value: string;
10
+ onChange: (value: string) => void;
11
+ }>();
12
+
13
+ let containerRef = $state<HTMLDivElement | undefined>(undefined);
14
+ let hasAnimated = false;
15
+ let pillLeft = $state<number | null>(null);
16
+ let pillWidth = $state<number | null>(null);
17
+
18
+ function measure() {
19
+ if (!containerRef) return;
20
+ const activeButton = containerRef.querySelector('[data-active="true"]') as HTMLElement | null;
21
+ if (!activeButton) return;
22
+ pillLeft = activeButton.offsetLeft;
23
+ pillWidth = activeButton.offsetWidth;
24
+ }
25
+
26
+ $effect(() => {
27
+ void value;
28
+ void options.length;
29
+ measure();
30
+ });
31
+
32
+ let shouldAnimate = $derived.by(() => {
33
+ if (!hasAnimated) {
34
+ hasAnimated = true;
35
+ return false;
36
+ }
37
+ return true;
38
+ });
39
+ </script>
40
+
41
+ <div class="dialkit-segmented" bind:this={containerRef}>
42
+ {#if pillLeft !== null && pillWidth !== null}
43
+ <div
44
+ class="dialkit-segmented-pill"
45
+ style:left="{pillLeft}px"
46
+ style:width="{pillWidth}px"
47
+ style:transition={shouldAnimate
48
+ ? 'left 0.2s cubic-bezier(0.25, 1, 0.5, 1), width 0.2s cubic-bezier(0.25, 1, 0.5, 1)'
49
+ : 'none'}
50
+ ></div>
51
+ {/if}
52
+
53
+ {#each options as option (option.value)}
54
+ <button
55
+ onclick={() => onChange(option.value)}
56
+ class="dialkit-segmented-button"
57
+ data-active={String(value === option.value)}
58
+ >
59
+ {option.label}
60
+ </button>
61
+ {/each}
62
+ </div>
@@ -0,0 +1,13 @@
1
+ export interface SegmentedControlOption<T extends string = string> {
2
+ value: T;
3
+ label: string;
4
+ }
5
+ type $$ComponentProps = {
6
+ options: SegmentedControlOption[];
7
+ value: string;
8
+ onChange: (value: string) => void;
9
+ };
10
+ declare const SegmentedControl: import("svelte").Component<$$ComponentProps, {}, "">;
11
+ type SegmentedControl = ReturnType<typeof SegmentedControl>;
12
+ export default SegmentedControl;
13
+ //# sourceMappingURL=SegmentedControl.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/SegmentedControl.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,WAAW,sBAAsB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC/D,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;CACf;AACF,KAAK,gBAAgB,GAAG;IACrB,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAkDJ,QAAA,MAAM,gBAAgB,sDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,152 @@
1
+ <script lang="ts">
2
+ import { Spring } from 'svelte/motion';
3
+ import Portal from '../Portal.svelte';
4
+ import { dropdownTransition } from './transitions';
5
+ import { ICON_CHEVRON } from '../../icons';
6
+
7
+ type SelectOption = string | { value: string; label: string };
8
+
9
+ let { label, value, options, onChange } = $props<{
10
+ label: string;
11
+ value: string;
12
+ options: SelectOption[];
13
+ onChange: (value: string) => void;
14
+ }>();
15
+
16
+ let isOpen = $state(false);
17
+ let pos = $state<{ top: number; left: number; width: number; above: boolean } | null>(null);
18
+ let portalTarget = $state<HTMLElement | null>(null);
19
+ let triggerRef: HTMLButtonElement | undefined;
20
+ let dropdownRef: HTMLDivElement | undefined;
21
+
22
+ const chevronRotation = new Spring(0, { stiffness: 0.2, damping: 0.6 });
23
+
24
+ const toTitleCase = (s: string) => s.replace(/\b\w/g, (c) => c.toUpperCase());
25
+
26
+ const normalized = $derived(
27
+ options.map((opt: SelectOption) =>
28
+ typeof opt === 'string' ? { value: opt, label: toTitleCase(opt) } : opt
29
+ )
30
+ );
31
+
32
+ const selectedOption = $derived(normalized.find((o: { value: string; label: string }) => o.value === value));
33
+
34
+ const updatePos = () => {
35
+ if (!triggerRef || typeof window === 'undefined') return;
36
+ const rect = triggerRef.getBoundingClientRect();
37
+ const dropdownHeight = 8 + normalized.length * 36;
38
+ const spaceBelow = window.innerHeight - rect.bottom - 4;
39
+ const above = spaceBelow < dropdownHeight && rect.top > spaceBelow;
40
+
41
+ pos = {
42
+ top: above ? rect.top - 4 : rect.bottom + 4,
43
+ left: rect.left,
44
+ width: rect.width,
45
+ above,
46
+ };
47
+ };
48
+
49
+ const openDropdown = () => {
50
+ updatePos();
51
+ isOpen = true;
52
+ };
53
+
54
+ const closeDropdown = () => {
55
+ isOpen = false;
56
+ };
57
+
58
+ const dropdownStyle = $derived.by(() => {
59
+ if (!pos || typeof window === 'undefined') return '';
60
+
61
+ if (pos.above) {
62
+ return `position:fixed;left:${pos.left}px;width:${pos.width}px;bottom:${window.innerHeight - pos.top}px;transform-origin:bottom;`;
63
+ }
64
+
65
+ return `position:fixed;left:${pos.left}px;width:${pos.width}px;top:${pos.top}px;transform-origin:top;`;
66
+ });
67
+
68
+ $effect(() => {
69
+ if (typeof document === 'undefined' || !triggerRef) return;
70
+
71
+ portalTarget = (triggerRef.closest('.dialkit-root') as HTMLElement | null) ?? document.body;
72
+ });
73
+
74
+ $effect(() => {
75
+ chevronRotation.set(isOpen ? 180 : 0);
76
+ });
77
+
78
+ $effect(() => {
79
+ if (!isOpen || typeof window === 'undefined') return;
80
+
81
+ const handleViewportChange = () => updatePos();
82
+
83
+ const handleClick = (e: MouseEvent) => {
84
+ const target = e.target as Node;
85
+ if (triggerRef?.contains(target) || dropdownRef?.contains(target)) return;
86
+ closeDropdown();
87
+ };
88
+
89
+ updatePos();
90
+ document.addEventListener('mousedown', handleClick);
91
+ window.addEventListener('resize', handleViewportChange);
92
+ window.addEventListener('scroll', handleViewportChange, true);
93
+
94
+ return () => {
95
+ document.removeEventListener('mousedown', handleClick);
96
+ window.removeEventListener('resize', handleViewportChange);
97
+ window.removeEventListener('scroll', handleViewportChange, true);
98
+ };
99
+ });
100
+ </script>
101
+
102
+ <div class="dialkit-select-row">
103
+ <button
104
+ bind:this={triggerRef}
105
+ class="dialkit-select-trigger"
106
+ onclick={() => (isOpen ? closeDropdown() : openDropdown())}
107
+ data-open={String(isOpen)}
108
+ >
109
+ <span class="dialkit-select-label">{label}</span>
110
+ <div class="dialkit-select-right">
111
+ <span class="dialkit-select-value">{selectedOption?.label ?? value}</span>
112
+ <svg
113
+ class="dialkit-select-chevron"
114
+ viewBox="0 0 24 24"
115
+ fill="none"
116
+ stroke="currentColor"
117
+ stroke-width="2.5"
118
+ stroke-linecap="round"
119
+ stroke-linejoin="round"
120
+ style:transform={`rotate(${chevronRotation.current}deg)`}
121
+ >
122
+ <path d={ICON_CHEVRON} />
123
+ </svg>
124
+ </div>
125
+ </button>
126
+
127
+ {#if portalTarget}
128
+ <Portal target={portalTarget}>
129
+ {#if isOpen && pos}
130
+ <div
131
+ bind:this={dropdownRef}
132
+ class="dialkit-select-dropdown"
133
+ style={dropdownStyle}
134
+ transition:dropdownTransition={{ above: pos.above }}
135
+ >
136
+ {#each normalized as option (option.value)}
137
+ <button
138
+ class="dialkit-select-option"
139
+ data-selected={String(option.value === value)}
140
+ onclick={() => {
141
+ onChange(option.value);
142
+ closeDropdown();
143
+ }}
144
+ >
145
+ {option.label}
146
+ </button>
147
+ {/each}
148
+ </div>
149
+ {/if}
150
+ </Portal>
151
+ {/if}
152
+ </div>
@@ -0,0 +1,14 @@
1
+ type SelectOption = string | {
2
+ value: string;
3
+ label: string;
4
+ };
5
+ type $$ComponentProps = {
6
+ label: string;
7
+ value: string;
8
+ options: SelectOption[];
9
+ onChange: (value: string) => void;
10
+ };
11
+ declare const SelectControl: import("svelte").Component<$$ComponentProps, {}, "">;
12
+ type SelectControl = ReturnType<typeof SelectControl>;
13
+ export default SelectControl;
14
+ //# sourceMappingURL=SelectControl.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectControl.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/SelectControl.svelte.ts"],"names":[],"mappings":"AASE,KAAK,YAAY,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/D,KAAK,gBAAgB,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AA+HJ,QAAA,MAAM,aAAa,sDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}