@clusterenvision/ui-framework 1.0.0 → 1.0.2
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/dist/browser.cjs +10 -10
- package/dist/browser.js +4 -4
- package/dist/{chunk-T6T7QE4J.js → chunk-AA4GATSB.js} +3 -3
- package/dist/{chunk-T6T7QE4J.js.map → chunk-AA4GATSB.js.map} +1 -1
- package/dist/{chunk-V6JCOBGY.js → chunk-BXQFX2PS.js} +3 -3
- package/dist/{chunk-V6JCOBGY.js.map → chunk-BXQFX2PS.js.map} +1 -1
- package/dist/{chunk-CXTAUXLG.cjs → chunk-FLUSP6VF.cjs} +4 -4
- package/dist/{chunk-CXTAUXLG.cjs.map → chunk-FLUSP6VF.cjs.map} +1 -1
- package/dist/{chunk-Q3KH6HMU.js → chunk-LSWEXTKL.js} +9 -5
- package/dist/chunk-LSWEXTKL.js.map +1 -0
- package/dist/{chunk-PVZVFICK.cjs → chunk-NCXUQXAN.cjs} +9 -5
- package/dist/chunk-NCXUQXAN.cjs.map +1 -0
- package/dist/{chunk-6BYWFGQY.cjs → chunk-SZL56BNL.cjs} +4 -4
- package/dist/{chunk-6BYWFGQY.cjs.map → chunk-SZL56BNL.cjs.map} +1 -1
- package/dist/{chunk-CHLDE4JQ.js → chunk-VQDM5HCG.js} +3 -3
- package/dist/{chunk-CHLDE4JQ.js.map → chunk-VQDM5HCG.js.map} +1 -1
- package/dist/{chunk-W3LNNY3U.cjs → chunk-W5M7JGC4.cjs} +4 -4
- package/dist/{chunk-W3LNNY3U.cjs.map → chunk-W5M7JGC4.cjs.map} +1 -1
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +21 -21
- package/dist/index.js +5 -5
- package/dist/lib/index.cjs +15 -15
- package/dist/lib/index.cjs.map +1 -1
- package/dist/lib/index.d.cts +4 -4
- package/dist/lib/index.d.ts +4 -4
- package/dist/lib/index.js +3 -3
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/theme.cjs +13 -13
- package/dist/lib/theme.js +1 -1
- package/dist/runtime/adapters/react.cjs.map +1 -1
- package/dist/runtime/adapters/react.js.map +1 -1
- package/dist/runtime/components/ai-assistant.cjs +4 -4
- package/dist/runtime/components/ai-assistant.js +3 -3
- package/dist/runtime/components/ai-summary-card.cjs +4 -4
- package/dist/runtime/components/ai-summary-card.js +3 -3
- package/dist/runtime/router.cjs.map +1 -1
- package/dist/runtime/router.js.map +1 -1
- package/package.json +2 -7
- package/dist/chunk-PVZVFICK.cjs.map +0 -1
- package/dist/chunk-Q3KH6HMU.js.map +0 -1
package/dist/browser.cjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkQPAAV32J_cjs = require('./chunk-QPAAV32J.cjs');
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
require('./chunk-
|
|
4
|
+
var chunkSZL56BNL_cjs = require('./chunk-SZL56BNL.cjs');
|
|
5
|
+
var chunkFLUSP6VF_cjs = require('./chunk-FLUSP6VF.cjs');
|
|
6
|
+
var chunkW5M7JGC4_cjs = require('./chunk-W5M7JGC4.cjs');
|
|
7
|
+
require('./chunk-NCXUQXAN.cjs');
|
|
8
8
|
require('./chunk-IRBUKIRF.cjs');
|
|
9
9
|
require('./chunk-FFCZSYC7.cjs');
|
|
10
10
|
require('./chunk-ZWUA2LPB.cjs');
|
|
@@ -139,27 +139,27 @@ Object.defineProperty(exports, "normalizeResourceKey", {
|
|
|
139
139
|
});
|
|
140
140
|
Object.defineProperty(exports, "AiAssistantPanel", {
|
|
141
141
|
enumerable: true,
|
|
142
|
-
get: function () { return
|
|
142
|
+
get: function () { return chunkSZL56BNL_cjs.AiAssistantPanel; }
|
|
143
143
|
});
|
|
144
144
|
Object.defineProperty(exports, "AiSummaryCard", {
|
|
145
145
|
enumerable: true,
|
|
146
|
-
get: function () { return
|
|
146
|
+
get: function () { return chunkFLUSP6VF_cjs.AiSummaryCard; }
|
|
147
147
|
});
|
|
148
148
|
Object.defineProperty(exports, "Injector", {
|
|
149
149
|
enumerable: true,
|
|
150
|
-
get: function () { return
|
|
150
|
+
get: function () { return chunkW5M7JGC4_cjs.Injector; }
|
|
151
151
|
});
|
|
152
152
|
Object.defineProperty(exports, "createInjector", {
|
|
153
153
|
enumerable: true,
|
|
154
|
-
get: function () { return
|
|
154
|
+
get: function () { return chunkW5M7JGC4_cjs.createInjector; }
|
|
155
155
|
});
|
|
156
156
|
Object.defineProperty(exports, "defineComponent", {
|
|
157
157
|
enumerable: true,
|
|
158
|
-
get: function () { return
|
|
158
|
+
get: function () { return chunkW5M7JGC4_cjs.defineComponent; }
|
|
159
159
|
});
|
|
160
160
|
Object.defineProperty(exports, "renderComponent", {
|
|
161
161
|
enumerable: true,
|
|
162
|
-
get: function () { return
|
|
162
|
+
get: function () { return chunkW5M7JGC4_cjs.renderComponent; }
|
|
163
163
|
});
|
|
164
164
|
Object.defineProperty(exports, "Effect", {
|
|
165
165
|
enumerable: true,
|
package/dist/browser.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { buildHydrationDomDiff, buildHydrationSummary, buildRouteTree, buildSignalsGraph, calculateRetryDelay, classifyError, createAiSession, createAngularAdapter, createDevtoolsDashboard, createFormController, createFormWizard, createHttpAiProvider, createHydrationReplayPanel, createHydrationReplaySession, createMockAiProvider, createReactAdapter, createResource, createResourceCache, createRouterInspector, createRouterInspectorPanel, createRuntimeDiagnosticsStore, createSignalsInspector, createSignalsInspectorPanel, createVueAdapter, getHydrationDomPayload, getHydrationReports, getResourceCache, invalidateResource, isResourceExpired, isResourceStale, normalizeResourceKey } from './chunk-4HRORR2Q.js';
|
|
2
|
-
export { AiAssistantPanel } from './chunk-
|
|
3
|
-
export { AiSummaryCard } from './chunk-
|
|
4
|
-
export { Injector, createInjector, defineComponent, renderComponent } from './chunk-
|
|
5
|
-
import './chunk-
|
|
2
|
+
export { AiAssistantPanel } from './chunk-AA4GATSB.js';
|
|
3
|
+
export { AiSummaryCard } from './chunk-BXQFX2PS.js';
|
|
4
|
+
export { Injector, createInjector, defineComponent, renderComponent } from './chunk-VQDM5HCG.js';
|
|
5
|
+
import './chunk-LSWEXTKL.js';
|
|
6
6
|
import './chunk-IHAMVLRY.js';
|
|
7
7
|
import './chunk-BBAUALNU.js';
|
|
8
8
|
import './chunk-SA5UD5B6.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent } from './chunk-
|
|
1
|
+
import { defineComponent } from './chunk-VQDM5HCG.js';
|
|
2
2
|
import { signal } from './chunk-PFBEIFVS.js';
|
|
3
3
|
|
|
4
4
|
// src/runtime/components/ai-assistant.ts
|
|
@@ -220,5 +220,5 @@ var AiAssistantPanel = defineComponent({
|
|
|
220
220
|
});
|
|
221
221
|
|
|
222
222
|
export { AiAssistantPanel };
|
|
223
|
-
//# sourceMappingURL=chunk-
|
|
224
|
-
//# sourceMappingURL=chunk-
|
|
223
|
+
//# sourceMappingURL=chunk-AA4GATSB.js.map
|
|
224
|
+
//# sourceMappingURL=chunk-AA4GATSB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/components/ai-assistant.ts"],"names":[],"mappings":"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","file":"chunk-T6T7QE4J.js","sourcesContent":["import { defineComponent } from '../component.js';\nimport { signal } from '../signals.js';\nimport type { AiMessage, AiRole, AiSessionStatus } from '../ai.js';\n\nexport interface AiAssistantPanelProps extends Record<string, unknown> {\n title?: string;\n description?: string;\n messages: AiMessage[];\n suggestions?: string[];\n status?: AiSessionStatus;\n error?: string | null;\n placeholder?: string;\n sendLabel?: string;\n resetLabel?: string;\n busyLabel?: string;\n disabled?: boolean;\n}\n\nconst PANEL_STYLES = `\n .ai-panel {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n }\n .ai-panel__body {\n max-height: 420px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n .ai-panel__messages {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n }\n .ai-panel__message {\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n .ai-panel__bubble {\n background: var(--ce-surface-muted, #f8fafc);\n border-radius: 1rem;\n padding: 0.75rem 1rem;\n border: 1px solid var(--ce-border, rgba(15, 23, 42, 0.08));\n }\n .ai-panel__message[data-role=\"assistant\"] .ai-panel__bubble {\n background: var(--ce-surface, #ffffff);\n border-color: rgba(56, 189, 248, 0.35);\n }\n .ai-panel__author {\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--ce-text-subtle, #475569);\n }\n .ai-panel__bubble p {\n margin: 0.25rem 0;\n white-space: pre-wrap;\n }\n .ai-panel__bubble small {\n color: var(--ce-text-subtle, #94a3b8);\n font-size: 0.7rem;\n }\n .ai-panel__empty {\n font-size: 0.9rem;\n color: var(--ce-text-subtle, #94a3b8);\n }\n .ai-panel__error {\n border-radius: 0.75rem;\n border: 1px solid rgba(248, 113, 113, 0.5);\n background: rgba(248, 113, 113, 0.08);\n padding: 0.75rem 1rem;\n color: var(--ce-danger, #b91c1c);\n }\n .ai-panel__form {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n .ai-panel__input {\n width: 100%;\n min-height: 120px;\n border-radius: 0.75rem;\n border: 1px solid var(--ce-border, rgba(15, 23, 42, 0.1));\n padding: 0.75rem 1rem;\n font: inherit;\n resize: vertical;\n background: var(--ce-surface, #ffffff);\n }\n .ai-panel__actions {\n display: flex;\n gap: 0.75rem;\n flex-wrap: wrap;\n }\n .ai-panel__suggestions {\n margin-top: 1rem;\n }\n .ai-panel__chip-row {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n .ai-panel__chip {\n border: 1px dashed var(--ce-border, rgba(15, 23, 42, 0.25));\n border-radius: 999px;\n padding: 0.35rem 0.85rem;\n font-size: 0.85rem;\n }\n`;\n\nexport const AiAssistantPanel = defineComponent<AiAssistantPanelProps>({\n name: 'ce-ai-assistant-panel',\n template: `\n <section class=\"card card--shadow ai-panel\" role=\"region\" aria-live=\"polite\">\n <header class=\"card__header\">\n <div>\n <p class=\"badge badge--primary\">AI Assistant</p>\n <h3>{{ props.title ?? 'Strategy copilot' }}</h3>\n <p>{{ props.description ?? 'Ask the model to summarize milestones, risks, and delivery plans.' }}</p>\n </div>\n <span class=\"badge badge--warning\" ce:if=\"isBusy()\">{{ props.busyLabel ?? 'Working' }}</span>\n </header>\n <div class=\"card__body ai-panel__body\">\n <ul class=\"ai-panel__messages\" aria-live=\"polite\">\n <li ce:for=\"message in props.messages\" track=\"message.id\" class=\"ai-panel__message\" data-role=\"{{ message.role }}\">\n <div class=\"ai-panel__bubble\">\n <span class=\"ai-panel__author\">{{ formatRole(message.role) }}</span>\n <p>{{ message.content }}</p>\n <small>{{ formatTimestamp(message) }}</small>\n </div>\n </li>\n <li ce:if=\"!props.messages.length\" class=\"ai-panel__empty\">No prompts yet — start with one of the suggestions below.</li>\n </ul>\n <div class=\"ai-panel__error\" ce:if=\"hasError()\">\n <p>{{ props.error ?? 'The assistant could not finish this request.' }}</p>\n </div>\n </div>\n <footer class=\"card__footer ai-panel__footer\">\n <form class=\"ai-panel__form\" on:submit=\"submit\" novalidate>\n <label class=\"ai-panel__label\" for=\"ce-ai-assistant-input\">Prompt</label>\n <textarea\n id=\"ce-ai-assistant-input\"\n class=\"ai-panel__input\"\n rows=\"3\"\n placeholder=\"{{ props.placeholder ?? 'Ask anything about your CE UI adoption plan…' }}\"\n value=\"{{ prompt() }}\"\n on:input=\"handleInput\"\n required\n aria-label=\"AI prompt input\"\n ></textarea>\n <div class=\"ai-panel__actions\">\n <button type=\"submit\" class=\"button button--primary\" disabled=\"{{ props.disabled || isBusy() ? 'true' : 'false' }}\">{{ sendLabel() }}</button>\n <button type=\"button\" class=\"button button--secondary\" on:click=\"reset\">{{ props.resetLabel ?? 'Reset' }}</button>\n </div>\n </form>\n <section class=\"ai-panel__suggestions\" ce:if=\"props.suggestions?.length\">\n <p>Suggestions</p>\n <div class=\"ai-panel__chip-row\">\n <button\n ce:for=\"suggestion in props.suggestions\"\n track=\"suggestion\"\n type=\"button\"\n class=\"button button--ghost ai-panel__chip\"\n on:click=\"useSuggestion(suggestion)\"\n >\n {{ suggestion }}\n </button>\n </div>\n </section>\n </footer>\n </section>\n `,\n styles: [PANEL_STYLES],\n setup({ emit, props }) {\n const prompt = signal('');\n const formatter = new Intl.DateTimeFormat('en-US', { hour: '2-digit', minute: '2-digit' });\n\n const handleInput = (event: Event) => {\n const value = (event.target as HTMLTextAreaElement | null)?.value ?? '';\n prompt.set(value);\n };\n\n const submit = (event: Event) => {\n event.preventDefault();\n if (props.disabled || props.status === 'processing') {\n return;\n }\n const value = prompt().trim();\n if (!value) {\n return;\n }\n emit('send', { prompt: value });\n prompt.set('');\n };\n\n const reset = () => {\n prompt.set('');\n emit('reset');\n };\n\n const useSuggestion = (suggestion: string) => {\n prompt.set(suggestion);\n emit('prefill', { prompt: suggestion });\n };\n\n const hasError = () => Boolean(props.error);\n const isBusy = () => props.status === 'processing';\n const sendLabel = () => (isBusy() ? props.busyLabel ?? 'Thinking…' : props.sendLabel ?? 'Send');\n\n const formatTimestamp = (message: AiMessage) => formatter.format(new Date(message.createdAt));\n const formatRole = (role: AiRole) => {\n switch (role) {\n case 'assistant':\n return 'Assistant';\n case 'system':\n return 'System';\n case 'tool':\n return 'Tool';\n default:\n return 'You';\n }\n };\n\n return {\n prompt,\n handleInput,\n submit,\n reset,\n useSuggestion,\n hasError,\n isBusy,\n sendLabel,\n formatTimestamp,\n formatRole,\n };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime/components/ai-assistant.ts"],"names":[],"mappings":"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","file":"chunk-AA4GATSB.js","sourcesContent":["import { defineComponent } from '../component.js';\nimport { signal } from '../signals.js';\nimport type { AiMessage, AiRole, AiSessionStatus } from '../ai.js';\n\nexport interface AiAssistantPanelProps extends Record<string, unknown> {\n title?: string;\n description?: string;\n messages: AiMessage[];\n suggestions?: string[];\n status?: AiSessionStatus;\n error?: string | null;\n placeholder?: string;\n sendLabel?: string;\n resetLabel?: string;\n busyLabel?: string;\n disabled?: boolean;\n}\n\nconst PANEL_STYLES = `\n .ai-panel {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n }\n .ai-panel__body {\n max-height: 420px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n .ai-panel__messages {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n }\n .ai-panel__message {\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n .ai-panel__bubble {\n background: var(--ce-surface-muted, #f8fafc);\n border-radius: 1rem;\n padding: 0.75rem 1rem;\n border: 1px solid var(--ce-border, rgba(15, 23, 42, 0.08));\n }\n .ai-panel__message[data-role=\"assistant\"] .ai-panel__bubble {\n background: var(--ce-surface, #ffffff);\n border-color: rgba(56, 189, 248, 0.35);\n }\n .ai-panel__author {\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--ce-text-subtle, #475569);\n }\n .ai-panel__bubble p {\n margin: 0.25rem 0;\n white-space: pre-wrap;\n }\n .ai-panel__bubble small {\n color: var(--ce-text-subtle, #94a3b8);\n font-size: 0.7rem;\n }\n .ai-panel__empty {\n font-size: 0.9rem;\n color: var(--ce-text-subtle, #94a3b8);\n }\n .ai-panel__error {\n border-radius: 0.75rem;\n border: 1px solid rgba(248, 113, 113, 0.5);\n background: rgba(248, 113, 113, 0.08);\n padding: 0.75rem 1rem;\n color: var(--ce-danger, #b91c1c);\n }\n .ai-panel__form {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n .ai-panel__input {\n width: 100%;\n min-height: 120px;\n border-radius: 0.75rem;\n border: 1px solid var(--ce-border, rgba(15, 23, 42, 0.1));\n padding: 0.75rem 1rem;\n font: inherit;\n resize: vertical;\n background: var(--ce-surface, #ffffff);\n }\n .ai-panel__actions {\n display: flex;\n gap: 0.75rem;\n flex-wrap: wrap;\n }\n .ai-panel__suggestions {\n margin-top: 1rem;\n }\n .ai-panel__chip-row {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n .ai-panel__chip {\n border: 1px dashed var(--ce-border, rgba(15, 23, 42, 0.25));\n border-radius: 999px;\n padding: 0.35rem 0.85rem;\n font-size: 0.85rem;\n }\n`;\n\nexport const AiAssistantPanel = defineComponent<AiAssistantPanelProps>({\n name: 'ce-ai-assistant-panel',\n template: `\n <section class=\"card card--shadow ai-panel\" role=\"region\" aria-live=\"polite\">\n <header class=\"card__header\">\n <div>\n <p class=\"badge badge--primary\">AI Assistant</p>\n <h3>{{ props.title ?? 'Strategy copilot' }}</h3>\n <p>{{ props.description ?? 'Ask the model to summarize milestones, risks, and delivery plans.' }}</p>\n </div>\n <span class=\"badge badge--warning\" ce:if=\"isBusy()\">{{ props.busyLabel ?? 'Working' }}</span>\n </header>\n <div class=\"card__body ai-panel__body\">\n <ul class=\"ai-panel__messages\" aria-live=\"polite\">\n <li ce:for=\"message in props.messages\" track=\"message.id\" class=\"ai-panel__message\" data-role=\"{{ message.role }}\">\n <div class=\"ai-panel__bubble\">\n <span class=\"ai-panel__author\">{{ formatRole(message.role) }}</span>\n <p>{{ message.content }}</p>\n <small>{{ formatTimestamp(message) }}</small>\n </div>\n </li>\n <li ce:if=\"!props.messages.length\" class=\"ai-panel__empty\">No prompts yet — start with one of the suggestions below.</li>\n </ul>\n <div class=\"ai-panel__error\" ce:if=\"hasError()\">\n <p>{{ props.error ?? 'The assistant could not finish this request.' }}</p>\n </div>\n </div>\n <footer class=\"card__footer ai-panel__footer\">\n <form class=\"ai-panel__form\" on:submit=\"submit\" novalidate>\n <label class=\"ai-panel__label\" for=\"ce-ai-assistant-input\">Prompt</label>\n <textarea\n id=\"ce-ai-assistant-input\"\n class=\"ai-panel__input\"\n rows=\"3\"\n placeholder=\"{{ props.placeholder ?? 'Ask anything about your CE UI adoption plan…' }}\"\n value=\"{{ prompt() }}\"\n on:input=\"handleInput\"\n required\n aria-label=\"AI prompt input\"\n ></textarea>\n <div class=\"ai-panel__actions\">\n <button type=\"submit\" class=\"button button--primary\" disabled=\"{{ props.disabled || isBusy() ? 'true' : 'false' }}\">{{ sendLabel() }}</button>\n <button type=\"button\" class=\"button button--secondary\" on:click=\"reset\">{{ props.resetLabel ?? 'Reset' }}</button>\n </div>\n </form>\n <section class=\"ai-panel__suggestions\" ce:if=\"props.suggestions?.length\">\n <p>Suggestions</p>\n <div class=\"ai-panel__chip-row\">\n <button\n ce:for=\"suggestion in props.suggestions\"\n track=\"suggestion\"\n type=\"button\"\n class=\"button button--ghost ai-panel__chip\"\n on:click=\"useSuggestion(suggestion)\"\n >\n {{ suggestion }}\n </button>\n </div>\n </section>\n </footer>\n </section>\n `,\n styles: [PANEL_STYLES],\n setup({ emit, props }) {\n const prompt = signal('');\n const formatter = new Intl.DateTimeFormat('en-US', { hour: '2-digit', minute: '2-digit' });\n\n const handleInput = (event: Event) => {\n const value = (event.target as HTMLTextAreaElement | null)?.value ?? '';\n prompt.set(value);\n };\n\n const submit = (event: Event) => {\n event.preventDefault();\n if (props.disabled || props.status === 'processing') {\n return;\n }\n const value = prompt().trim();\n if (!value) {\n return;\n }\n emit('send', { prompt: value });\n prompt.set('');\n };\n\n const reset = () => {\n prompt.set('');\n emit('reset');\n };\n\n const useSuggestion = (suggestion: string) => {\n prompt.set(suggestion);\n emit('prefill', { prompt: suggestion });\n };\n\n const hasError = () => Boolean(props.error);\n const isBusy = () => props.status === 'processing';\n const sendLabel = () => (isBusy() ? props.busyLabel ?? 'Thinking…' : props.sendLabel ?? 'Send');\n\n const formatTimestamp = (message: AiMessage) => formatter.format(new Date(message.createdAt));\n const formatRole = (role: AiRole) => {\n switch (role) {\n case 'assistant':\n return 'Assistant';\n case 'system':\n return 'System';\n case 'tool':\n return 'Tool';\n default:\n return 'You';\n }\n };\n\n return {\n prompt,\n handleInput,\n submit,\n reset,\n useSuggestion,\n hasError,\n isBusy,\n sendLabel,\n formatTimestamp,\n formatRole,\n };\n },\n});\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent } from './chunk-
|
|
1
|
+
import { defineComponent } from './chunk-VQDM5HCG.js';
|
|
2
2
|
|
|
3
3
|
// src/runtime/components/ai-summary-card.ts
|
|
4
4
|
var SUMMARY_STYLES = `
|
|
@@ -65,5 +65,5 @@ var AiSummaryCard = defineComponent({
|
|
|
65
65
|
});
|
|
66
66
|
|
|
67
67
|
export { AiSummaryCard };
|
|
68
|
-
//# sourceMappingURL=chunk-
|
|
69
|
-
//# sourceMappingURL=chunk-
|
|
68
|
+
//# sourceMappingURL=chunk-BXQFX2PS.js.map
|
|
69
|
+
//# sourceMappingURL=chunk-BXQFX2PS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/components/ai-summary-card.ts"],"names":[],"mappings":";;;AAWA,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAsChB,IAAM,gBAAgB,eAAA,CAAoC;AAAA,EAC/D,IAAA,EAAM,oBAAA;AAAA,EACN,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAqBV,MAAA,EAAQ,CAAC,cAAc;AACzB,CAAC","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/runtime/components/ai-summary-card.ts"],"names":[],"mappings":";;;AAWA,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAsChB,IAAM,gBAAgB,eAAA,CAAoC;AAAA,EAC/D,IAAA,EAAM,oBAAA;AAAA,EACN,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAqBV,MAAA,EAAQ,CAAC,cAAc;AACzB,CAAC","file":"chunk-BXQFX2PS.js","sourcesContent":["import { defineComponent } from '../component.js';\n\nexport interface AiSummaryCardProps extends Record<string, unknown> {\n eyebrow?: string;\n title: string;\n summary: string;\n highlights?: string[];\n sentiment?: 'positive' | 'warning' | 'critical';\n updatedAt?: string;\n}\n\nconst SUMMARY_STYLES = `\n .ai-summary {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n .ai-summary__eyebrow {\n text-transform: uppercase;\n font-size: 0.75rem;\n letter-spacing: 0.08em;\n color: var(--ce-text-subtle, #64748b);\n }\n .ai-summary__highlights {\n list-style: disc;\n padding-left: 1.5rem;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n .ai-summary__footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 0.8rem;\n color: var(--ce-text-subtle, #94a3b8);\n }\n .ai-summary .badge[data-tone='critical'] {\n background: var(--ce-danger, #dc2626);\n }\n .ai-summary .badge[data-tone='warning'] {\n background: var(--ce-warning, #f97316);\n }\n .ai-summary .badge[data-tone='positive'] {\n background: var(--ce-success, #10b981);\n }\n`;\n\nexport const AiSummaryCard = defineComponent<AiSummaryCardProps>({\n name: 'ce-ai-summary-card',\n template: `\n <article class=\"card card--highlight ai-summary\" role=\"article\">\n <header class=\"card__header\">\n <p class=\"ai-summary__eyebrow\">{{ props.eyebrow ?? 'AI summary' }}</p>\n <h3>{{ props.title }}</h3>\n <span class=\"badge\" data-tone=\"{{ props.sentiment ?? 'positive' }}\">\n {{ props.sentiment === 'critical' ? 'Critical' : props.sentiment === 'warning' ? 'Watch' : 'Positive' }}\n </span>\n </header>\n <div class=\"card__body\">\n <p>{{ props.summary }}</p>\n <ul class=\"ai-summary__highlights\" ce:if=\"props.highlights?.length\">\n <li ce:for=\"highlight in props.highlights\" track=\"highlight\">{{ highlight }}</li>\n </ul>\n </div>\n <footer class=\"card__footer ai-summary__footer\">\n <small ce:if=\"props.updatedAt\">Updated {{ props.updatedAt }}</small>\n <slot name=\"actions\"></slot>\n </footer>\n </article>\n `,\n styles: [SUMMARY_STYLES],\n});\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkW5M7JGC4_cjs = require('./chunk-W5M7JGC4.cjs');
|
|
4
4
|
|
|
5
5
|
// src/runtime/components/ai-summary-card.ts
|
|
6
6
|
var SUMMARY_STYLES = `
|
|
@@ -40,7 +40,7 @@ var SUMMARY_STYLES = `
|
|
|
40
40
|
background: var(--ce-success, #10b981);
|
|
41
41
|
}
|
|
42
42
|
`;
|
|
43
|
-
var AiSummaryCard =
|
|
43
|
+
var AiSummaryCard = chunkW5M7JGC4_cjs.defineComponent({
|
|
44
44
|
name: "ce-ai-summary-card",
|
|
45
45
|
template: `
|
|
46
46
|
<article class="card card--highlight ai-summary" role="article">
|
|
@@ -67,5 +67,5 @@ var AiSummaryCard = chunkW3LNNY3U_cjs.defineComponent({
|
|
|
67
67
|
});
|
|
68
68
|
|
|
69
69
|
exports.AiSummaryCard = AiSummaryCard;
|
|
70
|
-
//# sourceMappingURL=chunk-
|
|
71
|
-
//# sourceMappingURL=chunk-
|
|
70
|
+
//# sourceMappingURL=chunk-FLUSP6VF.cjs.map
|
|
71
|
+
//# sourceMappingURL=chunk-FLUSP6VF.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/components/ai-summary-card.ts"],"names":["defineComponent"],"mappings":";;;;;AAWA,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAsChB,IAAM,gBAAgBA,iCAAA,CAAoC;AAAA,EAC/D,IAAA,EAAM,oBAAA;AAAA,EACN,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAqBV,MAAA,EAAQ,CAAC,cAAc;AACzB,CAAC","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/runtime/components/ai-summary-card.ts"],"names":["defineComponent"],"mappings":";;;;;AAWA,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAsChB,IAAM,gBAAgBA,iCAAA,CAAoC;AAAA,EAC/D,IAAA,EAAM,oBAAA;AAAA,EACN,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAqBV,MAAA,EAAQ,CAAC,cAAc;AACzB,CAAC","file":"chunk-FLUSP6VF.cjs","sourcesContent":["import { defineComponent } from '../component.js';\n\nexport interface AiSummaryCardProps extends Record<string, unknown> {\n eyebrow?: string;\n title: string;\n summary: string;\n highlights?: string[];\n sentiment?: 'positive' | 'warning' | 'critical';\n updatedAt?: string;\n}\n\nconst SUMMARY_STYLES = `\n .ai-summary {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n .ai-summary__eyebrow {\n text-transform: uppercase;\n font-size: 0.75rem;\n letter-spacing: 0.08em;\n color: var(--ce-text-subtle, #64748b);\n }\n .ai-summary__highlights {\n list-style: disc;\n padding-left: 1.5rem;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n .ai-summary__footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 0.8rem;\n color: var(--ce-text-subtle, #94a3b8);\n }\n .ai-summary .badge[data-tone='critical'] {\n background: var(--ce-danger, #dc2626);\n }\n .ai-summary .badge[data-tone='warning'] {\n background: var(--ce-warning, #f97316);\n }\n .ai-summary .badge[data-tone='positive'] {\n background: var(--ce-success, #10b981);\n }\n`;\n\nexport const AiSummaryCard = defineComponent<AiSummaryCardProps>({\n name: 'ce-ai-summary-card',\n template: `\n <article class=\"card card--highlight ai-summary\" role=\"article\">\n <header class=\"card__header\">\n <p class=\"ai-summary__eyebrow\">{{ props.eyebrow ?? 'AI summary' }}</p>\n <h3>{{ props.title }}</h3>\n <span class=\"badge\" data-tone=\"{{ props.sentiment ?? 'positive' }}\">\n {{ props.sentiment === 'critical' ? 'Critical' : props.sentiment === 'warning' ? 'Watch' : 'Positive' }}\n </span>\n </header>\n <div class=\"card__body\">\n <p>{{ props.summary }}</p>\n <ul class=\"ai-summary__highlights\" ce:if=\"props.highlights?.length\">\n <li ce:for=\"highlight in props.highlights\" track=\"highlight\">{{ highlight }}</li>\n </ul>\n </div>\n <footer class=\"card__footer ai-summary__footer\">\n <small ce:if=\"props.updatedAt\">Updated {{ props.updatedAt }}</small>\n <slot name=\"actions\"></slot>\n </footer>\n </article>\n `,\n styles: [SUMMARY_STYLES],\n});\n"]}
|
|
@@ -230,7 +230,9 @@ function withThemeTransitionGuard(action) {
|
|
|
230
230
|
});
|
|
231
231
|
}
|
|
232
232
|
function notifyThemeUpdate(state) {
|
|
233
|
-
themeListeners.forEach((listener) =>
|
|
233
|
+
themeListeners.forEach((listener) => {
|
|
234
|
+
listener(state);
|
|
235
|
+
});
|
|
234
236
|
}
|
|
235
237
|
function applyDensity(mode) {
|
|
236
238
|
if (mode === "default") {
|
|
@@ -259,7 +261,9 @@ function applyRadius(mode) {
|
|
|
259
261
|
"--radius-pill",
|
|
260
262
|
"--radius-full"
|
|
261
263
|
];
|
|
262
|
-
keys.forEach((key) =>
|
|
264
|
+
keys.forEach((key) => {
|
|
265
|
+
document.documentElement.style.setProperty(key, value);
|
|
266
|
+
});
|
|
263
267
|
}
|
|
264
268
|
function applyRadiusAliases() {
|
|
265
269
|
Object.entries(radiusAliases).forEach(([key, value]) => {
|
|
@@ -290,7 +294,7 @@ function resolveRadius(mode) {
|
|
|
290
294
|
function applyFontScale(scale) {
|
|
291
295
|
const resolved = resolveFontScale(scale);
|
|
292
296
|
document.documentElement.style.setProperty("--ce-font-scale", String(resolved));
|
|
293
|
-
document.documentElement.style.fontSize = `${Math.round(resolved * 100)}%`;
|
|
297
|
+
document.documentElement.style.fontSize = `${String(Math.round(resolved * 100))}%`;
|
|
294
298
|
}
|
|
295
299
|
function resolveFontScale(scale) {
|
|
296
300
|
if (typeof scale === "number" && Number.isFinite(scale)) return scale;
|
|
@@ -301,5 +305,5 @@ function resolveFontScale(scale) {
|
|
|
301
305
|
}
|
|
302
306
|
|
|
303
307
|
export { applyTheme, applyThemeState, getInitialTheme, getStoredThemeState, hydrateThemeState, onThemeUpdate, registerThemeAwareComponent, setDensity, setFontScale, setRadius, setTheme, withThemeTransitionGuard };
|
|
304
|
-
//# sourceMappingURL=chunk-
|
|
305
|
-
//# sourceMappingURL=chunk-
|
|
308
|
+
//# sourceMappingURL=chunk-LSWEXTKL.js.map
|
|
309
|
+
//# sourceMappingURL=chunk-LSWEXTKL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/theme.ts"],"names":[],"mappings":"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","file":"chunk-LSWEXTKL.js","sourcesContent":["const themePresets: Record<string, Record<string, string>> = {\n dark: {\n \"--ce-color-background\": \"#0f172a\",\n \"--ce-color-surface\": \"#111827\",\n \"--ce-color-text\": \"#e2e8f0\",\n \"--ce-color-text-muted\": \"#94a3b8\",\n \"--ce-color-primary\": \"#7c3aed\",\n \"--ce-color-accent\": \"#7c3aed\",\n \"--ce-color-border\": \"rgba(255, 255, 255, 0.12)\",\n \"--ce-color-focus-ring\": \"#7c3aed\",\n \"--ce-font-family\": \"Inter, system-ui, sans-serif\",\n \"--app-bg\": \"radial-gradient(circle at 20% 20%, rgba(99, 102, 241, 0.18), transparent 32%), radial-gradient(circle at 80% 0%, rgba(45, 212, 191, 0.16), transparent 28%), linear-gradient(135deg, #0f172a, #0b1021 60%, #0b1021)\",\n \"--panel-bg\": \"rgba(255, 255, 255, 0.04)\",\n \"--panel-bg-hover\": \"rgba(255, 255, 255, 0.08)\",\n \"--panel-bg-active\": \"rgba(255, 255, 255, 0.12)\",\n \"--panel-border\": \"rgba(255, 255, 255, 0.08)\",\n \"--text-primary\": \"#e2e8f0\",\n \"--text-secondary\": \"#94a3b8\",\n \"--text-tertiary\": \"#64748b\",\n \"--text-inverse\": \"#0f172a\",\n \"--accent\": \"#7c3aed\",\n \"--accent-hover\": \"#8b5cf6\",\n \"--accent-light\": \"rgba(124, 58, 237, 0.16)\",\n \"--accent-border\": \"rgba(124, 58, 237, 0.6)\",\n \"--accent-2\": \"#22d3ee\",\n \"--accent-2-light\": \"rgba(34, 211, 238, 0.16)\",\n \"--surface-overlay\": \"rgba(255, 255, 255, 0.02)\",\n \"--surface-overlay-hover\": \"rgba(255, 255, 255, 0.05)\",\n \"--shadow-sm\": \"0 4px 12px rgba(0, 0, 0, 0.3)\",\n \"--shadow-md\": \"0 6px 18px rgba(0, 0, 0, 0.35)\",\n \"--shadow-lg\": \"0 20px 60px rgba(0, 0, 0, 0.4)\",\n \"--icon-color\": \"#e2e8f0\",\n \"--ce-accent\": \"#7c3aed\",\n \"--ce-accent-2\": \"#22d3ee\",\n \"--ce-surface\": \"#0f172a\",\n \"--ce-surface-2\": \"#111827\",\n \"--ce-text\": \"#e2e8f0\",\n \"--ce-border\": \"rgba(255, 255, 255, 0.12)\",\n colorScheme: \"dark\",\n },\n light: {\n \"--ce-color-background\": \"#f8fafc\",\n \"--ce-color-surface\": \"#ffffff\",\n \"--ce-color-text\": \"#0f172a\",\n \"--ce-color-text-muted\": \"#475569\",\n \"--ce-color-primary\": \"#4f46e5\",\n \"--ce-color-accent\": \"#4f46e5\",\n \"--ce-color-border\": \"rgba(15, 23, 42, 0.12)\",\n \"--ce-color-focus-ring\": \"#4f46e5\",\n \"--ce-font-family\": \"Inter, system-ui, sans-serif\",\n \"--app-bg\": \"linear-gradient(180deg, #f8fafc 0%, #eef2ff 40%, #f8fafc 100%)\",\n \"--panel-bg\": \"rgba(255, 255, 255, 0.9)\",\n \"--panel-bg-hover\": \"rgba(255, 255, 255, 0.95)\",\n \"--panel-bg-active\": \"rgba(255, 255, 255, 1)\",\n \"--panel-border\": \"rgba(15, 23, 42, 0.08)\",\n \"--text-primary\": \"#0f172a\",\n \"--text-secondary\": \"#475569\",\n \"--text-tertiary\": \"#64748b\",\n \"--text-inverse\": \"#ffffff\",\n \"--accent\": \"#4f46e5\",\n \"--accent-hover\": \"#6366f1\",\n \"--accent-light\": \"rgba(79, 70, 229, 0.12)\",\n \"--accent-border\": \"rgba(79, 70, 229, 0.4)\",\n \"--accent-2\": \"#06b6d4\",\n \"--accent-2-light\": \"rgba(6, 182, 212, 0.12)\",\n \"--surface-overlay\": \"rgba(15, 23, 42, 0.02)\",\n \"--surface-overlay-hover\": \"rgba(15, 23, 42, 0.05)\",\n \"--shadow-sm\": \"0 4px 12px rgba(0, 0, 0, 0.1)\",\n \"--shadow-md\": \"0 6px 18px rgba(0, 0, 0, 0.12)\",\n \"--shadow-lg\": \"0 20px 60px rgba(0, 0, 0, 0.15)\",\n \"--icon-color\": \"#0f172a\",\n \"--ce-accent\": \"#4f46e5\",\n \"--ce-accent-2\": \"#06b6d4\",\n \"--ce-surface\": \"#ffffff\",\n \"--ce-surface-2\": \"#f8fafc\",\n \"--ce-text\": \"#0f172a\",\n \"--ce-border\": \"rgba(15, 23, 42, 0.12)\",\n colorScheme: \"light\",\n },\n};\n\nconst tokenFallbacks: Record<string, string> = {\n \"--text-primary\": \"var(--ce-color-text)\",\n \"--text-secondary\": \"var(--ce-color-text-muted)\",\n \"--text-muted\": \"var(--ce-color-text-muted)\",\n \"--text-inverse\": \"var(--ce-color-background)\",\n \"--theme-bg\": \"var(--ce-color-background)\",\n \"--theme-surface\": \"var(--ce-color-surface)\",\n \"--theme-fg\": \"var(--ce-color-text)\",\n \"--theme-muted\": \"var(--ce-color-text-muted)\",\n \"--theme-primary\": \"var(--ce-color-primary)\",\n \"--theme-accent\": \"var(--ce-color-accent)\",\n \"--ce-text\": \"var(--ce-color-text)\",\n \"--ce-border\": \"var(--ce-color-border)\",\n \"--ce-surface\": \"var(--ce-color-surface)\",\n \"--ce-surface-2\": \"var(--ce-color-surface)\",\n};\n\nfunction applyTokenFallbacks(preset: Record<string, string>): void {\n Object.entries(tokenFallbacks).forEach(([token, fallback]) => {\n if (token in preset) return;\n document.documentElement.style.setProperty(token, fallback);\n });\n}\n\nexport type ThemeMode = \"light\" | \"dark\";\nexport type DensityMode = \"default\" | \"compact\" | \"comfortable\";\nexport type RadiusMode = \"default\" | \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"pill\" | \"circle\";\nexport type FontScale = \"sm\" | \"md\" | \"lg\" | \"xl\" | number;\n\nexport interface ThemeState {\n theme: ThemeMode;\n density: DensityMode;\n radius: RadiusMode;\n fontScale: FontScale;\n}\n\nconst STORAGE_KEYS = {\n theme: \"app-theme\",\n density: \"app-density\",\n radius: \"app-radius\",\n fontScale: \"app-font-scale\",\n} as const;\n\nconst FONT_SCALE_PRESETS: Record<Exclude<FontScale, number>, number> = {\n sm: 0.92,\n md: 1,\n lg: 1.08,\n xl: 1.16,\n};\n\nconst themeListeners = new Set<(state: ThemeState) => void>();\n\nconst radiusAliases: Record<string, string> = {\n \"--radius-none\": \"var(--ce-radius-none)\",\n \"--radius-xs\": \"var(--ce-radius-xs)\",\n \"--radius-sm\": \"var(--ce-radius-sm)\",\n \"--radius-md\": \"var(--ce-radius-md)\",\n \"--radius-lg\": \"var(--ce-radius-lg)\",\n \"--radius-xl\": \"var(--ce-radius-xl)\",\n \"--radius-pill\": \"var(--ce-radius-pill)\",\n \"--radius-full\": \"var(--ce-radius-circle)\",\n};\n\nfunction getStorage(): Storage | null {\n if (typeof localStorage === \"undefined\") {\n return null;\n }\n return localStorage;\n}\n\nexport function applyTheme(mode: ThemeMode): void {\n const preset = themePresets[mode];\n Object.entries(preset).forEach(([k, v]) => {\n if (k === \"colorScheme\") return;\n document.documentElement.style.setProperty(k, v);\n });\n applyTokenFallbacks(preset);\n applyRadiusAliases();\n document.documentElement.dataset.theme = mode;\n document.documentElement.dataset.ceTheme = mode;\n document.documentElement.classList.remove(\"theme-light\", \"theme-dark\");\n document.documentElement.classList.add(`theme-${mode}`);\n document.documentElement.style.colorScheme = preset.colorScheme;\n}\n\nexport function getInitialTheme(): ThemeMode {\n const storage = getStorage();\n const stored = storage?.getItem(STORAGE_KEYS.theme) as ThemeMode | null;\n if (stored === \"light\" || stored === \"dark\") return stored;\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return \"light\";\n }\n return window.matchMedia(\"(prefers-color-scheme: light)\").matches ? \"light\" : \"dark\";\n}\n\nexport function onThemeUpdate(listener: (state: ThemeState) => void): () => void {\n themeListeners.add(listener);\n return () => themeListeners.delete(listener);\n}\n\nexport function registerThemeAwareComponent(handler: (state: ThemeState) => void): () => void {\n handler(getStoredThemeState());\n return onThemeUpdate(handler);\n}\n\nexport function getStoredThemeState(): ThemeState {\n const storage = getStorage();\n const storedTheme = storage?.getItem(STORAGE_KEYS.theme) as ThemeMode | null;\n const theme = storedTheme === \"light\" || storedTheme === \"dark\" ? storedTheme : getInitialTheme();\n const density = (storage?.getItem(STORAGE_KEYS.density) as DensityMode | null) ?? \"default\";\n const radius = (storage?.getItem(STORAGE_KEYS.radius) as RadiusMode | null) ?? \"default\";\n const fontScaleRaw = storage?.getItem(STORAGE_KEYS.fontScale) ?? null;\n const fontScale = fontScaleRaw ? Number(fontScaleRaw) : \"md\";\n return { theme, density, radius, fontScale };\n}\n\nexport function hydrateThemeState(overrides: Partial<ThemeState> = {}): ThemeState {\n const state = { ...getStoredThemeState(), ...overrides };\n applyThemeState(state, { persist: false, guard: false });\n return state;\n}\n\nexport function setTheme(mode: ThemeMode): void {\n applyThemeState({ ...getStoredThemeState(), theme: mode });\n}\n\nexport function setDensity(mode: DensityMode): void {\n applyThemeState({ ...getStoredThemeState(), density: mode });\n}\n\nexport function setRadius(mode: RadiusMode): void {\n applyThemeState({ ...getStoredThemeState(), radius: mode });\n}\n\nexport function setFontScale(scale: FontScale): void {\n applyThemeState({ ...getStoredThemeState(), fontScale: scale });\n}\n\nexport function applyThemeState(state: ThemeState, options: { persist?: boolean; guard?: boolean } = {}): void {\n const { persist = true, guard = true } = options;\n const storage = getStorage();\n const apply = () => {\n applyTheme(state.theme);\n applyDensity(state.density);\n applyRadius(state.radius);\n applyFontScale(state.fontScale);\n };\n\n if (guard) {\n withThemeTransitionGuard(apply);\n } else {\n apply();\n }\n\n if (persist && storage) {\n storage.setItem(STORAGE_KEYS.theme, state.theme);\n storage.setItem(STORAGE_KEYS.density, state.density);\n storage.setItem(STORAGE_KEYS.radius, state.radius);\n storage.setItem(STORAGE_KEYS.fontScale, String(resolveFontScale(state.fontScale)));\n }\n\n document.documentElement.dataset.ceDensity = state.density;\n document.documentElement.dataset.ceRadius = state.radius;\n document.documentElement.dataset.ceFontScale = String(resolveFontScale(state.fontScale));\n notifyThemeUpdate(state);\n}\n\nexport function withThemeTransitionGuard(action: () => void): void {\n if (typeof document === \"undefined\") {\n action();\n return;\n }\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-ce-theme-guard\", \"true\");\n style.textContent = \"*{transition:none !important;animation:none !important;}\";\n document.head.appendChild(style);\n action();\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n style.remove();\n });\n });\n}\n\nfunction notifyThemeUpdate(state: ThemeState): void {\n themeListeners.forEach((listener) => { listener(state); });\n}\n\nfunction applyDensity(mode: DensityMode): void {\n if (mode === \"default\") {\n document.documentElement.style.removeProperty(\"--ce-density-compact\");\n document.documentElement.style.removeProperty(\"--ce-density-comfortable\");\n return;\n }\n\n const compact = mode === \"compact\" ? 0.85 : 1;\n const comfortable = mode === \"comfortable\" ? 1 : 0.85;\n document.documentElement.style.setProperty(\"--ce-density-compact\", String(compact));\n document.documentElement.style.setProperty(\"--ce-density-comfortable\", String(comfortable));\n}\n\nfunction applyRadius(mode: RadiusMode): void {\n if (mode === \"default\") {\n applyRadiusAliases();\n return;\n }\n\n const value = resolveRadius(mode);\n const keys = [\n \"--radius-none\",\n \"--radius-xs\",\n \"--radius-sm\",\n \"--radius-md\",\n \"--radius-lg\",\n \"--radius-xl\",\n \"--radius-pill\",\n \"--radius-full\",\n ];\n keys.forEach((key) => { document.documentElement.style.setProperty(key, value); });\n}\n\nfunction applyRadiusAliases(): void {\n Object.entries(radiusAliases).forEach(([key, value]) => {\n document.documentElement.style.setProperty(key, value);\n });\n}\n\nfunction resolveRadius(mode: RadiusMode): string {\n switch (mode) {\n case \"none\":\n return \"0\";\n case \"sm\":\n return \"var(--ce-radius-sm)\";\n case \"md\":\n return \"var(--ce-radius-md)\";\n case \"lg\":\n return \"var(--ce-radius-lg)\";\n case \"xl\":\n return \"var(--ce-radius-xl)\";\n case \"pill\":\n return \"var(--ce-radius-pill)\";\n case \"circle\":\n return \"var(--ce-radius-circle)\";\n case \"default\":\n default:\n return \"var(--ce-radius-md)\";\n }\n}\n\nfunction applyFontScale(scale: FontScale): void {\n const resolved = resolveFontScale(scale);\n document.documentElement.style.setProperty(\"--ce-font-scale\", String(resolved));\n document.documentElement.style.fontSize = `${String(Math.round(resolved * 100))}%`;\n}\n\nfunction resolveFontScale(scale: FontScale): number {\n if (typeof scale === \"number\" && Number.isFinite(scale)) return scale;\n if (typeof scale === \"string\" && scale in FONT_SCALE_PRESETS) {\n return FONT_SCALE_PRESETS[scale];\n }\n return 1;\n}\n"]}
|
|
@@ -232,7 +232,9 @@ function withThemeTransitionGuard(action) {
|
|
|
232
232
|
});
|
|
233
233
|
}
|
|
234
234
|
function notifyThemeUpdate(state) {
|
|
235
|
-
themeListeners.forEach((listener) =>
|
|
235
|
+
themeListeners.forEach((listener) => {
|
|
236
|
+
listener(state);
|
|
237
|
+
});
|
|
236
238
|
}
|
|
237
239
|
function applyDensity(mode) {
|
|
238
240
|
if (mode === "default") {
|
|
@@ -261,7 +263,9 @@ function applyRadius(mode) {
|
|
|
261
263
|
"--radius-pill",
|
|
262
264
|
"--radius-full"
|
|
263
265
|
];
|
|
264
|
-
keys.forEach((key) =>
|
|
266
|
+
keys.forEach((key) => {
|
|
267
|
+
document.documentElement.style.setProperty(key, value);
|
|
268
|
+
});
|
|
265
269
|
}
|
|
266
270
|
function applyRadiusAliases() {
|
|
267
271
|
Object.entries(radiusAliases).forEach(([key, value]) => {
|
|
@@ -292,7 +296,7 @@ function resolveRadius(mode) {
|
|
|
292
296
|
function applyFontScale(scale) {
|
|
293
297
|
const resolved = resolveFontScale(scale);
|
|
294
298
|
document.documentElement.style.setProperty("--ce-font-scale", String(resolved));
|
|
295
|
-
document.documentElement.style.fontSize = `${Math.round(resolved * 100)}%`;
|
|
299
|
+
document.documentElement.style.fontSize = `${String(Math.round(resolved * 100))}%`;
|
|
296
300
|
}
|
|
297
301
|
function resolveFontScale(scale) {
|
|
298
302
|
if (typeof scale === "number" && Number.isFinite(scale)) return scale;
|
|
@@ -314,5 +318,5 @@ exports.setFontScale = setFontScale;
|
|
|
314
318
|
exports.setRadius = setRadius;
|
|
315
319
|
exports.setTheme = setTheme;
|
|
316
320
|
exports.withThemeTransitionGuard = withThemeTransitionGuard;
|
|
317
|
-
//# sourceMappingURL=chunk-
|
|
318
|
-
//# sourceMappingURL=chunk-
|
|
321
|
+
//# sourceMappingURL=chunk-NCXUQXAN.cjs.map
|
|
322
|
+
//# sourceMappingURL=chunk-NCXUQXAN.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/theme.ts"],"names":[],"mappings":"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","file":"chunk-NCXUQXAN.cjs","sourcesContent":["const themePresets: Record<string, Record<string, string>> = {\n dark: {\n \"--ce-color-background\": \"#0f172a\",\n \"--ce-color-surface\": \"#111827\",\n \"--ce-color-text\": \"#e2e8f0\",\n \"--ce-color-text-muted\": \"#94a3b8\",\n \"--ce-color-primary\": \"#7c3aed\",\n \"--ce-color-accent\": \"#7c3aed\",\n \"--ce-color-border\": \"rgba(255, 255, 255, 0.12)\",\n \"--ce-color-focus-ring\": \"#7c3aed\",\n \"--ce-font-family\": \"Inter, system-ui, sans-serif\",\n \"--app-bg\": \"radial-gradient(circle at 20% 20%, rgba(99, 102, 241, 0.18), transparent 32%), radial-gradient(circle at 80% 0%, rgba(45, 212, 191, 0.16), transparent 28%), linear-gradient(135deg, #0f172a, #0b1021 60%, #0b1021)\",\n \"--panel-bg\": \"rgba(255, 255, 255, 0.04)\",\n \"--panel-bg-hover\": \"rgba(255, 255, 255, 0.08)\",\n \"--panel-bg-active\": \"rgba(255, 255, 255, 0.12)\",\n \"--panel-border\": \"rgba(255, 255, 255, 0.08)\",\n \"--text-primary\": \"#e2e8f0\",\n \"--text-secondary\": \"#94a3b8\",\n \"--text-tertiary\": \"#64748b\",\n \"--text-inverse\": \"#0f172a\",\n \"--accent\": \"#7c3aed\",\n \"--accent-hover\": \"#8b5cf6\",\n \"--accent-light\": \"rgba(124, 58, 237, 0.16)\",\n \"--accent-border\": \"rgba(124, 58, 237, 0.6)\",\n \"--accent-2\": \"#22d3ee\",\n \"--accent-2-light\": \"rgba(34, 211, 238, 0.16)\",\n \"--surface-overlay\": \"rgba(255, 255, 255, 0.02)\",\n \"--surface-overlay-hover\": \"rgba(255, 255, 255, 0.05)\",\n \"--shadow-sm\": \"0 4px 12px rgba(0, 0, 0, 0.3)\",\n \"--shadow-md\": \"0 6px 18px rgba(0, 0, 0, 0.35)\",\n \"--shadow-lg\": \"0 20px 60px rgba(0, 0, 0, 0.4)\",\n \"--icon-color\": \"#e2e8f0\",\n \"--ce-accent\": \"#7c3aed\",\n \"--ce-accent-2\": \"#22d3ee\",\n \"--ce-surface\": \"#0f172a\",\n \"--ce-surface-2\": \"#111827\",\n \"--ce-text\": \"#e2e8f0\",\n \"--ce-border\": \"rgba(255, 255, 255, 0.12)\",\n colorScheme: \"dark\",\n },\n light: {\n \"--ce-color-background\": \"#f8fafc\",\n \"--ce-color-surface\": \"#ffffff\",\n \"--ce-color-text\": \"#0f172a\",\n \"--ce-color-text-muted\": \"#475569\",\n \"--ce-color-primary\": \"#4f46e5\",\n \"--ce-color-accent\": \"#4f46e5\",\n \"--ce-color-border\": \"rgba(15, 23, 42, 0.12)\",\n \"--ce-color-focus-ring\": \"#4f46e5\",\n \"--ce-font-family\": \"Inter, system-ui, sans-serif\",\n \"--app-bg\": \"linear-gradient(180deg, #f8fafc 0%, #eef2ff 40%, #f8fafc 100%)\",\n \"--panel-bg\": \"rgba(255, 255, 255, 0.9)\",\n \"--panel-bg-hover\": \"rgba(255, 255, 255, 0.95)\",\n \"--panel-bg-active\": \"rgba(255, 255, 255, 1)\",\n \"--panel-border\": \"rgba(15, 23, 42, 0.08)\",\n \"--text-primary\": \"#0f172a\",\n \"--text-secondary\": \"#475569\",\n \"--text-tertiary\": \"#64748b\",\n \"--text-inverse\": \"#ffffff\",\n \"--accent\": \"#4f46e5\",\n \"--accent-hover\": \"#6366f1\",\n \"--accent-light\": \"rgba(79, 70, 229, 0.12)\",\n \"--accent-border\": \"rgba(79, 70, 229, 0.4)\",\n \"--accent-2\": \"#06b6d4\",\n \"--accent-2-light\": \"rgba(6, 182, 212, 0.12)\",\n \"--surface-overlay\": \"rgba(15, 23, 42, 0.02)\",\n \"--surface-overlay-hover\": \"rgba(15, 23, 42, 0.05)\",\n \"--shadow-sm\": \"0 4px 12px rgba(0, 0, 0, 0.1)\",\n \"--shadow-md\": \"0 6px 18px rgba(0, 0, 0, 0.12)\",\n \"--shadow-lg\": \"0 20px 60px rgba(0, 0, 0, 0.15)\",\n \"--icon-color\": \"#0f172a\",\n \"--ce-accent\": \"#4f46e5\",\n \"--ce-accent-2\": \"#06b6d4\",\n \"--ce-surface\": \"#ffffff\",\n \"--ce-surface-2\": \"#f8fafc\",\n \"--ce-text\": \"#0f172a\",\n \"--ce-border\": \"rgba(15, 23, 42, 0.12)\",\n colorScheme: \"light\",\n },\n};\n\nconst tokenFallbacks: Record<string, string> = {\n \"--text-primary\": \"var(--ce-color-text)\",\n \"--text-secondary\": \"var(--ce-color-text-muted)\",\n \"--text-muted\": \"var(--ce-color-text-muted)\",\n \"--text-inverse\": \"var(--ce-color-background)\",\n \"--theme-bg\": \"var(--ce-color-background)\",\n \"--theme-surface\": \"var(--ce-color-surface)\",\n \"--theme-fg\": \"var(--ce-color-text)\",\n \"--theme-muted\": \"var(--ce-color-text-muted)\",\n \"--theme-primary\": \"var(--ce-color-primary)\",\n \"--theme-accent\": \"var(--ce-color-accent)\",\n \"--ce-text\": \"var(--ce-color-text)\",\n \"--ce-border\": \"var(--ce-color-border)\",\n \"--ce-surface\": \"var(--ce-color-surface)\",\n \"--ce-surface-2\": \"var(--ce-color-surface)\",\n};\n\nfunction applyTokenFallbacks(preset: Record<string, string>): void {\n Object.entries(tokenFallbacks).forEach(([token, fallback]) => {\n if (token in preset) return;\n document.documentElement.style.setProperty(token, fallback);\n });\n}\n\nexport type ThemeMode = \"light\" | \"dark\";\nexport type DensityMode = \"default\" | \"compact\" | \"comfortable\";\nexport type RadiusMode = \"default\" | \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"pill\" | \"circle\";\nexport type FontScale = \"sm\" | \"md\" | \"lg\" | \"xl\" | number;\n\nexport interface ThemeState {\n theme: ThemeMode;\n density: DensityMode;\n radius: RadiusMode;\n fontScale: FontScale;\n}\n\nconst STORAGE_KEYS = {\n theme: \"app-theme\",\n density: \"app-density\",\n radius: \"app-radius\",\n fontScale: \"app-font-scale\",\n} as const;\n\nconst FONT_SCALE_PRESETS: Record<Exclude<FontScale, number>, number> = {\n sm: 0.92,\n md: 1,\n lg: 1.08,\n xl: 1.16,\n};\n\nconst themeListeners = new Set<(state: ThemeState) => void>();\n\nconst radiusAliases: Record<string, string> = {\n \"--radius-none\": \"var(--ce-radius-none)\",\n \"--radius-xs\": \"var(--ce-radius-xs)\",\n \"--radius-sm\": \"var(--ce-radius-sm)\",\n \"--radius-md\": \"var(--ce-radius-md)\",\n \"--radius-lg\": \"var(--ce-radius-lg)\",\n \"--radius-xl\": \"var(--ce-radius-xl)\",\n \"--radius-pill\": \"var(--ce-radius-pill)\",\n \"--radius-full\": \"var(--ce-radius-circle)\",\n};\n\nfunction getStorage(): Storage | null {\n if (typeof localStorage === \"undefined\") {\n return null;\n }\n return localStorage;\n}\n\nexport function applyTheme(mode: ThemeMode): void {\n const preset = themePresets[mode];\n Object.entries(preset).forEach(([k, v]) => {\n if (k === \"colorScheme\") return;\n document.documentElement.style.setProperty(k, v);\n });\n applyTokenFallbacks(preset);\n applyRadiusAliases();\n document.documentElement.dataset.theme = mode;\n document.documentElement.dataset.ceTheme = mode;\n document.documentElement.classList.remove(\"theme-light\", \"theme-dark\");\n document.documentElement.classList.add(`theme-${mode}`);\n document.documentElement.style.colorScheme = preset.colorScheme;\n}\n\nexport function getInitialTheme(): ThemeMode {\n const storage = getStorage();\n const stored = storage?.getItem(STORAGE_KEYS.theme) as ThemeMode | null;\n if (stored === \"light\" || stored === \"dark\") return stored;\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return \"light\";\n }\n return window.matchMedia(\"(prefers-color-scheme: light)\").matches ? \"light\" : \"dark\";\n}\n\nexport function onThemeUpdate(listener: (state: ThemeState) => void): () => void {\n themeListeners.add(listener);\n return () => themeListeners.delete(listener);\n}\n\nexport function registerThemeAwareComponent(handler: (state: ThemeState) => void): () => void {\n handler(getStoredThemeState());\n return onThemeUpdate(handler);\n}\n\nexport function getStoredThemeState(): ThemeState {\n const storage = getStorage();\n const storedTheme = storage?.getItem(STORAGE_KEYS.theme) as ThemeMode | null;\n const theme = storedTheme === \"light\" || storedTheme === \"dark\" ? storedTheme : getInitialTheme();\n const density = (storage?.getItem(STORAGE_KEYS.density) as DensityMode | null) ?? \"default\";\n const radius = (storage?.getItem(STORAGE_KEYS.radius) as RadiusMode | null) ?? \"default\";\n const fontScaleRaw = storage?.getItem(STORAGE_KEYS.fontScale) ?? null;\n const fontScale = fontScaleRaw ? Number(fontScaleRaw) : \"md\";\n return { theme, density, radius, fontScale };\n}\n\nexport function hydrateThemeState(overrides: Partial<ThemeState> = {}): ThemeState {\n const state = { ...getStoredThemeState(), ...overrides };\n applyThemeState(state, { persist: false, guard: false });\n return state;\n}\n\nexport function setTheme(mode: ThemeMode): void {\n applyThemeState({ ...getStoredThemeState(), theme: mode });\n}\n\nexport function setDensity(mode: DensityMode): void {\n applyThemeState({ ...getStoredThemeState(), density: mode });\n}\n\nexport function setRadius(mode: RadiusMode): void {\n applyThemeState({ ...getStoredThemeState(), radius: mode });\n}\n\nexport function setFontScale(scale: FontScale): void {\n applyThemeState({ ...getStoredThemeState(), fontScale: scale });\n}\n\nexport function applyThemeState(state: ThemeState, options: { persist?: boolean; guard?: boolean } = {}): void {\n const { persist = true, guard = true } = options;\n const storage = getStorage();\n const apply = () => {\n applyTheme(state.theme);\n applyDensity(state.density);\n applyRadius(state.radius);\n applyFontScale(state.fontScale);\n };\n\n if (guard) {\n withThemeTransitionGuard(apply);\n } else {\n apply();\n }\n\n if (persist && storage) {\n storage.setItem(STORAGE_KEYS.theme, state.theme);\n storage.setItem(STORAGE_KEYS.density, state.density);\n storage.setItem(STORAGE_KEYS.radius, state.radius);\n storage.setItem(STORAGE_KEYS.fontScale, String(resolveFontScale(state.fontScale)));\n }\n\n document.documentElement.dataset.ceDensity = state.density;\n document.documentElement.dataset.ceRadius = state.radius;\n document.documentElement.dataset.ceFontScale = String(resolveFontScale(state.fontScale));\n notifyThemeUpdate(state);\n}\n\nexport function withThemeTransitionGuard(action: () => void): void {\n if (typeof document === \"undefined\") {\n action();\n return;\n }\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-ce-theme-guard\", \"true\");\n style.textContent = \"*{transition:none !important;animation:none !important;}\";\n document.head.appendChild(style);\n action();\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n style.remove();\n });\n });\n}\n\nfunction notifyThemeUpdate(state: ThemeState): void {\n themeListeners.forEach((listener) => { listener(state); });\n}\n\nfunction applyDensity(mode: DensityMode): void {\n if (mode === \"default\") {\n document.documentElement.style.removeProperty(\"--ce-density-compact\");\n document.documentElement.style.removeProperty(\"--ce-density-comfortable\");\n return;\n }\n\n const compact = mode === \"compact\" ? 0.85 : 1;\n const comfortable = mode === \"comfortable\" ? 1 : 0.85;\n document.documentElement.style.setProperty(\"--ce-density-compact\", String(compact));\n document.documentElement.style.setProperty(\"--ce-density-comfortable\", String(comfortable));\n}\n\nfunction applyRadius(mode: RadiusMode): void {\n if (mode === \"default\") {\n applyRadiusAliases();\n return;\n }\n\n const value = resolveRadius(mode);\n const keys = [\n \"--radius-none\",\n \"--radius-xs\",\n \"--radius-sm\",\n \"--radius-md\",\n \"--radius-lg\",\n \"--radius-xl\",\n \"--radius-pill\",\n \"--radius-full\",\n ];\n keys.forEach((key) => { document.documentElement.style.setProperty(key, value); });\n}\n\nfunction applyRadiusAliases(): void {\n Object.entries(radiusAliases).forEach(([key, value]) => {\n document.documentElement.style.setProperty(key, value);\n });\n}\n\nfunction resolveRadius(mode: RadiusMode): string {\n switch (mode) {\n case \"none\":\n return \"0\";\n case \"sm\":\n return \"var(--ce-radius-sm)\";\n case \"md\":\n return \"var(--ce-radius-md)\";\n case \"lg\":\n return \"var(--ce-radius-lg)\";\n case \"xl\":\n return \"var(--ce-radius-xl)\";\n case \"pill\":\n return \"var(--ce-radius-pill)\";\n case \"circle\":\n return \"var(--ce-radius-circle)\";\n case \"default\":\n default:\n return \"var(--ce-radius-md)\";\n }\n}\n\nfunction applyFontScale(scale: FontScale): void {\n const resolved = resolveFontScale(scale);\n document.documentElement.style.setProperty(\"--ce-font-scale\", String(resolved));\n document.documentElement.style.fontSize = `${String(Math.round(resolved * 100))}%`;\n}\n\nfunction resolveFontScale(scale: FontScale): number {\n if (typeof scale === \"number\" && Number.isFinite(scale)) return scale;\n if (typeof scale === \"string\" && scale in FONT_SCALE_PRESETS) {\n return FONT_SCALE_PRESETS[scale];\n }\n return 1;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkW5M7JGC4_cjs = require('./chunk-W5M7JGC4.cjs');
|
|
4
4
|
var chunkVHUXNDW2_cjs = require('./chunk-VHUXNDW2.cjs');
|
|
5
5
|
|
|
6
6
|
// src/runtime/components/ai-assistant.ts
|
|
@@ -100,7 +100,7 @@ var PANEL_STYLES = `
|
|
|
100
100
|
font-size: 0.85rem;
|
|
101
101
|
}
|
|
102
102
|
`;
|
|
103
|
-
var AiAssistantPanel =
|
|
103
|
+
var AiAssistantPanel = chunkW5M7JGC4_cjs.defineComponent({
|
|
104
104
|
name: "ce-ai-assistant-panel",
|
|
105
105
|
template: `
|
|
106
106
|
<section class="card card--shadow ai-panel" role="region" aria-live="polite">
|
|
@@ -222,5 +222,5 @@ var AiAssistantPanel = chunkW3LNNY3U_cjs.defineComponent({
|
|
|
222
222
|
});
|
|
223
223
|
|
|
224
224
|
exports.AiAssistantPanel = AiAssistantPanel;
|
|
225
|
-
//# sourceMappingURL=chunk-
|
|
226
|
-
//# sourceMappingURL=chunk-
|
|
225
|
+
//# sourceMappingURL=chunk-SZL56BNL.cjs.map
|
|
226
|
+
//# sourceMappingURL=chunk-SZL56BNL.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/components/ai-assistant.ts"],"names":["defineComponent","signal"],"mappings":";;;;;;AAkBA,IAAM,YAAA,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAiGd,IAAM,mBAAmBA,iCAAA,CAAuC;AAAA,EACrE,IAAA,EAAM,uBAAA;AAAA,EACN,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EA4DV,MAAA,EAAQ,CAAC,YAAY,CAAA;AAAA,EACrB,KAAA,CAAM,EAAE,IAAA,EAAM,KAAA,EAAM,EAAG;AACrB,IAAA,MAAM,MAAA,GAASC,yBAAO,EAAE,CAAA;AACxB,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,CAAA;AAEzF,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAiB;AACpC,MAAA,MAAM,KAAA,GAAS,KAAA,CAAM,MAAA,EAAuC,KAAA,IAAS,EAAA;AACrE,MAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAiB;AAC/B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,MAAA,KAAW,YAAA,EAAc;AACnD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,MAAA,EAAO,CAAE,IAAA,EAAK;AAC5B,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,MAAA,EAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAC9B,MAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AACb,MAAA,IAAA,CAAK,OAAO,CAAA;AAAA,IACd,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,UAAA,KAAuB;AAC5C,MAAA,MAAA,CAAO,IAAI,UAAU,CAAA;AACrB,MAAA,IAAA,CAAK,SAAA,EAAW,EAAE,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,IACxC,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,KAAW,YAAA;AACtC,IAAA,MAAM,SAAA,GAAY,MAAO,MAAA,EAAO,GAAI,MAAM,SAAA,IAAa,gBAAA,GAAc,MAAM,SAAA,IAAa,MAAA;AAExF,IAAA,MAAM,eAAA,GAAkB,CAAC,OAAA,KAAuB,SAAA,CAAU,OAAO,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAC,CAAA;AAC5F,IAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAiB;AACnC,MAAA,QAAQ,IAAA;AAAM,QACZ,KAAK,WAAA;AACH,UAAA,OAAO,WAAA;AAAA,QACT,KAAK,QAAA;AACH,UAAA,OAAO,QAAA;AAAA,QACT,KAAK,MAAA;AACH,UAAA,OAAO,MAAA;AAAA,QACT;AACE,UAAA,OAAO,KAAA;AAAA;AACX,IACF,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAC","file":"chunk-6BYWFGQY.cjs","sourcesContent":["import { defineComponent } from '../component.js';\nimport { signal } from '../signals.js';\nimport type { AiMessage, AiRole, AiSessionStatus } from '../ai.js';\n\nexport interface AiAssistantPanelProps extends Record<string, unknown> {\n title?: string;\n description?: string;\n messages: AiMessage[];\n suggestions?: string[];\n status?: AiSessionStatus;\n error?: string | null;\n placeholder?: string;\n sendLabel?: string;\n resetLabel?: string;\n busyLabel?: string;\n disabled?: boolean;\n}\n\nconst PANEL_STYLES = `\n .ai-panel {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n }\n .ai-panel__body {\n max-height: 420px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n .ai-panel__messages {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n }\n .ai-panel__message {\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n .ai-panel__bubble {\n background: var(--ce-surface-muted, #f8fafc);\n border-radius: 1rem;\n padding: 0.75rem 1rem;\n border: 1px solid var(--ce-border, rgba(15, 23, 42, 0.08));\n }\n .ai-panel__message[data-role=\"assistant\"] .ai-panel__bubble {\n background: var(--ce-surface, #ffffff);\n border-color: rgba(56, 189, 248, 0.35);\n }\n .ai-panel__author {\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--ce-text-subtle, #475569);\n }\n .ai-panel__bubble p {\n margin: 0.25rem 0;\n white-space: pre-wrap;\n }\n .ai-panel__bubble small {\n color: var(--ce-text-subtle, #94a3b8);\n font-size: 0.7rem;\n }\n .ai-panel__empty {\n font-size: 0.9rem;\n color: var(--ce-text-subtle, #94a3b8);\n }\n .ai-panel__error {\n border-radius: 0.75rem;\n border: 1px solid rgba(248, 113, 113, 0.5);\n background: rgba(248, 113, 113, 0.08);\n padding: 0.75rem 1rem;\n color: var(--ce-danger, #b91c1c);\n }\n .ai-panel__form {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n .ai-panel__input {\n width: 100%;\n min-height: 120px;\n border-radius: 0.75rem;\n border: 1px solid var(--ce-border, rgba(15, 23, 42, 0.1));\n padding: 0.75rem 1rem;\n font: inherit;\n resize: vertical;\n background: var(--ce-surface, #ffffff);\n }\n .ai-panel__actions {\n display: flex;\n gap: 0.75rem;\n flex-wrap: wrap;\n }\n .ai-panel__suggestions {\n margin-top: 1rem;\n }\n .ai-panel__chip-row {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n .ai-panel__chip {\n border: 1px dashed var(--ce-border, rgba(15, 23, 42, 0.25));\n border-radius: 999px;\n padding: 0.35rem 0.85rem;\n font-size: 0.85rem;\n }\n`;\n\nexport const AiAssistantPanel = defineComponent<AiAssistantPanelProps>({\n name: 'ce-ai-assistant-panel',\n template: `\n <section class=\"card card--shadow ai-panel\" role=\"region\" aria-live=\"polite\">\n <header class=\"card__header\">\n <div>\n <p class=\"badge badge--primary\">AI Assistant</p>\n <h3>{{ props.title ?? 'Strategy copilot' }}</h3>\n <p>{{ props.description ?? 'Ask the model to summarize milestones, risks, and delivery plans.' }}</p>\n </div>\n <span class=\"badge badge--warning\" ce:if=\"isBusy()\">{{ props.busyLabel ?? 'Working' }}</span>\n </header>\n <div class=\"card__body ai-panel__body\">\n <ul class=\"ai-panel__messages\" aria-live=\"polite\">\n <li ce:for=\"message in props.messages\" track=\"message.id\" class=\"ai-panel__message\" data-role=\"{{ message.role }}\">\n <div class=\"ai-panel__bubble\">\n <span class=\"ai-panel__author\">{{ formatRole(message.role) }}</span>\n <p>{{ message.content }}</p>\n <small>{{ formatTimestamp(message) }}</small>\n </div>\n </li>\n <li ce:if=\"!props.messages.length\" class=\"ai-panel__empty\">No prompts yet — start with one of the suggestions below.</li>\n </ul>\n <div class=\"ai-panel__error\" ce:if=\"hasError()\">\n <p>{{ props.error ?? 'The assistant could not finish this request.' }}</p>\n </div>\n </div>\n <footer class=\"card__footer ai-panel__footer\">\n <form class=\"ai-panel__form\" on:submit=\"submit\" novalidate>\n <label class=\"ai-panel__label\" for=\"ce-ai-assistant-input\">Prompt</label>\n <textarea\n id=\"ce-ai-assistant-input\"\n class=\"ai-panel__input\"\n rows=\"3\"\n placeholder=\"{{ props.placeholder ?? 'Ask anything about your CE UI adoption plan…' }}\"\n value=\"{{ prompt() }}\"\n on:input=\"handleInput\"\n required\n aria-label=\"AI prompt input\"\n ></textarea>\n <div class=\"ai-panel__actions\">\n <button type=\"submit\" class=\"button button--primary\" disabled=\"{{ props.disabled || isBusy() ? 'true' : 'false' }}\">{{ sendLabel() }}</button>\n <button type=\"button\" class=\"button button--secondary\" on:click=\"reset\">{{ props.resetLabel ?? 'Reset' }}</button>\n </div>\n </form>\n <section class=\"ai-panel__suggestions\" ce:if=\"props.suggestions?.length\">\n <p>Suggestions</p>\n <div class=\"ai-panel__chip-row\">\n <button\n ce:for=\"suggestion in props.suggestions\"\n track=\"suggestion\"\n type=\"button\"\n class=\"button button--ghost ai-panel__chip\"\n on:click=\"useSuggestion(suggestion)\"\n >\n {{ suggestion }}\n </button>\n </div>\n </section>\n </footer>\n </section>\n `,\n styles: [PANEL_STYLES],\n setup({ emit, props }) {\n const prompt = signal('');\n const formatter = new Intl.DateTimeFormat('en-US', { hour: '2-digit', minute: '2-digit' });\n\n const handleInput = (event: Event) => {\n const value = (event.target as HTMLTextAreaElement | null)?.value ?? '';\n prompt.set(value);\n };\n\n const submit = (event: Event) => {\n event.preventDefault();\n if (props.disabled || props.status === 'processing') {\n return;\n }\n const value = prompt().trim();\n if (!value) {\n return;\n }\n emit('send', { prompt: value });\n prompt.set('');\n };\n\n const reset = () => {\n prompt.set('');\n emit('reset');\n };\n\n const useSuggestion = (suggestion: string) => {\n prompt.set(suggestion);\n emit('prefill', { prompt: suggestion });\n };\n\n const hasError = () => Boolean(props.error);\n const isBusy = () => props.status === 'processing';\n const sendLabel = () => (isBusy() ? props.busyLabel ?? 'Thinking…' : props.sendLabel ?? 'Send');\n\n const formatTimestamp = (message: AiMessage) => formatter.format(new Date(message.createdAt));\n const formatRole = (role: AiRole) => {\n switch (role) {\n case 'assistant':\n return 'Assistant';\n case 'system':\n return 'System';\n case 'tool':\n return 'Tool';\n default:\n return 'You';\n }\n };\n\n return {\n prompt,\n handleInput,\n submit,\n reset,\n useSuggestion,\n hasError,\n isBusy,\n sendLabel,\n formatTimestamp,\n formatRole,\n };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime/components/ai-assistant.ts"],"names":["defineComponent","signal"],"mappings":"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","file":"chunk-SZL56BNL.cjs","sourcesContent":["import { defineComponent } from '../component.js';\nimport { signal } from '../signals.js';\nimport type { AiMessage, AiRole, AiSessionStatus } from '../ai.js';\n\nexport interface AiAssistantPanelProps extends Record<string, unknown> {\n title?: string;\n description?: string;\n messages: AiMessage[];\n suggestions?: string[];\n status?: AiSessionStatus;\n error?: string | null;\n placeholder?: string;\n sendLabel?: string;\n resetLabel?: string;\n busyLabel?: string;\n disabled?: boolean;\n}\n\nconst PANEL_STYLES = `\n .ai-panel {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n }\n .ai-panel__body {\n max-height: 420px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n .ai-panel__messages {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n }\n .ai-panel__message {\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n .ai-panel__bubble {\n background: var(--ce-surface-muted, #f8fafc);\n border-radius: 1rem;\n padding: 0.75rem 1rem;\n border: 1px solid var(--ce-border, rgba(15, 23, 42, 0.08));\n }\n .ai-panel__message[data-role=\"assistant\"] .ai-panel__bubble {\n background: var(--ce-surface, #ffffff);\n border-color: rgba(56, 189, 248, 0.35);\n }\n .ai-panel__author {\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--ce-text-subtle, #475569);\n }\n .ai-panel__bubble p {\n margin: 0.25rem 0;\n white-space: pre-wrap;\n }\n .ai-panel__bubble small {\n color: var(--ce-text-subtle, #94a3b8);\n font-size: 0.7rem;\n }\n .ai-panel__empty {\n font-size: 0.9rem;\n color: var(--ce-text-subtle, #94a3b8);\n }\n .ai-panel__error {\n border-radius: 0.75rem;\n border: 1px solid rgba(248, 113, 113, 0.5);\n background: rgba(248, 113, 113, 0.08);\n padding: 0.75rem 1rem;\n color: var(--ce-danger, #b91c1c);\n }\n .ai-panel__form {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n .ai-panel__input {\n width: 100%;\n min-height: 120px;\n border-radius: 0.75rem;\n border: 1px solid var(--ce-border, rgba(15, 23, 42, 0.1));\n padding: 0.75rem 1rem;\n font: inherit;\n resize: vertical;\n background: var(--ce-surface, #ffffff);\n }\n .ai-panel__actions {\n display: flex;\n gap: 0.75rem;\n flex-wrap: wrap;\n }\n .ai-panel__suggestions {\n margin-top: 1rem;\n }\n .ai-panel__chip-row {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n .ai-panel__chip {\n border: 1px dashed var(--ce-border, rgba(15, 23, 42, 0.25));\n border-radius: 999px;\n padding: 0.35rem 0.85rem;\n font-size: 0.85rem;\n }\n`;\n\nexport const AiAssistantPanel = defineComponent<AiAssistantPanelProps>({\n name: 'ce-ai-assistant-panel',\n template: `\n <section class=\"card card--shadow ai-panel\" role=\"region\" aria-live=\"polite\">\n <header class=\"card__header\">\n <div>\n <p class=\"badge badge--primary\">AI Assistant</p>\n <h3>{{ props.title ?? 'Strategy copilot' }}</h3>\n <p>{{ props.description ?? 'Ask the model to summarize milestones, risks, and delivery plans.' }}</p>\n </div>\n <span class=\"badge badge--warning\" ce:if=\"isBusy()\">{{ props.busyLabel ?? 'Working' }}</span>\n </header>\n <div class=\"card__body ai-panel__body\">\n <ul class=\"ai-panel__messages\" aria-live=\"polite\">\n <li ce:for=\"message in props.messages\" track=\"message.id\" class=\"ai-panel__message\" data-role=\"{{ message.role }}\">\n <div class=\"ai-panel__bubble\">\n <span class=\"ai-panel__author\">{{ formatRole(message.role) }}</span>\n <p>{{ message.content }}</p>\n <small>{{ formatTimestamp(message) }}</small>\n </div>\n </li>\n <li ce:if=\"!props.messages.length\" class=\"ai-panel__empty\">No prompts yet — start with one of the suggestions below.</li>\n </ul>\n <div class=\"ai-panel__error\" ce:if=\"hasError()\">\n <p>{{ props.error ?? 'The assistant could not finish this request.' }}</p>\n </div>\n </div>\n <footer class=\"card__footer ai-panel__footer\">\n <form class=\"ai-panel__form\" on:submit=\"submit\" novalidate>\n <label class=\"ai-panel__label\" for=\"ce-ai-assistant-input\">Prompt</label>\n <textarea\n id=\"ce-ai-assistant-input\"\n class=\"ai-panel__input\"\n rows=\"3\"\n placeholder=\"{{ props.placeholder ?? 'Ask anything about your CE UI adoption plan…' }}\"\n value=\"{{ prompt() }}\"\n on:input=\"handleInput\"\n required\n aria-label=\"AI prompt input\"\n ></textarea>\n <div class=\"ai-panel__actions\">\n <button type=\"submit\" class=\"button button--primary\" disabled=\"{{ props.disabled || isBusy() ? 'true' : 'false' }}\">{{ sendLabel() }}</button>\n <button type=\"button\" class=\"button button--secondary\" on:click=\"reset\">{{ props.resetLabel ?? 'Reset' }}</button>\n </div>\n </form>\n <section class=\"ai-panel__suggestions\" ce:if=\"props.suggestions?.length\">\n <p>Suggestions</p>\n <div class=\"ai-panel__chip-row\">\n <button\n ce:for=\"suggestion in props.suggestions\"\n track=\"suggestion\"\n type=\"button\"\n class=\"button button--ghost ai-panel__chip\"\n on:click=\"useSuggestion(suggestion)\"\n >\n {{ suggestion }}\n </button>\n </div>\n </section>\n </footer>\n </section>\n `,\n styles: [PANEL_STYLES],\n setup({ emit, props }) {\n const prompt = signal('');\n const formatter = new Intl.DateTimeFormat('en-US', { hour: '2-digit', minute: '2-digit' });\n\n const handleInput = (event: Event) => {\n const value = (event.target as HTMLTextAreaElement | null)?.value ?? '';\n prompt.set(value);\n };\n\n const submit = (event: Event) => {\n event.preventDefault();\n if (props.disabled || props.status === 'processing') {\n return;\n }\n const value = prompt().trim();\n if (!value) {\n return;\n }\n emit('send', { prompt: value });\n prompt.set('');\n };\n\n const reset = () => {\n prompt.set('');\n emit('reset');\n };\n\n const useSuggestion = (suggestion: string) => {\n prompt.set(suggestion);\n emit('prefill', { prompt: suggestion });\n };\n\n const hasError = () => Boolean(props.error);\n const isBusy = () => props.status === 'processing';\n const sendLabel = () => (isBusy() ? props.busyLabel ?? 'Thinking…' : props.sendLabel ?? 'Send');\n\n const formatTimestamp = (message: AiMessage) => formatter.format(new Date(message.createdAt));\n const formatRole = (role: AiRole) => {\n switch (role) {\n case 'assistant':\n return 'Assistant';\n case 'system':\n return 'System';\n case 'tool':\n return 'Tool';\n default:\n return 'You';\n }\n };\n\n return {\n prompt,\n handleInput,\n submit,\n reset,\n useSuggestion,\n hasError,\n isBusy,\n sendLabel,\n formatTimestamp,\n formatRole,\n };\n },\n});\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { registerThemeAwareComponent } from './chunk-
|
|
1
|
+
import { registerThemeAwareComponent } from './chunk-LSWEXTKL.js';
|
|
2
2
|
import { STYLE_SCOPE_ATTR, createStyleScopeId, scopeStyles } from './chunk-IHAMVLRY.js';
|
|
3
3
|
import { compileTemplate } from './chunk-BBAUALNU.js';
|
|
4
4
|
import { readRouteData } from './chunk-D3H5CGVD.js';
|
|
@@ -711,5 +711,5 @@ function createReactiveProps(propsSignal) {
|
|
|
711
711
|
}
|
|
712
712
|
|
|
713
713
|
export { Injector, createInjector, defineComponent, renderComponent, renderTemplateToStream, renderTemplateToString, useLocation, useNavigate, useRouteData, useRouteMatch, useRouteParams, useRouter, withRouterContext };
|
|
714
|
-
//# sourceMappingURL=chunk-
|
|
715
|
-
//# sourceMappingURL=chunk-
|
|
714
|
+
//# sourceMappingURL=chunk-VQDM5HCG.js.map
|
|
715
|
+
//# sourceMappingURL=chunk-VQDM5HCG.js.map
|