meno-core 1.0.51 → 1.0.53

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 (137) hide show
  1. package/build-astro.ts +183 -13
  2. package/build-next.ts +1361 -0
  3. package/build-static.ts +7 -5
  4. package/dist/bin/cli.js +2 -2
  5. package/dist/build-static.js +6 -6
  6. package/dist/chunks/{chunk-HNLUO36W.js → chunk-GZHGVVW3.js} +2 -2
  7. package/dist/chunks/chunk-GZHGVVW3.js.map +7 -0
  8. package/dist/chunks/{chunk-LPVETICS.js → chunk-H3GJ4H2U.js} +185 -1
  9. package/dist/chunks/chunk-H3GJ4H2U.js.map +7 -0
  10. package/dist/chunks/{chunk-DM54NPEC.js → chunk-IGYR22T6.js} +89 -271
  11. package/dist/chunks/chunk-IGYR22T6.js.map +7 -0
  12. package/dist/chunks/{chunk-3KJ6SJZC.js → chunk-JGP5A3Y5.js} +12 -11
  13. package/dist/chunks/chunk-JGP5A3Y5.js.map +7 -0
  14. package/dist/chunks/{chunk-7NIC4I3V.js → chunk-JGWFTO6P.js} +167 -21
  15. package/dist/chunks/chunk-JGWFTO6P.js.map +7 -0
  16. package/dist/chunks/{chunk-EDQSMAMP.js → chunk-O3NAGJP4.js} +85 -4
  17. package/dist/chunks/chunk-O3NAGJP4.js.map +7 -0
  18. package/dist/chunks/{chunk-H4JSCDNW.js → chunk-QB2LNO4W.js} +24 -1
  19. package/dist/chunks/chunk-QB2LNO4W.js.map +7 -0
  20. package/dist/chunks/{chunk-V7CD7V7W.js → chunk-R6XHAFBF.js} +561 -112
  21. package/dist/chunks/chunk-R6XHAFBF.js.map +7 -0
  22. package/dist/chunks/{chunk-J23ZX5AP.js → chunk-X754AHS5.js} +277 -1
  23. package/dist/chunks/chunk-X754AHS5.js.map +7 -0
  24. package/dist/chunks/{chunk-2QK6U5UK.js → chunk-YBLHKYFF.js} +12 -2
  25. package/dist/chunks/chunk-YBLHKYFF.js.map +7 -0
  26. package/dist/chunks/{constants-GWBAD66U.js → constants-STK2YBIW.js} +2 -2
  27. package/dist/entries/server-router.js +7 -7
  28. package/dist/lib/client/index.js +354 -59
  29. package/dist/lib/client/index.js.map +4 -4
  30. package/dist/lib/server/index.js +1458 -190
  31. package/dist/lib/server/index.js.map +4 -4
  32. package/dist/lib/shared/index.js +202 -34
  33. package/dist/lib/shared/index.js.map +4 -4
  34. package/dist/lib/test-utils/index.js +1 -1
  35. package/entries/client-router.tsx +5 -165
  36. package/lib/client/ErrorBoundary.test.tsx +27 -25
  37. package/lib/client/ErrorBoundary.tsx +34 -19
  38. package/lib/client/core/ComponentBuilder.ts +19 -2
  39. package/lib/client/core/builders/embedBuilder.ts +8 -4
  40. package/lib/client/core/builders/listBuilder.ts +23 -4
  41. package/lib/client/fontFamiliesService.test.ts +76 -0
  42. package/lib/client/fontFamiliesService.ts +69 -0
  43. package/lib/client/hmrCssReload.ts +160 -0
  44. package/lib/client/hooks/useColorVariables.ts +2 -0
  45. package/lib/client/index.ts +4 -0
  46. package/lib/client/meno-filter/ui.ts +2 -0
  47. package/lib/client/routing/RouteLoader.test.ts +2 -2
  48. package/lib/client/routing/RouteLoader.ts +8 -2
  49. package/lib/client/routing/Router.tsx +81 -15
  50. package/lib/client/scripts/ScriptExecutor.test.ts +143 -0
  51. package/lib/client/scripts/ScriptExecutor.ts +56 -2
  52. package/lib/client/styles/StyleInjector.ts +20 -5
  53. package/lib/client/styles/UtilityClassCollector.ts +7 -1
  54. package/lib/client/styles/cspNonce.test.ts +67 -0
  55. package/lib/client/styles/cspNonce.ts +63 -0
  56. package/lib/client/templateEngine.test.ts +80 -0
  57. package/lib/client/templateEngine.ts +5 -0
  58. package/lib/server/astro/cmsPageEmitter.ts +35 -5
  59. package/lib/server/astro/componentEmitter.ts +61 -5
  60. package/lib/server/astro/nodeToAstro.ts +149 -11
  61. package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +264 -0
  62. package/lib/server/astro/normalizeOrphanTemplateProps.ts +184 -0
  63. package/lib/server/createServer.ts +11 -0
  64. package/lib/server/draftPageStore.ts +49 -0
  65. package/lib/server/fileWatcher.ts +62 -2
  66. package/lib/server/index.ts +13 -1
  67. package/lib/server/providers/fileSystemPageProvider.ts +8 -0
  68. package/lib/server/routes/api/components.ts +9 -4
  69. package/lib/server/routes/api/core-routes.ts +2 -2
  70. package/lib/server/routes/api/pages.ts +14 -22
  71. package/lib/server/routes/api/shared.ts +56 -0
  72. package/lib/server/routes/index.ts +90 -0
  73. package/lib/server/routes/pages.ts +13 -6
  74. package/lib/server/services/componentService.test.ts +199 -2
  75. package/lib/server/services/componentService.ts +354 -49
  76. package/lib/server/services/fileWatcherService.ts +4 -24
  77. package/lib/server/services/pageService.test.ts +23 -0
  78. package/lib/server/services/pageService.ts +124 -6
  79. package/lib/server/ssr/attributeBuilder.ts +8 -2
  80. package/lib/server/ssr/buildErrorOverlay.ts +1 -1
  81. package/lib/server/ssr/errorOverlay.test.ts +21 -2
  82. package/lib/server/ssr/errorOverlay.ts +38 -11
  83. package/lib/server/ssr/htmlGenerator.test.ts +53 -13
  84. package/lib/server/ssr/htmlGenerator.ts +71 -27
  85. package/lib/server/ssr/liveReloadIntegration.test.ts +123 -2
  86. package/lib/server/ssr/metaTagGenerator.ts +19 -1
  87. package/lib/server/ssr/ssrRenderer.test.ts +67 -0
  88. package/lib/server/ssr/ssrRenderer.ts +94 -9
  89. package/lib/server/ssrRenderer.test.ts +70 -0
  90. package/lib/server/websocketManager.ts +0 -1
  91. package/lib/shared/componentRefs.ts +45 -0
  92. package/lib/shared/constants.ts +8 -0
  93. package/lib/shared/cssGeneration.ts +2 -0
  94. package/lib/shared/cssProperties.ts +184 -0
  95. package/lib/shared/expressionEvaluator.ts +54 -0
  96. package/lib/shared/fontCss.ts +101 -0
  97. package/lib/shared/fontLoader.ts +8 -86
  98. package/lib/shared/friendlyError.test.ts +87 -0
  99. package/lib/shared/friendlyError.ts +121 -0
  100. package/lib/shared/hrefRefs.test.ts +130 -0
  101. package/lib/shared/hrefRefs.ts +100 -0
  102. package/lib/shared/index.ts +52 -0
  103. package/lib/shared/inlineSvgStyleRules.test.ts +108 -0
  104. package/lib/shared/inlineSvgStyleRules.ts +134 -0
  105. package/lib/shared/interfaces/contentProvider.ts +13 -0
  106. package/lib/shared/itemTemplateUtils.test.ts +14 -0
  107. package/lib/shared/itemTemplateUtils.ts +4 -1
  108. package/lib/shared/registry/NodeTypeDefinition.ts +1 -1
  109. package/lib/shared/registry/nodeTypes/LinkNodeType.ts +1 -1
  110. package/lib/shared/slugTranslator.test.ts +24 -0
  111. package/lib/shared/slugTranslator.ts +24 -0
  112. package/lib/shared/styleNodeUtils.ts +4 -1
  113. package/lib/shared/tree/PathBuilder.test.ts +128 -1
  114. package/lib/shared/tree/PathBuilder.ts +83 -31
  115. package/lib/shared/types/comment.ts +99 -0
  116. package/lib/shared/types/index.ts +12 -0
  117. package/lib/shared/types/rendering.ts +8 -0
  118. package/lib/shared/utilityClassConfig.ts +4 -2
  119. package/lib/shared/utilityClassMapper.test.ts +24 -0
  120. package/lib/shared/validation/commentValidators.ts +69 -0
  121. package/lib/shared/validation/index.ts +1 -0
  122. package/lib/shared/viewportUnits.integration.test.ts +42 -0
  123. package/lib/shared/viewportUnits.test.ts +103 -0
  124. package/lib/shared/viewportUnits.ts +63 -0
  125. package/lib/test-utils/dom-setup.ts +6 -0
  126. package/package.json +1 -1
  127. package/dist/chunks/chunk-2QK6U5UK.js.map +0 -7
  128. package/dist/chunks/chunk-3KJ6SJZC.js.map +0 -7
  129. package/dist/chunks/chunk-7NIC4I3V.js.map +0 -7
  130. package/dist/chunks/chunk-DM54NPEC.js.map +0 -7
  131. package/dist/chunks/chunk-EDQSMAMP.js.map +0 -7
  132. package/dist/chunks/chunk-H4JSCDNW.js.map +0 -7
  133. package/dist/chunks/chunk-HNLUO36W.js.map +0 -7
  134. package/dist/chunks/chunk-J23ZX5AP.js.map +0 -7
  135. package/dist/chunks/chunk-LPVETICS.js.map +0 -7
  136. package/dist/chunks/chunk-V7CD7V7W.js.map +0 -7
  137. /package/dist/chunks/{constants-GWBAD66U.js.map → constants-STK2YBIW.js.map} +0 -0
package/build-static.ts CHANGED
@@ -248,8 +248,7 @@ ${urlEntries}
248
248
  /**
249
249
  * Clean dist directory, keeping only production files
250
250
  */
251
- function cleanDist(): void {
252
- const distDir = projectPaths.dist();
251
+ function cleanDist(distDir: string = projectPaths.dist()): void {
253
252
  if (!existsSync(distDir)) {
254
253
  mkdirSync(distDir, { recursive: true });
255
254
  return;
@@ -601,7 +600,7 @@ async function generateABFunctions(experiments: Experiment[], distDir: string):
601
600
  /**
602
601
  * Main build function
603
602
  */
604
- export async function buildStaticPages(): Promise<void> {
603
+ export async function buildStaticPages(outDir?: string): Promise<void> {
605
604
  console.log("🏗️ Building static HTML files...\n");
606
605
 
607
606
  // Clear previous build errors and JS validation cache
@@ -635,8 +634,12 @@ export async function buildStaticPages(): Promise<void> {
635
634
  // Auto-migrate pages/templates/ → templates/ if needed
636
635
  await migrateTemplatesDirectory();
637
636
 
637
+ // Resolve output directory. Defaults to <project>/dist; callers (e.g. the
638
+ // Cloudflare deploy) may pass a temp dir to avoid leaving a dist/ in the project.
639
+ const distDir = outDir || projectPaths.dist();
640
+
638
641
  // Clean dist directory (removes editor files, old HTML)
639
- cleanDist();
642
+ cleanDist(distDir);
640
643
 
641
644
  // Clear the JS file cache since cleanDist() removed _scripts/
642
645
  // Without this, cached entries would skip file creation on subsequent builds
@@ -644,7 +647,6 @@ export async function buildStaticPages(): Promise<void> {
644
647
 
645
648
  // Copy fonts, images, icons, and functions directories to dist
646
649
  console.log("📦 Copying assets...");
647
- const distDir = projectPaths.dist();
648
650
 
649
651
  // Delete old _errors.json if it exists (start fresh)
650
652
  const errorsPath = join(distDir, '_errors.json');
package/dist/bin/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  generateBuildErrorPage
4
- } from "../chunks/chunk-HNLUO36W.js";
4
+ } from "../chunks/chunk-GZHGVVW3.js";
5
5
  import {
6
6
  createRuntimeServer,
7
7
  setProjectRoot
@@ -82,7 +82,7 @@ function getMatchingHeaders(pathname, headersMap) {
82
82
  return result;
83
83
  }
84
84
  async function startStaticServer(distPath) {
85
- const { SERVE_PORT } = await import("../chunks/constants-GWBAD66U.js");
85
+ const { SERVE_PORT } = await import("../chunks/constants-STK2YBIW.js");
86
86
  const headersMap = parseHeadersFile(distPath);
87
87
  const server = await createRuntimeServer({
88
88
  port: SERVE_PORT,
@@ -9,17 +9,17 @@ import {
9
9
  hashContent,
10
10
  injectTrackingScript,
11
11
  isCMSPage
12
- } from "./chunks/chunk-3KJ6SJZC.js";
13
- import "./chunks/chunk-DM54NPEC.js";
12
+ } from "./chunks/chunk-JGP5A3Y5.js";
13
+ import "./chunks/chunk-IGYR22T6.js";
14
14
  import "./chunks/chunk-2MHDV5BF.js";
15
15
  import "./chunks/chunk-I7YIGZXT.js";
16
16
  import "./chunks/chunk-WQFG7PAH.js";
17
- import "./chunks/chunk-J23ZX5AP.js";
18
- import "./chunks/chunk-EDQSMAMP.js";
19
- import "./chunks/chunk-7NIC4I3V.js";
17
+ import "./chunks/chunk-X754AHS5.js";
18
+ import "./chunks/chunk-O3NAGJP4.js";
19
+ import "./chunks/chunk-JGWFTO6P.js";
20
20
  import "./chunks/chunk-AZQYF6KE.js";
21
21
  import "./chunks/chunk-UB44F4Z2.js";
22
- import "./chunks/chunk-2QK6U5UK.js";
22
+ import "./chunks/chunk-YBLHKYFF.js";
23
23
  import "./chunks/chunk-KSBZ2L7C.js";
24
24
  export {
25
25
  buildCMSItemPath,
@@ -31,7 +31,7 @@ ${plainTextErrors}`;
31
31
  <meta charset="UTF-8">
32
32
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
33
33
  <title>Build Failed</title>
34
- <style>
34
+ <style${nonceAttr}>
35
35
  * { margin: 0; padding: 0; box-sizing: border-box; }
36
36
 
37
37
  body {
@@ -319,4 +319,4 @@ ${plainTextErrors}`;
319
319
  export {
320
320
  generateBuildErrorPage
321
321
  };
322
- //# sourceMappingURL=chunk-HNLUO36W.js.map
322
+ //# sourceMappingURL=chunk-GZHGVVW3.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../lib/server/ssr/buildErrorOverlay.ts"],
4
+ "sourcesContent": ["/**\n * Build Error Overlay Generator\n * Generates an HTML page showing build errors when the static server detects _errors.json\n */\n\nexport interface BuildError {\n file: string; // e.g., \"pages/posts.json\"\n message: string; // Error message\n type: string; // 'minify' | 'render' | 'parse' | 'cms'\n}\n\nexport interface BuildErrorsData {\n errors: BuildError[];\n timestamp: number;\n}\n\n/**\n * Escape HTML to prevent XSS in error messages\n */\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\n/**\n * Safely encode data for embedding in a script tag\n */\nfunction safeJsonForScript(data: unknown): string {\n return JSON.stringify(data)\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026');\n}\n\n/**\n * Generate HTML page showing build errors.\n *\n * @param data Build errors payload to render\n * @param cspNonce Per-request CSP nonce \u2014 when set, stamped on the inline\n * `<script>` so it executes under a strict (nonce-based)\n * script-src policy without `'unsafe-inline'`. Callers in a\n * plain static-serve context may omit it (no CSP is enforced\n * by the static server itself).\n */\nexport function generateBuildErrorPage(data: BuildErrorsData, cspNonce?: string): string {\n const { errors, timestamp } = data;\n const timeStr = new Date(timestamp).toLocaleTimeString();\n const nonceAttr = cspNonce ? ` nonce=\"${cspNonce}\"` : '';\n\n // Generate plain text for copying to AI\n const plainTextErrors = errors.map(err =>\n `[${err.type.toUpperCase()}] ${err.file}\\n${err.message}`\n ).join('\\n\\n');\n const copyText = `Build failed with ${errors.length} error(s):\\n\\n${plainTextErrors}`;\n\n const errorListHtml = errors.map((err) => `\n <div class=\"error-item\">\n <div class=\"error-item-header\">\n <div class=\"error-type\">${escapeHtml(err.type)}</div>\n <div class=\"error-file\">${escapeHtml(err.file)}</div>\n </div>\n <div class=\"error-message\">${escapeHtml(err.message)}</div>\n </div>\n `).join('');\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Build Failed</title>\n <style${nonceAttr}>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n\n body {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: linear-gradient(135deg, #0f0f1a 0%, #1a1a2e 100%);\n color: #e2e8f0;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n }\n\n .container {\n max-width: 720px;\n width: 100%;\n }\n\n .card {\n background: rgba(30, 30, 50, 0.8);\n backdrop-filter: blur(20px);\n border: 1px solid rgba(255, 255, 255, 0.08);\n border-radius: 16px;\n overflow: hidden;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 20px 50px rgba(0, 0, 0, 0.3),\n inset 0 1px 0 rgba(255, 255, 255, 0.05);\n }\n\n .header {\n background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%);\n padding: 20px 24px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-icon {\n width: 32px;\n height: 32px;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .header-icon svg {\n width: 18px;\n height: 18px;\n stroke: white;\n }\n\n .header-title {\n font-size: 16px;\n font-weight: 600;\n letter-spacing: -0.01em;\n }\n\n .error-count {\n background: rgba(0, 0, 0, 0.25);\n padding: 6px 14px;\n border-radius: 100px;\n font-size: 13px;\n font-weight: 500;\n }\n\n .body {\n padding: 20px;\n max-height: 50vh;\n overflow-y: auto;\n }\n\n .body::-webkit-scrollbar {\n width: 6px;\n }\n\n .body::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .body::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.1);\n border-radius: 3px;\n }\n\n .error-item {\n background: rgba(0, 0, 0, 0.3);\n border: 1px solid rgba(255, 255, 255, 0.06);\n border-radius: 10px;\n padding: 14px 16px;\n margin-bottom: 10px;\n transition: border-color 0.15s;\n }\n\n .error-item:last-child { margin-bottom: 0; }\n\n .error-item:hover {\n border-color: rgba(255, 255, 255, 0.12);\n }\n\n .error-item-header {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n }\n\n .error-type {\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 4px 8px;\n border-radius: 4px;\n background: rgba(239, 68, 68, 0.2);\n color: #fca5a5;\n }\n\n .error-file {\n font-family: 'SF Mono', 'Fira Code', Menlo, Monaco, monospace;\n font-size: 12px;\n color: #94a3b8;\n }\n\n .error-message {\n font-family: 'SF Mono', 'Fira Code', Menlo, Monaco, monospace;\n font-size: 12px;\n line-height: 1.7;\n color: #f87171;\n white-space: pre-wrap;\n word-break: break-word;\n background: rgba(0, 0, 0, 0.2);\n padding: 10px 12px;\n border-radius: 6px;\n border-left: 2px solid #dc2626;\n }\n\n .footer {\n padding: 16px 20px;\n background: rgba(0, 0, 0, 0.2);\n border-top: 1px solid rgba(255, 255, 255, 0.06);\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .footer-info {\n font-size: 12px;\n color: #64748b;\n }\n\n .footer-actions {\n display: flex;\n gap: 8px;\n }\n\n .btn {\n border: none;\n padding: 10px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s;\n }\n\n .btn svg {\n width: 14px;\n height: 14px;\n }\n\n .btn-secondary {\n background: rgba(255, 255, 255, 0.08);\n color: #e2e8f0;\n border: 1px solid rgba(255, 255, 255, 0.1);\n }\n\n .btn-secondary:hover {\n background: rgba(255, 255, 255, 0.12);\n border-color: rgba(255, 255, 255, 0.15);\n }\n\n .btn-primary {\n background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);\n color: white;\n }\n\n .btn-primary:hover {\n background: linear-gradient(135deg, #60a5fa 0%, #3b82f6 100%);\n }\n\n .btn-success {\n background: linear-gradient(135deg, #10b981 0%, #059669 100%) !important;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"card\">\n <div class=\"header\">\n <div class=\"header-left\">\n <div class=\"header-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\n </svg>\n </div>\n <span class=\"header-title\">Build Failed</span>\n </div>\n <span class=\"error-count\">${errors.length} error${errors.length === 1 ? '' : 's'}</span>\n </div>\n <div class=\"body\">\n ${errorListHtml}\n </div>\n <div class=\"footer\">\n <div class=\"footer-info\">Failed at ${timeStr}</div>\n <div class=\"footer-actions\">\n <button class=\"btn btn-secondary\" id=\"copyBtn\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n </svg>\n <span>Copy</span>\n </button>\n <button class=\"btn btn-primary\" id=\"refreshBtn\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"23 4 23 10 17 10\"></polyline>\n <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\"></path>\n </svg>\n Refresh\n </button>\n </div>\n </div>\n </div>\n </div>\n <script${nonceAttr}>\n (function() {\n var copyBtn = document.getElementById('copyBtn');\n var copyText = ${safeJsonForScript(copyText)};\n\n copyBtn.addEventListener('click', function() {\n navigator.clipboard.writeText(copyText).then(function() {\n var span = copyBtn.querySelector('span');\n var original = span.textContent;\n span.textContent = 'Copied!';\n copyBtn.classList.add('btn-success');\n setTimeout(function() {\n span.textContent = original;\n copyBtn.classList.remove('btn-success');\n }, 2000);\n }).catch(function(err) {\n console.error('Failed to copy:', err);\n });\n });\n\n // Refresh button \u2014 handler attached here (instead of onclick) so the\n // page works under a strict (nonce-based) script-src CSP that bars\n // inline event-handler attributes.\n var refreshBtn = document.getElementById('refreshBtn');\n if (refreshBtn) {\n refreshBtn.addEventListener('click', function() {\n location.reload();\n });\n }\n })();\n </script>\n</body>\n</html>`;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -70,6 +70,35 @@ var CSS_PROPERTIES_DEFINITION = {
70
70
  values: ["repeat", "repeat-x", "repeat-y", "no-repeat"],
71
71
  type: "select"
72
72
  },
73
+ backgroundAttachment: {
74
+ values: ["scroll", "fixed", "local"],
75
+ type: "select"
76
+ },
77
+ backgroundOrigin: {
78
+ values: ["border-box", "padding-box", "content-box"],
79
+ type: "select"
80
+ },
81
+ backgroundBlendMode: {
82
+ values: ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"],
83
+ type: "select"
84
+ },
85
+ // Gradient-text recipe (`background: linear-gradient(...); background-clip:
86
+ // text; -webkit-background-clip: text; -webkit-text-fill-color: transparent`).
87
+ // The `Webkit*` capitalization is intentional — utilityClassMapper's
88
+ // camel→kebab emitter only prepends `-` when the first letter is uppercase,
89
+ // so `WebkitBackgroundClip` round-trips back to `-webkit-background-clip`.
90
+ backgroundClip: {
91
+ values: ["border-box", "padding-box", "content-box", "text"],
92
+ type: "select"
93
+ },
94
+ WebkitBackgroundClip: {
95
+ values: ["border-box", "padding-box", "content-box", "text"],
96
+ type: "select"
97
+ },
98
+ WebkitTextFillColor: { type: "string" },
99
+ WebkitTextStroke: { type: "string" },
100
+ WebkitTextStrokeWidth: { type: "string" },
101
+ WebkitTextStrokeColor: { type: "string" },
73
102
  color: { type: "string" },
74
103
  opacity: { type: "number" },
75
104
  // Flexbox
@@ -149,10 +178,63 @@ var CSS_PROPERTIES_DEFINITION = {
149
178
  values: ["none", "underline", "overline", "line-through"],
150
179
  type: "select"
151
180
  },
181
+ textDecorationLine: {
182
+ values: ["none", "underline", "overline", "line-through"],
183
+ type: "select"
184
+ },
185
+ textDecorationStyle: {
186
+ values: ["solid", "double", "dotted", "dashed", "wavy"],
187
+ type: "select"
188
+ },
189
+ textDecorationColor: { type: "string" },
190
+ textDecorationThickness: { type: "string" },
191
+ textUnderlineOffset: { type: "string" },
192
+ textUnderlinePosition: { type: "string" },
152
193
  textTransform: {
153
194
  values: ["none", "capitalize", "uppercase", "lowercase"],
154
195
  type: "select"
155
196
  },
197
+ textRendering: {
198
+ values: ["auto", "optimizeSpeed", "optimizeLegibility", "geometricPrecision"],
199
+ type: "select"
200
+ },
201
+ fontVariant: { type: "string" },
202
+ fontStretch: { type: "string" },
203
+ fontFeatureSettings: { type: "string" },
204
+ fontVariationSettings: { type: "string" },
205
+ fontKerning: {
206
+ values: ["auto", "normal", "none"],
207
+ type: "select"
208
+ },
209
+ WebkitFontSmoothing: {
210
+ values: ["auto", "none", "antialiased", "subpixel-antialiased"],
211
+ type: "select"
212
+ },
213
+ MozOsxFontSmoothing: {
214
+ values: ["auto", "grayscale"],
215
+ type: "select"
216
+ },
217
+ hyphens: {
218
+ values: ["none", "manual", "auto"],
219
+ type: "select"
220
+ },
221
+ WebkitHyphens: {
222
+ values: ["none", "manual", "auto"],
223
+ type: "select"
224
+ },
225
+ writingMode: {
226
+ values: ["horizontal-tb", "vertical-rl", "vertical-lr"],
227
+ type: "select"
228
+ },
229
+ direction: {
230
+ values: ["ltr", "rtl"],
231
+ type: "select"
232
+ },
233
+ tabSize: { type: "string" },
234
+ wordWrap: {
235
+ values: ["normal", "break-word"],
236
+ type: "select"
237
+ },
156
238
  letterSpacing: { type: "string" },
157
239
  wordSpacing: { type: "string" },
158
240
  wordBreak: {
@@ -163,6 +245,10 @@ var CSS_PROPERTIES_DEFINITION = {
163
245
  values: ["normal", "break-word", "anywhere"],
164
246
  type: "select"
165
247
  },
248
+ textWrap: {
249
+ values: ["wrap", "nowrap", "balance", "pretty", "stable"],
250
+ type: "select"
251
+ },
166
252
  textIndent: { type: "string" },
167
253
  verticalAlign: {
168
254
  values: ["baseline", "top", "middle", "bottom", "text-top", "text-bottom", "sub", "super"],
@@ -173,9 +259,20 @@ var CSS_PROPERTIES_DEFINITION = {
173
259
  textShadow: { type: "string" },
174
260
  filter: { type: "string" },
175
261
  backdropFilter: { type: "string" },
262
+ WebkitBackdropFilter: { type: "string" },
176
263
  transform: { type: "string" },
177
264
  transformOrigin: { type: "string" },
265
+ transformStyle: {
266
+ values: ["flat", "preserve-3d"],
267
+ type: "select"
268
+ },
269
+ perspective: { type: "string" },
270
+ perspectiveOrigin: { type: "string" },
178
271
  transition: { type: "string" },
272
+ transitionProperty: { type: "string" },
273
+ transitionDuration: { type: "string" },
274
+ transitionTimingFunction: { type: "string" },
275
+ transitionDelay: { type: "string" },
179
276
  animation: { type: "string" },
180
277
  backfaceVisibility: {
181
278
  values: ["visible", "hidden"],
@@ -185,7 +282,38 @@ var CSS_PROPERTIES_DEFINITION = {
185
282
  values: ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"],
186
283
  type: "select"
187
284
  },
285
+ isolation: {
286
+ values: ["auto", "isolate"],
287
+ type: "select"
288
+ },
289
+ willChange: { type: "string" },
290
+ imageRendering: {
291
+ values: ["auto", "crisp-edges", "pixelated", "smooth"],
292
+ type: "select"
293
+ },
188
294
  clipPath: { type: "string" },
295
+ WebkitClipPath: { type: "string" },
296
+ // Mask family — gradient/SVG masks. Emit both the standard and `-webkit-`
297
+ // form because Safari still needs the prefix.
298
+ maskImage: { type: "string" },
299
+ WebkitMaskImage: { type: "string" },
300
+ maskSize: { type: "string" },
301
+ WebkitMaskSize: { type: "string" },
302
+ maskPosition: { type: "string" },
303
+ WebkitMaskPosition: { type: "string" },
304
+ maskRepeat: { type: "string" },
305
+ WebkitMaskRepeat: { type: "string" },
306
+ maskOrigin: { type: "string" },
307
+ WebkitMaskOrigin: { type: "string" },
308
+ maskClip: { type: "string" },
309
+ WebkitMaskClip: { type: "string" },
310
+ maskComposite: { type: "string" },
311
+ WebkitMaskComposite: { type: "string" },
312
+ maskMode: { type: "string" },
313
+ maskType: {
314
+ values: ["luminance", "alpha"],
315
+ type: "select"
316
+ },
189
317
  // Overflow & Content
190
318
  overflow: {
191
319
  values: ["visible", "hidden", "scroll", "auto"],
@@ -225,6 +353,27 @@ var CSS_PROPERTIES_DEFINITION = {
225
353
  values: ["auto", "none", "text", "all"],
226
354
  type: "select"
227
355
  },
356
+ WebkitUserSelect: {
357
+ values: ["auto", "none", "text", "all"],
358
+ type: "select"
359
+ },
360
+ MozUserSelect: {
361
+ values: ["auto", "none", "text", "all"],
362
+ type: "select"
363
+ },
364
+ caretColor: { type: "string" },
365
+ appearance: {
366
+ values: ["none", "auto", "menulist-button", "textfield"],
367
+ type: "select"
368
+ },
369
+ WebkitAppearance: {
370
+ values: ["none", "auto", "menulist-button", "textfield"],
371
+ type: "select"
372
+ },
373
+ MozAppearance: {
374
+ values: ["none", "auto", "menulist-button", "textfield"],
375
+ type: "select"
376
+ },
228
377
  // Outline
229
378
  outline: { type: "string" },
230
379
  outlineWidth: { type: "string" },
@@ -273,6 +422,41 @@ var CSS_PROPERTIES_DEFINITION = {
273
422
  values: ["auto", "smooth"],
274
423
  type: "select"
275
424
  },
425
+ scrollSnapType: { type: "string" },
426
+ scrollSnapAlign: {
427
+ values: ["none", "start", "end", "center"],
428
+ type: "select"
429
+ },
430
+ scrollSnapStop: {
431
+ values: ["normal", "always"],
432
+ type: "select"
433
+ },
434
+ scrollMarginTop: { type: "string" },
435
+ scrollMarginRight: { type: "string" },
436
+ scrollMarginBottom: { type: "string" },
437
+ scrollMarginLeft: { type: "string" },
438
+ scrollPaddingTop: { type: "string" },
439
+ scrollPaddingRight: { type: "string" },
440
+ scrollPaddingBottom: { type: "string" },
441
+ scrollPaddingLeft: { type: "string" },
442
+ overscrollBehavior: {
443
+ values: ["auto", "contain", "none"],
444
+ type: "select"
445
+ },
446
+ overscrollBehaviorX: {
447
+ values: ["auto", "contain", "none"],
448
+ type: "select"
449
+ },
450
+ overscrollBehaviorY: {
451
+ values: ["auto", "contain", "none"],
452
+ type: "select"
453
+ },
454
+ // CSS Containment — container queries depend on these.
455
+ containerType: {
456
+ values: ["normal", "size", "inline-size"],
457
+ type: "select"
458
+ },
459
+ containerName: { type: "string" },
276
460
  accentColor: { type: "string" },
277
461
  // SVG
278
462
  stroke: { type: "string" },
@@ -663,4 +847,4 @@ export {
663
847
  logRuntimeError,
664
848
  logNetworkError
665
849
  };
666
- //# sourceMappingURL=chunk-LPVETICS.js.map
850
+ //# sourceMappingURL=chunk-H3GJ4H2U.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../lib/shared/cssProperties.ts", "../../lib/shared/errorLogger.ts"],
4
+ "sourcesContent": ["/**\n * CSS Property Definition structure\n */\ninterface CSSPropertyDefinition {\n values?: readonly string[];\n type?: 'string' | 'select' | 'boolean' | 'number';\n}\n\n/**\n * CSS Properties with their valid values and metadata\n * Used for autocomplete suggestions for both property names and values\n */\nexport const CSS_PROPERTIES_DEFINITION: Record<string, CSSPropertyDefinition> = {\n // Display & Layout\n display: {\n values: ['block', 'flex', 'grid', 'inline', 'inline-block', 'inline-flex', 'inline-grid', 'none'],\n type: 'select',\n },\n position: {\n values: ['static', 'relative', 'absolute', 'fixed', 'sticky'],\n type: 'select',\n },\n top: { type: 'string' },\n right: { type: 'string' },\n bottom: { type: 'string' },\n left: { type: 'string' },\n inset: { type: 'string' },\n zIndex: { type: 'number' },\n\n // Dimensions\n width: { type: 'string' },\n height: { type: 'string' },\n minWidth: { type: 'string' },\n maxWidth: { type: 'string' },\n minHeight: { type: 'string' },\n maxHeight: { type: 'string' },\n aspectRatio: { type: 'string' },\n\n // Spacing\n margin: { type: 'string' },\n marginTop: { type: 'string' },\n marginRight: { type: 'string' },\n marginBottom: { type: 'string' },\n marginLeft: { type: 'string' },\n padding: { type: 'string' },\n paddingTop: { type: 'string' },\n paddingRight: { type: 'string' },\n paddingBottom: { type: 'string' },\n paddingLeft: { type: 'string' },\n gap: { type: 'string' },\n rowGap: { type: 'string' },\n columnGap: { type: 'string' },\n\n // Borders\n border: { type: 'string' },\n borderWidth: { type: 'string' },\n borderStyle: {\n values: ['solid', 'dashed', 'dotted', 'double', 'groove', 'ridge', 'inset', 'outset', 'none'],\n type: 'select',\n },\n borderColor: { type: 'string' },\n borderTop: { type: 'string' },\n borderRight: { type: 'string' },\n borderBottom: { type: 'string' },\n borderLeft: { type: 'string' },\n borderRadius: { type: 'string' },\n borderTopLeftRadius: { type: 'string' },\n borderTopRightRadius: { type: 'string' },\n borderBottomLeftRadius: { type: 'string' },\n borderBottomRightRadius: { type: 'string' },\n\n // Background & Colors\n background: { type: 'string' },\n backgroundColor: { type: 'string' },\n backgroundImage: { type: 'string' },\n backgroundSize: {\n values: ['auto', 'cover', 'contain'],\n type: 'select',\n },\n backgroundPosition: {\n values: ['top', 'bottom', 'left', 'right', 'center'],\n type: 'select',\n },\n backgroundRepeat: {\n values: ['repeat', 'repeat-x', 'repeat-y', 'no-repeat'],\n type: 'select',\n },\n backgroundAttachment: {\n values: ['scroll', 'fixed', 'local'],\n type: 'select',\n },\n backgroundOrigin: {\n values: ['border-box', 'padding-box', 'content-box'],\n type: 'select',\n },\n backgroundBlendMode: {\n values: ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'],\n type: 'select',\n },\n // Gradient-text recipe (`background: linear-gradient(...); background-clip:\n // text; -webkit-background-clip: text; -webkit-text-fill-color: transparent`).\n // The `Webkit*` capitalization is intentional \u2014 utilityClassMapper's\n // camel\u2192kebab emitter only prepends `-` when the first letter is uppercase,\n // so `WebkitBackgroundClip` round-trips back to `-webkit-background-clip`.\n backgroundClip: {\n values: ['border-box', 'padding-box', 'content-box', 'text'],\n type: 'select',\n },\n WebkitBackgroundClip: {\n values: ['border-box', 'padding-box', 'content-box', 'text'],\n type: 'select',\n },\n WebkitTextFillColor: { type: 'string' },\n WebkitTextStroke: { type: 'string' },\n WebkitTextStrokeWidth: { type: 'string' },\n WebkitTextStrokeColor: { type: 'string' },\n color: { type: 'string' },\n opacity: { type: 'number' },\n\n // Flexbox\n flex: { type: 'string' },\n flexDirection: {\n values: ['row', 'column', 'row-reverse', 'column-reverse'],\n type: 'select',\n },\n flexWrap: {\n values: ['nowrap', 'wrap', 'wrap-reverse'],\n type: 'select',\n },\n flexFlow: { type: 'string' },\n justifyContent: {\n values: ['flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'space-evenly'],\n type: 'select',\n },\n alignItems: {\n values: ['flex-start', 'flex-end', 'center', 'stretch', 'baseline'],\n type: 'select',\n },\n alignContent: {\n values: ['flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'stretch'],\n type: 'select',\n },\n alignSelf: {\n values: ['auto', 'flex-start', 'flex-end', 'center', 'stretch', 'baseline'],\n type: 'select',\n },\n flexGrow: { type: 'number' },\n flexShrink: { type: 'number' },\n flexBasis: { type: 'string' },\n order: { type: 'number' },\n\n // Grid\n grid: { type: 'string' },\n gridTemplateColumns: { type: 'string' },\n gridTemplateRows: { type: 'string' },\n gridTemplateAreas: { type: 'string' },\n gridGap: { type: 'string' },\n gridColumn: { type: 'string' },\n gridRow: { type: 'string' },\n gridArea: { type: 'string' },\n gridAutoFlow: {\n values: ['row', 'column', 'row dense', 'column dense'],\n type: 'select',\n },\n gridAutoColumns: { type: 'string' },\n gridAutoRows: { type: 'string' },\n justifyItems: {\n values: ['start', 'end', 'center', 'stretch'],\n type: 'select',\n },\n justifySelf: {\n values: ['auto', 'start', 'end', 'center', 'stretch'],\n type: 'select',\n },\n placeContent: { type: 'string' },\n placeItems: { type: 'string' },\n placeSelf: { type: 'string' },\n\n // Text & Font\n fontSize: { type: 'string' },\n fontWeight: {\n values: ['100', '200', '300', '400', '500', '600', '700', '800', '900', 'normal', 'bold'],\n type: 'select',\n },\n fontFamily: { type: 'string' },\n fontStyle: {\n values: ['normal', 'italic', 'oblique'],\n type: 'select',\n },\n lineHeight: { type: 'string' },\n textAlign: {\n values: ['left', 'right', 'center', 'justify', 'start', 'end'],\n type: 'select',\n },\n textDecoration: {\n values: ['none', 'underline', 'overline', 'line-through'],\n type: 'select',\n },\n textDecorationLine: {\n values: ['none', 'underline', 'overline', 'line-through'],\n type: 'select',\n },\n textDecorationStyle: {\n values: ['solid', 'double', 'dotted', 'dashed', 'wavy'],\n type: 'select',\n },\n textDecorationColor: { type: 'string' },\n textDecorationThickness: { type: 'string' },\n textUnderlineOffset: { type: 'string' },\n textUnderlinePosition: { type: 'string' },\n textTransform: {\n values: ['none', 'capitalize', 'uppercase', 'lowercase'],\n type: 'select',\n },\n textRendering: {\n values: ['auto', 'optimizeSpeed', 'optimizeLegibility', 'geometricPrecision'],\n type: 'select',\n },\n fontVariant: { type: 'string' },\n fontStretch: { type: 'string' },\n fontFeatureSettings: { type: 'string' },\n fontVariationSettings: { type: 'string' },\n fontKerning: {\n values: ['auto', 'normal', 'none'],\n type: 'select',\n },\n WebkitFontSmoothing: {\n values: ['auto', 'none', 'antialiased', 'subpixel-antialiased'],\n type: 'select',\n },\n MozOsxFontSmoothing: {\n values: ['auto', 'grayscale'],\n type: 'select',\n },\n hyphens: {\n values: ['none', 'manual', 'auto'],\n type: 'select',\n },\n WebkitHyphens: {\n values: ['none', 'manual', 'auto'],\n type: 'select',\n },\n writingMode: {\n values: ['horizontal-tb', 'vertical-rl', 'vertical-lr'],\n type: 'select',\n },\n direction: {\n values: ['ltr', 'rtl'],\n type: 'select',\n },\n tabSize: { type: 'string' },\n wordWrap: {\n values: ['normal', 'break-word'],\n type: 'select',\n },\n letterSpacing: { type: 'string' },\n wordSpacing: { type: 'string' },\n wordBreak: {\n values: ['normal', 'break-all', 'keep-all', 'break-word'],\n type: 'select',\n },\n overflowWrap: {\n values: ['normal', 'break-word', 'anywhere'],\n type: 'select',\n },\n textWrap: {\n values: ['wrap', 'nowrap', 'balance', 'pretty', 'stable'],\n type: 'select',\n },\n textIndent: { type: 'string' },\n verticalAlign: {\n values: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super'],\n type: 'select',\n },\n\n // Box Shadow & Effects\n boxShadow: { type: 'string' },\n textShadow: { type: 'string' },\n filter: { type: 'string' },\n backdropFilter: { type: 'string' },\n WebkitBackdropFilter: { type: 'string' },\n transform: { type: 'string' },\n transformOrigin: { type: 'string' },\n transformStyle: {\n values: ['flat', 'preserve-3d'],\n type: 'select',\n },\n perspective: { type: 'string' },\n perspectiveOrigin: { type: 'string' },\n transition: { type: 'string' },\n transitionProperty: { type: 'string' },\n transitionDuration: { type: 'string' },\n transitionTimingFunction: { type: 'string' },\n transitionDelay: { type: 'string' },\n animation: { type: 'string' },\n backfaceVisibility: {\n values: ['visible', 'hidden'],\n type: 'select',\n },\n mixBlendMode: {\n values: ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'],\n type: 'select',\n },\n isolation: {\n values: ['auto', 'isolate'],\n type: 'select',\n },\n willChange: { type: 'string' },\n imageRendering: {\n values: ['auto', 'crisp-edges', 'pixelated', 'smooth'],\n type: 'select',\n },\n clipPath: { type: 'string' },\n WebkitClipPath: { type: 'string' },\n // Mask family \u2014 gradient/SVG masks. Emit both the standard and `-webkit-`\n // form because Safari still needs the prefix.\n maskImage: { type: 'string' },\n WebkitMaskImage: { type: 'string' },\n maskSize: { type: 'string' },\n WebkitMaskSize: { type: 'string' },\n maskPosition: { type: 'string' },\n WebkitMaskPosition: { type: 'string' },\n maskRepeat: { type: 'string' },\n WebkitMaskRepeat: { type: 'string' },\n maskOrigin: { type: 'string' },\n WebkitMaskOrigin: { type: 'string' },\n maskClip: { type: 'string' },\n WebkitMaskClip: { type: 'string' },\n maskComposite: { type: 'string' },\n WebkitMaskComposite: { type: 'string' },\n maskMode: { type: 'string' },\n maskType: {\n values: ['luminance', 'alpha'],\n type: 'select',\n },\n\n // Overflow & Content\n overflow: {\n values: ['visible', 'hidden', 'scroll', 'auto'],\n type: 'select',\n },\n overflowX: {\n values: ['visible', 'hidden', 'scroll', 'auto'],\n type: 'select',\n },\n overflowY: {\n values: ['visible', 'hidden', 'scroll', 'auto'],\n type: 'select',\n },\n whiteSpace: {\n values: ['normal', 'nowrap', 'pre', 'pre-wrap', 'pre-line'],\n type: 'select',\n },\n textOverflow: {\n values: ['clip', 'ellipsis'],\n type: 'select',\n },\n visibility: {\n values: ['visible', 'hidden', 'collapse'],\n type: 'select',\n },\n content: { type: 'string' },\n\n // Cursor & Interaction\n cursor: {\n values: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'not-allowed', 'help'],\n type: 'select',\n },\n pointerEvents: {\n values: ['auto', 'none'],\n type: 'select',\n },\n userSelect: {\n values: ['auto', 'none', 'text', 'all'],\n type: 'select',\n },\n WebkitUserSelect: {\n values: ['auto', 'none', 'text', 'all'],\n type: 'select',\n },\n MozUserSelect: {\n values: ['auto', 'none', 'text', 'all'],\n type: 'select',\n },\n caretColor: { type: 'string' },\n appearance: {\n values: ['none', 'auto', 'menulist-button', 'textfield'],\n type: 'select',\n },\n WebkitAppearance: {\n values: ['none', 'auto', 'menulist-button', 'textfield'],\n type: 'select',\n },\n MozAppearance: {\n values: ['none', 'auto', 'menulist-button', 'textfield'],\n type: 'select',\n },\n\n // Outline\n outline: { type: 'string' },\n outlineWidth: { type: 'string' },\n outlineStyle: {\n values: ['none', 'solid', 'dashed', 'dotted', 'double', 'groove', 'ridge', 'inset', 'outset'],\n type: 'select',\n },\n outlineColor: { type: 'string' },\n outlineOffset: { type: 'string' },\n\n // Lists\n listStyle: { type: 'string' },\n listStyleType: {\n values: ['none', 'disc', 'circle', 'square', 'decimal', 'decimal-leading-zero', 'lower-roman', 'upper-roman', 'lower-alpha', 'upper-alpha'],\n type: 'select',\n },\n listStylePosition: {\n values: ['inside', 'outside'],\n type: 'select',\n },\n\n // Miscellaneous\n float: {\n values: ['left', 'right', 'none'],\n type: 'select',\n },\n clear: {\n values: ['left', 'right', 'both', 'none'],\n type: 'select',\n },\n boxSizing: {\n values: ['content-box', 'border-box'],\n type: 'select',\n },\n objectFit: {\n values: ['fill', 'contain', 'cover', 'scale-down'],\n type: 'select',\n },\n objectPosition: {\n values: ['top', 'bottom', 'left', 'right', 'center'],\n type: 'select',\n },\n resize: {\n values: ['none', 'both', 'horizontal', 'vertical'],\n type: 'select',\n },\n scrollBehavior: {\n values: ['auto', 'smooth'],\n type: 'select',\n },\n scrollSnapType: { type: 'string' },\n scrollSnapAlign: {\n values: ['none', 'start', 'end', 'center'],\n type: 'select',\n },\n scrollSnapStop: {\n values: ['normal', 'always'],\n type: 'select',\n },\n scrollMarginTop: { type: 'string' },\n scrollMarginRight: { type: 'string' },\n scrollMarginBottom: { type: 'string' },\n scrollMarginLeft: { type: 'string' },\n scrollPaddingTop: { type: 'string' },\n scrollPaddingRight: { type: 'string' },\n scrollPaddingBottom: { type: 'string' },\n scrollPaddingLeft: { type: 'string' },\n overscrollBehavior: {\n values: ['auto', 'contain', 'none'],\n type: 'select',\n },\n overscrollBehaviorX: {\n values: ['auto', 'contain', 'none'],\n type: 'select',\n },\n overscrollBehaviorY: {\n values: ['auto', 'contain', 'none'],\n type: 'select',\n },\n // CSS Containment \u2014 container queries depend on these.\n containerType: {\n values: ['normal', 'size', 'inline-size'],\n type: 'select',\n },\n containerName: { type: 'string' },\n accentColor: { type: 'string' },\n\n // SVG\n stroke: { type: 'string' },\n strokeWidth: { type: 'string' },\n strokeDasharray: { type: 'string' },\n strokeDashoffset: { type: 'string' },\n strokeLinecap: {\n values: ['butt', 'round', 'square'],\n type: 'select',\n },\n strokeLinejoin: {\n values: ['miter', 'round', 'bevel'],\n type: 'select',\n },\n strokeOpacity: { type: 'number' },\n fill: { type: 'string' },\n fillOpacity: { type: 'number' },\n fillRule: {\n values: ['nonzero', 'evenodd'],\n type: 'select',\n },\n};\n\n/**\n * Common CSS properties for autocomplete suggestions (camelCase for React/JS)\n * Derived from CSS_PROPERTIES_DEFINITION keys\n */\nexport const CSS_PROPERTIES = Object.keys(CSS_PROPERTIES_DEFINITION);\n\n/**\n * Popularity tiers for CSS properties (lower = more common).\n * Properties not listed default to tier 3.\n * Used to sort autocomplete suggestions within each match group.\n */\nconst CSS_PROPERTY_PRIORITY: Record<string, number> = {\n // Tier 1: Most commonly used\n display: 1,\n position: 1,\n width: 1,\n height: 1,\n margin: 1,\n padding: 1,\n color: 1,\n backgroundColor: 1,\n fontSize: 1,\n fontWeight: 1,\n border: 1,\n borderRadius: 1,\n flex: 1,\n flexDirection: 1,\n justifyContent: 1,\n alignItems: 1,\n gap: 1,\n opacity: 1,\n overflow: 1,\n zIndex: 1,\n top: 1,\n right: 1,\n bottom: 1,\n left: 1,\n cursor: 1,\n background: 1,\n boxShadow: 1,\n transition: 1,\n transform: 1,\n lineHeight: 1,\n textAlign: 1,\n\n // Tier 2: Common but less frequent\n maxWidth: 2,\n maxHeight: 2,\n minWidth: 3,\n minHeight: 3,\n marginTop: 2,\n marginBottom: 2,\n marginLeft: 2,\n marginRight: 2,\n paddingTop: 2,\n paddingBottom: 2,\n paddingLeft: 2,\n paddingRight: 2,\n fontFamily: 2,\n fontStyle: 2,\n textDecoration: 2,\n textTransform: 2,\n letterSpacing: 2,\n borderWidth: 2,\n borderStyle: 2,\n borderColor: 2,\n borderBottom: 2,\n borderTop: 2,\n flexWrap: 2,\n flexGrow: 2,\n flexShrink: 2,\n flexBasis: 2,\n alignSelf: 2,\n gridTemplateColumns: 2,\n gridTemplateRows: 2,\n backgroundImage: 2,\n backgroundSize: 2,\n backgroundPosition: 2,\n whiteSpace: 2,\n textOverflow: 2,\n visibility: 2,\n pointerEvents: 2,\n userSelect: 2,\n boxSizing: 2,\n objectFit: 2,\n filter: 2,\n animation: 2,\n outline: 2,\n inset: 2,\n};\n\nfunction getPropertyPriority(property: string): number {\n return CSS_PROPERTY_PRIORITY[property] ?? 3;\n}\n\n/**\n * CSS Property Groups for organizing styles in the editor\n * Order determines display order in the UI\n */\nexport const CSS_PROPERTY_GROUPS: Record<string, string[]> = {\n 'Layout': ['display'],\n 'Spacing': ['margin', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft', 'padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft'],\n 'Size': ['width', 'height', 'minWidth', 'maxWidth', 'minHeight', 'maxHeight', 'aspectRatio'],\n 'Position': ['position', 'top', 'right', 'bottom', 'left', 'inset', 'zIndex'],\n 'Flexbox': ['flex', 'flexDirection', 'flexWrap', 'flexFlow', 'justifyContent', 'alignItems', 'alignContent', 'gap', 'rowGap', 'columnGap', 'alignSelf', 'flexGrow', 'flexShrink', 'flexBasis', 'order'],\n 'Grid': ['grid', 'gridTemplateColumns', 'gridTemplateRows', 'gridTemplateAreas', 'gridGap', 'gridColumn', 'gridRow', 'gridArea', 'gridAutoFlow', 'gridAutoColumns', 'gridAutoRows', 'justifyItems', 'justifySelf', 'placeContent', 'placeItems', 'placeSelf'],\n 'Typography': ['fontWeight', 'fontSize', 'fontFamily', 'fontStyle', 'lineHeight', 'color', 'textAlign', 'textDecoration', 'textTransform', 'letterSpacing', 'wordSpacing', 'wordBreak', 'overflowWrap', 'textIndent', 'verticalAlign'],\n 'Background': ['background', 'backgroundColor', 'backgroundImage', 'backgroundSize', 'backgroundPosition', 'backgroundRepeat', 'opacity'],\n 'Borders': ['borderRadius', 'borderTopLeftRadius', 'borderTopRightRadius', 'borderBottomLeftRadius', 'borderBottomRightRadius', 'border', 'borderWidth', 'borderStyle', 'borderColor', 'borderTop', 'borderRight', 'borderBottom', 'borderLeft'],\n 'Outline': ['outline', 'outlineWidth', 'outlineStyle', 'outlineColor', 'outlineOffset'],\n 'Effects': ['boxShadow', 'textShadow', 'filter', 'backdropFilter', 'transform', 'transformOrigin', 'transition', 'animation', 'backfaceVisibility', 'mixBlendMode', 'clipPath'],\n 'Overflow': ['overflow', 'overflowX', 'overflowY', 'whiteSpace', 'textOverflow', 'visibility', 'content'],\n 'Interaction': ['cursor', 'pointerEvents', 'userSelect'],\n 'Lists': ['listStyle', 'listStyleType', 'listStylePosition'],\n 'Other': ['float', 'clear', 'boxSizing', 'objectFit', 'objectPosition', 'resize', 'scrollBehavior', 'accentColor'],\n 'SVG': ['stroke', 'strokeWidth', 'strokeDasharray', 'strokeDashoffset', 'strokeLinecap', 'strokeLinejoin', 'strokeOpacity', 'fill', 'fillOpacity', 'fillRule'],\n};\n\n/**\n * Get the group name for a CSS property\n * @param propertyName - The CSS property name\n * @returns The group name or 'Other' if not found\n */\nexport function getPropertyGroup(propertyName: string): string {\n for (const [groupName, properties] of Object.entries(CSS_PROPERTY_GROUPS)) {\n if (properties.includes(propertyName)) {\n return groupName;\n }\n }\n return 'Other';\n}\n\n/**\n * Subset of CSS properties shown as \"always-visible\" rows in the visual style\n * editor mode (Webflow-like). Each property here renders even when unset, so\n * the user can see at a glance which properties are available and click an\n * empty row to start typing a value.\n *\n * Keys must be group names from CSS_PROPERTY_GROUPS so the visual editor can\n * reuse the same group headers as list mode.\n */\nexport const VISUAL_MODE_PROPERTIES: Record<string, string[]> = {\n 'Layout': ['display'],\n 'Grid': ['gridTemplateColumns'],\n 'Flexbox': ['flexDirection', 'flexWrap', 'justifyContent', 'alignItems', 'gap', 'flexGrow', 'flexShrink', 'flexBasis'],\n 'Spacing': ['margin', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft', 'padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft'],\n 'Size': ['width', 'height', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight'],\n 'Position': ['position', 'top', 'right', 'bottom', 'left', 'zIndex'],\n 'Typography': ['fontFamily', 'fontWeight', 'fontSize', 'lineHeight', 'color', 'letterSpacing', 'textAlign', 'textTransform', 'textDecoration'],\n 'Background': ['backgroundColor', 'backgroundImage', 'backgroundSize', 'backgroundPosition', 'backgroundRepeat', 'opacity'],\n 'Borders': ['borderRadius', 'borderWidth', 'borderStyle', 'borderColor'],\n 'Effects': ['boxShadow', 'transform', 'transition', 'filter'],\n 'Overflow': ['overflow', 'whiteSpace'],\n 'Interaction': ['cursor', 'pointerEvents'],\n};\n\nconst VISUAL_MODE_PROPERTIES_SET = new Set(\n Object.values(VISUAL_MODE_PROPERTIES).flat()\n);\n\n/**\n * True if `prop` belongs to the always-visible visual-mode list.\n */\nexport function isVisualModeProperty(prop: string): boolean {\n return VISUAL_MODE_PROPERTIES_SET.has(prop);\n}\n\n/**\n * Context used by visual-mode visibility rules. Captures everything a rule\n * needs to decide whether a property row is meaningful for the currently\n * selected element. Built once per render in `StyleEditor`.\n */\nexport interface VisualModeRuleContext {\n /** Effective `display` of the selected element \u2014 getComputedStyle().display\n * with declared (instance/inherited/effective) merge as fallback when the\n * iframe hasn't loaded yet. Defaults to 'block'. */\n display: string;\n /** Effective `display` of the DOM parent \u2014 used for flex/grid item props\n * whose applicability depends on the parent's layout mode. '' when no\n * parent is reachable (root element, iframe missing). */\n parentDisplay: string;\n /** Effective `position` of the selected element. Defaults to 'static'. */\n position: string;\n /** Lowercase HTML tag name of the selected element ('div', 'img', 'ul'\u2026). */\n tagName: string;\n /** True if any of paddingTop / paddingRight / paddingBottom / paddingLeft\n * is set anywhere in the cascade (instance + inherited + effective).\n * When true, the panel shows the four longhand rows and hides `padding`. */\n hasPaddingLonghand: boolean;\n /** Same as `hasPaddingLonghand` for the four `margin*` longhands. */\n hasMarginLonghand: boolean;\n /** True if `backgroundImage` (or the `background` shorthand) is set anywhere\n * in the cascade. Drives visibility of background-image-only properties\n * like `backgroundPosition` / `backgroundSize` / `backgroundRepeat`. */\n hasBackgroundImage: boolean;\n}\n\nexport type VisualModeRule = (ctx: VisualModeRuleContext) => boolean;\n\nconst isFlexDisplay = (d: string) => d === 'flex' || d === 'inline-flex';\nconst isGridDisplay = (d: string) => d === 'grid' || d === 'inline-grid';\nconst isListTag = (t: string) => t === 'ul' || t === 'ol' || t === 'li';\nconst isMediaTag = (t: string) => t === 'img' || t === 'video';\n\n/**\n * Visibility rules for the visual-mode style panel. Each entry is a predicate\n * that returns true when the row should be rendered for the current element\n * context. Properties without an entry are always visible. Properties that\n * are *explicitly set* on the element bypass these rules (the explicit-value\n * override is enforced by the caller, not here).\n */\nexport const VISUAL_MODE_RULES: Record<string, VisualModeRule> = {\n // Flex/Grid CONTAINER props \u2014 own display must be flex/grid.\n flexDirection: ctx => isFlexDisplay(ctx.display),\n flexWrap: ctx => isFlexDisplay(ctx.display),\n justifyContent: ctx => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n alignItems: ctx => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n alignContent: ctx => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n gap: ctx => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n rowGap: ctx => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n columnGap: ctx => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n gridTemplateColumns: ctx => isGridDisplay(ctx.display),\n gridTemplateRows: ctx => isGridDisplay(ctx.display),\n gridTemplateAreas: ctx => isGridDisplay(ctx.display),\n gridGap: ctx => isGridDisplay(ctx.display),\n gridAutoFlow: ctx => isGridDisplay(ctx.display),\n gridAutoColumns: ctx => isGridDisplay(ctx.display),\n gridAutoRows: ctx => isGridDisplay(ctx.display),\n justifyItems: ctx => isGridDisplay(ctx.display),\n placeItems: ctx => isGridDisplay(ctx.display),\n placeContent: ctx => isGridDisplay(ctx.display),\n\n // Flex/Grid ITEM props \u2014 PARENT display must be flex/grid.\n flex: ctx => isFlexDisplay(ctx.parentDisplay),\n flexFlow: ctx => isFlexDisplay(ctx.parentDisplay),\n flexGrow: ctx => isFlexDisplay(ctx.parentDisplay),\n flexShrink: ctx => isFlexDisplay(ctx.parentDisplay),\n flexBasis: ctx => isFlexDisplay(ctx.parentDisplay),\n alignSelf: ctx => isFlexDisplay(ctx.parentDisplay) || isGridDisplay(ctx.parentDisplay),\n justifySelf: ctx => isGridDisplay(ctx.parentDisplay),\n placeSelf: ctx => isGridDisplay(ctx.parentDisplay),\n order: ctx => isFlexDisplay(ctx.parentDisplay) || isGridDisplay(ctx.parentDisplay),\n gridArea: ctx => isGridDisplay(ctx.parentDisplay),\n gridColumn: ctx => isGridDisplay(ctx.parentDisplay),\n gridRow: ctx => isGridDisplay(ctx.parentDisplay),\n\n // Position-dependent inset properties.\n top: ctx => ctx.position !== 'static',\n right: ctx => ctx.position !== 'static',\n bottom: ctx => ctx.position !== 'static',\n left: ctx => ctx.position !== 'static',\n inset: ctx => ctx.position !== 'static',\n zIndex: ctx => ctx.position !== 'static',\n\n // Tag-based.\n objectFit: ctx => isMediaTag(ctx.tagName),\n objectPosition: ctx => isMediaTag(ctx.tagName),\n listStyle: ctx => isListTag(ctx.tagName),\n listStyleType: ctx => isListTag(ctx.tagName),\n listStylePosition: ctx => isListTag(ctx.tagName),\n\n // Padding/margin shorthand-vs-longhand auto-toggle.\n // When ANY longhand is set, hide shorthand; otherwise hide longhands.\n padding: ctx => !ctx.hasPaddingLonghand,\n paddingTop: ctx => ctx.hasPaddingLonghand,\n paddingRight: ctx => ctx.hasPaddingLonghand,\n paddingBottom: ctx => ctx.hasPaddingLonghand,\n paddingLeft: ctx => ctx.hasPaddingLonghand,\n margin: ctx => !ctx.hasMarginLonghand,\n marginTop: ctx => ctx.hasMarginLonghand,\n marginRight: ctx => ctx.hasMarginLonghand,\n marginBottom: ctx => ctx.hasMarginLonghand,\n marginLeft: ctx => ctx.hasMarginLonghand,\n\n // Background-image-only props \u2014 meaningless without a background image.\n backgroundPosition: ctx => ctx.hasBackgroundImage,\n backgroundSize: ctx => ctx.hasBackgroundImage,\n backgroundRepeat: ctx => ctx.hasBackgroundImage,\n};\n\n/**\n * True if `prop` should be visible in the visual-mode panel given `ctx`.\n * Properties without an entry in `VISUAL_MODE_RULES` default to visible.\n * Callers are responsible for the explicit-value override (a property that\n * the user has set must remain visible regardless of the rule outcome).\n */\nexport function isVisualModeRowVisible(prop: string, ctx: VisualModeRuleContext): boolean {\n const rule = VISUAL_MODE_RULES[prop];\n return rule ? rule(ctx) : true;\n}\n\n/**\n * Check if property matches the abbreviation pattern\n * For example, \"bC\" matches \"backgroundColor\" (b\u2192b, C\u2192C capital letter)\n */\nfunction matchesAbbreviation(property: string, input: string): boolean {\n if (!input) return false;\n\n let propertyIndex = 0;\n\n for (let inputIndex = 0; inputIndex < input.length; inputIndex++) {\n const inputChar = input[inputIndex];\n let found = false;\n\n // Search from current position to end of property for a match at a word boundary\n while (propertyIndex < property.length) {\n const propChar = property[propertyIndex];\n // Word boundary = first character OR capital letter\n const isWordBoundary = propertyIndex === 0 ||\n (propChar === propChar.toUpperCase() && propChar !== propChar.toLowerCase());\n\n if (isWordBoundary && inputChar.toLowerCase() === propChar.toLowerCase()) {\n // Match found at word boundary\n found = true;\n propertyIndex++; // Move past this character for next search\n break;\n }\n\n propertyIndex++;\n }\n\n if (!found) {\n return false; // Couldn't find this input character at a word boundary\n }\n }\n\n return true;\n}\n\n/**\n * Direction-abbreviation shortcuts. When the user types one of these exact\n * inputs, the mapped property is forced to the top of the suggestions list\n * (ahead of startsWith matches like `placeContent` for \"pl\"). \"u\" stands for\n * \"up\" \u2014 a natural mnemonic for `Top`.\n */\nconst PROPERTY_SHORTCUTS: Record<string, string> = {\n pl: 'paddingLeft',\n pr: 'paddingRight',\n pt: 'paddingTop',\n pu: 'paddingTop',\n pb: 'paddingBottom',\n ml: 'marginLeft',\n mr: 'marginRight',\n mt: 'marginTop',\n mu: 'marginTop',\n mb: 'marginBottom',\n};\n\n/**\n * Filter CSS properties based on input value\n * Supports both startsWith matching and camelCase abbreviation matching\n */\nexport function filterCSSProperties(input: string): string[] {\n const normalizedInput = (input ?? '').trim();\n if (!normalizedInput) {\n return CSS_PROPERTIES.slice(0, 15); // Show first 15 by default\n }\n\n // First, try startsWith matching (exact prefix match)\n const startsWithMatches = CSS_PROPERTIES.filter(prop =>\n prop.toLowerCase().startsWith(normalizedInput.toLowerCase())\n );\n\n // Then, try abbreviation/fuzzy matching\n const abbreviationMatches = CSS_PROPERTIES.filter(prop =>\n matchesAbbreviation(prop, normalizedInput) &&\n !startsWithMatches.includes(prop) // Don't duplicate startsWith matches\n );\n\n // Sort each group by popularity, then combine: exact matches first, then fuzzy matches\n const byPriority = (a: string, b: string) =>\n getPropertyPriority(a) - getPropertyPriority(b);\n\n const combined = [\n ...startsWithMatches.sort(byPriority),\n ...abbreviationMatches.sort(byPriority),\n ];\n\n const shortcut = PROPERTY_SHORTCUTS[normalizedInput.toLowerCase()];\n if (shortcut) {\n return [shortcut, ...combined.filter(prop => prop !== shortcut)];\n }\n\n return combined;\n}\n\n/**\n * Get available values for a specific CSS property\n * @param propertyName - The CSS property name (e.g., 'flexDirection')\n * @returns Array of valid values for the property, or empty array if property has no predefined values\n */\nexport function getPropertyValues(propertyName: string): string[] {\n const values = CSS_PROPERTIES_DEFINITION[propertyName]?.values;\n return values ? Array.from(values) : [];\n}\n\n/**\n * Filter values for a specific CSS property based on input\n * Supports substring matching and returns values that contain the input\n * @param propertyName - The CSS property name (e.g., 'flexDirection')\n * @param input - The user input to filter values by\n * @returns Filtered array of valid values for the property\n */\nexport function filterPropertyValues(propertyName: string, input: string): string[] {\n const values = getPropertyValues(propertyName);\n if (!values.length) {\n return []; // No predefined values for this property\n }\n\n const normalizedInput = (input ?? '').trim().toLowerCase();\n if (!normalizedInput) {\n return values; // Return all values if no input\n }\n\n // Filter values that contain the input (substring match)\n return values.filter(value =>\n value.toLowerCase().includes(normalizedInput)\n );\n}\n\n/**\n * Get the property type for a CSS property\n * @param propertyName - The CSS property name\n * @returns The property type ('string' | 'select' | 'boolean' | 'number') or undefined\n */\nexport function getPropertyType(propertyName: string): 'string' | 'select' | 'boolean' | 'number' | undefined {\n return CSS_PROPERTIES_DEFINITION[propertyName]?.type;\n}\n\n/**\n * CSS properties whose numeric values are unitless by spec \u2014 `font-weight: 400`,\n * `line-height: 1.5`, `opacity: 0.8`, `z-index: 10`, etc. The auto-px commit\n * normalizer must NOT append `px` to bare numbers for these.\n */\nexport const UNITLESS_PROPERTIES: ReadonlySet<string> = new Set([\n 'fontWeight', 'lineHeight',\n 'opacity', 'fillOpacity', 'strokeOpacity', 'stopOpacity',\n 'zIndex', 'order',\n 'flexGrow', 'flexShrink', 'flex',\n 'columnCount', 'columns', 'tabSize', 'orphans', 'widows',\n 'gridRow', 'gridColumn', 'gridRowStart', 'gridRowEnd',\n 'gridColumnStart', 'gridColumnEnd',\n 'animationIterationCount',\n 'aspectRatio',\n 'scale',\n]);\n\n/**\n * Whether bare numeric values for `propertyName` should be treated as pixels at\n * commit time (e.g. typing `52` for `width` becomes `52px`). Unitless props,\n * `select`/`boolean` keyword props, and existing `number`-typed entries return false.\n */\nexport function appendsPxByDefault(propertyName: string): boolean {\n if (UNITLESS_PROPERTIES.has(propertyName)) return false;\n const def = CSS_PROPERTIES_DEFINITION[propertyName];\n if (def?.type === 'select' || def?.type === 'boolean' || def?.type === 'number') return false;\n return true;\n}\n", "/**\n * Error Logger\n * Centralized error logging with optional telemetry integration\n */\n\nimport type { ErrorCategory } from './errors';\n\ninterface ErrorLogEntry {\n location: string;\n category: ErrorCategory;\n error: unknown;\n context?: Record<string, unknown>;\n timestamp: number;\n}\n\ntype ErrorHandler = (entry: ErrorLogEntry) => void;\n\nlet errorHandler: ErrorHandler | null = null;\n\n/**\n * Set custom error handler (for telemetry integration)\n */\nexport function setErrorHandler(handler: ErrorHandler | null): void {\n errorHandler = handler;\n}\n\n/**\n * Check if running in development mode\n */\nfunction isDevelopment(): boolean {\n // Check for Node.js environment\n if (typeof process !== 'undefined' && process.env?.NODE_ENV) {\n return process.env.NODE_ENV === 'development';\n }\n // Browser environment - assume development if no production indicators\n return true;\n}\n\n/**\n * Log runtime error with context\n * Use for graceful degradation scenarios where error is handled but should be visible\n */\nexport function logRuntimeError(\n location: string,\n error: unknown,\n context?: Record<string, unknown>\n): void {\n const entry: ErrorLogEntry = {\n location,\n category: 'runtime',\n error,\n context,\n timestamp: Date.now(),\n };\n\n // Development: always log to console\n if (isDevelopment()) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[${location}] ${errorMessage}`, context ?? '');\n }\n\n // Custom handler (telemetry, etc.)\n errorHandler?.(entry);\n}\n\n/**\n * Log network/API error\n */\nexport function logNetworkError(\n location: string,\n error: unknown,\n context?: Record<string, unknown>\n): void {\n const entry: ErrorLogEntry = {\n location,\n category: 'network',\n error,\n context,\n timestamp: Date.now(),\n };\n\n if (isDevelopment()) {\n console.error(`[${location}] Network error:`, error, context ?? '');\n }\n\n errorHandler?.(entry);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }