@spring-systems/core 0.8.2 → 0.8.4
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.
- package/README.md +18 -18
- package/dist/auth/index.d.ts +2 -2
- package/dist/{chunk-5D6XE7NJ.js → chunk-VRMVN2UM.js} +3 -2
- package/dist/{chunk-5D6XE7NJ.js.map → chunk-VRMVN2UM.js.map} +1 -1
- package/dist/{chunk-U5OH3GAI.js → chunk-XGNQEGV7.js} +4 -12
- package/dist/{chunk-U5OH3GAI.js.map → chunk-XGNQEGV7.js.map} +1 -1
- package/dist/config/index.d.ts +3 -3
- package/dist/config/index.js +2 -2
- package/dist/devtools/index.d.ts +2 -2
- package/dist/{framework-config-types-DeUbx4bu.d.ts → framework-config-types-ClghA-zo.d.ts} +5 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/instance/index.d.ts +3 -3
- package/dist/logger/index.d.ts +2 -2
- package/dist/plugins/index.d.ts +2 -2
- package/dist/{runtime-env-config-CajOEJCP.d.ts → runtime-env-config-Bs9HwewE.d.ts} +1 -1
- package/dist/{spring-instance-EbUh4mQb.d.ts → spring-instance-Bijjj8Mq.d.ts} +1 -1
- package/dist/testing/index.d.ts +2 -2
- package/dist/utils/index.d.ts +1 -2
- package/dist/utils/index.js +1 -15
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -41,24 +41,24 @@ markInstanceReady(instance);
|
|
|
41
41
|
|
|
42
42
|
## Entry Points
|
|
43
43
|
|
|
44
|
-
| Import path
|
|
45
|
-
|
|
46
|
-
| `@spring-systems/core`
|
|
47
|
-
| `@spring-systems/core/config`
|
|
48
|
-
| `@spring-systems/core/instance`
|
|
49
|
-
| `@spring-systems/core/events`
|
|
50
|
-
| `@spring-systems/core/middleware` | Middleware registry and runner
|
|
51
|
-
| `@spring-systems/core/plugins`
|
|
52
|
-
| `@spring-systems/core/validation` | Field validators and registry
|
|
53
|
-
| `@spring-systems/core/auth`
|
|
54
|
-
| `@spring-systems/core/adapters`
|
|
55
|
-
| `@spring-systems/core/logger`
|
|
56
|
-
| `@spring-systems/core/utils`
|
|
57
|
-
| `@spring-systems/core/types`
|
|
58
|
-
| `@spring-systems/core/errors`
|
|
59
|
-
| `@spring-systems/core/i18n`
|
|
60
|
-
| `@spring-systems/core/testing`
|
|
61
|
-
| `@spring-systems/core/devtools`
|
|
44
|
+
| Import path | Use it for |
|
|
45
|
+
| --------------------------------- | ---------------------------------------- |
|
|
46
|
+
| `@spring-systems/core` | Convenience re-exports |
|
|
47
|
+
| `@spring-systems/core/config` | Framework configuration and theme tokens |
|
|
48
|
+
| `@spring-systems/core/instance` | `SpringInstance` factory and lifecycle |
|
|
49
|
+
| `@spring-systems/core/events` | Typed event bus |
|
|
50
|
+
| `@spring-systems/core/middleware` | Middleware registry and runner |
|
|
51
|
+
| `@spring-systems/core/plugins` | Plugin setup and disposal |
|
|
52
|
+
| `@spring-systems/core/validation` | Field validators and registry |
|
|
53
|
+
| `@spring-systems/core/auth` | Auth state helpers |
|
|
54
|
+
| `@spring-systems/core/adapters` | Adapter interfaces |
|
|
55
|
+
| `@spring-systems/core/logger` | Logging facade |
|
|
56
|
+
| `@spring-systems/core/utils` | Shared utilities |
|
|
57
|
+
| `@spring-systems/core/types` | Shared type definitions |
|
|
58
|
+
| `@spring-systems/core/errors` | Error types |
|
|
59
|
+
| `@spring-systems/core/i18n` | Default i18n messages |
|
|
60
|
+
| `@spring-systems/core/testing` | Test helpers |
|
|
61
|
+
| `@spring-systems/core/devtools` | Instance inspection helpers |
|
|
62
62
|
|
|
63
63
|
## Boundary Rules
|
|
64
64
|
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { L as LogoutHandler, a as LogoutReason } from '../spring-instance-
|
|
2
|
-
import '../framework-config-types-
|
|
1
|
+
import { L as LogoutHandler, a as LogoutReason } from '../spring-instance-Bijjj8Mq.js';
|
|
2
|
+
import '../framework-config-types-ClghA-zo.js';
|
|
3
3
|
import '../middleware-types-DVG9C1qJ.js';
|
|
4
4
|
import '../form-types-D3MdGpjA.js';
|
|
5
5
|
import '../security-sanitize-Bb0PExM6.js';
|
|
@@ -4,7 +4,8 @@ var DIALOG_CONTENT_SELECTOR = ".spring-dialog-content";
|
|
|
4
4
|
var DND_TOUCH_CONSTRAINT = { delay: 200, tolerance: 5 };
|
|
5
5
|
var STORAGE_KEYS = {
|
|
6
6
|
LANGUAGE: "language",
|
|
7
|
-
COLOR_THEME: "colorTheme"
|
|
7
|
+
COLOR_THEME: "colorTheme",
|
|
8
|
+
DARK_MODE: "darkMode"
|
|
8
9
|
};
|
|
9
10
|
|
|
10
11
|
export {
|
|
@@ -13,4 +14,4 @@ export {
|
|
|
13
14
|
DND_TOUCH_CONSTRAINT,
|
|
14
15
|
STORAGE_KEYS
|
|
15
16
|
};
|
|
16
|
-
//# sourceMappingURL=chunk-
|
|
17
|
+
//# sourceMappingURL=chunk-VRMVN2UM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/constants.ts"],"sourcesContent":["/** Empty GUID for new records */\nexport const emptyGuid = \"00000000-0000-0000-0000-000000000000\";\n\n/** Generic interface for select options */\nexport interface CodeList {\n id_public: string;\n name: string;\n code?: string;\n version?: number;\n}\n\n/** Interface for persons (full_name) */\nexport interface CodeListFullName {\n id_public: string;\n full_name: string;\n first_name: string;\n last_name?: string;\n}\n\nexport interface CodeListNumber {\n id_public: number;\n name: string;\n}\n\nexport type Operator = \"=\" | \">\" | \">=\" | \"<\" | \"<=\" | \"!=\" | \"in\" | \"between\";\n\n/** CSS selector for an open dialog (detection in shortcut hooks) */\nexport const DIALOG_CONTENT_SELECTOR = \".spring-dialog-content\";\n\n/** DnD TouchSensor activation constraint (delay + tolerance) */\nexport const DND_TOUCH_CONSTRAINT = { delay: 200, tolerance: 5 } as const;\n\nexport const STORAGE_KEYS = {\n LANGUAGE: \"language\",\n COLOR_THEME: \"colorTheme\",\n} as const;\n\n/** Union type of all storage key values. */\nexport type StorageKey = (typeof STORAGE_KEYS)[keyof typeof STORAGE_KEYS];\n"],"mappings":";AACO,IAAM,YAAY;AA0BlB,IAAM,0BAA0B;AAGhC,IAAM,uBAAuB,EAAE,OAAO,KAAK,WAAW,EAAE;AAExD,IAAM,eAAe;AAAA,EACxB,UAAU;AAAA,EACV,aAAa;
|
|
1
|
+
{"version":3,"sources":["../src/config/constants.ts"],"sourcesContent":["/** Empty GUID for new records */\nexport const emptyGuid = \"00000000-0000-0000-0000-000000000000\";\n\n/** Generic interface for select options */\nexport interface CodeList {\n id_public: string;\n name: string;\n code?: string;\n version?: number;\n}\n\n/** Interface for persons (full_name) */\nexport interface CodeListFullName {\n id_public: string;\n full_name: string;\n first_name: string;\n last_name?: string;\n}\n\nexport interface CodeListNumber {\n id_public: number;\n name: string;\n}\n\nexport type Operator = \"=\" | \">\" | \">=\" | \"<\" | \"<=\" | \"!=\" | \"in\" | \"between\";\n\n/** CSS selector for an open dialog (detection in shortcut hooks) */\nexport const DIALOG_CONTENT_SELECTOR = \".spring-dialog-content\";\n\n/** DnD TouchSensor activation constraint (delay + tolerance) */\nexport const DND_TOUCH_CONSTRAINT = { delay: 200, tolerance: 5 } as const;\n\nexport const STORAGE_KEYS = {\n LANGUAGE: \"language\",\n COLOR_THEME: \"colorTheme\",\n DARK_MODE: \"darkMode\",\n} as const;\n\n/** Union type of all storage key values. */\nexport type StorageKey = (typeof STORAGE_KEYS)[keyof typeof STORAGE_KEYS];\n"],"mappings":";AACO,IAAM,YAAY;AA0BlB,IAAM,0BAA0B;AAGhC,IAAM,uBAAuB,EAAE,OAAO,KAAK,WAAW,EAAE;AAExD,IAAM,eAAe;AAAA,EACxB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,WAAW;AACf;","names":[]}
|
|
@@ -347,17 +347,9 @@ function themeToCSSDark(darkOverrides) {
|
|
|
347
347
|
}
|
|
348
348
|
}
|
|
349
349
|
if (lines.length === 0) return "";
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
:root {
|
|
354
|
-
${darkCSS}
|
|
355
|
-
}
|
|
356
|
-
}`,
|
|
357
|
-
`[data-spring-theme="dark"] {
|
|
358
|
-
${darkCSS}
|
|
359
|
-
}`
|
|
360
|
-
].join("\n\n");
|
|
350
|
+
return `[data-spring-theme="dark"] {
|
|
351
|
+
${lines.join("\n")}
|
|
352
|
+
}`;
|
|
361
353
|
}
|
|
362
354
|
function themeToCSSVariables(theme, componentTokens) {
|
|
363
355
|
const result = {};
|
|
@@ -396,4 +388,4 @@ export {
|
|
|
396
388
|
themeToCSSDark,
|
|
397
389
|
themeToCSSVariables
|
|
398
390
|
};
|
|
399
|
-
//# sourceMappingURL=chunk-
|
|
391
|
+
//# sourceMappingURL=chunk-XGNQEGV7.js.map
|
|
@@ -1 +1 @@
|
|
|
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 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 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 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 @media (prefers-color-scheme: dark) { ... }\n * // and [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 for programmatic toggling.\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 const darkCSS = lines.join(\"\\n\");\n return [\n `@media (prefers-color-scheme: dark) {\\n :root {\\n${darkCSS}\\n }\\n}`,\n `[data-spring-theme=\"dark\"] {\\n${darkCSS}\\n}`,\n ].join(\"\\n\\n\");\n}\n\nexport function themeToCSSVariables(theme: SpringThemeVariables, componentTokens?: SpringComponentTokens): 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":[]}
|
|
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 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 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 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":[]}
|
package/dist/config/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { C as ConfigValidationResult, D as DEFAULT_FRAMEWORK_CONFIG, R as RUNTIME_ENV_KEYS, e as RuntimeEnv, f as RuntimeEnvKey, i as applyFallbackConfig, j as clearCapabilities, k as clearFrameworkConfig, l as clearRuntimeEnvKeys, c as configureCapabilities, a as configureFramework, m as createFrameworkConfig, n as getApiDefaultPageSize, o as getApiTimeoutMs, p as getAutocompleteDebounceMs, g as getCapabilities, b as getCapability, d as getFrameworkConfig, q as getIdleSessionTimeoutMs, r as getImageTag, s as getMaxFileSize, t as getRegisteredCapabilityNames, u as getRuntimeEnvKeys, v as getRuntimeVar, w as getSecureSessionCookieName, x as getSessionCookieName, y as getSignalrIdleTimeoutMs, z as getSignalrKeepAliveIntervalMs, A as getSignalrReconnectDelaysMs, B as getSignalrServerTimeoutMs, h as hasCapability, E as registerRuntimeEnvKeys, F as validateFrameworkConfig } from '../runtime-env-config-
|
|
2
|
-
import { F as FrameworkConfigOverrides, L as LayoutVariant, b as LayoutConfig } from '../framework-config-types-
|
|
3
|
-
export { C as CAMEL_TO_CSS, c as CapabilityMap, d as CodeList, e as CodeListFullName, f as CodeListNumber, D as DEFAULT_DARK_THEME, g as DEFAULT_THEME, h as DIALOG_CONTENT_SELECTOR, i as DND_TOUCH_CONSTRAINT, j as DateFormatConfig, a as FrameworkConfig, N as NavigationMenuItem, O as Operator, S as STORAGE_KEYS, k as SpringComponentTokens, l as SpringCssVariable, m as SpringThemeVariables, n as StorageKey, o as createTheme, p as emptyGuid, q as getResolvedTheme, t as themeToCSS, r as themeToCSSDark, s as themeToCSSVariables } from '../framework-config-types-
|
|
1
|
+
export { C as ConfigValidationResult, D as DEFAULT_FRAMEWORK_CONFIG, R as RUNTIME_ENV_KEYS, e as RuntimeEnv, f as RuntimeEnvKey, i as applyFallbackConfig, j as clearCapabilities, k as clearFrameworkConfig, l as clearRuntimeEnvKeys, c as configureCapabilities, a as configureFramework, m as createFrameworkConfig, n as getApiDefaultPageSize, o as getApiTimeoutMs, p as getAutocompleteDebounceMs, g as getCapabilities, b as getCapability, d as getFrameworkConfig, q as getIdleSessionTimeoutMs, r as getImageTag, s as getMaxFileSize, t as getRegisteredCapabilityNames, u as getRuntimeEnvKeys, v as getRuntimeVar, w as getSecureSessionCookieName, x as getSessionCookieName, y as getSignalrIdleTimeoutMs, z as getSignalrKeepAliveIntervalMs, A as getSignalrReconnectDelaysMs, B as getSignalrServerTimeoutMs, h as hasCapability, E as registerRuntimeEnvKeys, F as validateFrameworkConfig } from '../runtime-env-config-Bs9HwewE.js';
|
|
2
|
+
import { F as FrameworkConfigOverrides, L as LayoutVariant, b as LayoutConfig } from '../framework-config-types-ClghA-zo.js';
|
|
3
|
+
export { C as CAMEL_TO_CSS, c as CapabilityMap, d as CodeList, e as CodeListFullName, f as CodeListNumber, D as DEFAULT_DARK_THEME, g as DEFAULT_THEME, h as DIALOG_CONTENT_SELECTOR, i as DND_TOUCH_CONSTRAINT, j as DateFormatConfig, a as FrameworkConfig, N as NavigationMenuItem, O as Operator, S as STORAGE_KEYS, k as SpringComponentTokens, l as SpringCssVariable, m as SpringThemeVariables, n as StorageKey, o as createTheme, p as emptyGuid, q as getResolvedTheme, t as themeToCSS, r as themeToCSSDark, s as themeToCSSVariables } from '../framework-config-types-ClghA-zo.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Environment-specific configuration presets for enterprise deployments.
|
package/dist/config/index.js
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
themeToCSS,
|
|
12
12
|
themeToCSSDark,
|
|
13
13
|
themeToCSSVariables
|
|
14
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-XGNQEGV7.js";
|
|
15
15
|
import {
|
|
16
16
|
RUNTIME_ENV_KEYS,
|
|
17
17
|
clearRuntimeEnvKeys,
|
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
DND_TOUCH_CONSTRAINT,
|
|
34
34
|
STORAGE_KEYS,
|
|
35
35
|
emptyGuid
|
|
36
|
-
} from "../chunk-
|
|
36
|
+
} from "../chunk-VRMVN2UM.js";
|
|
37
37
|
import {
|
|
38
38
|
DEFAULT_FRAMEWORK_CONFIG,
|
|
39
39
|
applyFallbackConfig,
|
package/dist/devtools/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { d as SpringInstance } from '../spring-instance-
|
|
2
|
-
import '../framework-config-types-
|
|
1
|
+
import { d as SpringInstance } from '../spring-instance-Bijjj8Mq.js';
|
|
2
|
+
import '../framework-config-types-ClghA-zo.js';
|
|
3
3
|
import '../middleware-types-DVG9C1qJ.js';
|
|
4
4
|
import '../form-types-D3MdGpjA.js';
|
|
5
5
|
import '../security-sanitize-Bb0PExM6.js';
|
|
@@ -64,6 +64,7 @@ declare const DND_TOUCH_CONSTRAINT: {
|
|
|
64
64
|
declare const STORAGE_KEYS: {
|
|
65
65
|
readonly LANGUAGE: "language";
|
|
66
66
|
readonly COLOR_THEME: "colorTheme";
|
|
67
|
+
readonly DARK_MODE: "darkMode";
|
|
67
68
|
};
|
|
68
69
|
/** Union type of all storage key values. */
|
|
69
70
|
type StorageKey = (typeof STORAGE_KEYS)[keyof typeof STORAGE_KEYS];
|
|
@@ -342,8 +343,7 @@ interface SpringComponentTokens {
|
|
|
342
343
|
* ```ts
|
|
343
344
|
* // Generate dark mode CSS
|
|
344
345
|
* const css = themeToCSSDark(DEFAULT_DARK_THEME);
|
|
345
|
-
* // Produces
|
|
346
|
-
* // and [data-spring-theme="dark"] { ... }
|
|
346
|
+
* // Produces [data-spring-theme="dark"] { ... }
|
|
347
347
|
* ```
|
|
348
348
|
*/
|
|
349
349
|
declare const DEFAULT_DARK_THEME: {
|
|
@@ -392,7 +392,9 @@ declare function createTheme(overrides: Partial<SpringThemeVariables>): SpringTh
|
|
|
392
392
|
declare function getResolvedTheme(): SpringThemeVariables;
|
|
393
393
|
declare function themeToCSS(theme: SpringThemeVariables, componentTokens?: SpringComponentTokens): string;
|
|
394
394
|
/**
|
|
395
|
-
* Generate dark mode CSS. Uses [data-spring-theme="dark"] selector
|
|
395
|
+
* Generate dark mode CSS. Uses `[data-spring-theme="dark"]` selector.
|
|
396
|
+
* The "system" preference is resolved by a matchMedia listener in theme-store.ts
|
|
397
|
+
* that sets the attribute — no duplicated @media block needed.
|
|
396
398
|
* Only includes variables that are explicitly set in the dark theme (partial overrides).
|
|
397
399
|
*/
|
|
398
400
|
declare function themeToCSSDark(darkOverrides: Partial<SpringThemeVariables>): string;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { c as configureCapabilities, a as configureFramework, g as getCapabilities, b as getCapability, d as getFrameworkConfig, h as hasCapability } from './runtime-env-config-
|
|
1
|
+
export { c as configureCapabilities, a as configureFramework, g as getCapabilities, b as getCapability, d as getFrameworkConfig, h as hasCapability } from './runtime-env-config-Bs9HwewE.js';
|
|
2
2
|
export { eventBus } from './events/index.js';
|
|
3
3
|
export { g as getMiddlewareRunner, r as registerMiddleware } from './middleware-registry-DT002qRd.js';
|
|
4
|
-
import './framework-config-types-
|
|
4
|
+
import './framework-config-types-ClghA-zo.js';
|
|
5
5
|
import './middleware-types-DVG9C1qJ.js';
|
|
6
6
|
|
|
7
7
|
declare const SPRING_CORE_VERSION: string;
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
getMiddlewareRunner,
|
|
7
7
|
registerMiddleware
|
|
8
8
|
} from "./chunk-MEWPYTWC.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-XGNQEGV7.js";
|
|
10
10
|
import "./chunk-UDT2RPX2.js";
|
|
11
11
|
import {
|
|
12
12
|
configureCapabilities,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
getCapability,
|
|
15
15
|
hasCapability
|
|
16
16
|
} from "./chunk-S7MKRNMI.js";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-VRMVN2UM.js";
|
|
18
18
|
import {
|
|
19
19
|
configureFramework,
|
|
20
20
|
getFrameworkConfig
|
|
@@ -26,7 +26,7 @@ import "./chunk-EFUBAQCV.js";
|
|
|
26
26
|
import "./chunk-PT4DIYUK.js";
|
|
27
27
|
|
|
28
28
|
// src/index.ts
|
|
29
|
-
var SPRING_CORE_VERSION = true ? "0.8.
|
|
29
|
+
var SPRING_CORE_VERSION = true ? "0.8.4" : "0.0.0-dev";
|
|
30
30
|
export {
|
|
31
31
|
SPRING_CORE_VERSION,
|
|
32
32
|
configureCapabilities,
|
package/dist/instance/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { F as FrameworkConfigOverrides } from '../framework-config-types-
|
|
2
|
-
import { d as SpringInstance } from '../spring-instance-
|
|
3
|
-
export { H as HandlerEntry, I as InstanceContentAdapter, e as InstanceLifecycleState, c as InstanceLogAdapter, b as InstanceNotificationAdapter, L as LogoutHandler, a as LogoutReason, R as RequestHook, f as ResponseHook, S as SecurityEventType, g as SpringApiState, h as SpringCoreState, i as SpringUIState } from '../spring-instance-
|
|
1
|
+
import { F as FrameworkConfigOverrides } from '../framework-config-types-ClghA-zo.js';
|
|
2
|
+
import { d as SpringInstance } from '../spring-instance-Bijjj8Mq.js';
|
|
3
|
+
export { H as HandlerEntry, I as InstanceContentAdapter, e as InstanceLifecycleState, c as InstanceLogAdapter, b as InstanceNotificationAdapter, L as LogoutHandler, a as LogoutReason, R as RequestHook, f as ResponseHook, S as SecurityEventType, g as SpringApiState, h as SpringCoreState, i as SpringUIState } from '../spring-instance-Bijjj8Mq.js';
|
|
4
4
|
import '../middleware-types-DVG9C1qJ.js';
|
|
5
5
|
import '../form-types-D3MdGpjA.js';
|
|
6
6
|
import '../security-sanitize-Bb0PExM6.js';
|
package/dist/logger/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { S as SecurityEventType } from '../spring-instance-
|
|
1
|
+
import { S as SecurityEventType } from '../spring-instance-Bijjj8Mq.js';
|
|
2
2
|
import { S as SecurityLogData } from '../security-sanitize-Bb0PExM6.js';
|
|
3
|
-
import '../framework-config-types-
|
|
3
|
+
import '../framework-config-types-ClghA-zo.js';
|
|
4
4
|
import '../middleware-types-DVG9C1qJ.js';
|
|
5
5
|
import '../form-types-D3MdGpjA.js';
|
|
6
6
|
|
package/dist/plugins/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { d as SpringInstance } from '../spring-instance-
|
|
1
|
+
import { d as SpringInstance } from '../spring-instance-Bijjj8Mq.js';
|
|
2
2
|
import { a as FormDataValue, b as FormStoreState, c as ColumnType } from '../form-types-D3MdGpjA.js';
|
|
3
|
-
import '../framework-config-types-
|
|
3
|
+
import '../framework-config-types-ClghA-zo.js';
|
|
4
4
|
import '../middleware-types-DVG9C1qJ.js';
|
|
5
5
|
import '../security-sanitize-Bb0PExM6.js';
|
|
6
6
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as CapabilityMap, F as FrameworkConfigOverrides, a as FrameworkConfig } from './framework-config-types-
|
|
1
|
+
import { c as CapabilityMap, F as FrameworkConfigOverrides, a as FrameworkConfig } from './framework-config-types-ClghA-zo.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Feature capability system for enterprise SPRING deployments.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as FrameworkConfig } from './framework-config-types-
|
|
1
|
+
import { a as FrameworkConfig } from './framework-config-types-ClghA-zo.js';
|
|
2
2
|
import { M as MiddlewareSlot, b as MiddlewareEntry } from './middleware-types-DVG9C1qJ.js';
|
|
3
3
|
import { V as ValidatorFn } from './form-types-D3MdGpjA.js';
|
|
4
4
|
import { S as SecurityLogData } from './security-sanitize-Bb0PExM6.js';
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { F as FrameworkConfigOverrides } from '../framework-config-types-
|
|
2
|
-
import { I as InstanceContentAdapter, b as InstanceNotificationAdapter, c as InstanceLogAdapter, d as SpringInstance } from '../spring-instance-
|
|
1
|
+
import { F as FrameworkConfigOverrides } from '../framework-config-types-ClghA-zo.js';
|
|
2
|
+
import { I as InstanceContentAdapter, b as InstanceNotificationAdapter, c as InstanceLogAdapter, d as SpringInstance } from '../spring-instance-Bijjj8Mq.js';
|
|
3
3
|
import { SpringPlugin } from '../plugins/index.js';
|
|
4
4
|
import { S as SecurityLogData } from '../security-sanitize-Bb0PExM6.js';
|
|
5
5
|
import '../middleware-types-DVG9C1qJ.js';
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -13,7 +13,6 @@ declare function getBrightness(r: number, g: number, b: number): number;
|
|
|
13
13
|
declare function hexToRgb(hex: string): [number, number, number];
|
|
14
14
|
declare function rgbToHex(rgb: string): string;
|
|
15
15
|
declare function getContrastYIQ(hex: string): string;
|
|
16
|
-
declare function getHexColorFromClass(className: string): string;
|
|
17
16
|
|
|
18
17
|
declare function isValueNotEmpty(value: string | number | boolean | null | undefined | FormDataValue[]): boolean;
|
|
19
18
|
/** Returns a deep copy of an object, removing unwanted references. */
|
|
@@ -140,4 +139,4 @@ declare function removeNode<T extends BaseTreeNode>(nodes: T[], id: string, chil
|
|
|
140
139
|
declare function addNode<T extends BaseTreeNode>(nodes: T[], parentId: string | null, newNode: T, childrenField?: string): T[];
|
|
141
140
|
declare function findParentId<T extends BaseTreeNode>(nodes: T[], id: string, childrenField?: string, parentId?: string | null): string | null;
|
|
142
141
|
|
|
143
|
-
export { type BaseTreeNode, type ValueType, __DEV__, addNode, clearDeprecationWarnings, dateManager, deepCopy, deepEqual, deepMerge, devAssert, devThrow, devWarn, findNode, findParentId, generateGUID, getAllIds, getBrightness, getChildren, getContrastYIQ, getFilterFieldType,
|
|
142
|
+
export { type BaseTreeNode, type ValueType, __DEV__, addNode, clearDeprecationWarnings, dateManager, deepCopy, deepEqual, deepMerge, devAssert, devThrow, devWarn, findNode, findParentId, generateGUID, getAllIds, getBrightness, getChildren, getContrastYIQ, getFilterFieldType, getValueByPath, getValueType, hexToRgb, isValueNotEmpty, normalizeString, normalizeSystemFilter, onKeyActivate, parseFilter, parseJSONSafely, prefersReducedMotion, removeNode, rgbToHex, sanitizeContent, sanitizeEditorContent, setColumnBodyType, setDateLocale, setDefaultStructure, springDeprecate, toNumber, truncateString, updateNode };
|
package/dist/utils/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
emptyGuid
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-VRMVN2UM.js";
|
|
4
4
|
import {
|
|
5
5
|
getFrameworkConfig
|
|
6
6
|
} from "../chunk-F7WUQJH7.js";
|
|
@@ -60,19 +60,6 @@ function getContrastYIQ(hex) {
|
|
|
60
60
|
const brightness = getBrightness(r, g, b);
|
|
61
61
|
return brightness > 150 ? "black" : "white";
|
|
62
62
|
}
|
|
63
|
-
function getHexColorFromClass(className) {
|
|
64
|
-
if (typeof document === "undefined" || !document.body) return "#000000";
|
|
65
|
-
const tempElement = document.createElement("div");
|
|
66
|
-
tempElement.className = className;
|
|
67
|
-
document.body.appendChild(tempElement);
|
|
68
|
-
try {
|
|
69
|
-
const computedStyle = getComputedStyle(tempElement);
|
|
70
|
-
const color = computedStyle.color;
|
|
71
|
-
return color.startsWith("rgb") ? rgbToHex(color) : color;
|
|
72
|
-
} finally {
|
|
73
|
-
document.body.removeChild(tempElement);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
63
|
|
|
77
64
|
// src/utils/data-utils.ts
|
|
78
65
|
import dayjs from "dayjs";
|
|
@@ -758,7 +745,6 @@ export {
|
|
|
758
745
|
getChildren,
|
|
759
746
|
getContrastYIQ,
|
|
760
747
|
getFilterFieldType,
|
|
761
|
-
getHexColorFromClass,
|
|
762
748
|
getValueByPath,
|
|
763
749
|
getValueType,
|
|
764
750
|
hexToRgb,
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/a11y.ts","../../src/utils/color.ts","../../src/utils/data-utils.ts","../../src/utils/date.ts","../../src/utils/deprecation.ts","../../src/utils/filter-utils.ts","../../src/utils/format-utils.ts","../../src/utils/tree-utils.ts"],"sourcesContent":["interface KeyActivateEvent {\n key: string;\n preventDefault(): void;\n}\n\nexport function onKeyActivate<E extends KeyActivateEvent = KeyActivateEvent>(\n handler?: ((e: E) => void) | (() => void) | null,\n) {\n if (!handler) return undefined;\n return (e: E) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n (handler as (e: E) => void)(e);\n }\n };\n}\n\nexport function prefersReducedMotion(): boolean {\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n","export function getBrightness(r: number, g: number, b: number): number {\n return (r * 299 + g * 587 + b * 114) / 1000;\n}\n\nexport function hexToRgb(hex: string): [number, number, number] {\n const bigint = parseInt(hex.slice(1), 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n return [r, g, b];\n}\n\nexport function rgbToHex(rgb: string): string {\n const match = rgb.match(/\\d+/g);\n if (!match) return \"#000000\";\n const result = match.map((x) => parseInt(x).toString(16).padStart(2, \"0\")).join(\"\");\n return `#${result}`;\n}\n\nexport function getContrastYIQ(hex: string): string {\n const [r, g, b] = hexToRgb(hex);\n const brightness = getBrightness(r, g, b);\n return brightness > 150 ? \"black\" : \"white\";\n}\n\nexport function getHexColorFromClass(className: string): string {\n if (typeof document === \"undefined\" || !document.body) return \"#000000\";\n const tempElement = document.createElement(\"div\");\n tempElement.className = className;\n document.body.appendChild(tempElement);\n try {\n const computedStyle = getComputedStyle(tempElement);\n const color = computedStyle.color;\n return color.startsWith(\"rgb\") ? rgbToHex(color) : color;\n } finally {\n document.body.removeChild(tempElement);\n }\n}\n","import dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\n\nimport { emptyGuid } from \"../config/constants\";\nimport { SpringValidationError } from \"../errors/errors\";\nimport type { FormDataValue, FormStoreState, Indexable, IndexedFormData } from \"../types/form-types\";\n\ndayjs.extend(customParseFormat);\n\nconst UNSAFE_MERGE_KEYS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\nexport function isValueNotEmpty(value: string | number | boolean | null | undefined | FormDataValue[]): boolean {\n return (\n value !== 0 &&\n value !== null &&\n value !== undefined &&\n value !== false &&\n value !== \"\" &&\n !(Array.isArray(value) && value.length === 0)\n );\n}\n\n/** Returns a deep copy of an object, removing unwanted references. */\nexport function deepCopy<T>(obj: T, hash?: WeakMap<WeakKey, unknown>): T {\n // Fast path: use native structuredClone on top-level calls (handles Date, RegExp, circular refs natively).\n // Falls back to manual implementation when structuredClone fails (e.g. objects containing functions).\n if (!hash && typeof structuredClone === \"function\") {\n try {\n return structuredClone(obj);\n } catch {\n // structuredClone cannot handle functions — fall through to manual copy\n }\n }\n\n const map = hash ?? new WeakMap();\n\n if (typeof obj === \"object\" && obj !== null && map.has(obj)) return map.get(obj) as T;\n\n if (obj instanceof Date) return new Date(obj.getTime()) as T;\n if (obj instanceof RegExp) return new RegExp(obj.source, obj.flags) as T;\n if (obj === null || typeof obj !== \"object\") return obj;\n\n const result = (Array.isArray(obj) ? [] : {}) as Indexable;\n map.set(obj, result);\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = deepCopy((obj as Indexable)[key], map);\n }\n }\n\n return result as T;\n}\n\n/**\n * Performs deep comparison of two objects.\n * Treats `null` and `\"\"` as equivalent — this is intentional because the backend\n * API returns `null` for empty fields while form inputs produce `\"\"`.\n */\nexport function deepEqual(a: FormDataValue | FormStoreState, b: FormDataValue | FormStoreState): boolean {\n if (a === b) return true;\n\n if ((a === null && b === \"\") || (a === \"\" && b === null)) return true;\n\n if (\n a == null ||\n b == null ||\n (typeof a !== \"object\" && typeof a !== \"function\") ||\n (typeof b !== \"object\" && typeof b !== \"function\")\n ) {\n return false;\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n const objA = a as IndexedFormData;\n const objB = b as IndexedFormData;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n const keysBSet = new Set(keysB);\n for (const key of keysA) {\n if (!keysBSet.has(key) || !deepEqual(objA[key], objB[key])) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function deepMerge<T extends Indexable>(target: T, source: Partial<T>): T {\n const result = { ...target };\n Object.keys(source).forEach((key) => {\n if (UNSAFE_MERGE_KEYS.has(key)) {\n return;\n }\n const k = key as keyof T;\n if (source[k] && typeof source[k] === \"object\" && !Array.isArray(source[k])) {\n result[k] = deepMerge(\n (target[k] && typeof target[k] === \"object\" ? target[k] : {}) as T[keyof T] & Indexable,\n source[k] as Partial<T[keyof T] & Indexable>,\n ) as T[keyof T];\n } else {\n result[k] = source[k] as T[keyof T];\n }\n });\n return result;\n}\n\nexport function getValueByPath(obj: FormStoreState, path: string): FormDataValue {\n const keys = path.split(\".\");\n let current: FormDataValue | FormStoreState = obj;\n\n for (const key of keys) {\n if (current == null || typeof current !== \"object\" || current instanceof Date) {\n return undefined;\n }\n if (Array.isArray(current)) return undefined;\n current = (current as IndexedFormData)[key];\n }\n\n return current as FormDataValue;\n}\n\n/** Normalizes a string for comparison without diacritics, in lowercase */\nexport function normalizeString(str: string): string {\n return str\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase();\n}\n\nexport function generateGUID(): string {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi && typeof cryptoApi.randomUUID === \"function\") {\n return cryptoApi.randomUUID();\n }\n\n if (cryptoApi && typeof cryptoApi.getRandomValues === \"function\") {\n const bytes = new Uint8Array(16);\n cryptoApi.getRandomValues(bytes);\n // RFC 4122 version 4 bits\n const b6 = bytes[6] ?? 0;\n const b8 = bytes[8] ?? 0;\n bytes[6] = (b6 & 0x0f) | 0x40;\n bytes[8] = (b8 & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n\n throw new SpringValidationError(\n \"generateGUID(): secure random source unavailable. Provide Web Crypto (crypto.randomUUID or crypto.getRandomValues).\",\n \"generateGUID\",\n );\n}\n\nexport function setDefaultStructure(\n data: { field?: string; type?: string }[],\n): Record<string, string | number | boolean | null | undefined> {\n const result: Record<string, string | number | boolean | null | undefined> = {\n id_public: emptyGuid,\n };\n\n const defaultValue = (type: string | undefined) => {\n switch (type) {\n case \"boolean\":\n return false;\n case \"string\":\n return \"\";\n case \"number\":\n return \"\";\n case \"object\":\n case \"date\":\n case \"datetime\":\n case \"time\":\n return null;\n default:\n return undefined;\n }\n };\n\n data.forEach((item: { field?: string; type?: string }) => {\n if (item.field) {\n result[item.field] = defaultValue(item.type);\n }\n });\n\n return result;\n}\n\nexport function parseJSONSafely(\n value: string | number | boolean | null | undefined | object,\n): string | number | boolean | null | undefined | object {\n if (typeof value === \"string\") {\n if (value.toLowerCase() === \"true\") {\n return true;\n } else if (value.toLowerCase() === \"false\") {\n return false;\n }\n\n try {\n return JSON.parse(value);\n } catch (_e: unknown) {\n return value;\n }\n }\n\n return value;\n}\n\nexport type ValueType = \"string\" | \"date\" | \"number\" | \"boolean\" | \"object\";\n\nexport function getValueType(value: string | number | boolean | null | undefined | object): ValueType {\n const v = parseJSONSafely(value);\n\n if (v === null || v === undefined) {\n return \"string\";\n }\n\n if (v instanceof Date) {\n return \"date\";\n }\n\n if (typeof v === \"string\") {\n const trimmed = v.trim();\n\n const looksLikeDate = /[0-9]/.test(trimmed) && /[-./]/.test(trimmed) && trimmed.length >= 6;\n\n if (looksLikeDate) {\n const formats = [\n \"D.M.YYYY\",\n \"DD.MM.YYYY\",\n \"D. M. YYYY\",\n \"DD. MM. YYYY\",\n \"DD.MM.YYYY HH:mm\",\n \"D.M.YYYY HH:mm\",\n \"DD.MM.YYYY H:mm\",\n \"D.M.YYYY H:mm\",\n \"YYYY-MM-DD\",\n \"YYYY-MM-DDTHH:mm:ss\",\n \"YYYY-MM-DDTHH:mm:ss.SSS\",\n \"YYYY-MM-DDTHH:mm:ssZ\",\n \"YYYY-MM-DDTHH:mm:ss.SSSZ\",\n ];\n\n if (dayjs(trimmed, formats as string[], true).isValid()) {\n return \"date\";\n }\n\n if (dayjs(trimmed).isValid() && /^\\d{4}-\\d{2}-\\d{2}/.test(trimmed)) {\n return \"date\";\n }\n }\n }\n\n if (Array.isArray(v)) {\n if (v.length === 0) {\n return \"object\";\n }\n return getValueType(v[0]);\n }\n\n const t = typeof v;\n\n if (t === \"number\") {\n return \"number\";\n }\n\n if (t === \"boolean\") {\n return \"boolean\";\n }\n\n if (t === \"object\") {\n return \"object\";\n }\n\n return \"string\";\n}\n","import dayjs from \"dayjs\";\n// Consumer must import their locale (e.g., import \"dayjs/locale/cs\") before using dateManager\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport isBetweenPlugin from \"dayjs/plugin/isBetween\";\n\nimport { type DateFormatConfig, getFrameworkConfig } from \"../config/framework-config\";\n\ndayjs.extend(customParseFormat);\ndayjs.extend(isBetweenPlugin);\n\nlet activeLocale: string | null = null;\n\nfunction ensureLocale(): void {\n const locale = getFrameworkConfig().i18n.dayjsLocale;\n if (locale && locale !== activeLocale) {\n dayjs.locale(locale);\n activeLocale = locale;\n }\n}\n\n/**\n * Set the dayjs locale at runtime.\n * The locale package must be imported before calling this (e.g., `import \"dayjs/locale/en\"`).\n */\nexport function setDateLocale(locale: string): void {\n activeLocale = locale;\n dayjs.locale(locale);\n}\n\nfunction fmt(): DateFormatConfig {\n ensureLocale();\n return getFrameworkConfig().i18n.dateFormats;\n}\n\nexport const dateManager = {\n formatDateCustom(value: Date | null, format: string) {\n if (!value) {\n return \"\";\n } else {\n return dayjs(value).format(format);\n }\n },\n formatDate(value: Date | null) {\n if (!value) {\n return \"\";\n } else {\n return dayjs(value).format(fmt().date);\n }\n },\n formatDateTime(value: Date | null) {\n if (!value) {\n return \"\";\n } else {\n return dayjs(value).format(fmt().dateTime);\n }\n },\n formatTime(value: Date | null) {\n if (!value) {\n return \"\";\n } else {\n return dayjs(value).format(fmt().time);\n }\n },\n formatDateRange(dateFrom: Date, dateTo: Date, format = fmt().date) {\n const from = dayjs(dateFrom);\n const to = dayjs(dateTo);\n const dtFmt = fmt().dateTime;\n\n if (from.isSame(to, \"day\")) {\n if (format.includes(\"H\") || format.includes(\"h\")) {\n return `${from.format(dtFmt)}-${to.format(fmt().time)}`;\n } else if (format === fmt().time) {\n return `${from.format(fmt().time)}-${to.format(fmt().time)}`;\n }\n return from.format(format);\n }\n\n if (format.includes(\"H\") || format.includes(\"h\")) {\n return `${from.format(dtFmt)} - ${to.format(dtFmt)}`;\n } else if (format === fmt().time) {\n return `${from.format(fmt().time)} - ${to.format(fmt().time)}`;\n }\n\n return `${from.format(fmt().date)} - ${to.format(fmt().date)}`;\n },\n formatDateTimeWithSeconds(value: Date | null) {\n if (!value) {\n return \"\";\n } else {\n return dayjs(value).format(fmt().dateTimeSeconds);\n }\n },\n /** Formats a value as date with time, or time only if it is today */\n formatDateTimeShort(value: Date | null) {\n if (!value) {\n return \"\";\n } else if (dayjs(value).isSame(Date.now(), \"day\")) {\n return dayjs(value).format(fmt().time);\n } else {\n return this.formatDateTime(value);\n }\n },\n getAgeFromDate(value: Date) {\n return dayjs().diff(value, \"years\");\n },\n formatMonthName(value: Date, format: string) {\n return dayjs(value).format(format);\n },\n formatMonthNumber(value: Date) {\n return dayjs(value).month() + 1;\n },\n getPreviousMonth(date: Date, numberOfMonth: number) {\n return dayjs(date).subtract(numberOfMonth, \"months\").toDate();\n },\n setTimeFromString(date: Date, time: string, onlyMinutes?: boolean) {\n const setDate = dayjs(date).toDate();\n const split = time.split(\":\");\n if (!onlyMinutes) {\n setDate.setHours(Number(split[0] ?? 0));\n } else {\n setDate.setSeconds(0);\n }\n setDate.setMinutes(Number(split[1] ?? 0));\n return setDate;\n },\n formatDateString(value: string) {\n if (!value) {\n return null;\n } else {\n if (value.split(\"-\")[0]?.length === 4) {\n return dayjs(value).toDate();\n }\n if (value.split(\".\")[0]?.length === 4 || value.split(\"/\")[0]?.length === 4) {\n return dayjs(value, \"YYYY. M. D.\").toDate();\n }\n return dayjs(value, \"D. M. YYYY\").toDate();\n }\n },\n getDuration(date: Date | null, date2: Date | null, type: dayjs.ManipulateType) {\n if (!date || !date2) {\n return null;\n } else {\n const value = dayjs(date);\n const value2 = dayjs(date2);\n const result = value2.diff(value, type);\n return result;\n }\n },\n getStartOfDate(date: Date, unitOfTime: dayjs.OpUnitType) {\n return dayjs(date).startOf(unitOfTime).toDate();\n },\n getEndOfDay(date: Date) {\n return dayjs(date).endOf(\"day\").toDate();\n },\n getDateRange(date: Date, unitOfTime: dayjs.OpUnitType) {\n const startDate = dayjs(date).startOf(unitOfTime).toDate();\n const endDate = dayjs(date).endOf(unitOfTime).toDate();\n return { dateFrom: startDate, dateTo: endDate };\n },\n isDateInRange(startDate: Date, endDate: Date, dateToCheck: Date) {\n if (!endDate) {\n return dayjs(dateToCheck).isSame(startDate, \"day\");\n }\n return dayjs(dateToCheck).isBetween(startDate, endDate, null, \"[]\");\n },\n /** Adds a number of days (or other unit) to a date */\n add(value: Date, count: number, type?: dayjs.ManipulateType) {\n return dayjs(value)\n .add(count, type ? type : \"days\")\n .toDate();\n },\n substractDaysFromDate(numberOfDays: number, date: Date) {\n const result = dayjs(date).subtract(numberOfDays, \"days\").toDate();\n return result;\n },\n};\n","/**\n * Runtime deprecation warnings for the SPRING framework.\n * Warns once per session per deprecation to avoid console spam.\n * @module deprecation\n */\n\nconst warned = new Set<string>();\n\nexport function springDeprecate(name: string, alternative: string, removeVersion?: string): void {\n const key = `${name}:${alternative}`;\n if (warned.has(key)) return;\n warned.add(key);\n\n const versionNote = removeVersion ? ` It will be removed in v${removeVersion}.` : \"\";\n console.warn(`[SPRING Deprecation] \"${name}\" is deprecated. Use ${alternative} instead.${versionNote}`);\n}\n\n/** Clear all tracked deprecation warnings. Intended for testing. */\nexport function clearDeprecationWarnings(): void {\n warned.clear();\n}\n","import type { FilterFieldValue } from \"../types/form-types\";\nimport type { FilterNode } from \"../types/grid-types\";\nimport { getValueType } from \"./data-utils\";\n\nexport function parseFilter(value: string | number | boolean | Date | null | undefined | FilterFieldValue[] | object): string | boolean {\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (Array.isArray(value)) {\n return JSON.stringify(value);\n }\n\n if (typeof value === \"boolean\") {\n return value;\n }\n\n return value != null ? value.toString() : \"\";\n}\n\n/** Normalizes system filter — string/object to FilterNode. */\nexport function normalizeSystemFilter(\n input: Record<string, string | number | boolean | Date | null | undefined> | FilterNode | null | undefined\n): FilterNode | null {\n if (!input) return null;\n if (typeof input === \"object\" && input !== null && (\"logic\" in input || \"field\" in input)) {\n return input as FilterNode;\n }\n\n if (typeof input === \"object\" && input !== null) {\n const entries = Object.entries(input).filter(([k, v]) => k && v !== undefined && v !== null && v !== \"\");\n const filters: FilterNode[] = entries.map(([k, v]) => {\n const val = parseFilter(v);\n return {\n field: k,\n operator: \"eq\",\n value: val,\n };\n });\n\n if (filters.length === 0) {\n return null;\n }\n\n return {\n logic: \"and\",\n filters,\n };\n }\n\n return null;\n}\n\nexport function getFilterFieldType(\n fieldKey: string,\n defaultListFilter: Record<string, { type?: string }> | null | undefined,\n value: string | number | boolean | null | undefined | object\n): string {\n const fieldDef = defaultListFilter && defaultListFilter[fieldKey];\n\n if (fieldDef && typeof fieldDef.type === \"string\") {\n return fieldDef.type;\n }\n\n return getValueType(value);\n}\n","import sanitizeHtml from \"sanitize-html\";\n\nimport { getContentRes } from \"../adapters/content-adapter\";\nimport { getFrameworkConfig } from \"../config/framework-config\";\nimport type { FormStoreState } from \"../types/form-types\";\nimport type { ColumnType } from \"../types/grid-types\";\nimport { dateManager } from \"./date\";\n\ninterface FormatColumn<T> {\n field: string & keyof T;\n type: ColumnType;\n decimals?: number;\n textField?: string;\n}\n\n/** Strips all HTML tags from content */\nexport function sanitizeContent(content: string): string {\n if (!content) {\n return \"\";\n }\n const clean = sanitizeHtml(content, {\n allowedTags: [],\n allowedAttributes: {},\n });\n return clean;\n}\n\nconst editorAllowedTags = [\n \"p\", \"br\", \"div\", \"ul\", \"ol\", \"li\", \"b\", \"i\", \"em\", \"strong\", \"u\", \"s\",\n \"sub\", \"sup\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"span\", \"a\",\n \"table\", \"thead\", \"tbody\", \"tr\", \"th\", \"td\",\n];\nconst editorAllowedAttributes: sanitizeHtml.IOptions[\"allowedAttributes\"] = {\n a: [\"href\", \"title\", \"target\", \"rel\"],\n td: [\"colspan\", \"rowspan\"],\n th: [\"colspan\", \"rowspan\"],\n span: [\"style\"],\n};\nconst SAFE_TEXT_DECORATION_PATTERN = /^(?!.*(?:url|expression)\\s*\\()[a-z0-9#(),.%\\s-]{1,80}$/i;\nconst SAFE_LINK_TARGETS = new Set([\"_blank\", \"_self\", \"_parent\", \"_top\"]);\n\nfunction normalizeRelTokens(rel: string | undefined): string[] {\n if (!rel) return [];\n const seen = new Set<string>();\n const tokens: string[] = [];\n for (const raw of rel.split(/\\s+/)) {\n const token = raw.trim().toLowerCase();\n if (!token || token === \"opener\" || seen.has(token)) continue;\n seen.add(token);\n tokens.push(token);\n }\n return tokens;\n}\n\nconst editorTransformTags: sanitizeHtml.IOptions[\"transformTags\"] = {\n a: (tagName, attribs) => {\n const nextAttribs: Record<string, string> = { ...attribs };\n\n if (typeof nextAttribs.target === \"string\") {\n const normalizedTarget = nextAttribs.target.trim().toLowerCase();\n if (SAFE_LINK_TARGETS.has(normalizedTarget)) {\n nextAttribs.target = normalizedTarget;\n } else {\n delete nextAttribs.target;\n }\n }\n\n if (nextAttribs.target === \"_blank\") {\n const relTokens = normalizeRelTokens(nextAttribs.rel);\n if (!relTokens.includes(\"noopener\")) relTokens.push(\"noopener\");\n if (!relTokens.includes(\"noreferrer\")) relTokens.push(\"noreferrer\");\n nextAttribs.rel = relTokens.join(\" \");\n }\n\n return { tagName, attribs: nextAttribs };\n },\n};\n\nconst editorAllowedStyles: sanitizeHtml.IOptions[\"allowedStyles\"] = {\n span: {\n \"text-decoration\": [SAFE_TEXT_DECORATION_PATTERN],\n },\n};\n\n/** Sanitizes HTML output from WYSIWYG editor — allows formatting tags, removes scripts */\nexport function sanitizeEditorContent(content: string): string {\n if (!content) {\n return \"\";\n }\n return sanitizeHtml(content, {\n allowedTags: editorAllowedTags,\n allowedAttributes: editorAllowedAttributes,\n allowedStyles: editorAllowedStyles,\n transformTags: editorTransformTags,\n allowedSchemes: [\"http\", \"https\", \"mailto\"],\n });\n}\n\nexport function truncateString(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n } else if (maxLength < 3) {\n return value.slice(0, maxLength);\n } else {\n return value.slice(0, maxLength - 3) + \"...\";\n }\n}\n\nexport function toNumber(value: string | number, decimals?: number): string {\n const locale = getFrameworkConfig().i18n.numberLocale;\n return Number(value).toLocaleString(locale, {\n minimumFractionDigits: decimals ? decimals : 0,\n maximumFractionDigits: decimals ? decimals : 0,\n });\n}\n\nexport function setColumnBodyType<T extends FormStoreState>(item: T, obj: FormatColumn<T>): T[string & keyof T] | string | number | undefined {\n const key = obj.field;\n const rec = item;\n let result: T[string & keyof T] | string | number | undefined = rec[key];\n switch (obj.type) {\n case \"date\":\n result = dateManager.formatDate(rec[key] as Date | null);\n break;\n case \"datetime\":\n result = dateManager.formatDateTime(rec[key] as Date | null);\n break;\n case \"time\":\n result = dateManager.formatTime(rec[key] as Date | null);\n break;\n case \"boolean\":\n result = rec[key] ? getContentRes(\"admin-yes\") : getContentRes(\"admin-no\");\n break;\n case \"number\": {\n const numVal = rec[key] as string | number | undefined;\n result = numVal !== undefined ? (obj.decimals ? toNumber(numVal, obj.decimals) : numVal) : \"\";\n break;\n }\n case \"object\": {\n const objVal = rec[key] as { full_name?: string; name?: string; [k: string]: string | undefined } | null | undefined;\n result = objVal\n ? obj.textField\n ? objVal[obj.textField]\n : objVal.full_name || objVal.name || \"\"\n : \"\";\n break;\n }\n case \"string\":\n case \"color\":\n break;\n default: {\n const _exhaustive: never = obj.type;\n void _exhaustive;\n }\n }\n return result;\n}\n","/**\n * Shared utilities for tree structures (Tree and TreeList).\n * @module tree-utils\n */\n\nimport type { Indexable } from \"../types/form-types\";\n\nexport interface BaseTreeNode {\n id_public: string;\n childrenNodes?: BaseTreeNode[];\n}\n\n/** Safe access to node children — encapsulates dynamic property access + cast */\nexport function getChildren<T>(node: T, field: string): T[] | undefined {\n const val = (node as Indexable)[field];\n return Array.isArray(val) ? (val as T[]) : undefined;\n}\n\nexport function findNode<T extends BaseTreeNode>(\n nodes: T[],\n id: string,\n childrenField: string = \"childrenNodes\"\n): T | null {\n for (const node of nodes) {\n if (node.id_public === id) return node;\n const children = getChildren(node, childrenField);\n if (children && children.length > 0) {\n const found = findNode(children, id, childrenField);\n if (found) return found;\n }\n }\n return null;\n}\n\nexport function getAllIds<T extends BaseTreeNode>(nodes: T[], childrenField: string = \"childrenNodes\"): string[] {\n const ids: string[] = [];\n const collect = (items: T[]) => {\n for (const node of items) {\n ids.push(node.id_public);\n const children = getChildren(node, childrenField);\n if (children && children.length > 0) {\n collect(children);\n }\n }\n };\n collect(nodes);\n return ids;\n}\n\nexport function updateNode<T extends BaseTreeNode>(\n nodes: T[],\n id: string,\n updater: (node: T) => T,\n childrenField: string = \"childrenNodes\"\n): T[] {\n return nodes.map((node) => {\n if (node.id_public === id) {\n return updater(node);\n }\n const children = getChildren(node, childrenField);\n if (children && children.length > 0) {\n return {\n ...node,\n [childrenField]: updateNode(children, id, updater, childrenField),\n };\n }\n return node;\n });\n}\n\nexport function removeNode<T extends BaseTreeNode>(\n nodes: T[],\n id: string,\n childrenField: string = \"childrenNodes\"\n): T[] {\n return nodes\n .filter((node) => node.id_public !== id)\n .map((node) => {\n const children = getChildren(node, childrenField);\n if (children && children.length > 0) {\n return {\n ...node,\n [childrenField]: removeNode(children, id, childrenField),\n };\n }\n return node;\n });\n}\n\nexport function addNode<T extends BaseTreeNode>(\n nodes: T[],\n parentId: string | null,\n newNode: T,\n childrenField: string = \"childrenNodes\"\n): T[] {\n if (parentId === null) {\n return [...nodes, newNode];\n }\n\n return nodes.map((node) => {\n if (node.id_public === parentId) {\n const children = getChildren(node, childrenField) || [];\n return {\n ...node,\n [childrenField]: [...children, newNode],\n };\n }\n const children = getChildren(node, childrenField);\n if (children && children.length > 0) {\n return {\n ...node,\n [childrenField]: addNode(children, parentId, newNode, childrenField),\n };\n }\n return node;\n });\n}\n\nexport function findParentId<T extends BaseTreeNode>(\n nodes: T[],\n id: string,\n childrenField: string = \"childrenNodes\",\n parentId: string | null = null\n): string | null {\n for (const node of nodes) {\n if (node.id_public === id) {\n return parentId;\n }\n const children = getChildren(node, childrenField);\n if (children && children.length > 0) {\n const found = findParentId(children, id, childrenField, node.id_public);\n if (found !== null) return found;\n }\n }\n return null;\n}\n"],"mappings":"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","names":["dayjs","customParseFormat","dayjs","customParseFormat","children"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/a11y.ts","../../src/utils/color.ts","../../src/utils/data-utils.ts","../../src/utils/date.ts","../../src/utils/deprecation.ts","../../src/utils/filter-utils.ts","../../src/utils/format-utils.ts","../../src/utils/tree-utils.ts"],"sourcesContent":["interface KeyActivateEvent {\n key: string;\n preventDefault(): void;\n}\n\nexport function onKeyActivate<E extends KeyActivateEvent = KeyActivateEvent>(\n handler?: ((e: E) => void) | (() => void) | null,\n) {\n if (!handler) return undefined;\n return (e: E) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n (handler as (e: E) => void)(e);\n }\n };\n}\n\nexport function prefersReducedMotion(): boolean {\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n","export function getBrightness(r: number, g: number, b: number): number {\n return (r * 299 + g * 587 + b * 114) / 1000;\n}\n\nexport function hexToRgb(hex: string): [number, number, number] {\n const bigint = parseInt(hex.slice(1), 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n return [r, g, b];\n}\n\nexport function rgbToHex(rgb: string): string {\n const match = rgb.match(/\\d+/g);\n if (!match) return \"#000000\";\n const result = match.map((x) => parseInt(x).toString(16).padStart(2, \"0\")).join(\"\");\n return `#${result}`;\n}\n\nexport function getContrastYIQ(hex: string): string {\n const [r, g, b] = hexToRgb(hex);\n const brightness = getBrightness(r, g, b);\n return brightness > 150 ? \"black\" : \"white\";\n}\n","import dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\n\nimport { emptyGuid } from \"../config/constants\";\nimport { SpringValidationError } from \"../errors/errors\";\nimport type { FormDataValue, FormStoreState, Indexable, IndexedFormData } from \"../types/form-types\";\n\ndayjs.extend(customParseFormat);\n\nconst UNSAFE_MERGE_KEYS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\nexport function isValueNotEmpty(value: string | number | boolean | null | undefined | FormDataValue[]): boolean {\n return (\n value !== 0 &&\n value !== null &&\n value !== undefined &&\n value !== false &&\n value !== \"\" &&\n !(Array.isArray(value) && value.length === 0)\n );\n}\n\n/** Returns a deep copy of an object, removing unwanted references. */\nexport function deepCopy<T>(obj: T, hash?: WeakMap<WeakKey, unknown>): T {\n // Fast path: use native structuredClone on top-level calls (handles Date, RegExp, circular refs natively).\n // Falls back to manual implementation when structuredClone fails (e.g. objects containing functions).\n if (!hash && typeof structuredClone === \"function\") {\n try {\n return structuredClone(obj);\n } catch {\n // structuredClone cannot handle functions — fall through to manual copy\n }\n }\n\n const map = hash ?? new WeakMap();\n\n if (typeof obj === \"object\" && obj !== null && map.has(obj)) return map.get(obj) as T;\n\n if (obj instanceof Date) return new Date(obj.getTime()) as T;\n if (obj instanceof RegExp) return new RegExp(obj.source, obj.flags) as T;\n if (obj === null || typeof obj !== \"object\") return obj;\n\n const result = (Array.isArray(obj) ? [] : {}) as Indexable;\n map.set(obj, result);\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = deepCopy((obj as Indexable)[key], map);\n }\n }\n\n return result as T;\n}\n\n/**\n * Performs deep comparison of two objects.\n * Treats `null` and `\"\"` as equivalent — this is intentional because the backend\n * API returns `null` for empty fields while form inputs produce `\"\"`.\n */\nexport function deepEqual(a: FormDataValue | FormStoreState, b: FormDataValue | FormStoreState): boolean {\n if (a === b) return true;\n\n if ((a === null && b === \"\") || (a === \"\" && b === null)) return true;\n\n if (\n a == null ||\n b == null ||\n (typeof a !== \"object\" && typeof a !== \"function\") ||\n (typeof b !== \"object\" && typeof b !== \"function\")\n ) {\n return false;\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n const objA = a as IndexedFormData;\n const objB = b as IndexedFormData;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n const keysBSet = new Set(keysB);\n for (const key of keysA) {\n if (!keysBSet.has(key) || !deepEqual(objA[key], objB[key])) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function deepMerge<T extends Indexable>(target: T, source: Partial<T>): T {\n const result = { ...target };\n Object.keys(source).forEach((key) => {\n if (UNSAFE_MERGE_KEYS.has(key)) {\n return;\n }\n const k = key as keyof T;\n if (source[k] && typeof source[k] === \"object\" && !Array.isArray(source[k])) {\n result[k] = deepMerge(\n (target[k] && typeof target[k] === \"object\" ? target[k] : {}) as T[keyof T] & Indexable,\n source[k] as Partial<T[keyof T] & Indexable>,\n ) as T[keyof T];\n } else {\n result[k] = source[k] as T[keyof T];\n }\n });\n return result;\n}\n\nexport function getValueByPath(obj: FormStoreState, path: string): FormDataValue {\n const keys = path.split(\".\");\n let current: FormDataValue | FormStoreState = obj;\n\n for (const key of keys) {\n if (current == null || typeof current !== \"object\" || current instanceof Date) {\n return undefined;\n }\n if (Array.isArray(current)) return undefined;\n current = (current as IndexedFormData)[key];\n }\n\n return current as FormDataValue;\n}\n\n/** Normalizes a string for comparison without diacritics, in lowercase */\nexport function normalizeString(str: string): string {\n return str\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase();\n}\n\nexport function generateGUID(): string {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi && typeof cryptoApi.randomUUID === \"function\") {\n return cryptoApi.randomUUID();\n }\n\n if (cryptoApi && typeof cryptoApi.getRandomValues === \"function\") {\n const bytes = new Uint8Array(16);\n cryptoApi.getRandomValues(bytes);\n // RFC 4122 version 4 bits\n const b6 = bytes[6] ?? 0;\n const b8 = bytes[8] ?? 0;\n bytes[6] = (b6 & 0x0f) | 0x40;\n bytes[8] = (b8 & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n\n throw new SpringValidationError(\n \"generateGUID(): secure random source unavailable. Provide Web Crypto (crypto.randomUUID or crypto.getRandomValues).\",\n \"generateGUID\",\n );\n}\n\nexport function setDefaultStructure(\n data: { field?: string; type?: string }[],\n): Record<string, string | number | boolean | null | undefined> {\n const result: Record<string, string | number | boolean | null | undefined> = {\n id_public: emptyGuid,\n };\n\n const defaultValue = (type: string | undefined) => {\n switch (type) {\n case \"boolean\":\n return false;\n case \"string\":\n return \"\";\n case \"number\":\n return \"\";\n case \"object\":\n case \"date\":\n case \"datetime\":\n case \"time\":\n return null;\n default:\n return undefined;\n }\n };\n\n data.forEach((item: { field?: string; type?: string }) => {\n if (item.field) {\n result[item.field] = defaultValue(item.type);\n }\n });\n\n return result;\n}\n\nexport function parseJSONSafely(\n value: string | number | boolean | null | undefined | object,\n): string | number | boolean | null | undefined | object {\n if (typeof value === \"string\") {\n if (value.toLowerCase() === \"true\") {\n return true;\n } else if (value.toLowerCase() === \"false\") {\n return false;\n }\n\n try {\n return JSON.parse(value);\n } catch (_e: unknown) {\n return value;\n }\n }\n\n return value;\n}\n\nexport type ValueType = \"string\" | \"date\" | \"number\" | \"boolean\" | \"object\";\n\nexport function getValueType(value: string | number | boolean | null | undefined | object): ValueType {\n const v = parseJSONSafely(value);\n\n if (v === null || v === undefined) {\n return \"string\";\n }\n\n if (v instanceof Date) {\n return \"date\";\n }\n\n if (typeof v === \"string\") {\n const trimmed = v.trim();\n\n const looksLikeDate = /[0-9]/.test(trimmed) && /[-./]/.test(trimmed) && trimmed.length >= 6;\n\n if (looksLikeDate) {\n const formats = [\n \"D.M.YYYY\",\n \"DD.MM.YYYY\",\n \"D. M. YYYY\",\n \"DD. MM. YYYY\",\n \"DD.MM.YYYY HH:mm\",\n \"D.M.YYYY HH:mm\",\n \"DD.MM.YYYY H:mm\",\n \"D.M.YYYY H:mm\",\n \"YYYY-MM-DD\",\n \"YYYY-MM-DDTHH:mm:ss\",\n \"YYYY-MM-DDTHH:mm:ss.SSS\",\n \"YYYY-MM-DDTHH:mm:ssZ\",\n \"YYYY-MM-DDTHH:mm:ss.SSSZ\",\n ];\n\n if (dayjs(trimmed, formats as string[], true).isValid()) {\n return \"date\";\n }\n\n if (dayjs(trimmed).isValid() && /^\\d{4}-\\d{2}-\\d{2}/.test(trimmed)) {\n return \"date\";\n }\n }\n }\n\n if (Array.isArray(v)) {\n if (v.length === 0) {\n return \"object\";\n }\n return getValueType(v[0]);\n }\n\n const t = typeof v;\n\n if (t === \"number\") {\n return \"number\";\n }\n\n if (t === \"boolean\") {\n return \"boolean\";\n }\n\n if (t === \"object\") {\n return \"object\";\n }\n\n return \"string\";\n}\n","import dayjs from \"dayjs\";\n// Consumer must import their locale (e.g., import \"dayjs/locale/cs\") before using dateManager\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport isBetweenPlugin from \"dayjs/plugin/isBetween\";\n\nimport { type DateFormatConfig, getFrameworkConfig } from \"../config/framework-config\";\n\ndayjs.extend(customParseFormat);\ndayjs.extend(isBetweenPlugin);\n\nlet activeLocale: string | null = null;\n\nfunction ensureLocale(): void {\n const locale = getFrameworkConfig().i18n.dayjsLocale;\n if (locale && locale !== activeLocale) {\n dayjs.locale(locale);\n activeLocale = locale;\n }\n}\n\n/**\n * Set the dayjs locale at runtime.\n * The locale package must be imported before calling this (e.g., `import \"dayjs/locale/en\"`).\n */\nexport function setDateLocale(locale: string): void {\n activeLocale = locale;\n dayjs.locale(locale);\n}\n\nfunction fmt(): DateFormatConfig {\n ensureLocale();\n return getFrameworkConfig().i18n.dateFormats;\n}\n\nexport const dateManager = {\n formatDateCustom(value: Date | null, format: string) {\n if (!value) {\n return \"\";\n } else {\n return dayjs(value).format(format);\n }\n },\n formatDate(value: Date | null) {\n if (!value) {\n return \"\";\n } else {\n return dayjs(value).format(fmt().date);\n }\n },\n formatDateTime(value: Date | null) {\n if (!value) {\n return \"\";\n } else {\n return dayjs(value).format(fmt().dateTime);\n }\n },\n formatTime(value: Date | null) {\n if (!value) {\n return \"\";\n } else {\n return dayjs(value).format(fmt().time);\n }\n },\n formatDateRange(dateFrom: Date, dateTo: Date, format = fmt().date) {\n const from = dayjs(dateFrom);\n const to = dayjs(dateTo);\n const dtFmt = fmt().dateTime;\n\n if (from.isSame(to, \"day\")) {\n if (format.includes(\"H\") || format.includes(\"h\")) {\n return `${from.format(dtFmt)}-${to.format(fmt().time)}`;\n } else if (format === fmt().time) {\n return `${from.format(fmt().time)}-${to.format(fmt().time)}`;\n }\n return from.format(format);\n }\n\n if (format.includes(\"H\") || format.includes(\"h\")) {\n return `${from.format(dtFmt)} - ${to.format(dtFmt)}`;\n } else if (format === fmt().time) {\n return `${from.format(fmt().time)} - ${to.format(fmt().time)}`;\n }\n\n return `${from.format(fmt().date)} - ${to.format(fmt().date)}`;\n },\n formatDateTimeWithSeconds(value: Date | null) {\n if (!value) {\n return \"\";\n } else {\n return dayjs(value).format(fmt().dateTimeSeconds);\n }\n },\n /** Formats a value as date with time, or time only if it is today */\n formatDateTimeShort(value: Date | null) {\n if (!value) {\n return \"\";\n } else if (dayjs(value).isSame(Date.now(), \"day\")) {\n return dayjs(value).format(fmt().time);\n } else {\n return this.formatDateTime(value);\n }\n },\n getAgeFromDate(value: Date) {\n return dayjs().diff(value, \"years\");\n },\n formatMonthName(value: Date, format: string) {\n return dayjs(value).format(format);\n },\n formatMonthNumber(value: Date) {\n return dayjs(value).month() + 1;\n },\n getPreviousMonth(date: Date, numberOfMonth: number) {\n return dayjs(date).subtract(numberOfMonth, \"months\").toDate();\n },\n setTimeFromString(date: Date, time: string, onlyMinutes?: boolean) {\n const setDate = dayjs(date).toDate();\n const split = time.split(\":\");\n if (!onlyMinutes) {\n setDate.setHours(Number(split[0] ?? 0));\n } else {\n setDate.setSeconds(0);\n }\n setDate.setMinutes(Number(split[1] ?? 0));\n return setDate;\n },\n formatDateString(value: string) {\n if (!value) {\n return null;\n } else {\n if (value.split(\"-\")[0]?.length === 4) {\n return dayjs(value).toDate();\n }\n if (value.split(\".\")[0]?.length === 4 || value.split(\"/\")[0]?.length === 4) {\n return dayjs(value, \"YYYY. M. D.\").toDate();\n }\n return dayjs(value, \"D. M. YYYY\").toDate();\n }\n },\n getDuration(date: Date | null, date2: Date | null, type: dayjs.ManipulateType) {\n if (!date || !date2) {\n return null;\n } else {\n const value = dayjs(date);\n const value2 = dayjs(date2);\n const result = value2.diff(value, type);\n return result;\n }\n },\n getStartOfDate(date: Date, unitOfTime: dayjs.OpUnitType) {\n return dayjs(date).startOf(unitOfTime).toDate();\n },\n getEndOfDay(date: Date) {\n return dayjs(date).endOf(\"day\").toDate();\n },\n getDateRange(date: Date, unitOfTime: dayjs.OpUnitType) {\n const startDate = dayjs(date).startOf(unitOfTime).toDate();\n const endDate = dayjs(date).endOf(unitOfTime).toDate();\n return { dateFrom: startDate, dateTo: endDate };\n },\n isDateInRange(startDate: Date, endDate: Date, dateToCheck: Date) {\n if (!endDate) {\n return dayjs(dateToCheck).isSame(startDate, \"day\");\n }\n return dayjs(dateToCheck).isBetween(startDate, endDate, null, \"[]\");\n },\n /** Adds a number of days (or other unit) to a date */\n add(value: Date, count: number, type?: dayjs.ManipulateType) {\n return dayjs(value)\n .add(count, type ? type : \"days\")\n .toDate();\n },\n substractDaysFromDate(numberOfDays: number, date: Date) {\n const result = dayjs(date).subtract(numberOfDays, \"days\").toDate();\n return result;\n },\n};\n","/**\n * Runtime deprecation warnings for the SPRING framework.\n * Warns once per session per deprecation to avoid console spam.\n * @module deprecation\n */\n\nconst warned = new Set<string>();\n\nexport function springDeprecate(name: string, alternative: string, removeVersion?: string): void {\n const key = `${name}:${alternative}`;\n if (warned.has(key)) return;\n warned.add(key);\n\n const versionNote = removeVersion ? ` It will be removed in v${removeVersion}.` : \"\";\n console.warn(`[SPRING Deprecation] \"${name}\" is deprecated. Use ${alternative} instead.${versionNote}`);\n}\n\n/** Clear all tracked deprecation warnings. Intended for testing. */\nexport function clearDeprecationWarnings(): void {\n warned.clear();\n}\n","import type { FilterFieldValue } from \"../types/form-types\";\nimport type { FilterNode } from \"../types/grid-types\";\nimport { getValueType } from \"./data-utils\";\n\nexport function parseFilter(value: string | number | boolean | Date | null | undefined | FilterFieldValue[] | object): string | boolean {\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (Array.isArray(value)) {\n return JSON.stringify(value);\n }\n\n if (typeof value === \"boolean\") {\n return value;\n }\n\n return value != null ? value.toString() : \"\";\n}\n\n/** Normalizes system filter — string/object to FilterNode. */\nexport function normalizeSystemFilter(\n input: Record<string, string | number | boolean | Date | null | undefined> | FilterNode | null | undefined\n): FilterNode | null {\n if (!input) return null;\n if (typeof input === \"object\" && input !== null && (\"logic\" in input || \"field\" in input)) {\n return input as FilterNode;\n }\n\n if (typeof input === \"object\" && input !== null) {\n const entries = Object.entries(input).filter(([k, v]) => k && v !== undefined && v !== null && v !== \"\");\n const filters: FilterNode[] = entries.map(([k, v]) => {\n const val = parseFilter(v);\n return {\n field: k,\n operator: \"eq\",\n value: val,\n };\n });\n\n if (filters.length === 0) {\n return null;\n }\n\n return {\n logic: \"and\",\n filters,\n };\n }\n\n return null;\n}\n\nexport function getFilterFieldType(\n fieldKey: string,\n defaultListFilter: Record<string, { type?: string }> | null | undefined,\n value: string | number | boolean | null | undefined | object\n): string {\n const fieldDef = defaultListFilter && defaultListFilter[fieldKey];\n\n if (fieldDef && typeof fieldDef.type === \"string\") {\n return fieldDef.type;\n }\n\n return getValueType(value);\n}\n","import sanitizeHtml from \"sanitize-html\";\n\nimport { getContentRes } from \"../adapters/content-adapter\";\nimport { getFrameworkConfig } from \"../config/framework-config\";\nimport type { FormStoreState } from \"../types/form-types\";\nimport type { ColumnType } from \"../types/grid-types\";\nimport { dateManager } from \"./date\";\n\ninterface FormatColumn<T> {\n field: string & keyof T;\n type: ColumnType;\n decimals?: number;\n textField?: string;\n}\n\n/** Strips all HTML tags from content */\nexport function sanitizeContent(content: string): string {\n if (!content) {\n return \"\";\n }\n const clean = sanitizeHtml(content, {\n allowedTags: [],\n allowedAttributes: {},\n });\n return clean;\n}\n\nconst editorAllowedTags = [\n \"p\", \"br\", \"div\", \"ul\", \"ol\", \"li\", \"b\", \"i\", \"em\", \"strong\", \"u\", \"s\",\n \"sub\", \"sup\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"span\", \"a\",\n \"table\", \"thead\", \"tbody\", \"tr\", \"th\", \"td\",\n];\nconst editorAllowedAttributes: sanitizeHtml.IOptions[\"allowedAttributes\"] = {\n a: [\"href\", \"title\", \"target\", \"rel\"],\n td: [\"colspan\", \"rowspan\"],\n th: [\"colspan\", \"rowspan\"],\n span: [\"style\"],\n};\nconst SAFE_TEXT_DECORATION_PATTERN = /^(?!.*(?:url|expression)\\s*\\()[a-z0-9#(),.%\\s-]{1,80}$/i;\nconst SAFE_LINK_TARGETS = new Set([\"_blank\", \"_self\", \"_parent\", \"_top\"]);\n\nfunction normalizeRelTokens(rel: string | undefined): string[] {\n if (!rel) return [];\n const seen = new Set<string>();\n const tokens: string[] = [];\n for (const raw of rel.split(/\\s+/)) {\n const token = raw.trim().toLowerCase();\n if (!token || token === \"opener\" || seen.has(token)) continue;\n seen.add(token);\n tokens.push(token);\n }\n return tokens;\n}\n\nconst editorTransformTags: sanitizeHtml.IOptions[\"transformTags\"] = {\n a: (tagName, attribs) => {\n const nextAttribs: Record<string, string> = { ...attribs };\n\n if (typeof nextAttribs.target === \"string\") {\n const normalizedTarget = nextAttribs.target.trim().toLowerCase();\n if (SAFE_LINK_TARGETS.has(normalizedTarget)) {\n nextAttribs.target = normalizedTarget;\n } else {\n delete nextAttribs.target;\n }\n }\n\n if (nextAttribs.target === \"_blank\") {\n const relTokens = normalizeRelTokens(nextAttribs.rel);\n if (!relTokens.includes(\"noopener\")) relTokens.push(\"noopener\");\n if (!relTokens.includes(\"noreferrer\")) relTokens.push(\"noreferrer\");\n nextAttribs.rel = relTokens.join(\" \");\n }\n\n return { tagName, attribs: nextAttribs };\n },\n};\n\nconst editorAllowedStyles: sanitizeHtml.IOptions[\"allowedStyles\"] = {\n span: {\n \"text-decoration\": [SAFE_TEXT_DECORATION_PATTERN],\n },\n};\n\n/** Sanitizes HTML output from WYSIWYG editor — allows formatting tags, removes scripts */\nexport function sanitizeEditorContent(content: string): string {\n if (!content) {\n return \"\";\n }\n return sanitizeHtml(content, {\n allowedTags: editorAllowedTags,\n allowedAttributes: editorAllowedAttributes,\n allowedStyles: editorAllowedStyles,\n transformTags: editorTransformTags,\n allowedSchemes: [\"http\", \"https\", \"mailto\"],\n });\n}\n\nexport function truncateString(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n } else if (maxLength < 3) {\n return value.slice(0, maxLength);\n } else {\n return value.slice(0, maxLength - 3) + \"...\";\n }\n}\n\nexport function toNumber(value: string | number, decimals?: number): string {\n const locale = getFrameworkConfig().i18n.numberLocale;\n return Number(value).toLocaleString(locale, {\n minimumFractionDigits: decimals ? decimals : 0,\n maximumFractionDigits: decimals ? decimals : 0,\n });\n}\n\nexport function setColumnBodyType<T extends FormStoreState>(item: T, obj: FormatColumn<T>): T[string & keyof T] | string | number | undefined {\n const key = obj.field;\n const rec = item;\n let result: T[string & keyof T] | string | number | undefined = rec[key];\n switch (obj.type) {\n case \"date\":\n result = dateManager.formatDate(rec[key] as Date | null);\n break;\n case \"datetime\":\n result = dateManager.formatDateTime(rec[key] as Date | null);\n break;\n case \"time\":\n result = dateManager.formatTime(rec[key] as Date | null);\n break;\n case \"boolean\":\n result = rec[key] ? getContentRes(\"admin-yes\") : getContentRes(\"admin-no\");\n break;\n case \"number\": {\n const numVal = rec[key] as string | number | undefined;\n result = numVal !== undefined ? (obj.decimals ? toNumber(numVal, obj.decimals) : numVal) : \"\";\n break;\n }\n case \"object\": {\n const objVal = rec[key] as { full_name?: string; name?: string; [k: string]: string | undefined } | null | undefined;\n result = objVal\n ? obj.textField\n ? objVal[obj.textField]\n : objVal.full_name || objVal.name || \"\"\n : \"\";\n break;\n }\n case \"string\":\n case \"color\":\n break;\n default: {\n const _exhaustive: never = obj.type;\n void _exhaustive;\n }\n }\n return result;\n}\n","/**\n * Shared utilities for tree structures (Tree and TreeList).\n * @module tree-utils\n */\n\nimport type { Indexable } from \"../types/form-types\";\n\nexport interface BaseTreeNode {\n id_public: string;\n childrenNodes?: BaseTreeNode[];\n}\n\n/** Safe access to node children — encapsulates dynamic property access + cast */\nexport function getChildren<T>(node: T, field: string): T[] | undefined {\n const val = (node as Indexable)[field];\n return Array.isArray(val) ? (val as T[]) : undefined;\n}\n\nexport function findNode<T extends BaseTreeNode>(\n nodes: T[],\n id: string,\n childrenField: string = \"childrenNodes\"\n): T | null {\n for (const node of nodes) {\n if (node.id_public === id) return node;\n const children = getChildren(node, childrenField);\n if (children && children.length > 0) {\n const found = findNode(children, id, childrenField);\n if (found) return found;\n }\n }\n return null;\n}\n\nexport function getAllIds<T extends BaseTreeNode>(nodes: T[], childrenField: string = \"childrenNodes\"): string[] {\n const ids: string[] = [];\n const collect = (items: T[]) => {\n for (const node of items) {\n ids.push(node.id_public);\n const children = getChildren(node, childrenField);\n if (children && children.length > 0) {\n collect(children);\n }\n }\n };\n collect(nodes);\n return ids;\n}\n\nexport function updateNode<T extends BaseTreeNode>(\n nodes: T[],\n id: string,\n updater: (node: T) => T,\n childrenField: string = \"childrenNodes\"\n): T[] {\n return nodes.map((node) => {\n if (node.id_public === id) {\n return updater(node);\n }\n const children = getChildren(node, childrenField);\n if (children && children.length > 0) {\n return {\n ...node,\n [childrenField]: updateNode(children, id, updater, childrenField),\n };\n }\n return node;\n });\n}\n\nexport function removeNode<T extends BaseTreeNode>(\n nodes: T[],\n id: string,\n childrenField: string = \"childrenNodes\"\n): T[] {\n return nodes\n .filter((node) => node.id_public !== id)\n .map((node) => {\n const children = getChildren(node, childrenField);\n if (children && children.length > 0) {\n return {\n ...node,\n [childrenField]: removeNode(children, id, childrenField),\n };\n }\n return node;\n });\n}\n\nexport function addNode<T extends BaseTreeNode>(\n nodes: T[],\n parentId: string | null,\n newNode: T,\n childrenField: string = \"childrenNodes\"\n): T[] {\n if (parentId === null) {\n return [...nodes, newNode];\n }\n\n return nodes.map((node) => {\n if (node.id_public === parentId) {\n const children = getChildren(node, childrenField) || [];\n return {\n ...node,\n [childrenField]: [...children, newNode],\n };\n }\n const children = getChildren(node, childrenField);\n if (children && children.length > 0) {\n return {\n ...node,\n [childrenField]: addNode(children, parentId, newNode, childrenField),\n };\n }\n return node;\n });\n}\n\nexport function findParentId<T extends BaseTreeNode>(\n nodes: T[],\n id: string,\n childrenField: string = \"childrenNodes\",\n parentId: string | null = null\n): string | null {\n for (const node of nodes) {\n if (node.id_public === id) {\n return parentId;\n }\n const children = getChildren(node, childrenField);\n if (children && children.length > 0) {\n const found = findParentId(children, id, childrenField, node.id_public);\n if (found !== null) return found;\n }\n }\n return null;\n}\n"],"mappings":"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","names":["dayjs","customParseFormat","dayjs","customParseFormat","children"]}
|