@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.
Files changed (43) hide show
  1. package/dist/browser.cjs +10 -10
  2. package/dist/browser.js +4 -4
  3. package/dist/{chunk-T6T7QE4J.js → chunk-AA4GATSB.js} +3 -3
  4. package/dist/{chunk-T6T7QE4J.js.map → chunk-AA4GATSB.js.map} +1 -1
  5. package/dist/{chunk-V6JCOBGY.js → chunk-BXQFX2PS.js} +3 -3
  6. package/dist/{chunk-V6JCOBGY.js.map → chunk-BXQFX2PS.js.map} +1 -1
  7. package/dist/{chunk-CXTAUXLG.cjs → chunk-FLUSP6VF.cjs} +4 -4
  8. package/dist/{chunk-CXTAUXLG.cjs.map → chunk-FLUSP6VF.cjs.map} +1 -1
  9. package/dist/{chunk-Q3KH6HMU.js → chunk-LSWEXTKL.js} +9 -5
  10. package/dist/chunk-LSWEXTKL.js.map +1 -0
  11. package/dist/{chunk-PVZVFICK.cjs → chunk-NCXUQXAN.cjs} +9 -5
  12. package/dist/chunk-NCXUQXAN.cjs.map +1 -0
  13. package/dist/{chunk-6BYWFGQY.cjs → chunk-SZL56BNL.cjs} +4 -4
  14. package/dist/{chunk-6BYWFGQY.cjs.map → chunk-SZL56BNL.cjs.map} +1 -1
  15. package/dist/{chunk-CHLDE4JQ.js → chunk-VQDM5HCG.js} +3 -3
  16. package/dist/{chunk-CHLDE4JQ.js.map → chunk-VQDM5HCG.js.map} +1 -1
  17. package/dist/{chunk-W3LNNY3U.cjs → chunk-W5M7JGC4.cjs} +4 -4
  18. package/dist/{chunk-W3LNNY3U.cjs.map → chunk-W5M7JGC4.cjs.map} +1 -1
  19. package/dist/cli/index.cjs +1 -1
  20. package/dist/cli/index.cjs.map +1 -1
  21. package/dist/cli/index.js +1 -1
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/index.cjs +21 -21
  24. package/dist/index.js +5 -5
  25. package/dist/lib/index.cjs +15 -15
  26. package/dist/lib/index.cjs.map +1 -1
  27. package/dist/lib/index.d.cts +4 -4
  28. package/dist/lib/index.d.ts +4 -4
  29. package/dist/lib/index.js +3 -3
  30. package/dist/lib/index.js.map +1 -1
  31. package/dist/lib/theme.cjs +13 -13
  32. package/dist/lib/theme.js +1 -1
  33. package/dist/runtime/adapters/react.cjs.map +1 -1
  34. package/dist/runtime/adapters/react.js.map +1 -1
  35. package/dist/runtime/components/ai-assistant.cjs +4 -4
  36. package/dist/runtime/components/ai-assistant.js +3 -3
  37. package/dist/runtime/components/ai-summary-card.cjs +4 -4
  38. package/dist/runtime/components/ai-summary-card.js +3 -3
  39. package/dist/runtime/router.cjs.map +1 -1
  40. package/dist/runtime/router.js.map +1 -1
  41. package/package.json +2 -7
  42. package/dist/chunk-PVZVFICK.cjs.map +0 -1
  43. 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 chunk6BYWFGQY_cjs = require('./chunk-6BYWFGQY.cjs');
5
- var chunkCXTAUXLG_cjs = require('./chunk-CXTAUXLG.cjs');
6
- var chunkW3LNNY3U_cjs = require('./chunk-W3LNNY3U.cjs');
7
- require('./chunk-PVZVFICK.cjs');
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 chunk6BYWFGQY_cjs.AiAssistantPanel; }
142
+ get: function () { return chunkSZL56BNL_cjs.AiAssistantPanel; }
143
143
  });
144
144
  Object.defineProperty(exports, "AiSummaryCard", {
145
145
  enumerable: true,
146
- get: function () { return chunkCXTAUXLG_cjs.AiSummaryCard; }
146
+ get: function () { return chunkFLUSP6VF_cjs.AiSummaryCard; }
147
147
  });
148
148
  Object.defineProperty(exports, "Injector", {
149
149
  enumerable: true,
150
- get: function () { return chunkW3LNNY3U_cjs.Injector; }
150
+ get: function () { return chunkW5M7JGC4_cjs.Injector; }
151
151
  });
152
152
  Object.defineProperty(exports, "createInjector", {
153
153
  enumerable: true,
154
- get: function () { return chunkW3LNNY3U_cjs.createInjector; }
154
+ get: function () { return chunkW5M7JGC4_cjs.createInjector; }
155
155
  });
156
156
  Object.defineProperty(exports, "defineComponent", {
157
157
  enumerable: true,
158
- get: function () { return chunkW3LNNY3U_cjs.defineComponent; }
158
+ get: function () { return chunkW5M7JGC4_cjs.defineComponent; }
159
159
  });
160
160
  Object.defineProperty(exports, "renderComponent", {
161
161
  enumerable: true,
162
- get: function () { return chunkW3LNNY3U_cjs.renderComponent; }
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-T6T7QE4J.js';
3
- export { AiSummaryCard } from './chunk-V6JCOBGY.js';
4
- export { Injector, createInjector, defineComponent, renderComponent } from './chunk-CHLDE4JQ.js';
5
- import './chunk-Q3KH6HMU.js';
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-CHLDE4JQ.js';
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-T6T7QE4J.js.map
224
- //# sourceMappingURL=chunk-T6T7QE4J.js.map
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-CHLDE4JQ.js';
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-V6JCOBGY.js.map
69
- //# sourceMappingURL=chunk-V6JCOBGY.js.map
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-V6JCOBGY.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
+ {"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 chunkW3LNNY3U_cjs = require('./chunk-W3LNNY3U.cjs');
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 = chunkW3LNNY3U_cjs.defineComponent({
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-CXTAUXLG.cjs.map
71
- //# sourceMappingURL=chunk-CXTAUXLG.cjs.map
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-CXTAUXLG.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"]}
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) => listener(state));
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) => document.documentElement.style.setProperty(key, value));
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-Q3KH6HMU.js.map
305
- //# sourceMappingURL=chunk-Q3KH6HMU.js.map
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) => listener(state));
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) => document.documentElement.style.setProperty(key, value));
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-PVZVFICK.cjs.map
318
- //# sourceMappingURL=chunk-PVZVFICK.cjs.map
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 chunkW3LNNY3U_cjs = require('./chunk-W3LNNY3U.cjs');
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 = chunkW3LNNY3U_cjs.defineComponent({
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-6BYWFGQY.cjs.map
226
- //# sourceMappingURL=chunk-6BYWFGQY.cjs.map
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":"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","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-Q3KH6HMU.js';
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-CHLDE4JQ.js.map
715
- //# sourceMappingURL=chunk-CHLDE4JQ.js.map
714
+ //# sourceMappingURL=chunk-VQDM5HCG.js.map
715
+ //# sourceMappingURL=chunk-VQDM5HCG.js.map