@spring-systems/core 0.8.6 → 0.8.7

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 (97) hide show
  1. package/dist/adapters/index.js +1 -56
  2. package/dist/auth/index.js +1 -19
  3. package/dist/chunk-3OMNT22N.js +1 -0
  4. package/dist/chunk-4KRUU6MS.js +1 -0
  5. package/dist/chunk-6J2VFOKL.js +1 -0
  6. package/dist/chunk-7P4BJDQR.js +1 -0
  7. package/dist/chunk-AMXSATFF.js +1 -0
  8. package/dist/chunk-BMIRKMVX.js +1 -0
  9. package/dist/chunk-EVDFSWPU.js +1 -0
  10. package/dist/chunk-F3VXVDPQ.js +1 -0
  11. package/dist/chunk-GSQE2NEY.js +1 -0
  12. package/dist/chunk-HUASNNWD.js +1 -0
  13. package/dist/chunk-ICKHSEIX.js +1 -0
  14. package/dist/chunk-JRHMAY5G.js +1 -0
  15. package/dist/chunk-MNLYYTGZ.js +7 -0
  16. package/dist/chunk-OOVZTF74.js +1 -0
  17. package/dist/chunk-PNDXLNCU.js +1 -0
  18. package/dist/chunk-R3XYEEGR.js +1 -0
  19. package/dist/chunk-RKLYBW3O.js +1 -0
  20. package/dist/chunk-RVQHSQYF.js +3 -0
  21. package/dist/chunk-UT6X6RQM.js +1 -0
  22. package/dist/chunk-Y6DB43IE.js +3 -0
  23. package/dist/chunk-YMSSF2ZU.js +1 -0
  24. package/dist/config/index.js +1 -109
  25. package/dist/devtools/index.js +1 -67
  26. package/dist/errors/index.js +1 -21
  27. package/dist/events/index.js +1 -12
  28. package/dist/i18n/index.js +1 -7
  29. package/dist/index.js +1 -42
  30. package/dist/instance/index.js +1 -37
  31. package/dist/logger/index.js +1 -27
  32. package/dist/middleware/index.js +1 -23
  33. package/dist/plugins/index.js +1 -16
  34. package/dist/testing/index.js +1 -171
  35. package/dist/types/index.js +1 -72
  36. package/dist/utils/index.d.ts +1 -0
  37. package/dist/utils/index.js +1 -772
  38. package/dist/validation/index.js +1 -147
  39. package/package.json +137 -136
  40. package/dist/adapters/index.js.map +0 -1
  41. package/dist/auth/index.js.map +0 -1
  42. package/dist/chunk-2PJWFA5S.js +0 -393
  43. package/dist/chunk-2PJWFA5S.js.map +0 -1
  44. package/dist/chunk-EFUBAQCV.js +0 -94
  45. package/dist/chunk-EFUBAQCV.js.map +0 -1
  46. package/dist/chunk-F2SIMWZ5.js +0 -173
  47. package/dist/chunk-F2SIMWZ5.js.map +0 -1
  48. package/dist/chunk-F7WUQJH7.js +0 -399
  49. package/dist/chunk-F7WUQJH7.js.map +0 -1
  50. package/dist/chunk-GON7Q32Q.js +0 -176
  51. package/dist/chunk-GON7Q32Q.js.map +0 -1
  52. package/dist/chunk-GXU75LQX.js +0 -182
  53. package/dist/chunk-GXU75LQX.js.map +0 -1
  54. package/dist/chunk-HFELOXDQ.js +0 -110
  55. package/dist/chunk-HFELOXDQ.js.map +0 -1
  56. package/dist/chunk-KX32MU3I.js +0 -190
  57. package/dist/chunk-KX32MU3I.js.map +0 -1
  58. package/dist/chunk-MEWPYTWC.js +0 -284
  59. package/dist/chunk-MEWPYTWC.js.map +0 -1
  60. package/dist/chunk-N2L4TUC4.js +0 -34
  61. package/dist/chunk-N2L4TUC4.js.map +0 -1
  62. package/dist/chunk-NQQIVCLX.js +0 -47
  63. package/dist/chunk-NQQIVCLX.js.map +0 -1
  64. package/dist/chunk-OSSX443T.js +0 -146
  65. package/dist/chunk-OSSX443T.js.map +0 -1
  66. package/dist/chunk-PT4DIYUK.js +0 -78
  67. package/dist/chunk-PT4DIYUK.js.map +0 -1
  68. package/dist/chunk-QAVWXARR.js +0 -51
  69. package/dist/chunk-QAVWXARR.js.map +0 -1
  70. package/dist/chunk-RRWKDFAB.js +0 -143
  71. package/dist/chunk-RRWKDFAB.js.map +0 -1
  72. package/dist/chunk-RUCXSQEY.js +0 -42
  73. package/dist/chunk-RUCXSQEY.js.map +0 -1
  74. package/dist/chunk-S6RPCN5H.js +0 -64
  75. package/dist/chunk-S6RPCN5H.js.map +0 -1
  76. package/dist/chunk-S7MKRNMI.js +0 -153
  77. package/dist/chunk-S7MKRNMI.js.map +0 -1
  78. package/dist/chunk-SQB4F3EF.js +0 -55
  79. package/dist/chunk-SQB4F3EF.js.map +0 -1
  80. package/dist/chunk-UDT2RPX2.js +0 -43
  81. package/dist/chunk-UDT2RPX2.js.map +0 -1
  82. package/dist/chunk-VRMVN2UM.js +0 -17
  83. package/dist/chunk-VRMVN2UM.js.map +0 -1
  84. package/dist/config/index.js.map +0 -1
  85. package/dist/devtools/index.js.map +0 -1
  86. package/dist/errors/index.js.map +0 -1
  87. package/dist/events/index.js.map +0 -1
  88. package/dist/i18n/index.js.map +0 -1
  89. package/dist/index.js.map +0 -1
  90. package/dist/instance/index.js.map +0 -1
  91. package/dist/logger/index.js.map +0 -1
  92. package/dist/middleware/index.js.map +0 -1
  93. package/dist/plugins/index.js.map +0 -1
  94. package/dist/testing/index.js.map +0 -1
  95. package/dist/types/index.js.map +0 -1
  96. package/dist/utils/index.js.map +0 -1
  97. package/dist/validation/index.js.map +0 -1
@@ -1,393 +0,0 @@
1
- import {
2
- getFrameworkConfig
3
- } from "./chunk-F7WUQJH7.js";
4
-
5
- // src/config/config-presets.ts
6
- var developmentPreset = {
7
- limits: {
8
- maxFileSize: 100 * 1024 * 1024
9
- // 100MB for testing large files
10
- }
11
- };
12
- var stagingPreset = {
13
- limits: {
14
- maxFileSize: 50 * 1024 * 1024
15
- // 50MB
16
- }
17
- };
18
- var productionPreset = {
19
- limits: {
20
- maxFileSize: 25 * 1024 * 1024
21
- // 25MB
22
- }
23
- };
24
- var presets = {
25
- development: developmentPreset,
26
- staging: stagingPreset,
27
- production: productionPreset
28
- };
29
- function getConfigPreset(env) {
30
- const preset = presets[env];
31
- return {
32
- ...preset,
33
- limits: preset.limits ? { ...preset.limits } : void 0
34
- };
35
- }
36
- function getAutoConfigPreset(options) {
37
- const importMetaEnv = options?.env ?? import.meta.env;
38
- const processTargetEnv = typeof process !== "undefined" ? process.env?.TARGET_ENV : void 0;
39
- const processNodeEnv = typeof process !== "undefined" ? process.env?.NODE_ENV : void 0;
40
- const targetEnv = options?.targetEnv ?? processTargetEnv ?? (typeof importMetaEnv?.TARGET_ENV === "string" ? importMetaEnv.TARGET_ENV : "") ?? "";
41
- const nodeEnv = options?.nodeEnv ?? processNodeEnv ?? (typeof importMetaEnv?.NODE_ENV === "string" ? importMetaEnv.NODE_ENV : "") ?? "";
42
- const mode = options?.mode ?? (typeof importMetaEnv?.MODE === "string" ? importMetaEnv.MODE : "");
43
- const isProdFlag = options?.prod ?? importMetaEnv?.PROD === true;
44
- if (targetEnv === "prod" || nodeEnv === "production" || mode === "production" || isProdFlag) {
45
- return getConfigPreset("production");
46
- }
47
- if (targetEnv === "staging") return getConfigPreset("staging");
48
- return getConfigPreset("development");
49
- }
50
-
51
- // src/config/layout-presets.ts
52
- var KNOWN_VARIANTS = /* @__PURE__ */ new Set(["admin", "website", "minimal", "custom"]);
53
- function isKnownVariant(value) {
54
- return KNOWN_VARIANTS.has(value);
55
- }
56
- var LAYOUT_PRESETS = {
57
- admin: { variant: "admin", requiresAuth: true },
58
- website: { variant: "website", requiresAuth: false },
59
- minimal: { variant: "minimal", requiresAuth: false },
60
- custom: { variant: "custom", requiresAuth: false }
61
- };
62
- function resolveLayoutConfig(name) {
63
- const config = getFrameworkConfig();
64
- const configured = config.layouts?.[name];
65
- if (configured) {
66
- const variant = configured.variant && isKnownVariant(configured.variant) ? configured.variant : "admin";
67
- const preset = LAYOUT_PRESETS[variant];
68
- return { ...preset, ...configured, variant };
69
- }
70
- if (isKnownVariant(name)) {
71
- return { ...LAYOUT_PRESETS[name], variant: name };
72
- }
73
- return { ...LAYOUT_PRESETS.admin, variant: "admin" };
74
- }
75
-
76
- // src/config/theme.ts
77
- var DEFAULT_THEME = {
78
- colorPrimary: "#2563eb",
79
- colorPrimaryLight: "#2563eb1f",
80
- colorPrimaryDark: "#1d4ed8",
81
- colorSecondaryDark: "#1e3a5f",
82
- colorDanger: "#b91c1c",
83
- colorSuccess: "#15803d",
84
- colorSuccessLight: "#e5f3ec",
85
- colorBg: "#dfebfb",
86
- colorBgLight: "#eff6ff",
87
- colorPanel: "white",
88
- colorBorder: "#a2a3b8",
89
- colorActive: "#ffbf49",
90
- colorDisabledBg: "#e4e4e4",
91
- colorText: "black",
92
- colorTextMuted: "#666666",
93
- colorTextDisabled: "#636363",
94
- colorTextSecondary: "white",
95
- colorPanelSecondary: "white",
96
- colorPanelDashboard: "#dfebfb",
97
- colorPanelDashboardSecondary: "#cbdbf2",
98
- colorPanelAlt: "#f9fafb",
99
- colorChartBg: "#201f25",
100
- colorTextOnAccent: "var(--spring-color-text-secondary)",
101
- colorDarkLightSecondary: "#eff6ff",
102
- fontSizeXxs: "10px",
103
- fontSizeXs: "11px",
104
- fontSizeSm: "12px",
105
- fontSizeMd: "13px",
106
- fontSizeLg: "14px",
107
- fontSizeXl: "16px",
108
- fontSize2xl: "22px",
109
- radiusXs: "1px",
110
- radiusSm: "3px",
111
- radiusMd: "6px",
112
- radiusLg: "12px",
113
- radiusXl: "16px",
114
- radiusDialog: "8px",
115
- radiusPanel: "10px",
116
- shadowXs: "0 1px 2px rgba(0, 0, 0, 0.06)",
117
- shadowSm: "0 2px 6px rgba(0, 0, 0, 0.06)",
118
- shadowMd: "0 4px 12px rgba(0, 0, 0, 0.15)",
119
- shadowLg: "0 4px 16px rgba(0, 0, 0, 0.12)",
120
- shadowPopup: "0 12px 32px rgba(0, 0, 0, 0.18), 0 6px 12px rgba(0, 0, 0, 0.12)",
121
- shadowNavbar: "0 2px 8px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.12)",
122
- shadowInset: "inset 0 2px 4px rgba(0, 0, 0, 0.04)",
123
- shadowBottom: "0 -2px 5px rgba(0, 0, 0, 0.2)",
124
- shadowDnd: "0 4px 12px rgba(0, 0, 0, 0.25)",
125
- shadowDndLg: "0 4px 12px rgba(0, 0, 0, 0.15), 0 8px 24px rgba(0, 0, 0, 0.2)",
126
- shadowDragSm: "0 2px 8px rgba(0, 0, 0, 0.2)",
127
- shadowSubtle: "0 2px 4px rgba(0, 0, 0, 0.15)",
128
- shadowRingWhite: "inset 0 0 0 2px rgba(255, 255, 255, 0.5)",
129
- transitionFast: "0.15s ease",
130
- transitionNormal: "0.3s ease",
131
- opacityGhost: "0.35",
132
- opacitySubtle: "0.4",
133
- opacityDisabled: "0.5",
134
- opacityMuted: "0.6",
135
- opacityOverlay: "0.7",
136
- opacityHover: "0.8",
137
- opacityHigh: "0.85",
138
- opacityNearOpaque: "0.9",
139
- sizeInputHeight: "27px",
140
- fontFamilyBase: "Verdana, Geneva, sans-serif"
141
- };
142
- var CAMEL_TO_CSS = {
143
- colorPrimary: "--spring-color-primary",
144
- colorPrimaryLight: "--spring-color-primary-light",
145
- colorPrimaryDark: "--spring-color-primary-dark",
146
- colorSecondaryDark: "--spring-color-secondary-dark",
147
- colorDanger: "--spring-color-danger",
148
- colorSuccess: "--spring-color-success",
149
- colorSuccessLight: "--spring-color-success-light",
150
- colorBg: "--spring-color-bg",
151
- colorBgLight: "--spring-color-bg-light",
152
- colorPanel: "--spring-color-panel",
153
- colorBorder: "--spring-color-border",
154
- colorActive: "--spring-color-active",
155
- colorDisabledBg: "--spring-color-disabled-bg",
156
- colorText: "--spring-color-text",
157
- colorTextMuted: "--spring-color-text-muted",
158
- colorTextDisabled: "--spring-color-text-disabled",
159
- colorTextSecondary: "--spring-color-text-secondary",
160
- colorPanelSecondary: "--spring-color-panel-secondary",
161
- colorPanelDashboard: "--spring-color-panel-dashboard",
162
- colorPanelDashboardSecondary: "--spring-color-panel-dashboard-secondary",
163
- colorPanelAlt: "--spring-color-panel-alt",
164
- colorChartBg: "--spring-color-chart-bg",
165
- colorTextOnAccent: "--spring-color-text-on-accent",
166
- colorDarkLightSecondary: "--spring-color-dark-light-secondary",
167
- fontSizeXxs: "--spring-font-size-xxs",
168
- fontSizeXs: "--spring-font-size-xs",
169
- fontSizeSm: "--spring-font-size-sm",
170
- fontSizeMd: "--spring-font-size-md",
171
- fontSizeLg: "--spring-font-size-lg",
172
- fontSizeXl: "--spring-font-size-xl",
173
- fontSize2xl: "--spring-font-size-2xl",
174
- radiusXs: "--spring-radius-xs",
175
- radiusSm: "--spring-radius-sm",
176
- radiusMd: "--spring-radius-md",
177
- radiusLg: "--spring-radius-lg",
178
- radiusXl: "--spring-radius-xl",
179
- radiusDialog: "--spring-radius-dialog",
180
- radiusPanel: "--spring-radius-panel",
181
- shadowXs: "--spring-shadow-xs",
182
- shadowSm: "--spring-shadow-sm",
183
- shadowMd: "--spring-shadow-md",
184
- shadowLg: "--spring-shadow-lg",
185
- shadowPopup: "--spring-shadow-popup",
186
- shadowNavbar: "--spring-shadow-navbar",
187
- shadowInset: "--spring-shadow-inset",
188
- shadowBottom: "--spring-shadow-bottom",
189
- shadowDnd: "--spring-shadow-dnd",
190
- shadowDndLg: "--spring-shadow-dnd-lg",
191
- shadowDragSm: "--spring-shadow-drag-sm",
192
- shadowSubtle: "--spring-shadow-subtle",
193
- shadowRingWhite: "--spring-shadow-ring-white",
194
- transitionFast: "--spring-transition-fast",
195
- transitionNormal: "--spring-transition-normal",
196
- opacityGhost: "--spring-opacity-ghost",
197
- opacitySubtle: "--spring-opacity-subtle",
198
- opacityDisabled: "--spring-opacity-disabled",
199
- opacityMuted: "--spring-opacity-muted",
200
- opacityOverlay: "--spring-opacity-overlay",
201
- opacityHover: "--spring-opacity-hover",
202
- opacityHigh: "--spring-opacity-high",
203
- opacityNearOpaque: "--spring-opacity-near-opaque",
204
- sizeInputHeight: "--spring-size-input-height",
205
- fontFamilyBase: "--spring-font-family-base"
206
- };
207
- var componentTokenMap = {
208
- button: {
209
- borderRadius: "--spring-button-border-radius",
210
- paddingX: "--spring-button-padding-x",
211
- paddingY: "--spring-button-padding-y",
212
- fontSize: "--spring-button-font-size",
213
- primaryBg: "--spring-button-primary-bg",
214
- primaryColor: "--spring-button-primary-color",
215
- primaryHoverFilter: "--spring-button-primary-hover-filter",
216
- outlineBorderColor: "--spring-button-outline-border-color",
217
- ghostHoverBg: "--spring-button-ghost-hover-bg",
218
- minWidth: "--spring-button-min-width",
219
- smPaddingX: "--spring-button-sm-padding-x",
220
- smPaddingY: "--spring-button-sm-padding-y",
221
- smFontSize: "--spring-button-sm-font-size",
222
- smMinWidth: "--spring-button-sm-min-width",
223
- lgPaddingX: "--spring-button-lg-padding-x",
224
- lgPaddingY: "--spring-button-lg-padding-y",
225
- lgFontSize: "--spring-button-lg-font-size",
226
- lgMinWidth: "--spring-button-lg-min-width"
227
- },
228
- list: {
229
- rowHeight: "--spring-list-row-height",
230
- headerBg: "--spring-list-header-bg",
231
- headerColor: "--spring-list-header-color",
232
- stripedBg: "--spring-list-striped-bg",
233
- selectedBg: "--spring-list-selected-bg",
234
- hoverBg: "--spring-list-hover-bg",
235
- borderColor: "--spring-list-border-color",
236
- fontSize: "--spring-list-font-size"
237
- },
238
- form: {
239
- fieldSpacing: "--spring-form-field-spacing",
240
- labelColor: "--spring-form-label-color",
241
- labelFontSize: "--spring-form-label-font-size",
242
- inputHeight: "--spring-form-input-height",
243
- inputBg: "--spring-form-input-bg",
244
- inputBorderColor: "--spring-form-input-border-color",
245
- inputFocusBorderColor: "--spring-form-input-focus-border-color",
246
- inputFontSize: "--spring-form-input-font-size",
247
- inputBorderRadius: "--spring-form-input-border-radius"
248
- },
249
- dialog: {
250
- backdropColor: "--spring-dialog-backdrop-color",
251
- maxWidth: "--spring-dialog-max-width",
252
- borderRadius: "--spring-dialog-border-radius",
253
- padding: "--spring-dialog-padding",
254
- shadowColor: "--spring-dialog-shadow-color"
255
- },
256
- page: {
257
- headerBg: "--spring-page-header-bg",
258
- headerBorderColor: "--spring-page-header-border-color",
259
- navigationBg: "--spring-page-navigation-bg",
260
- navigationWidth: "--spring-page-navigation-width",
261
- contentBg: "--spring-page-content-bg"
262
- },
263
- panel: {
264
- bg: "--spring-panel-bg",
265
- borderColor: "--spring-panel-border-color",
266
- borderRadius: "--spring-panel-border-radius",
267
- padding: "--spring-panel-padding"
268
- }
269
- };
270
- var DEFAULT_DARK_THEME = {
271
- colorPrimary: "#7c78d8",
272
- colorPrimaryLight: "#7c78d81f",
273
- colorPrimaryDark: "#9d9ae0",
274
- colorSecondaryDark: "#c8c6f0",
275
- colorDanger: "#ef4444",
276
- colorSuccess: "#22c55e",
277
- colorSuccessLight: "#1a3a2a",
278
- colorBg: "#1a1b2e",
279
- colorBgLight: "#222340",
280
- colorPanel: "#2a2b45",
281
- colorBorder: "#4a4b6a",
282
- colorActive: "#f59e0b",
283
- colorDisabledBg: "#3a3b55",
284
- colorText: "#e4e4f0",
285
- colorTextMuted: "#a0a0b8",
286
- colorTextDisabled: "#6a6a80",
287
- colorTextSecondary: "#f0f0ff",
288
- colorPanelSecondary: "#32334d",
289
- colorPanelDashboard: "#1e1f35",
290
- colorPanelDashboardSecondary: "#262742",
291
- colorPanelAlt: "#32334d",
292
- colorChartBg: "#1a1b2e",
293
- colorDarkLightSecondary: "#2e2f4a",
294
- shadowXs: "0 1px 2px rgba(0, 0, 0, 0.2)",
295
- shadowSm: "0 2px 6px rgba(0, 0, 0, 0.25)",
296
- shadowMd: "0 4px 12px rgba(0, 0, 0, 0.4)",
297
- shadowLg: "0 4px 16px rgba(0, 0, 0, 0.35)",
298
- shadowPopup: "0 12px 32px rgba(0, 0, 0, 0.5), 0 6px 12px rgba(0, 0, 0, 0.35)",
299
- shadowNavbar: "0 2px 8px rgba(0, 0, 0, 0.25), 0 4px 16px rgba(0, 0, 0, 0.3)",
300
- shadowInset: "inset 0 2px 4px rgba(0, 0, 0, 0.15)",
301
- shadowBottom: "0 -2px 5px rgba(0, 0, 0, 0.4)",
302
- shadowDnd: "0 4px 12px rgba(0, 0, 0, 0.5)",
303
- shadowDndLg: "0 4px 12px rgba(0, 0, 0, 0.35), 0 8px 24px rgba(0, 0, 0, 0.45)",
304
- shadowDragSm: "0 2px 8px rgba(0, 0, 0, 0.45)",
305
- shadowSubtle: "0 2px 4px rgba(0, 0, 0, 0.35)",
306
- shadowRingWhite: "inset 0 0 0 2px rgba(255, 255, 255, 0.3)"
307
- };
308
- function createTheme(overrides) {
309
- return { ...DEFAULT_THEME, ...overrides };
310
- }
311
- function getResolvedTheme() {
312
- if (typeof document === "undefined") {
313
- return { ...DEFAULT_THEME };
314
- }
315
- const style = getComputedStyle(document.documentElement);
316
- const result = { ...DEFAULT_THEME };
317
- for (const [key, cssVar] of Object.entries(CAMEL_TO_CSS)) {
318
- const value = style.getPropertyValue(cssVar).trim();
319
- if (value) {
320
- result[key] = value;
321
- }
322
- }
323
- return result;
324
- }
325
- function themeToCSS(theme, componentTokens) {
326
- const lines = Object.entries(theme).filter(([key]) => key in CAMEL_TO_CSS).map(([key, value]) => ` ${CAMEL_TO_CSS[key]}: ${value};`);
327
- if (componentTokens) {
328
- for (const [group, tokens] of Object.entries(componentTokens)) {
329
- const map = componentTokenMap[group];
330
- if (!map) continue;
331
- for (const [key, value] of Object.entries(tokens)) {
332
- const cssVar = map[key];
333
- if (cssVar && value) {
334
- lines.push(` ${cssVar}: ${value};`);
335
- }
336
- }
337
- }
338
- }
339
- return `:root {
340
- ${lines.join("\n")}
341
- }`;
342
- }
343
- function themeToCSSDark(darkOverrides) {
344
- const lines = [];
345
- for (const [key, value] of Object.entries(darkOverrides)) {
346
- const cssVar = CAMEL_TO_CSS[key];
347
- if (cssVar && value) {
348
- lines.push(` ${cssVar}: ${value};`);
349
- }
350
- }
351
- if (lines.length === 0) return "";
352
- return `[data-spring-theme="dark"] {
353
- ${lines.join("\n")}
354
- }`;
355
- }
356
- function themeToCSSVariables(theme, componentTokens) {
357
- const result = {};
358
- for (const [key, value] of Object.entries(theme)) {
359
- const cssVar = CAMEL_TO_CSS[key];
360
- if (cssVar) {
361
- result[cssVar] = value;
362
- }
363
- }
364
- if (componentTokens) {
365
- for (const [group, tokens] of Object.entries(componentTokens)) {
366
- const map = componentTokenMap[group];
367
- if (!map) continue;
368
- for (const [key, value] of Object.entries(tokens)) {
369
- const cssVar = map[key];
370
- if (cssVar && value) {
371
- result[cssVar] = value;
372
- }
373
- }
374
- }
375
- }
376
- return result;
377
- }
378
-
379
- export {
380
- getConfigPreset,
381
- getAutoConfigPreset,
382
- LAYOUT_PRESETS,
383
- resolveLayoutConfig,
384
- DEFAULT_THEME,
385
- CAMEL_TO_CSS,
386
- DEFAULT_DARK_THEME,
387
- createTheme,
388
- getResolvedTheme,
389
- themeToCSS,
390
- themeToCSSDark,
391
- themeToCSSVariables
392
- };
393
- //# sourceMappingURL=chunk-2PJWFA5S.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/config-presets.ts","../src/config/layout-presets.ts","../src/config/theme.ts"],"sourcesContent":["/**\n * Environment-specific configuration presets for enterprise deployments.\n *\n * Provides sensible defaults per environment (development, staging, production)\n * that can be used as a base for `configureFramework()`.\n *\n * @example\n * ```ts\n * import { configureFramework } from \"@spring-systems/core/config\";\n * import { getConfigPreset } from \"@spring-systems/core/config\";\n *\n * // Use production preset as base, override app-specific settings\n * const preset = getConfigPreset(\"production\");\n * configureFramework({\n * ...preset,\n * app: { ...preset.app, name: \"My SPRING\" },\n * });\n * ```\n *\n * @module config-presets\n */\n\nimport type { FrameworkConfigOverrides } from \"./framework-config-types\";\n\n/** Supported environment names for config presets. */\nexport type ConfigEnvironment = \"development\" | \"staging\" | \"production\";\nexport interface AutoConfigPresetOptions {\n targetEnv?: string;\n nodeEnv?: string;\n mode?: string;\n prod?: boolean;\n env?: Record<string, unknown>;\n}\n\n/**\n * Development preset — verbose logging, relaxed limits, debug-friendly.\n */\nconst developmentPreset = {\n limits: {\n maxFileSize: 100 * 1024 * 1024, // 100MB for testing large files\n },\n} satisfies FrameworkConfigOverrides;\n\n/**\n * Staging preset — production-like but with more verbose error reporting.\n */\nconst stagingPreset = {\n limits: {\n maxFileSize: 50 * 1024 * 1024, // 50MB\n },\n} satisfies FrameworkConfigOverrides;\n\n/**\n * Production preset — strict security, optimized limits, minimal logging.\n */\nconst productionPreset = {\n limits: {\n maxFileSize: 25 * 1024 * 1024, // 25MB\n },\n} satisfies FrameworkConfigOverrides;\n\nconst presets = {\n development: developmentPreset,\n staging: stagingPreset,\n production: productionPreset,\n} satisfies Record<ConfigEnvironment, FrameworkConfigOverrides>;\n\n/**\n * Get environment-specific configuration defaults.\n * Use as a base for `configureFramework()` — merge with app-specific overrides.\n */\nexport function getConfigPreset(env: ConfigEnvironment): FrameworkConfigOverrides {\n const preset = presets[env];\n return {\n ...preset,\n limits: preset.limits ? { ...preset.limits } : undefined,\n };\n}\n\n/**\n * Auto-detect environment from NODE_ENV / TARGET_ENV and return the matching preset.\n * Falls back to \"development\" if not recognized.\n */\nexport function getAutoConfigPreset(options?: AutoConfigPresetOptions): FrameworkConfigOverrides {\n const importMetaEnv = options?.env ?? (import.meta as ImportMeta & { env?: Record<string, unknown> }).env;\n const processTargetEnv = typeof process !== \"undefined\" ? process.env?.TARGET_ENV : undefined;\n const processNodeEnv = typeof process !== \"undefined\" ? process.env?.NODE_ENV : undefined;\n const targetEnv =\n options?.targetEnv ??\n processTargetEnv ??\n (typeof importMetaEnv?.TARGET_ENV === \"string\" ? importMetaEnv.TARGET_ENV : \"\") ??\n \"\";\n const nodeEnv =\n options?.nodeEnv ??\n processNodeEnv ??\n (typeof importMetaEnv?.NODE_ENV === \"string\" ? importMetaEnv.NODE_ENV : \"\") ??\n \"\";\n const mode = options?.mode ?? (typeof importMetaEnv?.MODE === \"string\" ? importMetaEnv.MODE : \"\");\n const isProdFlag = options?.prod ?? (importMetaEnv?.PROD === true);\n\n if (targetEnv === \"prod\" || nodeEnv === \"production\" || mode === \"production\" || isProdFlag) {\n return getConfigPreset(\"production\");\n }\n if (targetEnv === \"staging\") return getConfigPreset(\"staging\");\n return getConfigPreset(\"development\");\n}\n","/**\n * Default layout presets and resolution logic.\n * @module layout-presets\n */\n\nimport { getFrameworkConfig } from \"./framework-config\";\nimport type { LayoutConfig, LayoutVariant } from \"./framework-config-types\";\n\nconst KNOWN_VARIANTS = new Set<string>([\"admin\", \"website\", \"minimal\", \"custom\"]);\n\nfunction isKnownVariant(value: string): value is LayoutVariant {\n return KNOWN_VARIANTS.has(value);\n}\n\n/** Default configurations for each layout variant (without navigation). */\nexport const LAYOUT_PRESETS: Record<LayoutVariant, Omit<LayoutConfig, \"navigation\">> = {\n admin: { variant: \"admin\", requiresAuth: true },\n website: { variant: \"website\", requiresAuth: false },\n minimal: { variant: \"minimal\", requiresAuth: false },\n custom: { variant: \"custom\", requiresAuth: false },\n};\n\n/**\n * Resolve a layout configuration by name.\n *\n * Looks up `config.layouts[name]` first, then falls back to\n * the preset matching the name (if it's a known variant),\n * and finally defaults to the admin preset.\n */\nexport function resolveLayoutConfig(name: string): LayoutConfig {\n const config = getFrameworkConfig();\n const configured = config.layouts?.[name];\n\n if (configured) {\n const variant = configured.variant && isKnownVariant(configured.variant)\n ? configured.variant\n : \"admin\";\n const preset = LAYOUT_PRESETS[variant];\n return { ...preset, ...configured, variant };\n }\n\n // If name matches a known variant, use the preset directly\n if (isKnownVariant(name)) {\n return { ...LAYOUT_PRESETS[name], variant: name };\n }\n\n // Fallback to admin\n return { ...LAYOUT_PRESETS.admin, variant: \"admin\" };\n}\n","/**\n * Theme variable contract for the SPRING framework.\n * Projects override these via CSS `@theme` in their globals.css.\n * @module theme\n */\n\n/** Template literal type for SPRING CSS custom properties. */\nexport type SpringCssVariable = `--spring-${string}`;\n\nexport interface SpringThemeVariables {\n colorPrimary: string;\n colorPrimaryLight: string;\n colorPrimaryDark: string;\n colorSecondaryDark: string;\n colorDanger: string;\n colorSuccess: string;\n colorSuccessLight: string;\n colorBg: string;\n colorBgLight: string;\n colorPanel: string;\n colorBorder: string;\n colorActive: string;\n colorDisabledBg: string;\n colorText: string;\n colorTextMuted: string;\n colorTextDisabled: string;\n colorTextSecondary: string;\n colorPanelSecondary: string;\n colorPanelDashboard: string;\n colorPanelDashboardSecondary: string;\n colorPanelAlt: string;\n colorChartBg: string;\n colorTextOnAccent: string;\n colorDarkLightSecondary: string;\n fontSizeXxs: string;\n fontSizeXs: string;\n fontSizeSm: string;\n fontSizeMd: string;\n fontSizeLg: string;\n fontSizeXl: string;\n fontSize2xl: string;\n radiusXs: string;\n radiusSm: string;\n radiusMd: string;\n radiusLg: string;\n radiusXl: string;\n radiusDialog: string;\n radiusPanel: string;\n shadowXs: string;\n shadowSm: string;\n shadowMd: string;\n shadowLg: string;\n shadowPopup: string;\n shadowNavbar: string;\n shadowInset: string;\n shadowBottom: string;\n shadowDnd: string;\n shadowDndLg: string;\n shadowDragSm: string;\n shadowSubtle: string;\n shadowRingWhite: string;\n transitionFast: string;\n transitionNormal: string;\n opacityGhost: string;\n opacitySubtle: string;\n opacityDisabled: string;\n opacityMuted: string;\n opacityOverlay: string;\n opacityHover: string;\n opacityHigh: string;\n opacityNearOpaque: string;\n sizeInputHeight: string;\n fontFamilyBase: string;\n}\n\nexport const DEFAULT_THEME = {\n colorPrimary: \"#2563eb\",\n colorPrimaryLight: \"#2563eb1f\",\n colorPrimaryDark: \"#1d4ed8\",\n colorSecondaryDark: \"#1e3a5f\",\n colorDanger: \"#b91c1c\",\n colorSuccess: \"#15803d\",\n colorSuccessLight: \"#e5f3ec\",\n colorBg: \"#dfebfb\",\n colorBgLight: \"#eff6ff\",\n colorPanel: \"white\",\n colorBorder: \"#a2a3b8\",\n colorActive: \"#ffbf49\",\n colorDisabledBg: \"#e4e4e4\",\n colorText: \"black\",\n colorTextMuted: \"#666666\",\n colorTextDisabled: \"#636363\",\n colorTextSecondary: \"white\",\n colorPanelSecondary: \"white\",\n colorPanelDashboard: \"#dfebfb\",\n colorPanelDashboardSecondary: \"#cbdbf2\",\n colorPanelAlt: \"#f9fafb\",\n colorChartBg: \"#201f25\",\n colorTextOnAccent: \"var(--spring-color-text-secondary)\",\n colorDarkLightSecondary: \"#eff6ff\",\n fontSizeXxs: \"10px\",\n fontSizeXs: \"11px\",\n fontSizeSm: \"12px\",\n fontSizeMd: \"13px\",\n fontSizeLg: \"14px\",\n fontSizeXl: \"16px\",\n fontSize2xl: \"22px\",\n radiusXs: \"1px\",\n radiusSm: \"3px\",\n radiusMd: \"6px\",\n radiusLg: \"12px\",\n radiusXl: \"16px\",\n radiusDialog: \"8px\",\n radiusPanel: \"10px\",\n shadowXs: \"0 1px 2px rgba(0, 0, 0, 0.06)\",\n shadowSm: \"0 2px 6px rgba(0, 0, 0, 0.06)\",\n shadowMd: \"0 4px 12px rgba(0, 0, 0, 0.15)\",\n shadowLg: \"0 4px 16px rgba(0, 0, 0, 0.12)\",\n shadowPopup: \"0 12px 32px rgba(0, 0, 0, 0.18), 0 6px 12px rgba(0, 0, 0, 0.12)\",\n shadowNavbar: \"0 2px 8px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.12)\",\n shadowInset: \"inset 0 2px 4px rgba(0, 0, 0, 0.04)\",\n shadowBottom: \"0 -2px 5px rgba(0, 0, 0, 0.2)\",\n shadowDnd: \"0 4px 12px rgba(0, 0, 0, 0.25)\",\n shadowDndLg: \"0 4px 12px rgba(0, 0, 0, 0.15), 0 8px 24px rgba(0, 0, 0, 0.2)\",\n shadowDragSm: \"0 2px 8px rgba(0, 0, 0, 0.2)\",\n shadowSubtle: \"0 2px 4px rgba(0, 0, 0, 0.15)\",\n shadowRingWhite: \"inset 0 0 0 2px rgba(255, 255, 255, 0.5)\",\n transitionFast: \"0.15s ease\",\n transitionNormal: \"0.3s ease\",\n opacityGhost: \"0.35\",\n opacitySubtle: \"0.4\",\n opacityDisabled: \"0.5\",\n opacityMuted: \"0.6\",\n opacityOverlay: \"0.7\",\n opacityHover: \"0.8\",\n opacityHigh: \"0.85\",\n opacityNearOpaque: \"0.9\",\n sizeInputHeight: \"27px\",\n fontFamilyBase: \"Verdana, Geneva, sans-serif\",\n} as const satisfies SpringThemeVariables;\n\nexport const CAMEL_TO_CSS = {\n colorPrimary: \"--spring-color-primary\",\n colorPrimaryLight: \"--spring-color-primary-light\",\n colorPrimaryDark: \"--spring-color-primary-dark\",\n colorSecondaryDark: \"--spring-color-secondary-dark\",\n colorDanger: \"--spring-color-danger\",\n colorSuccess: \"--spring-color-success\",\n colorSuccessLight: \"--spring-color-success-light\",\n colorBg: \"--spring-color-bg\",\n colorBgLight: \"--spring-color-bg-light\",\n colorPanel: \"--spring-color-panel\",\n colorBorder: \"--spring-color-border\",\n colorActive: \"--spring-color-active\",\n colorDisabledBg: \"--spring-color-disabled-bg\",\n colorText: \"--spring-color-text\",\n colorTextMuted: \"--spring-color-text-muted\",\n colorTextDisabled: \"--spring-color-text-disabled\",\n colorTextSecondary: \"--spring-color-text-secondary\",\n colorPanelSecondary: \"--spring-color-panel-secondary\",\n colorPanelDashboard: \"--spring-color-panel-dashboard\",\n colorPanelDashboardSecondary: \"--spring-color-panel-dashboard-secondary\",\n colorPanelAlt: \"--spring-color-panel-alt\",\n colorChartBg: \"--spring-color-chart-bg\",\n colorTextOnAccent: \"--spring-color-text-on-accent\",\n colorDarkLightSecondary: \"--spring-color-dark-light-secondary\",\n fontSizeXxs: \"--spring-font-size-xxs\",\n fontSizeXs: \"--spring-font-size-xs\",\n fontSizeSm: \"--spring-font-size-sm\",\n fontSizeMd: \"--spring-font-size-md\",\n fontSizeLg: \"--spring-font-size-lg\",\n fontSizeXl: \"--spring-font-size-xl\",\n fontSize2xl: \"--spring-font-size-2xl\",\n radiusXs: \"--spring-radius-xs\",\n radiusSm: \"--spring-radius-sm\",\n radiusMd: \"--spring-radius-md\",\n radiusLg: \"--spring-radius-lg\",\n radiusXl: \"--spring-radius-xl\",\n radiusDialog: \"--spring-radius-dialog\",\n radiusPanel: \"--spring-radius-panel\",\n shadowXs: \"--spring-shadow-xs\",\n shadowSm: \"--spring-shadow-sm\",\n shadowMd: \"--spring-shadow-md\",\n shadowLg: \"--spring-shadow-lg\",\n shadowPopup: \"--spring-shadow-popup\",\n shadowNavbar: \"--spring-shadow-navbar\",\n shadowInset: \"--spring-shadow-inset\",\n shadowBottom: \"--spring-shadow-bottom\",\n shadowDnd: \"--spring-shadow-dnd\",\n shadowDndLg: \"--spring-shadow-dnd-lg\",\n shadowDragSm: \"--spring-shadow-drag-sm\",\n shadowSubtle: \"--spring-shadow-subtle\",\n shadowRingWhite: \"--spring-shadow-ring-white\",\n transitionFast: \"--spring-transition-fast\",\n transitionNormal: \"--spring-transition-normal\",\n opacityGhost: \"--spring-opacity-ghost\",\n opacitySubtle: \"--spring-opacity-subtle\",\n opacityDisabled: \"--spring-opacity-disabled\",\n opacityMuted: \"--spring-opacity-muted\",\n opacityOverlay: \"--spring-opacity-overlay\",\n opacityHover: \"--spring-opacity-hover\",\n opacityHigh: \"--spring-opacity-high\",\n opacityNearOpaque: \"--spring-opacity-near-opaque\",\n sizeInputHeight: \"--spring-size-input-height\",\n fontFamilyBase: \"--spring-font-family-base\",\n} as const satisfies Record<keyof SpringThemeVariables, string>;\n\ntype ThemeKey = keyof typeof CAMEL_TO_CSS;\ntype ComponentTokenGroup = keyof typeof componentTokenMap;\n\n/** Per-component theme tokens. Values can reference --spring-* variables. */\nexport interface SpringComponentTokens {\n button?: {\n borderRadius?: string;\n paddingX?: string;\n paddingY?: string;\n fontSize?: string;\n primaryBg?: string;\n primaryColor?: string;\n primaryHoverFilter?: string;\n outlineBorderColor?: string;\n ghostHoverBg?: string;\n minWidth?: string;\n /** Small size overrides */\n smPaddingX?: string;\n smPaddingY?: string;\n smFontSize?: string;\n smMinWidth?: string;\n /** Large size overrides */\n lgPaddingX?: string;\n lgPaddingY?: string;\n lgFontSize?: string;\n lgMinWidth?: string;\n };\n list?: {\n rowHeight?: string;\n headerBg?: string;\n headerColor?: string;\n stripedBg?: string;\n selectedBg?: string;\n hoverBg?: string;\n borderColor?: string;\n fontSize?: string;\n };\n form?: {\n fieldSpacing?: string;\n labelColor?: string;\n labelFontSize?: string;\n inputHeight?: string;\n inputBg?: string;\n inputBorderColor?: string;\n inputFocusBorderColor?: string;\n inputFontSize?: string;\n inputBorderRadius?: string;\n };\n dialog?: {\n backdropColor?: string;\n maxWidth?: string;\n borderRadius?: string;\n padding?: string;\n shadowColor?: string;\n };\n page?: {\n headerBg?: string;\n headerBorderColor?: string;\n navigationBg?: string;\n navigationWidth?: string;\n contentBg?: string;\n };\n panel?: {\n bg?: string;\n borderColor?: string;\n borderRadius?: string;\n padding?: string;\n };\n}\n\nconst componentTokenMap = {\n button: {\n borderRadius: \"--spring-button-border-radius\",\n paddingX: \"--spring-button-padding-x\",\n paddingY: \"--spring-button-padding-y\",\n fontSize: \"--spring-button-font-size\",\n primaryBg: \"--spring-button-primary-bg\",\n primaryColor: \"--spring-button-primary-color\",\n primaryHoverFilter: \"--spring-button-primary-hover-filter\",\n outlineBorderColor: \"--spring-button-outline-border-color\",\n ghostHoverBg: \"--spring-button-ghost-hover-bg\",\n minWidth: \"--spring-button-min-width\",\n smPaddingX: \"--spring-button-sm-padding-x\",\n smPaddingY: \"--spring-button-sm-padding-y\",\n smFontSize: \"--spring-button-sm-font-size\",\n smMinWidth: \"--spring-button-sm-min-width\",\n lgPaddingX: \"--spring-button-lg-padding-x\",\n lgPaddingY: \"--spring-button-lg-padding-y\",\n lgFontSize: \"--spring-button-lg-font-size\",\n lgMinWidth: \"--spring-button-lg-min-width\",\n },\n list: {\n rowHeight: \"--spring-list-row-height\",\n headerBg: \"--spring-list-header-bg\",\n headerColor: \"--spring-list-header-color\",\n stripedBg: \"--spring-list-striped-bg\",\n selectedBg: \"--spring-list-selected-bg\",\n hoverBg: \"--spring-list-hover-bg\",\n borderColor: \"--spring-list-border-color\",\n fontSize: \"--spring-list-font-size\",\n },\n form: {\n fieldSpacing: \"--spring-form-field-spacing\",\n labelColor: \"--spring-form-label-color\",\n labelFontSize: \"--spring-form-label-font-size\",\n inputHeight: \"--spring-form-input-height\",\n inputBg: \"--spring-form-input-bg\",\n inputBorderColor: \"--spring-form-input-border-color\",\n inputFocusBorderColor: \"--spring-form-input-focus-border-color\",\n inputFontSize: \"--spring-form-input-font-size\",\n inputBorderRadius: \"--spring-form-input-border-radius\",\n },\n dialog: {\n backdropColor: \"--spring-dialog-backdrop-color\",\n maxWidth: \"--spring-dialog-max-width\",\n borderRadius: \"--spring-dialog-border-radius\",\n padding: \"--spring-dialog-padding\",\n shadowColor: \"--spring-dialog-shadow-color\",\n },\n page: {\n headerBg: \"--spring-page-header-bg\",\n headerBorderColor: \"--spring-page-header-border-color\",\n navigationBg: \"--spring-page-navigation-bg\",\n navigationWidth: \"--spring-page-navigation-width\",\n contentBg: \"--spring-page-content-bg\",\n },\n panel: {\n bg: \"--spring-panel-bg\",\n borderColor: \"--spring-panel-border-color\",\n borderRadius: \"--spring-panel-border-radius\",\n padding: \"--spring-panel-padding\",\n },\n} as const satisfies Record<string, Record<string, string>>;\n\n/**\n * Default dark theme overrides.\n * Only includes color tokens that change between light and dark modes.\n * Non-color tokens (fonts, spacing, shadows) inherit from the light theme.\n *\n * @example\n * ```ts\n * // Generate dark mode CSS\n * const css = themeToCSSDark(DEFAULT_DARK_THEME);\n * // Produces [data-spring-theme=\"dark\"] { ... }\n * ```\n */\nexport const DEFAULT_DARK_THEME = {\n colorPrimary: \"#7c78d8\",\n colorPrimaryLight: \"#7c78d81f\",\n colorPrimaryDark: \"#9d9ae0\",\n colorSecondaryDark: \"#c8c6f0\",\n colorDanger: \"#ef4444\",\n colorSuccess: \"#22c55e\",\n colorSuccessLight: \"#1a3a2a\",\n colorBg: \"#1a1b2e\",\n colorBgLight: \"#222340\",\n colorPanel: \"#2a2b45\",\n colorBorder: \"#4a4b6a\",\n colorActive: \"#f59e0b\",\n colorDisabledBg: \"#3a3b55\",\n colorText: \"#e4e4f0\",\n colorTextMuted: \"#a0a0b8\",\n colorTextDisabled: \"#6a6a80\",\n colorTextSecondary: \"#f0f0ff\",\n colorPanelSecondary: \"#32334d\",\n colorPanelDashboard: \"#1e1f35\",\n colorPanelDashboardSecondary: \"#262742\",\n colorPanelAlt: \"#32334d\",\n colorChartBg: \"#1a1b2e\",\n colorDarkLightSecondary: \"#2e2f4a\",\n shadowXs: \"0 1px 2px rgba(0, 0, 0, 0.2)\",\n shadowSm: \"0 2px 6px rgba(0, 0, 0, 0.25)\",\n shadowMd: \"0 4px 12px rgba(0, 0, 0, 0.4)\",\n shadowLg: \"0 4px 16px rgba(0, 0, 0, 0.35)\",\n shadowPopup: \"0 12px 32px rgba(0, 0, 0, 0.5), 0 6px 12px rgba(0, 0, 0, 0.35)\",\n shadowNavbar: \"0 2px 8px rgba(0, 0, 0, 0.25), 0 4px 16px rgba(0, 0, 0, 0.3)\",\n shadowInset: \"inset 0 2px 4px rgba(0, 0, 0, 0.15)\",\n shadowBottom: \"0 -2px 5px rgba(0, 0, 0, 0.4)\",\n shadowDnd: \"0 4px 12px rgba(0, 0, 0, 0.5)\",\n shadowDndLg: \"0 4px 12px rgba(0, 0, 0, 0.35), 0 8px 24px rgba(0, 0, 0, 0.45)\",\n shadowDragSm: \"0 2px 8px rgba(0, 0, 0, 0.45)\",\n shadowSubtle: \"0 2px 4px rgba(0, 0, 0, 0.35)\",\n shadowRingWhite: \"inset 0 0 0 2px rgba(255, 255, 255, 0.3)\",\n} as const satisfies Partial<SpringThemeVariables>;\n\nexport function createTheme(overrides: Partial<SpringThemeVariables>): SpringThemeVariables {\n return { ...DEFAULT_THEME, ...overrides };\n}\n\n/**\n * Read the resolved theme from the DOM (computed CSS variable values).\n * Falls back to DEFAULT_THEME when running on the server or in tests.\n */\nexport function getResolvedTheme(): SpringThemeVariables {\n if (typeof document === \"undefined\") {\n return { ...DEFAULT_THEME };\n }\n const style = getComputedStyle(document.documentElement);\n const result = { ...DEFAULT_THEME };\n for (const [key, cssVar] of Object.entries(CAMEL_TO_CSS)) {\n const value = style.getPropertyValue(cssVar).trim();\n if (value) {\n (result as Record<string, string>)[key] = value;\n }\n }\n return result;\n}\n\nexport function themeToCSS(theme: SpringThemeVariables, componentTokens?: SpringComponentTokens): string {\n const lines = Object.entries(theme)\n .filter(([key]) => key in CAMEL_TO_CSS)\n .map(([key, value]) => ` ${CAMEL_TO_CSS[key as ThemeKey]}: ${value};`);\n\n if (componentTokens) {\n for (const [group, tokens] of Object.entries(componentTokens)) {\n const map = componentTokenMap[group as ComponentTokenGroup];\n if (!map) continue;\n for (const [key, value] of Object.entries(tokens as Record<string, string>)) {\n const cssVar = (map as Record<string, string>)[key];\n if (cssVar && value) {\n lines.push(` ${cssVar}: ${value};`);\n }\n }\n }\n }\n\n return `:root {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\n/**\n * Generate dark mode CSS. Uses `[data-spring-theme=\"dark\"]` selector.\n * The \"system\" preference is resolved by a matchMedia listener in theme-store.ts\n * that sets the attribute — no duplicated @media block needed.\n * Only includes variables that are explicitly set in the dark theme (partial overrides).\n */\nexport function themeToCSSDark(darkOverrides: Partial<SpringThemeVariables>): string {\n const lines: string[] = [];\n for (const [key, value] of Object.entries(darkOverrides)) {\n const cssVar = CAMEL_TO_CSS[key as ThemeKey];\n if (cssVar && value) {\n lines.push(` ${cssVar}: ${value};`);\n }\n }\n if (lines.length === 0) return \"\";\n\n return `[data-spring-theme=\"dark\"] {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nexport function themeToCSSVariables(\n theme: SpringThemeVariables,\n componentTokens?: SpringComponentTokens,\n): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(theme)) {\n const cssVar = CAMEL_TO_CSS[key as ThemeKey];\n if (cssVar) {\n result[cssVar] = value;\n }\n }\n\n if (componentTokens) {\n for (const [group, tokens] of Object.entries(componentTokens)) {\n const map = componentTokenMap[group as ComponentTokenGroup];\n if (!map) continue;\n for (const [key, value] of Object.entries(tokens as Record<string, string>)) {\n const cssVar = (map as Record<string, string>)[key];\n if (cssVar && value) {\n result[cssVar] = value;\n }\n }\n }\n }\n\n return result;\n}\n"],"mappings":";;;;;AAqCA,IAAM,oBAAoB;AAAA,EACtB,QAAQ;AAAA,IACJ,aAAa,MAAM,OAAO;AAAA;AAAA,EAC9B;AACJ;AAKA,IAAM,gBAAgB;AAAA,EAClB,QAAQ;AAAA,IACJ,aAAa,KAAK,OAAO;AAAA;AAAA,EAC7B;AACJ;AAKA,IAAM,mBAAmB;AAAA,EACrB,QAAQ;AAAA,IACJ,aAAa,KAAK,OAAO;AAAA;AAAA,EAC7B;AACJ;AAEA,IAAM,UAAU;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAChB;AAMO,SAAS,gBAAgB,KAAkD;AAC9E,QAAM,SAAS,QAAQ,GAAG;AAC1B,SAAO;AAAA,IACH,GAAG;AAAA,IACH,QAAQ,OAAO,SAAS,EAAE,GAAG,OAAO,OAAO,IAAI;AAAA,EACnD;AACJ;AAMO,SAAS,oBAAoB,SAA6D;AAC7F,QAAM,gBAAgB,SAAS,OAAQ,YAA+D;AACtG,QAAM,mBAAmB,OAAO,YAAY,cAAc,QAAQ,KAAK,aAAa;AACpF,QAAM,iBAAiB,OAAO,YAAY,cAAc,QAAQ,KAAK,WAAW;AAChF,QAAM,YACF,SAAS,aACT,qBACC,OAAO,eAAe,eAAe,WAAW,cAAc,aAAa,OAC5E;AACJ,QAAM,UACF,SAAS,WACT,mBACC,OAAO,eAAe,aAAa,WAAW,cAAc,WAAW,OACxE;AACJ,QAAM,OAAO,SAAS,SAAS,OAAO,eAAe,SAAS,WAAW,cAAc,OAAO;AAC9F,QAAM,aAAa,SAAS,QAAS,eAAe,SAAS;AAE7D,MAAI,cAAc,UAAU,YAAY,gBAAgB,SAAS,gBAAgB,YAAY;AACzF,WAAO,gBAAgB,YAAY;AAAA,EACvC;AACA,MAAI,cAAc,UAAW,QAAO,gBAAgB,SAAS;AAC7D,SAAO,gBAAgB,aAAa;AACxC;;;ACjGA,IAAM,iBAAiB,oBAAI,IAAY,CAAC,SAAS,WAAW,WAAW,QAAQ,CAAC;AAEhF,SAAS,eAAe,OAAuC;AAC3D,SAAO,eAAe,IAAI,KAAK;AACnC;AAGO,IAAM,iBAA0E;AAAA,EACnF,OAAO,EAAE,SAAS,SAAS,cAAc,KAAK;AAAA,EAC9C,SAAS,EAAE,SAAS,WAAW,cAAc,MAAM;AAAA,EACnD,SAAS,EAAE,SAAS,WAAW,cAAc,MAAM;AAAA,EACnD,QAAQ,EAAE,SAAS,UAAU,cAAc,MAAM;AACrD;AASO,SAAS,oBAAoB,MAA4B;AAC5D,QAAM,SAAS,mBAAmB;AAClC,QAAM,aAAa,OAAO,UAAU,IAAI;AAExC,MAAI,YAAY;AACZ,UAAM,UAAU,WAAW,WAAW,eAAe,WAAW,OAAO,IACjE,WAAW,UACX;AACN,UAAM,SAAS,eAAe,OAAO;AACrC,WAAO,EAAE,GAAG,QAAQ,GAAG,YAAY,QAAQ;AAAA,EAC/C;AAGA,MAAI,eAAe,IAAI,GAAG;AACtB,WAAO,EAAE,GAAG,eAAe,IAAI,GAAG,SAAS,KAAK;AAAA,EACpD;AAGA,SAAO,EAAE,GAAG,eAAe,OAAO,SAAS,QAAQ;AACvD;;;AC2BO,IAAM,gBAAgB;AAAA,EACzB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,8BAA8B;AAAA,EAC9B,eAAe;AAAA,EACf,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,yBAAyB;AAAA,EACzB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,cAAc;AAAA,EACd,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,gBAAgB;AACpB;AAEO,IAAM,eAAe;AAAA,EACxB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,8BAA8B;AAAA,EAC9B,eAAe;AAAA,EACf,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,yBAAyB;AAAA,EACzB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,cAAc;AAAA,EACd,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,gBAAgB;AACpB;AAwEA,IAAM,oBAAoB;AAAA,EACtB,QAAQ;AAAA,IACJ,cAAc;AAAA,IACd,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,EAChB;AAAA,EACA,MAAM;AAAA,IACF,WAAW;AAAA,IACX,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,aAAa;AAAA,IACb,UAAU;AAAA,EACd;AAAA,EACA,MAAM;AAAA,IACF,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,aAAa;AAAA,IACb,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,IACvB,eAAe;AAAA,IACf,mBAAmB;AAAA,EACvB;AAAA,EACA,QAAQ;AAAA,IACJ,eAAe;AAAA,IACf,UAAU;AAAA,IACV,cAAc;AAAA,IACd,SAAS;AAAA,IACT,aAAa;AAAA,EACjB;AAAA,EACA,MAAM;AAAA,IACF,UAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,WAAW;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACH,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS;AAAA,EACb;AACJ;AAcO,IAAM,qBAAqB;AAAA,EAC9B,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,8BAA8B;AAAA,EAC9B,eAAe;AAAA,EACf,cAAc;AAAA,EACd,yBAAyB;AAAA,EACzB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,iBAAiB;AACrB;AAEO,SAAS,YAAY,WAAgE;AACxF,SAAO,EAAE,GAAG,eAAe,GAAG,UAAU;AAC5C;AAMO,SAAS,mBAAyC;AACrD,MAAI,OAAO,aAAa,aAAa;AACjC,WAAO,EAAE,GAAG,cAAc;AAAA,EAC9B;AACA,QAAM,QAAQ,iBAAiB,SAAS,eAAe;AACvD,QAAM,SAAS,EAAE,GAAG,cAAc;AAClC,aAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,YAAY,GAAG;AACtD,UAAM,QAAQ,MAAM,iBAAiB,MAAM,EAAE,KAAK;AAClD,QAAI,OAAO;AACP,MAAC,OAAkC,GAAG,IAAI;AAAA,IAC9C;AAAA,EACJ;AACA,SAAO;AACX;AAEO,SAAS,WAAW,OAA6B,iBAAiD;AACrG,QAAM,QAAQ,OAAO,QAAQ,KAAK,EAC7B,OAAO,CAAC,CAAC,GAAG,MAAM,OAAO,YAAY,EACrC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,aAAa,GAAe,CAAC,KAAK,KAAK,GAAG;AAE5E,MAAI,iBAAiB;AACjB,eAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC3D,YAAM,MAAM,kBAAkB,KAA4B;AAC1D,UAAI,CAAC,IAAK;AACV,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAgC,GAAG;AACzE,cAAM,SAAU,IAA+B,GAAG;AAClD,YAAI,UAAU,OAAO;AACjB,gBAAM,KAAK,OAAO,MAAM,KAAK,KAAK,GAAG;AAAA,QACzC;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AAAA,EAAY,MAAM,KAAK,IAAI,CAAC;AAAA;AACvC;AAQO,SAAS,eAAe,eAAsD;AACjF,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,aAAa,GAAG;AACtD,UAAM,SAAS,aAAa,GAAe;AAC3C,QAAI,UAAU,OAAO;AACjB,YAAM,KAAK,OAAO,MAAM,KAAK,KAAK,GAAG;AAAA,IACzC;AAAA,EACJ;AACA,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SAAO;AAAA,EAAiC,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5D;AAEO,SAAS,oBACZ,OACA,iBACsB;AACtB,QAAM,SAAiC,CAAC;AACxC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,UAAM,SAAS,aAAa,GAAe;AAC3C,QAAI,QAAQ;AACR,aAAO,MAAM,IAAI;AAAA,IACrB;AAAA,EACJ;AAEA,MAAI,iBAAiB;AACjB,eAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC3D,YAAM,MAAM,kBAAkB,KAA4B;AAC1D,UAAI,CAAC,IAAK;AACV,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAgC,GAAG;AACzE,cAAM,SAAU,IAA+B,GAAG;AAClD,YAAI,UAAU,OAAO;AACjB,iBAAO,MAAM,IAAI;AAAA,QACrB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;","names":[]}
@@ -1,94 +0,0 @@
1
- import {
2
- SpringConfigError
3
- } from "./chunk-PT4DIYUK.js";
4
-
5
- // src/utils/dev-warnings.ts
6
- function isDevelopmentRuntime() {
7
- const processNodeEnv = typeof process !== "undefined" ? process.env?.NODE_ENV : void 0;
8
- if (typeof processNodeEnv === "string") {
9
- return processNodeEnv !== "production";
10
- }
11
- const importMetaEnv = import.meta.env;
12
- if (!importMetaEnv) {
13
- return false;
14
- }
15
- if (importMetaEnv.DEV === true) return true;
16
- if (importMetaEnv.PROD === true) return false;
17
- if (typeof importMetaEnv.MODE === "string") return importMetaEnv.MODE !== "production";
18
- if (typeof importMetaEnv.NODE_ENV === "string") return importMetaEnv.NODE_ENV !== "production";
19
- return false;
20
- }
21
- var __DEV__ = isDevelopmentRuntime();
22
- function devWarn(context, message) {
23
- if (__DEV__) {
24
- console.warn(`[${context}] ${message}`);
25
- }
26
- }
27
- function devThrow(context, message) {
28
- const full = `[${context}] ${message}`;
29
- if (__DEV__) {
30
- throw new Error(full);
31
- }
32
- console.warn(full);
33
- }
34
- function devAssert(condition, context, message) {
35
- if (__DEV__ && !condition) {
36
- throw new Error(`[${context}] ${message}`);
37
- }
38
- }
39
-
40
- // src/instance/current-instance.ts
41
- var currentInstance = null;
42
- function getAliveCurrentInstance() {
43
- if (!currentInstance) return null;
44
- if (currentInstance.state === "disposed") {
45
- currentInstance = null;
46
- return null;
47
- }
48
- return currentInstance;
49
- }
50
- function setSpringInstance(instance) {
51
- const activeCurrent = getAliveCurrentInstance();
52
- if (activeCurrent && activeCurrent !== instance) {
53
- if (typeof window !== "undefined") {
54
- devWarn(
55
- "SpringInstance",
56
- "Replacing an active SpringInstance. If you have multiple SpringProviders, ensure the previous one is unmounted before mounting a new one. For SSR, use React Context instead of the global singleton."
57
- );
58
- }
59
- }
60
- currentInstance = instance;
61
- }
62
- function getSpringInstance() {
63
- const instance = getAliveCurrentInstance();
64
- if (!instance) {
65
- throw new SpringConfigError(
66
- "SpringInstance not initialized. Ensure <SpringProvider> is mounted or call setSpringInstance() before accessing the instance."
67
- );
68
- }
69
- return instance;
70
- }
71
- function tryGetSpringInstance() {
72
- return getAliveCurrentInstance();
73
- }
74
- function clearSpringInstance() {
75
- currentInstance = null;
76
- }
77
- function clearSpringInstanceIfCurrent(instance) {
78
- if (currentInstance === instance) {
79
- currentInstance = null;
80
- }
81
- }
82
-
83
- export {
84
- __DEV__,
85
- devWarn,
86
- devThrow,
87
- devAssert,
88
- setSpringInstance,
89
- getSpringInstance,
90
- tryGetSpringInstance,
91
- clearSpringInstance,
92
- clearSpringInstanceIfCurrent
93
- };
94
- //# sourceMappingURL=chunk-EFUBAQCV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/dev-warnings.ts","../src/instance/current-instance.ts"],"sourcesContent":["/**\n * Dev-mode validation helpers.\n * In development: throws errors / logs warnings for invalid usage.\n * In production: silent (no runtime cost beyond a single boolean check).\n * @module dev-warnings\n */\n\nfunction isDevelopmentRuntime(): boolean {\n const processNodeEnv = typeof process !== \"undefined\" ? process.env?.NODE_ENV : undefined;\n if (typeof processNodeEnv === \"string\") {\n return processNodeEnv !== \"production\";\n }\n\n const importMetaEnv = (import.meta as ImportMeta & { env?: Record<string, unknown> }).env;\n if (!importMetaEnv) {\n return false;\n }\n\n if (importMetaEnv.DEV === true) return true;\n if (importMetaEnv.PROD === true) return false;\n if (typeof importMetaEnv.MODE === \"string\") return importMetaEnv.MODE !== \"production\";\n if (typeof importMetaEnv.NODE_ENV === \"string\") return importMetaEnv.NODE_ENV !== \"production\";\n\n return false;\n}\n\nconst __DEV__ = isDevelopmentRuntime();\n\n/**\n * Log a warning in development mode only.\n * No-op in production.\n */\nexport function devWarn(context: string, message: string): void {\n if (__DEV__) {\n console.warn(`[${context}] ${message}`);\n }\n}\n\n/**\n * Throw an error in development mode, log a warning in production.\n * Use for invalid API usage that should be caught during development.\n */\nexport function devThrow(context: string, message: string): void {\n const full = `[${context}] ${message}`;\n if (__DEV__) {\n throw new Error(full);\n }\n console.warn(full);\n}\n\n/**\n * Assert a condition in development mode.\n * Throws if condition is false in dev, no-op in production.\n */\nexport function devAssert(condition: boolean, context: string, message: string): void {\n if (__DEV__ && !condition) {\n throw new Error(`[${context}] ${message}`);\n }\n}\n\nexport { __DEV__ };\n","/**\n * Current instance bridge — the one remaining singleton.\n * Imperative code (API calls, middleware, etc.) reads from getSpringInstance().\n * The SpringProvider in ui sets this via setSpringInstance().\n *\n * **SSR safety note:** This module uses a module-level variable, which means\n * concurrent SSR requests in the same Node.js process will share the same\n * instance. For multi-tenant SSR, use React Context instead of getSpringInstance().\n *\n * @module current-instance\n */\n\nimport { SpringConfigError } from \"../errors/errors\";\nimport { devWarn } from \"../utils/dev-warnings\";\nimport type { SpringInstance } from \"./spring-instance\";\n\nlet currentInstance: SpringInstance | null = null;\n\nfunction getAliveCurrentInstance(): SpringInstance | null {\n if (!currentInstance) return null;\n if (currentInstance.state === \"disposed\") {\n currentInstance = null;\n return null;\n }\n return currentInstance;\n}\n\n/**\n * Set the current SpringInstance. Called once by SpringProvider on mount.\n * Warns if replacing an active (non-disposed) instance — this indicates\n * either multiple SpringProviders or missing cleanup.\n */\nexport function setSpringInstance(instance: SpringInstance): void {\n const activeCurrent = getAliveCurrentInstance();\n if (activeCurrent && activeCurrent !== instance) {\n // During SSR (no `window`), the module singleton persists between requests\n // because useEffect cleanup doesn't run server-side. Only warn on the client\n // where multiple simultaneous SpringProviders indicate a real problem.\n if (typeof window !== \"undefined\") {\n devWarn(\n \"SpringInstance\",\n \"Replacing an active SpringInstance. If you have multiple SpringProviders, \" +\n \"ensure the previous one is unmounted before mounting a new one. \" +\n \"For SSR, use React Context instead of the global singleton.\",\n );\n }\n }\n currentInstance = instance;\n}\n\n/**\n * Get the current SpringInstance. Throws if not set.\n * Use this in imperative code that requires a live instance.\n */\nexport function getSpringInstance(): SpringInstance {\n const instance = getAliveCurrentInstance();\n if (!instance) {\n throw new SpringConfigError(\n \"SpringInstance not initialized. Ensure <SpringProvider> is mounted or call setSpringInstance() before accessing the instance.\",\n );\n }\n return instance;\n}\n\n/**\n * Get the current SpringInstance or null if not yet initialized.\n * Use this in code that may run before SpringProvider mounts (e.g. config setup).\n */\nexport function tryGetSpringInstance(): SpringInstance | null {\n return getAliveCurrentInstance();\n}\n\n/**\n * Clear the current instance. For testing and cleanup only.\n */\nexport function clearSpringInstance(): void {\n currentInstance = null;\n}\n\n/**\n * Clear the current instance only if it matches the provided reference.\n * Prevents disposing an old instance from clearing a newer mounted instance.\n */\nexport function clearSpringInstanceIfCurrent(instance: SpringInstance): void {\n if (currentInstance === instance) {\n currentInstance = null;\n }\n}\n"],"mappings":";;;;;AAOA,SAAS,uBAAgC;AACrC,QAAM,iBAAiB,OAAO,YAAY,cAAc,QAAQ,KAAK,WAAW;AAChF,MAAI,OAAO,mBAAmB,UAAU;AACpC,WAAO,mBAAmB;AAAA,EAC9B;AAEA,QAAM,gBAAiB,YAA+D;AACtF,MAAI,CAAC,eAAe;AAChB,WAAO;AAAA,EACX;AAEA,MAAI,cAAc,QAAQ,KAAM,QAAO;AACvC,MAAI,cAAc,SAAS,KAAM,QAAO;AACxC,MAAI,OAAO,cAAc,SAAS,SAAU,QAAO,cAAc,SAAS;AAC1E,MAAI,OAAO,cAAc,aAAa,SAAU,QAAO,cAAc,aAAa;AAElF,SAAO;AACX;AAEA,IAAM,UAAU,qBAAqB;AAM9B,SAAS,QAAQ,SAAiB,SAAuB;AAC5D,MAAI,SAAS;AACT,YAAQ,KAAK,IAAI,OAAO,KAAK,OAAO,EAAE;AAAA,EAC1C;AACJ;AAMO,SAAS,SAAS,SAAiB,SAAuB;AAC7D,QAAM,OAAO,IAAI,OAAO,KAAK,OAAO;AACpC,MAAI,SAAS;AACT,UAAM,IAAI,MAAM,IAAI;AAAA,EACxB;AACA,UAAQ,KAAK,IAAI;AACrB;AAMO,SAAS,UAAU,WAAoB,SAAiB,SAAuB;AAClF,MAAI,WAAW,CAAC,WAAW;AACvB,UAAM,IAAI,MAAM,IAAI,OAAO,KAAK,OAAO,EAAE;AAAA,EAC7C;AACJ;;;AC1CA,IAAI,kBAAyC;AAE7C,SAAS,0BAAiD;AACtD,MAAI,CAAC,gBAAiB,QAAO;AAC7B,MAAI,gBAAgB,UAAU,YAAY;AACtC,sBAAkB;AAClB,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAOO,SAAS,kBAAkB,UAAgC;AAC9D,QAAM,gBAAgB,wBAAwB;AAC9C,MAAI,iBAAiB,kBAAkB,UAAU;AAI7C,QAAI,OAAO,WAAW,aAAa;AAC/B;AAAA,QACI;AAAA,QACA;AAAA,MAGJ;AAAA,IACJ;AAAA,EACJ;AACA,oBAAkB;AACtB;AAMO,SAAS,oBAAoC;AAChD,QAAM,WAAW,wBAAwB;AACzC,MAAI,CAAC,UAAU;AACX,UAAM,IAAI;AAAA,MACN;AAAA,IACJ;AAAA,EACJ;AACA,SAAO;AACX;AAMO,SAAS,uBAA8C;AAC1D,SAAO,wBAAwB;AACnC;AAKO,SAAS,sBAA4B;AACxC,oBAAkB;AACtB;AAMO,SAAS,6BAA6B,UAAgC;AACzE,MAAI,oBAAoB,UAAU;AAC9B,sBAAkB;AAAA,EACtB;AACJ;","names":[]}