dialkit 0.2.2 → 1.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 (85) hide show
  1. package/README.md +135 -2
  2. package/dist/index.cjs +512 -176
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +40 -8
  5. package/dist/index.d.ts +40 -8
  6. package/dist/index.js +484 -150
  7. package/dist/index.js.map +1 -1
  8. package/dist/solid/index.cjs +2612 -0
  9. package/dist/solid/index.cjs.map +1 -0
  10. package/dist/solid/index.d.cts +228 -0
  11. package/dist/solid/index.d.ts +228 -0
  12. package/dist/solid/index.js +2573 -0
  13. package/dist/solid/index.js.map +1 -0
  14. package/dist/store/index.cjs +450 -0
  15. package/dist/store/index.cjs.map +1 -0
  16. package/dist/store/index.d.cts +124 -0
  17. package/dist/store/index.d.ts +124 -0
  18. package/dist/store/index.js +425 -0
  19. package/dist/store/index.js.map +1 -0
  20. package/dist/styles.css +38 -1
  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 +84 -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 +65 -0
  34. package/dist/svelte/components/DialRoot.svelte.d.ts +11 -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 +204 -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 +144 -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 +156 -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 +106 -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 +151 -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/Slider.svelte +345 -0
  55. package/dist/svelte/components/Slider.svelte.d.ts +13 -0
  56. package/dist/svelte/components/Slider.svelte.d.ts.map +1 -0
  57. package/dist/svelte/components/SpringControl.svelte +124 -0
  58. package/dist/svelte/components/SpringControl.svelte.d.ts +12 -0
  59. package/dist/svelte/components/SpringControl.svelte.d.ts.map +1 -0
  60. package/dist/svelte/components/SpringVisualization.svelte +115 -0
  61. package/dist/svelte/components/SpringVisualization.svelte.d.ts +9 -0
  62. package/dist/svelte/components/SpringVisualization.svelte.d.ts.map +1 -0
  63. package/dist/svelte/components/TextControl.svelte +19 -0
  64. package/dist/svelte/components/TextControl.svelte.d.ts +10 -0
  65. package/dist/svelte/components/TextControl.svelte.d.ts.map +1 -0
  66. package/dist/svelte/components/Toggle.svelte +21 -0
  67. package/dist/svelte/components/Toggle.svelte.d.ts +9 -0
  68. package/dist/svelte/components/Toggle.svelte.d.ts.map +1 -0
  69. package/dist/svelte/components/TransitionControl.svelte +200 -0
  70. package/dist/svelte/components/TransitionControl.svelte.d.ts +12 -0
  71. package/dist/svelte/components/TransitionControl.svelte.d.ts.map +1 -0
  72. package/dist/svelte/components/transitions.d.ts +6 -0
  73. package/dist/svelte/components/transitions.d.ts.map +1 -0
  74. package/dist/svelte/components/transitions.js +14 -0
  75. package/dist/svelte/createDialKit.svelte.d.ts +7 -0
  76. package/dist/svelte/createDialKit.svelte.d.ts.map +1 -0
  77. package/dist/svelte/createDialKit.svelte.js +82 -0
  78. package/dist/svelte/index.d.ts +19 -0
  79. package/dist/svelte/index.d.ts.map +1 -0
  80. package/dist/svelte/index.js +19 -0
  81. package/dist/svelte/shims.d.ts +9 -0
  82. package/dist/svelte/theme-css.d.ts +2 -0
  83. package/dist/svelte/theme-css.d.ts.map +1 -0
  84. package/dist/svelte/theme-css.js +1097 -0
  85. package/package.json +56 -10
package/dist/styles.css CHANGED
@@ -39,6 +39,19 @@
39
39
  overflow: visible;
40
40
  }
41
41
 
42
+ /* Inline mode */
43
+ .dialkit-root[data-mode="inline"] {
44
+ height: 100%;
45
+ }
46
+
47
+ .dialkit-panel[data-mode="inline"] {
48
+ position: static;
49
+ z-index: auto;
50
+ max-height: 100%;
51
+ height: 100%;
52
+ overflow: hidden;
53
+ }
54
+
42
55
  .dialkit-panel-inner {
43
56
  background: var(--dial-glass-bg);
44
57
  border: 1px solid var(--dial-border);
@@ -82,6 +95,24 @@
82
95
  scrollbar-width: none;
83
96
  }
84
97
 
98
+ .dialkit-panel-inline {
99
+ width: 100%;
100
+ height: 100%;
101
+ max-height: none;
102
+ overflow-y: auto;
103
+ box-shadow: none;
104
+ border-radius: 0;
105
+ border: none;
106
+ box-sizing: border-box;
107
+ }
108
+
109
+ .dialkit-panel[data-mode="inline"] .dialkit-panel-wrapper {
110
+ display: flex;
111
+ flex-direction: column;
112
+ width: 100%;
113
+ height: 100%;
114
+ }
115
+
85
116
  /* Position variants */
86
117
  .dialkit-panel[data-position="top-right"] {
87
118
  top: 16px;
@@ -493,7 +524,8 @@
493
524
  align-items: center;
494
525
  justify-content: space-between;
495
526
  gap: 12px;
496
- padding: 2px 2px 2px 12px;
527
+ height: var(--dial-row-height);
528
+ padding: 2px 10px 2px 12px;
497
529
  background: var(--dial-surface);
498
530
  border-radius: var(--dial-radius);
499
531
  }
@@ -553,6 +585,11 @@
553
585
  overflow: visible;
554
586
  }
555
587
 
588
+ .dialkit-easing-viz {
589
+ width: 100%;
590
+ aspect-ratio: 256 / 140;
591
+ }
592
+
556
593
  /* Panel Wrapper (contains panel + toolbar) */
557
594
  .dialkit-panel-wrapper {
558
595
  display: inline-flex;
@@ -0,0 +1,30 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ let { target = 'body', children } = $props<{ target?: string | HTMLElement | null; children?: Snippet }>();
5
+
6
+ let portalEl: HTMLDivElement | undefined;
7
+
8
+ const resolveTarget = (): HTMLElement | null => {
9
+ if (typeof document === 'undefined') return null;
10
+ if (!target) return document.body;
11
+ if (typeof target === 'string') return document.querySelector(target);
12
+ return target;
13
+ };
14
+
15
+ $effect(() => {
16
+ if (!portalEl) return;
17
+ const root = resolveTarget();
18
+ if (!root) return;
19
+
20
+ root.appendChild(portalEl);
21
+
22
+ return () => {
23
+ portalEl?.remove();
24
+ };
25
+ });
26
+ </script>
27
+
28
+ <div bind:this={portalEl} style="display: contents;">
29
+ {#if children}{@render children()}{/if}
30
+ </div>
@@ -0,0 +1,9 @@
1
+ import type { Snippet } from 'svelte';
2
+ type $$ComponentProps = {
3
+ target?: string | HTMLElement | null;
4
+ children?: Snippet;
5
+ };
6
+ declare const Portal: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type Portal = ReturnType<typeof Portal>;
8
+ export default Portal;
9
+ //# sourceMappingURL=Portal.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Portal.svelte.d.ts","sourceRoot":"","sources":["../../src/svelte/Portal.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAErC,KAAK,gBAAgB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAkCtF,QAAA,MAAM,MAAM,sDAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ export type ButtonAction = {
3
+ label: string;
4
+ onClick: () => void;
5
+ };
6
+
7
+ let { buttons } = $props<{ buttons: ButtonAction[] }>();
8
+ </script>
9
+
10
+ <div class="dialkit-button-group">
11
+ {#each buttons as button (button.label)}
12
+ <button class="dialkit-button" onclick={button.onClick}>
13
+ {button.label}
14
+ </button>
15
+ {/each}
16
+ </div>
@@ -0,0 +1,11 @@
1
+ export type ButtonAction = {
2
+ label: string;
3
+ onClick: () => void;
4
+ };
5
+ type $$ComponentProps = {
6
+ buttons: ButtonAction[];
7
+ };
8
+ declare const ButtonGroup: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type ButtonGroup = ReturnType<typeof ButtonGroup>;
10
+ export default ButtonGroup;
11
+ //# sourceMappingURL=ButtonGroup.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ButtonGroup.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ButtonGroup.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AACH,KAAK,gBAAgB,GAAG;IAAE,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC;AAiBrD,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,81 @@
1
+ <script lang="ts">
2
+ const HEX_COLOR_REGEX = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;
3
+
4
+ let { label, value, onChange } = $props<{
5
+ label: string;
6
+ value: string;
7
+ onChange: (value: string) => void;
8
+ }>();
9
+
10
+ let isEditing = $state(false);
11
+ let editValue = $state(value);
12
+ let colorInputRef: HTMLInputElement | undefined;
13
+
14
+ const expandShorthandHex = (hex: string) => {
15
+ if (hex.length !== 4) return hex;
16
+ return `#${hex[1]}${hex[1]}${hex[2]}${hex[2]}${hex[3]}${hex[3]}`;
17
+ };
18
+
19
+ $effect(() => {
20
+ value;
21
+ if (!isEditing) {
22
+ editValue = value;
23
+ }
24
+ });
25
+
26
+ const handleTextSubmit = () => {
27
+ isEditing = false;
28
+ if (HEX_COLOR_REGEX.test(editValue)) {
29
+ onChange(editValue);
30
+ } else {
31
+ editValue = value;
32
+ }
33
+ };
34
+
35
+ const handleKeyDown = (e: KeyboardEvent) => {
36
+ if (e.key === 'Enter') {
37
+ handleTextSubmit();
38
+ } else if (e.key === 'Escape') {
39
+ isEditing = false;
40
+ editValue = value;
41
+ }
42
+ };
43
+ </script>
44
+
45
+ <div class="dialkit-color-control">
46
+ <label class="dialkit-color-label">{label}</label>
47
+ <div class="dialkit-color-inputs">
48
+ {#if isEditing}
49
+ <input
50
+ type="text"
51
+ class="dialkit-color-hex-input"
52
+ value={editValue}
53
+ oninput={(e) => (editValue = (e.currentTarget as HTMLInputElement).value)}
54
+ onblur={handleTextSubmit}
55
+ onkeydown={handleKeyDown}
56
+ autofocus
57
+ />
58
+ {:else}
59
+ <span class="dialkit-color-hex" onclick={() => (isEditing = true)}>
60
+ {(value ?? '').toUpperCase()}
61
+ </span>
62
+ {/if}
63
+
64
+ <button
65
+ class="dialkit-color-swatch"
66
+ style:background-color={value}
67
+ onclick={() => colorInputRef?.click()}
68
+ title="Pick color"
69
+ aria-label={`Pick color for ${label}`}
70
+ />
71
+
72
+ <input
73
+ bind:this={colorInputRef}
74
+ type="color"
75
+ class="dialkit-color-picker-native"
76
+ aria-label={`${label} color picker`}
77
+ value={value.length === 4 ? expandShorthandHex(value) : value.slice(0, 7)}
78
+ oninput={(e) => onChange((e.currentTarget as HTMLInputElement).value)}
79
+ />
80
+ </div>
81
+ </div>
@@ -0,0 +1,9 @@
1
+ type $$ComponentProps = {
2
+ label: string;
3
+ value: string;
4
+ onChange: (value: string) => void;
5
+ };
6
+ declare const ColorControl: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type ColorControl = ReturnType<typeof ColorControl>;
8
+ export default ColorControl;
9
+ //# sourceMappingURL=ColorControl.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorControl.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ColorControl.svelte.ts"],"names":[],"mappings":"AAGC,KAAK,gBAAgB,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AA4DJ,QAAA,MAAM,YAAY,sDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,84 @@
1
+ <script lang="ts">
2
+ import { DialStore } from 'dialkit/store';
3
+ import type { ControlMeta, DialValue, SpringConfig, TransitionConfig } from 'dialkit/store';
4
+ import Slider from './Slider.svelte';
5
+ import Toggle from './Toggle.svelte';
6
+ import Folder from './Folder.svelte';
7
+ import SpringControl from './SpringControl.svelte';
8
+ import TransitionControl from './TransitionControl.svelte';
9
+ import TextControl from './TextControl.svelte';
10
+ import SelectControl from './SelectControl.svelte';
11
+ import ColorControl from './ColorControl.svelte';
12
+ import ControlRenderer from './ControlRenderer.svelte';
13
+
14
+ let { panelId, control, values } = $props<{
15
+ panelId: string;
16
+ control: ControlMeta;
17
+ values: Record<string, DialValue>;
18
+ }>();
19
+
20
+ const controlValue = $derived(values[control.path]);
21
+ </script>
22
+
23
+ {#if control.type === 'slider'}
24
+ <Slider
25
+ label={control.label}
26
+ value={controlValue as number}
27
+ onChange={(v) => DialStore.updateValue(panelId, control.path, v)}
28
+ min={control.min}
29
+ max={control.max}
30
+ step={control.step}
31
+ />
32
+ {:else if control.type === 'toggle'}
33
+ <Toggle
34
+ label={control.label}
35
+ checked={controlValue as boolean}
36
+ onChange={(v) => DialStore.updateValue(panelId, control.path, v)}
37
+ />
38
+ {:else if control.type === 'spring'}
39
+ <SpringControl
40
+ {panelId}
41
+ path={control.path}
42
+ label={control.label}
43
+ spring={controlValue as SpringConfig}
44
+ onChange={(v) => DialStore.updateValue(panelId, control.path, v)}
45
+ />
46
+ {:else if control.type === 'transition'}
47
+ <TransitionControl
48
+ {panelId}
49
+ path={control.path}
50
+ label={control.label}
51
+ value={controlValue as TransitionConfig}
52
+ onChange={(v) => DialStore.updateValue(panelId, control.path, v)}
53
+ />
54
+ {:else if control.type === 'folder'}
55
+ <Folder title={control.label} defaultOpen={control.defaultOpen ?? true}>
56
+ {#each control.children ?? [] as child (child.path)}
57
+ <ControlRenderer {panelId} control={child} {values} />
58
+ {/each}
59
+ </Folder>
60
+ {:else if control.type === 'text'}
61
+ <TextControl
62
+ label={control.label}
63
+ value={controlValue as string}
64
+ onChange={(v) => DialStore.updateValue(panelId, control.path, v)}
65
+ placeholder={control.placeholder}
66
+ />
67
+ {:else if control.type === 'select'}
68
+ <SelectControl
69
+ label={control.label}
70
+ value={controlValue as string}
71
+ options={control.options ?? []}
72
+ onChange={(v) => DialStore.updateValue(panelId, control.path, v)}
73
+ />
74
+ {:else if control.type === 'color'}
75
+ <ColorControl
76
+ label={control.label}
77
+ value={controlValue as string}
78
+ onChange={(v) => DialStore.updateValue(panelId, control.path, v)}
79
+ />
80
+ {:else if control.type === 'action'}
81
+ <button class="dialkit-button" onclick={() => DialStore.triggerAction(panelId, control.path)}>
82
+ {control.label}
83
+ </button>
84
+ {/if}
@@ -0,0 +1,11 @@
1
+ import type { ControlMeta, DialValue } from 'dialkit/store';
2
+ import ControlRenderer from './ControlRenderer.svelte';
3
+ type $$ComponentProps = {
4
+ panelId: string;
5
+ control: ControlMeta;
6
+ values: Record<string, DialValue>;
7
+ };
8
+ declare const ControlRenderer: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type ControlRenderer = ReturnType<typeof ControlRenderer>;
10
+ export default ControlRenderer;
11
+ //# sourceMappingURL=ControlRenderer.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlRenderer.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ControlRenderer.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAkC,MAAM,eAAe,CAAC;AAS5F,OAAO,eAAe,MAAM,0BAA0B,CAAC;AAEtD,KAAK,gBAAgB,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACnC,CAAC;AA+CJ,QAAA,MAAM,eAAe,sDAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -0,0 +1,65 @@
1
+ <script lang="ts">
2
+ import { DialStore } from 'dialkit/store';
3
+ import type { PanelConfig } from 'dialkit/store';
4
+ import { themeCSS } from '../theme-css';
5
+ import Portal from '../Portal.svelte';
6
+ import Panel from './Panel.svelte';
7
+
8
+ export type DialPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
9
+ export type DialMode = 'popover' | 'inline';
10
+
11
+ let { position = 'top-right', defaultOpen = true, mode = 'popover' } = $props<{
12
+ position?: DialPosition;
13
+ defaultOpen?: boolean;
14
+ mode?: DialMode;
15
+ }>();
16
+
17
+ const inline = $derived(mode === 'inline');
18
+
19
+ let panels = $state<PanelConfig[]>([]);
20
+ let mounted = $state(false);
21
+
22
+ $effect(() => {
23
+ if (typeof document === 'undefined') return;
24
+ const id = 'dialkit-theme';
25
+ if (!document.getElementById(id)) {
26
+ const style = document.createElement('style');
27
+ style.id = id;
28
+ style.textContent = themeCSS;
29
+ document.head.appendChild(style);
30
+ }
31
+ });
32
+
33
+ $effect(() => {
34
+ if (typeof window === 'undefined') return;
35
+
36
+ mounted = true;
37
+ panels = DialStore.getPanels();
38
+
39
+ const unsub = DialStore.subscribeGlobal(() => {
40
+ panels = DialStore.getPanels();
41
+ });
42
+
43
+ return unsub;
44
+ });
45
+ </script>
46
+
47
+ {#if mounted && panels.length > 0}
48
+ {#snippet content()}
49
+ <div class="dialkit-root" data-mode={mode}>
50
+ <div class="dialkit-panel" data-mode={mode} data-position={inline ? undefined : position}>
51
+ {#each panels as panel (panel.id)}
52
+ <Panel {panel} defaultOpen={inline || defaultOpen} {inline} />
53
+ {/each}
54
+ </div>
55
+ </div>
56
+ {/snippet}
57
+
58
+ {#if inline}
59
+ {@render content()}
60
+ {:else}
61
+ <Portal target="body">
62
+ {@render content()}
63
+ </Portal>
64
+ {/if}
65
+ {/if}
@@ -0,0 +1,11 @@
1
+ export type DialPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
2
+ export type DialMode = 'popover' | 'inline';
3
+ type $$ComponentProps = {
4
+ position?: DialPosition;
5
+ defaultOpen?: boolean;
6
+ mode?: DialMode;
7
+ };
8
+ declare const DialRoot: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type DialRoot = ReturnType<typeof DialRoot>;
10
+ export default DialRoot;
11
+ //# sourceMappingURL=DialRoot.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DialRoot.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/DialRoot.svelte.ts"],"names":[],"mappings":"AAUE,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,GAAG,aAAa,CAAC;AACrF,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC7C,KAAK,gBAAgB,GAAG;IACrB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB,CAAC;AAgEJ,QAAA,MAAM,QAAQ,sDAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,50 @@
1
+ <script lang="ts">
2
+ import type { EasingConfig } from 'dialkit/store';
3
+
4
+ let { easing } = $props<{ easing: EasingConfig }>();
5
+
6
+ export const easingPresets: Record<string, [number, number, number, number]> = {
7
+ linear: [0, 0, 1, 1],
8
+ easeIn: [0.42, 0, 1, 1],
9
+ easeOut: [0, 0, 0.58, 1],
10
+ easeInOut: [0.42, 0, 0.58, 1],
11
+ };
12
+
13
+ const s = 200;
14
+ const pad = 10;
15
+ const inner = s - pad * 2;
16
+ const unit = inner / 2;
17
+
18
+ const toSvg = (nx: number, ny: number) => ({
19
+ x: pad + (nx + 0.5) * unit,
20
+ y: pad + (1.5 - ny) * unit,
21
+ });
22
+
23
+ const points = $derived.by(() => {
24
+ const ease = easing.ease;
25
+ const start = toSvg(0, 0);
26
+ const end = toSvg(1, 1);
27
+ const p1 = toSvg(ease[0], ease[1]);
28
+ const p2 = toSvg(ease[2], ease[3]);
29
+
30
+ return {
31
+ start,
32
+ end,
33
+ curvePath: `M ${start.x} ${start.y} C ${p1.x} ${p1.y}, ${p2.x} ${p2.y}, ${end.x} ${end.y}`,
34
+ };
35
+ });
36
+ </script>
37
+
38
+ <svg viewBox={`0 0 ${s} ${s}`} preserveAspectRatio="xMidYMid slice" class="dialkit-spring-viz dialkit-easing-viz">
39
+ <line
40
+ x1={points.start.x}
41
+ y1={points.start.y}
42
+ x2={points.end.x}
43
+ y2={points.end.y}
44
+ stroke="rgba(255, 255, 255, 0.15)"
45
+ stroke-width="1"
46
+ stroke-dasharray="4,4"
47
+ />
48
+
49
+ <path d={points.curvePath} fill="none" stroke="rgba(255, 255, 255, 0.6)" stroke-width="2" stroke-linecap="round" />
50
+ </svg>
@@ -0,0 +1,10 @@
1
+ import type { EasingConfig } from 'dialkit/store';
2
+ type $$ComponentProps = {
3
+ easing: EasingConfig;
4
+ };
5
+ declare const EasingVisualization: import("svelte").Component<$$ComponentProps, {
6
+ easingPresets: Record<string, [number, number, number, number]>;
7
+ }, "">;
8
+ type EasingVisualization = ReturnType<typeof EasingVisualization>;
9
+ export default EasingVisualization;
10
+ //# sourceMappingURL=EasingVisualization.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EasingVisualization.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/EasingVisualization.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEjD,KAAK,gBAAgB,GAAG;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AA8ClD,QAAA,MAAM,mBAAmB;mBADyF,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;MACjG,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}