@omerdlw/base-framework 1.0.5 → 2.0.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 (232) hide show
  1. package/dist/atoms/index.js +1 -103
  2. package/dist/atoms/index.js.map +1 -1
  3. package/dist/chunk-3BUP64Q6.js +105 -0
  4. package/dist/chunk-3BUP64Q6.js.map +1 -0
  5. package/dist/chunk-3MSK4XGK.js +9888 -0
  6. package/dist/chunk-3MSK4XGK.js.map +1 -0
  7. package/dist/chunk-4GMQKD6F.js +353 -0
  8. package/dist/chunk-4GMQKD6F.js.map +1 -0
  9. package/dist/chunk-65ZB4QTQ.js +888 -0
  10. package/dist/chunk-65ZB4QTQ.js.map +1 -0
  11. package/dist/chunk-6SG7V77J.js +577 -0
  12. package/dist/chunk-6SG7V77J.js.map +1 -0
  13. package/dist/chunk-7HQMXTNP.js +419 -0
  14. package/dist/chunk-7HQMXTNP.js.map +1 -0
  15. package/dist/chunk-7TAVYJ3A.js +371 -0
  16. package/dist/chunk-7TAVYJ3A.js.map +1 -0
  17. package/dist/chunk-AQ4BNXA2.js +349 -0
  18. package/dist/chunk-AQ4BNXA2.js.map +1 -0
  19. package/dist/chunk-CGHZSSFR.js +2166 -0
  20. package/dist/chunk-CGHZSSFR.js.map +1 -0
  21. package/dist/chunk-DGCQWQLZ.js +61 -0
  22. package/dist/chunk-DGCQWQLZ.js.map +1 -0
  23. package/dist/chunk-FIMPHODX.js +67 -0
  24. package/dist/chunk-FIMPHODX.js.map +1 -0
  25. package/dist/chunk-GF7TUX5I.js +1889 -0
  26. package/dist/chunk-GF7TUX5I.js.map +1 -0
  27. package/dist/chunk-JELG4JLT.js +454 -0
  28. package/dist/chunk-JELG4JLT.js.map +1 -0
  29. package/dist/chunk-K676GL7Z.js +51 -0
  30. package/dist/chunk-K676GL7Z.js.map +1 -0
  31. package/dist/chunk-KKQT46TP.js +26 -0
  32. package/dist/chunk-KKQT46TP.js.map +1 -0
  33. package/dist/chunk-QI3ALLIB.js +38 -0
  34. package/dist/chunk-QI3ALLIB.js.map +1 -0
  35. package/dist/chunk-QXR55VVS.js +1139 -0
  36. package/dist/chunk-QXR55VVS.js.map +1 -0
  37. package/dist/chunk-R2YGFJDJ.js +408 -0
  38. package/dist/chunk-R2YGFJDJ.js.map +1 -0
  39. package/dist/chunk-RFZQWLC5.js +27 -0
  40. package/dist/chunk-RFZQWLC5.js.map +1 -0
  41. package/dist/chunk-SYAVGTOX.js +521 -0
  42. package/dist/chunk-SYAVGTOX.js.map +1 -0
  43. package/dist/chunk-TV3WEF5G.js +784 -0
  44. package/dist/chunk-TV3WEF5G.js.map +1 -0
  45. package/dist/chunk-XASQT4CQ.js +280 -0
  46. package/dist/chunk-XASQT4CQ.js.map +1 -0
  47. package/dist/error/index.js +5 -682
  48. package/dist/error/index.js.map +1 -1
  49. package/dist/error/reporter.d.ts.map +1 -1
  50. package/dist/error/theme.d.ts +1 -1
  51. package/dist/error/theme.d.ts.map +1 -1
  52. package/dist/events.js +1 -7
  53. package/dist/events.js.map +1 -1
  54. package/dist/hooks/index.js +1 -358
  55. package/dist/hooks/index.js.map +1 -1
  56. package/dist/hooks/use-global-event.d.ts +1 -1
  57. package/dist/index.js +18 -20019
  58. package/dist/index.js.map +1 -1
  59. package/dist/kernel/index.js +2 -2035
  60. package/dist/kernel/index.js.map +1 -1
  61. package/dist/kernel/types.d.ts +1 -1
  62. package/dist/modules/ambient/analyze.d.ts +46 -0
  63. package/dist/modules/ambient/analyze.d.ts.map +1 -0
  64. package/dist/modules/ambient/constants.d.ts +1 -5
  65. package/dist/modules/ambient/constants.d.ts.map +1 -1
  66. package/dist/modules/ambient/context.d.ts.map +1 -1
  67. package/dist/modules/ambient/dom.d.ts +11 -12
  68. package/dist/modules/ambient/dom.d.ts.map +1 -1
  69. package/dist/modules/ambient/extractor.d.ts +12 -4
  70. package/dist/modules/ambient/extractor.d.ts.map +1 -1
  71. package/dist/modules/ambient/hooks.d.ts +1 -1
  72. package/dist/modules/ambient/hooks.d.ts.map +1 -1
  73. package/dist/modules/ambient/index.d.ts +6 -4
  74. package/dist/modules/ambient/index.d.ts.map +1 -1
  75. package/dist/modules/ambient/index.js +7 -753
  76. package/dist/modules/ambient/index.js.map +1 -1
  77. package/dist/modules/ambient/module.d.ts +1 -1
  78. package/dist/modules/ambient/module.d.ts.map +1 -1
  79. package/dist/modules/ambient/oklab.d.ts +36 -0
  80. package/dist/modules/ambient/oklab.d.ts.map +1 -0
  81. package/dist/modules/ambient/pipeline.d.ts +28 -0
  82. package/dist/modules/ambient/pipeline.d.ts.map +1 -0
  83. package/dist/modules/ambient/quantize.d.ts +22 -0
  84. package/dist/modules/ambient/quantize.d.ts.map +1 -0
  85. package/dist/modules/ambient/server/address.d.ts +8 -0
  86. package/dist/modules/ambient/server/address.d.ts.map +1 -0
  87. package/dist/modules/ambient/server/index.d.ts +53 -0
  88. package/dist/modules/ambient/server/index.d.ts.map +1 -0
  89. package/dist/modules/ambient/server/index.js +221 -0
  90. package/dist/modules/ambient/server/index.js.map +1 -0
  91. package/dist/modules/ambient/settings.d.ts +19 -0
  92. package/dist/modules/ambient/settings.d.ts.map +1 -0
  93. package/dist/modules/ambient/types.d.ts +105 -9
  94. package/dist/modules/ambient/types.d.ts.map +1 -1
  95. package/dist/modules/ambient/worker/index.d.ts +15 -0
  96. package/dist/modules/ambient/worker/index.d.ts.map +1 -0
  97. package/dist/modules/ambient/worker/index.js +114 -0
  98. package/dist/modules/ambient/worker/index.js.map +1 -0
  99. package/dist/modules/background/constants.d.ts +2 -2
  100. package/dist/modules/background/constants.d.ts.map +1 -1
  101. package/dist/modules/background/hooks.d.ts +1 -1
  102. package/dist/modules/background/index.js +6 -3078
  103. package/dist/modules/background/index.js.map +1 -1
  104. package/dist/modules/background/motion.d.ts +9 -7
  105. package/dist/modules/background/motion.d.ts.map +1 -1
  106. package/dist/modules/background/overlay.d.ts +3 -8
  107. package/dist/modules/background/overlay.d.ts.map +1 -1
  108. package/dist/modules/background/types.d.ts +16 -2
  109. package/dist/modules/background/types.d.ts.map +1 -1
  110. package/dist/modules/context-menu/constants.d.ts +2 -2
  111. package/dist/modules/context-menu/constants.d.ts.map +1 -1
  112. package/dist/modules/context-menu/hooks.d.ts +1 -1
  113. package/dist/modules/context-menu/index.js +10 -1896
  114. package/dist/modules/context-menu/index.js.map +1 -1
  115. package/dist/modules/context-menu/motion.d.ts +1 -8
  116. package/dist/modules/context-menu/motion.d.ts.map +1 -1
  117. package/dist/modules/context-menu/overlay.d.ts.map +1 -1
  118. package/dist/modules/context-menu/types.d.ts +16 -2
  119. package/dist/modules/context-menu/types.d.ts.map +1 -1
  120. package/dist/modules/controls/constants.d.ts +1 -1
  121. package/dist/modules/controls/constants.d.ts.map +1 -1
  122. package/dist/modules/controls/entries.d.ts +1 -1
  123. package/dist/modules/controls/hooks.d.ts +1 -1
  124. package/dist/modules/controls/index.js +4 -1110
  125. package/dist/modules/controls/index.js.map +1 -1
  126. package/dist/modules/controls/overlay.d.ts +1 -1
  127. package/dist/modules/controls/types.d.ts +2 -2
  128. package/dist/modules/dock/cards.d.ts +708 -24
  129. package/dist/modules/dock/cards.d.ts.map +1 -1
  130. package/dist/modules/dock/constants.d.ts +2 -2
  131. package/dist/modules/dock/constants.d.ts.map +1 -1
  132. package/dist/modules/dock/helpers.d.ts +2 -2
  133. package/dist/modules/dock/hooks.d.ts +2 -2
  134. package/dist/modules/dock/index.d.ts +1 -1
  135. package/dist/modules/dock/index.d.ts.map +1 -1
  136. package/dist/modules/dock/index.js +9 -12130
  137. package/dist/modules/dock/index.js.map +1 -1
  138. package/dist/modules/dock/module.d.ts +1 -1
  139. package/dist/modules/dock/motion.d.ts +41 -915
  140. package/dist/modules/dock/motion.d.ts.map +1 -1
  141. package/dist/modules/dock/overlay.d.ts.map +1 -1
  142. package/dist/modules/dock/runtime/dock.d.ts +1 -23
  143. package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
  144. package/dist/modules/dock/styles.d.ts +4 -4
  145. package/dist/modules/dock/surface/context.d.ts.map +1 -1
  146. package/dist/modules/dock/surface/hooks.d.ts +10 -23
  147. package/dist/modules/dock/surface/hooks.d.ts.map +1 -1
  148. package/dist/modules/dock/surface/machine.d.ts +4 -3
  149. package/dist/modules/dock/surface/machine.d.ts.map +1 -1
  150. package/dist/modules/dock/surface/stack.d.ts.map +1 -1
  151. package/dist/modules/dock/types.d.ts +158 -3
  152. package/dist/modules/dock/types.d.ts.map +1 -1
  153. package/dist/modules/index.js +16 -17873
  154. package/dist/modules/index.js.map +1 -1
  155. package/dist/modules/loading/constants.d.ts +1 -1
  156. package/dist/modules/loading/constants.d.ts.map +1 -1
  157. package/dist/modules/loading/context.d.ts +1 -1
  158. package/dist/modules/loading/hooks.d.ts +1 -1
  159. package/dist/modules/loading/index.js +5 -1153
  160. package/dist/modules/loading/index.js.map +1 -1
  161. package/dist/modules/loading/types.d.ts +2 -2
  162. package/dist/modules/media/context.d.ts +1 -1
  163. package/dist/modules/media/index.js +3 -570
  164. package/dist/modules/media/index.js.map +1 -1
  165. package/dist/modules/media/types.d.ts +2 -2
  166. package/dist/modules/modal/constants.d.ts +2 -2
  167. package/dist/modules/modal/constants.d.ts.map +1 -1
  168. package/dist/modules/modal/context.d.ts +1 -1
  169. package/dist/modules/modal/hooks.d.ts +3 -3
  170. package/dist/modules/modal/index.js +8 -2355
  171. package/dist/modules/modal/index.js.map +1 -1
  172. package/dist/modules/modal/motion.d.ts +3 -8
  173. package/dist/modules/modal/motion.d.ts.map +1 -1
  174. package/dist/modules/modal/overlay.d.ts.map +1 -1
  175. package/dist/modules/modal/types.d.ts +21 -0
  176. package/dist/modules/modal/types.d.ts.map +1 -1
  177. package/dist/modules/notification/constants.d.ts +2 -2
  178. package/dist/modules/notification/constants.d.ts.map +1 -1
  179. package/dist/modules/notification/context.d.ts +1 -1
  180. package/dist/modules/notification/hooks.d.ts +1 -1
  181. package/dist/modules/notification/index.js +4 -828
  182. package/dist/modules/notification/index.js.map +1 -1
  183. package/dist/modules/notification/motion.d.ts +1 -7
  184. package/dist/modules/notification/motion.d.ts.map +1 -1
  185. package/dist/modules/notification/overlay.d.ts.map +1 -1
  186. package/dist/modules/notification/types.d.ts +9 -1
  187. package/dist/modules/notification/types.d.ts.map +1 -1
  188. package/dist/overlay-TZ6L52A5.js +9 -0
  189. package/dist/overlay-TZ6L52A5.js.map +1 -0
  190. package/dist/provider.d.ts +1 -1
  191. package/dist/provider.d.ts.map +1 -1
  192. package/dist/provider.js +6 -1968
  193. package/dist/provider.js.map +1 -1
  194. package/dist/result.js +2 -63
  195. package/dist/result.js.map +1 -1
  196. package/dist/theme.d.ts +45 -8
  197. package/dist/theme.d.ts.map +1 -1
  198. package/dist/theme.js +3 -41
  199. package/dist/theme.js.map +1 -1
  200. package/dist/tokens/index.d.ts +1 -0
  201. package/dist/tokens/index.d.ts.map +1 -1
  202. package/dist/tokens/index.js +126 -155
  203. package/dist/tokens/index.js.map +1 -1
  204. package/dist/tokens/motion-config.d.ts +44 -0
  205. package/dist/tokens/motion-config.d.ts.map +1 -0
  206. package/dist/tokens/motion.d.ts +23 -174
  207. package/dist/tokens/motion.d.ts.map +1 -1
  208. package/dist/utils/index.js +4 -82
  209. package/dist/utils/index.js.map +1 -1
  210. package/dist/utils/report.d.ts.map +1 -1
  211. package/docs/README.md +1 -0
  212. package/docs/architecture-and-rules.md +4 -3
  213. package/docs/core-engine.md +7 -10
  214. package/docs/getting-started.md +4 -2
  215. package/docs/modules/ambient.md +194 -80
  216. package/docs/modules/background.md +3 -3
  217. package/docs/modules/context-menu.md +2 -2
  218. package/docs/modules/dock.md +8 -5
  219. package/docs/modules/modal.md +2 -2
  220. package/docs/modules/notification.md +2 -2
  221. package/docs/theming.md +81 -9
  222. package/package.json +22 -5
  223. package/templates/AGENTS.md +1 -1
  224. package/templates/motion/background.ts +17 -0
  225. package/templates/motion/context-menu.ts +63 -0
  226. package/templates/motion/dock.ts +327 -0
  227. package/templates/motion/modal.ts +79 -0
  228. package/templates/motion/notification.ts +27 -0
  229. package/templates/motion/tokens.ts +47 -0
  230. package/templates/tsconfig.json +7 -0
  231. package/dist/modules/ambient/color.d.ts +0 -16
  232. package/dist/modules/ambient/color.d.ts.map +0 -1
@@ -0,0 +1,371 @@
1
+ import { getOrCreateGlobalContext } from './chunk-GF7TUX5I.js';
2
+ import { useContext, createElement, useMemo } from 'react';
3
+ import { MotionConfig, useReducedMotion } from 'motion/react';
4
+
5
+ // src/tokens/motion.ts
6
+ var REDUCED_MOTION_TRANSITION = Object.freeze({
7
+ duration: 0.08,
8
+ ease: "linear"
9
+ });
10
+ function tween(duration, ease) {
11
+ return Object.freeze({ type: "tween", duration, ease });
12
+ }
13
+ function safeNumber(value, fallback) {
14
+ const source = value && typeof value === "object" && "get" in value && typeof value.get === "function" ? value.get() : value;
15
+ const number = Number.parseFloat(String(source));
16
+ return Number.isFinite(number) ? number : fallback;
17
+ }
18
+ function gpuTransform(y = 0, scale = 1, x = 0) {
19
+ const translateY = Math.round(safeNumber(y, 0));
20
+ const translateX = Math.round(safeNumber(x, 0));
21
+ const scaleValue = Math.round(safeNumber(scale, 1) * 1e3) / 1e3;
22
+ return `translate3d(${translateX}px, ${translateY}px, 0) scale(${scaleValue})`;
23
+ }
24
+ function durationForDistance(distancePx, {
25
+ base,
26
+ min,
27
+ max,
28
+ reference = 320,
29
+ gain = 0.22
30
+ }) {
31
+ const distance = Math.abs(Number(distancePx) || 0);
32
+ const safeMin = Math.max(0, min);
33
+ const safeMax = Math.max(safeMin, max);
34
+ const safeReference = Math.max(1, reference);
35
+ const duration = base + Math.sqrt(distance / safeReference) * gain;
36
+ return Math.min(safeMax, Math.max(safeMin, duration));
37
+ }
38
+ function surfaceResizeTransition(distancePx, {
39
+ base,
40
+ min,
41
+ max,
42
+ reference = 320,
43
+ gain = 0.22,
44
+ ease
45
+ }) {
46
+ return tween(
47
+ durationForDistance(distancePx, { base, min, max, reference, gain }),
48
+ ease
49
+ );
50
+ }
51
+ function contentSwapTransitions({
52
+ duration,
53
+ exitDuration,
54
+ enterEase,
55
+ exitEase
56
+ }) {
57
+ return Object.freeze({
58
+ enter: tween(duration, enterEase),
59
+ exit: tween(exitDuration, exitEase)
60
+ });
61
+ }
62
+ function contentSwap({
63
+ travel = 6,
64
+ exitTravel = travel * 0.7,
65
+ enterScale = 0.99,
66
+ exitScale = 0.99,
67
+ ...transitionOptions
68
+ }) {
69
+ const transitions = contentSwapTransitions(transitionOptions);
70
+ return Object.freeze({
71
+ hidden: Object.freeze({
72
+ opacity: 0,
73
+ transform: gpuTransform(travel, enterScale)
74
+ }),
75
+ visible: Object.freeze({
76
+ opacity: 1,
77
+ transform: gpuTransform(0),
78
+ transition: transitions.enter
79
+ }),
80
+ exit: Object.freeze({
81
+ opacity: 0,
82
+ transform: gpuTransform(-exitTravel, exitScale),
83
+ transition: transitions.exit
84
+ })
85
+ });
86
+ }
87
+ function overlaySurface({
88
+ travel = 16,
89
+ exitTravel = travel * 0.5,
90
+ enterScale = 0.97,
91
+ exitScale = 0.985,
92
+ duration,
93
+ exitDuration = duration * 0.68,
94
+ enterEase,
95
+ exitEase
96
+ }) {
97
+ const transitions = contentSwapTransitions({
98
+ duration,
99
+ exitDuration,
100
+ enterEase,
101
+ exitEase
102
+ });
103
+ return Object.freeze({
104
+ hidden: Object.freeze({
105
+ opacity: 0,
106
+ transform: gpuTransform(travel, enterScale)
107
+ }),
108
+ visible: Object.freeze({
109
+ opacity: 1,
110
+ transform: gpuTransform(0),
111
+ transition: transitions.enter
112
+ }),
113
+ exit: Object.freeze({
114
+ opacity: 0,
115
+ transform: gpuTransform(exitTravel, exitScale),
116
+ transition: transitions.exit
117
+ })
118
+ });
119
+ }
120
+ function staggerDelay(index, { base = 0.028, cap = 0.16, exponent = 0.82 } = {}) {
121
+ const safeIndex = Math.max(0, Number(index) || 0);
122
+ return Math.min(cap, base * Math.pow(safeIndex, exponent));
123
+ }
124
+ function chip({
125
+ duration,
126
+ exitDuration,
127
+ enterEase,
128
+ exitEase
129
+ }) {
130
+ const transitions = contentSwapTransitions({
131
+ duration,
132
+ exitDuration,
133
+ enterEase,
134
+ exitEase
135
+ });
136
+ return Object.freeze({
137
+ hidden: Object.freeze({ opacity: 0, transform: gpuTransform(0, 0.96) }),
138
+ visible: Object.freeze({
139
+ opacity: 1,
140
+ transform: gpuTransform(0),
141
+ transition: transitions.enter
142
+ }),
143
+ exit: Object.freeze({
144
+ opacity: 0,
145
+ transform: gpuTransform(0, 0.96),
146
+ transition: transitions.exit
147
+ })
148
+ });
149
+ }
150
+ function press({
151
+ tapScale,
152
+ spring
153
+ }) {
154
+ return Object.freeze({
155
+ variants: Object.freeze({
156
+ idle: Object.freeze({ transform: gpuTransform(0, 1) }),
157
+ hover: Object.freeze({ transform: gpuTransform(0, 1) }),
158
+ tap: Object.freeze({ transform: gpuTransform(0, tapScale) })
159
+ }),
160
+ transition: Object.freeze({ type: "spring", ...spring })
161
+ });
162
+ }
163
+
164
+ // src/tokens/motion-config.ts
165
+ function defineMotion(tokens) {
166
+ const tempo = tokens.tempo ?? 1;
167
+ if (!Number.isFinite(tempo) || tempo <= 0) {
168
+ throw new Error(`Motion tempo must be a positive number, got ${tempo}.`);
169
+ }
170
+ return Object.freeze({
171
+ ...tokens,
172
+ tempo,
173
+ reducedMotion: tokens.reducedMotion ?? "user"
174
+ });
175
+ }
176
+ var TIME_KEYS = [
177
+ "duration",
178
+ "delay",
179
+ "delayChildren",
180
+ "staggerChildren",
181
+ "repeatDelay",
182
+ "visualDuration"
183
+ ];
184
+ var REDUCED = Object.freeze({
185
+ type: "tween",
186
+ ...REDUCED_MOTION_TRANSITION
187
+ });
188
+ function isPlainObject(value) {
189
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
190
+ const prototype = Object.getPrototypeOf(value);
191
+ return prototype === Object.prototype || prototype === null;
192
+ }
193
+ function isSpring(value) {
194
+ return value.type === "spring" || typeof value.stiffness === "number" || typeof value.damping === "number";
195
+ }
196
+ function isTransition(value) {
197
+ return isSpring(value) || TIME_KEYS.some((key) => typeof value[key] === "number");
198
+ }
199
+ function retimeTransition(value, clock) {
200
+ if (clock.reduced) return { ...REDUCED };
201
+ const { tempo } = clock;
202
+ const next = {};
203
+ for (const [key, entry] of Object.entries(value)) {
204
+ next[key] = isPlainObject(entry) ? retimeNode(entry, clock) : entry;
205
+ }
206
+ for (const key of TIME_KEYS) {
207
+ if (typeof value[key] === "number") next[key] = value[key] * tempo;
208
+ }
209
+ if (typeof value.stiffness === "number") {
210
+ next.stiffness = value.stiffness / (tempo * tempo);
211
+ }
212
+ if (typeof value.damping === "number") next.damping = value.damping / tempo;
213
+ return next;
214
+ }
215
+ function retimeNode(value, clock) {
216
+ if (typeof value === "function") {
217
+ const fn = value;
218
+ return (...args) => retimeNode(fn(...args), clock);
219
+ }
220
+ if (!isPlainObject(value)) return value;
221
+ if (isTransition(value)) return retimeTransition(value, clock);
222
+ const next = {};
223
+ for (const [key, entry] of Object.entries(value)) {
224
+ next[key] = retimeNode(entry, clock);
225
+ }
226
+ return next;
227
+ }
228
+ function retime(value, clock) {
229
+ if (clock.tempo === 1 && !clock.reduced) return value;
230
+ return retimeNode(value, clock);
231
+ }
232
+ function retimeSeconds(value, clock) {
233
+ if (typeof value === "number") {
234
+ return clock.reduced ? Math.min(value, REDUCED.duration) : value * clock.tempo;
235
+ }
236
+ if (!isPlainObject(value)) return value;
237
+ const next = {};
238
+ for (const [key, entry] of Object.entries(value)) {
239
+ next[key] = retimeSeconds(entry, clock);
240
+ }
241
+ return next;
242
+ }
243
+ function retimeModuleMotion(motion, clock) {
244
+ if (clock.tempo === 1 && !clock.reduced) return motion;
245
+ if (!isPlainObject(motion)) return retime(motion, clock);
246
+ const next = {};
247
+ for (const [key, entry] of Object.entries(motion)) {
248
+ next[key] = key === "timings" ? retimeSeconds(entry, clock) : retimeNode(entry, clock);
249
+ }
250
+ return next;
251
+ }
252
+ function cssEasing(ease) {
253
+ if (Array.isArray(ease)) return `cubic-bezier(${ease.join(", ")})`;
254
+ if (typeof ease === "string" && ease.trim()) return ease;
255
+ return "ease";
256
+ }
257
+ function cssTransition(property, transition) {
258
+ const duration = `${Math.round((transition.duration ?? 0) * 1e3)}ms`;
259
+ const delay = transition.delay ? ` ${Math.round(transition.delay * 1e3)}ms` : "";
260
+ return `${property} ${duration} ${cssEasing(transition.ease)}${delay}`;
261
+ }
262
+
263
+ // src/theme.tsx
264
+ function defineThemeSpec(id) {
265
+ return Object.freeze({ id });
266
+ }
267
+ function defineTheme(spec, config) {
268
+ return { id: spec.id, config };
269
+ }
270
+ var EMPTY = /* @__PURE__ */ new Map();
271
+ var ThemeContext = getOrCreateGlobalContext("ThemeContext", EMPTY);
272
+ var DEFAULT_MOTION = defineMotion({});
273
+ var NO_MOTION_PROVIDER = Object.freeze({
274
+ reduced: false,
275
+ tempo: 1,
276
+ tokens: DEFAULT_MOTION
277
+ });
278
+ var MotionContext = getOrCreateGlobalContext(
279
+ "MotionContext",
280
+ NO_MOTION_PROVIDER
281
+ );
282
+ function MotionProvider({
283
+ children,
284
+ tokens
285
+ }) {
286
+ const prefersReduced = useReducedMotion() === true;
287
+ const reduced = tokens.reducedMotion === "always" || tokens.reducedMotion === "user" && prefersReduced;
288
+ const state = useMemo(
289
+ () => Object.freeze({ reduced, tempo: tokens.tempo, tokens }),
290
+ [reduced, tokens]
291
+ );
292
+ return createElement(MotionContext.Provider, { value: state }, children);
293
+ }
294
+ function ThemeProvider({
295
+ children,
296
+ motion,
297
+ themes
298
+ }) {
299
+ const configs = new Map(themes.map((entry) => [entry.id, entry.config]));
300
+ const inherited = useContext(MotionContext) !== NO_MOTION_PROVIDER;
301
+ return createElement(
302
+ ThemeContext.Provider,
303
+ { value: configs },
304
+ motion || !inherited ? createElement(
305
+ MotionProvider,
306
+ { tokens: motion ?? DEFAULT_MOTION },
307
+ children
308
+ ) : children
309
+ );
310
+ }
311
+ function missingTheme(id) {
312
+ return new Error(
313
+ `Theme "${id}" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`
314
+ );
315
+ }
316
+ function useTheme(spec) {
317
+ const config = useContext(ThemeContext).get(spec.id);
318
+ if (!config) throw missingTheme(spec.id);
319
+ return {
320
+ slots: config.slots,
321
+ styles: config.styles ?? {}
322
+ };
323
+ }
324
+ function useMotionTokens() {
325
+ const state = useContext(MotionContext);
326
+ return useMemo(
327
+ () => ({ ...state.tokens, reduced: state.reduced }),
328
+ [state]
329
+ );
330
+ }
331
+ var resolvedMotion = /* @__PURE__ */ new WeakMap();
332
+ function useModuleMotion(spec) {
333
+ const config = useContext(ThemeContext).get(spec.id);
334
+ const state = useContext(MotionContext);
335
+ if (!config) throw missingTheme(spec.id);
336
+ if (!config.motion || typeof config.motion !== "object") {
337
+ throw new Error(
338
+ `Motion for theme "${spec.id}" is missing. Add \`motion\` to its defineTheme(...) next to \`slots\` (start from the framework's templates/motion/).`
339
+ );
340
+ }
341
+ return resolveModuleMotion(state, config.motion);
342
+ }
343
+ function useOptionalModuleMotion(spec) {
344
+ const motion = useContext(ThemeContext).get(spec.id)?.motion;
345
+ const state = useContext(MotionContext);
346
+ if (!motion || typeof motion !== "object") return null;
347
+ return resolveModuleMotion(state, motion);
348
+ }
349
+ function resolveModuleMotion(state, motion) {
350
+ let byConfig = resolvedMotion.get(state);
351
+ if (!byConfig) {
352
+ byConfig = /* @__PURE__ */ new WeakMap();
353
+ resolvedMotion.set(state, byConfig);
354
+ }
355
+ if (!byConfig.has(motion)) {
356
+ byConfig.set(motion, retimeModuleMotion(motion, state));
357
+ }
358
+ return byConfig.get(motion);
359
+ }
360
+ function ModuleMotionConfig({ children }) {
361
+ const { tokens } = useContext(MotionContext);
362
+ return createElement(
363
+ MotionConfig,
364
+ { reducedMotion: tokens.reducedMotion },
365
+ children
366
+ );
367
+ }
368
+
369
+ export { ModuleMotionConfig, REDUCED_MOTION_TRANSITION, ThemeProvider, chip, contentSwap, contentSwapTransitions, cssEasing, cssTransition, defineMotion, defineTheme, defineThemeSpec, durationForDistance, gpuTransform, overlaySurface, press, retime, retimeModuleMotion, staggerDelay, surfaceResizeTransition, useModuleMotion, useMotionTokens, useOptionalModuleMotion, useTheme };
370
+ //# sourceMappingURL=chunk-7TAVYJ3A.js.map
371
+ //# sourceMappingURL=chunk-7TAVYJ3A.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tokens/motion.ts","../src/tokens/motion-config.ts","../src/theme.tsx"],"names":[],"mappings":"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","file":"chunk-7TAVYJ3A.js","sourcesContent":["// Builders for the motion an app writes in its theme files. They hold shapes\n// (travel, scale, how a duration grows with distance), never the app's timing:\n// every duration, easing and spring is passed in.\n\nexport const REDUCED_MOTION_TRANSITION = Object.freeze({\n duration: 0.08,\n ease: \"linear\",\n} as const);\n\ntype Ease = readonly [number, number, number, number];\n\ntype TweenOptions = {\n duration: number;\n exitDuration: number;\n enterEase: Ease;\n exitEase: Ease;\n};\n\ntype Spring = {\n type?: \"spring\";\n stiffness: number;\n damping: number;\n mass: number;\n};\n\nfunction tween(duration: number, ease: Ease) {\n return Object.freeze({ type: \"tween\" as const, duration, ease });\n}\n\nfunction safeNumber(value: unknown, fallback: number): number {\n const source =\n value &&\n typeof value === \"object\" &&\n \"get\" in value &&\n typeof value.get === \"function\"\n ? value.get()\n : value;\n const number = Number.parseFloat(String(source));\n return Number.isFinite(number) ? number : fallback;\n}\n\nexport function gpuTransform(\n y: unknown = 0,\n scale: unknown = 1,\n x: unknown = 0,\n): string {\n const translateY = Math.round(safeNumber(y, 0));\n const translateX = Math.round(safeNumber(x, 0));\n const scaleValue = Math.round(safeNumber(scale, 1) * 1000) / 1000;\n return `translate3d(${translateX}px, ${translateY}px, 0) scale(${scaleValue})`;\n}\n\nexport function durationForDistance(\n distancePx: number,\n {\n base,\n min,\n max,\n reference = 320,\n gain = 0.22,\n }: {\n base: number;\n min: number;\n max: number;\n reference?: number;\n gain?: number;\n },\n): number {\n const distance = Math.abs(Number(distancePx) || 0);\n const safeMin = Math.max(0, min);\n const safeMax = Math.max(safeMin, max);\n const safeReference = Math.max(1, reference);\n const duration = base + Math.sqrt(distance / safeReference) * gain;\n return Math.min(safeMax, Math.max(safeMin, duration));\n}\n\nexport function surfaceResizeTransition(\n distancePx: number,\n {\n base,\n min,\n max,\n reference = 320,\n gain = 0.22,\n ease,\n }: {\n base: number;\n min: number;\n max: number;\n reference?: number;\n gain?: number;\n ease: Ease;\n },\n) {\n return tween(\n durationForDistance(distancePx, { base, min, max, reference, gain }),\n ease,\n );\n}\n\nexport function contentSwapTransitions({\n duration,\n exitDuration,\n enterEase,\n exitEase,\n}: TweenOptions) {\n return Object.freeze({\n enter: tween(duration, enterEase),\n exit: tween(exitDuration, exitEase),\n });\n}\n\nexport function contentSwap({\n travel = 6,\n exitTravel = travel * 0.7,\n enterScale = 0.99,\n exitScale = 0.99,\n ...transitionOptions\n}: TweenOptions & {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n}) {\n const transitions = contentSwapTransitions(transitionOptions);\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, enterScale),\n }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(-exitTravel, exitScale),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function overlaySurface({\n travel = 16,\n exitTravel = travel * 0.5,\n enterScale = 0.97,\n exitScale = 0.985,\n duration,\n exitDuration = duration * 0.68,\n enterEase,\n exitEase,\n}: {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n duration: number;\n exitDuration?: number;\n enterEase: Ease;\n exitEase: Ease;\n}) {\n const transitions = contentSwapTransitions({\n duration,\n exitDuration,\n enterEase,\n exitEase,\n });\n\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, enterScale),\n }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(exitTravel, exitScale),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function staggerDelay(\n index: number,\n { base = 0.028, cap = 0.16, exponent = 0.82 } = {},\n): number {\n const safeIndex = Math.max(0, Number(index) || 0);\n return Math.min(cap, base * Math.pow(safeIndex, exponent));\n}\n\nexport function chip({\n duration,\n exitDuration,\n enterEase,\n exitEase,\n}: TweenOptions) {\n const transitions = contentSwapTransitions({\n duration,\n exitDuration,\n enterEase,\n exitEase,\n });\n return Object.freeze({\n hidden: Object.freeze({ opacity: 0, transform: gpuTransform(0, 0.96) }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(0, 0.96),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function press({\n tapScale,\n spring,\n}: {\n tapScale: number;\n spring: Spring;\n}) {\n return Object.freeze({\n variants: Object.freeze({\n idle: Object.freeze({ transform: gpuTransform(0, 1) }),\n hover: Object.freeze({ transform: gpuTransform(0, 1) }),\n tap: Object.freeze({ transform: gpuTransform(0, tapScale) }),\n }),\n transition: Object.freeze({ type: \"spring\" as const, ...spring }),\n });\n}\n","import { REDUCED_MOTION_TRANSITION } from \"./motion\";\n\n// Motion is owned by the app, like its styles. The app names its own\n// durations, easings and springs and writes every module's motion with them;\n// the framework only reads the tempo and the reduced-motion policy, and applies\n// both to whatever the app wrote.\n\nexport type MotionEase = readonly [number, number, number, number];\n\nexport type ReducedMotionPolicy = \"user\" | \"always\" | \"never\";\n\nexport interface MotionSpring {\n readonly type?: \"spring\";\n readonly stiffness?: number;\n readonly damping?: number;\n readonly mass?: number;\n readonly bounce?: number;\n readonly visualDuration?: number;\n}\n\nexport interface MotionTokensInput {\n /** Stretches every module duration, delay, stagger, timer and spring. */\n readonly tempo?: number;\n /** \"user\" follows the OS setting. */\n readonly reducedMotion?: ReducedMotionPolicy;\n readonly durations?: Readonly<Record<string, number>>;\n readonly easings?: Readonly<Record<string, MotionEase>>;\n readonly springs?: Readonly<Record<string, MotionSpring>>;\n}\n\nexport type MotionTokens<T extends MotionTokensInput = MotionTokensInput> =\n Readonly<\n Omit<T, \"tempo\" | \"reducedMotion\"> & {\n tempo: number;\n reducedMotion: ReducedMotionPolicy;\n }\n >;\n\nexport function defineMotion<T extends MotionTokensInput>(\n tokens: T,\n): MotionTokens<T> {\n const tempo = tokens.tempo ?? 1;\n if (!Number.isFinite(tempo) || tempo <= 0) {\n throw new Error(`Motion tempo must be a positive number, got ${tempo}.`);\n }\n return Object.freeze({\n ...tokens,\n tempo,\n reducedMotion: tokens.reducedMotion ?? \"user\",\n }) as MotionTokens<T>;\n}\n\nexport interface MotionClock {\n readonly tempo: number;\n readonly reduced: boolean;\n}\n\nconst TIME_KEYS = [\n \"duration\",\n \"delay\",\n \"delayChildren\",\n \"staggerChildren\",\n \"repeatDelay\",\n \"visualDuration\",\n] as const;\n\nconst REDUCED = Object.freeze({\n type: \"tween\" as const,\n ...REDUCED_MOTION_TRANSITION,\n});\n\ntype Plain = Record<string, unknown>;\n\nfunction isPlainObject(value: unknown): value is Plain {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isSpring(value: Plain): boolean {\n return (\n value.type === \"spring\" ||\n typeof value.stiffness === \"number\" ||\n typeof value.damping === \"number\"\n );\n}\n\nfunction isTransition(value: Plain): boolean {\n return (\n isSpring(value) ||\n TIME_KEYS.some((key) => typeof value[key] === \"number\")\n );\n}\n\nfunction retimeTransition(value: Plain, clock: MotionClock): Plain {\n if (clock.reduced) return { ...REDUCED };\n const { tempo } = clock;\n const next: Plain = {};\n for (const [key, entry] of Object.entries(value)) {\n next[key] = isPlainObject(entry) ? retimeNode(entry, clock) : entry;\n }\n for (const key of TIME_KEYS) {\n if (typeof value[key] === \"number\") next[key] = (value[key] as number) * tempo;\n }\n // A spring takes tempo× as long at the same damping ratio when its\n // stiffness falls by tempo² and its damping by tempo.\n if (typeof value.stiffness === \"number\") {\n next.stiffness = value.stiffness / (tempo * tempo);\n }\n if (typeof value.damping === \"number\") next.damping = value.damping / tempo;\n return next;\n}\n\nfunction retimeNode(value: unknown, clock: MotionClock): unknown {\n if (typeof value === \"function\") {\n const fn = value as (...args: unknown[]) => unknown;\n return (...args: unknown[]) => retimeNode(fn(...args), clock);\n }\n if (!isPlainObject(value)) return value;\n if (isTransition(value)) return retimeTransition(value, clock);\n const next: Plain = {};\n for (const [key, entry] of Object.entries(value)) {\n next[key] = retimeNode(entry, clock);\n }\n return next;\n}\n\n/** Applies tempo, or the reduced-motion collapse, to transitions anywhere in a motion tree. */\nexport function retime<T>(value: T, clock: MotionClock): T {\n if (clock.tempo === 1 && !clock.reduced) return value;\n return retimeNode(value, clock) as T;\n}\n\nfunction retimeSeconds(value: unknown, clock: MotionClock): unknown {\n if (typeof value === \"number\") {\n return clock.reduced\n ? Math.min(value, REDUCED.duration)\n : value * clock.tempo;\n }\n if (!isPlainObject(value)) return value;\n const next: Plain = {};\n for (const [key, entry] of Object.entries(value)) {\n next[key] = retimeSeconds(entry, clock);\n }\n return next;\n}\n\n/**\n * Retimes a module's resolved motion. Every number under its `timings` key is\n * seconds (choreography timers, staggers); everything else is walked for\n * transitions.\n */\nexport function retimeModuleMotion<M>(motion: M, clock: MotionClock): M {\n if (clock.tempo === 1 && !clock.reduced) return motion;\n if (!isPlainObject(motion)) return retime(motion, clock);\n const next: Plain = {};\n for (const [key, entry] of Object.entries(motion)) {\n next[key] =\n key === \"timings\" ? retimeSeconds(entry, clock) : retimeNode(entry, clock);\n }\n return next as M;\n}\n\nexport function cssEasing(ease: unknown): string {\n if (Array.isArray(ease)) return `cubic-bezier(${ease.join(\", \")})`;\n if (typeof ease === \"string\" && ease.trim()) return ease;\n return \"ease\";\n}\n\n/** A CSS `transition` value for one property, from a motion tween. */\nexport function cssTransition(\n property: string,\n transition: { duration?: number; delay?: number; ease?: unknown },\n): string {\n const duration = `${Math.round((transition.duration ?? 0) * 1000)}ms`;\n const delay = transition.delay\n ? ` ${Math.round(transition.delay * 1000)}ms`\n : \"\";\n return `${property} ${duration} ${cssEasing(transition.ease)}${delay}`;\n}\n","\"use client\";\n\nimport {\n createElement,\n useContext,\n useMemo,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { MotionConfig, useReducedMotion } from \"motion/react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport {\n defineMotion,\n retimeModuleMotion,\n type MotionClock,\n type MotionTokens,\n} from \"@/tokens\";\n\n/**\n * A module's theme contract: the slots it styles and, for modules that\n * animate, the motion it plays. Both are written by the app.\n */\nexport interface ThemeSpec<S extends string = string, M = never> {\n readonly id: string;\n readonly _slots?: S;\n readonly _motion?: M;\n}\n\ninterface ThemeVisuals<S extends string> {\n slots: Readonly<Record<S, string>>;\n styles?: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport type ThemeConfig<S extends string, M = never> = ThemeVisuals<S> &\n ([M] extends [never] ? { motion?: undefined } : { motion: M });\n\nexport interface ResolvedTheme<S extends string> {\n readonly slots: Readonly<Record<S, string>>;\n readonly styles: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ThemeEntry {\n readonly id: string;\n readonly config: ThemeVisuals<string> & { motion?: unknown };\n}\n\nexport function defineThemeSpec<S extends string, M = never>(\n id: string,\n): ThemeSpec<S, M> {\n return Object.freeze({ id });\n}\n\nexport function defineTheme<S extends string, M = never>(\n spec: ThemeSpec<S, M>,\n config: ThemeConfig<NoInfer<S>, NoInfer<M>>,\n): ThemeEntry {\n return { id: spec.id, config: config as ThemeEntry[\"config\"] };\n}\n\nconst EMPTY: ReadonlyMap<string, ThemeEntry[\"config\"]> = new Map();\nconst ThemeContext = getOrCreateGlobalContext<\n ReadonlyMap<string, ThemeEntry[\"config\"]>\n>(\"ThemeContext\", EMPTY);\n\ninterface MotionState extends MotionClock {\n readonly tokens: MotionTokens;\n}\n\nconst DEFAULT_MOTION = defineMotion({});\nconst NO_MOTION_PROVIDER: MotionState = Object.freeze({\n reduced: false,\n tempo: 1,\n tokens: DEFAULT_MOTION,\n});\nconst MotionContext = getOrCreateGlobalContext<MotionState>(\n \"MotionContext\",\n NO_MOTION_PROVIDER,\n);\n\nfunction MotionProvider({\n children,\n tokens,\n}: {\n children?: ReactNode;\n tokens: MotionTokens;\n}) {\n const prefersReduced = useReducedMotion() === true;\n const reduced =\n tokens.reducedMotion === \"always\" ||\n (tokens.reducedMotion === \"user\" && prefersReduced);\n const state = useMemo<MotionState>(\n () => Object.freeze({ reduced, tempo: tokens.tempo, tokens }),\n [reduced, tokens],\n );\n return createElement(MotionContext.Provider, { value: state }, children);\n}\n\nexport function ThemeProvider({\n children,\n motion,\n themes,\n}: {\n children?: ReactNode;\n /** The app's motion tokens, from `defineMotion` (tempo, reduced-motion policy, vocabulary). */\n motion?: MotionTokens;\n themes: readonly ThemeEntry[];\n}) {\n const configs = new Map(themes.map((entry) => [entry.id, entry.config]));\n // A nested ThemeProvider without motion keeps the app's motion from above.\n const inherited = useContext(MotionContext) !== NO_MOTION_PROVIDER;\n return createElement(\n ThemeContext.Provider,\n { value: configs },\n motion || !inherited\n ? createElement(\n MotionProvider,\n { tokens: motion ?? DEFAULT_MOTION },\n children,\n )\n : children,\n );\n}\n\nfunction missingTheme(id: string): Error {\n return new Error(\n `Theme \"${id}\" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`,\n );\n}\n\nexport function useTheme<S extends string>(\n spec: ThemeSpec<S, unknown>,\n): ResolvedTheme<S> {\n const config = useContext(ThemeContext).get(spec.id);\n if (!config) throw missingTheme(spec.id);\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n\nexport { useTheme as useModuleTheme };\n\n/** The app's motion tokens, plus whether reduced motion is in effect. */\nexport function useMotionTokens<\n T extends MotionTokens = MotionTokens,\n>(): T & { readonly reduced: boolean } {\n const state = useContext(MotionContext);\n return useMemo(\n () => ({ ...(state.tokens as T), reduced: state.reduced }),\n [state],\n );\n}\n\nconst resolvedMotion = new WeakMap<MotionState, WeakMap<object, unknown>>();\n\n/**\n * The motion a module plays, as the app wrote it in `defineTheme(spec, { motion })`,\n * retimed by the app's tempo or collapsed for reduced motion. Stable per\n * (tokens, theme) so it can be a dependency.\n */\nexport function useModuleMotion<M>(spec: ThemeSpec<string, M>): M {\n const config = useContext(ThemeContext).get(spec.id);\n const state = useContext(MotionContext);\n if (!config) throw missingTheme(spec.id);\n if (!config.motion || typeof config.motion !== \"object\") {\n throw new Error(\n `Motion for theme \"${spec.id}\" is missing. Add \\`motion\\` to its defineTheme(...) next to \\`slots\\` (start from the framework's templates/motion/).`,\n );\n }\n return resolveModuleMotion(state, config.motion) as M;\n}\n\n/** Like useModuleMotion, but null when the app hasn't themed the module. */\nexport function useOptionalModuleMotion<M>(\n spec: ThemeSpec<string, M>,\n): M | null {\n const motion = useContext(ThemeContext).get(spec.id)?.motion;\n const state = useContext(MotionContext);\n if (!motion || typeof motion !== \"object\") return null;\n return resolveModuleMotion(state, motion) as M;\n}\n\nfunction resolveModuleMotion(state: MotionState, motion: object): unknown {\n let byConfig = resolvedMotion.get(state);\n if (!byConfig) {\n byConfig = new WeakMap();\n resolvedMotion.set(state, byConfig);\n }\n if (!byConfig.has(motion)) {\n byConfig.set(motion, retimeModuleMotion(motion, state));\n }\n return byConfig.get(motion);\n}\n\n/**\n * Applies the app's reduced-motion policy to the motion components inside a\n * module (positional values such as width, height, x and scale jump instead of\n * animating). CoreProvider wraps every module backdrop and overlay in it.\n */\nexport function ModuleMotionConfig({ children }: { children?: ReactNode }) {\n const { tokens } = useContext(MotionContext);\n return createElement(\n MotionConfig,\n { reducedMotion: tokens.reducedMotion },\n children,\n );\n}\n"]}