@spring-systems/core 0.8.6 → 0.8.9

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 +43 -1
  37. package/dist/utils/index.js +1 -772
  38. package/dist/validation/index.js +1 -147
  39. package/package.json +1 -1
  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,147 +1 @@
1
- import {
2
- clearValidators,
3
- getRegisteredValidators,
4
- getValidator,
5
- interpretValidation,
6
- registerValidator
7
- } from "../chunk-RRWKDFAB.js";
8
- import "../chunk-QAVWXARR.js";
9
- import {
10
- getContentRes
11
- } from "../chunk-NQQIVCLX.js";
12
- import "../chunk-N2L4TUC4.js";
13
- import "../chunk-RUCXSQEY.js";
14
- import "../chunk-KX32MU3I.js";
15
- import "../chunk-EFUBAQCV.js";
16
- import "../chunk-PT4DIYUK.js";
17
-
18
- // src/validation/field-validators.ts
19
- function isPhoneNumber(str) {
20
- if (!/^[+]?[()/0-9. -]+$/.test(str)) return false;
21
- const digits = str.replace(/\D/g, "");
22
- if (digits.length < 7 || digits.length > 15) return false;
23
- if (str.startsWith("+") && !/^\+\d/.test(str)) return false;
24
- if (/\+.*\+/.test(str)) return false;
25
- if (!str.startsWith("+") && str.includes("+")) return false;
26
- return true;
27
- }
28
- function validatePhoneNumber(value, required = false) {
29
- const input = typeof value === "string" ? value.trim() : "";
30
- if (required && input.length === 0) {
31
- return getContentRes("admin-fill-value");
32
- }
33
- if (input.length === 0) {
34
- return "";
35
- }
36
- if (input.includes(";")) {
37
- const parts = input.split(";").map((x) => x.trim()).filter((x) => x.length > 0);
38
- if (required && parts.length === 0) {
39
- return getContentRes("admin-fill-value");
40
- }
41
- for (const part of parts) {
42
- if (!isPhoneNumber(part)) {
43
- return getContentRes("admin-invalid-phone-number-format");
44
- }
45
- }
46
- return "";
47
- }
48
- if (!isPhoneNumber(input)) {
49
- return getContentRes("admin-invalid-phone-number-format");
50
- }
51
- return "";
52
- }
53
- function isEmailAddress(str) {
54
- return /^[a-zA-Z0-9](?:[a-zA-Z0-9._+-]*[a-zA-Z0-9])?@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/.test(
55
- str
56
- );
57
- }
58
- function isMultipleEmailAddress(str) {
59
- if (str == null) {
60
- return false;
61
- }
62
- const parts = str.split(/[,;\s]+/).filter((p) => p.includes("@"));
63
- return parts.length >= 2;
64
- }
65
- function validateEmailAddress(value, required = false) {
66
- const input = typeof value === "string" ? value.trim() : "";
67
- if (required && input.length === 0) {
68
- return getContentRes("admin-fill-value");
69
- }
70
- if (input.length === 0) {
71
- return "";
72
- }
73
- if (input.includes(";")) {
74
- const parts = input.split(";").map((x) => x.trim()).filter((x) => x.length > 0);
75
- if (required && parts.length === 0) {
76
- return getContentRes("admin-fill-value");
77
- }
78
- for (const part of parts) {
79
- if (isMultipleEmailAddress(part)) {
80
- return getContentRes("admin-email-contains-multiple-addresses");
81
- }
82
- if (!isEmailAddress(part)) {
83
- return getContentRes("admin-invalid-email-format");
84
- }
85
- }
86
- return "";
87
- }
88
- if (isMultipleEmailAddress(input)) {
89
- return getContentRes("admin-email-contains-multiple-addresses");
90
- }
91
- if (!isEmailAddress(input)) {
92
- return getContentRes("admin-invalid-email-format");
93
- }
94
- return "";
95
- }
96
- function isAbsoluteUrl(str) {
97
- if (!str) return false;
98
- const s = String(str).trim();
99
- if (!s || /\s/.test(s)) return false;
100
- try {
101
- const url = new URL(s);
102
- const protocolOk = url.protocol === "http:" || url.protocol === "https:";
103
- if (!protocolOk) return false;
104
- if (!url.hostname) return false;
105
- return true;
106
- } catch {
107
- return false;
108
- }
109
- }
110
- function validateAbsoluteUrl(value, required = false) {
111
- const input = typeof value === "string" ? value.trim() : "";
112
- if (required && input.length === 0) {
113
- return getContentRes("admin-fill-value");
114
- }
115
- if (input.length === 0) {
116
- return "";
117
- }
118
- if (!isAbsoluteUrl(input)) {
119
- return getContentRes("admin-invalid-url-format");
120
- }
121
- return "";
122
- }
123
- function validatePasswordStrength(value) {
124
- if (!value) return getContentRes("admin-fill-value");
125
- if (value.length < 8) return getContentRes("admin-password-min-length");
126
- if (!/[A-Z]/.test(value)) return getContentRes("admin-password-uppercase");
127
- if (!/[a-z]/.test(value)) return getContentRes("admin-password-lowercase");
128
- if (!/[0-9]/.test(value)) return getContentRes("admin-password-digit");
129
- if (!/[^A-Za-z0-9]/.test(value)) return getContentRes("admin-password-special-char");
130
- return "";
131
- }
132
- export {
133
- clearValidators,
134
- getRegisteredValidators,
135
- getValidator,
136
- interpretValidation,
137
- isAbsoluteUrl,
138
- isEmailAddress,
139
- isMultipleEmailAddress,
140
- isPhoneNumber,
141
- registerValidator,
142
- validateAbsoluteUrl,
143
- validateEmailAddress,
144
- validatePasswordStrength,
145
- validatePhoneNumber
146
- };
147
- //# sourceMappingURL=index.js.map
1
+ import{a as u,b as m,c as d,d as p,e as c}from"../chunk-AMXSATFF.js";import"../chunk-ICKHSEIX.js";import{b as n}from"../chunk-7P4BJDQR.js";import"../chunk-HUASNNWD.js";import"../chunk-YMSSF2ZU.js";import"../chunk-EVDFSWPU.js";import"../chunk-JRHMAY5G.js";import"../chunk-OOVZTF74.js";function a(t){if(!/^[+]?[()/0-9. -]+$/.test(t))return!1;let e=t.replace(/\D/g,"");return!(e.length<7||e.length>15||t.startsWith("+")&&!/^\+\d/.test(t)||/\+.*\+/.test(t)||!t.startsWith("+")&&t.includes("+"))}function h(t,e=!1){let r=typeof t=="string"?t.trim():"";if(e&&r.length===0)return n("admin-fill-value");if(r.length===0)return"";if(r.includes(";")){let s=r.split(";").map(i=>i.trim()).filter(i=>i.length>0);if(e&&s.length===0)return n("admin-fill-value");for(let i of s)if(!a(i))return n("admin-invalid-phone-number-format");return""}return a(r)?"":n("admin-invalid-phone-number-format")}function l(t){return/^[a-zA-Z0-9](?:[a-zA-Z0-9._+-]*[a-zA-Z0-9])?@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/.test(t)}function o(t){return t==null?!1:t.split(/[,;\s]+/).filter(r=>r.includes("@")).length>=2}function A(t,e=!1){let r=typeof t=="string"?t.trim():"";if(e&&r.length===0)return n("admin-fill-value");if(r.length===0)return"";if(r.includes(";")){let s=r.split(";").map(i=>i.trim()).filter(i=>i.length>0);if(e&&s.length===0)return n("admin-fill-value");for(let i of s){if(o(i))return n("admin-email-contains-multiple-addresses");if(!l(i))return n("admin-invalid-email-format")}return""}return o(r)?n("admin-email-contains-multiple-addresses"):l(r)?"":n("admin-invalid-email-format")}function f(t){if(!t)return!1;let e=String(t).trim();if(!e||/\s/.test(e))return!1;try{let r=new URL(e);return!(!(r.protocol==="http:"||r.protocol==="https:")||!r.hostname)}catch{return!1}}function b(t,e=!1){let r=typeof t=="string"?t.trim():"";return e&&r.length===0?n("admin-fill-value"):r.length===0||f(r)?"":n("admin-invalid-url-format")}function x(t){return t?t.length<8?n("admin-password-min-length"):/[A-Z]/.test(t)?/[a-z]/.test(t)?/[0-9]/.test(t)?/[^A-Za-z0-9]/.test(t)?"":n("admin-password-special-char"):n("admin-password-digit"):n("admin-password-lowercase"):n("admin-password-uppercase"):n("admin-fill-value")}export{p as clearValidators,d as getRegisteredValidators,m as getValidator,c as interpretValidation,f as isAbsoluteUrl,l as isEmailAddress,o as isMultipleEmailAddress,a as isPhoneNumber,u as registerValidator,b as validateAbsoluteUrl,A as validateEmailAddress,x as validatePasswordStrength,h as validatePhoneNumber};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spring-systems/core",
3
- "version": "0.8.6",
3
+ "version": "0.8.9",
4
4
  "description": "Core types, utilities, and configuration for the Spring Systems framework",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -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":"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","names":[]}