dialkit 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +174 -2
  2. package/dist/icons.d.ts +19 -0
  3. package/dist/icons.js +39 -0
  4. package/dist/icons.js.map +1 -0
  5. package/dist/index.cjs +876 -337
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.cts +41 -6
  8. package/dist/index.d.ts +41 -6
  9. package/dist/index.js +878 -341
  10. package/dist/index.js.map +1 -1
  11. package/dist/shortcut-utils.d.ts +39 -0
  12. package/dist/shortcut-utils.js +100 -0
  13. package/dist/shortcut-utils.js.map +1 -0
  14. package/dist/solid/index.cjs +1011 -544
  15. package/dist/solid/index.cjs.map +1 -1
  16. package/dist/solid/index.d.cts +33 -3
  17. package/dist/solid/index.d.ts +33 -3
  18. package/dist/solid/index.js +864 -398
  19. package/dist/solid/index.js.map +1 -1
  20. package/dist/store/index.cjs +52 -12
  21. package/dist/store/index.cjs.map +1 -1
  22. package/dist/store/index.d.cts +25 -3
  23. package/dist/store/index.d.ts +25 -3
  24. package/dist/store/index.js +52 -12
  25. package/dist/store/index.js.map +1 -1
  26. package/dist/styles.css +256 -25
  27. package/dist/svelte/components/ControlRenderer.svelte +12 -0
  28. package/dist/svelte/components/ControlRenderer.svelte.d.ts.map +1 -1
  29. package/dist/svelte/components/DialRoot.svelte +22 -8
  30. package/dist/svelte/components/DialRoot.svelte.d.ts +3 -0
  31. package/dist/svelte/components/DialRoot.svelte.d.ts.map +1 -1
  32. package/dist/svelte/components/Folder.svelte +17 -8
  33. package/dist/svelte/components/Folder.svelte.d.ts.map +1 -1
  34. package/dist/svelte/components/Panel.svelte +14 -9
  35. package/dist/svelte/components/Panel.svelte.d.ts.map +1 -1
  36. package/dist/svelte/components/PresetManager.svelte +7 -6
  37. package/dist/svelte/components/PresetManager.svelte.d.ts.map +1 -1
  38. package/dist/svelte/components/SegmentedControl.svelte +30 -74
  39. package/dist/svelte/components/SegmentedControl.svelte.d.ts.map +1 -1
  40. package/dist/svelte/components/SelectControl.svelte +2 -1
  41. package/dist/svelte/components/SelectControl.svelte.d.ts.map +1 -1
  42. package/dist/svelte/components/ShortcutListener.svelte +265 -0
  43. package/dist/svelte/components/ShortcutListener.svelte.d.ts +13 -0
  44. package/dist/svelte/components/ShortcutListener.svelte.d.ts.map +1 -0
  45. package/dist/svelte/components/ShortcutsMenu.svelte +128 -0
  46. package/dist/svelte/components/ShortcutsMenu.svelte.d.ts +7 -0
  47. package/dist/svelte/components/ShortcutsMenu.svelte.d.ts.map +1 -0
  48. package/dist/svelte/components/Slider.svelte +16 -29
  49. package/dist/svelte/components/Slider.svelte.d.ts +3 -0
  50. package/dist/svelte/components/Slider.svelte.d.ts.map +1 -1
  51. package/dist/svelte/components/SpringControl.svelte +17 -15
  52. package/dist/svelte/components/SpringControl.svelte.d.ts.map +1 -1
  53. package/dist/svelte/components/Toggle.svelte +13 -2
  54. package/dist/svelte/components/Toggle.svelte.d.ts +3 -0
  55. package/dist/svelte/components/Toggle.svelte.d.ts.map +1 -1
  56. package/dist/svelte/components/TransitionControl.svelte +28 -25
  57. package/dist/svelte/components/TransitionControl.svelte.d.ts.map +1 -1
  58. package/dist/svelte/createDialKit.svelte.d.ts +2 -1
  59. package/dist/svelte/createDialKit.svelte.d.ts.map +1 -1
  60. package/dist/svelte/createDialKit.svelte.js +1 -1
  61. package/dist/svelte/index.d.ts +6 -2
  62. package/dist/svelte/index.d.ts.map +1 -1
  63. package/dist/svelte/index.js +4 -0
  64. package/dist/svelte/theme-css.d.ts +1 -1
  65. package/dist/svelte/theme-css.d.ts.map +1 -1
  66. package/dist/svelte/theme-css.js +257 -26
  67. package/dist/vue/index.cjs +3056 -0
  68. package/dist/vue/index.cjs.map +1 -0
  69. package/dist/vue/index.d.cts +675 -0
  70. package/dist/vue/index.d.ts +675 -0
  71. package/dist/vue/index.js +3014 -0
  72. package/dist/vue/index.js.map +1 -0
  73. package/package.json +24 -4
@@ -0,0 +1,39 @@
1
+ type ShortcutMode = 'fine' | 'normal' | 'coarse';
2
+ type ShortcutInteraction = 'scroll' | 'drag' | 'move' | 'scroll-only';
3
+ type ShortcutConfig = {
4
+ key?: string;
5
+ modifier?: 'alt' | 'shift' | 'meta';
6
+ mode?: ShortcutMode;
7
+ interaction?: ShortcutInteraction;
8
+ };
9
+ type ControlMeta = {
10
+ type: 'slider' | 'toggle' | 'spring' | 'transition' | 'folder' | 'action' | 'select' | 'color' | 'text';
11
+ path: string;
12
+ label: string;
13
+ min?: number;
14
+ max?: number;
15
+ step?: number;
16
+ children?: ControlMeta[];
17
+ defaultOpen?: boolean;
18
+ options?: (string | {
19
+ value: string;
20
+ label: string;
21
+ })[];
22
+ placeholder?: string;
23
+ shortcut?: ShortcutConfig;
24
+ };
25
+
26
+ declare function decimalsForStep(step: number): number;
27
+ declare function roundValue(val: number, step: number): number;
28
+ declare function getEffectiveStep(control: ControlMeta, shortcut: ShortcutConfig): number;
29
+ declare function applySliderDelta(panelId: string, path: string, control: ControlMeta, effectiveStep: number, direction: number): void;
30
+ declare function snapToDecile(rawValue: number, min: number, max: number): number;
31
+ declare function isInputFocused(): boolean;
32
+ declare function getActiveModifier(e: KeyboardEvent | WheelEvent | MouseEvent): 'alt' | 'shift' | 'meta' | undefined;
33
+ declare function findControl(controls: ControlMeta[], path: string): ControlMeta | null;
34
+ declare const DRAG_SENSITIVITY = 4;
35
+ declare function formatInteractionLabel(interaction: string): string;
36
+ declare function formatSliderShortcut(sc: ShortcutConfig): string;
37
+ declare function formatToggleShortcut(sc: ShortcutConfig): string;
38
+
39
+ export { DRAG_SENSITIVITY, applySliderDelta, decimalsForStep, findControl, formatInteractionLabel, formatSliderShortcut, formatToggleShortcut, getActiveModifier, getEffectiveStep, isInputFocused, roundValue, snapToDecile };
@@ -0,0 +1,100 @@
1
+ // src/shortcut-utils.ts
2
+ import { DialStore } from "dialkit/store";
3
+ function decimalsForStep(step) {
4
+ const s = step.toString();
5
+ const dot = s.indexOf(".");
6
+ return dot === -1 ? 0 : s.length - dot - 1;
7
+ }
8
+ function roundValue(val, step) {
9
+ const raw = Math.round(val / step) * step;
10
+ return parseFloat(raw.toFixed(decimalsForStep(step)));
11
+ }
12
+ function getEffectiveStep(control, shortcut) {
13
+ const min = control.min ?? 0;
14
+ const max = control.max ?? 1;
15
+ const range = max - min;
16
+ const mode = shortcut.mode ?? "normal";
17
+ return mode === "fine" ? range * 0.01 : mode === "coarse" ? range * 0.1 : control.step ?? 1;
18
+ }
19
+ function applySliderDelta(panelId, path, control, effectiveStep, direction) {
20
+ const currentValue = DialStore.getValue(panelId, path);
21
+ const min = control.min ?? 0;
22
+ const max = control.max ?? 1;
23
+ const newValue = Math.max(min, Math.min(max, currentValue + direction * effectiveStep));
24
+ DialStore.updateValue(panelId, path, roundValue(newValue, effectiveStep));
25
+ }
26
+ function snapToDecile(rawValue, min, max) {
27
+ const normalized = (rawValue - min) / (max - min);
28
+ const nearest = Math.round(normalized * 10) / 10;
29
+ if (Math.abs(normalized - nearest) <= 0.03125) {
30
+ return min + nearest * (max - min);
31
+ }
32
+ return rawValue;
33
+ }
34
+ function isInputFocused() {
35
+ const el = document.activeElement;
36
+ if (!el) return false;
37
+ const tag = el.tagName;
38
+ if (tag === "INPUT" || tag === "TEXTAREA") return true;
39
+ if (el.contentEditable === "true") return true;
40
+ return false;
41
+ }
42
+ function getActiveModifier(e) {
43
+ if (e.altKey) return "alt";
44
+ if (e.shiftKey) return "shift";
45
+ if (e.metaKey) return "meta";
46
+ return void 0;
47
+ }
48
+ function findControl(controls, path) {
49
+ for (const control of controls) {
50
+ if (control.path === path) return control;
51
+ if (control.type === "folder" && control.children) {
52
+ const found = findControl(control.children, path);
53
+ if (found) return found;
54
+ }
55
+ }
56
+ return null;
57
+ }
58
+ var DRAG_SENSITIVITY = 4;
59
+ function formatInteractionLabel(interaction) {
60
+ switch (interaction) {
61
+ case "drag":
62
+ return "Drag";
63
+ case "move":
64
+ return "Move";
65
+ case "scroll-only":
66
+ return "Scroll";
67
+ default:
68
+ return "Scroll";
69
+ }
70
+ }
71
+ function formatSliderShortcut(sc) {
72
+ const interaction = sc.interaction ?? "scroll";
73
+ const actionLabel = formatInteractionLabel(interaction);
74
+ if (!sc.key) return actionLabel;
75
+ const mod = formatModifier(sc.modifier);
76
+ return `${mod}${sc.key.toUpperCase()}+${actionLabel}`;
77
+ }
78
+ function formatToggleShortcut(sc) {
79
+ if (!sc.key) return "Press";
80
+ const mod = formatModifier(sc.modifier);
81
+ return `${mod}${sc.key.toUpperCase()}`;
82
+ }
83
+ function formatModifier(modifier) {
84
+ return modifier === "alt" ? "\u2325" : modifier === "shift" ? "\u21E7" : modifier === "meta" ? "\u2318" : "";
85
+ }
86
+ export {
87
+ DRAG_SENSITIVITY,
88
+ applySliderDelta,
89
+ decimalsForStep,
90
+ findControl,
91
+ formatInteractionLabel,
92
+ formatSliderShortcut,
93
+ formatToggleShortcut,
94
+ getActiveModifier,
95
+ getEffectiveStep,
96
+ isInputFocused,
97
+ roundValue,
98
+ snapToDecile
99
+ };
100
+ //# sourceMappingURL=shortcut-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shortcut-utils.ts"],"sourcesContent":["// Shared shortcut utilities — single source of truth across all framework adapters.\n\nimport { DialStore } from './store/DialStore';\nimport type { ControlMeta, ShortcutConfig } from './store/DialStore';\n\n// ── Math helpers ──\n\nexport function decimalsForStep(step: number): number {\n const s = step.toString();\n const dot = s.indexOf('.');\n return dot === -1 ? 0 : s.length - dot - 1;\n}\n\nexport function roundValue(val: number, step: number): number {\n const raw = Math.round(val / step) * step;\n return parseFloat(raw.toFixed(decimalsForStep(step)));\n}\n\nexport function getEffectiveStep(control: ControlMeta, shortcut: ShortcutConfig): number {\n const min = control.min ?? 0;\n const max = control.max ?? 1;\n const range = max - min;\n const mode = shortcut.mode ?? 'normal';\n return mode === 'fine' ? range * 0.01\n : mode === 'coarse' ? range * 0.1\n : control.step ?? 1;\n}\n\nexport function applySliderDelta(\n panelId: string,\n path: string,\n control: ControlMeta,\n effectiveStep: number,\n direction: number\n): void {\n const currentValue = DialStore.getValue(panelId, path) as number;\n const min = control.min ?? 0;\n const max = control.max ?? 1;\n const newValue = Math.max(min, Math.min(max, currentValue + direction * effectiveStep));\n DialStore.updateValue(panelId, path, roundValue(newValue, effectiveStep));\n}\n\nexport function snapToDecile(rawValue: number, min: number, max: number): number {\n const normalized = (rawValue - min) / (max - min);\n const nearest = Math.round(normalized * 10) / 10;\n if (Math.abs(normalized - nearest) <= 0.03125) {\n return min + nearest * (max - min);\n }\n return rawValue;\n}\n\n// ── DOM helpers ──\n\nexport function isInputFocused(): boolean {\n const el = document.activeElement;\n if (!el) return false;\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA') return true;\n if ((el as HTMLElement).contentEditable === 'true') return true;\n return false;\n}\n\nexport function getActiveModifier(e: KeyboardEvent | WheelEvent | MouseEvent): 'alt' | 'shift' | 'meta' | undefined {\n if (e.altKey) return 'alt';\n if (e.shiftKey) return 'shift';\n if (e.metaKey) return 'meta';\n return undefined;\n}\n\nexport function findControl(controls: ControlMeta[], path: string): ControlMeta | null {\n for (const control of controls) {\n if (control.path === path) return control;\n if (control.type === 'folder' && control.children) {\n const found = findControl(control.children, path);\n if (found) return found;\n }\n }\n return null;\n}\n\nexport const DRAG_SENSITIVITY = 4;\n\n// ── Formatting helpers ──\n\nexport function formatInteractionLabel(interaction: string): string {\n switch (interaction) {\n case 'drag': return 'Drag';\n case 'move': return 'Move';\n case 'scroll-only': return 'Scroll';\n default: return 'Scroll';\n }\n}\n\nexport function formatSliderShortcut(sc: ShortcutConfig): string {\n const interaction = sc.interaction ?? 'scroll';\n const actionLabel = formatInteractionLabel(interaction);\n if (!sc.key) return actionLabel;\n const mod = formatModifier(sc.modifier);\n return `${mod}${sc.key.toUpperCase()}+${actionLabel}`;\n}\n\nexport function formatToggleShortcut(sc: ShortcutConfig): string {\n if (!sc.key) return 'Press';\n const mod = formatModifier(sc.modifier);\n return `${mod}${sc.key.toUpperCase()}`;\n}\n\nfunction formatModifier(modifier?: string): string {\n return modifier === 'alt' ? '\\u2325'\n : modifier === 'shift' ? '\\u21E7'\n : modifier === 'meta' ? '\\u2318'\n : '';\n}\n"],"mappings":";AAEA,SAAS,iBAAiB;AAKnB,SAAS,gBAAgB,MAAsB;AACpD,QAAM,IAAI,KAAK,SAAS;AACxB,QAAM,MAAM,EAAE,QAAQ,GAAG;AACzB,SAAO,QAAQ,KAAK,IAAI,EAAE,SAAS,MAAM;AAC3C;AAEO,SAAS,WAAW,KAAa,MAAsB;AAC5D,QAAM,MAAM,KAAK,MAAM,MAAM,IAAI,IAAI;AACrC,SAAO,WAAW,IAAI,QAAQ,gBAAgB,IAAI,CAAC,CAAC;AACtD;AAEO,SAAS,iBAAiB,SAAsB,UAAkC;AACvF,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,QAAQ,MAAM;AACpB,QAAM,OAAO,SAAS,QAAQ;AAC9B,SAAO,SAAS,SAAS,QAAQ,OAC7B,SAAS,WAAW,QAAQ,MAC5B,QAAQ,QAAQ;AACtB;AAEO,SAAS,iBACd,SACA,MACA,SACA,eACA,WACM;AACN,QAAM,eAAe,UAAU,SAAS,SAAS,IAAI;AACrD,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,eAAe,YAAY,aAAa,CAAC;AACtF,YAAU,YAAY,SAAS,MAAM,WAAW,UAAU,aAAa,CAAC;AAC1E;AAEO,SAAS,aAAa,UAAkB,KAAa,KAAqB;AAC/E,QAAM,cAAc,WAAW,QAAQ,MAAM;AAC7C,QAAM,UAAU,KAAK,MAAM,aAAa,EAAE,IAAI;AAC9C,MAAI,KAAK,IAAI,aAAa,OAAO,KAAK,SAAS;AAC7C,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC;AACA,SAAO;AACT;AAIO,SAAS,iBAA0B;AACxC,QAAM,KAAK,SAAS;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,MAAM,GAAG;AACf,MAAI,QAAQ,WAAW,QAAQ,WAAY,QAAO;AAClD,MAAK,GAAmB,oBAAoB,OAAQ,QAAO;AAC3D,SAAO;AACT;AAEO,SAAS,kBAAkB,GAAkF;AAClH,MAAI,EAAE,OAAQ,QAAO;AACrB,MAAI,EAAE,SAAU,QAAO;AACvB,MAAI,EAAE,QAAS,QAAO;AACtB,SAAO;AACT;AAEO,SAAS,YAAY,UAAyB,MAAkC;AACrF,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,KAAM,QAAO;AAClC,QAAI,QAAQ,SAAS,YAAY,QAAQ,UAAU;AACjD,YAAM,QAAQ,YAAY,QAAQ,UAAU,IAAI;AAChD,UAAI,MAAO,QAAO;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,mBAAmB;AAIzB,SAAS,uBAAuB,aAA6B;AAClE,UAAQ,aAAa;AAAA,IACnB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAe,aAAO;AAAA,IAC3B;AAAS,aAAO;AAAA,EAClB;AACF;AAEO,SAAS,qBAAqB,IAA4B;AAC/D,QAAM,cAAc,GAAG,eAAe;AACtC,QAAM,cAAc,uBAAuB,WAAW;AACtD,MAAI,CAAC,GAAG,IAAK,QAAO;AACpB,QAAM,MAAM,eAAe,GAAG,QAAQ;AACtC,SAAO,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,WAAW;AACrD;AAEO,SAAS,qBAAqB,IAA4B;AAC/D,MAAI,CAAC,GAAG,IAAK,QAAO;AACpB,QAAM,MAAM,eAAe,GAAG,QAAQ;AACtC,SAAO,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,CAAC;AACtC;AAEA,SAAS,eAAe,UAA2B;AACjD,SAAO,aAAa,QAAQ,WACxB,aAAa,UAAU,WACvB,aAAa,SAAS,WACtB;AACN;","names":[]}