@mappoh/nova 0.3.0 → 0.5.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 (252) hide show
  1. package/README.md +180 -30
  2. package/dist/alert/alert.d.ts +32 -0
  3. package/dist/alert/alert.d.ts.map +1 -0
  4. package/dist/alert/alert.js +307 -0
  5. package/dist/alert/alert.js.map +1 -0
  6. package/dist/alert/index.d.ts +3 -0
  7. package/dist/alert/index.d.ts.map +1 -0
  8. package/dist/alert/index.js +2 -0
  9. package/dist/alert/index.js.map +1 -0
  10. package/dist/animation/flip.d.ts.map +1 -1
  11. package/dist/animation/flip.js +19 -12
  12. package/dist/animation/flip.js.map +1 -1
  13. package/dist/animation/stagger.d.ts +43 -0
  14. package/dist/animation/stagger.d.ts.map +1 -0
  15. package/dist/animation/stagger.js +150 -0
  16. package/dist/animation/stagger.js.map +1 -0
  17. package/dist/avatar/avatar.d.ts +27 -0
  18. package/dist/avatar/avatar.d.ts.map +1 -0
  19. package/dist/avatar/avatar.js +132 -0
  20. package/dist/avatar/avatar.js.map +1 -0
  21. package/dist/avatar/index.d.ts +3 -0
  22. package/dist/avatar/index.d.ts.map +1 -0
  23. package/dist/avatar/index.js +2 -0
  24. package/dist/avatar/index.js.map +1 -0
  25. package/dist/badge/badge.d.ts +27 -0
  26. package/dist/badge/badge.d.ts.map +1 -0
  27. package/dist/badge/badge.js +118 -0
  28. package/dist/badge/badge.js.map +1 -0
  29. package/dist/badge/index.d.ts +3 -0
  30. package/dist/badge/index.d.ts.map +1 -0
  31. package/dist/badge/index.js +2 -0
  32. package/dist/badge/index.js.map +1 -0
  33. package/dist/cache/cache.d.ts +28 -0
  34. package/dist/cache/cache.d.ts.map +1 -0
  35. package/dist/cache/cache.js +67 -0
  36. package/dist/cache/cache.js.map +1 -0
  37. package/dist/cache/index.d.ts +3 -0
  38. package/dist/cache/index.d.ts.map +1 -0
  39. package/dist/cache/index.js +2 -0
  40. package/dist/cache/index.js.map +1 -0
  41. package/dist/chart/chart.d.ts +4 -0
  42. package/dist/chart/chart.d.ts.map +1 -1
  43. package/dist/chart/chart.js +89 -6
  44. package/dist/chart/chart.js.map +1 -1
  45. package/dist/command-palette/command-palette.d.ts +31 -0
  46. package/dist/command-palette/command-palette.d.ts.map +1 -0
  47. package/dist/command-palette/command-palette.js +590 -0
  48. package/dist/command-palette/command-palette.js.map +1 -0
  49. package/dist/command-palette/index.d.ts +3 -0
  50. package/dist/command-palette/index.d.ts.map +1 -0
  51. package/dist/command-palette/index.js +2 -0
  52. package/dist/command-palette/index.js.map +1 -0
  53. package/dist/component/component.d.ts +21 -2
  54. package/dist/component/component.d.ts.map +1 -1
  55. package/dist/component/component.js +127 -7
  56. package/dist/component/component.js.map +1 -1
  57. package/dist/component/connect.d.ts +52 -0
  58. package/dist/component/connect.d.ts.map +1 -1
  59. package/dist/component/connect.js +151 -25
  60. package/dist/component/connect.js.map +1 -1
  61. package/dist/component/directives.d.ts +20 -0
  62. package/dist/component/directives.d.ts.map +1 -0
  63. package/dist/component/directives.js +42 -0
  64. package/dist/component/directives.js.map +1 -0
  65. package/dist/component/html.d.ts +8 -0
  66. package/dist/component/html.d.ts.map +1 -1
  67. package/dist/component/html.js +11 -0
  68. package/dist/component/html.js.map +1 -1
  69. package/dist/component/index.d.ts +9 -3
  70. package/dist/component/index.d.ts.map +1 -1
  71. package/dist/component/index.js +6 -2
  72. package/dist/component/index.js.map +1 -1
  73. package/dist/component/portal.d.ts +32 -0
  74. package/dist/component/portal.d.ts.map +1 -0
  75. package/dist/component/portal.js +70 -0
  76. package/dist/component/portal.js.map +1 -0
  77. package/dist/component/ref.d.ts +18 -0
  78. package/dist/component/ref.d.ts.map +1 -0
  79. package/dist/component/ref.js +17 -0
  80. package/dist/component/ref.js.map +1 -0
  81. package/dist/component/slot-styles.d.ts +18 -0
  82. package/dist/component/slot-styles.d.ts.map +1 -0
  83. package/dist/component/slot-styles.js +94 -0
  84. package/dist/component/slot-styles.js.map +1 -0
  85. package/dist/component/template.d.ts +2 -0
  86. package/dist/component/template.d.ts.map +1 -1
  87. package/dist/component/template.js +122 -4
  88. package/dist/component/template.js.map +1 -1
  89. package/dist/context/context.d.ts +39 -0
  90. package/dist/context/context.d.ts.map +1 -0
  91. package/dist/context/context.js +111 -0
  92. package/dist/context/context.js.map +1 -0
  93. package/dist/context/index.d.ts +3 -0
  94. package/dist/context/index.d.ts.map +1 -0
  95. package/dist/context/index.js +2 -0
  96. package/dist/context/index.js.map +1 -0
  97. package/dist/devtools/devtools.d.ts +54 -0
  98. package/dist/devtools/devtools.d.ts.map +1 -1
  99. package/dist/devtools/devtools.js +86 -0
  100. package/dist/devtools/devtools.js.map +1 -1
  101. package/dist/devtools/index.d.ts +2 -2
  102. package/dist/devtools/index.d.ts.map +1 -1
  103. package/dist/devtools/index.js +1 -1
  104. package/dist/devtools/index.js.map +1 -1
  105. package/dist/editor/editor.d.ts +40 -0
  106. package/dist/editor/editor.d.ts.map +1 -0
  107. package/dist/editor/editor.js +955 -0
  108. package/dist/editor/editor.js.map +1 -0
  109. package/dist/editor/index.d.ts +3 -0
  110. package/dist/editor/index.d.ts.map +1 -0
  111. package/dist/editor/index.js +2 -0
  112. package/dist/editor/index.js.map +1 -0
  113. package/dist/event-bus/event-bus.d.ts +20 -0
  114. package/dist/event-bus/event-bus.d.ts.map +1 -0
  115. package/dist/event-bus/event-bus.js +55 -0
  116. package/dist/event-bus/event-bus.js.map +1 -0
  117. package/dist/event-bus/index.d.ts +3 -0
  118. package/dist/event-bus/index.d.ts.map +1 -0
  119. package/dist/event-bus/index.js +2 -0
  120. package/dist/event-bus/index.js.map +1 -0
  121. package/dist/forms/form-engine.d.ts +1 -1
  122. package/dist/forms/form-engine.d.ts.map +1 -1
  123. package/dist/forms/wasm-validators.d.ts +19 -11
  124. package/dist/forms/wasm-validators.d.ts.map +1 -1
  125. package/dist/forms/wasm-validators.js +191 -31
  126. package/dist/forms/wasm-validators.js.map +1 -1
  127. package/dist/gesture/gesture.d.ts +2 -0
  128. package/dist/gesture/gesture.d.ts.map +1 -1
  129. package/dist/gesture/gesture.js +81 -0
  130. package/dist/gesture/gesture.js.map +1 -1
  131. package/dist/http/http.d.ts +8 -0
  132. package/dist/http/http.d.ts.map +1 -1
  133. package/dist/http/http.js +18 -4
  134. package/dist/http/http.js.map +1 -1
  135. package/dist/i18n/i18n.d.ts +6 -0
  136. package/dist/i18n/i18n.d.ts.map +1 -1
  137. package/dist/i18n/i18n.js +71 -9
  138. package/dist/i18n/i18n.js.map +1 -1
  139. package/dist/machine/index.d.ts +3 -0
  140. package/dist/machine/index.d.ts.map +1 -0
  141. package/dist/machine/index.js +2 -0
  142. package/dist/machine/index.js.map +1 -0
  143. package/dist/machine/machine.d.ts +26 -0
  144. package/dist/machine/machine.d.ts.map +1 -0
  145. package/dist/machine/machine.js +79 -0
  146. package/dist/machine/machine.js.map +1 -0
  147. package/dist/modal/modal.d.ts.map +1 -1
  148. package/dist/modal/modal.js +13 -29
  149. package/dist/modal/modal.js.map +1 -1
  150. package/dist/notification-center/index.d.ts +3 -0
  151. package/dist/notification-center/index.d.ts.map +1 -0
  152. package/dist/notification-center/index.js +2 -0
  153. package/dist/notification-center/index.js.map +1 -0
  154. package/dist/notification-center/notification-center.d.ts +55 -0
  155. package/dist/notification-center/notification-center.d.ts.map +1 -0
  156. package/dist/notification-center/notification-center.js +941 -0
  157. package/dist/notification-center/notification-center.js.map +1 -0
  158. package/dist/pagination/index.d.ts +3 -0
  159. package/dist/pagination/index.d.ts.map +1 -0
  160. package/dist/pagination/index.js +2 -0
  161. package/dist/pagination/index.js.map +1 -0
  162. package/dist/pagination/pagination.d.ts +31 -0
  163. package/dist/pagination/pagination.d.ts.map +1 -0
  164. package/dist/pagination/pagination.js +213 -0
  165. package/dist/pagination/pagination.js.map +1 -0
  166. package/dist/progress/progress.d.ts.map +1 -1
  167. package/dist/progress/progress.js +5 -7
  168. package/dist/progress/progress.js.map +1 -1
  169. package/dist/query/index.d.ts +3 -0
  170. package/dist/query/index.d.ts.map +1 -0
  171. package/dist/query/index.js +2 -0
  172. package/dist/query/index.js.map +1 -0
  173. package/dist/query/query.d.ts +31 -0
  174. package/dist/query/query.d.ts.map +1 -0
  175. package/dist/query/query.js +150 -0
  176. package/dist/query/query.js.map +1 -0
  177. package/dist/radio-group/index.d.ts +3 -0
  178. package/dist/radio-group/index.d.ts.map +1 -0
  179. package/dist/radio-group/index.js +2 -0
  180. package/dist/radio-group/index.js.map +1 -0
  181. package/dist/radio-group/radio-group.d.ts +37 -0
  182. package/dist/radio-group/radio-group.d.ts.map +1 -0
  183. package/dist/radio-group/radio-group.js +251 -0
  184. package/dist/radio-group/radio-group.js.map +1 -0
  185. package/dist/rating/index.d.ts +3 -0
  186. package/dist/rating/index.d.ts.map +1 -0
  187. package/dist/rating/index.js +2 -0
  188. package/dist/rating/index.js.map +1 -0
  189. package/dist/rating/rating.d.ts +31 -0
  190. package/dist/rating/rating.d.ts.map +1 -0
  191. package/dist/rating/rating.js +187 -0
  192. package/dist/rating/rating.js.map +1 -0
  193. package/dist/router/router.d.ts +16 -1
  194. package/dist/router/router.d.ts.map +1 -1
  195. package/dist/router/router.js +88 -11
  196. package/dist/router/router.js.map +1 -1
  197. package/dist/skeleton/index.d.ts +3 -0
  198. package/dist/skeleton/index.d.ts.map +1 -0
  199. package/dist/skeleton/index.js +2 -0
  200. package/dist/skeleton/index.js.map +1 -0
  201. package/dist/skeleton/skeleton.d.ts +24 -0
  202. package/dist/skeleton/skeleton.d.ts.map +1 -0
  203. package/dist/skeleton/skeleton.js +91 -0
  204. package/dist/skeleton/skeleton.js.map +1 -0
  205. package/dist/slider/index.d.ts +3 -0
  206. package/dist/slider/index.d.ts.map +1 -0
  207. package/dist/slider/index.js +2 -0
  208. package/dist/slider/index.js.map +1 -0
  209. package/dist/slider/slider.d.ts +33 -0
  210. package/dist/slider/slider.d.ts.map +1 -0
  211. package/dist/slider/slider.js +248 -0
  212. package/dist/slider/slider.js.map +1 -0
  213. package/dist/spinner/index.d.ts +3 -0
  214. package/dist/spinner/index.d.ts.map +1 -0
  215. package/dist/spinner/index.js +2 -0
  216. package/dist/spinner/index.js.map +1 -0
  217. package/dist/spinner/spinner.d.ts +23 -0
  218. package/dist/spinner/spinner.d.ts.map +1 -0
  219. package/dist/spinner/spinner.js +82 -0
  220. package/dist/spinner/spinner.js.map +1 -0
  221. package/dist/sw/sw.d.ts.map +1 -1
  222. package/dist/sw/sw.js +39 -7
  223. package/dist/sw/sw.js.map +1 -1
  224. package/dist/switch/index.d.ts +3 -0
  225. package/dist/switch/index.d.ts.map +1 -0
  226. package/dist/switch/index.js +2 -0
  227. package/dist/switch/index.js.map +1 -0
  228. package/dist/switch/switch.d.ts +27 -0
  229. package/dist/switch/switch.d.ts.map +1 -0
  230. package/dist/switch/switch.js +163 -0
  231. package/dist/switch/switch.js.map +1 -0
  232. package/dist/theme/index.d.ts +2 -0
  233. package/dist/theme/index.d.ts.map +1 -1
  234. package/dist/theme/index.js +1 -0
  235. package/dist/theme/index.js.map +1 -1
  236. package/dist/theme/scale.d.ts +40 -0
  237. package/dist/theme/scale.d.ts.map +1 -0
  238. package/dist/theme/scale.js +62 -0
  239. package/dist/theme/scale.js.map +1 -0
  240. package/dist/utils/index.d.ts +29 -0
  241. package/dist/utils/index.d.ts.map +1 -0
  242. package/dist/utils/index.js +114 -0
  243. package/dist/utils/index.js.map +1 -0
  244. package/dist/websocket/index.d.ts +3 -0
  245. package/dist/websocket/index.d.ts.map +1 -0
  246. package/dist/websocket/index.js +2 -0
  247. package/dist/websocket/index.js.map +1 -0
  248. package/dist/websocket/websocket.d.ts +31 -0
  249. package/dist/websocket/websocket.d.ts.map +1 -0
  250. package/dist/websocket/websocket.js +164 -0
  251. package/dist/websocket/websocket.js.map +1 -0
  252. package/package.json +85 -1
@@ -56,23 +56,36 @@ export async function flip(elements, mutation, options = {}) {
56
56
  */
57
57
  export function autoFlip(container, options = {}) {
58
58
  const { duration = 300, easing = 'ease-out' } = options;
59
+ // Snapshot of child positions, taken before each mutation batch
60
+ let childRects = new Map();
61
+ function snapshot() {
62
+ childRects = new Map();
63
+ for (const child of Array.from(container.children)) {
64
+ childRects.set(child, child.getBoundingClientRect());
65
+ }
66
+ }
67
+ // Take initial snapshot
68
+ snapshot();
59
69
  const observer = new MutationObserver((mutations) => {
60
70
  if (prefersReduced())
61
71
  return;
62
- // Collect all children that existed before the mutation
63
- const rects = new Map();
72
+ // Identify newly added nodes
73
+ const addedNodes = new Set();
64
74
  for (const m of mutations) {
65
75
  for (const node of m.addedNodes) {
66
76
  if (node instanceof HTMLElement) {
77
+ addedNodes.add(node);
67
78
  // New nodes fade in
68
79
  node.animate([{ opacity: 0 }, { opacity: 1 }], { duration: duration / 2, easing });
69
80
  }
70
81
  }
71
82
  }
72
- // Animate existing children from their old positions
83
+ // Animate existing children from their old positions (FLIP)
73
84
  const children = Array.from(container.children);
74
85
  for (const child of children) {
75
- const rect = rects.get(child);
86
+ if (addedNodes.has(child) && !childRects.has(child))
87
+ continue;
88
+ const rect = childRects.get(child);
76
89
  if (!rect)
77
90
  continue;
78
91
  const last = child.getBoundingClientRect();
@@ -85,15 +98,9 @@ export function autoFlip(container, options = {}) {
85
98
  ], { duration, easing });
86
99
  }
87
100
  }
101
+ // Re-snapshot for the next mutation batch
102
+ snapshot();
88
103
  });
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
104
  // Use a MutationObserver to detect changes
98
105
  observer.observe(container, { childList: true });
99
106
  // Expose snapshot for manual triggering before DOM mutations
@@ -1 +1 @@
1
- {"version":3,"file":"flip.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flip.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Nova Engine — Stagger Animations
3
+ *
4
+ * Apply animations to a list of elements with incremental delays.
5
+ */
6
+ import type { SpringOptions } from './spring';
7
+ export interface StaggerOptions {
8
+ /** Delay in ms between each element. Default: 50 */
9
+ delay?: number;
10
+ /** Which element starts first. Default: 'start' */
11
+ from?: 'start' | 'center' | 'end';
12
+ /** Total duration per element in ms. Default: 300 */
13
+ duration?: number;
14
+ /** CSS easing. Default: 'ease-out' */
15
+ easing?: string;
16
+ }
17
+ /**
18
+ * Animate a list of elements with staggered delays using the Web Animations API.
19
+ *
20
+ * Each element plays the same keyframes but starts after an incremental delay
21
+ * determined by the `from` option.
22
+ *
23
+ * Respects `prefers-reduced-motion` — when reduced, all elements are animated
24
+ * instantly (duration: 0, delay: 0).
25
+ */
26
+ export declare function stagger(elements: HTMLElement[], keyframes: Keyframe[], options?: StaggerOptions): {
27
+ cancel: () => void;
28
+ finished: Promise<void>;
29
+ };
30
+ /**
31
+ * Animate a list of elements with staggered spring physics.
32
+ *
33
+ * Each element's CSS property is animated toward `to` using a spring
34
+ * simulation, with an incremental start delay based on the `from` option.
35
+ *
36
+ * Respects `prefers-reduced-motion` — when reduced, all elements jump
37
+ * to the target value instantly.
38
+ */
39
+ export declare function staggerSpring(elements: HTMLElement[], property: string, to: number, options?: StaggerOptions & SpringOptions): {
40
+ cancel: () => void;
41
+ finished: Promise<void>;
42
+ };
43
+ //# sourceMappingURL=stagger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stagger.d.ts","sourceRoot":"","sources":["../../src/animation/stagger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAoCD;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CACrB,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,EAAE,QAAQ,EAAE,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB;IAAE,MAAM,EAAE,MAAM,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CA0CjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,WAAW,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,GACvC;IAAE,MAAM,EAAE,MAAM,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAmEjD"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Nova Engine — Stagger Animations
3
+ *
4
+ * Apply animations to a list of elements with incremental delays.
5
+ */
6
+ import { spring } from './spring';
7
+ const prefersReduced = () => typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
8
+ /**
9
+ * Calculate the delay offset for each element index based on the `from` option.
10
+ *
11
+ * - 'start': element 0 has 0 delay, last element has max delay.
12
+ * - 'end': last element has 0 delay, first element has max delay.
13
+ * - 'center': middle element has 0 delay, edges have max delay.
14
+ */
15
+ function computeDelays(count, delay, from) {
16
+ if (count === 0)
17
+ return [];
18
+ const delays = new Array(count);
19
+ if (from === 'end') {
20
+ for (let i = 0; i < count; i++) {
21
+ delays[i] = (count - 1 - i) * delay;
22
+ }
23
+ }
24
+ else if (from === 'center') {
25
+ const center = (count - 1) / 2;
26
+ for (let i = 0; i < count; i++) {
27
+ delays[i] = Math.abs(i - center) * delay;
28
+ }
29
+ }
30
+ else {
31
+ // 'start' (default)
32
+ for (let i = 0; i < count; i++) {
33
+ delays[i] = i * delay;
34
+ }
35
+ }
36
+ return delays;
37
+ }
38
+ /**
39
+ * Animate a list of elements with staggered delays using the Web Animations API.
40
+ *
41
+ * Each element plays the same keyframes but starts after an incremental delay
42
+ * determined by the `from` option.
43
+ *
44
+ * Respects `prefers-reduced-motion` — when reduced, all elements are animated
45
+ * instantly (duration: 0, delay: 0).
46
+ */
47
+ export function stagger(elements, keyframes, options) {
48
+ const { delay = 50, from = 'start', duration = 300, easing = 'ease-out', } = options ?? {};
49
+ const count = elements.length;
50
+ // Reduced motion: apply final state instantly
51
+ if (prefersReduced()) {
52
+ const animations = [];
53
+ for (const el of elements) {
54
+ const anim = el.animate(keyframes, { duration: 0, fill: 'forwards' });
55
+ animations.push(anim);
56
+ }
57
+ return {
58
+ cancel: () => { for (const a of animations)
59
+ a.cancel(); },
60
+ finished: Promise.all(animations.map((a) => a.finished)).then(() => { }),
61
+ };
62
+ }
63
+ const delays = computeDelays(count, delay, from);
64
+ const animations = [];
65
+ for (let i = 0; i < count; i++) {
66
+ const anim = elements[i].animate(keyframes, {
67
+ duration,
68
+ easing,
69
+ delay: delays[i],
70
+ fill: 'both',
71
+ });
72
+ animations.push(anim);
73
+ }
74
+ return {
75
+ cancel() {
76
+ for (const a of animations)
77
+ a.cancel();
78
+ },
79
+ finished: Promise.all(animations.map((a) => a.finished)).then(() => { }),
80
+ };
81
+ }
82
+ /**
83
+ * Animate a list of elements with staggered spring physics.
84
+ *
85
+ * Each element's CSS property is animated toward `to` using a spring
86
+ * simulation, with an incremental start delay based on the `from` option.
87
+ *
88
+ * Respects `prefers-reduced-motion` — when reduced, all elements jump
89
+ * to the target value instantly.
90
+ */
91
+ export function staggerSpring(elements, property, to, options) {
92
+ const { delay = 50, from = 'start',
93
+ // duration and easing are unused for spring — included for StaggerOptions compat
94
+ duration: _duration, easing: _easing, ...springOpts } = options ?? {};
95
+ void _duration;
96
+ void _easing;
97
+ const count = elements.length;
98
+ // Reduced motion: jump all elements instantly
99
+ if (prefersReduced()) {
100
+ for (const el of elements) {
101
+ el.style.setProperty(property, String(to));
102
+ }
103
+ return { cancel: () => { }, finished: Promise.resolve() };
104
+ }
105
+ const delays = computeDelays(count, delay, from);
106
+ const cancellers = [];
107
+ const promises = [];
108
+ for (let i = 0; i < count; i++) {
109
+ const el = elements[i];
110
+ const elementDelay = delays[i];
111
+ if (elementDelay === 0) {
112
+ // Start immediately
113
+ const result = spring(el, property, to, springOpts);
114
+ cancellers.push(result.cancel);
115
+ promises.push(result.finished);
116
+ }
117
+ else {
118
+ // Delay start via setTimeout
119
+ let cancelled = false;
120
+ let springCancel = null;
121
+ const promise = new Promise((resolve) => {
122
+ const timerId = setTimeout(() => {
123
+ if (cancelled) {
124
+ resolve();
125
+ return;
126
+ }
127
+ const result = spring(el, property, to, springOpts);
128
+ springCancel = result.cancel;
129
+ result.finished.then(resolve);
130
+ }, elementDelay);
131
+ cancellers.push(() => {
132
+ cancelled = true;
133
+ clearTimeout(timerId);
134
+ if (springCancel)
135
+ springCancel();
136
+ resolve();
137
+ });
138
+ });
139
+ promises.push(promise);
140
+ }
141
+ }
142
+ return {
143
+ cancel() {
144
+ for (const fn of cancellers)
145
+ fn();
146
+ },
147
+ finished: Promise.all(promises).then(() => { }),
148
+ };
149
+ }
150
+ //# sourceMappingURL=stagger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stagger.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Nova Engine — Avatar
3
+ *
4
+ * Circular avatar with image source, initials fallback derived
5
+ * from a name, and deterministic background color hashing.
6
+ */
7
+ export interface AvatarOptions {
8
+ /** Image URL. Falls back to initials if omitted or fails to load. */
9
+ src?: string;
10
+ /** Full name — used to generate initials fallback */
11
+ name?: string;
12
+ /** Diameter in px. Default: 40 */
13
+ size?: number;
14
+ /** Custom fallback text (overrides name-based initials) */
15
+ fallback?: string;
16
+ /** Alt text for the image. Defaults to name or 'Avatar'. */
17
+ alt?: string;
18
+ }
19
+ export interface AvatarInstance {
20
+ /** Update the image source */
21
+ setSrc(src: string): void;
22
+ /** Remove the avatar from DOM and clean up */
23
+ destroy(): void;
24
+ }
25
+ /** Create a circular avatar with image and initials fallback. */
26
+ export declare function createAvatar(container: string | HTMLElement, options?: AvatarOptions): AvatarInstance;
27
+ //# sourceMappingURL=avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/avatar/avatar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,8CAA8C;IAC9C,OAAO,IAAI,IAAI,CAAC;CACjB;AAiED,iEAAiE;AACjE,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,GAAG,WAAW,EAC/B,OAAO,GAAE,aAAkB,GAC1B,cAAc,CA6EhB"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Nova Engine — Avatar
3
+ *
4
+ * Circular avatar with image source, initials fallback derived
5
+ * from a name, and deterministic background color hashing.
6
+ */
7
+ const STYLE_ID = 'nova-avatar-styles';
8
+ function injectStyles() {
9
+ if (document.getElementById(STYLE_ID))
10
+ return;
11
+ const s = document.createElement('style');
12
+ s.id = STYLE_ID;
13
+ s.textContent = `
14
+ .nova-avatar {
15
+ display: inline-flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ border-radius: 50%;
19
+ overflow: hidden;
20
+ flex-shrink: 0;
21
+ user-select: none;
22
+ vertical-align: middle;
23
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
24
+ font-weight: 600;
25
+ color: var(--color-avatar-text, #fff);
26
+ background: var(--color-avatar-bg, rgba(255, 255, 255, 0.12));
27
+ }
28
+ .nova-avatar__img {
29
+ width: 100%;
30
+ height: 100%;
31
+ object-fit: cover;
32
+ border-radius: inherit;
33
+ }`;
34
+ document.head.appendChild(s);
35
+ }
36
+ /**
37
+ * Generate initials from a name string.
38
+ * Takes the first letter of each word (max 2).
39
+ */
40
+ function getInitials(name) {
41
+ const parts = name.trim().split(/\s+/);
42
+ if (parts.length === 0)
43
+ return '';
44
+ if (parts.length === 1)
45
+ return parts[0].charAt(0).toUpperCase();
46
+ return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();
47
+ }
48
+ /**
49
+ * Deterministically hash a string to a hue value (0-360).
50
+ * Produces a consistent background color per name.
51
+ */
52
+ function nameToHue(name) {
53
+ let hash = 0;
54
+ for (let i = 0; i < name.length; i++) {
55
+ hash = name.charCodeAt(i) + ((hash << 5) - hash);
56
+ hash = hash & hash; // Convert to 32-bit integer
57
+ }
58
+ return Math.abs(hash) % 360;
59
+ }
60
+ function resolveContainer(container) {
61
+ if (typeof container === 'string') {
62
+ const el = document.querySelector(container);
63
+ if (!el)
64
+ throw new Error(`[Nova Avatar] Container not found: ${container}`);
65
+ return el;
66
+ }
67
+ return container;
68
+ }
69
+ /** Create a circular avatar with image and initials fallback. */
70
+ export function createAvatar(container, options = {}) {
71
+ const { src, name = '', size = 40, fallback, alt, } = options;
72
+ let destroyed = false;
73
+ injectStyles();
74
+ const wrapper = document.createElement('span');
75
+ wrapper.className = 'nova-avatar';
76
+ wrapper.setAttribute('role', 'img');
77
+ wrapper.setAttribute('aria-label', alt || name || 'Avatar');
78
+ wrapper.style.width = `${size}px`;
79
+ wrapper.style.height = `${size}px`;
80
+ wrapper.style.fontSize = `${Math.round(size * 0.4)}px`;
81
+ // Compute deterministic background from name
82
+ if (name) {
83
+ const hue = nameToHue(name);
84
+ wrapper.style.backgroundColor = `hsl(${hue}, 55%, 45%)`;
85
+ }
86
+ const initialsText = fallback || getInitials(name) || '?';
87
+ let imgEl = null;
88
+ function showInitials() {
89
+ if (imgEl) {
90
+ imgEl.remove();
91
+ imgEl = null;
92
+ }
93
+ // Only set text if not already showing
94
+ if (!wrapper.textContent) {
95
+ wrapper.textContent = initialsText;
96
+ }
97
+ }
98
+ function loadImage(url) {
99
+ // Clear any initials text
100
+ wrapper.textContent = '';
101
+ imgEl = document.createElement('img');
102
+ imgEl.className = 'nova-avatar__img';
103
+ imgEl.alt = alt || name || 'Avatar';
104
+ imgEl.src = url;
105
+ imgEl.addEventListener('error', () => {
106
+ showInitials();
107
+ }, { once: true });
108
+ wrapper.appendChild(imgEl);
109
+ }
110
+ if (src) {
111
+ loadImage(src);
112
+ }
113
+ else {
114
+ showInitials();
115
+ }
116
+ const parent = resolveContainer(container);
117
+ parent.appendChild(wrapper);
118
+ return {
119
+ setSrc(newSrc) {
120
+ if (destroyed)
121
+ return;
122
+ loadImage(newSrc);
123
+ },
124
+ destroy() {
125
+ if (destroyed)
126
+ return;
127
+ destroyed = true;
128
+ wrapper.remove();
129
+ },
130
+ };
131
+ }
132
+ //# sourceMappingURL=avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createAvatar } from './avatar';
2
+ export type { AvatarOptions, AvatarInstance } from './avatar';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createAvatar } from './avatar';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Nova Engine — Badge
3
+ *
4
+ * Inline status indicator with semantic color variants,
5
+ * configurable sizes, and optional pill shape.
6
+ */
7
+ export interface BadgeOptions {
8
+ /** Text content displayed inside the badge */
9
+ text: string;
10
+ /** Semantic color variant. Default: 'default' */
11
+ variant?: 'default' | 'primary' | 'success' | 'warning' | 'error';
12
+ /** Badge size. Default: 'md' */
13
+ size?: 'sm' | 'md' | 'lg';
14
+ /** Use fully rounded pill shape. Default: false */
15
+ rounded?: boolean;
16
+ }
17
+ export interface BadgeInstance {
18
+ /** Update the badge text */
19
+ setText(text: string): void;
20
+ /** Update the badge variant */
21
+ setVariant(variant: BadgeOptions['variant']): void;
22
+ /** Remove the badge from DOM and clean up */
23
+ destroy(): void;
24
+ }
25
+ /** Create an inline badge indicator. */
26
+ export declare function createBadge(container: string | HTMLElement, options: BadgeOptions): BadgeInstance;
27
+ //# sourceMappingURL=badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../src/badge/badge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAClE,gCAAgC;IAChC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,4BAA4B;IAC5B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,+BAA+B;IAC/B,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IACnD,6CAA6C;IAC7C,OAAO,IAAI,IAAI,CAAC;CACjB;AAuED,wCAAwC;AACxC,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,GAAG,WAAW,EAC/B,OAAO,EAAE,YAAY,GACpB,aAAa,CAoDf"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Nova Engine — Badge
3
+ *
4
+ * Inline status indicator with semantic color variants,
5
+ * configurable sizes, and optional pill shape.
6
+ */
7
+ const STYLE_ID = 'nova-badge-styles';
8
+ const VARIANT_COLORS = {
9
+ default: {
10
+ bg: 'var(--color-bg-elevated, rgba(255, 255, 255, 0.08))',
11
+ text: 'var(--color-text-primary, #e5e5e5)',
12
+ border: 'var(--color-border, rgba(255, 255, 255, 0.08))',
13
+ },
14
+ primary: {
15
+ bg: 'var(--color-badge-primary-bg, rgba(167, 139, 250, 0.15))',
16
+ text: 'var(--color-badge-primary-text, #a78bfa)',
17
+ border: 'var(--color-badge-primary-border, rgba(167, 139, 250, 0.25))',
18
+ },
19
+ success: {
20
+ bg: 'var(--color-badge-success-bg, rgba(34, 197, 94, 0.15))',
21
+ text: 'var(--color-badge-success-text, #22c55e)',
22
+ border: 'var(--color-badge-success-border, rgba(34, 197, 94, 0.25))',
23
+ },
24
+ warning: {
25
+ bg: 'var(--color-badge-warning-bg, rgba(245, 158, 11, 0.15))',
26
+ text: 'var(--color-badge-warning-text, #f59e0b)',
27
+ border: 'var(--color-badge-warning-border, rgba(245, 158, 11, 0.25))',
28
+ },
29
+ error: {
30
+ bg: 'var(--color-badge-error-bg, rgba(239, 68, 68, 0.15))',
31
+ text: 'var(--color-badge-error-text, #ef4444)',
32
+ border: 'var(--color-badge-error-border, rgba(239, 68, 68, 0.25))',
33
+ },
34
+ };
35
+ const SIZE_MAP = {
36
+ sm: { height: '20px', fontSize: '11px', padding: '0 6px' },
37
+ md: { height: '24px', fontSize: '12px', padding: '0 8px' },
38
+ lg: { height: '28px', fontSize: '13px', padding: '0 10px' },
39
+ };
40
+ function injectStyles() {
41
+ if (document.getElementById(STYLE_ID))
42
+ return;
43
+ const s = document.createElement('style');
44
+ s.id = STYLE_ID;
45
+ s.textContent = `
46
+ .nova-badge {
47
+ display: inline-flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
51
+ font-weight: 500;
52
+ line-height: 1;
53
+ white-space: nowrap;
54
+ border: 1px solid;
55
+ vertical-align: middle;
56
+ box-sizing: border-box;
57
+ border-radius: 6px;
58
+ }
59
+ .nova-badge--rounded {
60
+ border-radius: 9999px;
61
+ }`;
62
+ document.head.appendChild(s);
63
+ }
64
+ function resolveContainer(container) {
65
+ if (typeof container === 'string') {
66
+ const el = document.querySelector(container);
67
+ if (!el)
68
+ throw new Error(`[Nova Badge] Container not found: ${container}`);
69
+ return el;
70
+ }
71
+ return container;
72
+ }
73
+ /** Create an inline badge indicator. */
74
+ export function createBadge(container, options) {
75
+ const { text, variant = 'default', size = 'md', rounded = false, } = options;
76
+ let destroyed = false;
77
+ let currentVariant = variant;
78
+ injectStyles();
79
+ const el = document.createElement('span');
80
+ el.className = 'nova-badge';
81
+ if (rounded)
82
+ el.classList.add('nova-badge--rounded');
83
+ el.textContent = text;
84
+ // Apply size
85
+ const sizeStyles = SIZE_MAP[size] || SIZE_MAP.md;
86
+ el.style.height = sizeStyles.height;
87
+ el.style.fontSize = sizeStyles.fontSize;
88
+ el.style.padding = sizeStyles.padding;
89
+ function applyVariant(v) {
90
+ const colors = VARIANT_COLORS[v] || VARIANT_COLORS.default;
91
+ el.style.backgroundColor = colors.bg;
92
+ el.style.color = colors.text;
93
+ el.style.borderColor = colors.border;
94
+ }
95
+ applyVariant(currentVariant);
96
+ const parent = resolveContainer(container);
97
+ parent.appendChild(el);
98
+ return {
99
+ setText(newText) {
100
+ if (destroyed)
101
+ return;
102
+ el.textContent = newText;
103
+ },
104
+ setVariant(newVariant) {
105
+ if (destroyed)
106
+ return;
107
+ currentVariant = newVariant || 'default';
108
+ applyVariant(currentVariant);
109
+ },
110
+ destroy() {
111
+ if (destroyed)
112
+ return;
113
+ destroyed = true;
114
+ el.remove();
115
+ },
116
+ };
117
+ }
118
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH,MAAM,QAAQ,GAAG,mBAAmB,CAAC;AAErC,MAAM,cAAc,GAAiE;IACnF,OAAO,EAAE;QACP,EAAE,EAAE,qDAAqD;QACzD,IAAI,EAAE,oCAAoC;QAC1C,MAAM,EAAE,gDAAgD;KACzD;IACD,OAAO,EAAE;QACP,EAAE,EAAE,0DAA0D;QAC9D,IAAI,EAAE,0CAA0C;QAChD,MAAM,EAAE,8DAA8D;KACvE;IACD,OAAO,EAAE;QACP,EAAE,EAAE,wDAAwD;QAC5D,IAAI,EAAE,0CAA0C;QAChD,MAAM,EAAE,4DAA4D;KACrE;IACD,OAAO,EAAE;QACP,EAAE,EAAE,yDAAyD;QAC7D,IAAI,EAAE,0CAA0C;QAChD,MAAM,EAAE,6DAA6D;KACtE;IACD,KAAK,EAAE;QACL,EAAE,EAAE,sDAAsD;QAC1D,IAAI,EAAE,wCAAwC;QAC9C,MAAM,EAAE,0DAA0D;KACnE;CACF,CAAC;AAEF,MAAM,QAAQ,GAA0E;IACtF,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;IAC1D,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;IAC1D,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;CAC5D,CAAC;AAEF,SAAS,YAAY;IACnB,IAAI,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC;QAAE,OAAO;IAC9C,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC;IAChB,CAAC,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;EAgBhB,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,gBAAgB,CAAC,SAA+B;IACvD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAc,SAAS,CAAC,CAAC;QAC1D,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;QAC3E,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,WAAW,CACzB,SAA+B,EAC/B,OAAqB;IAErB,MAAM,EACJ,IAAI,EACJ,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,OAAO,GAAG,KAAK,GAChB,GAAG,OAAO,CAAC;IAEZ,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,cAAc,GAAG,OAAO,CAAC;IAE7B,YAAY,EAAE,CAAC;IAEf,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,EAAE,CAAC,SAAS,GAAG,YAAY,CAAC;IAC5B,IAAI,OAAO;QAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACrD,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC;IAEtB,aAAa;IACb,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC;IACjD,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IACpC,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;IACxC,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;IAEtC,SAAS,YAAY,CAAC,CAAS;QAC7B,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC;QAC3D,EAAE,CAAC,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC;QACrC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QAC7B,EAAE,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,CAAC;IAED,YAAY,CAAC,cAAc,CAAC,CAAC;IAE7B,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAEvB,OAAO;QACL,OAAO,CAAC,OAAe;YACrB,IAAI,SAAS;gBAAE,OAAO;YACtB,EAAE,CAAC,WAAW,GAAG,OAAO,CAAC;QAC3B,CAAC;QACD,UAAU,CAAC,UAAmC;YAC5C,IAAI,SAAS;gBAAE,OAAO;YACtB,cAAc,GAAG,UAAU,IAAI,SAAS,CAAC;YACzC,YAAY,CAAC,cAAc,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO;YACL,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,EAAE,CAAC,MAAM,EAAE,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createBadge } from './badge';
2
+ export type { BadgeOptions, BadgeInstance } from './badge';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/badge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createBadge } from './badge';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}