@maizzle/framework 6.0.6 → 6.0.8

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 (163) hide show
  1. package/dist/build.d.ts +1 -0
  2. package/dist/build.d.ts.map +1 -1
  3. package/dist/components/utils.d.ts.map +1 -1
  4. package/dist/composables/defineConfig.d.ts +1 -0
  5. package/dist/composables/defineConfig.d.ts.map +1 -1
  6. package/dist/composables/renderContext.d.ts +1 -1
  7. package/dist/composables/renderContext.d.ts.map +1 -1
  8. package/dist/composables/useBaseUrl.d.ts +1 -0
  9. package/dist/composables/useBaseUrl.d.ts.map +1 -1
  10. package/dist/composables/useConfig.d.ts +1 -1
  11. package/dist/composables/useConfig.d.ts.map +1 -1
  12. package/dist/composables/useCurrentTemplate.d.ts +0 -1
  13. package/dist/composables/useCurrentTemplate.d.ts.map +1 -1
  14. package/dist/composables/useDoctype.d.ts.map +1 -1
  15. package/dist/composables/useEvent.d.ts +0 -1
  16. package/dist/composables/useEvent.d.ts.map +1 -1
  17. package/dist/composables/useFont.d.ts.map +1 -1
  18. package/dist/composables/useOutlookFallback.d.ts.map +1 -1
  19. package/dist/composables/useOutputPath.d.ts.map +1 -1
  20. package/dist/composables/usePlaintext.d.ts.map +1 -1
  21. package/dist/composables/usePreheader.d.ts.map +1 -1
  22. package/dist/composables/useTransformers.d.ts +1 -0
  23. package/dist/composables/useTransformers.d.ts.map +1 -1
  24. package/dist/composables/useUrlQuery.d.ts +1 -0
  25. package/dist/composables/useUrlQuery.d.ts.map +1 -1
  26. package/dist/config/defaults.d.ts +1 -0
  27. package/dist/config/defaults.d.ts.map +1 -1
  28. package/dist/config/index.d.ts +1 -1
  29. package/dist/config/index.d.ts.map +1 -1
  30. package/dist/events/index.d.ts +1 -1
  31. package/dist/events/index.d.ts.map +1 -1
  32. package/dist/index.d.ts +1 -0
  33. package/dist/plaintext.d.ts.map +1 -1
  34. package/dist/plugin.d.ts +1 -1
  35. package/dist/plugin.d.ts.map +1 -1
  36. package/dist/plugins/postcss/mergeMediaQueries.d.ts +0 -1
  37. package/dist/plugins/postcss/mergeMediaQueries.d.ts.map +1 -1
  38. package/dist/plugins/postcss/pruneVars.d.ts +0 -1
  39. package/dist/plugins/postcss/pruneVars.d.ts.map +1 -1
  40. package/dist/plugins/postcss/quoteFontFamilies.d.ts +0 -1
  41. package/dist/plugins/postcss/quoteFontFamilies.d.ts.map +1 -1
  42. package/dist/plugins/postcss/removeDeclarations.d.ts +0 -1
  43. package/dist/plugins/postcss/removeDeclarations.d.ts.map +1 -1
  44. package/dist/plugins/postcss/resolveMaizzleImports.d.ts +0 -1
  45. package/dist/plugins/postcss/resolveMaizzleImports.d.ts.map +1 -1
  46. package/dist/plugins/postcss/resolveProps.d.ts +0 -1
  47. package/dist/plugins/postcss/resolveProps.d.ts.map +1 -1
  48. package/dist/plugins/postcss/resolveProps.js.map +1 -1
  49. package/dist/plugins/postcss/tailwindCleanup.d.ts +0 -1
  50. package/dist/plugins/postcss/tailwindCleanup.d.ts.map +1 -1
  51. package/dist/prepare.d.ts.map +1 -1
  52. package/dist/render/active.d.ts +0 -1
  53. package/dist/render/active.d.ts.map +1 -1
  54. package/dist/render/buildTemplate.d.ts +1 -1
  55. package/dist/render/buildTemplate.d.ts.map +1 -1
  56. package/dist/render/createRenderer.d.ts +1 -1
  57. package/dist/render/createRenderer.d.ts.map +1 -1
  58. package/dist/render/index.d.ts +1 -1
  59. package/dist/render/index.d.ts.map +1 -1
  60. package/dist/render/injectFonts.d.ts +0 -1
  61. package/dist/render/injectFonts.d.ts.map +1 -1
  62. package/dist/render/parallel/buildWorker.d.ts +1 -0
  63. package/dist/render/parallel/buildWorker.d.ts.map +1 -1
  64. package/dist/render/plugins/codeBlockExtract.d.ts +0 -1
  65. package/dist/render/plugins/codeBlockExtract.d.ts.map +1 -1
  66. package/dist/render/plugins/markdownExtract.d.ts +0 -1
  67. package/dist/render/plugins/markdownExtract.d.ts.map +1 -1
  68. package/dist/render/plugins/rawExtract.d.ts +0 -1
  69. package/dist/render/plugins/rawExtract.d.ts.map +1 -1
  70. package/dist/render/plugins/rowSourceLocation.d.ts +0 -1
  71. package/dist/render/plugins/rowSourceLocation.d.ts.map +1 -1
  72. package/dist/serve.d.ts +1 -1
  73. package/dist/serve.d.ts.map +1 -1
  74. package/dist/serve.js +22 -17
  75. package/dist/serve.js.map +1 -1
  76. package/dist/server/compatibility.d.ts +1 -1
  77. package/dist/server/compatibility.d.ts.map +1 -1
  78. package/dist/server/compatibility.js.map +1 -1
  79. package/dist/server/email.d.ts +1 -0
  80. package/dist/server/email.d.ts.map +1 -1
  81. package/dist/server/linter.d.ts +1 -1
  82. package/dist/server/linter.d.ts.map +1 -1
  83. package/dist/server/linter.js.map +1 -1
  84. package/dist/server/sfc-utils.d.ts +0 -1
  85. package/dist/server/sfc-utils.d.ts.map +1 -1
  86. package/dist/server/ui/.vite/deps/@lucide_vue.js +1 -1
  87. package/dist/server/ui/.vite/deps/@vueuse_core.js +1 -1
  88. package/dist/server/ui/.vite/deps/@vueuse_shared.js +1 -1
  89. package/dist/server/ui/.vite/deps/_metadata.json +15 -15
  90. package/dist/server/ui/.vite/deps/reka-ui.js +1 -1
  91. package/dist/server/ui/.vite/deps/vue-router.js +1 -1
  92. package/dist/server/ui/.vite/deps/vue.js +1 -1
  93. package/dist/server/ui/.vite/deps/{vue.runtime.esm-bundler-DjHXh3xg.js → vue.runtime.esm-bundler-BHD3r-bP.js} +47 -30
  94. package/dist/server/ui/.vite/deps/vue.runtime.esm-bundler-BHD3r-bP.js.map +1 -0
  95. package/dist/tests/render/_helpers.d.ts.map +1 -1
  96. package/dist/transformers/addAttributes.d.ts +0 -1
  97. package/dist/transformers/addAttributes.d.ts.map +1 -1
  98. package/dist/transformers/attributeToStyle.d.ts +0 -1
  99. package/dist/transformers/attributeToStyle.d.ts.map +1 -1
  100. package/dist/transformers/base.d.ts +0 -1
  101. package/dist/transformers/base.d.ts.map +1 -1
  102. package/dist/transformers/columnWidth.d.ts +0 -1
  103. package/dist/transformers/columnWidth.d.ts.map +1 -1
  104. package/dist/transformers/entities.d.ts +1 -1
  105. package/dist/transformers/entities.d.ts.map +1 -1
  106. package/dist/transformers/filters/defaults.d.ts.map +1 -1
  107. package/dist/transformers/filters/index.d.ts +0 -1
  108. package/dist/transformers/filters/index.d.ts.map +1 -1
  109. package/dist/transformers/format.d.ts +0 -1
  110. package/dist/transformers/format.d.ts.map +1 -1
  111. package/dist/transformers/imgWidth.d.ts +0 -1
  112. package/dist/transformers/imgWidth.d.ts.map +1 -1
  113. package/dist/transformers/index.d.ts +0 -1
  114. package/dist/transformers/index.d.ts.map +1 -1
  115. package/dist/transformers/inlineCss.d.ts +0 -1
  116. package/dist/transformers/inlineCss.d.ts.map +1 -1
  117. package/dist/transformers/inlineLink.d.ts +0 -1
  118. package/dist/transformers/inlineLink.d.ts.map +1 -1
  119. package/dist/transformers/minify.d.ts +0 -1
  120. package/dist/transformers/minify.d.ts.map +1 -1
  121. package/dist/transformers/minifyCodeInline.d.ts.map +1 -1
  122. package/dist/transformers/msoPlaceholders.d.ts +0 -1
  123. package/dist/transformers/msoPlaceholders.d.ts.map +1 -1
  124. package/dist/transformers/purgeCss.d.ts +0 -1
  125. package/dist/transformers/purgeCss.d.ts.map +1 -1
  126. package/dist/transformers/removeAttributes.d.ts +0 -1
  127. package/dist/transformers/removeAttributes.d.ts.map +1 -1
  128. package/dist/transformers/replaceStrings.d.ts +0 -1
  129. package/dist/transformers/replaceStrings.d.ts.map +1 -1
  130. package/dist/transformers/safeSelectors.d.ts +0 -1
  131. package/dist/transformers/safeSelectors.d.ts.map +1 -1
  132. package/dist/transformers/shorthandCss.d.ts +0 -1
  133. package/dist/transformers/shorthandCss.d.ts.map +1 -1
  134. package/dist/transformers/sixHex.d.ts +0 -1
  135. package/dist/transformers/sixHex.d.ts.map +1 -1
  136. package/dist/transformers/tailwindComponent.d.ts +0 -1
  137. package/dist/transformers/tailwindComponent.d.ts.map +1 -1
  138. package/dist/transformers/tailwindcss.d.ts +0 -1
  139. package/dist/transformers/tailwindcss.d.ts.map +1 -1
  140. package/dist/transformers/urlQuery.d.ts +0 -1
  141. package/dist/transformers/urlQuery.d.ts.map +1 -1
  142. package/dist/types/config.d.ts +26 -9
  143. package/dist/types/config.d.ts.map +1 -1
  144. package/dist/utils/ast/parser.d.ts +0 -1
  145. package/dist/utils/ast/parser.d.ts.map +1 -1
  146. package/dist/utils/ast/serializer.d.ts +0 -1
  147. package/dist/utils/ast/serializer.d.ts.map +1 -1
  148. package/dist/utils/ast/walker.d.ts +0 -1
  149. package/dist/utils/ast/walker.d.ts.map +1 -1
  150. package/dist/utils/cloneConfig.d.ts.map +1 -1
  151. package/dist/utils/compileTailwindCss.d.ts +0 -1
  152. package/dist/utils/compileTailwindCss.d.ts.map +1 -1
  153. package/dist/utils/componentSources.d.ts +0 -1
  154. package/dist/utils/componentSources.d.ts.map +1 -1
  155. package/dist/utils/cssBox.d.ts +0 -1
  156. package/dist/utils/cssBox.d.ts.map +1 -1
  157. package/dist/utils/decodeStyleEntities.d.ts.map +1 -1
  158. package/dist/utils/detect.d.ts.map +1 -1
  159. package/dist/utils/output-markers.d.ts.map +1 -1
  160. package/dist/utils/url.d.ts.map +1 -1
  161. package/dist/utils/watchPaths.d.ts.map +1 -1
  162. package/package.json +2 -2
  163. package/dist/server/ui/.vite/deps/vue.runtime.esm-bundler-DjHXh3xg.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"linter.js","names":[],"sources":["../../src/server/linter.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { parseSfcBlocks, findComponentTags, buildComponentMap, isFrameworkComponent } from './sfc-utils.ts'\nimport type { MaizzleConfig } from '../types/index.ts'\nimport type { NormalizedComponentSource } from '../utils/componentSources.ts'\n\nexport interface LintIssue {\n type: 'error' | 'warning'\n title: string\n message: string\n /** Which tab this lands in when merged into the Checks panel. */\n category: 'css' | 'html' | 'image' | 'others'\n /** Optional caniemail slug for URL enrichment (e.g. \"html-html\"). */\n slug?: string\n line?: number\n file: string\n}\n\ninterface Presence {\n html: boolean\n head: boolean\n body: boolean\n}\n\n/**\n * Maizzle auto-adds role=\"none\" to every <table> by default via the\n * addAttributes transformer. Warn about missing role only when that won't\n * happen:\n * - useTransformers: false → whole pipeline off\n * - html.attributes.add: false → auto-add disabled globally\n * - add.table: false → table selector opted out\n * - add.table.role: false → role attribute specifically opted out\n * An empty `add.table: {}` still inherits role via defu merge, so it's fine.\n */\nfunction tableRoleAutoAdded(config: MaizzleConfig): boolean {\n if (config.useTransformers === false) return false\n const add = config.html?.attributes?.add\n if (add === false) return false\n if (!add || typeof add !== 'object') return true\n const table = (add as any).table\n if (table === false) return false\n if (table && typeof table === 'object' && table.role === false) return false\n return true\n}\n\nexport async function scanLint(\n rootFile: string,\n config: MaizzleConfig,\n componentDirs: NormalizedComponentSource[],\n): Promise<LintIssue[]> {\n const root = config.root ?? process.cwd()\n const componentMap = await buildComponentMap(root, componentDirs)\n const visited = new Set<string>()\n const presence: Presence = { html: false, head: false, body: false }\n const checkTableRole = !tableRoleAutoAdded(config)\n const issues = checkFile(rootFile, componentMap, visited, presence, checkTableRole)\n\n if (!presence.html) issues.push({ type: 'warning', category: 'html', title: 'Missing <html>', message: 'Root <html> tag not found in the template or any of its components.', slug: 'html-html', line: 1, file: rootFile })\n if (!presence.head) issues.push({ type: 'warning', category: 'html', title: 'Missing <head>', message: 'Root <head> tag not found in the template or any of its components.', slug: 'html-head', line: 1, file: rootFile })\n if (!presence.body) issues.push({ type: 'warning', category: 'html', title: 'Missing <body>', message: 'Root <body> tag not found in the template or any of its components.', slug: 'html-body', line: 1, file: rootFile })\n\n return issues\n}\n\nexport async function serveLint(url: string, res: any, config: MaizzleConfig, componentDirs: NormalizedComponentSource[]) {\n const filePath = url.replace('/__maizzle/lint/', '').replace(/\\?.*$/, '')\n\n try {\n const absolutePath = resolve(filePath)\n const issues = (await scanLint(absolutePath, config, componentDirs))\n .filter(i => !isFrameworkComponent(i.file))\n\n // Sort: errors first, then warnings, then by line\n issues.sort((a, b) => {\n if (a.type !== b.type) return a.type === 'error' ? -1 : 1\n return (a.line ?? 0) - (b.line ?? 0)\n })\n\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify(issues))\n } catch (error: any) {\n res.statusCode = 500\n res.end(JSON.stringify({ error: error.message }))\n }\n}\n\nfunction checkFile(\n filePath: string,\n componentMap: Map<string, string>,\n visited: Set<string>,\n presence: Presence,\n checkTableRole: boolean,\n): LintIssue[] {\n if (visited.has(filePath)) return []\n visited.add(filePath)\n\n let source: string\n try {\n source = readFileSync(filePath, 'utf-8')\n } catch {\n return []\n }\n\n const { template } = parseSfcBlocks(source)\n const issues: LintIssue[] = []\n\n if (template) {\n issues.push(...lintHtml(template.content, template.offset, filePath, presence, checkTableRole))\n\n // Recurse into components\n const componentTags = findComponentTags(template.content)\n for (const tag of componentTags) {\n const componentPath = componentMap.get(tag.toLowerCase())\n if (componentPath) {\n issues.push(...checkFile(componentPath, componentMap, visited, presence, checkTableRole))\n }\n }\n }\n\n return issues\n}\n\nfunction lineAt(html: string, offset: number, lineOffset: number): number {\n return html.slice(0, offset).split('\\n').length + lineOffset\n}\n\n/**\n * True if the <img> tag has a width defined via any of:\n * - `width` attribute\n * - inline `style` with a `width` property\n * - class attribute with a Tailwind `w-` utility (any variant prefix like\n * sm:, hover:), or an arbitrary `[width:…]` utility\n */\nfunction hasWidthDefined(imgTag: string): boolean {\n if (/\\bwidth\\s*=/i.test(imgTag)) return true\n\n const styleMatch = imgTag.match(/\\bstyle\\s*=\\s*[\"']([^\"']*)[\"']/i)\n if (styleMatch && /(^|[;\\s])width\\s*:/i.test(styleMatch[1])) return true\n\n const classMatch = imgTag.match(/\\bclass\\s*=\\s*[\"']([^\"']*)[\"']/i)\n if (classMatch) {\n const classes = classMatch[1]\n if (/(?:^|\\s)(?:[a-z0-9-]+:)*w-\\S+/i.test(classes)) return true\n if (/\\[width:/i.test(classes)) return true\n }\n return false\n}\n\nfunction lintHtml(html: string, lineOffset: number, filePath: string, presence: Presence, checkTableRole: boolean): LintIssue[] {\n const issues: LintIssue[] = []\n\n // Match all tags (multiline) — [^>] doesn't cross > so use [\\s\\S] with lazy quantifier\n const tagRe = /<([a-zA-Z][a-zA-Z0-9]*)\\b([\\s\\S]*?)>/g\n\n for (const m of Array.from(html.matchAll(tagRe))) {\n const tag = m[0]\n const tagName = m[1].toLowerCase()\n const line = lineAt(html, m.index!, lineOffset)\n\n if (tagName === 'html') presence.html = true\n else if (tagName === 'head') presence.head = true\n else if (tagName === 'body') presence.body = true\n\n /**\n * Layout tables — accessibility requires role=\"none\" so screen readers\n * skip the table structure. Only surface the warning when the user\n * has disabled Maizzle's auto-role-add; otherwise every build\n * step output already has role=\"none\" set.\n */\n if (checkTableRole && tagName === 'table') {\n const roleMatch = tag.match(/\\brole\\s*=\\s*[\"']([^\"']*)[\"']/i)\n if (!roleMatch) {\n const tableEndIdx = html.indexOf('</table>', m.index!)\n const inner = tableEndIdx >= 0 ? html.slice(m.index!, tableEndIdx) : ''\n const isDataTable = /<th\\b/i.test(inner) || /<caption\\b/i.test(inner)\n if (!isDataTable) {\n issues.push({ type: 'warning', category: 'html', title: 'Layout table missing role', message: 'Add role=\"none\" so screen readers skip this layout table.', slug: 'html-role', line, file: filePath })\n }\n }\n }\n\n // Images\n if (tagName === 'img') {\n if (!/\\balt\\s*=/i.test(tag)) {\n issues.push({ type: 'warning', category: 'image', title: 'Missing alt text', message: 'Image is missing the alt attribute', line, file: filePath })\n }\n\n const srcMatch = tag.match(/\\bsrc\\s*=\\s*[\"']([^\"']*)[\"']/i)\n if (!srcMatch) {\n issues.push({ type: 'error', category: 'image', title: 'Missing image src', message: 'Image tag has no src attribute', line, file: filePath })\n } else if (!srcMatch[1].trim()) {\n issues.push({ type: 'error', category: 'image', title: 'Empty image src', message: 'Image src attribute is empty', line, file: filePath })\n } else if (srcMatch[1].trim().startsWith('http:')) {\n issues.push({ type: 'warning', category: 'image', title: 'Insecure image src', message: 'Image loads over HTTP instead of HTTPS', line, file: filePath })\n }\n\n if (!hasWidthDefined(tag)) {\n issues.push({ type: 'warning', category: 'image', title: 'Missing image width', message: 'Use a `width=\"\"` attribute for best results in Outlook', line, file: filePath })\n }\n }\n\n // Any tag with href — skip resource tags handled below\n if (!['link', 'script', 'source'].includes(tagName)) {\n const hrefMatch = tag.match(/\\bhref\\s*=\\s*[\"']([^\"']*)[\"']/i)\n if (hrefMatch) {\n const href = hrefMatch[1].trim()\n if (!href) {\n issues.push({ type: 'error', category: 'html', title: 'Empty link href', message: 'Link href attribute is empty', line, file: filePath })\n } else if (href === '#' || href === '/') {\n issues.push({ type: 'error', category: 'html', title: 'Placeholder link', message: `Link href is \"${href}\"`, line, file: filePath })\n } else if (href.startsWith('http:')) {\n issues.push({ type: 'warning', category: 'html', title: 'Insecure link', message: 'Link uses HTTP instead of HTTPS', line, file: filePath })\n } else if (href.startsWith('http') && !/^https?:\\/\\/.+\\..+/i.test(href)) {\n issues.push({ type: 'error', category: 'html', title: 'Invalid link', message: `Link href \"${href}\" looks malformed`, line, file: filePath })\n }\n }\n }\n\n // Insecure resources (<link>, <script>, <source>)\n if (['link', 'script', 'source'].includes(tagName)) {\n const attrMatch = tag.match(/\\b(?:href|src)\\s*=\\s*[\"']([^\"']*)[\"']/i)\n if (attrMatch && attrMatch[1].trim().startsWith('http:')) {\n issues.push({ type: 'warning', category: 'html', title: 'Insecure resource', message: 'Resource loads over HTTP instead of HTTPS', line, file: filePath })\n }\n }\n }\n\n // Insecure CSS url() references\n for (const m of Array.from(html.matchAll(/url\\s*\\(\\s*[\"']?(http:[^\"')]+)[\"']?\\s*\\)/gi))) {\n issues.push({ type: 'warning', category: 'css', title: 'Insecure CSS url()', message: 'CSS url() loads over HTTP instead of HTTPS', line: lineAt(html, m.index!, lineOffset), file: filePath })\n }\n\n // Check for unclosed tags (block-level and common inline elements)\n const voidElements = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr',\n ])\n\n const trackedTags = new Set([\n 'a', 'b', 'body', 'div', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'head', 'html', 'i', 'li', 'ol', 'p', 'span', 'strong', 'style',\n 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'title', 'tr', 'u', 'ul',\n ])\n\n const stack: Array<{ tag: string, line: number }> = []\n\n // Strip comments and content inside <style>/<script> to avoid false matches\n const stripped = html\n .replace(/<!--[\\s\\S]*?-->/g, (m) => '\\n'.repeat((m.match(/\\n/g) || []).length))\n .replace(/<(style|script)\\b[^>]*>[\\s\\S]*?<\\/\\1>/gi, (m) => '\\n'.repeat((m.match(/\\n/g) || []).length))\n\n const strippedLines = stripped.split('\\n')\n\n for (let i = 0; i < strippedLines.length; i++) {\n const line = strippedLines[i]\n const tagRegex = /<\\/?([a-zA-Z][a-zA-Z0-9]*)\\b[^>]*\\/?>/g\n let m\n\n while ((m = tagRegex.exec(line)) !== null) {\n const fullMatch = m[0]\n const tagName = m[1].toLowerCase()\n\n if (!trackedTags.has(tagName) || voidElements.has(tagName)) continue\n if (fullMatch.endsWith('/>')) continue\n\n if (fullMatch.startsWith('</')) {\n // Closing tag\n let lastOpen = -1\n for (let j = stack.length - 1; j >= 0; j--) {\n if (stack[j].tag === tagName) { lastOpen = j; break }\n }\n if (lastOpen !== -1) {\n stack.splice(lastOpen, 1)\n }\n } else {\n // Opening tag\n stack.push({ tag: tagName, line: i + 1 + lineOffset })\n }\n }\n }\n\n for (const unclosed of stack) {\n issues.push({\n type: 'error',\n category: 'html',\n title: 'Unclosed tag',\n message: `<${unclosed.tag}> tag is not closed`,\n line: unclosed.line,\n file: filePath,\n })\n }\n\n return issues\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"linter.js","names":[],"sources":["../../src/server/linter.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { parseSfcBlocks, findComponentTags, buildComponentMap, isFrameworkComponent } from './sfc-utils.ts'\nimport type { MaizzleConfig } from '../types/index.ts'\nimport type { NormalizedComponentSource } from '../utils/componentSources.ts'\n\nexport interface LintIssue {\n type: 'error' | 'warning'\n title: string\n message: string\n /** Which tab this lands in when merged into the Checks panel. */\n category: 'css' | 'html' | 'image' | 'others'\n /** Optional caniemail slug for URL enrichment (e.g. \"html-html\"). */\n slug?: string\n line?: number\n file: string\n}\n\ninterface Presence {\n html: boolean\n head: boolean\n body: boolean\n}\n\n/**\n * Maizzle auto-adds role=\"none\" to every <table> by default via the\n * addAttributes transformer. Warn about missing role only when that won't\n * happen:\n * - useTransformers: false → whole pipeline off\n * - html.attributes.add: false → auto-add disabled globally\n * - add.table: false → table selector opted out\n * - add.table.role: false → role attribute specifically opted out\n * An empty `add.table: {}` still inherits role via defu merge, so it's fine.\n */\nfunction tableRoleAutoAdded(config: MaizzleConfig): boolean {\n if (config.useTransformers === false) return false\n const add = config.html?.attributes?.add\n if (add === false) return false\n if (!add || typeof add !== 'object') return true\n const table = (add as any).table\n if (table === false) return false\n if (table && typeof table === 'object' && table.role === false) return false\n return true\n}\n\nexport async function scanLint(\n rootFile: string,\n config: MaizzleConfig,\n componentDirs: NormalizedComponentSource[],\n): Promise<LintIssue[]> {\n const root = config.root ?? process.cwd()\n const componentMap = await buildComponentMap(root, componentDirs)\n const visited = new Set<string>()\n const presence: Presence = { html: false, head: false, body: false }\n const checkTableRole = !tableRoleAutoAdded(config)\n const issues = checkFile(rootFile, componentMap, visited, presence, checkTableRole)\n\n if (!presence.html) issues.push({ type: 'warning', category: 'html', title: 'Missing <html>', message: 'Root <html> tag not found in the template or any of its components.', slug: 'html-html', line: 1, file: rootFile })\n if (!presence.head) issues.push({ type: 'warning', category: 'html', title: 'Missing <head>', message: 'Root <head> tag not found in the template or any of its components.', slug: 'html-head', line: 1, file: rootFile })\n if (!presence.body) issues.push({ type: 'warning', category: 'html', title: 'Missing <body>', message: 'Root <body> tag not found in the template or any of its components.', slug: 'html-body', line: 1, file: rootFile })\n\n return issues\n}\n\nexport async function serveLint(url: string, res: any, config: MaizzleConfig, componentDirs: NormalizedComponentSource[]) {\n const filePath = url.replace('/__maizzle/lint/', '').replace(/\\?.*$/, '')\n\n try {\n const absolutePath = resolve(filePath)\n const issues = (await scanLint(absolutePath, config, componentDirs))\n .filter(i => !isFrameworkComponent(i.file))\n\n // Sort: errors first, then warnings, then by line\n issues.sort((a, b) => {\n if (a.type !== b.type) return a.type === 'error' ? -1 : 1\n return (a.line ?? 0) - (b.line ?? 0)\n })\n\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify(issues))\n } catch (error: any) {\n res.statusCode = 500\n res.end(JSON.stringify({ error: error.message }))\n }\n}\n\nfunction checkFile(\n filePath: string,\n componentMap: Map<string, string>,\n visited: Set<string>,\n presence: Presence,\n checkTableRole: boolean,\n): LintIssue[] {\n if (visited.has(filePath)) return []\n visited.add(filePath)\n\n let source: string\n try {\n source = readFileSync(filePath, 'utf-8')\n } catch {\n return []\n }\n\n const { template } = parseSfcBlocks(source)\n const issues: LintIssue[] = []\n\n if (template) {\n issues.push(...lintHtml(template.content, template.offset, filePath, presence, checkTableRole))\n\n // Recurse into components\n const componentTags = findComponentTags(template.content)\n for (const tag of componentTags) {\n const componentPath = componentMap.get(tag.toLowerCase())\n if (componentPath) {\n issues.push(...checkFile(componentPath, componentMap, visited, presence, checkTableRole))\n }\n }\n }\n\n return issues\n}\n\nfunction lineAt(html: string, offset: number, lineOffset: number): number {\n return html.slice(0, offset).split('\\n').length + lineOffset\n}\n\n/**\n * True if the <img> tag has a width defined via any of:\n * - `width` attribute\n * - inline `style` with a `width` property\n * - class attribute with a Tailwind `w-` utility (any variant prefix like\n * sm:, hover:), or an arbitrary `[width:…]` utility\n */\nfunction hasWidthDefined(imgTag: string): boolean {\n if (/\\bwidth\\s*=/i.test(imgTag)) return true\n\n const styleMatch = imgTag.match(/\\bstyle\\s*=\\s*[\"']([^\"']*)[\"']/i)\n if (styleMatch && /(^|[;\\s])width\\s*:/i.test(styleMatch[1])) return true\n\n const classMatch = imgTag.match(/\\bclass\\s*=\\s*[\"']([^\"']*)[\"']/i)\n if (classMatch) {\n const classes = classMatch[1]\n if (/(?:^|\\s)(?:[a-z0-9-]+:)*w-\\S+/i.test(classes)) return true\n if (/\\[width:/i.test(classes)) return true\n }\n return false\n}\n\nfunction lintHtml(html: string, lineOffset: number, filePath: string, presence: Presence, checkTableRole: boolean): LintIssue[] {\n const issues: LintIssue[] = []\n\n // Match all tags (multiline) — [^>] doesn't cross > so use [\\s\\S] with lazy quantifier\n const tagRe = /<([a-zA-Z][a-zA-Z0-9]*)\\b([\\s\\S]*?)>/g\n\n for (const m of Array.from(html.matchAll(tagRe))) {\n const tag = m[0]\n const tagName = m[1].toLowerCase()\n const line = lineAt(html, m.index!, lineOffset)\n\n if (tagName === 'html') presence.html = true\n else if (tagName === 'head') presence.head = true\n else if (tagName === 'body') presence.body = true\n\n /**\n * Layout tables — accessibility requires role=\"none\" so screen readers\n * skip the table structure. Only surface the warning when the user\n * has disabled Maizzle's auto-role-add; otherwise every build\n * step output already has role=\"none\" set.\n */\n if (checkTableRole && tagName === 'table') {\n const roleMatch = tag.match(/\\brole\\s*=\\s*[\"']([^\"']*)[\"']/i)\n if (!roleMatch) {\n const tableEndIdx = html.indexOf('</table>', m.index!)\n const inner = tableEndIdx >= 0 ? html.slice(m.index!, tableEndIdx) : ''\n const isDataTable = /<th\\b/i.test(inner) || /<caption\\b/i.test(inner)\n if (!isDataTable) {\n issues.push({ type: 'warning', category: 'html', title: 'Layout table missing role', message: 'Add role=\"none\" so screen readers skip this layout table.', slug: 'html-role', line, file: filePath })\n }\n }\n }\n\n // Images\n if (tagName === 'img') {\n if (!/\\balt\\s*=/i.test(tag)) {\n issues.push({ type: 'warning', category: 'image', title: 'Missing alt text', message: 'Image is missing the alt attribute', line, file: filePath })\n }\n\n const srcMatch = tag.match(/\\bsrc\\s*=\\s*[\"']([^\"']*)[\"']/i)\n if (!srcMatch) {\n issues.push({ type: 'error', category: 'image', title: 'Missing image src', message: 'Image tag has no src attribute', line, file: filePath })\n } else if (!srcMatch[1].trim()) {\n issues.push({ type: 'error', category: 'image', title: 'Empty image src', message: 'Image src attribute is empty', line, file: filePath })\n } else if (srcMatch[1].trim().startsWith('http:')) {\n issues.push({ type: 'warning', category: 'image', title: 'Insecure image src', message: 'Image loads over HTTP instead of HTTPS', line, file: filePath })\n }\n\n if (!hasWidthDefined(tag)) {\n issues.push({ type: 'warning', category: 'image', title: 'Missing image width', message: 'Use a `width=\"\"` attribute for best results in Outlook', line, file: filePath })\n }\n }\n\n // Any tag with href — skip resource tags handled below\n if (!['link', 'script', 'source'].includes(tagName)) {\n const hrefMatch = tag.match(/\\bhref\\s*=\\s*[\"']([^\"']*)[\"']/i)\n if (hrefMatch) {\n const href = hrefMatch[1].trim()\n if (!href) {\n issues.push({ type: 'error', category: 'html', title: 'Empty link href', message: 'Link href attribute is empty', line, file: filePath })\n } else if (href === '#' || href === '/') {\n issues.push({ type: 'error', category: 'html', title: 'Placeholder link', message: `Link href is \"${href}\"`, line, file: filePath })\n } else if (href.startsWith('http:')) {\n issues.push({ type: 'warning', category: 'html', title: 'Insecure link', message: 'Link uses HTTP instead of HTTPS', line, file: filePath })\n } else if (href.startsWith('http') && !/^https?:\\/\\/.+\\..+/i.test(href)) {\n issues.push({ type: 'error', category: 'html', title: 'Invalid link', message: `Link href \"${href}\" looks malformed`, line, file: filePath })\n }\n }\n }\n\n // Insecure resources (<link>, <script>, <source>)\n if (['link', 'script', 'source'].includes(tagName)) {\n const attrMatch = tag.match(/\\b(?:href|src)\\s*=\\s*[\"']([^\"']*)[\"']/i)\n if (attrMatch && attrMatch[1].trim().startsWith('http:')) {\n issues.push({ type: 'warning', category: 'html', title: 'Insecure resource', message: 'Resource loads over HTTP instead of HTTPS', line, file: filePath })\n }\n }\n }\n\n // Insecure CSS url() references\n for (const m of Array.from(html.matchAll(/url\\s*\\(\\s*[\"']?(http:[^\"')]+)[\"']?\\s*\\)/gi))) {\n issues.push({ type: 'warning', category: 'css', title: 'Insecure CSS url()', message: 'CSS url() loads over HTTP instead of HTTPS', line: lineAt(html, m.index!, lineOffset), file: filePath })\n }\n\n // Check for unclosed tags (block-level and common inline elements)\n const voidElements = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr',\n ])\n\n const trackedTags = new Set([\n 'a', 'b', 'body', 'div', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'head', 'html', 'i', 'li', 'ol', 'p', 'span', 'strong', 'style',\n 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'title', 'tr', 'u', 'ul',\n ])\n\n const stack: Array<{ tag: string, line: number }> = []\n\n // Strip comments and content inside <style>/<script> to avoid false matches\n const stripped = html\n .replace(/<!--[\\s\\S]*?-->/g, (m) => '\\n'.repeat((m.match(/\\n/g) || []).length))\n .replace(/<(style|script)\\b[^>]*>[\\s\\S]*?<\\/\\1>/gi, (m) => '\\n'.repeat((m.match(/\\n/g) || []).length))\n\n const strippedLines = stripped.split('\\n')\n\n for (let i = 0; i < strippedLines.length; i++) {\n const line = strippedLines[i]\n const tagRegex = /<\\/?([a-zA-Z][a-zA-Z0-9]*)\\b[^>]*\\/?>/g\n let m\n\n while ((m = tagRegex.exec(line)) !== null) {\n const fullMatch = m[0]\n const tagName = m[1].toLowerCase()\n\n if (!trackedTags.has(tagName) || voidElements.has(tagName)) continue\n if (fullMatch.endsWith('/>')) continue\n\n if (fullMatch.startsWith('</')) {\n // Closing tag\n let lastOpen = -1\n for (let j = stack.length - 1; j >= 0; j--) {\n if (stack[j].tag === tagName) { lastOpen = j; break }\n }\n if (lastOpen !== -1) {\n stack.splice(lastOpen, 1)\n }\n } else {\n // Opening tag\n stack.push({ tag: tagName, line: i + 1 + lineOffset })\n }\n }\n }\n\n for (const unclosed of stack) {\n issues.push({\n type: 'error',\n category: 'html',\n title: 'Unclosed tag',\n message: `<${unclosed.tag}> tag is not closed`,\n line: unclosed.line,\n file: filePath,\n })\n }\n\n return issues\n}\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { NormalizedComponentSource } from "../utils/componentSources.js";
2
-
3
2
  //#region src/server/sfc-utils.d.ts
4
3
  declare function isFrameworkComponent(file: string): boolean;
5
4
  interface SfcBlock {
@@ -1 +1 @@
1
- {"version":3,"file":"sfc-utils.d.ts","names":[],"sources":["../../src/server/sfc-utils.ts"],"mappings":";;;iBAegB,oBAAA,CAAqB,IAAY;AAAA,UAIhC,QAAA;EACf,OAAA;EACA,MAAM;AAAA;AAAA,iBAGQ,cAAA,CAAe,MAAA;EAAmB,QAAA,EAAU,QAAA;EAAiB,MAAA,EAAQ,QAAQ;AAAA;;;AAHrF;cA+BK,aAAA,EAAa,GAAA;AAAA,iBAgBV,iBAAA,CAAkB,eAAuB;AAAA,iBAqBnC,iBAAA,CACpB,IAAA,UACA,aAAA,EAAe,yBAAA,KACd,OAAA,CAAQ,GAAA"}
1
+ {"version":3,"file":"sfc-utils.d.ts","names":[],"sources":["../../src/server/sfc-utils.ts"],"mappings":";;iBAegB,qBAAqB;UAIpB;EACf;EACA;;iBAGc,eAAe;EAAmB,UAAU;EAAiB,QAAQ;;;;;cA4BxE,eAAa;iBAgBV,kBAAkB;iBAqBZ,kBACpB,cACA,eAAe,8BACd,QAAQ"}
@@ -1,5 +1,5 @@
1
1
  import { n as __exportAll } from "./rolldown-runtime-EAsCxrDo.js";
2
- import { St as inject, W as computed, Wt as provide, mt as h } from "./vue.runtime.esm-bundler-DjHXh3xg.js";
2
+ import { St as inject, W as computed, Wt as provide, mt as h } from "./vue.runtime.esm-bundler-BHD3r-bP.js";
3
3
  //#region ../../home/cosmin/Work/maizzle/framework/node_modules/@lucide/vue/dist/esm/shared/src/utils/isEmptyString.mjs
4
4
  /**
5
5
  * @license @lucide/vue v1.24.0 - ISC
@@ -1,4 +1,4 @@
1
- import { Gn as reactive, It as onMounted, Jn as shallowReactive, Kn as readonly, N as Fragment, Nt as onBeforeUpdate, Pn as getCurrentScope, Qn as toRaw, Rn as isReadonly, St as inject, Vn as markRaw, Vt as onUpdated, W as computed, Xn as shallowRef, Yn as shallowReadonly, _n as watch, dt as getCurrentInstance, gt as hasInjectionContext, i as TransitionGroup, jn as customRef, kt as nextTick, mt as h, qn as ref, rr as unref, rt as defineComponent, tr as toValue, vn as watchEffect, zn as isRef } from "./vue.runtime.esm-bundler-DjHXh3xg.js";
1
+ import { Gn as reactive, It as onMounted, Jn as shallowReactive, Kn as readonly, N as Fragment, Nt as onBeforeUpdate, Pn as getCurrentScope, Qn as toRaw, Rn as isReadonly, St as inject, Vn as markRaw, Vt as onUpdated, W as computed, Xn as shallowRef, Yn as shallowReadonly, _n as watch, dt as getCurrentInstance, gt as hasInjectionContext, i as TransitionGroup, jn as customRef, kt as nextTick, mt as h, qn as ref, rr as unref, rt as defineComponent, tr as toValue, vn as watchEffect, zn as isRef } from "./vue.runtime.esm-bundler-BHD3r-bP.js";
2
2
  import { assert, autoResetRef, bypassFilter, camelize, clamp, computedEager, computedWithControl, containsProp, controlledComputed, controlledRef, createDisposableDirective, createEventHook, createFilterWrapper, createGlobalState, createInjectionState, createReactiveFn, createRef, createSharedComposable, createSingletonPromise, debounceFilter, debouncedRef, debouncedWatch, eagerComputed, extendRef, formatDate, get, getLifeCycleTarget, hasOwn, hyphenate, identity, ignorableWatch, increaseWithUnit, injectLocal, invoke, isClient, isDef, isDefined, isIOS, isObject, isWorker, makeDestructurable, noop, normalizeDate, notNullish, now, objectEntries, objectOmit, objectPick, pausableFilter, pausableWatch, promiseTimeout, provideLocal, pxValue, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refAutoReset, refDebounced, refDefault, refManualReset, refThrottled, refWithControl, set, syncRef, syncRefs, throttleFilter, throttledRef, throttledWatch, timestamp, toArray, toReactive, toRef, toRefs, tryOnBeforeMount, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useArrayDifference, useArrayEvery, useArrayFilter, useArrayFind, useArrayFindIndex, useArrayFindLast, useArrayIncludes, useArrayJoin, useArrayMap, useArrayReduce, useArraySome, useArrayUnique, useCounter, useDateFormat, useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToNumber, useToString, useToggle, watchArray, watchAtMost, watchDebounced, watchDeep, watchIgnorable, watchImmediate, watchOnce, watchPausable, watchThrottled, watchTriggerable, watchWithFilter, whenever } from "./@vueuse_shared.js";
3
3
  //#region ../../home/cosmin/Work/maizzle/framework/node_modules/@vueuse/core/dist/index.js
4
4
  function computedAsync(evaluationCallback, initialState, optionsOrRef) {
@@ -1,4 +1,4 @@
1
- import { $n as toRef$1, Bt as onUnmounted, Gn as reactive, Hn as onScopeDispose, It as onMounted, Kn as readonly, Ln as isReactive, Mt as onBeforeUnmount, Nn as effectScope, Pn as getCurrentScope, St as inject, W as computed, Wt as provide, Xn as shallowRef, Yn as shallowReadonly, _n as watch, dt as getCurrentInstance, er as toRefs$1, gt as hasInjectionContext, jn as customRef, jt as onBeforeMount, kt as nextTick, qn as ref, rr as unref, tr as toValue, vn as watchEffect, zn as isRef } from "./vue.runtime.esm-bundler-DjHXh3xg.js";
1
+ import { $n as toRef$1, Bt as onUnmounted, Gn as reactive, Hn as onScopeDispose, It as onMounted, Kn as readonly, Ln as isReactive, Mt as onBeforeUnmount, Nn as effectScope, Pn as getCurrentScope, St as inject, W as computed, Wt as provide, Xn as shallowRef, Yn as shallowReadonly, _n as watch, dt as getCurrentInstance, er as toRefs$1, gt as hasInjectionContext, jn as customRef, jt as onBeforeMount, kt as nextTick, qn as ref, rr as unref, tr as toValue, vn as watchEffect, zn as isRef } from "./vue.runtime.esm-bundler-BHD3r-bP.js";
2
2
  //#region ../../home/cosmin/Work/maizzle/framework/node_modules/@vueuse/shared/dist/index.js
3
3
  /**
4
4
  *
@@ -1,67 +1,67 @@
1
1
  {
2
- "hash": "440adf7d",
3
- "configHash": "bde2db20",
2
+ "hash": "3b54bef3",
3
+ "configHash": "713dc748",
4
4
  "lockfileHash": "e3b0c442",
5
- "browserHash": "570d52d6",
5
+ "browserHash": "ce701eeb",
6
6
  "optimized": {
7
7
  "@lucide/vue": {
8
8
  "src": "../../../../../node_modules/@lucide/vue/dist/esm/lucide-vue.mjs",
9
9
  "file": "@lucide_vue.js",
10
- "fileHash": "04970e18",
10
+ "fileHash": "706ba87f",
11
11
  "needsInterop": false
12
12
  },
13
13
  "@vueuse/core": {
14
14
  "src": "../../../../../node_modules/@vueuse/core/dist/index.js",
15
15
  "file": "@vueuse_core.js",
16
- "fileHash": "252deb76",
16
+ "fileHash": "3cf62389",
17
17
  "needsInterop": false
18
18
  },
19
19
  "@vueuse/shared": {
20
20
  "src": "../../../../../node_modules/@vueuse/shared/dist/index.js",
21
21
  "file": "@vueuse_shared.js",
22
- "fileHash": "4525ac26",
22
+ "fileHash": "9c0b3c8f",
23
23
  "needsInterop": false
24
24
  },
25
25
  "class-variance-authority": {
26
26
  "src": "../../../../../node_modules/class-variance-authority/dist/index.mjs",
27
27
  "file": "class-variance-authority.js",
28
- "fileHash": "3c213bbf",
28
+ "fileHash": "d7aca618",
29
29
  "needsInterop": false
30
30
  },
31
31
  "clsx": {
32
32
  "src": "../../../../../node_modules/clsx/dist/clsx.mjs",
33
33
  "file": "clsx.js",
34
- "fileHash": "1288be85",
34
+ "fileHash": "a2824016",
35
35
  "needsInterop": false
36
36
  },
37
37
  "culori": {
38
38
  "src": "../../../../../node_modules/culori/src/index.js",
39
39
  "file": "culori.js",
40
- "fileHash": "bfffba01",
40
+ "fileHash": "2168c639",
41
41
  "needsInterop": false
42
42
  },
43
43
  "reka-ui": {
44
44
  "src": "../../../../../node_modules/reka-ui/dist/index.js",
45
45
  "file": "reka-ui.js",
46
- "fileHash": "da88a809",
46
+ "fileHash": "73e1ad3a",
47
47
  "needsInterop": false
48
48
  },
49
49
  "tailwind-merge": {
50
50
  "src": "../../../../../node_modules/tailwind-merge/dist/bundle-cjs.js",
51
51
  "file": "tailwind-merge.js",
52
- "fileHash": "6190174b",
52
+ "fileHash": "c8257a39",
53
53
  "needsInterop": true
54
54
  },
55
55
  "vue-router": {
56
56
  "src": "../../../../../node_modules/vue-router/dist/vue-router.js",
57
57
  "file": "vue-router.js",
58
- "fileHash": "a144558b",
58
+ "fileHash": "e47dc4d6",
59
59
  "needsInterop": false
60
60
  },
61
61
  "vue": {
62
62
  "src": "../../../../../node_modules/vue/dist/vue.runtime.esm-bundler.js",
63
63
  "file": "vue.js",
64
- "fileHash": "5672aa68",
64
+ "fileHash": "2ea5bfb6",
65
65
  "needsInterop": false
66
66
  }
67
67
  },
@@ -70,8 +70,8 @@
70
70
  "file": "rolldown-runtime-EAsCxrDo.js",
71
71
  "isDynamicEntry": false
72
72
  },
73
- "vue.runtime.esm-bundler-DjHXh3xg": {
74
- "file": "vue.runtime.esm-bundler-DjHXh3xg.js",
73
+ "vue.runtime.esm-bundler-BHD3r-bP": {
74
+ "file": "vue.runtime.esm-bundler-BHD3r-bP.js",
75
75
  "isDynamicEntry": false
76
76
  }
77
77
  }
@@ -1,4 +1,4 @@
1
- import { $n as toRef, Bt as onUnmounted, E as withModifiers, Et as mergeDefaults, G as createBaseVNode, Gn as reactive, H as cloneVNode, Hn as onScopeDispose, Ht as openBlock, It as onMounted, J as createElementBlock, Jt as renderList, K as createBlock, L as Teleport, Mt as onBeforeUnmount, N as Fragment, Ot as mergeProps, Pn as getCurrentScope, Qn as toRaw, Qt as resolveDynamicComponent, Sn as withCtx, St as inject, T as withKeys, Tn as withMemo, Vn as markRaw, Vt as onUpdated, W as computed, Wt as provide, Xn as shallowRef, Yn as shallowReadonly, Yt as renderSlot, _n as watch, bn as watchSyncEffect, cn as useAttrs, cr as normalizeStyle, dt as getCurrentInstance, er as toRefs, et as createTextVNode, fn as useSlots, ir as camelize, jt as onBeforeMount, k as Comment, kt as nextTick, ln as useId$1, lr as toDisplayString, mt as h, n as vue_runtime_esm_bundler_exports, nr as triggerRef, on as toHandlers, pt as guardReactiveProps, q as createCommentVNode, qn as ref, rr as unref, rt as defineComponent, sr as normalizeProps, tr as toValue$1, tt as createVNode, ur as toHandlerKey, vn as watchEffect, w as vShow, wn as withDirectives, yn as watchPostEffect, zn as isRef } from "./vue.runtime.esm-bundler-DjHXh3xg.js";
1
+ import { $n as toRef, Bt as onUnmounted, E as withModifiers, Et as mergeDefaults, G as createBaseVNode, Gn as reactive, H as cloneVNode, Hn as onScopeDispose, Ht as openBlock, It as onMounted, J as createElementBlock, Jt as renderList, K as createBlock, L as Teleport, Mt as onBeforeUnmount, N as Fragment, Ot as mergeProps, Pn as getCurrentScope, Qn as toRaw, Qt as resolveDynamicComponent, Sn as withCtx, St as inject, T as withKeys, Tn as withMemo, Vn as markRaw, Vt as onUpdated, W as computed, Wt as provide, Xn as shallowRef, Yn as shallowReadonly, Yt as renderSlot, _n as watch, bn as watchSyncEffect, cn as useAttrs, cr as normalizeStyle, dt as getCurrentInstance, er as toRefs, et as createTextVNode, fn as useSlots, ir as camelize, jt as onBeforeMount, k as Comment, kt as nextTick, ln as useId$1, lr as toDisplayString, mt as h, n as vue_runtime_esm_bundler_exports, nr as triggerRef, on as toHandlers, pt as guardReactiveProps, q as createCommentVNode, qn as ref, rr as unref, rt as defineComponent, sr as normalizeProps, tr as toValue$1, tt as createVNode, ur as toHandlerKey, vn as watchEffect, w as vShow, wn as withDirectives, yn as watchPostEffect, zn as isRef } from "./vue.runtime.esm-bundler-BHD3r-bP.js";
2
2
  import { createEventHook, createGlobalState, createSharedComposable, isClient, isIOS, reactiveComputed, reactiveOmit, refAutoReset, syncRef, tryOnBeforeUnmount, tryOnScopeDispose, useDebounceFn, useTimeout, useTimeoutFn, watchOnce } from "./@vueuse_shared.js";
3
3
  import { defaultWindow, onKeyStroke, unrefElement, useActiveElement, useEventListener, useFocusWithin, useMounted, useParentElement, useRafFn, useResizeObserver, useVModel } from "./@vueuse_core.js";
4
4
  //#region ../../home/cosmin/Work/maizzle/framework/node_modules/ohash/dist/shared/ohash.D__AXeF1.mjs
@@ -1,4 +1,4 @@
1
- import { At as onActivated, Bt as onUnmounted, Gn as reactive, Jn as shallowReactive, Pt as onDeactivated, St as inject, W as computed, Wt as provide, Xn as shallowRef, _n as watch, dt as getCurrentInstance, kt as nextTick, mt as h, qn as ref, rr as unref, rt as defineComponent, vn as watchEffect } from "./vue.runtime.esm-bundler-DjHXh3xg.js";
1
+ import { At as onActivated, Bt as onUnmounted, Gn as reactive, Jn as shallowReactive, Pt as onDeactivated, St as inject, W as computed, Wt as provide, Xn as shallowRef, _n as watch, dt as getCurrentInstance, kt as nextTick, mt as h, qn as ref, rr as unref, rt as defineComponent, vn as watchEffect } from "./vue.runtime.esm-bundler-BHD3r-bP.js";
2
2
  //#region ../../home/cosmin/Work/maizzle/framework/node_modules/vue-router/dist/useApi-s_02lHjl.js
3
3
  /*!
4
4
  * vue-router v5.1.0
@@ -1,2 +1,2 @@
1
- import { $ as createStaticVNode, $n as toRef, $t as resolveFilter, A as DeprecationTypes, An as TriggerOpTypes, At as onActivated, B as callWithAsyncErrorHandling, Bn as isShallow, Bt as onUnmounted, C as vModelText, Cn as withDefaults, Ct as isMemoSame, D as BaseTransition, Dn as EffectScope, Dt as mergeModels, E as withModifiers, En as withScopeId, Et as mergeDefaults, F as Static, Fn as getCurrentWatcher, Ft as onErrorCaptured, G as createBaseVNode, Gn as reactive, Gt as pushScopeId, H as cloneVNode, Hn as onScopeDispose, Ht as openBlock, I as Suspense, In as isProxy, It as onMounted, J as createElementBlock, Jn as shallowReactive, Jt as renderList, K as createBlock, Kn as readonly, Kt as queuePostFlushCb, L as Teleport, Ln as isReactive, Lt as onRenderTracked, M as ErrorTypeStrings, Mn as effect, Mt as onBeforeUnmount, N as Fragment, Nn as effectScope, Nt as onBeforeUpdate, O as BaseTransitionPropsValidators, On as ReactiveEffect, Ot as mergeProps, P as KeepAlive, Pn as getCurrentScope, Pt as onDeactivated, Q as createSlots, Qn as toRaw, Qt as resolveDynamicComponent, R as Text, Rn as isReadonly, Rt as onRenderTriggered, S as vModelSelect, Sn as withCtx, St as inject, T as withKeys, Tn as withMemo, Tt as isVNode, U as compatUtils, Un as onWatcherCleanup, Ut as popScopeId, V as callWithErrorHandling, Vn as markRaw, Vt as onUpdated, W as computed, Wn as proxyRefs, Wt as provide, X as createPropsRestProxy, Xn as shallowRef, Xt as resolveComponent, Y as createHydrationRenderer, Yn as shallowReadonly, Yt as renderSlot, Z as createRenderer, Zn as stop, Zt as resolveDirective, _ as useHost, _n as watch, _t as hydrateOnIdle, a as VueElement, an as ssrUtils, ar as capitalize, at as defineExpose, b as vModelDynamic, bn as watchSyncEffect, bt as hydrateOnVisible, c as defineCustomElement, cn as useAttrs, cr as normalizeStyle, ct as defineProps, d as initDirectivesForSSR, dn as useSSRContext, dt as getCurrentInstance, en as resolveTransitionHooks, er as toRefs, et as createTextVNode, f as nodeOps, fn as useSlots, ft as getTransitionRawChildren, g as useCssVars, gn as warn, gt as hasInjectionContext, h as useCssModule, hn as version, ht as handleError, i as TransitionGroup, in as ssrContextKey, ir as camelize, it as defineEmits, j as ErrorCodes, jn as customRef, jt as onBeforeMount, k as Comment, kn as TrackOpTypes, kt as nextTick, l as defineSSRCustomElement, ln as useId, lr as toDisplayString, lt as defineSlots, m as render, mn as useTransitionState, mt as h, nn as setDevtoolsHook, nr as triggerRef, nt as defineAsyncComponent, o as createApp, on as toHandlers, or as normalizeClass, ot as defineModel, p as patchProp, pn as useTemplateRef, pt as guardReactiveProps, q as createCommentVNode, qn as ref, qt as registerRuntimeCompiler, r as Transition, rn as setTransitionHooks, rr as unref, rt as defineComponent, s as createSSRApp, sn as transformVNodeArgs, sr as normalizeProps, st as defineOptions, t as compile, tn as setBlockTracking, tr as toValue, tt as createVNode, u as hydrate, un as useModel, ur as toHandlerKey, ut as devtools, v as useShadowRoot, vn as watchEffect, vt as hydrateOnInteraction, w as vShow, wn as withDirectives, wt as isRuntimeOnly, x as vModelRadio, xn as withAsyncContext, xt as initCustomFormatter, y as vModelCheckbox, yn as watchPostEffect, yt as hydrateOnMediaQuery, z as assertNumber, zn as isRef, zt as onServerPrefetch } from "./vue.runtime.esm-bundler-DjHXh3xg.js";
1
+ import { $ as createStaticVNode, $n as toRef, $t as resolveFilter, A as DeprecationTypes, An as TriggerOpTypes, At as onActivated, B as callWithAsyncErrorHandling, Bn as isShallow, Bt as onUnmounted, C as vModelText, Cn as withDefaults, Ct as isMemoSame, D as BaseTransition, Dn as EffectScope, Dt as mergeModels, E as withModifiers, En as withScopeId, Et as mergeDefaults, F as Static, Fn as getCurrentWatcher, Ft as onErrorCaptured, G as createBaseVNode, Gn as reactive, Gt as pushScopeId, H as cloneVNode, Hn as onScopeDispose, Ht as openBlock, I as Suspense, In as isProxy, It as onMounted, J as createElementBlock, Jn as shallowReactive, Jt as renderList, K as createBlock, Kn as readonly, Kt as queuePostFlushCb, L as Teleport, Ln as isReactive, Lt as onRenderTracked, M as ErrorTypeStrings, Mn as effect, Mt as onBeforeUnmount, N as Fragment, Nn as effectScope, Nt as onBeforeUpdate, O as BaseTransitionPropsValidators, On as ReactiveEffect, Ot as mergeProps, P as KeepAlive, Pn as getCurrentScope, Pt as onDeactivated, Q as createSlots, Qn as toRaw, Qt as resolveDynamicComponent, R as Text, Rn as isReadonly, Rt as onRenderTriggered, S as vModelSelect, Sn as withCtx, St as inject, T as withKeys, Tn as withMemo, Tt as isVNode, U as compatUtils, Un as onWatcherCleanup, Ut as popScopeId, V as callWithErrorHandling, Vn as markRaw, Vt as onUpdated, W as computed, Wn as proxyRefs, Wt as provide, X as createPropsRestProxy, Xn as shallowRef, Xt as resolveComponent, Y as createHydrationRenderer, Yn as shallowReadonly, Yt as renderSlot, Z as createRenderer, Zn as stop, Zt as resolveDirective, _ as useHost, _n as watch, _t as hydrateOnIdle, a as VueElement, an as ssrUtils, ar as capitalize, at as defineExpose, b as vModelDynamic, bn as watchSyncEffect, bt as hydrateOnVisible, c as defineCustomElement, cn as useAttrs, cr as normalizeStyle, ct as defineProps, d as initDirectivesForSSR, dn as useSSRContext, dt as getCurrentInstance, en as resolveTransitionHooks, er as toRefs, et as createTextVNode, f as nodeOps, fn as useSlots, ft as getTransitionRawChildren, g as useCssVars, gn as warn, gt as hasInjectionContext, h as useCssModule, hn as version, ht as handleError, i as TransitionGroup, in as ssrContextKey, ir as camelize, it as defineEmits, j as ErrorCodes, jn as customRef, jt as onBeforeMount, k as Comment, kn as TrackOpTypes, kt as nextTick, l as defineSSRCustomElement, ln as useId, lr as toDisplayString, lt as defineSlots, m as render, mn as useTransitionState, mt as h, nn as setDevtoolsHook, nr as triggerRef, nt as defineAsyncComponent, o as createApp, on as toHandlers, or as normalizeClass, ot as defineModel, p as patchProp, pn as useTemplateRef, pt as guardReactiveProps, q as createCommentVNode, qn as ref, qt as registerRuntimeCompiler, r as Transition, rn as setTransitionHooks, rr as unref, rt as defineComponent, s as createSSRApp, sn as transformVNodeArgs, sr as normalizeProps, st as defineOptions, t as compile, tn as setBlockTracking, tr as toValue, tt as createVNode, u as hydrate, un as useModel, ur as toHandlerKey, ut as devtools, v as useShadowRoot, vn as watchEffect, vt as hydrateOnInteraction, w as vShow, wn as withDirectives, wt as isRuntimeOnly, x as vModelRadio, xn as withAsyncContext, xt as initCustomFormatter, y as vModelCheckbox, yn as watchPostEffect, yt as hydrateOnMediaQuery, z as assertNumber, zn as isRef, zt as onServerPrefetch } from "./vue.runtime.esm-bundler-BHD3r-bP.js";
2
2
  export { BaseTransition, BaseTransitionPropsValidators, Comment, DeprecationTypes, EffectScope, ErrorCodes, ErrorTypeStrings, Fragment, KeepAlive, ReactiveEffect, Static, Suspense, Teleport, Text, TrackOpTypes, Transition, TransitionGroup, TriggerOpTypes, VueElement, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, camelize, capitalize, cloneVNode, compatUtils, compile, computed, createApp, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSSRApp, createSlots, createStaticVNode, createTextVNode, createVNode, customRef, defineAsyncComponent, defineComponent, defineCustomElement, defineEmits, defineExpose, defineModel, defineOptions, defineProps, defineSSRCustomElement, defineSlots, devtools, effect, effectScope, getCurrentInstance, getCurrentScope, getCurrentWatcher, getTransitionRawChildren, guardReactiveProps, h, handleError, hasInjectionContext, hydrate, hydrateOnIdle, hydrateOnInteraction, hydrateOnMediaQuery, hydrateOnVisible, initCustomFormatter, initDirectivesForSSR, inject, isMemoSame, isProxy, isReactive, isReadonly, isRef, isRuntimeOnly, isShallow, isVNode, markRaw, mergeDefaults, mergeModels, mergeProps, nextTick, nodeOps, normalizeClass, normalizeProps, normalizeStyle, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onScopeDispose, onServerPrefetch, onUnmounted, onUpdated, onWatcherCleanup, openBlock, patchProp, popScopeId, provide, proxyRefs, pushScopeId, queuePostFlushCb, reactive, readonly, ref, registerRuntimeCompiler, render, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, resolveFilter, resolveTransitionHooks, setBlockTracking, setDevtoolsHook, setTransitionHooks, shallowReactive, shallowReadonly, shallowRef, ssrContextKey, ssrUtils, stop, toDisplayString, toHandlerKey, toHandlers, toRaw, toRef, toRefs, toValue, transformVNodeArgs, triggerRef, unref, useAttrs, useCssModule, useCssVars, useHost, useId, useModel, useSSRContext, useShadowRoot, useSlots, useTemplateRef, useTransitionState, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, vShow, version, warn, watch, watchEffect, watchPostEffect, watchSyncEffect, withAsyncContext, withCtx, withDefaults, withDirectives, withKeys, withMemo, withModifiers, withScopeId };
@@ -1,7 +1,7 @@
1
1
  import { n as __exportAll } from "./rolldown-runtime-EAsCxrDo.js";
2
2
  //#region ../../home/cosmin/Work/maizzle/framework/node_modules/@vue/shared/dist/shared.esm-bundler.js
3
3
  /**
4
- * @vue/shared v3.5.39
4
+ * @vue/shared v3.5.40
5
5
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
6
6
  * @license MIT
7
7
  **/
@@ -230,7 +230,7 @@ function normalizeCssVarValue(value) {
230
230
  //#endregion
231
231
  //#region ../../home/cosmin/Work/maizzle/framework/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js
232
232
  /**
233
- * @vue/reactivity v3.5.39
233
+ * @vue/reactivity v3.5.40
234
234
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
235
235
  * @license MIT
236
236
  **/
@@ -275,7 +275,10 @@ var EffectScope = class {
275
275
  if (this._active) {
276
276
  this._isPaused = true;
277
277
  let i, l;
278
- if (this.scopes) for (i = 0, l = this.scopes.length; i < l; i++) this.scopes[i].pause();
278
+ if (this.scopes) {
279
+ const scopes = this.scopes.slice();
280
+ for (i = 0, l = scopes.length; i < l; i++) scopes[i].pause();
281
+ }
279
282
  for (i = 0, l = this.effects.length; i < l; i++) this.effects[i].pause();
280
283
  }
281
284
  }
@@ -287,8 +290,12 @@ var EffectScope = class {
287
290
  if (this._isPaused) {
288
291
  this._isPaused = false;
289
292
  let i, l;
290
- if (this.scopes) for (i = 0, l = this.scopes.length; i < l; i++) this.scopes[i].resume();
291
- for (i = 0, l = this.effects.length; i < l; i++) this.effects[i].resume();
293
+ if (this.scopes) {
294
+ const scopes = this.scopes.slice();
295
+ for (i = 0, l = scopes.length; i < l; i++) scopes[i].resume();
296
+ }
297
+ const effects = this.effects.slice();
298
+ for (i = 0, l = effects.length; i < l; i++) effects[i].resume();
292
299
  }
293
300
  }
294
301
  }
@@ -342,7 +349,8 @@ var EffectScope = class {
342
349
  for (i = 0, l = this.cleanups.length; i < l; i++) this.cleanups[i]();
343
350
  this.cleanups.length = 0;
344
351
  if (this.scopes) {
345
- for (i = 0, l = this.scopes.length; i < l; i++) this.scopes[i].stop(true);
352
+ const scopes = this.scopes.slice();
353
+ for (i = 0, l = scopes.length; i < l; i++) scopes[i].stop(true);
346
354
  this.scopes.length = 0;
347
355
  }
348
356
  if (!this.detached && this.parent && !fromParent) {
@@ -1718,7 +1726,7 @@ function traverse(value, depth = Infinity, seen) {
1718
1726
  //#endregion
1719
1727
  //#region ../../home/cosmin/Work/maizzle/framework/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js
1720
1728
  /**
1721
- * @vue/runtime-core v3.5.39
1729
+ * @vue/runtime-core v3.5.40
1722
1730
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
1723
1731
  * @license MIT
1724
1732
  **/
@@ -2256,10 +2264,12 @@ function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {
2256
2264
  const renderFnWithContext = (...args) => {
2257
2265
  if (renderFnWithContext._d) setBlockTracking(-1);
2258
2266
  const prevInstance = setCurrentRenderingInstance(ctx);
2267
+ const prevStackSize = blockStack.length;
2259
2268
  let res;
2260
2269
  try {
2261
2270
  res = fn(...args);
2262
2271
  } finally {
2272
+ for (let i = blockStack.length; i > prevStackSize; i--) closeBlock();
2263
2273
  setCurrentRenderingInstance(prevInstance);
2264
2274
  if (renderFnWithContext._d) setBlockTracking(1);
2265
2275
  }
@@ -2969,14 +2979,8 @@ function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {
2969
2979
  if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null;
2970
2980
  }
2971
2981
  }
2972
- if (isFunction(ref)) {
2973
- pauseTracking();
2974
- try {
2975
- callWithErrorHandling(ref, owner, 12, [value, refs]);
2976
- } finally {
2977
- resetTracking();
2978
- }
2979
- } else {
2982
+ if (isFunction(ref)) callWithErrorHandling(ref, owner, 12, [value, refs]);
2983
+ else {
2980
2984
  const _isString = isString(ref);
2981
2985
  const _isRef = /* @__PURE__ */ isRef(ref);
2982
2986
  if (_isString || _isRef) {
@@ -3181,9 +3185,10 @@ Server rendered element contains more child nodes than client vdom.`);
3181
3185
  }
3182
3186
  if (props) {
3183
3187
  const isCustomElement = el.tagName.includes("-");
3188
+ const namespace = el.namespaceURI.includes("svg") ? "svg" : el.namespaceURI.includes("MathML") ? "mathml" : void 0;
3184
3189
  for (const key in props) {
3185
3190
  if (!(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) logMismatchError();
3186
- if (forcePatch && (key.endsWith("value") || key === "indeterminate") || isOn(key) && !isReservedProp(key) || key[0] === "." || isCustomElement && !isReservedProp(key) || dynamicProps && dynamicProps.includes(key)) patchProp(el, key, null, props[key], void 0, parentComponent);
3191
+ if (forcePatch && (key.endsWith("value") || key === "indeterminate") || isOn(key) && !isReservedProp(key) || key[0] === "." || isCustomElement && !isReservedProp(key) || dynamicProps && dynamicProps.includes(key)) patchProp(el, key, null, props[key], namespace, parentComponent);
3187
3192
  }
3188
3193
  }
3189
3194
  let vnodeHooks;
@@ -3528,6 +3533,7 @@ function defineAsyncComponent(source) {
3528
3533
  name: "AsyncComponentWrapper",
3529
3534
  __asyncLoader: load,
3530
3535
  __asyncHydrate(el, instance, hydrate) {
3536
+ const wasConnected = el.isConnected;
3531
3537
  let patched = false;
3532
3538
  (instance.bu || (instance.bu = [])).push(() => patched = true);
3533
3539
  const performHydrate = () => {
@@ -3535,6 +3541,7 @@ function defineAsyncComponent(source) {
3535
3541
  warn$1(`Skipping lazy hydration for component '${getComponentName(resolvedComp) || resolvedComp.__file}': it was updated before lazy hydration performed.`);
3536
3542
  return;
3537
3543
  }
3544
+ if (!el.parentNode || wasConnected && !el.isConnected) return;
3538
3545
  hydrate();
3539
3546
  };
3540
3547
  const doHydrate = hydrateStrategy ? () => {
@@ -3921,11 +3928,12 @@ function createSlots(slots, dynamicSlots) {
3921
3928
  }
3922
3929
  return slots;
3923
3930
  }
3924
- function renderSlot(slots, name, props = {}, fallback, noSlotted) {
3931
+ function renderSlot(slots, name, props = {}, fallback, noSlotted, branchKey) {
3925
3932
  if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {
3926
- const hasProps = Object.keys(props).length > 0;
3927
- if (name !== "default") props.name = name;
3928
- return openBlock(), createBlock(Fragment, null, [createVNode("slot", props, fallback && fallback())], hasProps ? -2 : 64);
3933
+ const slotProps = branchKey != null && props.key == null ? extend({}, props, { key: branchKey }) : props;
3934
+ const hasProps = Object.keys(slotProps).length > 0;
3935
+ if (name !== "default") slotProps.name = name;
3936
+ return openBlock(), createBlock(Fragment, null, [createVNode("slot", slotProps, fallback && fallback())], hasProps ? -2 : 64);
3929
3937
  }
3930
3938
  let slot = slots[name];
3931
3939
  if (slot && slot.length > 1) {
@@ -3933,12 +3941,20 @@ function renderSlot(slots, name, props = {}, fallback, noSlotted) {
3933
3941
  slot = () => [];
3934
3942
  }
3935
3943
  if (slot && slot._c) slot._d = false;
3944
+ const prevStackSize = blockStack.length;
3936
3945
  openBlock();
3937
- const validSlotContent = slot && ensureValidVNode(slot(props));
3938
- const slotKey = props.key || validSlotContent && validSlotContent.key;
3939
- const rendered = createBlock(Fragment, { key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + (!validSlotContent && fallback ? "_fb" : "") }, validSlotContent || (fallback ? fallback() : []), validSlotContent && slots._ === 1 ? 64 : -2);
3946
+ let rendered;
3947
+ try {
3948
+ const validSlotContent = slot && ensureValidVNode(slot(props));
3949
+ const slotKey = props.key || branchKey || validSlotContent && validSlotContent.key;
3950
+ rendered = createBlock(Fragment, { key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + (!validSlotContent && fallback ? "_fb" : "") }, validSlotContent || (fallback ? fallback() : []), validSlotContent && slots._ === 1 ? 64 : -2);
3951
+ } catch (err) {
3952
+ for (let i = blockStack.length; i > prevStackSize; i--) closeBlock();
3953
+ throw err;
3954
+ } finally {
3955
+ if (slot && slot._c) slot._d = true;
3956
+ }
3940
3957
  if (!noSlotted && rendered.scopeId) rendered.slotScopeIds = [rendered.scopeId + "-s"];
3941
- if (slot && slot._c) slot._d = true;
3942
3958
  return rendered;
3943
3959
  }
3944
3960
  function ensureValidVNode(vnodes) {
@@ -7137,7 +7153,7 @@ function isMemoSame(cached, memo) {
7137
7153
  if (isBlockTreeEnabled > 0 && currentBlock) currentBlock.push(cached);
7138
7154
  return true;
7139
7155
  }
7140
- var version = "3.5.39";
7156
+ var version = "3.5.40";
7141
7157
  var warn = warn$1;
7142
7158
  var ErrorTypeStrings = ErrorTypeStrings$1;
7143
7159
  var devtools = devtools$1;
@@ -7160,7 +7176,7 @@ var DeprecationTypes = null;
7160
7176
  //#endregion
7161
7177
  //#region ../../home/cosmin/Work/maizzle/framework/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js
7162
7178
  /**
7163
- * @vue/runtime-dom v3.5.39
7179
+ * @vue/runtime-dom v3.5.40
7164
7180
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
7165
7181
  * @license MIT
7166
7182
  **/
@@ -8389,10 +8405,10 @@ var vModelRadio = {
8389
8405
  var vModelSelect = {
8390
8406
  deep: true,
8391
8407
  created(el, { value, modifiers: { number } }, vnode) {
8392
- const isSetModel = isSet(value);
8408
+ el._modelValue = value;
8393
8409
  addEventListener(el, "change", () => {
8394
8410
  const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map((o) => number ? looseToNumber(getValue(o)) : getValue(o));
8395
- el[assignKey](el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]);
8411
+ el[assignKey](el.multiple ? isSet(el._modelValue) ? new Set(selectedVal) : selectedVal : selectedVal[0]);
8396
8412
  el._assigning = true;
8397
8413
  nextTick(() => {
8398
8414
  el._assigning = false;
@@ -8403,7 +8419,8 @@ var vModelSelect = {
8403
8419
  mounted(el, { value }) {
8404
8420
  setSelected(el, value);
8405
8421
  },
8406
- beforeUpdate(el, _binding, vnode) {
8422
+ beforeUpdate(el, { value }, vnode) {
8423
+ el._modelValue = value;
8407
8424
  el[assignKey] = getModelAssigner(vnode);
8408
8425
  },
8409
8426
  updated(el, { value }) {
@@ -8640,7 +8657,7 @@ var initDirectivesForSSR = () => {
8640
8657
  //#endregion
8641
8658
  //#region ../../home/cosmin/Work/maizzle/framework/node_modules/vue/dist/vue.runtime.esm-bundler.js
8642
8659
  /**
8643
- * vue v3.5.39
8660
+ * vue v3.5.40
8644
8661
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
8645
8662
  * @license MIT
8646
8663
  **/