@mappoh/nova 0.2.2 → 0.3.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 (90) hide show
  1. package/LICENSE +21 -0
  2. package/dist/a11y/index.d.ts +40 -0
  3. package/dist/a11y/index.d.ts.map +1 -0
  4. package/dist/a11y/index.js +162 -0
  5. package/dist/a11y/index.js.map +1 -0
  6. package/dist/animation/flip.d.ts +28 -0
  7. package/dist/animation/flip.d.ts.map +1 -0
  8. package/dist/animation/flip.js +106 -0
  9. package/dist/animation/flip.js.map +1 -0
  10. package/dist/animation/spring.d.ts +34 -0
  11. package/dist/animation/spring.d.ts.map +1 -0
  12. package/dist/animation/spring.js +86 -0
  13. package/dist/animation/spring.js.map +1 -0
  14. package/dist/chart/chart.d.ts +27 -0
  15. package/dist/chart/chart.d.ts.map +1 -0
  16. package/dist/chart/chart.js +289 -0
  17. package/dist/chart/chart.js.map +1 -0
  18. package/dist/chart/index.d.ts +3 -0
  19. package/dist/chart/index.d.ts.map +1 -0
  20. package/dist/chart/index.js +2 -0
  21. package/dist/chart/index.js.map +1 -0
  22. package/dist/color-picker/color-picker.d.ts +18 -0
  23. package/dist/color-picker/color-picker.d.ts.map +1 -0
  24. package/dist/color-picker/color-picker.js +243 -0
  25. package/dist/color-picker/color-picker.js.map +1 -0
  26. package/dist/color-picker/index.d.ts +3 -0
  27. package/dist/color-picker/index.d.ts.map +1 -0
  28. package/dist/color-picker/index.js +2 -0
  29. package/dist/color-picker/index.js.map +1 -0
  30. package/dist/combobox/combobox.d.ts +26 -0
  31. package/dist/combobox/combobox.d.ts.map +1 -0
  32. package/dist/combobox/combobox.js +262 -0
  33. package/dist/combobox/combobox.js.map +1 -0
  34. package/dist/combobox/index.d.ts +3 -0
  35. package/dist/combobox/index.d.ts.map +1 -0
  36. package/dist/combobox/index.js +2 -0
  37. package/dist/combobox/index.js.map +1 -0
  38. package/dist/data-table/data-table.d.ts +34 -0
  39. package/dist/data-table/data-table.d.ts.map +1 -0
  40. package/dist/data-table/data-table.js +256 -0
  41. package/dist/data-table/data-table.js.map +1 -0
  42. package/dist/data-table/index.d.ts +3 -0
  43. package/dist/data-table/index.d.ts.map +1 -0
  44. package/dist/data-table/index.js +2 -0
  45. package/dist/data-table/index.js.map +1 -0
  46. package/dist/date-picker/date-picker.d.ts +22 -0
  47. package/dist/date-picker/date-picker.d.ts.map +1 -0
  48. package/dist/date-picker/date-picker.js +282 -0
  49. package/dist/date-picker/date-picker.js.map +1 -0
  50. package/dist/date-picker/index.d.ts +3 -0
  51. package/dist/date-picker/index.d.ts.map +1 -0
  52. package/dist/date-picker/index.js +2 -0
  53. package/dist/date-picker/index.js.map +1 -0
  54. package/dist/file-upload/file-upload.d.ts +24 -0
  55. package/dist/file-upload/file-upload.d.ts.map +1 -0
  56. package/dist/file-upload/file-upload.js +177 -0
  57. package/dist/file-upload/file-upload.js.map +1 -0
  58. package/dist/file-upload/index.d.ts +3 -0
  59. package/dist/file-upload/index.d.ts.map +1 -0
  60. package/dist/file-upload/index.js +2 -0
  61. package/dist/file-upload/index.js.map +1 -0
  62. package/dist/forms/form-engine.d.ts +19 -6
  63. package/dist/forms/form-engine.d.ts.map +1 -1
  64. package/dist/forms/form-engine.js +97 -11
  65. package/dist/forms/form-engine.js.map +1 -1
  66. package/dist/forms/validators.d.ts +4 -0
  67. package/dist/forms/validators.d.ts.map +1 -1
  68. package/dist/forms/validators.js +6 -0
  69. package/dist/forms/validators.js.map +1 -1
  70. package/dist/router/index.d.ts +1 -1
  71. package/dist/router/index.d.ts.map +1 -1
  72. package/dist/router/index.js +1 -1
  73. package/dist/router/index.js.map +1 -1
  74. package/dist/router/router.d.ts +14 -0
  75. package/dist/router/router.d.ts.map +1 -1
  76. package/dist/router/router.js +44 -6
  77. package/dist/router/router.js.map +1 -1
  78. package/dist/state/store.d.ts +4 -0
  79. package/dist/state/store.d.ts.map +1 -1
  80. package/dist/state/store.js +27 -7
  81. package/dist/state/store.js.map +1 -1
  82. package/dist/tree-view/index.d.ts +3 -0
  83. package/dist/tree-view/index.d.ts.map +1 -0
  84. package/dist/tree-view/index.js +2 -0
  85. package/dist/tree-view/index.js.map +1 -0
  86. package/dist/tree-view/tree-view.d.ts +29 -0
  87. package/dist/tree-view/tree-view.d.ts.map +1 -0
  88. package/dist/tree-view/tree-view.js +273 -0
  89. package/dist/tree-view/tree-view.js.map +1 -0
  90. package/package.json +65 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 mappoh
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Nova Engine — Accessibility Utilities
3
+ *
4
+ * Reusable focus management, keyboard navigation,
5
+ * screen reader announcements, and ARIA helpers.
6
+ */
7
+ /** Generate a unique ID for ARIA attribute linking. */
8
+ export declare function uniqueId(prefix?: string): string;
9
+ /** Check if user prefers reduced motion. */
10
+ export declare function prefersReducedMotion(): boolean;
11
+ /**
12
+ * Trap focus within a container element.
13
+ * Pressing Tab/Shift+Tab cycles through focusable elements inside.
14
+ * Returns a cleanup function to remove the trap.
15
+ */
16
+ export declare function trapFocus(container: HTMLElement): () => void;
17
+ export interface RovingOptions {
18
+ /** Arrow key orientation. Default: 'horizontal' */
19
+ orientation?: 'horizontal' | 'vertical' | 'both';
20
+ /** Wrap around at edges. Default: true */
21
+ wrap?: boolean;
22
+ }
23
+ /**
24
+ * Set up roving tabindex keyboard navigation within a container.
25
+ * Items matching the selector get tabindex management and arrow key navigation.
26
+ * Returns a cleanup function.
27
+ */
28
+ export declare function rovingTabIndex(container: HTMLElement, selector: string, options?: RovingOptions): () => void;
29
+ /**
30
+ * Announce a message to screen readers via a live region.
31
+ * @param message Text to announce
32
+ * @param priority 'polite' (default) or 'assertive'
33
+ */
34
+ export declare function announce(message: string, priority?: 'polite' | 'assertive'): void;
35
+ /**
36
+ * Create a skip-to-content link.
37
+ * Returns the anchor element — append it to the page.
38
+ */
39
+ export declare function skipLink(targetId: string, label?: string): HTMLAnchorElement;
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/a11y/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,uDAAuD;AACvD,wBAAgB,QAAQ,CAAC,MAAM,SAAS,GAAG,MAAM,CAEhD;AAED,4CAA4C;AAC5C,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,WAAW,GAAG,MAAM,IAAI,CA8B5D;AAED,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;IACjD,0CAA0C;IAC1C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,aAAkB,GAC1B,MAAM,IAAI,CA+CZ;AAID;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAQ,GAAG,WAAsB,GAAG,IAAI,CA4B3F;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAoB,GAAG,iBAAiB,CAwBvF"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Nova Engine — Accessibility Utilities
3
+ *
4
+ * Reusable focus management, keyboard navigation,
5
+ * screen reader announcements, and ARIA helpers.
6
+ */
7
+ const FOCUSABLE = 'a[href],button:not([disabled]),input:not([disabled]),textarea:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex="-1"])';
8
+ let idCounter = 0;
9
+ /** Generate a unique ID for ARIA attribute linking. */
10
+ export function uniqueId(prefix = 'nova') {
11
+ return `${prefix}-${++idCounter}`;
12
+ }
13
+ /** Check if user prefers reduced motion. */
14
+ export function prefersReducedMotion() {
15
+ return typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
16
+ }
17
+ /**
18
+ * Trap focus within a container element.
19
+ * Pressing Tab/Shift+Tab cycles through focusable elements inside.
20
+ * Returns a cleanup function to remove the trap.
21
+ */
22
+ export function trapFocus(container) {
23
+ function handleKeydown(e) {
24
+ if (e.key !== 'Tab')
25
+ return;
26
+ const focusable = Array.from(container.querySelectorAll(FOCUSABLE));
27
+ if (focusable.length === 0)
28
+ return;
29
+ const first = focusable[0];
30
+ const last = focusable[focusable.length - 1];
31
+ if (e.shiftKey) {
32
+ if (document.activeElement === first) {
33
+ e.preventDefault();
34
+ last.focus();
35
+ }
36
+ }
37
+ else {
38
+ if (document.activeElement === last) {
39
+ e.preventDefault();
40
+ first.focus();
41
+ }
42
+ }
43
+ }
44
+ container.addEventListener('keydown', handleKeydown);
45
+ // Focus first element on trap activation
46
+ const first = container.querySelector(FOCUSABLE);
47
+ first?.focus();
48
+ return () => container.removeEventListener('keydown', handleKeydown);
49
+ }
50
+ /**
51
+ * Set up roving tabindex keyboard navigation within a container.
52
+ * Items matching the selector get tabindex management and arrow key navigation.
53
+ * Returns a cleanup function.
54
+ */
55
+ export function rovingTabIndex(container, selector, options = {}) {
56
+ const { orientation = 'horizontal', wrap = true } = options;
57
+ function getItems() {
58
+ return Array.from(container.querySelectorAll(selector));
59
+ }
60
+ function init() {
61
+ const items = getItems();
62
+ items.forEach((item, i) => {
63
+ item.setAttribute('tabindex', i === 0 ? '0' : '-1');
64
+ });
65
+ }
66
+ function handleKeydown(e) {
67
+ const items = getItems();
68
+ const current = items.indexOf(e.target);
69
+ if (current === -1)
70
+ return;
71
+ let next = -1;
72
+ const prevKeys = orientation === 'vertical' ? ['ArrowUp'] : orientation === 'horizontal' ? ['ArrowLeft'] : ['ArrowUp', 'ArrowLeft'];
73
+ const nextKeys = orientation === 'vertical' ? ['ArrowDown'] : orientation === 'horizontal' ? ['ArrowRight'] : ['ArrowDown', 'ArrowRight'];
74
+ if (nextKeys.includes(e.key)) {
75
+ next = current + 1;
76
+ if (next >= items.length)
77
+ next = wrap ? 0 : current;
78
+ }
79
+ else if (prevKeys.includes(e.key)) {
80
+ next = current - 1;
81
+ if (next < 0)
82
+ next = wrap ? items.length - 1 : current;
83
+ }
84
+ else if (e.key === 'Home') {
85
+ next = 0;
86
+ }
87
+ else if (e.key === 'End') {
88
+ next = items.length - 1;
89
+ }
90
+ if (next !== -1 && next !== current) {
91
+ e.preventDefault();
92
+ items[current].setAttribute('tabindex', '-1');
93
+ items[next].setAttribute('tabindex', '0');
94
+ items[next].focus();
95
+ }
96
+ }
97
+ init();
98
+ container.addEventListener('keydown', handleKeydown);
99
+ return () => container.removeEventListener('keydown', handleKeydown);
100
+ }
101
+ let announceEl = null;
102
+ /**
103
+ * Announce a message to screen readers via a live region.
104
+ * @param message Text to announce
105
+ * @param priority 'polite' (default) or 'assertive'
106
+ */
107
+ export function announce(message, priority = 'polite') {
108
+ if (typeof document === 'undefined')
109
+ return;
110
+ if (!announceEl) {
111
+ announceEl = document.createElement('div');
112
+ announceEl.setAttribute('aria-live', priority);
113
+ announceEl.setAttribute('aria-atomic', 'true');
114
+ Object.assign(announceEl.style, {
115
+ position: 'absolute',
116
+ width: '1px',
117
+ height: '1px',
118
+ padding: '0',
119
+ margin: '-1px',
120
+ overflow: 'hidden',
121
+ clip: 'rect(0,0,0,0)',
122
+ whiteSpace: 'nowrap',
123
+ border: '0',
124
+ });
125
+ document.body.appendChild(announceEl);
126
+ }
127
+ announceEl.setAttribute('aria-live', priority);
128
+ announceEl.textContent = '';
129
+ // Force screen reader to re-announce by clearing then setting
130
+ requestAnimationFrame(() => {
131
+ if (announceEl)
132
+ announceEl.textContent = message;
133
+ });
134
+ }
135
+ /**
136
+ * Create a skip-to-content link.
137
+ * Returns the anchor element — append it to the page.
138
+ */
139
+ export function skipLink(targetId, label = 'Skip to content') {
140
+ const link = document.createElement('a');
141
+ link.href = `#${targetId}`;
142
+ link.textContent = label;
143
+ link.className = 'nova-skip-link';
144
+ Object.assign(link.style, {
145
+ position: 'absolute',
146
+ top: '-100%',
147
+ left: '0',
148
+ zIndex: '10000',
149
+ padding: '0.5rem 1rem',
150
+ background: '#000',
151
+ color: '#fff',
152
+ textDecoration: 'none',
153
+ });
154
+ link.addEventListener('focus', () => {
155
+ link.style.top = '0';
156
+ });
157
+ link.addEventListener('blur', () => {
158
+ link.style.top = '-100%';
159
+ });
160
+ return link;
161
+ }
162
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Nova Engine — FLIP Animations
3
+ *
4
+ * First-Last-Invert-Play pattern for smooth layout transitions.
5
+ */
6
+ export interface FlipOptions {
7
+ /** Animation duration in ms. Default: 300 */
8
+ duration?: number;
9
+ /** CSS easing function. Default: 'ease-out' */
10
+ easing?: string;
11
+ }
12
+ /**
13
+ * Perform a FLIP animation around a DOM mutation.
14
+ *
15
+ * 1. Records bounding rects of all elements (First)
16
+ * 2. Runs the mutation callback (Last)
17
+ * 3. Calculates position/size deltas (Invert)
18
+ * 4. Animates from inverted position to final position (Play)
19
+ */
20
+ export declare function flip(elements: HTMLElement | HTMLElement[], mutation: () => void | Promise<void>, options?: FlipOptions): Promise<void>;
21
+ /**
22
+ * Auto-FLIP: wraps a container and automatically animates its
23
+ * direct children when they are added, removed, or reordered.
24
+ *
25
+ * Returns a cleanup function to stop observing.
26
+ */
27
+ export declare function autoFlip(container: HTMLElement, options?: FlipOptions): () => void;
28
+ //# sourceMappingURL=flip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flip.d.ts","sourceRoot":"","sources":["../../src/animation/flip.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD;;;;;;;GAOG;AACH,wBAAsB,IAAI,CACxB,QAAQ,EAAE,WAAW,GAAG,WAAW,EAAE,EACrC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACpC,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,SAAS,EAAE,WAAW,EACtB,OAAO,GAAE,WAAgB,GACxB,MAAM,IAAI,CA8DZ"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Nova Engine — FLIP Animations
3
+ *
4
+ * First-Last-Invert-Play pattern for smooth layout transitions.
5
+ */
6
+ const prefersReduced = () => typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
7
+ /**
8
+ * Perform a FLIP animation around a DOM mutation.
9
+ *
10
+ * 1. Records bounding rects of all elements (First)
11
+ * 2. Runs the mutation callback (Last)
12
+ * 3. Calculates position/size deltas (Invert)
13
+ * 4. Animates from inverted position to final position (Play)
14
+ */
15
+ export async function flip(elements, mutation, options = {}) {
16
+ const { duration = 300, easing = 'ease-out' } = options;
17
+ const els = Array.isArray(elements) ? elements : [elements];
18
+ // First: record initial positions
19
+ const firstRects = new Map();
20
+ for (const el of els) {
21
+ firstRects.set(el, el.getBoundingClientRect());
22
+ }
23
+ // Mutation: apply DOM changes
24
+ await mutation();
25
+ // Reduced motion: skip animation
26
+ if (prefersReduced() || duration === 0)
27
+ return;
28
+ // Last + Invert + Play
29
+ const animations = [];
30
+ for (const el of els) {
31
+ const first = firstRects.get(el);
32
+ if (!first)
33
+ continue;
34
+ const last = el.getBoundingClientRect();
35
+ const dx = first.left - last.left;
36
+ const dy = first.top - last.top;
37
+ const dw = first.width / (last.width || 1);
38
+ const dh = first.height / (last.height || 1);
39
+ // Skip if nothing moved
40
+ if (dx === 0 && dy === 0 && dw === 1 && dh === 1)
41
+ continue;
42
+ const anim = el.animate([
43
+ { transform: `translate(${dx}px, ${dy}px) scale(${dw}, ${dh})` },
44
+ { transform: 'translate(0, 0) scale(1, 1)' },
45
+ ], { duration, easing, fill: 'none' });
46
+ animations.push(anim);
47
+ }
48
+ // Wait for all animations to complete
49
+ await Promise.all(animations.map((a) => a.finished));
50
+ }
51
+ /**
52
+ * Auto-FLIP: wraps a container and automatically animates its
53
+ * direct children when they are added, removed, or reordered.
54
+ *
55
+ * Returns a cleanup function to stop observing.
56
+ */
57
+ export function autoFlip(container, options = {}) {
58
+ const { duration = 300, easing = 'ease-out' } = options;
59
+ const observer = new MutationObserver((mutations) => {
60
+ if (prefersReduced())
61
+ return;
62
+ // Collect all children that existed before the mutation
63
+ const rects = new Map();
64
+ for (const m of mutations) {
65
+ for (const node of m.addedNodes) {
66
+ if (node instanceof HTMLElement) {
67
+ // New nodes fade in
68
+ node.animate([{ opacity: 0 }, { opacity: 1 }], { duration: duration / 2, easing });
69
+ }
70
+ }
71
+ }
72
+ // Animate existing children from their old positions
73
+ const children = Array.from(container.children);
74
+ for (const child of children) {
75
+ const rect = rects.get(child);
76
+ if (!rect)
77
+ continue;
78
+ const last = child.getBoundingClientRect();
79
+ const dx = rect.left - last.left;
80
+ const dy = rect.top - last.top;
81
+ if (dx !== 0 || dy !== 0) {
82
+ child.animate([
83
+ { transform: `translate(${dx}px, ${dy}px)` },
84
+ { transform: 'translate(0, 0)' },
85
+ ], { duration, easing });
86
+ }
87
+ }
88
+ });
89
+ // Before mutations, snapshot positions
90
+ const childRects = new Map();
91
+ function snapshot() {
92
+ childRects.clear();
93
+ for (const child of Array.from(container.children)) {
94
+ childRects.set(child, child.getBoundingClientRect());
95
+ }
96
+ }
97
+ // Use a MutationObserver to detect changes
98
+ observer.observe(container, { childList: true });
99
+ // Expose snapshot for manual triggering before DOM mutations
100
+ container.__flipSnapshot = snapshot;
101
+ return () => {
102
+ observer.disconnect();
103
+ delete container.__flipSnapshot;
104
+ };
105
+ }
106
+ //# sourceMappingURL=flip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flip.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Nova Engine — Spring Animations
3
+ *
4
+ * Physics-based spring animation using the global ticker loop.
5
+ */
6
+ export interface SpringOptions {
7
+ /** Spring stiffness. Default: 170 */
8
+ stiffness?: number;
9
+ /** Damping coefficient. Default: 26 */
10
+ damping?: number;
11
+ /** Mass. Default: 1 */
12
+ mass?: number;
13
+ /** Precision threshold for settling. Default: 0.01 */
14
+ precision?: number;
15
+ }
16
+ export interface SpringResult {
17
+ /** Cancel the animation */
18
+ cancel: () => void;
19
+ /** Resolves when the spring reaches equilibrium */
20
+ finished: Promise<void>;
21
+ }
22
+ /**
23
+ * Animate an element's CSS property with spring physics.
24
+ *
25
+ * The property must be a numeric CSS property (e.g. 'opacity', 'transform').
26
+ * For transform, pass the full value with a single numeric component.
27
+ */
28
+ export declare function spring(target: HTMLElement, property: string, to: number, options?: SpringOptions): SpringResult;
29
+ /**
30
+ * Animate a numeric value with spring physics.
31
+ * Calls onUpdate each frame with the current value.
32
+ */
33
+ export declare function springValue(from: number, to: number, onUpdate: (value: number) => void, options?: SpringOptions): SpringResult;
34
+ //# sourceMappingURL=spring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring.d.ts","sourceRoot":"","sources":["../../src/animation/spring.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,mDAAmD;IACnD,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAOD;;;;;GAKG;AACH,wBAAgB,MAAM,CACpB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,aAAkB,GAC1B,YAAY,CAgDd;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EACjC,OAAO,GAAE,aAAkB,GAC1B,YAAY,CA6Cd"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Nova Engine — Spring Animations
3
+ *
4
+ * Physics-based spring animation using the global ticker loop.
5
+ */
6
+ import { ticker } from './ticker';
7
+ let springId = 0;
8
+ const prefersReduced = () => typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
9
+ /**
10
+ * Animate an element's CSS property with spring physics.
11
+ *
12
+ * The property must be a numeric CSS property (e.g. 'opacity', 'transform').
13
+ * For transform, pass the full value with a single numeric component.
14
+ */
15
+ export function spring(target, property, to, options = {}) {
16
+ const { stiffness = 170, damping = 26, mass = 1, precision = 0.01, } = options;
17
+ const id = `nova-spring-${++springId}`;
18
+ // Reduced motion: instant jump
19
+ if (prefersReduced()) {
20
+ target.style.setProperty(property, String(to));
21
+ return { cancel: () => { }, finished: Promise.resolve() };
22
+ }
23
+ let current = parseFloat(getComputedStyle(target).getPropertyValue(property)) || 0;
24
+ let velocity = 0;
25
+ let resolve;
26
+ const finished = new Promise((r) => { resolve = r; });
27
+ ticker.add(id, (delta) => {
28
+ const force = stiffness * (to - current);
29
+ const dampingForce = damping * velocity;
30
+ const acceleration = (force - dampingForce) / mass;
31
+ velocity += acceleration * delta;
32
+ current += velocity * delta;
33
+ target.style.setProperty(property, String(current));
34
+ // Check if settled
35
+ if (Math.abs(velocity) < precision && Math.abs(to - current) < precision) {
36
+ current = to;
37
+ target.style.setProperty(property, String(to));
38
+ ticker.remove(id);
39
+ resolve();
40
+ }
41
+ });
42
+ return {
43
+ cancel: () => {
44
+ ticker.remove(id);
45
+ resolve();
46
+ },
47
+ finished,
48
+ };
49
+ }
50
+ /**
51
+ * Animate a numeric value with spring physics.
52
+ * Calls onUpdate each frame with the current value.
53
+ */
54
+ export function springValue(from, to, onUpdate, options = {}) {
55
+ const { stiffness = 170, damping = 26, mass = 1, precision = 0.01, } = options;
56
+ const id = `nova-spring-${++springId}`;
57
+ if (prefersReduced()) {
58
+ onUpdate(to);
59
+ return { cancel: () => { }, finished: Promise.resolve() };
60
+ }
61
+ let current = from;
62
+ let velocity = 0;
63
+ let resolve;
64
+ const finished = new Promise((r) => { resolve = r; });
65
+ ticker.add(id, (delta) => {
66
+ const force = stiffness * (to - current);
67
+ const dampingForce = damping * velocity;
68
+ const acceleration = (force - dampingForce) / mass;
69
+ velocity += acceleration * delta;
70
+ current += velocity * delta;
71
+ onUpdate(current);
72
+ if (Math.abs(velocity) < precision && Math.abs(to - current) < precision) {
73
+ onUpdate(to);
74
+ ticker.remove(id);
75
+ resolve();
76
+ }
77
+ });
78
+ return {
79
+ cancel: () => {
80
+ ticker.remove(id);
81
+ resolve();
82
+ },
83
+ finished,
84
+ };
85
+ }
86
+ //# sourceMappingURL=spring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Nova Engine — SVG Charts
3
+ *
4
+ * Lightweight SVG-based charts: bar, line, pie, and donut.
5
+ * No canvas or external dependencies.
6
+ */
7
+ export interface ChartDataset {
8
+ label?: string;
9
+ data: number[];
10
+ color?: string;
11
+ }
12
+ export interface ChartOptions {
13
+ type: 'bar' | 'line' | 'pie' | 'donut';
14
+ labels?: string[];
15
+ datasets: ChartDataset[];
16
+ width?: number;
17
+ height?: number;
18
+ showGrid?: boolean;
19
+ showLegend?: boolean;
20
+ animate?: boolean;
21
+ }
22
+ export interface ChartInstance {
23
+ update(datasets: ChartDataset[]): void;
24
+ destroy(): void;
25
+ }
26
+ export declare function createChart(container: HTMLElement, options: ChartOptions): ChartInstance;
27
+ //# sourceMappingURL=chart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../src/chart/chart.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IACvC,OAAO,IAAI,IAAI,CAAC;CACjB;AAiOD,wBAAgB,WAAW,CACzB,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,YAAY,GACpB,aAAa,CA2Ff"}