@spring-systems/core 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/LICENSE +8 -0
- package/README.md +77 -0
- package/dist/adapters/index.d.ts +246 -0
- package/dist/adapters/index.js +56 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/auth/index.d.ts +17 -0
- package/dist/auth/index.js +19 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/chunk-5D6XE7NJ.js +16 -0
- package/dist/chunk-5D6XE7NJ.js.map +1 -0
- package/dist/chunk-EFUBAQCV.js +94 -0
- package/dist/chunk-EFUBAQCV.js.map +1 -0
- package/dist/chunk-F2SIMWZ5.js +173 -0
- package/dist/chunk-F2SIMWZ5.js.map +1 -0
- package/dist/chunk-F7WUQJH7.js +399 -0
- package/dist/chunk-F7WUQJH7.js.map +1 -0
- package/dist/chunk-GON7Q32Q.js +176 -0
- package/dist/chunk-GON7Q32Q.js.map +1 -0
- package/dist/chunk-GXU75LQX.js +182 -0
- package/dist/chunk-GXU75LQX.js.map +1 -0
- package/dist/chunk-HFELOXDQ.js +110 -0
- package/dist/chunk-HFELOXDQ.js.map +1 -0
- package/dist/chunk-KX32MU3I.js +190 -0
- package/dist/chunk-KX32MU3I.js.map +1 -0
- package/dist/chunk-MEWPYTWC.js +284 -0
- package/dist/chunk-MEWPYTWC.js.map +1 -0
- package/dist/chunk-N2L4TUC4.js +34 -0
- package/dist/chunk-N2L4TUC4.js.map +1 -0
- package/dist/chunk-NQQIVCLX.js +47 -0
- package/dist/chunk-NQQIVCLX.js.map +1 -0
- package/dist/chunk-OSSX443T.js +146 -0
- package/dist/chunk-OSSX443T.js.map +1 -0
- package/dist/chunk-PT4DIYUK.js +78 -0
- package/dist/chunk-PT4DIYUK.js.map +1 -0
- package/dist/chunk-QAVWXARR.js +51 -0
- package/dist/chunk-QAVWXARR.js.map +1 -0
- package/dist/chunk-RRWKDFAB.js +143 -0
- package/dist/chunk-RRWKDFAB.js.map +1 -0
- package/dist/chunk-RUCXSQEY.js +42 -0
- package/dist/chunk-RUCXSQEY.js.map +1 -0
- package/dist/chunk-S6RPCN5H.js +64 -0
- package/dist/chunk-S6RPCN5H.js.map +1 -0
- package/dist/chunk-S7MKRNMI.js +153 -0
- package/dist/chunk-S7MKRNMI.js.map +1 -0
- package/dist/chunk-SQB4F3EF.js +55 -0
- package/dist/chunk-SQB4F3EF.js.map +1 -0
- package/dist/chunk-U5OH3GAI.js +399 -0
- package/dist/chunk-U5OH3GAI.js.map +1 -0
- package/dist/chunk-UDT2RPX2.js +43 -0
- package/dist/chunk-UDT2RPX2.js.map +1 -0
- package/dist/config/index.d.ts +63 -0
- package/dist/config/index.js +109 -0
- package/dist/config/index.js.map +1 -0
- package/dist/devtools/index.d.ts +54 -0
- package/dist/devtools/index.js +67 -0
- package/dist/devtools/index.js.map +1 -0
- package/dist/errors/index.d.ts +39 -0
- package/dist/errors/index.js +21 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/events/index.d.ts +153 -0
- package/dist/events/index.js +12 -0
- package/dist/events/index.js.map +1 -0
- package/dist/form-types-D3MdGpjA.d.ts +290 -0
- package/dist/framework-config-types-DeUbx4bu.d.ts +574 -0
- package/dist/i18n/index.d.ts +37 -0
- package/dist/i18n/index.js +7 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/instance/index.d.ts +112 -0
- package/dist/instance/index.js +37 -0
- package/dist/instance/index.js.map +1 -0
- package/dist/logger/index.d.ts +44 -0
- package/dist/logger/index.js +27 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/middleware/index.d.ts +91 -0
- package/dist/middleware/index.js +23 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware-registry-DT002qRd.d.ts +60 -0
- package/dist/middleware-types-DVG9C1qJ.d.ts +85 -0
- package/dist/plugins/index.d.ts +104 -0
- package/dist/plugins/index.js +16 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/runtime-env-config-CajOEJCP.d.ts +148 -0
- package/dist/security-sanitize-Bb0PExM6.d.ts +9 -0
- package/dist/spring-instance-EbUh4mQb.d.ts +119 -0
- package/dist/testing/index.d.ts +129 -0
- package/dist/testing/index.js +171 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types/index.d.ts +85 -0
- package/dist/types/index.js +72 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +143 -0
- package/dist/utils/index.js +786 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/validation/index.d.ts +48 -0
- package/dist/validation/index.js +147 -0
- package/dist/validation/index.js.map +1 -0
- package/package.json +142 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import {
|
|
2
|
+
registerFallbackMigration
|
|
3
|
+
} from "./chunk-RUCXSQEY.js";
|
|
4
|
+
import {
|
|
5
|
+
tryGetSpringInstance
|
|
6
|
+
} from "./chunk-EFUBAQCV.js";
|
|
7
|
+
|
|
8
|
+
// src/config/capabilities.ts
|
|
9
|
+
var UI_KEY = /* @__PURE__ */ Symbol.for("spring:capabilities");
|
|
10
|
+
function cloneValue(value, seen = /* @__PURE__ */ new WeakMap()) {
|
|
11
|
+
if (value === null || typeof value !== "object") {
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
const obj = value;
|
|
15
|
+
if (seen.has(obj)) return seen.get(obj);
|
|
16
|
+
if (value instanceof Date) {
|
|
17
|
+
return new Date(value.getTime());
|
|
18
|
+
}
|
|
19
|
+
if (value instanceof RegExp) {
|
|
20
|
+
return new RegExp(value.source, value.flags);
|
|
21
|
+
}
|
|
22
|
+
if (value instanceof Map) {
|
|
23
|
+
const cloned = /* @__PURE__ */ new Map();
|
|
24
|
+
seen.set(obj, cloned);
|
|
25
|
+
for (const [k, v] of value.entries()) {
|
|
26
|
+
cloned.set(cloneValue(k, seen), cloneValue(v, seen));
|
|
27
|
+
}
|
|
28
|
+
return cloned;
|
|
29
|
+
}
|
|
30
|
+
if (value instanceof Set) {
|
|
31
|
+
const cloned = /* @__PURE__ */ new Set();
|
|
32
|
+
seen.set(obj, cloned);
|
|
33
|
+
for (const item of value.values()) {
|
|
34
|
+
cloned.add(cloneValue(item, seen));
|
|
35
|
+
}
|
|
36
|
+
return cloned;
|
|
37
|
+
}
|
|
38
|
+
if (Array.isArray(value)) {
|
|
39
|
+
const cloned = [];
|
|
40
|
+
seen.set(obj, cloned);
|
|
41
|
+
for (const item of value) {
|
|
42
|
+
cloned.push(cloneValue(item, seen));
|
|
43
|
+
}
|
|
44
|
+
return cloned;
|
|
45
|
+
}
|
|
46
|
+
const proto = Object.getPrototypeOf(value);
|
|
47
|
+
const clonedObj = Object.create(proto);
|
|
48
|
+
seen.set(obj, clonedObj);
|
|
49
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
50
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
51
|
+
if (!descriptor) continue;
|
|
52
|
+
if ("value" in descriptor) {
|
|
53
|
+
descriptor.value = cloneValue(descriptor.value, seen);
|
|
54
|
+
}
|
|
55
|
+
Object.defineProperty(clonedObj, key, descriptor);
|
|
56
|
+
}
|
|
57
|
+
return clonedObj;
|
|
58
|
+
}
|
|
59
|
+
function deepFreeze(value, seen = /* @__PURE__ */ new WeakSet()) {
|
|
60
|
+
if (value !== null && typeof value === "object") {
|
|
61
|
+
const obj = value;
|
|
62
|
+
if (seen.has(obj)) return value;
|
|
63
|
+
seen.add(obj);
|
|
64
|
+
if (value instanceof Map) {
|
|
65
|
+
for (const [k, v] of value.entries()) {
|
|
66
|
+
deepFreeze(k, seen);
|
|
67
|
+
deepFreeze(v, seen);
|
|
68
|
+
}
|
|
69
|
+
Object.freeze(value);
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
if (value instanceof Set) {
|
|
73
|
+
for (const item of value.values()) {
|
|
74
|
+
deepFreeze(item, seen);
|
|
75
|
+
}
|
|
76
|
+
Object.freeze(value);
|
|
77
|
+
return value;
|
|
78
|
+
}
|
|
79
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
80
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
81
|
+
if (!descriptor || !("value" in descriptor)) continue;
|
|
82
|
+
deepFreeze(descriptor.value, seen);
|
|
83
|
+
}
|
|
84
|
+
Object.freeze(value);
|
|
85
|
+
}
|
|
86
|
+
return value;
|
|
87
|
+
}
|
|
88
|
+
function getStore() {
|
|
89
|
+
const instance = tryGetSpringInstance();
|
|
90
|
+
if (instance) {
|
|
91
|
+
if (!instance.ui[UI_KEY]) {
|
|
92
|
+
const emptyStore = {};
|
|
93
|
+
instance.ui[UI_KEY] = emptyStore;
|
|
94
|
+
}
|
|
95
|
+
return instance.ui[UI_KEY];
|
|
96
|
+
}
|
|
97
|
+
return fallbackStore;
|
|
98
|
+
}
|
|
99
|
+
var fallbackStore = {};
|
|
100
|
+
registerFallbackMigration((instance) => {
|
|
101
|
+
if (Object.keys(fallbackStore).length === 0) return;
|
|
102
|
+
const existing = instance.ui[UI_KEY];
|
|
103
|
+
if (!existing || typeof existing !== "object") {
|
|
104
|
+
instance.ui[UI_KEY] = { ...fallbackStore };
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const instanceStore = existing;
|
|
108
|
+
for (const [key, value] of Object.entries(fallbackStore)) {
|
|
109
|
+
if (!(key in instanceStore)) {
|
|
110
|
+
instanceStore[key] = value;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
function configureCapabilities(capabilities) {
|
|
115
|
+
const store = getStore();
|
|
116
|
+
Object.assign(store, capabilities);
|
|
117
|
+
}
|
|
118
|
+
function hasCapability(name) {
|
|
119
|
+
const store = getStore();
|
|
120
|
+
const value = store[name];
|
|
121
|
+
if (value === void 0 || value === null) return false;
|
|
122
|
+
if (typeof value === "boolean") return value;
|
|
123
|
+
if (typeof value === "object" && value !== null && "enabled" in value) {
|
|
124
|
+
return !!value.enabled;
|
|
125
|
+
}
|
|
126
|
+
return !!value;
|
|
127
|
+
}
|
|
128
|
+
function getCapability(name) {
|
|
129
|
+
return getStore()[name];
|
|
130
|
+
}
|
|
131
|
+
function getCapabilities() {
|
|
132
|
+
return deepFreeze(cloneValue(getStore()));
|
|
133
|
+
}
|
|
134
|
+
function getRegisteredCapabilityNames() {
|
|
135
|
+
return Object.keys(getStore());
|
|
136
|
+
}
|
|
137
|
+
function clearCapabilities() {
|
|
138
|
+
const instance = tryGetSpringInstance();
|
|
139
|
+
if (instance) {
|
|
140
|
+
instance.ui[UI_KEY] = {};
|
|
141
|
+
}
|
|
142
|
+
fallbackStore = {};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export {
|
|
146
|
+
configureCapabilities,
|
|
147
|
+
hasCapability,
|
|
148
|
+
getCapability,
|
|
149
|
+
getCapabilities,
|
|
150
|
+
getRegisteredCapabilityNames,
|
|
151
|
+
clearCapabilities
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=chunk-S7MKRNMI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/capabilities.ts"],"sourcesContent":["/**\n * Feature capability system for enterprise SPRING deployments.\n *\n * Capabilities allow framework consumers to enable/disable features\n * per client deployment. Plugins can declare required capabilities\n * and the framework checks them at registration time.\n *\n * @example\n * ```ts\n * // In project-config.ts:\n * configureCapabilities({\n * charts: true,\n * advancedFiltering: true,\n * bulkOperations: false,\n * export: { enabled: true, formats: [\"xlsx\", \"pdf\"] },\n * });\n *\n * // In a plugin:\n * if (hasCapability(\"advancedFiltering\")) {\n * registerMiddleware(\"list:beforeLoad\", advancedFilterMiddleware);\n * }\n *\n * // In a component:\n * const canExport = hasCapability(\"export\");\n * ```\n *\n * @module capabilities\n */\n\nimport { tryGetSpringInstance } from \"../instance/current-instance\";\nimport { registerFallbackMigration } from \"../instance/fallback-bridge\";\nimport type { CapabilityMap } from \"./capability-types\";\n\nexport type { CapabilityMap } from \"./capability-types\";\n\n/**\n * Extensible capability map. Consumers and plugins extend via declaration merging:\n *\n * @example\n * ```ts\n * declare module \"@spring-systems/core/config\" {\n * interface CapabilityMap {\n * \"myPlugin:feature\": boolean;\n * }\n * }\n * ```\n */\nconst UI_KEY = Symbol.for(\"spring:capabilities\");\n\ntype CapabilityStore = Partial<CapabilityMap> & Record<string, unknown>;\n\nfunction cloneValue<T>(value: T, seen = new WeakMap<object, unknown>()): T {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n\n const obj = value as object;\n if (seen.has(obj)) return seen.get(obj) as T;\n\n if (value instanceof Date) {\n return new Date(value.getTime()) as T;\n }\n if (value instanceof RegExp) {\n return new RegExp(value.source, value.flags) as T;\n }\n if (value instanceof Map) {\n const cloned = new Map<unknown, unknown>();\n seen.set(obj, cloned);\n for (const [k, v] of value.entries()) {\n cloned.set(cloneValue(k, seen), cloneValue(v, seen));\n }\n return cloned as T;\n }\n if (value instanceof Set) {\n const cloned = new Set<unknown>();\n seen.set(obj, cloned);\n for (const item of value.values()) {\n cloned.add(cloneValue(item, seen));\n }\n return cloned as T;\n }\n if (Array.isArray(value)) {\n const cloned: unknown[] = [];\n seen.set(obj, cloned);\n for (const item of value) {\n cloned.push(cloneValue(item, seen));\n }\n return cloned as T;\n }\n\n const proto = Object.getPrototypeOf(value);\n const clonedObj = Object.create(proto) as Record<PropertyKey, unknown>;\n seen.set(obj, clonedObj);\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor) continue;\n if (\"value\" in descriptor) {\n descriptor.value = cloneValue(descriptor.value, seen);\n }\n Object.defineProperty(clonedObj, key, descriptor);\n }\n return clonedObj as T;\n}\n\nfunction deepFreeze<T>(value: T, seen = new WeakSet<object>()): T {\n if (value !== null && typeof value === \"object\") {\n const obj = value as object;\n if (seen.has(obj)) return value;\n seen.add(obj);\n\n if (value instanceof Map) {\n for (const [k, v] of value.entries()) {\n deepFreeze(k, seen);\n deepFreeze(v, seen);\n }\n Object.freeze(value);\n return value;\n }\n\n if (value instanceof Set) {\n for (const item of value.values()) {\n deepFreeze(item, seen);\n }\n Object.freeze(value);\n return value;\n }\n\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor || !(\"value\" in descriptor)) continue;\n deepFreeze(descriptor.value, seen);\n }\n Object.freeze(value);\n }\n return value;\n}\n\nfunction getStore(): CapabilityStore {\n const instance = tryGetSpringInstance();\n if (instance) {\n if (!instance.ui[UI_KEY]) {\n const emptyStore: CapabilityStore = {};\n instance.ui[UI_KEY] = emptyStore;\n }\n return instance.ui[UI_KEY] as CapabilityStore;\n }\n return fallbackStore;\n}\n\nlet fallbackStore: CapabilityStore = {};\n\n// Migrate fallback capabilities to SpringInstance when SpringProvider mounts.\n// Merge is non-destructive: explicit instance values win over fallback values.\nregisterFallbackMigration((instance) => {\n if (Object.keys(fallbackStore).length === 0) return;\n\n const existing = instance.ui[UI_KEY];\n if (!existing || typeof existing !== \"object\") {\n instance.ui[UI_KEY] = { ...fallbackStore };\n return;\n }\n\n const instanceStore = existing as CapabilityStore;\n for (const [key, value] of Object.entries(fallbackStore)) {\n if (!(key in instanceStore)) {\n instanceStore[key] = value;\n }\n }\n});\n\n/**\n * Configure feature capabilities for this deployment.\n * Merges with existing capabilities (does not replace).\n */\nexport function configureCapabilities(capabilities: Partial<CapabilityMap> & Record<string, unknown>): void {\n const store = getStore();\n Object.assign(store, capabilities);\n}\n\n/**\n * Check if a capability is enabled.\n * Returns false for unknown/unconfigured capabilities.\n */\nexport function hasCapability<K extends keyof CapabilityMap>(name: K): boolean {\n const store = getStore();\n const value = store[name];\n if (value === undefined || value === null) return false;\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"object\" && value !== null && \"enabled\" in value) {\n return !!(value as { enabled: boolean }).enabled;\n }\n return !!value;\n}\n\n/**\n * Get the full capability configuration for a feature.\n * Returns undefined if the capability is not configured.\n */\nexport function getCapability<K extends keyof CapabilityMap>(name: K): CapabilityMap[K] | undefined {\n return getStore()[name] as CapabilityMap[K] | undefined;\n}\n\n/** Get all configured capabilities. */\nexport function getCapabilities(): Readonly<CapabilityStore> {\n return deepFreeze(cloneValue(getStore()));\n}\n\n/**\n * Get the names of all currently registered (configured) capabilities.\n * Useful for introspection and for validating that plugin capability\n * references point to actually-configured features.\n */\nexport function getRegisteredCapabilityNames(): string[] {\n return Object.keys(getStore());\n}\n\n/** Reset all capabilities. For testing only. */\nexport function clearCapabilities(): void {\n const instance = tryGetSpringInstance();\n if (instance) {\n instance.ui[UI_KEY] = {};\n }\n fallbackStore = {};\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {
|
|
2
|
+
registerMiddleware
|
|
3
|
+
} from "./chunk-MEWPYTWC.js";
|
|
4
|
+
import {
|
|
5
|
+
logWarn
|
|
6
|
+
} from "./chunk-KX32MU3I.js";
|
|
7
|
+
|
|
8
|
+
// src/middleware/audit-middleware.ts
|
|
9
|
+
async function invokeAuditHandler(handler, event) {
|
|
10
|
+
try {
|
|
11
|
+
await Promise.resolve(handler(event));
|
|
12
|
+
} catch (err) {
|
|
13
|
+
logWarn(
|
|
14
|
+
"AuditMiddleware",
|
|
15
|
+
`Handler error for ${event.action} ${event.entity}#${event.entityId}: ${err instanceof Error ? err.message : String(err)}`
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function createAuditMiddleware(handler, options) {
|
|
20
|
+
const saveMiddleware = async (ctx, next) => {
|
|
21
|
+
await next();
|
|
22
|
+
if (ctx.aborted) return;
|
|
23
|
+
await invokeAuditHandler(handler, {
|
|
24
|
+
action: ctx.isNew ? "create" : "update",
|
|
25
|
+
entity: ctx.entity,
|
|
26
|
+
entityId: ctx.id,
|
|
27
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
28
|
+
url: ctx.url,
|
|
29
|
+
fields: ctx.fields
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
const deleteMiddleware = async (ctx, next) => {
|
|
33
|
+
await next();
|
|
34
|
+
if (ctx.aborted) return;
|
|
35
|
+
await invokeAuditHandler(handler, {
|
|
36
|
+
action: "delete",
|
|
37
|
+
entity: ctx.entity,
|
|
38
|
+
entityId: ctx.id,
|
|
39
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
40
|
+
url: ctx.url,
|
|
41
|
+
fields: {}
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
const unregisterSave = registerMiddleware("form:afterSave", saveMiddleware, options);
|
|
45
|
+
const unregisterDelete = registerMiddleware("form:afterDelete", deleteMiddleware, options);
|
|
46
|
+
return () => {
|
|
47
|
+
unregisterSave();
|
|
48
|
+
unregisterDelete();
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
createAuditMiddleware
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=chunk-SQB4F3EF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/middleware/audit-middleware.ts"],"sourcesContent":["/**\n * Audit middleware — standardized audit event creation for form mutations.\n *\n * Provides a typed `AuditEvent` and factory functions that hook into\n * `form:afterSave` and `form:afterDelete` to produce audit events for every\n * successful create, update, or delete operation.\n *\n * @example\n * ```ts\n * import { createAuditMiddleware } from \"@spring-systems/core/middleware\";\n *\n * // Send audit events to your backend:\n * const unregister = createAuditMiddleware(async (event) => {\n * await fetch(\"/api/audit\", {\n * method: \"POST\",\n * headers: { \"Content-Type\": \"application/json\" },\n * body: JSON.stringify(event),\n * });\n * });\n *\n * // Or log to console during development:\n * createAuditMiddleware((event) => {\n * console.log(`[Audit] ${event.action} ${event.entity}#${event.entityId}`, event);\n * });\n * ```\n *\n * @module audit-middleware\n */\n\nimport { logWarn } from \"../logger/logger\";\nimport type { MiddlewareOptions } from \"./middleware-registry\";\nimport { registerMiddleware } from \"./middleware-registry\";\nimport type { FormDeleteContext, FormSaveContext, MiddlewareFn } from \"./middleware-types\";\n\nexport interface AuditEvent {\n /** Mutation type */\n action: \"create\" | \"update\" | \"delete\";\n /** Entity type name (e.g. \"partner\", \"user\") */\n entity: string;\n /** Entity record identifier */\n entityId: string;\n /** ISO 8601 timestamp of the event */\n timestamp: string;\n /** API endpoint URL used for the operation */\n url: string;\n /** Field values included in the save payload (empty object for deletes) */\n fields: Record<string, unknown>;\n}\n\nexport type AuditEventHandler = (event: AuditEvent) => void | Promise<void>;\n\nasync function invokeAuditHandler(handler: AuditEventHandler, event: AuditEvent): Promise<void> {\n try {\n await Promise.resolve(handler(event));\n } catch (err: unknown) {\n logWarn(\n \"AuditMiddleware\",\n `Handler error for ${event.action} ${event.entity}#${event.entityId}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Create and register audit middleware that emits `AuditEvent` for every\n * successful form save (create or update) and delete operation.\n *\n * The middleware hooks into both `form:afterSave` and `form:afterDelete` slots.\n * Aborted operations are silently skipped.\n *\n * @param handler - Callback that receives the audit event. Can be sync or async.\n * Async errors are caught and logged to prevent audit failures\n * from breaking the operation flow.\n * @param options - Optional middleware options (e.g. `{ priority: 10 }`)\n * @returns An unregister function that removes both audit middleware registrations.\n */\nexport function createAuditMiddleware(\n handler: AuditEventHandler,\n options?: MiddlewareOptions,\n): () => void {\n const saveMiddleware: MiddlewareFn<FormSaveContext> = async (ctx, next) => {\n await next();\n\n if (ctx.aborted) return;\n\n await invokeAuditHandler(handler, {\n action: ctx.isNew ? \"create\" : \"update\",\n entity: ctx.entity,\n entityId: ctx.id,\n timestamp: new Date().toISOString(),\n url: ctx.url,\n fields: ctx.fields,\n });\n };\n\n const deleteMiddleware: MiddlewareFn<FormDeleteContext> = async (ctx, next) => {\n await next();\n\n if (ctx.aborted) return;\n\n await invokeAuditHandler(handler, {\n action: \"delete\",\n entity: ctx.entity,\n entityId: ctx.id,\n timestamp: new Date().toISOString(),\n url: ctx.url,\n fields: {},\n });\n };\n\n const unregisterSave = registerMiddleware(\"form:afterSave\", saveMiddleware, options);\n const unregisterDelete = registerMiddleware(\"form:afterDelete\", deleteMiddleware, options);\n\n return () => {\n unregisterSave();\n unregisterDelete();\n };\n}\n"],"mappings":";;;;;;;;AAmDA,eAAe,mBAAmB,SAA4B,OAAkC;AAC5F,MAAI;AACA,UAAM,QAAQ,QAAQ,QAAQ,KAAK,CAAC;AAAA,EACxC,SAAS,KAAc;AACnB;AAAA,MACI;AAAA,MACA,qBAAqB,MAAM,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC5H;AAAA,EACJ;AACJ;AAeO,SAAS,sBACZ,SACA,SACU;AACV,QAAM,iBAAgD,OAAO,KAAK,SAAS;AACvE,UAAM,KAAK;AAEX,QAAI,IAAI,QAAS;AAEjB,UAAM,mBAAmB,SAAS;AAAA,MAC9B,QAAQ,IAAI,QAAQ,WAAW;AAAA,MAC/B,QAAQ,IAAI;AAAA,MACZ,UAAU,IAAI;AAAA,MACd,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,KAAK,IAAI;AAAA,MACT,QAAQ,IAAI;AAAA,IAChB,CAAC;AAAA,EACL;AAEA,QAAM,mBAAoD,OAAO,KAAK,SAAS;AAC3E,UAAM,KAAK;AAEX,QAAI,IAAI,QAAS;AAEjB,UAAM,mBAAmB,SAAS;AAAA,MAC9B,QAAQ;AAAA,MACR,QAAQ,IAAI;AAAA,MACZ,UAAU,IAAI;AAAA,MACd,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,KAAK,IAAI;AAAA,MACT,QAAQ,CAAC;AAAA,IACb,CAAC;AAAA,EACL;AAEA,QAAM,iBAAiB,mBAAmB,kBAAkB,gBAAgB,OAAO;AACnF,QAAM,mBAAmB,mBAAmB,oBAAoB,kBAAkB,OAAO;AAEzF,SAAO,MAAM;AACT,mBAAe;AACf,qBAAiB;AAAA,EACrB;AACJ;","names":[]}
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getFrameworkConfig
|
|
3
|
+
} from "./chunk-F7WUQJH7.js";
|
|
4
|
+
|
|
5
|
+
// src/config/config-presets.ts
|
|
6
|
+
var developmentPreset = {
|
|
7
|
+
limits: {
|
|
8
|
+
maxFileSize: 100 * 1024 * 1024
|
|
9
|
+
// 100MB for testing large files
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
var stagingPreset = {
|
|
13
|
+
limits: {
|
|
14
|
+
maxFileSize: 50 * 1024 * 1024
|
|
15
|
+
// 50MB
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var productionPreset = {
|
|
19
|
+
limits: {
|
|
20
|
+
maxFileSize: 25 * 1024 * 1024
|
|
21
|
+
// 25MB
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
var presets = {
|
|
25
|
+
development: developmentPreset,
|
|
26
|
+
staging: stagingPreset,
|
|
27
|
+
production: productionPreset
|
|
28
|
+
};
|
|
29
|
+
function getConfigPreset(env) {
|
|
30
|
+
const preset = presets[env];
|
|
31
|
+
return {
|
|
32
|
+
...preset,
|
|
33
|
+
limits: preset.limits ? { ...preset.limits } : void 0
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function getAutoConfigPreset(options) {
|
|
37
|
+
const importMetaEnv = options?.env ?? import.meta.env;
|
|
38
|
+
const processTargetEnv = typeof process !== "undefined" ? process.env?.TARGET_ENV : void 0;
|
|
39
|
+
const processNodeEnv = typeof process !== "undefined" ? process.env?.NODE_ENV : void 0;
|
|
40
|
+
const targetEnv = options?.targetEnv ?? processTargetEnv ?? (typeof importMetaEnv?.TARGET_ENV === "string" ? importMetaEnv.TARGET_ENV : "") ?? "";
|
|
41
|
+
const nodeEnv = options?.nodeEnv ?? processNodeEnv ?? (typeof importMetaEnv?.NODE_ENV === "string" ? importMetaEnv.NODE_ENV : "") ?? "";
|
|
42
|
+
const mode = options?.mode ?? (typeof importMetaEnv?.MODE === "string" ? importMetaEnv.MODE : "");
|
|
43
|
+
const isProdFlag = options?.prod ?? importMetaEnv?.PROD === true;
|
|
44
|
+
if (targetEnv === "prod" || nodeEnv === "production" || mode === "production" || isProdFlag) {
|
|
45
|
+
return getConfigPreset("production");
|
|
46
|
+
}
|
|
47
|
+
if (targetEnv === "staging") return getConfigPreset("staging");
|
|
48
|
+
return getConfigPreset("development");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// src/config/layout-presets.ts
|
|
52
|
+
var KNOWN_VARIANTS = /* @__PURE__ */ new Set(["admin", "website", "minimal", "custom"]);
|
|
53
|
+
function isKnownVariant(value) {
|
|
54
|
+
return KNOWN_VARIANTS.has(value);
|
|
55
|
+
}
|
|
56
|
+
var LAYOUT_PRESETS = {
|
|
57
|
+
admin: { variant: "admin", requiresAuth: true },
|
|
58
|
+
website: { variant: "website", requiresAuth: false },
|
|
59
|
+
minimal: { variant: "minimal", requiresAuth: false },
|
|
60
|
+
custom: { variant: "custom", requiresAuth: false }
|
|
61
|
+
};
|
|
62
|
+
function resolveLayoutConfig(name) {
|
|
63
|
+
const config = getFrameworkConfig();
|
|
64
|
+
const configured = config.layouts?.[name];
|
|
65
|
+
if (configured) {
|
|
66
|
+
const variant = configured.variant && isKnownVariant(configured.variant) ? configured.variant : "admin";
|
|
67
|
+
const preset = LAYOUT_PRESETS[variant];
|
|
68
|
+
return { ...preset, ...configured, variant };
|
|
69
|
+
}
|
|
70
|
+
if (isKnownVariant(name)) {
|
|
71
|
+
return { ...LAYOUT_PRESETS[name], variant: name };
|
|
72
|
+
}
|
|
73
|
+
return { ...LAYOUT_PRESETS.admin, variant: "admin" };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// src/config/theme.ts
|
|
77
|
+
var DEFAULT_THEME = {
|
|
78
|
+
colorPrimary: "#2563EB",
|
|
79
|
+
colorPrimaryLight: "#2563eb1f",
|
|
80
|
+
colorPrimaryDark: "#1d4ed8",
|
|
81
|
+
colorSecondaryDark: "#1e3a5f",
|
|
82
|
+
colorDanger: "#b91c1c",
|
|
83
|
+
colorSuccess: "#15803d",
|
|
84
|
+
colorSuccessLight: "#e5f3ec",
|
|
85
|
+
colorBg: "#dfebfb",
|
|
86
|
+
colorBgLight: "#eff6ff",
|
|
87
|
+
colorPanel: "white",
|
|
88
|
+
colorBorder: "#a2a3b8",
|
|
89
|
+
colorActive: "#ffbf49",
|
|
90
|
+
colorDisabledBg: "#e4e4e4",
|
|
91
|
+
colorText: "black",
|
|
92
|
+
colorTextMuted: "#666666",
|
|
93
|
+
colorTextDisabled: "#636363",
|
|
94
|
+
colorTextSecondary: "white",
|
|
95
|
+
colorPanelSecondary: "white",
|
|
96
|
+
colorPanelDashboard: "#dfebfb",
|
|
97
|
+
colorPanelDashboardSecondary: "#cbdbf2",
|
|
98
|
+
colorPanelAlt: "#f9fafb",
|
|
99
|
+
colorChartBg: "#201f25",
|
|
100
|
+
colorDarkLightSecondary: "#eff6ff",
|
|
101
|
+
fontSizeXxs: "10px",
|
|
102
|
+
fontSizeXs: "11px",
|
|
103
|
+
fontSizeSm: "12px",
|
|
104
|
+
fontSizeMd: "13px",
|
|
105
|
+
fontSizeLg: "14px",
|
|
106
|
+
fontSizeXl: "16px",
|
|
107
|
+
fontSize2xl: "22px",
|
|
108
|
+
radiusXs: "1px",
|
|
109
|
+
radiusSm: "3px",
|
|
110
|
+
radiusMd: "6px",
|
|
111
|
+
radiusLg: "12px",
|
|
112
|
+
radiusXl: "16px",
|
|
113
|
+
radiusDialog: "8px",
|
|
114
|
+
radiusPanel: "10px",
|
|
115
|
+
shadowXs: "0 1px 2px rgba(0, 0, 0, 0.06)",
|
|
116
|
+
shadowSm: "0 2px 6px rgba(0, 0, 0, 0.06)",
|
|
117
|
+
shadowMd: "0 4px 12px rgba(0, 0, 0, 0.15)",
|
|
118
|
+
shadowLg: "0 4px 16px rgba(0, 0, 0, 0.12)",
|
|
119
|
+
shadowPopup: "0 12px 32px rgba(0, 0, 0, 0.18), 0 6px 12px rgba(0, 0, 0, 0.12)",
|
|
120
|
+
shadowNavbar: "0 2px 8px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.12)",
|
|
121
|
+
shadowInset: "inset 0 2px 4px rgba(0, 0, 0, 0.04)",
|
|
122
|
+
shadowBottom: "0 -2px 5px rgba(0, 0, 0, 0.2)",
|
|
123
|
+
shadowDnd: "0 4px 12px rgba(0, 0, 0, 0.25)",
|
|
124
|
+
shadowDndLg: "0 4px 12px rgba(0, 0, 0, 0.15), 0 8px 24px rgba(0, 0, 0, 0.2)",
|
|
125
|
+
shadowDragSm: "0 2px 8px rgba(0, 0, 0, 0.2)",
|
|
126
|
+
shadowSubtle: "0 2px 4px rgba(0, 0, 0, 0.15)",
|
|
127
|
+
shadowRingWhite: "inset 0 0 0 2px rgba(255, 255, 255, 0.5)",
|
|
128
|
+
transitionFast: "0.15s ease",
|
|
129
|
+
transitionNormal: "0.3s ease",
|
|
130
|
+
opacityGhost: "0.35",
|
|
131
|
+
opacitySubtle: "0.4",
|
|
132
|
+
opacityDisabled: "0.5",
|
|
133
|
+
opacityMuted: "0.6",
|
|
134
|
+
opacityOverlay: "0.7",
|
|
135
|
+
opacityHover: "0.8",
|
|
136
|
+
opacityHigh: "0.85",
|
|
137
|
+
opacityNearOpaque: "0.9",
|
|
138
|
+
sizeInputHeight: "27px",
|
|
139
|
+
fontFamilyBase: "Verdana, Geneva, sans-serif"
|
|
140
|
+
};
|
|
141
|
+
var CAMEL_TO_CSS = {
|
|
142
|
+
colorPrimary: "--spring-color-primary",
|
|
143
|
+
colorPrimaryLight: "--spring-color-primary-light",
|
|
144
|
+
colorPrimaryDark: "--spring-color-primary-dark",
|
|
145
|
+
colorSecondaryDark: "--spring-color-secondary-dark",
|
|
146
|
+
colorDanger: "--spring-color-danger",
|
|
147
|
+
colorSuccess: "--spring-color-success",
|
|
148
|
+
colorSuccessLight: "--spring-color-success-light",
|
|
149
|
+
colorBg: "--spring-color-bg",
|
|
150
|
+
colorBgLight: "--spring-color-bg-light",
|
|
151
|
+
colorPanel: "--spring-color-panel",
|
|
152
|
+
colorBorder: "--spring-color-border",
|
|
153
|
+
colorActive: "--spring-color-active",
|
|
154
|
+
colorDisabledBg: "--spring-color-disabled-bg",
|
|
155
|
+
colorText: "--spring-color-text",
|
|
156
|
+
colorTextMuted: "--spring-color-text-muted",
|
|
157
|
+
colorTextDisabled: "--spring-color-text-disabled",
|
|
158
|
+
colorTextSecondary: "--spring-color-text-secondary",
|
|
159
|
+
colorPanelSecondary: "--spring-color-panel-secondary",
|
|
160
|
+
colorPanelDashboard: "--spring-color-panel-dashboard",
|
|
161
|
+
colorPanelDashboardSecondary: "--spring-color-panel-dashboard-secondary",
|
|
162
|
+
colorPanelAlt: "--spring-color-panel-alt",
|
|
163
|
+
colorChartBg: "--spring-color-chart-bg",
|
|
164
|
+
colorDarkLightSecondary: "--spring-color-dark-light-secondary",
|
|
165
|
+
fontSizeXxs: "--spring-font-size-xxs",
|
|
166
|
+
fontSizeXs: "--spring-font-size-xs",
|
|
167
|
+
fontSizeSm: "--spring-font-size-sm",
|
|
168
|
+
fontSizeMd: "--spring-font-size-md",
|
|
169
|
+
fontSizeLg: "--spring-font-size-lg",
|
|
170
|
+
fontSizeXl: "--spring-font-size-xl",
|
|
171
|
+
fontSize2xl: "--spring-font-size-2xl",
|
|
172
|
+
radiusXs: "--spring-radius-xs",
|
|
173
|
+
radiusSm: "--spring-radius-sm",
|
|
174
|
+
radiusMd: "--spring-radius-md",
|
|
175
|
+
radiusLg: "--spring-radius-lg",
|
|
176
|
+
radiusXl: "--spring-radius-xl",
|
|
177
|
+
radiusDialog: "--spring-radius-dialog",
|
|
178
|
+
radiusPanel: "--spring-radius-panel",
|
|
179
|
+
shadowXs: "--spring-shadow-xs",
|
|
180
|
+
shadowSm: "--spring-shadow-sm",
|
|
181
|
+
shadowMd: "--spring-shadow-md",
|
|
182
|
+
shadowLg: "--spring-shadow-lg",
|
|
183
|
+
shadowPopup: "--spring-shadow-popup",
|
|
184
|
+
shadowNavbar: "--spring-shadow-navbar",
|
|
185
|
+
shadowInset: "--spring-shadow-inset",
|
|
186
|
+
shadowBottom: "--spring-shadow-bottom",
|
|
187
|
+
shadowDnd: "--spring-shadow-dnd",
|
|
188
|
+
shadowDndLg: "--spring-shadow-dnd-lg",
|
|
189
|
+
shadowDragSm: "--spring-shadow-drag-sm",
|
|
190
|
+
shadowSubtle: "--spring-shadow-subtle",
|
|
191
|
+
shadowRingWhite: "--spring-shadow-ring-white",
|
|
192
|
+
transitionFast: "--spring-transition-fast",
|
|
193
|
+
transitionNormal: "--spring-transition-normal",
|
|
194
|
+
opacityGhost: "--spring-opacity-ghost",
|
|
195
|
+
opacitySubtle: "--spring-opacity-subtle",
|
|
196
|
+
opacityDisabled: "--spring-opacity-disabled",
|
|
197
|
+
opacityMuted: "--spring-opacity-muted",
|
|
198
|
+
opacityOverlay: "--spring-opacity-overlay",
|
|
199
|
+
opacityHover: "--spring-opacity-hover",
|
|
200
|
+
opacityHigh: "--spring-opacity-high",
|
|
201
|
+
opacityNearOpaque: "--spring-opacity-near-opaque",
|
|
202
|
+
sizeInputHeight: "--spring-size-input-height",
|
|
203
|
+
fontFamilyBase: "--spring-font-family-base"
|
|
204
|
+
};
|
|
205
|
+
var componentTokenMap = {
|
|
206
|
+
button: {
|
|
207
|
+
borderRadius: "--spring-button-border-radius",
|
|
208
|
+
paddingX: "--spring-button-padding-x",
|
|
209
|
+
paddingY: "--spring-button-padding-y",
|
|
210
|
+
fontSize: "--spring-button-font-size",
|
|
211
|
+
primaryBg: "--spring-button-primary-bg",
|
|
212
|
+
primaryColor: "--spring-button-primary-color",
|
|
213
|
+
primaryHoverFilter: "--spring-button-primary-hover-filter",
|
|
214
|
+
outlineBorderColor: "--spring-button-outline-border-color",
|
|
215
|
+
ghostHoverBg: "--spring-button-ghost-hover-bg",
|
|
216
|
+
minWidth: "--spring-button-min-width",
|
|
217
|
+
smPaddingX: "--spring-button-sm-padding-x",
|
|
218
|
+
smPaddingY: "--spring-button-sm-padding-y",
|
|
219
|
+
smFontSize: "--spring-button-sm-font-size",
|
|
220
|
+
smMinWidth: "--spring-button-sm-min-width",
|
|
221
|
+
lgPaddingX: "--spring-button-lg-padding-x",
|
|
222
|
+
lgPaddingY: "--spring-button-lg-padding-y",
|
|
223
|
+
lgFontSize: "--spring-button-lg-font-size",
|
|
224
|
+
lgMinWidth: "--spring-button-lg-min-width"
|
|
225
|
+
},
|
|
226
|
+
list: {
|
|
227
|
+
rowHeight: "--spring-list-row-height",
|
|
228
|
+
headerBg: "--spring-list-header-bg",
|
|
229
|
+
headerColor: "--spring-list-header-color",
|
|
230
|
+
stripedBg: "--spring-list-striped-bg",
|
|
231
|
+
selectedBg: "--spring-list-selected-bg",
|
|
232
|
+
hoverBg: "--spring-list-hover-bg",
|
|
233
|
+
borderColor: "--spring-list-border-color",
|
|
234
|
+
fontSize: "--spring-list-font-size"
|
|
235
|
+
},
|
|
236
|
+
form: {
|
|
237
|
+
fieldSpacing: "--spring-form-field-spacing",
|
|
238
|
+
labelColor: "--spring-form-label-color",
|
|
239
|
+
labelFontSize: "--spring-form-label-font-size",
|
|
240
|
+
inputHeight: "--spring-form-input-height",
|
|
241
|
+
inputBg: "--spring-form-input-bg",
|
|
242
|
+
inputBorderColor: "--spring-form-input-border-color",
|
|
243
|
+
inputFocusBorderColor: "--spring-form-input-focus-border-color",
|
|
244
|
+
inputFontSize: "--spring-form-input-font-size",
|
|
245
|
+
inputBorderRadius: "--spring-form-input-border-radius"
|
|
246
|
+
},
|
|
247
|
+
dialog: {
|
|
248
|
+
backdropColor: "--spring-dialog-backdrop-color",
|
|
249
|
+
maxWidth: "--spring-dialog-max-width",
|
|
250
|
+
borderRadius: "--spring-dialog-border-radius",
|
|
251
|
+
padding: "--spring-dialog-padding",
|
|
252
|
+
shadowColor: "--spring-dialog-shadow-color"
|
|
253
|
+
},
|
|
254
|
+
page: {
|
|
255
|
+
headerBg: "--spring-page-header-bg",
|
|
256
|
+
headerBorderColor: "--spring-page-header-border-color",
|
|
257
|
+
navigationBg: "--spring-page-navigation-bg",
|
|
258
|
+
navigationWidth: "--spring-page-navigation-width",
|
|
259
|
+
contentBg: "--spring-page-content-bg"
|
|
260
|
+
},
|
|
261
|
+
panel: {
|
|
262
|
+
bg: "--spring-panel-bg",
|
|
263
|
+
borderColor: "--spring-panel-border-color",
|
|
264
|
+
borderRadius: "--spring-panel-border-radius",
|
|
265
|
+
padding: "--spring-panel-padding"
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
var DEFAULT_DARK_THEME = {
|
|
269
|
+
colorPrimary: "#7c78d8",
|
|
270
|
+
colorPrimaryLight: "#7c78d81f",
|
|
271
|
+
colorPrimaryDark: "#9d9ae0",
|
|
272
|
+
colorSecondaryDark: "#c8c6f0",
|
|
273
|
+
colorDanger: "#ef4444",
|
|
274
|
+
colorSuccess: "#22c55e",
|
|
275
|
+
colorSuccessLight: "#1a3a2a",
|
|
276
|
+
colorBg: "#1a1b2e",
|
|
277
|
+
colorBgLight: "#222340",
|
|
278
|
+
colorPanel: "#2a2b45",
|
|
279
|
+
colorBorder: "#4a4b6a",
|
|
280
|
+
colorActive: "#f59e0b",
|
|
281
|
+
colorDisabledBg: "#3a3b55",
|
|
282
|
+
colorText: "#e4e4f0",
|
|
283
|
+
colorTextMuted: "#a0a0b8",
|
|
284
|
+
colorTextDisabled: "#6a6a80",
|
|
285
|
+
colorTextSecondary: "#f0f0ff",
|
|
286
|
+
colorPanelSecondary: "#32334d",
|
|
287
|
+
colorPanelDashboard: "#1e1f35",
|
|
288
|
+
colorPanelDashboardSecondary: "#262742",
|
|
289
|
+
colorPanelAlt: "#32334d",
|
|
290
|
+
colorChartBg: "#1a1b2e",
|
|
291
|
+
colorDarkLightSecondary: "#2e2f4a",
|
|
292
|
+
shadowXs: "0 1px 2px rgba(0, 0, 0, 0.2)",
|
|
293
|
+
shadowSm: "0 2px 6px rgba(0, 0, 0, 0.25)",
|
|
294
|
+
shadowMd: "0 4px 12px rgba(0, 0, 0, 0.4)",
|
|
295
|
+
shadowLg: "0 4px 16px rgba(0, 0, 0, 0.35)",
|
|
296
|
+
shadowPopup: "0 12px 32px rgba(0, 0, 0, 0.5), 0 6px 12px rgba(0, 0, 0, 0.35)",
|
|
297
|
+
shadowNavbar: "0 2px 8px rgba(0, 0, 0, 0.25), 0 4px 16px rgba(0, 0, 0, 0.3)",
|
|
298
|
+
shadowInset: "inset 0 2px 4px rgba(0, 0, 0, 0.15)",
|
|
299
|
+
shadowBottom: "0 -2px 5px rgba(0, 0, 0, 0.4)",
|
|
300
|
+
shadowDnd: "0 4px 12px rgba(0, 0, 0, 0.5)",
|
|
301
|
+
shadowDndLg: "0 4px 12px rgba(0, 0, 0, 0.35), 0 8px 24px rgba(0, 0, 0, 0.45)",
|
|
302
|
+
shadowDragSm: "0 2px 8px rgba(0, 0, 0, 0.45)",
|
|
303
|
+
shadowSubtle: "0 2px 4px rgba(0, 0, 0, 0.35)",
|
|
304
|
+
shadowRingWhite: "inset 0 0 0 2px rgba(255, 255, 255, 0.3)"
|
|
305
|
+
};
|
|
306
|
+
function createTheme(overrides) {
|
|
307
|
+
return { ...DEFAULT_THEME, ...overrides };
|
|
308
|
+
}
|
|
309
|
+
function getResolvedTheme() {
|
|
310
|
+
if (typeof document === "undefined") {
|
|
311
|
+
return { ...DEFAULT_THEME };
|
|
312
|
+
}
|
|
313
|
+
const style = getComputedStyle(document.documentElement);
|
|
314
|
+
const result = { ...DEFAULT_THEME };
|
|
315
|
+
for (const [key, cssVar] of Object.entries(CAMEL_TO_CSS)) {
|
|
316
|
+
const value = style.getPropertyValue(cssVar).trim();
|
|
317
|
+
if (value) {
|
|
318
|
+
result[key] = value;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return result;
|
|
322
|
+
}
|
|
323
|
+
function themeToCSS(theme, componentTokens) {
|
|
324
|
+
const lines = Object.entries(theme).filter(([key]) => key in CAMEL_TO_CSS).map(([key, value]) => ` ${CAMEL_TO_CSS[key]}: ${value};`);
|
|
325
|
+
if (componentTokens) {
|
|
326
|
+
for (const [group, tokens] of Object.entries(componentTokens)) {
|
|
327
|
+
const map = componentTokenMap[group];
|
|
328
|
+
if (!map) continue;
|
|
329
|
+
for (const [key, value] of Object.entries(tokens)) {
|
|
330
|
+
const cssVar = map[key];
|
|
331
|
+
if (cssVar && value) {
|
|
332
|
+
lines.push(` ${cssVar}: ${value};`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return `:root {
|
|
338
|
+
${lines.join("\n")}
|
|
339
|
+
}`;
|
|
340
|
+
}
|
|
341
|
+
function themeToCSSDark(darkOverrides) {
|
|
342
|
+
const lines = [];
|
|
343
|
+
for (const [key, value] of Object.entries(darkOverrides)) {
|
|
344
|
+
const cssVar = CAMEL_TO_CSS[key];
|
|
345
|
+
if (cssVar && value) {
|
|
346
|
+
lines.push(` ${cssVar}: ${value};`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (lines.length === 0) return "";
|
|
350
|
+
const darkCSS = lines.join("\n");
|
|
351
|
+
return [
|
|
352
|
+
`@media (prefers-color-scheme: dark) {
|
|
353
|
+
:root {
|
|
354
|
+
${darkCSS}
|
|
355
|
+
}
|
|
356
|
+
}`,
|
|
357
|
+
`[data-spring-theme="dark"] {
|
|
358
|
+
${darkCSS}
|
|
359
|
+
}`
|
|
360
|
+
].join("\n\n");
|
|
361
|
+
}
|
|
362
|
+
function themeToCSSVariables(theme, componentTokens) {
|
|
363
|
+
const result = {};
|
|
364
|
+
for (const [key, value] of Object.entries(theme)) {
|
|
365
|
+
const cssVar = CAMEL_TO_CSS[key];
|
|
366
|
+
if (cssVar) {
|
|
367
|
+
result[cssVar] = value;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
if (componentTokens) {
|
|
371
|
+
for (const [group, tokens] of Object.entries(componentTokens)) {
|
|
372
|
+
const map = componentTokenMap[group];
|
|
373
|
+
if (!map) continue;
|
|
374
|
+
for (const [key, value] of Object.entries(tokens)) {
|
|
375
|
+
const cssVar = map[key];
|
|
376
|
+
if (cssVar && value) {
|
|
377
|
+
result[cssVar] = value;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return result;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
export {
|
|
386
|
+
getConfigPreset,
|
|
387
|
+
getAutoConfigPreset,
|
|
388
|
+
LAYOUT_PRESETS,
|
|
389
|
+
resolveLayoutConfig,
|
|
390
|
+
DEFAULT_THEME,
|
|
391
|
+
CAMEL_TO_CSS,
|
|
392
|
+
DEFAULT_DARK_THEME,
|
|
393
|
+
createTheme,
|
|
394
|
+
getResolvedTheme,
|
|
395
|
+
themeToCSS,
|
|
396
|
+
themeToCSSDark,
|
|
397
|
+
themeToCSSVariables
|
|
398
|
+
};
|
|
399
|
+
//# sourceMappingURL=chunk-U5OH3GAI.js.map
|