meno-core 1.0.44 → 1.0.46

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 (79) hide show
  1. package/build-astro.ts +214 -63
  2. package/dist/bin/cli.js +2 -2
  3. package/dist/build-static.js +9 -9
  4. package/dist/chunks/{chunk-BXB6AX76.js → chunk-2QK6U5UK.js} +7 -3
  5. package/dist/chunks/chunk-2QK6U5UK.js.map +7 -0
  6. package/dist/chunks/{chunk-3XXLBUYA.js → chunk-77ZB6353.js} +33 -21
  7. package/dist/chunks/chunk-77ZB6353.js.map +7 -0
  8. package/dist/chunks/{chunk-5TJA272J.js → chunk-C6U5T5S5.js} +9 -9
  9. package/dist/chunks/{chunk-KPNSCQNA.js → chunk-FED5MME6.js} +285 -19
  10. package/dist/chunks/chunk-FED5MME6.js.map +7 -0
  11. package/dist/chunks/{chunk-5Z5VQRTJ.js → chunk-I7YIGZXT.js} +4 -4
  12. package/dist/chunks/{chunk-5Z5VQRTJ.js.map → chunk-I7YIGZXT.js.map} +2 -2
  13. package/dist/chunks/{chunk-46AVQA4V.js → chunk-IF3RATBY.js} +2 -2
  14. package/dist/chunks/{chunk-S2HXJTAF.js → chunk-KITQJYZV.js} +5 -1
  15. package/dist/chunks/chunk-KITQJYZV.js.map +7 -0
  16. package/dist/chunks/{chunk-G3WIPJN3.js → chunk-ORN7S4AP.js} +6 -6
  17. package/dist/chunks/{chunk-2NBGG2LJ.js → chunk-UUA5LEWF.js} +89 -4
  18. package/dist/chunks/{chunk-2NBGG2LJ.js.map → chunk-UUA5LEWF.js.map} +2 -2
  19. package/dist/chunks/{chunk-X5SH4HXS.js → chunk-XSWR3QLI.js} +33 -1
  20. package/dist/chunks/chunk-XSWR3QLI.js.map +7 -0
  21. package/dist/chunks/{chunk-YEJVSNVF.js → chunk-ZTKHJQ2Z.js} +14 -3
  22. package/dist/chunks/chunk-ZTKHJQ2Z.js.map +7 -0
  23. package/dist/chunks/{chunk-OLNQMCSR.js → chunk-ZWYDT3QJ.js} +3 -3
  24. package/dist/chunks/{configService-KYO3TXDS.js → configService-DYCUEURL.js} +4 -4
  25. package/dist/chunks/{constants-34NUGHQR.js → constants-GWBAD66U.js} +2 -2
  26. package/dist/entries/server-router.js +10 -10
  27. package/dist/lib/client/index.js +5 -5
  28. package/dist/lib/server/index.js +589 -145
  29. package/dist/lib/server/index.js.map +3 -3
  30. package/dist/lib/shared/index.js +14 -6
  31. package/dist/lib/shared/index.js.map +2 -2
  32. package/dist/lib/test-utils/index.js +1 -1
  33. package/lib/client/templateEngine.test.ts +64 -0
  34. package/lib/server/astro/astroEmitHelpers.ts +18 -0
  35. package/lib/server/astro/cmsPageEmitter.ts +31 -1
  36. package/lib/server/astro/componentEmitter.test.ts +59 -0
  37. package/lib/server/astro/componentEmitter.ts +43 -10
  38. package/lib/server/astro/cssCollector.ts +58 -11
  39. package/lib/server/astro/nodeToAstro.test.ts +397 -5
  40. package/lib/server/astro/nodeToAstro.ts +478 -63
  41. package/lib/server/astro/pageEmitter.ts +31 -1
  42. package/lib/server/astro/tailwindMapper.test.ts +119 -0
  43. package/lib/server/astro/tailwindMapper.ts +67 -1
  44. package/lib/server/runtime/httpServer.ts +12 -4
  45. package/lib/server/services/configService.ts +13 -0
  46. package/lib/server/ssr/htmlGenerator.ts +5 -2
  47. package/lib/server/ssr/jsCollector.ts +2 -2
  48. package/lib/server/ssr/ssrRenderer.test.ts +32 -0
  49. package/lib/server/ssr/ssrRenderer.ts +26 -11
  50. package/lib/shared/constants.ts +9 -2
  51. package/lib/shared/cssGeneration.test.ts +109 -3
  52. package/lib/shared/cssGeneration.ts +109 -13
  53. package/lib/shared/cssNamedColors.ts +47 -0
  54. package/lib/shared/cssProperties.ts +99 -4
  55. package/lib/shared/index.ts +1 -0
  56. package/lib/shared/nodeUtils.ts +28 -0
  57. package/lib/shared/responsiveScaling.test.ts +20 -3
  58. package/lib/shared/responsiveScaling.ts +55 -1
  59. package/lib/shared/responsiveStyleUtils.test.ts +7 -8
  60. package/lib/shared/responsiveStyleUtils.ts +6 -7
  61. package/lib/shared/types/components.ts +1 -1
  62. package/lib/shared/types/variables.test.ts +9 -2
  63. package/lib/shared/types/variables.ts +5 -1
  64. package/lib/shared/utilityClassMapper.ts +14 -1
  65. package/lib/shared/validation/propValidator.ts +6 -0
  66. package/lib/shared/validation/schemas.ts +2 -2
  67. package/package.json +1 -1
  68. package/dist/chunks/chunk-3XXLBUYA.js.map +0 -7
  69. package/dist/chunks/chunk-BXB6AX76.js.map +0 -7
  70. package/dist/chunks/chunk-KPNSCQNA.js.map +0 -7
  71. package/dist/chunks/chunk-S2HXJTAF.js.map +0 -7
  72. package/dist/chunks/chunk-X5SH4HXS.js.map +0 -7
  73. package/dist/chunks/chunk-YEJVSNVF.js.map +0 -7
  74. /package/dist/chunks/{chunk-5TJA272J.js.map → chunk-C6U5T5S5.js.map} +0 -0
  75. /package/dist/chunks/{chunk-46AVQA4V.js.map → chunk-IF3RATBY.js.map} +0 -0
  76. /package/dist/chunks/{chunk-G3WIPJN3.js.map → chunk-ORN7S4AP.js.map} +0 -0
  77. /package/dist/chunks/{chunk-OLNQMCSR.js.map → chunk-ZWYDT3QJ.js.map} +0 -0
  78. /package/dist/chunks/{configService-KYO3TXDS.js.map → configService-DYCUEURL.js.map} +0 -0
  79. /package/dist/chunks/{constants-34NUGHQR.js.map → constants-GWBAD66U.js.map} +0 -0
@@ -272,8 +272,8 @@ function createBunServer(options) {
272
272
  const server = Bun.serve(bunConfig);
273
273
  return {
274
274
  port: server.port ?? port,
275
- stop() {
276
- server.stop();
275
+ stop(force) {
276
+ server.stop(force === true);
277
277
  }
278
278
  };
279
279
  }
@@ -391,7 +391,7 @@ async function createNodeServer(options) {
391
391
  const actualPort = typeof addr === "object" && addr ? addr.port : port;
392
392
  resolve({
393
393
  port: actualPort,
394
- stop() {
394
+ stop(_force) {
395
395
  server.close();
396
396
  }
397
397
  });
@@ -464,4 +464,4 @@ export {
464
464
  resolveProjectPath,
465
465
  resolvePackagePath
466
466
  };
467
- //# sourceMappingURL=chunk-5Z5VQRTJ.js.map
467
+ //# sourceMappingURL=chunk-I7YIGZXT.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../lib/server/runtime/bundler.ts", "../../lib/server/runtime/httpServer.ts", "../../lib/server/runtime/index.ts", "../../lib/server/projectContext.ts"],
4
- "sourcesContent": ["/**\n * Runtime-agnostic bundler abstraction.\n * Uses Bun.build when available, falls back to esbuild for Node.js.\n */\n\nconst isBun = typeof (globalThis as any).Bun !== 'undefined';\n\nexport interface BundleResult {\n code: string;\n success: boolean;\n errors: string[];\n}\n\nexport interface BundleOptions {\n target?: 'browser' | 'node';\n format?: 'esm' | 'cjs';\n minify?: boolean;\n sourcemap?: 'inline' | 'external' | boolean;\n /** When true, throw on build errors instead of returning them */\n throw?: boolean;\n}\n\n/**\n * Bundle a file entry point.\n * Returns the bundled code as a string.\n */\nexport async function bundleFile(\n entrypoint: string,\n opts: BundleOptions = {},\n): Promise<BundleResult> {\n if (isBun) {\n return bundleWithBun(entrypoint, opts);\n }\n return bundleWithEsbuild(entrypoint, opts);\n}\n\n/**\n * Minify JavaScript code.\n */\nexport async function minifyJS(code: string): Promise<BundleResult> {\n if (isBun) {\n return minifyWithBun(code);\n }\n return minifyWithEsbuild(code);\n}\n\n/**\n * Validate JavaScript syntax (check for errors without producing output).\n */\nexport async function validateJS(code: string): Promise<string | null> {\n try {\n if (isBun) {\n return await validateWithBun(code);\n }\n return await validateWithEsbuild(code);\n } catch {\n // Validation not available (e.g., Cloudflare Workers) \u2014 skip and trust the JS\n return null;\n }\n}\n\n// \u2500\u2500 Bun implementations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function bundleWithBun(\n entrypoint: string,\n opts: BundleOptions,\n): Promise<BundleResult> {\n try {\n const result = await Bun.build({\n entrypoints: [entrypoint],\n target: opts.target || 'browser',\n format: opts.format || 'esm',\n minify: opts.minify ?? false,\n sourcemap: opts.sourcemap === true ? 'inline' : (opts.sourcemap || 'none'),\n throw: opts.throw ?? false,\n });\n\n if (result.success && result.outputs[0]) {\n const code = await result.outputs[0].text();\n return { code, success: true, errors: [] };\n }\n\n const errors = (result.logs || []).map((log: any) => {\n const parts: string[] = [];\n if (log.position?.file) parts.push(`File: ${log.position.file}`);\n if (log.position?.line) parts.push(`Line ${log.position.line}:${log.position.column || 0}`);\n if (log.position?.lineText) parts.push(log.position.lineText);\n if (log.message) parts.push(log.message);\n return parts.length > 0 ? parts.join('\\n') : String(log);\n });\n\n return { code: '', success: false, errors };\n } catch (err: any) {\n if (opts.throw) throw err;\n\n const errors: string[] = [];\n if (err.logs && Array.isArray(err.logs)) {\n for (const log of err.logs) {\n const parts: string[] = [];\n if (log.position?.line) parts.push(`Line ${log.position.line}:${log.position.column || 0}`);\n if (log.position?.lineText) parts.push(log.position.lineText);\n if (log.message) parts.push(log.message);\n errors.push(parts.length > 0 ? parts.join('\\n') : String(log));\n }\n } else {\n errors.push(err.message || String(err));\n }\n\n return { code: '', success: false, errors };\n }\n}\n\nasync function minifyWithBun(code: string): Promise<BundleResult> {\n const { writeFile, rm } = await import('fs/promises');\n const { join } = await import('path');\n const tempFile = join('/tmp', `meno-minify-${Date.now()}.js`);\n\n try {\n await writeFile(tempFile, code, 'utf-8');\n\n const result = await Bun.build({\n entrypoints: [tempFile],\n minify: true,\n throw: true,\n });\n\n if (result.outputs.length > 0) {\n const minified = await result.outputs[0].text();\n return { code: minified, success: true, errors: [] };\n }\n\n return { code: '', success: false, errors: ['Minification produced no output'] };\n } catch (err: any) {\n const { inspect } = await import('./fs');\n let details = '';\n if (err.logs && Array.isArray(err.logs)) {\n details = err.logs.map((log: any) => {\n const parts: string[] = [];\n if (log.position?.line) parts.push(`Line ${log.position.line}:${log.position.column || 0}`);\n if (log.position?.lineText) parts.push(log.position.lineText);\n if (log.message) parts.push(log.message);\n return parts.length > 0 ? parts.join('\\n') : String(log);\n }).join('\\n\\n');\n }\n if (!details) {\n try { details = inspect(err); } catch { details = err.stack || err.message || String(err); }\n }\n return { code: '', success: false, errors: [details] };\n } finally {\n try { const { rm } = await import('fs/promises'); await rm(tempFile, { force: true }); } catch {}\n }\n}\n\nasync function validateWithBun(code: string): Promise<string | null> {\n const { writeFile, rm } = await import('fs/promises');\n const { join } = await import('path');\n const tempFile = join('/tmp', `meno-validate-${Date.now()}-${Math.random().toString(36).slice(2)}.js`);\n\n try {\n await writeFile(tempFile, code, 'utf-8');\n await Bun.build({\n entrypoints: [tempFile],\n minify: true,\n throw: true,\n });\n return null; // Valid\n } catch (err: any) {\n const { inspect } = await import('./fs');\n let details = '';\n if (err.logs && Array.isArray(err.logs)) {\n details = err.logs.map((log: any) => {\n const parts: string[] = [];\n if (log.position?.line) parts.push(`Line ${log.position.line}:${log.position.column || 0}`);\n if (log.position?.lineText) parts.push(log.position.lineText);\n if (log.message) parts.push(log.message);\n return parts.length > 0 ? parts.join('\\n') : String(log);\n }).join('\\n\\n');\n }\n if (!details) {\n try { details = inspect(err); } catch { details = err.stack || err.message || String(err); }\n }\n return details || 'Unknown JavaScript error';\n } finally {\n try { await rm(tempFile, { force: true }); } catch {}\n }\n}\n\n// \u2500\u2500 esbuild implementations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function getEsbuild() {\n return await import('esbuild');\n}\n\nasync function bundleWithEsbuild(\n entrypoint: string,\n opts: BundleOptions,\n): Promise<BundleResult> {\n const esbuild = await getEsbuild();\n\n try {\n const result = await esbuild.build({\n entryPoints: [entrypoint],\n bundle: true,\n write: false,\n platform: opts.target === 'node' ? 'node' : 'browser',\n format: opts.format || 'esm',\n minify: opts.minify ?? false,\n sourcemap: opts.sourcemap === true ? 'inline' : (opts.sourcemap === 'inline' ? 'inline' : opts.sourcemap === 'external' ? true : false),\n jsx: 'automatic',\n jsxImportSource: 'react',\n logLevel: 'silent',\n });\n\n if (result.outputFiles && result.outputFiles.length > 0) {\n return { code: result.outputFiles[0].text, success: true, errors: [] };\n }\n\n return { code: '', success: false, errors: ['Build produced no output'] };\n } catch (err: any) {\n if (opts.throw) throw err;\n\n const errors: string[] = [];\n if (err.errors && Array.isArray(err.errors)) {\n for (const e of err.errors) {\n const parts: string[] = [];\n if (e.location?.file) parts.push(`File: ${e.location.file}`);\n if (e.location?.line) parts.push(`Line ${e.location.line}:${e.location.column || 0}`);\n if (e.location?.lineText) parts.push(e.location.lineText);\n if (e.text) parts.push(e.text);\n errors.push(parts.length > 0 ? parts.join('\\n') : String(e));\n }\n } else {\n errors.push(err.message || String(err));\n }\n\n return { code: '', success: false, errors };\n }\n}\n\nasync function minifyWithEsbuild(code: string): Promise<BundleResult> {\n const esbuild = await getEsbuild();\n\n try {\n const result = await esbuild.transform(code, {\n minify: true,\n loader: 'js',\n });\n\n return { code: result.code, success: true, errors: [] };\n } catch (err: any) {\n const errors: string[] = [];\n if (err.errors && Array.isArray(err.errors)) {\n for (const e of err.errors) {\n const parts: string[] = [];\n if (e.location?.line) parts.push(`Line ${e.location.line}:${e.location.column || 0}`);\n if (e.location?.lineText) parts.push(e.location.lineText);\n if (e.text) parts.push(e.text);\n errors.push(parts.length > 0 ? parts.join('\\n') : String(e));\n }\n } else {\n errors.push(err.message || String(err));\n }\n\n return { code: '', success: false, errors };\n }\n}\n\nasync function validateWithEsbuild(code: string): Promise<string | null> {\n const esbuild = await getEsbuild();\n\n try {\n await esbuild.transform(code, { loader: 'js' });\n return null; // Valid\n } catch (err: any) {\n const errors: string[] = [];\n if (err.errors && Array.isArray(err.errors)) {\n for (const e of err.errors) {\n const parts: string[] = [];\n if (e.location?.line) parts.push(`Line ${e.location.line}:${e.location.column || 0}`);\n if (e.location?.lineText) parts.push(e.location.lineText);\n if (e.text) parts.push(e.text);\n errors.push(parts.length > 0 ? parts.join('\\n') : String(e));\n }\n } else {\n errors.push(err.message || String(err));\n }\n\n return errors.join('\\n\\n') || 'Unknown JavaScript error';\n }\n}\n", "/**\n * Runtime-agnostic HTTP server abstraction.\n * Uses Bun.serve when available, falls back to Node.js http + ws.\n */\n\nconst isBun = typeof globalThis.Bun !== 'undefined';\n\nexport interface RuntimeServer {\n port: number;\n stop(): void;\n}\n\nexport interface RuntimeWSClient {\n send(data: string | ArrayBuffer | Uint8Array): void;\n readyState: number;\n close(code?: number, reason?: string): void;\n}\n\nexport interface ServerOptions {\n port: number;\n hostname?: string;\n fetch: (req: Request, upgradeWebSocket: (req: Request) => boolean) => Promise<Response | undefined>;\n websocket?: {\n open(ws: RuntimeWSClient): void;\n message(ws: RuntimeWSClient, data: string): void;\n close(ws: RuntimeWSClient): void;\n };\n /** Path to upgrade to WebSocket (e.g., \"/__hmr\") */\n wsPath?: string;\n}\n\nexport async function createRuntimeServer(\n options: ServerOptions,\n): Promise<RuntimeServer> {\n if (isBun) {\n return createBunServer(options);\n }\n return createNodeServer(options);\n}\n\n// \u2500\u2500 Bun implementation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction createBunServer(options: ServerOptions): RuntimeServer {\n const { port, hostname, fetch, websocket, wsPath } = options;\n\n const bunConfig: any = {\n port,\n hostname: hostname || 'localhost',\n\n async fetch(req: Request, server: any) {\n // Create upgrade function that delegates to Bun's server.upgrade\n const upgradeWebSocket = (upgradeReq: Request): boolean => {\n return server.upgrade(upgradeReq);\n };\n\n const response = await fetch(req, upgradeWebSocket);\n return response || new Response('Not Found', { status: 404 });\n },\n };\n\n if (websocket) {\n bunConfig.websocket = {\n open(ws: RuntimeWSClient) {\n websocket.open(ws);\n },\n message(ws: RuntimeWSClient, message: unknown) {\n websocket.message(ws, String(message));\n },\n close(ws: RuntimeWSClient) {\n websocket.close(ws);\n },\n };\n }\n\n const server = Bun.serve(bunConfig);\n\n return {\n port: server.port ?? port,\n stop() {\n server.stop();\n },\n };\n}\n\n// \u2500\u2500 Node.js implementation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function createNodeServer(options: ServerOptions): Promise<RuntimeServer> {\n const { port, hostname, fetch, websocket, wsPath } = options;\n const http = await import('http');\n\n const server = http.createServer(async (nodeReq, nodeRes) => {\n try {\n // Convert Node.js IncomingMessage \u2192 Web Request\n const url = `http://${hostname || 'localhost'}:${port}${nodeReq.url || '/'}`;\n const headers = new Headers();\n for (const [key, value] of Object.entries(nodeReq.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v);\n } else {\n headers.set(key, value);\n }\n }\n }\n\n let body: ReadableStream | null = null;\n if (nodeReq.method !== 'GET' && nodeReq.method !== 'HEAD') {\n const { Readable } = await import('stream');\n body = Readable.toWeb(nodeReq) as unknown as ReadableStream;\n }\n\n const request = new Request(url, {\n method: nodeReq.method || 'GET',\n headers,\n body,\n // @ts-ignore - duplex is needed for streaming request bodies in Node\n duplex: body ? 'half' : undefined,\n });\n\n // No-op upgrade function for non-upgrade requests\n const upgradeWebSocket = (): boolean => false;\n\n const response = await fetch(request, upgradeWebSocket);\n if (!response) {\n nodeRes.writeHead(404);\n nodeRes.end('Not Found');\n return;\n }\n\n // Convert Web Response \u2192 Node.js ServerResponse\n nodeRes.writeHead(response.status, Object.fromEntries(response.headers.entries()));\n\n if (response.body) {\n const reader = response.body.getReader();\n const pump = async () => {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n nodeRes.end();\n break;\n }\n const canContinue = nodeRes.write(value);\n if (!canContinue) {\n await new Promise<void>((resolve) => nodeRes.once('drain', resolve));\n }\n }\n };\n await pump();\n } else {\n const text = await response.text();\n nodeRes.end(text);\n }\n } catch (err) {\n console.error('Server error:', err);\n if (!nodeRes.headersSent) {\n nodeRes.writeHead(500);\n nodeRes.end('Internal Server Error');\n }\n }\n });\n\n // WebSocket support via 'ws' package\n if (websocket && wsPath) {\n try {\n const { WebSocketServer } = await import('ws');\n const wss = new WebSocketServer({ noServer: true });\n\n server.on('upgrade', (request, socket, head) => {\n const pathname = new URL(\n request.url || '/',\n `http://${hostname || 'localhost'}:${port}`,\n ).pathname;\n\n if (pathname === wsPath) {\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit('connection', ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n\n wss.on('connection', (ws) => {\n const client: RuntimeWSClient = {\n send(data) {\n if (ws.readyState === 1) { // OPEN\n ws.send(data);\n }\n },\n get readyState() {\n return ws.readyState;\n },\n close(code, reason) {\n ws.close(code, reason);\n },\n };\n\n websocket.open(client);\n\n ws.on('message', (data) => {\n websocket.message(client, data.toString());\n });\n\n ws.on('close', () => {\n websocket.close(client);\n });\n });\n } catch {\n console.warn('WebSocket support requires the \"ws\" package. Install it with: npm install ws');\n }\n }\n\n // Start listening\n return new Promise((resolve, reject) => {\n server.on('error', reject);\n server.listen(port, hostname || 'localhost', () => {\n const addr = server.address();\n const actualPort = typeof addr === 'object' && addr ? addr.port : port;\n\n resolve({\n port: actualPort,\n stop() {\n server.close();\n },\n });\n });\n });\n}\n", "/**\n * Runtime Abstraction\n * Detects Bun vs Node.js and re-exports runtime-agnostic utilities.\n */\n\nexport const isBun = typeof globalThis.Bun !== 'undefined';\n\nexport {\n readTextFile,\n readJsonFile,\n fileExists,\n writeFile,\n serveFile,\n hashContent,\n inspect,\n ensureDir,\n getModuleDir,\n spawnProcess,\n getFileSize,\n getMimeType,\n} from './fs';\n\nexport {\n bundleFile,\n minifyJS,\n validateJS,\n type BundleResult,\n type BundleOptions,\n} from './bundler';\n\nexport {\n createRuntimeServer,\n type RuntimeServer,\n type RuntimeWSClient,\n type ServerOptions,\n} from './httpServer';\n", "import { join, dirname } from 'path';\nimport { getModuleDir } from './runtime';\n\nlet projectRoot: string = process.cwd();\n\n// Package root is where the editor files are installed (2 levels up from this file)\n// In packaged Electron builds, MENO_CORE_ROOT overrides import.meta.url resolution\nconst packageRoot = process.env.MENO_CORE_ROOT\n || join(dirname(getModuleDir(import.meta.url)), '..');\n\nexport function setProjectRoot(root: string): void {\n projectRoot = root;\n}\n\nexport function getProjectRoot(): string {\n return projectRoot;\n}\n\nexport function getPackageRoot(): string {\n return packageRoot;\n}\n\n// Path getters for project files (user's project)\nexport const projectPaths = {\n pages: () => join(projectRoot, 'pages'),\n templates: () => join(projectRoot, 'templates'),\n components: () => join(projectRoot, 'components'),\n fonts: () => join(projectRoot, 'fonts'),\n images: () => join(projectRoot, 'images'),\n videos: () => join(projectRoot, 'videos'),\n assets: () => join(projectRoot, 'assets'),\n icons: () => join(projectRoot, 'icons'),\n cms: () => join(projectRoot, 'cms'),\n libraries: () => join(projectRoot, 'libraries'),\n functions: () => join(projectRoot, 'functions'),\n config: () => join(projectRoot, 'project.config.json'),\n componentsConfig: () => join(projectRoot, 'components.config.json'),\n colors: () => join(projectRoot, 'colors.json'),\n variables: () => join(projectRoot, 'variables.json'),\n enums: () => join(projectRoot, 'enums.json'),\n dist: () => join(projectRoot, 'dist'),\n env: () => join(projectRoot, '.env'),\n get project() { return projectRoot; }, // Direct access to project root\n};\n\n// Path getters for package files (core assets)\n// Note: Editor-specific paths (editorHtml) are now in @meno/studio\nexport const packagePaths = {\n indexHtml: () => join(packageRoot, 'templates', 'index-router.html'),\n clientRouter: () => join(packageRoot, 'entries', 'client-router.tsx'),\n};\n\nexport function resolveProjectPath(...segments: string[]): string {\n return join(projectRoot, ...segments);\n}\n\nexport function resolvePackagePath(...segments: string[]): string {\n return join(packageRoot, ...segments);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Runtime-agnostic bundler abstraction.\n * Uses Bun.build when available, falls back to esbuild for Node.js.\n */\n\nconst isBun = typeof (globalThis as any).Bun !== 'undefined';\n\nexport interface BundleResult {\n code: string;\n success: boolean;\n errors: string[];\n}\n\nexport interface BundleOptions {\n target?: 'browser' | 'node';\n format?: 'esm' | 'cjs';\n minify?: boolean;\n sourcemap?: 'inline' | 'external' | boolean;\n /** When true, throw on build errors instead of returning them */\n throw?: boolean;\n}\n\n/**\n * Bundle a file entry point.\n * Returns the bundled code as a string.\n */\nexport async function bundleFile(\n entrypoint: string,\n opts: BundleOptions = {},\n): Promise<BundleResult> {\n if (isBun) {\n return bundleWithBun(entrypoint, opts);\n }\n return bundleWithEsbuild(entrypoint, opts);\n}\n\n/**\n * Minify JavaScript code.\n */\nexport async function minifyJS(code: string): Promise<BundleResult> {\n if (isBun) {\n return minifyWithBun(code);\n }\n return minifyWithEsbuild(code);\n}\n\n/**\n * Validate JavaScript syntax (check for errors without producing output).\n */\nexport async function validateJS(code: string): Promise<string | null> {\n try {\n if (isBun) {\n return await validateWithBun(code);\n }\n return await validateWithEsbuild(code);\n } catch {\n // Validation not available (e.g., Cloudflare Workers) \u2014 skip and trust the JS\n return null;\n }\n}\n\n// \u2500\u2500 Bun implementations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function bundleWithBun(\n entrypoint: string,\n opts: BundleOptions,\n): Promise<BundleResult> {\n try {\n const result = await Bun.build({\n entrypoints: [entrypoint],\n target: opts.target || 'browser',\n format: opts.format || 'esm',\n minify: opts.minify ?? false,\n sourcemap: opts.sourcemap === true ? 'inline' : (opts.sourcemap || 'none'),\n throw: opts.throw ?? false,\n });\n\n if (result.success && result.outputs[0]) {\n const code = await result.outputs[0].text();\n return { code, success: true, errors: [] };\n }\n\n const errors = (result.logs || []).map((log: any) => {\n const parts: string[] = [];\n if (log.position?.file) parts.push(`File: ${log.position.file}`);\n if (log.position?.line) parts.push(`Line ${log.position.line}:${log.position.column || 0}`);\n if (log.position?.lineText) parts.push(log.position.lineText);\n if (log.message) parts.push(log.message);\n return parts.length > 0 ? parts.join('\\n') : String(log);\n });\n\n return { code: '', success: false, errors };\n } catch (err: any) {\n if (opts.throw) throw err;\n\n const errors: string[] = [];\n if (err.logs && Array.isArray(err.logs)) {\n for (const log of err.logs) {\n const parts: string[] = [];\n if (log.position?.line) parts.push(`Line ${log.position.line}:${log.position.column || 0}`);\n if (log.position?.lineText) parts.push(log.position.lineText);\n if (log.message) parts.push(log.message);\n errors.push(parts.length > 0 ? parts.join('\\n') : String(log));\n }\n } else {\n errors.push(err.message || String(err));\n }\n\n return { code: '', success: false, errors };\n }\n}\n\nasync function minifyWithBun(code: string): Promise<BundleResult> {\n const { writeFile, rm } = await import('fs/promises');\n const { join } = await import('path');\n const tempFile = join('/tmp', `meno-minify-${Date.now()}.js`);\n\n try {\n await writeFile(tempFile, code, 'utf-8');\n\n const result = await Bun.build({\n entrypoints: [tempFile],\n minify: true,\n throw: true,\n });\n\n if (result.outputs.length > 0) {\n const minified = await result.outputs[0].text();\n return { code: minified, success: true, errors: [] };\n }\n\n return { code: '', success: false, errors: ['Minification produced no output'] };\n } catch (err: any) {\n const { inspect } = await import('./fs');\n let details = '';\n if (err.logs && Array.isArray(err.logs)) {\n details = err.logs.map((log: any) => {\n const parts: string[] = [];\n if (log.position?.line) parts.push(`Line ${log.position.line}:${log.position.column || 0}`);\n if (log.position?.lineText) parts.push(log.position.lineText);\n if (log.message) parts.push(log.message);\n return parts.length > 0 ? parts.join('\\n') : String(log);\n }).join('\\n\\n');\n }\n if (!details) {\n try { details = inspect(err); } catch { details = err.stack || err.message || String(err); }\n }\n return { code: '', success: false, errors: [details] };\n } finally {\n try { const { rm } = await import('fs/promises'); await rm(tempFile, { force: true }); } catch {}\n }\n}\n\nasync function validateWithBun(code: string): Promise<string | null> {\n const { writeFile, rm } = await import('fs/promises');\n const { join } = await import('path');\n const tempFile = join('/tmp', `meno-validate-${Date.now()}-${Math.random().toString(36).slice(2)}.js`);\n\n try {\n await writeFile(tempFile, code, 'utf-8');\n await Bun.build({\n entrypoints: [tempFile],\n minify: true,\n throw: true,\n });\n return null; // Valid\n } catch (err: any) {\n const { inspect } = await import('./fs');\n let details = '';\n if (err.logs && Array.isArray(err.logs)) {\n details = err.logs.map((log: any) => {\n const parts: string[] = [];\n if (log.position?.line) parts.push(`Line ${log.position.line}:${log.position.column || 0}`);\n if (log.position?.lineText) parts.push(log.position.lineText);\n if (log.message) parts.push(log.message);\n return parts.length > 0 ? parts.join('\\n') : String(log);\n }).join('\\n\\n');\n }\n if (!details) {\n try { details = inspect(err); } catch { details = err.stack || err.message || String(err); }\n }\n return details || 'Unknown JavaScript error';\n } finally {\n try { await rm(tempFile, { force: true }); } catch {}\n }\n}\n\n// \u2500\u2500 esbuild implementations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function getEsbuild() {\n return await import('esbuild');\n}\n\nasync function bundleWithEsbuild(\n entrypoint: string,\n opts: BundleOptions,\n): Promise<BundleResult> {\n const esbuild = await getEsbuild();\n\n try {\n const result = await esbuild.build({\n entryPoints: [entrypoint],\n bundle: true,\n write: false,\n platform: opts.target === 'node' ? 'node' : 'browser',\n format: opts.format || 'esm',\n minify: opts.minify ?? false,\n sourcemap: opts.sourcemap === true ? 'inline' : (opts.sourcemap === 'inline' ? 'inline' : opts.sourcemap === 'external' ? true : false),\n jsx: 'automatic',\n jsxImportSource: 'react',\n logLevel: 'silent',\n });\n\n if (result.outputFiles && result.outputFiles.length > 0) {\n return { code: result.outputFiles[0].text, success: true, errors: [] };\n }\n\n return { code: '', success: false, errors: ['Build produced no output'] };\n } catch (err: any) {\n if (opts.throw) throw err;\n\n const errors: string[] = [];\n if (err.errors && Array.isArray(err.errors)) {\n for (const e of err.errors) {\n const parts: string[] = [];\n if (e.location?.file) parts.push(`File: ${e.location.file}`);\n if (e.location?.line) parts.push(`Line ${e.location.line}:${e.location.column || 0}`);\n if (e.location?.lineText) parts.push(e.location.lineText);\n if (e.text) parts.push(e.text);\n errors.push(parts.length > 0 ? parts.join('\\n') : String(e));\n }\n } else {\n errors.push(err.message || String(err));\n }\n\n return { code: '', success: false, errors };\n }\n}\n\nasync function minifyWithEsbuild(code: string): Promise<BundleResult> {\n const esbuild = await getEsbuild();\n\n try {\n const result = await esbuild.transform(code, {\n minify: true,\n loader: 'js',\n });\n\n return { code: result.code, success: true, errors: [] };\n } catch (err: any) {\n const errors: string[] = [];\n if (err.errors && Array.isArray(err.errors)) {\n for (const e of err.errors) {\n const parts: string[] = [];\n if (e.location?.line) parts.push(`Line ${e.location.line}:${e.location.column || 0}`);\n if (e.location?.lineText) parts.push(e.location.lineText);\n if (e.text) parts.push(e.text);\n errors.push(parts.length > 0 ? parts.join('\\n') : String(e));\n }\n } else {\n errors.push(err.message || String(err));\n }\n\n return { code: '', success: false, errors };\n }\n}\n\nasync function validateWithEsbuild(code: string): Promise<string | null> {\n const esbuild = await getEsbuild();\n\n try {\n await esbuild.transform(code, { loader: 'js' });\n return null; // Valid\n } catch (err: any) {\n const errors: string[] = [];\n if (err.errors && Array.isArray(err.errors)) {\n for (const e of err.errors) {\n const parts: string[] = [];\n if (e.location?.line) parts.push(`Line ${e.location.line}:${e.location.column || 0}`);\n if (e.location?.lineText) parts.push(e.location.lineText);\n if (e.text) parts.push(e.text);\n errors.push(parts.length > 0 ? parts.join('\\n') : String(e));\n }\n } else {\n errors.push(err.message || String(err));\n }\n\n return errors.join('\\n\\n') || 'Unknown JavaScript error';\n }\n}\n", "/**\n * Runtime-agnostic HTTP server abstraction.\n * Uses Bun.serve when available, falls back to Node.js http + ws.\n */\n\nconst isBun = typeof globalThis.Bun !== 'undefined';\n\nexport interface RuntimeServer {\n port: number;\n /**\n * Stop the server. When `force` is true, active connections are\n * closed immediately (Bun: closeActiveConnections=true). Defaults to\n * a graceful stop that lets in-flight requests finish.\n */\n stop(force?: boolean): void;\n}\n\nexport interface RuntimeWSClient {\n send(data: string | ArrayBuffer | Uint8Array): void;\n readyState: number;\n close(code?: number, reason?: string): void;\n}\n\nexport interface ServerOptions {\n port: number;\n hostname?: string;\n fetch: (req: Request, upgradeWebSocket: (req: Request) => boolean) => Promise<Response | undefined>;\n websocket?: {\n open(ws: RuntimeWSClient): void;\n message(ws: RuntimeWSClient, data: string): void;\n close(ws: RuntimeWSClient): void;\n };\n /** Path to upgrade to WebSocket (e.g., \"/__hmr\") */\n wsPath?: string;\n}\n\nexport async function createRuntimeServer(\n options: ServerOptions,\n): Promise<RuntimeServer> {\n if (isBun) {\n return createBunServer(options);\n }\n return createNodeServer(options);\n}\n\n// \u2500\u2500 Bun implementation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction createBunServer(options: ServerOptions): RuntimeServer {\n const { port, hostname, fetch, websocket, wsPath } = options;\n\n const bunConfig: any = {\n port,\n hostname: hostname || 'localhost',\n\n async fetch(req: Request, server: any) {\n // Create upgrade function that delegates to Bun's server.upgrade\n const upgradeWebSocket = (upgradeReq: Request): boolean => {\n return server.upgrade(upgradeReq);\n };\n\n const response = await fetch(req, upgradeWebSocket);\n return response || new Response('Not Found', { status: 404 });\n },\n };\n\n if (websocket) {\n bunConfig.websocket = {\n open(ws: RuntimeWSClient) {\n websocket.open(ws);\n },\n message(ws: RuntimeWSClient, message: unknown) {\n websocket.message(ws, String(message));\n },\n close(ws: RuntimeWSClient) {\n websocket.close(ws);\n },\n };\n }\n\n const server = Bun.serve(bunConfig);\n\n return {\n port: server.port ?? port,\n stop(force?: boolean) {\n server.stop(force === true);\n },\n };\n}\n\n// \u2500\u2500 Node.js implementation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function createNodeServer(options: ServerOptions): Promise<RuntimeServer> {\n const { port, hostname, fetch, websocket, wsPath } = options;\n const http = await import('http');\n\n const server = http.createServer(async (nodeReq, nodeRes) => {\n try {\n // Convert Node.js IncomingMessage \u2192 Web Request\n const url = `http://${hostname || 'localhost'}:${port}${nodeReq.url || '/'}`;\n const headers = new Headers();\n for (const [key, value] of Object.entries(nodeReq.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v);\n } else {\n headers.set(key, value);\n }\n }\n }\n\n let body: ReadableStream | null = null;\n if (nodeReq.method !== 'GET' && nodeReq.method !== 'HEAD') {\n const { Readable } = await import('stream');\n body = Readable.toWeb(nodeReq) as unknown as ReadableStream;\n }\n\n const request = new Request(url, {\n method: nodeReq.method || 'GET',\n headers,\n body,\n // @ts-ignore - duplex is needed for streaming request bodies in Node\n duplex: body ? 'half' : undefined,\n });\n\n // No-op upgrade function for non-upgrade requests\n const upgradeWebSocket = (): boolean => false;\n\n const response = await fetch(request, upgradeWebSocket);\n if (!response) {\n nodeRes.writeHead(404);\n nodeRes.end('Not Found');\n return;\n }\n\n // Convert Web Response \u2192 Node.js ServerResponse\n nodeRes.writeHead(response.status, Object.fromEntries(response.headers.entries()));\n\n if (response.body) {\n const reader = response.body.getReader();\n const pump = async () => {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n nodeRes.end();\n break;\n }\n const canContinue = nodeRes.write(value);\n if (!canContinue) {\n await new Promise<void>((resolve) => nodeRes.once('drain', resolve));\n }\n }\n };\n await pump();\n } else {\n const text = await response.text();\n nodeRes.end(text);\n }\n } catch (err) {\n console.error('Server error:', err);\n if (!nodeRes.headersSent) {\n nodeRes.writeHead(500);\n nodeRes.end('Internal Server Error');\n }\n }\n });\n\n // WebSocket support via 'ws' package\n if (websocket && wsPath) {\n try {\n const { WebSocketServer } = await import('ws');\n const wss = new WebSocketServer({ noServer: true });\n\n server.on('upgrade', (request, socket, head) => {\n const pathname = new URL(\n request.url || '/',\n `http://${hostname || 'localhost'}:${port}`,\n ).pathname;\n\n if (pathname === wsPath) {\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit('connection', ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n\n wss.on('connection', (ws) => {\n const client: RuntimeWSClient = {\n send(data) {\n if (ws.readyState === 1) { // OPEN\n ws.send(data);\n }\n },\n get readyState() {\n return ws.readyState;\n },\n close(code, reason) {\n ws.close(code, reason);\n },\n };\n\n websocket.open(client);\n\n ws.on('message', (data) => {\n websocket.message(client, data.toString());\n });\n\n ws.on('close', () => {\n websocket.close(client);\n });\n });\n } catch {\n console.warn('WebSocket support requires the \"ws\" package. Install it with: npm install ws');\n }\n }\n\n // Start listening\n return new Promise((resolve, reject) => {\n server.on('error', reject);\n server.listen(port, hostname || 'localhost', () => {\n const addr = server.address();\n const actualPort = typeof addr === 'object' && addr ? addr.port : port;\n\n resolve({\n port: actualPort,\n stop(_force?: boolean) {\n // Node http.Server.close is graceful by default; the force\n // flag is accepted for API parity with Bun but currently has\n // no additional effect on the Node path.\n server.close();\n },\n });\n });\n });\n}\n", "/**\n * Runtime Abstraction\n * Detects Bun vs Node.js and re-exports runtime-agnostic utilities.\n */\n\nexport const isBun = typeof globalThis.Bun !== 'undefined';\n\nexport {\n readTextFile,\n readJsonFile,\n fileExists,\n writeFile,\n serveFile,\n hashContent,\n inspect,\n ensureDir,\n getModuleDir,\n spawnProcess,\n getFileSize,\n getMimeType,\n} from './fs';\n\nexport {\n bundleFile,\n minifyJS,\n validateJS,\n type BundleResult,\n type BundleOptions,\n} from './bundler';\n\nexport {\n createRuntimeServer,\n type RuntimeServer,\n type RuntimeWSClient,\n type ServerOptions,\n} from './httpServer';\n", "import { join, dirname } from 'path';\nimport { getModuleDir } from './runtime';\n\nlet projectRoot: string = process.cwd();\n\n// Package root is where the editor files are installed (2 levels up from this file)\n// In packaged Electron builds, MENO_CORE_ROOT overrides import.meta.url resolution\nconst packageRoot = process.env.MENO_CORE_ROOT\n || join(dirname(getModuleDir(import.meta.url)), '..');\n\nexport function setProjectRoot(root: string): void {\n projectRoot = root;\n}\n\nexport function getProjectRoot(): string {\n return projectRoot;\n}\n\nexport function getPackageRoot(): string {\n return packageRoot;\n}\n\n// Path getters for project files (user's project)\nexport const projectPaths = {\n pages: () => join(projectRoot, 'pages'),\n templates: () => join(projectRoot, 'templates'),\n components: () => join(projectRoot, 'components'),\n fonts: () => join(projectRoot, 'fonts'),\n images: () => join(projectRoot, 'images'),\n videos: () => join(projectRoot, 'videos'),\n assets: () => join(projectRoot, 'assets'),\n icons: () => join(projectRoot, 'icons'),\n cms: () => join(projectRoot, 'cms'),\n libraries: () => join(projectRoot, 'libraries'),\n functions: () => join(projectRoot, 'functions'),\n config: () => join(projectRoot, 'project.config.json'),\n componentsConfig: () => join(projectRoot, 'components.config.json'),\n colors: () => join(projectRoot, 'colors.json'),\n variables: () => join(projectRoot, 'variables.json'),\n enums: () => join(projectRoot, 'enums.json'),\n dist: () => join(projectRoot, 'dist'),\n env: () => join(projectRoot, '.env'),\n get project() { return projectRoot; }, // Direct access to project root\n};\n\n// Path getters for package files (core assets)\n// Note: Editor-specific paths (editorHtml) are now in @meno/studio\nexport const packagePaths = {\n indexHtml: () => join(packageRoot, 'templates', 'index-router.html'),\n clientRouter: () => join(packageRoot, 'entries', 'client-router.tsx'),\n};\n\nexport function resolveProjectPath(...segments: string[]): string {\n return join(projectRoot, ...segments);\n}\n\nexport function resolvePackagePath(...segments: string[]): string {\n return join(packageRoot, ...segments);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["writeFile", "join", "inspect", "rm", "isBun", "server", "isBun"]
7
7
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isI18nValue
3
- } from "./chunk-X5SH4HXS.js";
3
+ } from "./chunk-XSWR3QLI.js";
4
4
 
5
5
  // lib/shared/slugify.ts
6
6
  function slugify(text) {
@@ -51,4 +51,4 @@ export {
51
51
  generateUniqueFilename,
52
52
  generateFilenameFromItem
53
53
  };
54
- //# sourceMappingURL=chunk-46AVQA4V.js.map
54
+ //# sourceMappingURL=chunk-IF3RATBY.js.map
@@ -96,6 +96,8 @@ var VARIABLE_TYPES = [
96
96
  { value: "padding", label: "Padding" },
97
97
  { value: "margin", label: "Margin" },
98
98
  { value: "gap", label: "Gap" },
99
+ { value: "borderRadius", label: "Border Radius" },
100
+ { value: "size", label: "Width / Height" },
99
101
  { value: "none", label: "None" }
100
102
  ];
101
103
  function getGroupAbbreviation(group) {
@@ -106,6 +108,8 @@ function getDefaultScalingType(group, cssProperty) {
106
108
  if (group === "margin") return "margin";
107
109
  if (group === "padding") return "padding";
108
110
  if (group === "gap") return "gap";
111
+ if (group === "border-radius") return "borderRadius";
112
+ if (group === "size") return "size";
109
113
  return "none";
110
114
  }
111
115
  function generateShortCssVar(name, group, existingVariables) {
@@ -198,4 +202,4 @@ export {
198
202
  SAFE_IDENTIFIER_REGEX,
199
203
  isValidIdentifier
200
204
  };
201
- //# sourceMappingURL=chunk-S2HXJTAF.js.map
205
+ //# sourceMappingURL=chunk-KITQJYZV.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../lib/shared/types/components.ts", "../../lib/shared/types/errors.ts", "../../lib/shared/types/colors.ts", "../../lib/shared/types/variables.ts", "../../lib/shared/pathSecurity.ts"],
4
+ "sourcesContent": ["/**\n * Component Definition Types\n * Improved type safety with stricter types\n */\n\nimport type { ComponentNode } from './nodes';\nimport type { LibrariesConfig } from './libraries';\n\n/**\n * Prop type definitions\n */\nexport type PropType = 'string' | 'select' | 'boolean' | 'number' | 'link' | 'file' | 'rich-text' | 'embed' | 'list';\n\n/**\n * Project-level enum configuration\n * Keys are enum names, values are arrays of options\n */\nexport type EnumsConfig = Record<string, readonly string[]>;\n\n/**\n * Internationalization (i18n) value object\n * Keys are locale codes (e.g., 'en', 'pl', 'de')\n * Values can be strings (for string props) or arrays (for list props)\n */\nexport interface I18nValue {\n _i18n: true;\n [locale: string]: string | unknown[] | true; // true is for the _i18n marker, arrays for list props\n}\n\n/**\n * Locale configuration with metadata\n */\nexport interface LocaleConfig {\n code: string; // URL prefix & translation key (e.g., \"en\", \"pl\")\n name: string; // English name for admin UI (e.g., \"Polish\")\n nativeName: string; // Native name for public UI (e.g., \"Polski\")\n langTag: string; // BCP 47 language tag for SEO (e.g., \"pl-PL\")\n icon?: string; // Optional flag icon path (e.g., \"/icons/flag-en.svg\")\n}\n\n/**\n * Internationalization configuration\n */\nexport interface I18nConfig {\n defaultLocale: string;\n locales: LocaleConfig[];\n}\n\n/**\n * Value resolver function type\n * Used for transforming field values (e.g., i18n resolution)\n */\nexport type ValueResolver = (value: unknown) => unknown;\n\n/**\n * Link prop value type\n */\nexport interface LinkPropValue {\n href: string;\n target?: '_blank';\n}\n\n/**\n * Base prop definition without list-specific fields\n */\nexport interface BasePropDefinition {\n type: Exclude<PropType, 'list'>;\n default?: string | number | boolean | I18nValue | LinkPropValue;\n options?: readonly string[]; // Required for \"select\" type (inline options)\n enumName?: string; // For \"select\" type: reference to project-level enum\n accept?: string; // For \"file\" type: MIME pattern like \"image/*\", \"video/*\"\n editor?: 'basic' | 'extended'; // For 'rich-text' type: which editor to use\n}\n\n/**\n * List item schema - defines the structure of each item in a list prop\n * Uses the same prop types as component interfaces (except nested lists)\n */\nexport type ListItemSchema = Record<string, BasePropDefinition>;\n\n/**\n * List item value type\n * Supports i18n values for localized string fields\n */\nexport type ListItemValue = Record<string, string | number | boolean | LinkPropValue | I18nValue | null>;\n\n/**\n * List prop definition - for array/list data\n */\nexport interface ListPropDefinition {\n type: 'list';\n /** Schema defining the structure of each list item */\n itemSchema: ListItemSchema;\n /** Default value is an array of items */\n default?: ListItemValue[];\n}\n\n/**\n * Prop definition with improved type safety\n */\nexport type PropDefinition = BasePropDefinition | ListPropDefinition;\n\n/**\n * Type guard to check if a prop definition is a list type\n */\nexport function isListPropDefinition(def: PropDefinition): def is ListPropDefinition {\n return def.type === 'list';\n}\n\n/**\n * Type guard to check if a prop definition is a base (non-list) type\n */\nexport function isBasePropDefinition(def: PropDefinition): def is BasePropDefinition {\n return def.type !== 'list';\n}\n\n/**\n * Structured component definition\n */\nexport interface StructuredComponentDefinition {\n interface?: Record<string, PropDefinition>;\n structure?: ComponentNode;\n javascript?: string; // Vanilla JS code to be rendered at end of HTML\n css?: string; // CSS code to be rendered in <style> tag in <head>\n category?: string; // Component category for organization\n /**\n * Define which props are available as JavaScript variables (Astro-style define:vars)\n * - true: all props from interface are exposed\n * - string[]: only specified props are exposed\n * - undefined: no automatic prop injection (backward compatible)\n */\n defineVars?: true | string[];\n /** External JS/CSS libraries required by this component */\n libraries?: LibrariesConfig;\n /** Whether instances of this component can have styles applied to the wrapper */\n acceptsStyles?: boolean;\n}\n\n/**\n * Component definition\n * Supports both new format (just component) and legacy format (type/props/children/component)\n */\nexport interface ComponentDefinition {\n type?: string; // Legacy format\n props?: Record<string, unknown>; // Legacy format\n children?: unknown[]; // Legacy format\n component: StructuredComponentDefinition;\n}\n\n/**\n * Line range for element line number tracking\n */\nexport interface LineRange {\n startLine: number;\n endLine: number;\n}\n\n/**\n * JSON page structure\n */\nexport interface JSONPage {\n meta?: import('./api').PageMetaData;\n components?: Record<string, ComponentDefinition>;\n root?: ComponentNode;\n _lineMap?: Record<string, LineRange>;\n}\n\n/**\n * Page data type that can be either a JSONPage or a component definition structure\n */\nexport type PageData = JSONPage | {\n component: {\n structure?: ComponentNode;\n interface?: Record<string, PropDefinition>;\n javascript?: string;\n css?: string;\n acceptsStyles?: boolean;\n }\n};\n\n/**\n * Page data with component structure (for type narrowing)\n */\nexport interface PageDataWithComponent {\n component: {\n structure?: ComponentNode;\n interface?: Record<string, PropDefinition>;\n javascript?: string;\n css?: string;\n libraries?: LibrariesConfig;\n acceptsStyles?: boolean;\n };\n}\n", "/**\n * Error Types\n * Structured error types for validation and type safety\n */\n\n/**\n * Validation error with context\n */\nexport interface ValidationError {\n path?: string;\n message: string;\n receivedValue?: unknown;\n expectedType?: string;\n}\n\n/**\n * Type safety error\n * Errors from type mismatches or invalid data structures\n */\nexport interface TypeSafetyError extends Error {\n readonly path?: string;\n readonly receivedValue?: unknown;\n readonly expectedType?: string;\n}\n\n/**\n * Result type for operations that can fail\n * Replaces null returns with explicit success/failure\n */\nexport type Result<T> =\n | { success: true; data: T }\n | { success: false; error: ValidationError };\n\n/**\n * Create a validation error\n */\nexport function createValidationError(\n message: string,\n options?: {\n path?: string;\n receivedValue?: unknown;\n expectedType?: string;\n }\n): ValidationError {\n return {\n message,\n ...options,\n };\n}\n\n/**\n * Create a type safety error\n */\nexport function createTypeSafetyError(\n message: string,\n options?: {\n path?: string;\n receivedValue?: unknown;\n expectedType?: string;\n }\n): TypeSafetyError {\n const error = new Error(message) as TypeSafetyError;\n Object.defineProperty(error, 'path', { value: options?.path, writable: false });\n Object.defineProperty(error, 'receivedValue', { value: options?.receivedValue, writable: false });\n Object.defineProperty(error, 'expectedType', { value: options?.expectedType, writable: false });\n return error;\n}\n\n\n", "/**\n * Color Variables Types\n * Handles color variable definitions and configuration\n */\n\n/**\n * Color variables configuration\n * Maps semantic color names to their hex/rgb values\n */\nexport interface ColorVariables {\n colors: Record<string, string>;\n}\n\n/**\n * Theme configuration with color set and metadata\n */\nexport interface Theme {\n label: string;\n colors: Record<string, string>;\n}\n\n/**\n * Theme configuration file structure\n * Supports multiple named themes with a default theme\n */\nexport interface ThemeConfig {\n default: string;\n palette?: Record<string, string>;\n themes: Record<string, Theme>;\n}\n\n/**\n * Resolve a color value through the palette.\n * If value matches a palette key, returns the palette hex; otherwise returns value as-is.\n */\nexport function resolvePaletteColor(value: string, palette?: Record<string, string>): string {\n if (!palette) return value;\n return palette[value] ?? value;\n}\n\n/**\n * Color variable entry for editor display\n */\nexport interface ColorVariableEntry {\n name: string;\n value: string;\n}\n\n/**\n * Theme entry for theme selector\n */\nexport interface ThemeEntry {\n name: string;\n label: string;\n}\n", "/**\n * CSS Variables Types\n * Defines types for the variables.json configuration file\n */\n\n/**\n * Category type for a CSS variable\n * Maps to responsiveScales categories for automatic responsive scaling\n * 'none' means no responsive scaling is applied\n */\nexport type VariableType = 'fontSize' | 'padding' | 'margin' | 'gap' | 'borderRadius' | 'size' | 'none';\n\n/**\n * UI filtering group for a CSS variable.\n * Controls which variables appear in the picker based on the CSS property being edited.\n */\nexport type VariableGroup =\n | 'font-family' | 'font-size' | 'font-weight'\n | 'line-height' | 'letter-spacing'\n | 'margin' | 'padding' | 'gap'\n | 'size'\n | 'border-radius' | 'border-width'\n | 'opacity' | 'z-index'\n | 'text-align'\n | 'other';\n\n/** Predefined variable groups for UI dropdowns */\nexport const VARIABLE_GROUPS: { value: VariableGroup; label: string }[] = [\n { value: 'font-family', label: 'Font Family' },\n { value: 'font-size', label: 'Font Size' },\n { value: 'font-weight', label: 'Font Weight' },\n { value: 'line-height', label: 'Line Height' },\n { value: 'letter-spacing', label: 'Letter Spacing' },\n { value: 'margin', label: 'Margin' },\n { value: 'padding', label: 'Padding' },\n { value: 'gap', label: 'Gap' },\n { value: 'size', label: 'Size' },\n { value: 'border-radius', label: 'Border Radius' },\n { value: 'border-width', label: 'Border Width' },\n { value: 'opacity', label: 'Opacity' },\n { value: 'z-index', label: 'Z-Index' },\n { value: 'text-align', label: 'Text Align' },\n { value: 'other', label: 'Other' },\n];\n\n/** All valid group string values */\nexport const VARIABLE_GROUP_VALUES: VariableGroup[] = VARIABLE_GROUPS.map(g => g.value);\n\n/** Maps CSS property names to variable groups */\nconst CSS_PROPERTY_TO_GROUP: Record<string, VariableGroup> = {\n 'font-family': 'font-family',\n 'font-size': 'font-size',\n 'font-weight': 'font-weight',\n 'line-height': 'line-height',\n 'letter-spacing': 'letter-spacing',\n 'text-align': 'text-align',\n 'opacity': 'opacity',\n 'z-index': 'z-index',\n};\n\n/** Prefix-based mappings for CSS properties */\nconst CSS_PROPERTY_PREFIX_GROUPS: { prefix: string; group: VariableGroup }[] = [\n { prefix: 'margin', group: 'margin' },\n { prefix: 'padding', group: 'padding' },\n { prefix: 'gap', group: 'gap' },\n { prefix: 'row-gap', group: 'gap' },\n { prefix: 'column-gap', group: 'gap' },\n { prefix: 'width', group: 'size' },\n { prefix: 'height', group: 'size' },\n { prefix: 'min-width', group: 'size' },\n { prefix: 'max-width', group: 'size' },\n { prefix: 'min-height', group: 'size' },\n { prefix: 'max-height', group: 'size' },\n { prefix: 'border-radius', group: 'border-radius' },\n { prefix: 'border-top-left-radius', group: 'border-radius' },\n { prefix: 'border-top-right-radius', group: 'border-radius' },\n { prefix: 'border-bottom-left-radius', group: 'border-radius' },\n { prefix: 'border-bottom-right-radius', group: 'border-radius' },\n { prefix: 'border-width', group: 'border-width' },\n { prefix: 'border-top-width', group: 'border-width' },\n { prefix: 'border-right-width', group: 'border-width' },\n { prefix: 'border-bottom-width', group: 'border-width' },\n { prefix: 'border-left-width', group: 'border-width' },\n];\n\n/**\n * Determines which variable group a CSS property belongs to.\n * Returns null if no group matches (show all variables).\n */\nexport function getGroupForProperty(prop: string): VariableGroup | null {\n // Normalize camelCase to kebab-case (e.g., \"fontFamily\" \u2192 \"font-family\")\n const normalized = prop.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\n\n // Exact match first\n if (normalized in CSS_PROPERTY_TO_GROUP) {\n return CSS_PROPERTY_TO_GROUP[normalized];\n }\n // Prefix-based match (handles margin-top, padding-left, etc.)\n for (const { prefix, group } of CSS_PROPERTY_PREFIX_GROUPS) {\n if (normalized === prefix || normalized.startsWith(prefix + '-')) {\n return group;\n }\n }\n return null;\n}\n\n/**\n * A single CSS custom property definition\n */\nexport interface CSSVariable {\n /** Display name (e.g., \"H1 Font Size\") */\n name: string;\n /** Optional prop name alias for organizational purposes */\n prop_name?: string;\n /** CSS custom property name (e.g., \"--h1-fs\") */\n cssVar: string;\n /** Base value (e.g., \"48px\") */\n value: string;\n /** Category for responsive scaling */\n type: VariableType;\n /** Optional per-variable breakpoint scale overrides */\n scales?: Record<string, string>;\n /** Optional UI filtering group for the variable picker */\n group?: VariableGroup;\n}\n\n/**\n * Variables configuration file structure (variables.json)\n */\nexport interface VariablesConfig {\n variables: CSSVariable[];\n}\n\n/** Predefined variable scaling types for UI dropdowns */\nexport const VARIABLE_TYPES: { value: VariableType; label: string }[] = [\n { value: 'fontSize', label: 'Font Size' },\n { value: 'padding', label: 'Padding' },\n { value: 'margin', label: 'Margin' },\n { value: 'gap', label: 'Gap' },\n { value: 'borderRadius', label: 'Border Radius' },\n { value: 'size', label: 'Width / Height' },\n { value: 'none', label: 'None' },\n];\n\n/**\n * Returns an abbreviation for a variable group by taking the first letter of each word.\n * e.g. 'letter-spacing' -> 'ls', 'font-size' -> 'fs', 'spacing' -> 's'\n */\nexport function getGroupAbbreviation(group: string): string {\n return group.split('-').map(w => w[0] || '').join('');\n}\n\n/**\n * Infers a default scaling type from a variable group and optional CSS property.\n */\nexport function getDefaultScalingType(group: string, cssProperty?: string): VariableType {\n if (group === 'font-size') return 'fontSize';\n if (group === 'margin') return 'margin';\n if (group === 'padding') return 'padding';\n if (group === 'gap') return 'gap';\n if (group === 'border-radius') return 'borderRadius';\n if (group === 'size') return 'size';\n return 'none';\n}\n\n/**\n * Generates a short CSS variable name with collision detection.\n * e.g. name=\"Heading\", group=\"letter-spacing\" -> \"--h-ls\"\n * If taken, extends prefix: \"--he-ls\", \"--hea-ls\", etc.\n */\nexport function generateShortCssVar(\n name: string,\n group: string,\n existingVariables: CSSVariable[]\n): string {\n const trimmed = name.trim();\n if (!trimmed) return '--';\n if (!group) {\n // No group: just kebab-case the name\n const base = '--' + trimmed.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n return ensureUnique(base, existingVariables);\n }\n\n const groupAbbr = getGroupAbbreviation(group);\n const kebabName = trimmed.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n const words = kebabName.split('-').filter(Boolean);\n const existingNames = new Set(existingVariables.map(v => v.cssVar));\n\n // Try progressively longer prefixes from the name\n // Start with first letter of each word, then extend first word\n const initials = words.map(w => w[0] || '').join('');\n const initialCandidate = `--${initials}-${groupAbbr}`;\n if (!existingNames.has(initialCandidate)) return initialCandidate;\n\n // Extend first word progressively\n const firstWord = words[0] || '';\n for (let len = 2; len <= firstWord.length; len++) {\n const prefix = firstWord.slice(0, len) + (words.length > 1 ? words.slice(1).map(w => w[0] || '').join('') : '');\n const candidate = `--${prefix}-${groupAbbr}`;\n if (!existingNames.has(candidate)) return candidate;\n }\n\n // Full kebab name with group abbreviation\n const fullCandidate = `--${kebabName}-${groupAbbr}`;\n if (!existingNames.has(fullCandidate)) return fullCandidate;\n\n // Numeric suffix fallback\n let i = 2;\n while (existingNames.has(`${fullCandidate}-${i}`)) i++;\n return `${fullCandidate}-${i}`;\n}\n\nfunction ensureUnique(base: string, existingVariables: CSSVariable[]): string {\n const existingNames = new Set(existingVariables.map(v => v.cssVar));\n if (!existingNames.has(base)) return base;\n let i = 2;\n while (existingNames.has(`${base}-${i}`)) i++;\n return `${base}-${i}`;\n}\n", "/**\n * Path Security Utilities\n * Provides path traversal protection for file system operations\n */\n\nimport { resolve, sep } from 'path';\n\n/**\n * Error thrown when a path traversal attack is detected\n */\nexport class PathTraversalError extends Error {\n constructor(\n public readonly requestedPath: string,\n public readonly rootPath: string\n ) {\n super(`Path traversal detected: \"${requestedPath}\" escapes root \"${rootPath}\"`);\n this.name = 'PathTraversalError';\n }\n}\n\n/**\n * Check if a resolved path is within the allowed root directory\n * Uses path.resolve() to normalize and handle .. sequences\n *\n * @param requestedPath - The path to validate (can be relative or absolute)\n * @param rootPath - The root directory that paths must be within\n * @returns true if the path is within root, false otherwise\n */\nexport function isPathWithinRoot(requestedPath: string, rootPath: string): boolean {\n const normalizedRoot = resolve(rootPath);\n const normalizedPath = resolve(rootPath, requestedPath);\n\n // Check that normalized path starts with root + separator\n // Adding separator prevents /project-backup from matching /project\n return normalizedPath === normalizedRoot || normalizedPath.startsWith(normalizedRoot + sep);\n}\n\n/**\n * Resolve a path safely, throwing if it would escape the root\n *\n * @param rootPath - The root directory\n * @param segments - Path segments to join\n * @returns The resolved path\n * @throws PathTraversalError if path escapes root\n */\nexport function resolveSafePath(rootPath: string, ...segments: string[]): string {\n const normalizedRoot = resolve(rootPath);\n const normalizedPath = resolve(normalizedRoot, ...segments);\n\n if (!normalizedPath.startsWith(normalizedRoot + sep) && normalizedPath !== normalizedRoot) {\n throw new PathTraversalError(segments.join(sep), rootPath);\n }\n\n return normalizedPath;\n}\n\n/**\n * Validate that a filename/identifier contains no path traversal sequences\n * Use for collection names, filenames, etc.\n *\n * @param name - The name to validate\n * @returns true if safe, false if contains traversal sequences\n */\nexport function isSafePathSegment(name: string): boolean {\n // Reject empty names\n if (!name || name.trim() === '') return false;\n\n // Reject names with path separators\n if (name.includes('/') || name.includes('\\\\')) return false;\n\n // Reject . and ..\n if (name === '.' || name === '..') return false;\n\n // Reject names starting with .. (e.g., \"..foo\")\n if (name.startsWith('..')) return false;\n\n // Reject null bytes (used in some attacks)\n if (name.includes('\\0')) return false;\n\n return true;\n}\n\n/**\n * Regex for valid CMS identifiers (collection names, filenames)\n * Allows alphanumeric, underscore, hyphen\n */\nexport const SAFE_IDENTIFIER_REGEX = /^[a-zA-Z0-9_-]+$/;\n\n/**\n * Validate a CMS identifier (stricter than isSafePathSegment)\n * Use for collection IDs and filenames that should only contain safe chars\n */\nexport function isValidIdentifier(name: string): boolean {\n return SAFE_IDENTIFIER_REGEX.test(name);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -15,22 +15,22 @@ import {
15
15
  migrateTemplatesDirectory,
16
16
  parseJSON,
17
17
  prepareClientData
18
- } from "./chunk-3XXLBUYA.js";
18
+ } from "./chunk-77ZB6353.js";
19
19
  import {
20
20
  minifyJS,
21
21
  projectPaths
22
- } from "./chunk-5Z5VQRTJ.js";
22
+ } from "./chunk-I7YIGZXT.js";
23
23
  import {
24
24
  inspect
25
25
  } from "./chunk-WQFG7PAH.js";
26
26
  import {
27
27
  isItemDraftForLocale,
28
28
  isItemFullyPublished
29
- } from "./chunk-KPNSCQNA.js";
29
+ } from "./chunk-FED5MME6.js";
30
30
  import {
31
31
  isI18nValue,
32
32
  resolveI18nValue
33
- } from "./chunk-X5SH4HXS.js";
33
+ } from "./chunk-XSWR3QLI.js";
34
34
 
35
35
  // build-static.ts
36
36
  import { existsSync, readdirSync, mkdirSync, rmSync, statSync, copyFileSync, unlinkSync, writeFileSync } from "fs";
@@ -754,7 +754,7 @@ async function buildStaticPages() {
754
754
  console.log("\u{1F3D7}\uFE0F Building static HTML files...\n");
755
755
  buildErrors.length = 0;
756
756
  clearJSValidationCache();
757
- const { configService } = await import("./configService-KYO3TXDS.js");
757
+ const { configService } = await import("./configService-DYCUEURL.js");
758
758
  configService.reset();
759
759
  const projectConfig = await loadProjectConfig();
760
760
  const siteUrl = projectConfig.siteUrl?.replace(/\/$/, "");
@@ -1132,4 +1132,4 @@ export {
1132
1132
  injectTrackingScript,
1133
1133
  buildStaticPages
1134
1134
  };
1135
- //# sourceMappingURL=chunk-G3WIPJN3.js.map
1135
+ //# sourceMappingURL=chunk-ORN7S4AP.js.map
@@ -296,6 +296,87 @@ var CSS_PROPERTIES_DEFINITION = {
296
296
  }
297
297
  };
298
298
  var CSS_PROPERTIES = Object.keys(CSS_PROPERTIES_DEFINITION);
299
+ var CSS_PROPERTY_PRIORITY = {
300
+ // Tier 1: Most commonly used
301
+ display: 1,
302
+ position: 1,
303
+ width: 1,
304
+ height: 1,
305
+ margin: 1,
306
+ padding: 1,
307
+ color: 1,
308
+ backgroundColor: 1,
309
+ fontSize: 1,
310
+ fontWeight: 1,
311
+ border: 1,
312
+ borderRadius: 1,
313
+ flex: 1,
314
+ flexDirection: 1,
315
+ justifyContent: 1,
316
+ alignItems: 1,
317
+ gap: 1,
318
+ opacity: 1,
319
+ overflow: 1,
320
+ zIndex: 1,
321
+ top: 1,
322
+ right: 1,
323
+ bottom: 1,
324
+ left: 1,
325
+ cursor: 1,
326
+ background: 1,
327
+ boxShadow: 1,
328
+ transition: 1,
329
+ transform: 1,
330
+ lineHeight: 1,
331
+ textAlign: 1,
332
+ // Tier 2: Common but less frequent
333
+ maxWidth: 2,
334
+ maxHeight: 2,
335
+ minWidth: 3,
336
+ minHeight: 3,
337
+ marginTop: 2,
338
+ marginBottom: 2,
339
+ marginLeft: 2,
340
+ marginRight: 2,
341
+ paddingTop: 2,
342
+ paddingBottom: 2,
343
+ paddingLeft: 2,
344
+ paddingRight: 2,
345
+ fontFamily: 2,
346
+ fontStyle: 2,
347
+ textDecoration: 2,
348
+ textTransform: 2,
349
+ letterSpacing: 2,
350
+ borderWidth: 2,
351
+ borderStyle: 2,
352
+ borderColor: 2,
353
+ borderBottom: 2,
354
+ borderTop: 2,
355
+ flexWrap: 2,
356
+ flexGrow: 2,
357
+ flexShrink: 2,
358
+ flexBasis: 2,
359
+ alignSelf: 2,
360
+ gridTemplateColumns: 2,
361
+ gridTemplateRows: 2,
362
+ backgroundImage: 2,
363
+ backgroundSize: 2,
364
+ backgroundPosition: 2,
365
+ whiteSpace: 2,
366
+ textOverflow: 2,
367
+ visibility: 2,
368
+ pointerEvents: 2,
369
+ userSelect: 2,
370
+ boxSizing: 2,
371
+ objectFit: 2,
372
+ filter: 2,
373
+ animation: 2,
374
+ outline: 2,
375
+ inset: 2
376
+ };
377
+ function getPropertyPriority(property) {
378
+ return CSS_PROPERTY_PRIORITY[property] ?? 3;
379
+ }
299
380
  var CSS_PROPERTY_GROUPS = {
300
381
  "Layout": ["display", "position", "top", "right", "bottom", "left", "inset", "zIndex"],
301
382
  "Dimensions": ["width", "height", "minWidth", "maxWidth", "minHeight", "maxHeight", "aspectRatio"],
@@ -344,7 +425,7 @@ function matchesAbbreviation(property, input) {
344
425
  return true;
345
426
  }
346
427
  function filterCSSProperties(input) {
347
- const normalizedInput = input.trim();
428
+ const normalizedInput = (input ?? "").trim();
348
429
  if (!normalizedInput) {
349
430
  return CSS_PROPERTIES.slice(0, 15);
350
431
  }
@@ -355,7 +436,11 @@ function filterCSSProperties(input) {
355
436
  (prop) => matchesAbbreviation(prop, normalizedInput) && !startsWithMatches.includes(prop)
356
437
  // Don't duplicate startsWith matches
357
438
  );
358
- return [...startsWithMatches, ...abbreviationMatches];
439
+ const byPriority = (a, b) => getPropertyPriority(a) - getPropertyPriority(b);
440
+ return [
441
+ ...startsWithMatches.sort(byPriority),
442
+ ...abbreviationMatches.sort(byPriority)
443
+ ];
359
444
  }
360
445
  function getPropertyValues(propertyName) {
361
446
  const values = CSS_PROPERTIES_DEFINITION[propertyName]?.values;
@@ -366,7 +451,7 @@ function filterPropertyValues(propertyName, input) {
366
451
  if (!values.length) {
367
452
  return [];
368
453
  }
369
- const normalizedInput = input.trim().toLowerCase();
454
+ const normalizedInput = (input ?? "").trim().toLowerCase();
370
455
  if (!normalizedInput) {
371
456
  return values;
372
457
  }
@@ -430,4 +515,4 @@ export {
430
515
  logRuntimeError,
431
516
  logNetworkError
432
517
  };
433
- //# sourceMappingURL=chunk-2NBGG2LJ.js.map
518
+ //# sourceMappingURL=chunk-UUA5LEWF.js.map