{"version":3,"sources":["../src/index.ts","../src/lexer/directives.ts","../src/frontend-attribute-names.ts","../src/lexer/scan-primitives.ts","../src/lexer/lexer.ts","../src/ignore-markers.ts","../src/lexer/ignore-ranges.ts","../src/tree/types.ts","../src/tree/void-elements.ts","../src/tree/optional-tags.ts","../src/tree/construct-scanner.ts","../src/tree/directives.ts","../src/tree/directive-helper.ts","../src/tree/directive-token-index.ts","../src/tree/argument-scanner.ts","../src/rawtext-script-scanner.ts","../src/malformed-tags.ts","../src/tree/tree-builder.ts","../src/pragma.ts","../src/plugins/sage/metadata.ts","../src/plugins/types.ts","../src/plugins/sage/print.ts","../src/plugins/sage/index.ts","../src/plugins/statamic.ts","../src/plugins/runtime.ts","../src/front-matter.ts","../src/line-offsets.ts","../src/parser.ts","../src/print/index.ts","../src/html-whitespace.ts","../src/preprocess/pipeline.ts","../src/preprocess/whitespace-model.ts","../src/constants.ts","../src/node-predicates.ts","../src/preprocess.ts","../src/html-data.ts","../src/print/style-at-rules.ts","../src/print/blade-syntax.ts","../src/print/utils.ts","../src/print/element.ts","../src/print/blade-options.ts","../src/print/tag.ts","../src/print/attribute-name.ts","../src/print/doctype-utils.ts","../src/print/doc-utils.ts","../src/print/children.ts","../src/print/if-break-chain.ts","../src/print/text.ts","../src/print/directive.ts","../src/print/directive-spacing-context.ts","../src/string-utils.ts","../src/print/echo.ts","../src/print/echo-normalization.ts","../src/print/comment.ts","../src/print/doctype.ts","../src/print/embed.ts","../src/print/embed/attribute.ts","../src/print/embed/utilities.ts","../src/print/embed/alpine-attributes.ts","../src/print/embed/tailwind.ts","../src/print/embed/embedded-parser-plugins.ts","../src/print/embed/php-plugin.ts","../src/print/embed/php.ts","../src/print/embed/raw-content.ts"],"sourcesContent":["import type { Plugin, SupportOption } from \"prettier\";\nimport { bladeParser } from \"./parser.js\";\nimport { bladePrinter } from \"./printer.js\";\nimport { DEFAULT_DIRECTIVE_ARG_SPACING_OVERRIDE_TOKENS } from \"./print/blade-options.js\";\n\nconst languages: Plugin[\"languages\"] = [\n  {\n    name: \"blade\",\n    parsers: [\"blade\"],\n    extensions: [\".blade.php\"],\n    vscodeLanguageIds: [\"blade\"],\n  },\n];\n\nconst parsers: Plugin[\"parsers\"] = {\n  blade: bladeParser,\n};\n\nconst printers: Plugin[\"printers\"] = {\n  \"blade-ast\": bladePrinter,\n};\n\n/**\n * Declare HTML-specific options so Prettier passes them through.\n */\nconst options: Record<string, SupportOption> = {\n  htmlWhitespaceSensitivity: {\n    category: \"HTML\",\n    type: \"choice\",\n    default: \"css\",\n    description: \"How to handle whitespaces in HTML.\",\n    choices: [\n      {\n        value: \"css\",\n        description: \"Respect the default value of CSS display property.\",\n      },\n      {\n        value: \"strict\",\n        description: \"Whitespaces are considered sensitive.\",\n      },\n      {\n        value: \"ignore\",\n        description: \"Whitespaces are considered insensitive.\",\n      },\n    ],\n  },\n  bladePhpFormatting: {\n    category: \"Blade\",\n    type: \"choice\",\n    default: \"safe\",\n    description: \"Format Blade PHP fragments (directive args, echoes, and PHP blocks/tags).\",\n    choices: [\n      {\n        value: \"off\",\n        description: \"Disable Blade PHP fragment formatting.\",\n      },\n      {\n        value: \"safe\",\n        description: \"Format known-safe Blade PHP fragments with conservative wrappers.\",\n      },\n      {\n        value: \"aggressive\",\n        description: \"Try additional wrapper strategies before falling back to original text.\",\n      },\n    ],\n  },\n  bladePhpFormattingTargets: {\n    category: \"Blade\",\n    type: \"string\",\n    array: true,\n    default: [{ value: [\"directiveArgs\", \"echo\", \"phpBlock\", \"phpTag\"] }],\n    description:\n      \"PHP embedding targets: echo, directiveArgs, phpBlock, phpTag. Use [] (or CLI value 'none') to disable all targets.\",\n  },\n  bladeSyntaxPlugins: {\n    category: \"Blade\",\n    type: \"string\",\n    array: true,\n    default: [{ value: [\"statamic\"] }],\n    description: \"List of Blade syntax plugins, e.g. statamic or log1x/sage-directives.\",\n  },\n  bladeDirectiveCase: {\n    category: \"Blade\",\n    type: \"choice\",\n    default: \"preserve\",\n    description: \"Normalize Blade directive casing.\",\n    choices: [\n      {\n        value: \"preserve\",\n        description: \"Keep directive case as written.\",\n      },\n      {\n        value: \"canonical\",\n        description: \"Use canonical directive casing for known directives.\",\n      },\n      {\n        value: \"lower\",\n        description: \"Lowercase all directive names.\",\n      },\n    ],\n  },\n  bladeDirectiveCaseMap: {\n    category: \"Blade\",\n    type: \"string\",\n    default: \"\",\n    description: 'JSON object mapping directive names to canonical case, e.g. {\"disk\":\"Disk\"}.',\n  },\n  bladeDirectiveArgSpacing: {\n    category: \"Blade\",\n    type: \"choice\",\n    default: \"space\",\n    description: \"Spacing between directive name and argument list.\",\n    choices: [\n      {\n        value: \"preserve\",\n        description: \"Preserve original spacing.\",\n      },\n      {\n        value: \"none\",\n        description: \"Print without a space, e.g. @if($x).\",\n      },\n      {\n        value: \"space\",\n        description: \"Print with one space, e.g. @if ($x).\",\n      },\n    ],\n  },\n  bladeDirectiveArgSpacingOverrides: {\n    category: \"Blade\",\n    type: \"string\",\n    array: true,\n    default: [{ value: [...DEFAULT_DIRECTIVE_ARG_SPACING_OVERRIDE_TOKENS] }],\n    description:\n      \"Directive spacing overrides in directive[=rule] form; bare directive names imply space.\",\n  },\n  bladeDirectiveBlockStyle: {\n    category: \"Blade\",\n    type: \"choice\",\n    default: \"preserve\",\n    description: \"Formatting style for directive blocks.\",\n    choices: [\n      {\n        value: \"preserve\",\n        description: \"Preserve inline block intent when written on one line.\",\n      },\n      {\n        value: \"inline-if-short\",\n        description: \"Allow short blocks to print inline when possible.\",\n      },\n      {\n        value: \"multiline\",\n        description: \"Always print directive blocks in multiline style.\",\n      },\n    ],\n  },\n  bladeBlankLinesAroundDirectives: {\n    category: \"Blade\",\n    type: \"choice\",\n    default: \"preserve\",\n    description: \"Blank line policy between directives inside a block.\",\n    choices: [\n      {\n        value: \"preserve\",\n        description: \"Preserve existing blank line intent.\",\n      },\n      {\n        value: \"always\",\n        description: \"Insert a blank line between directive segments.\",\n      },\n    ],\n  },\n  bladeEchoSpacing: {\n    category: \"Blade\",\n    type: \"choice\",\n    default: \"preserve\",\n    description: \"Spacing style for Blade echo delimiters.\",\n    choices: [\n      {\n        value: \"preserve\",\n        description: \"Preserve current echo spacing.\",\n      },\n      {\n        value: \"space\",\n        description: \"Use spaced delimiters, e.g. {{ $x }}.\",\n      },\n      {\n        value: \"tight\",\n        description: \"Use tight delimiters, e.g. {{$x}}.\",\n      },\n    ],\n  },\n  bladeSlotClosingTag: {\n    category: \"Blade\",\n    type: \"choice\",\n    default: \"canonical\",\n    description: \"How to print Blade slot closing tags for shorthand pairs.\",\n    choices: [\n      {\n        value: \"canonical\",\n        description: \"Use canonical closing tag names based on the opening slot tag.\",\n      },\n      {\n        value: \"preserve\",\n        description: \"Preserve shorthand closing tags such as </x-slot> when present.\",\n      },\n    ],\n  },\n  bladeVoidElementSlash: {\n    category: \"Blade\",\n    type: \"choice\",\n    default: \"always\",\n    description: \"How to print the self-closing slash on standard HTML void elements.\",\n    choices: [\n      {\n        value: \"always\",\n        description: \"Always print standard HTML void elements with a slash, e.g. <meta />.\",\n      },\n      {\n        value: \"never\",\n        description: \"Never print a slash on standard HTML void elements, e.g. <meta>.\",\n      },\n      {\n        value: \"preserve\",\n        description: \"Preserve whether standard HTML void elements used a source slash.\",\n      },\n    ],\n  },\n  bladeInlineIntentElements: {\n    category: \"Blade\",\n    type: \"string\",\n    array: true,\n    default: [{ value: [\"p\", \"svg\", \"svg:*\"] }],\n    description:\n      \"Element names that should preserve single-line inline intent and ignore printWidth-driven wrapping when source is inline. Supports namespace wildcards like svg:*.\",\n  },\n  bladeComponentPrefixes: {\n    category: \"Blade\",\n    type: \"string\",\n    array: true,\n    default: [{ value: [\"x\", \"s\", \"statamic\", \"flux\", \"livewire\", \"native\"] }],\n    description:\n      \"Component prefixes used to detect Blade components for :bound attribute PHP formatting.\",\n  },\n  bladeInsertOptionalClosingTags: {\n    category: \"Blade\",\n    type: \"boolean\",\n    default: false,\n    description:\n      \"Insert explicit closing tags when elements are implicitly closed in source (optional-end-tag and parser-recovered missing closing tags).\",\n  },\n  bladeKeepHeadAndBodyAtRoot: {\n    category: \"Blade\",\n    type: \"boolean\",\n    default: true,\n    description:\n      \"Keep root-level <head> and <body> tags flush with <html> for canonical HTML documents.\",\n  },\n};\n\nconst plugin: Plugin = { languages, parsers, printers, options };\n\nexport default plugin;\nexport { languages, parsers, printers, options };\n","const DEFAULT_DIRECTIVES: string[] = [\r\n  \"if\",\r\n  \"elseif\",\r\n  \"else\",\r\n  \"endif\",\r\n  \"unless\",\r\n  \"endunless\",\r\n  \"isset\",\r\n  \"endisset\",\r\n  \"empty\",\r\n  \"endempty\",\r\n  \"switch\",\r\n  \"case\",\r\n  \"break\",\r\n  \"default\",\r\n  \"endswitch\",\r\n\r\n  \"foreach\",\r\n  \"endforeach\",\r\n  \"for\",\r\n  \"endfor\",\r\n  \"while\",\r\n  \"endwhile\",\r\n  \"forelse\",\r\n  \"endforelse\",\r\n  \"continue\",\r\n\r\n  \"auth\",\r\n  \"elseauth\",\r\n  \"endauth\",\r\n  \"guest\",\r\n  \"elseguest\",\r\n  \"endguest\",\r\n\r\n  \"can\",\r\n  \"elsecan\",\r\n  \"endcan\",\r\n  \"canany\",\r\n  \"elsecanany\",\r\n  \"endcanany\",\r\n  \"cannot\",\r\n  \"elsecannot\",\r\n  \"endcannot\",\r\n\r\n  \"env\",\r\n  \"elseenv\",\r\n  \"endenv\",\r\n  \"production\",\r\n  \"elseproduction\",\r\n  \"endproduction\",\r\n\r\n  \"section\",\r\n  \"endsection\",\r\n  \"yield\",\r\n  \"show\",\r\n  \"stop\",\r\n  \"append\",\r\n  \"overwrite\",\r\n  \"extends\",\r\n  \"extendsFirst\",\r\n  \"parent\",\r\n  \"hasSection\",\r\n  \"sectionMissing\",\r\n  \"endhasSection\",\r\n  \"endsectionMissing\",\r\n\r\n  \"include\",\r\n  \"includeIf\",\r\n  \"includeWhen\",\r\n  \"includeUnless\",\r\n  \"includeFirst\",\r\n  \"includeIsolated\",\r\n  \"each\",\r\n\r\n  \"once\",\r\n  \"endonce\",\r\n\r\n  \"push\",\r\n  \"endpush\",\r\n  \"pushOnce\",\r\n  \"endPushOnce\",\r\n  \"pushIf\",\r\n  \"elsePushIf\",\r\n  \"elsePush\",\r\n  \"endPushIf\",\r\n  \"prepend\",\r\n  \"endprepend\",\r\n  \"prependOnce\",\r\n  \"endPrependOnce\",\r\n  \"stack\",\r\n  \"hasStack\",\r\n\r\n  \"component\",\r\n  \"endcomponent\",\r\n  \"endComponentClass\",\r\n  \"componentFirst\",\r\n  \"endComponentFirst\",\r\n  \"slot\",\r\n  \"endslot\",\r\n  \"props\",\r\n  \"aware\",\r\n\r\n  \"csrf\",\r\n  \"method\",\r\n  \"error\",\r\n  \"enderror\",\r\n  \"old\",\r\n\r\n  \"inject\",\r\n  \"dd\",\r\n  \"dump\",\r\n  \"vite\",\r\n  \"viteReactRefresh\",\r\n  \"fonts\",\r\n  \"json\",\r\n  \"js\",\r\n  \"unset\",\r\n\r\n  \"class\",\r\n  \"style\",\r\n  \"checked\",\r\n  \"selected\",\r\n  \"disabled\",\r\n  \"readonly\",\r\n  \"required\",\r\n  \"bool\",\r\n\r\n  \"php\",\r\n  \"endphp\",\r\n  \"verbatim\",\r\n  \"endverbatim\",\r\n\r\n  \"fragment\",\r\n  \"endfragment\",\r\n\r\n  \"session\",\r\n  \"endsession\",\r\n\r\n  \"context\",\r\n  \"endcontext\",\r\n\r\n  \"lang\",\r\n  \"endlang\",\r\n  \"choice\",\r\n\r\n  \"livewire\",\r\n  \"livewireStyles\",\r\n  \"livewireScripts\",\r\n  \"entangle\",\r\n  \"this\",\r\n  \"persist\",\r\n  \"endpersist\",\r\n  \"teleport\",\r\n  \"endteleport\",\r\n  \"volt\",\r\n\r\n  // Inertia.js\r\n  \"inertia\",\r\n  \"inertiaHead\",\r\n  // Filament\r\n  \"filamentStyles\",\r\n  \"filamentScripts\",\r\n  // Blade Icons\r\n  \"svg\",\r\n  // Spatie Permission\r\n  \"role\",\r\n  \"endrole\",\r\n  \"hasrole\",\r\n  \"endhasrole\",\r\n  \"hasanyrole\",\r\n  \"endhasanyrole\",\r\n  \"hasallroles\",\r\n  \"endhasallroles\",\r\n  \"unlessrole\",\r\n  \"endunlessrole\",\r\n  // Pennant\r\n  \"feature\",\r\n  \"endfeature\",\r\n  \"featureany\",\r\n  \"endfeatureany\",\r\n  // Cashier Paddle\r\n  \"paddleJS\",\r\n\r\n  \"use\",\r\n];\r\n\r\nconst CANONICAL_DIRECTIVE_CASE = new Map<string, string>();\r\nfor (const name of DEFAULT_DIRECTIVES) {\r\n  const lower = name.toLowerCase();\r\n  if (!CANONICAL_DIRECTIVE_CASE.has(lower)) {\r\n    CANONICAL_DIRECTIVE_CASE.set(lower, name);\r\n  }\r\n}\r\n\r\nexport type DirectivePhpWrapperKind =\r\n  | \"for\"\r\n  | \"foreach\"\r\n  | \"while\"\r\n  | \"switch\"\r\n  | \"case\"\r\n  | \"if\"\r\n  | \"call\";\r\n\r\nexport type DirectivePhpWrapperMode = \"safe\" | \"aggressive\";\r\n\r\nexport interface DirectivePhpWrapperContext {\r\n  hasDirective?: (name: string) => boolean;\r\n  isConditionLikeDirective?: (name: string) => boolean;\r\n}\r\n\r\nconst IF_WRAPPER_DIRECTIVES = new Set([\r\n  \"if\",\r\n  \"elseif\",\r\n  \"unless\",\r\n  \"isset\",\r\n  \"once\",\r\n  \"auth\",\r\n  \"elseauth\",\r\n  \"guest\",\r\n  \"elseguest\",\r\n  \"can\",\r\n  \"elsecan\",\r\n  \"cannot\",\r\n  \"elsecannot\",\r\n  \"canany\",\r\n  \"elsecanany\",\r\n  \"env\",\r\n  \"elseenv\",\r\n  \"production\",\r\n  \"elseproduction\",\r\n  \"hassection\",\r\n  \"sectionmissing\",\r\n  \"error\",\r\n  \"role\",\r\n  \"hasrole\",\r\n  \"hasanyrole\",\r\n  \"hasallroles\",\r\n  \"unlessrole\",\r\n  \"pushif\",\r\n  \"elsepushif\",\r\n  \"hasstack\",\r\n]);\r\n\r\nconst AGGRESSIVE_WRAPPER_ORDER: DirectivePhpWrapperKind[] = [\r\n  \"if\",\r\n  \"while\",\r\n  \"switch\",\r\n  \"foreach\",\r\n  \"for\",\r\n  \"case\",\r\n  \"call\",\r\n];\r\n\r\nexport function getDirectivePhpWrapperKind(\r\n  directiveName: string,\r\n  context: DirectivePhpWrapperContext = {},\r\n): DirectivePhpWrapperKind {\r\n  const name = directiveName.toLowerCase();\r\n  const hasDirective = context.hasDirective;\r\n\r\n  if (context.isConditionLikeDirective?.(name)) {\r\n    return \"if\";\r\n  }\r\n\r\n  if (name === \"for\") return \"for\";\r\n  if (name === \"foreach\" || name === \"forelse\") return \"foreach\";\r\n  if (name === \"while\") return \"while\";\r\n  if (name === \"switch\") return \"switch\";\r\n  if (name === \"case\") return \"case\";\r\n  if (IF_WRAPPER_DIRECTIVES.has(name)) return \"if\";\r\n\r\n  // Custom condition-like opener detected by training:\r\n  // @disk ... @elsedisk ... @enddisk\r\n  if (hasDirective?.(`else${name}`) && hasDirective(`end${name}`)) {\r\n    return \"if\";\r\n  }\r\n\r\n  // Custom condition-like branch name itself (e.g. @elsedisk).\r\n  if (name.startsWith(\"else\") && name.length > 4) {\r\n    const baseName = name.slice(4);\r\n    if (hasDirective?.(baseName) && hasDirective(`end${baseName}`)) {\r\n      return \"if\";\r\n    }\r\n  }\r\n\r\n  return \"call\";\r\n}\r\n\r\nexport function getDirectivePhpWrapperKinds(\r\n  directiveName: string,\r\n  mode: DirectivePhpWrapperMode,\r\n  context: DirectivePhpWrapperContext = {},\r\n): DirectivePhpWrapperKind[] {\r\n  const first = getDirectivePhpWrapperKind(directiveName, context);\r\n\r\n  if (mode === \"safe\") {\r\n    return first === \"call\" ? [\"call\"] : [first, \"call\"];\r\n  }\r\n\r\n  const kinds: DirectivePhpWrapperKind[] = [first];\r\n  for (const kind of AGGRESSIVE_WRAPPER_ORDER) {\r\n    if (!kinds.includes(kind)) {\r\n      kinds.push(kind);\r\n    }\r\n  }\r\n\r\n  return kinds;\r\n}\r\n\r\nexport function getCanonicalDirectiveName(directiveName: string): string | null {\r\n  return CANONICAL_DIRECTIVE_CASE.get(directiveName.toLowerCase()) ?? null;\r\n}\r\n\r\nexport class Directives {\r\n  private known: Set<string>;\r\n  private _acceptAll: boolean;\r\n\r\n  private constructor(known: Set<string>, acceptAll: boolean) {\r\n    this.known = known;\r\n    this._acceptAll = acceptAll;\r\n  }\r\n\r\n  static acceptAll(): Directives {\r\n    return new Directives(new Set(), true);\r\n  }\r\n\r\n  static withDefaults(extraNames: Iterable<string> = []): Directives {\r\n    const set = new Set<string>();\r\n    for (const name of DEFAULT_DIRECTIVES) {\r\n      set.add(name.toLowerCase());\r\n    }\r\n    for (const name of extraNames) {\r\n      const normalized = name.trim().toLowerCase().replace(/^@/, \"\");\r\n      if (normalized) set.add(normalized);\r\n    }\r\n    return new Directives(set, false);\r\n  }\r\n\r\n  static empty(): Directives {\r\n    return new Directives(new Set(), false);\r\n  }\r\n\r\n  static from(names: Iterable<string>): Directives {\r\n    const set = new Set<string>();\r\n    for (const name of names) {\r\n      set.add(name.toLowerCase());\r\n    }\r\n    return new Directives(set, false);\r\n  }\r\n\r\n  isDirective(name: string): boolean {\r\n    if (this._acceptAll) return true;\r\n    return this.known.has(name.toLowerCase());\r\n  }\r\n\r\n  isDirectiveLower(nameLower: string): boolean {\r\n    if (this._acceptAll) return true;\r\n    return this.known.has(nameLower);\r\n  }\r\n\r\n  acceptsAll(): boolean {\r\n    return this._acceptAll;\r\n  }\r\n\r\n  register(name: string): this {\r\n    this.known.add(name.toLowerCase());\r\n    return this;\r\n  }\r\n}\r\n","const DOM_EVENT_NAMES = new Set([\n  \"abort\",\n  \"animationend\",\n  \"animationiteration\",\n  \"animationstart\",\n  \"auxclick\",\n  \"beforeinput\",\n  \"beforematch\",\n  \"beforetoggle\",\n  \"beforeunload\",\n  \"blur\",\n  \"cancel\",\n  \"canplay\",\n  \"canplaythrough\",\n  \"change\",\n  \"click\",\n  \"close\",\n  \"contentvisibilityautostatechange\",\n  \"contextlost\",\n  \"contextmenu\",\n  \"contextrestored\",\n  \"copy\",\n  \"cuechange\",\n  \"cut\",\n  \"dblclick\",\n  \"drag\",\n  \"dragend\",\n  \"dragenter\",\n  \"dragleave\",\n  \"dragover\",\n  \"dragstart\",\n  \"drop\",\n  \"durationchange\",\n  \"emptied\",\n  \"ended\",\n  \"error\",\n  \"focus\",\n  \"focusin\",\n  \"focusout\",\n  \"formdata\",\n  \"gotpointercapture\",\n  \"input\",\n  \"invalid\",\n  \"keydown\",\n  \"keypress\",\n  \"keyup\",\n  \"load\",\n  \"loadeddata\",\n  \"loadedmetadata\",\n  \"loadstart\",\n  \"lostpointercapture\",\n  \"mousedown\",\n  \"mouseenter\",\n  \"mouseleave\",\n  \"mousemove\",\n  \"mouseout\",\n  \"mouseover\",\n  \"mouseup\",\n  \"paste\",\n  \"pause\",\n  \"play\",\n  \"playing\",\n  \"pointercancel\",\n  \"pointerdown\",\n  \"pointerenter\",\n  \"pointerleave\",\n  \"pointermove\",\n  \"pointerout\",\n  \"pointerover\",\n  \"pointerrawupdate\",\n  \"pointerup\",\n  \"progress\",\n  \"ratechange\",\n  \"reset\",\n  \"resize\",\n  \"scroll\",\n  \"scrollend\",\n  \"securitypolicyviolation\",\n  \"seeked\",\n  \"seeking\",\n  \"select\",\n  \"selectionchange\",\n  \"selectstart\",\n  \"slotchange\",\n  \"stalled\",\n  \"submit\",\n  \"suspend\",\n  \"timeupdate\",\n  \"toggle\",\n  \"touchcancel\",\n  \"touchend\",\n  \"touchmove\",\n  \"touchstart\",\n  \"transitioncancel\",\n  \"transitionend\",\n  \"transitionrun\",\n  \"transitionstart\",\n  \"unload\",\n  \"volumechange\",\n  \"waiting\",\n  \"webkitanimationend\",\n  \"webkitanimationiteration\",\n  \"webkitanimationstart\",\n  \"webkittransitionend\",\n  \"wheel\",\n]);\n\nexport function isFrontendEventStyleAtName(name: string): boolean {\n  return DOM_EVENT_NAMES.has(name.toLowerCase());\n}\n\nexport function isHtmlEventAttribute(name: string): boolean {\n  const lower = name.toLowerCase();\n  if (!lower.startsWith(\"on\")) return false;\n  return DOM_EVENT_NAMES.has(lower.slice(2));\n}\n","export interface PosRef {\n  value: number;\n}\n\nexport function isAsciiAlpha(ch: number): boolean {\n  return (ch >= 65 && ch <= 90) || (ch >= 97 && ch <= 122);\n}\n\nexport function isAsciiDigit(ch: number): boolean {\n  return ch >= 48 && ch <= 57;\n}\n\nexport function isAsciiAlnum(ch: number): boolean {\n  return isAsciiAlpha(ch) || isAsciiDigit(ch);\n}\n\nexport function canStartBladeDirectiveAt(source: string, pos: number, boundaryStart = 0): boolean {\n  if (pos <= boundaryStart) return pos === boundaryStart;\n  const prev = source.charCodeAt(pos - 1);\n  return !isAsciiAlnum(prev) && prev !== 64 /* @ */;\n}\n\nexport function findLineEnding(src: string, pos: number, len: number): number {\n  for (let i = pos; i < len; i++) {\n    const ch = src[i];\n    if (ch === \"\\n\" || ch === \"\\r\") return i;\n  }\n  return -1;\n}\n\nexport function skipLineEnding(src: string, pos: PosRef, len: number): void {\n  if (pos.value >= len) return;\n\n  const byte = src[pos.value];\n  if (byte === \"\\n\") {\n    pos.value++;\n  } else if (byte === \"\\r\") {\n    pos.value++;\n    if (pos.value < len && src[pos.value] === \"\\n\") {\n      pos.value++;\n    }\n  }\n}\n\nexport function skipQuotedString(src: string, pos: PosRef, len: number, quote: string): void {\n  while (pos.value < len) {\n    const quotePos = src.indexOf(quote, pos.value);\n\n    if (quotePos === -1) {\n      pos.value = len;\n      return;\n    }\n\n    pos.value = quotePos;\n\n    // Count preceding backslashes\n    let backslashCount = 0;\n    let checkPos = pos.value - 1;\n    while (checkPos >= 0 && src[checkPos] === \"\\\\\") {\n      backslashCount++;\n      checkPos--;\n    }\n\n    pos.value++; // Move past the quote\n\n    if (backslashCount % 2 === 0) {\n      return;\n    }\n  }\n\n  pos.value = len;\n}\n\nexport function skipBlockComment(src: string, pos: PosRef, len: number): void {\n  while (pos.value < len) {\n    const starPos = src.indexOf(\"*\", pos.value);\n\n    if (starPos === -1) {\n      pos.value = len;\n      return;\n    }\n\n    pos.value = starPos + 1; // Move past *\n\n    if (pos.value < len && src[pos.value] === \"/\") {\n      pos.value++; // Move past /\n      return;\n    }\n  }\n\n  pos.value = len;\n}\n\nexport function skipLineComment(src: string, pos: PosRef, len: number): void {\n  const lineEndPos = findLineEnding(src, pos.value, len);\n\n  if (lineEndPos === -1) {\n    pos.value = len;\n  } else {\n    pos.value = lineEndPos;\n    skipLineEnding(src, pos, len);\n  }\n}\n\nexport function skipLineCommentStoppingAt(\n  src: string,\n  pos: PosRef,\n  len: number,\n  stopSequence: string,\n): boolean {\n  const seqLen = stopSequence.length;\n\n  while (pos.value < len) {\n    const byte = src[pos.value];\n\n    if (byte === \"\\n\" || byte === \"\\r\") {\n      pos.value++;\n      return false;\n    }\n\n    if (pos.value + seqLen <= len && src.slice(pos.value, pos.value + seqLen) === stopSequence) {\n      return true;\n    }\n\n    pos.value++;\n  }\n\n  return false;\n}\n\nexport function skipLineCommentDetecting(\n  src: string,\n  pos: PosRef,\n  len: number,\n  sequences: string[],\n): Array<{ sequence: string; offset: number }> {\n  const detected: Array<{ sequence: string; offset: number }> = [];\n\n  const lineEndPos = findLineEnding(src, pos.value, len);\n  const endPos = lineEndPos === -1 ? len : lineEndPos;\n\n  for (const sequence of sequences) {\n    const seqLen = sequence.length;\n    let searchPos = pos.value;\n\n    while (searchPos + seqLen <= endPos) {\n      const foundPos = src.indexOf(sequence, searchPos);\n\n      if (foundPos === -1 || foundPos >= endPos) {\n        break;\n      }\n\n      detected.push({ sequence, offset: foundPos });\n      searchPos = foundPos + seqLen;\n    }\n  }\n\n  if (lineEndPos === -1) {\n    pos.value = len;\n  } else {\n    pos.value = lineEndPos;\n    skipLineEnding(src, pos, len);\n  }\n\n  return detected;\n}\n\nexport function skipHeredoc(src: string, pos: PosRef, len: number): void {\n  if (pos.value >= len) return;\n\n  const isNowdoc = src[pos.value] === \"'\";\n  if (isNowdoc) {\n    pos.value++; // Skip opening quote\n  }\n\n  const delimStart = pos.value;\n  while (pos.value < len) {\n    const ch = src.charCodeAt(pos.value);\n    // alphanumeric or _\n    if ((ch >= 65 && ch <= 90) || (ch >= 97 && ch <= 122) || (ch >= 48 && ch <= 57) || ch === 95) {\n      pos.value++;\n    } else {\n      break;\n    }\n  }\n\n  if (pos.value === delimStart) {\n    pos.value = len;\n    return;\n  }\n\n  const delimiter = src.slice(delimStart, pos.value);\n\n  if (isNowdoc && pos.value < len && src[pos.value] === \"'\") {\n    pos.value++;\n  }\n\n  // Skip to end of opening line\n  const lineEndPos = findLineEnding(src, pos.value, len);\n  if (lineEndPos === -1) {\n    pos.value = len;\n    return;\n  }\n  pos.value = lineEndPos;\n  skipLineEnding(src, pos, len);\n\n  const delimLen = delimiter.length;\n\n  // Scan for closing delimiter on its own line\n  while (pos.value < len) {\n    if (pos.value + delimLen <= len) {\n      const potentialDelim = src.slice(pos.value, pos.value + delimLen);\n\n      if (potentialDelim === delimiter) {\n        const afterPos = pos.value + delimLen;\n        if (\n          afterPos >= len ||\n          src[afterPos] === \"\\n\" ||\n          src[afterPos] === \"\\r\" ||\n          src[afterPos] === \";\"\n        ) {\n          pos.value = afterPos;\n\n          if (pos.value < len && src[pos.value] === \";\") {\n            pos.value++;\n          }\n\n          skipLineEnding(src, pos, len);\n          return;\n        }\n      }\n    }\n\n    // Not the delimiter, skip to next line\n    const nextLineEnd = findLineEnding(src, pos.value, len);\n    if (nextLineEnd === -1) {\n      pos.value = len;\n      return;\n    }\n    pos.value = nextLineEnd;\n    skipLineEnding(src, pos, len);\n  }\n\n  pos.value = len;\n}\n\nexport function skipTemplateLiteral(src: string, pos: PosRef, len: number): void {\n  while (pos.value < len) {\n    const byte = src[pos.value];\n\n    if (byte === \"`\") {\n      pos.value++;\n      return;\n    } else if (byte === \"\\\\\") {\n      pos.value += 2;\n    } else if (byte === \"$\" && pos.value + 1 < len && src[pos.value + 1] === \"{\") {\n      // Template expression ${...}\n      pos.value += 2;\n      skipTemplateExpression(src, pos, len);\n    } else {\n      pos.value++;\n    }\n  }\n}\n\nexport function skipTemplateExpression(src: string, pos: PosRef, len: number): void {\n  let depth = 1;\n\n  while (depth > 0 && pos.value < len) {\n    const byte = src[pos.value];\n\n    if (byte === \"{\") {\n      depth++;\n      pos.value++;\n    } else if (byte === \"}\") {\n      depth--;\n      pos.value++;\n    } else if (byte === \"'\" || byte === '\"') {\n      pos.value++;\n      skipQuotedString(src, pos, len, byte);\n    } else if (byte === \"`\") {\n      pos.value++;\n      skipTemplateLiteral(src, pos, len);\n    } else if (byte === \"/\" && pos.value + 1 < len) {\n      const next = src[pos.value + 1];\n      if (next === \"/\") {\n        pos.value += 2;\n        skipLineComment(src, pos, len);\n      } else if (next === \"*\") {\n        pos.value += 2;\n        skipBlockComment(src, pos, len);\n      } else {\n        pos.value++;\n      }\n    } else {\n      pos.value++;\n    }\n  }\n}\n\nexport function skipBacktickString(src: string, pos: PosRef, len: number): void {\n  skipQuotedString(src, pos, len, \"`\");\n}\n","import {\r\n  TokenType,\r\n  State,\r\n  type IgnoreRangeRegion,\r\n  type IgnoreRangeResumeState,\r\n  type Token,\r\n} from \"./types.js\";\r\nimport { Directives } from \"./directives.js\";\r\nimport { ErrorReason, type LexerError } from \"./errors.js\";\r\nimport { isFrontendEventStyleAtName } from \"../frontend-attribute-names.js\";\r\nimport {\r\n  canStartBladeDirectiveAt,\r\n  isAsciiAlnum as isAlnum,\r\n  isAsciiAlpha as isAlpha,\r\n  skipQuotedString,\r\n  skipBacktickString,\r\n  skipBlockComment,\r\n  skipLineCommentDetecting,\r\n  skipHeredoc,\r\n  skipTemplateLiteral,\r\n  type PosRef,\r\n} from \"./scan-primitives.js\";\r\n\r\nconst RAWTEXT_ELEMENTS = new Set([\"script\", \"style\"]);\r\nconst ATTR_LIKE_AT_NAME_CONTINUATION = new Set([\".\", \"-\", \":\", \"[\", \"]\"]);\r\n\r\nexport interface LexerResult {\r\n  tokens: Token[];\r\n  errors: LexerError[];\r\n}\r\n\r\nexport interface LexerRawBlockConfig {\r\n  verbatimStartDirectives?: readonly string[];\r\n  verbatimEndDirectives?: readonly string[];\r\n  ignoreRanges?: readonly IgnoreRangeRegion[];\r\n  ignoreRangeCollector?: IgnoreRangeCollector | null;\r\n}\r\n\r\ninterface IgnoreRangeCollector {\r\n  handleBladeComment(\r\n    start: number,\r\n    end: number,\r\n    originState: State,\r\n    tagStart: number | null,\r\n    resume: IgnoreRangeResumeState,\r\n  ): void;\r\n  handleHtmlComment(\r\n    start: number,\r\n    end: number,\r\n    originState: State,\r\n    tagStart: number | null,\r\n    resume: IgnoreRangeResumeState,\r\n  ): void;\r\n  finish(resume: IgnoreRangeResumeState, eof: number): IgnoreRangeRegion[];\r\n}\r\n\r\nexport class Lexer {\r\n  private src: string;\r\n  private pos = 0;\r\n  private len: number;\r\n  private state: State = State.Data;\r\n  private returnState: State = State.Data;\r\n  private tokens: Token[] = [];\r\n  private errors: LexerError[] = [];\r\n  private verbatim = false;\r\n  private verbatimReturnState: State | null = null;\r\n  private verbatimStartTokenIndex: number | null = null;\r\n  private phpBlock = false;\r\n  private phpBlockStartTokenIndex: number | null = null;\r\n  private phpTag = false;\r\n  private attrPhpDirectiveDepth = 0;\r\n  private rawtextTagName = \"\";\r\n  private currentTagName = \"\";\r\n  private currentTagStart = -1;\r\n  private ignoreRanges: readonly IgnoreRangeRegion[];\r\n  private nextIgnoreRangeIndex = 0;\r\n  private ignoreRangeCollector: IgnoreRangeCollector | null;\r\n  private pendingHtmlCommentOriginState: State | null = null;\r\n  private pendingHtmlCommentTagStart: number | null = null;\r\n  private pendingBladeCommentOriginState: State | null = null;\r\n  private pendingBladeCommentTagStart: number | null = null;\r\n\r\n  private isAtAttributeCandidate(nameLower: string, afterNamePos: number): boolean {\r\n    if (afterNamePos >= this.len) {\r\n      return isFrontendEventStyleAtName(nameLower);\r\n    }\r\n\r\n    const immediate = this.src[afterNamePos];\r\n    if (ATTR_LIKE_AT_NAME_CONTINUATION.has(immediate)) {\r\n      return true;\r\n    }\r\n\r\n    let pos = afterNamePos;\r\n    while (pos < this.len && isSpace(this.src.charCodeAt(pos))) {\r\n      pos++;\r\n    }\r\n\r\n    if (pos < this.len && this.src[pos] === \"=\") {\r\n      return true;\r\n    }\r\n\r\n    if (!isFrontendEventStyleAtName(nameLower)) {\r\n      return false;\r\n    }\r\n\r\n    return (\r\n      pos >= this.len ||\r\n      this.src[pos] === \">\" ||\r\n      this.src[pos] === \"/\" ||\r\n      isSpace(immediate.charCodeAt(0))\r\n    );\r\n  }\r\n  private isClosingTag = false;\r\n  private continuedTagName = false;\r\n  private inXmlDeclaration = false;\r\n  private _directives: Directives;\r\n  private verbatimStartDirectives = new Set<string>([\"verbatim\"]);\r\n  private verbatimEndDirectives = new Set<string>([\"endverbatim\"]);\r\n\r\n  constructor(source: string, directives?: Directives, rawBlockConfig?: LexerRawBlockConfig) {\r\n    this.src = source;\r\n    this.len = source.length;\r\n    this._directives = directives ?? Directives.acceptAll();\r\n    this.ignoreRanges = rawBlockConfig?.ignoreRanges ?? [];\r\n    this.ignoreRangeCollector = rawBlockConfig?.ignoreRangeCollector ?? null;\r\n\r\n    for (const directive of rawBlockConfig?.verbatimStartDirectives ?? []) {\r\n      const normalized = normalizeDirectiveName(directive);\r\n      if (normalized) this.verbatimStartDirectives.add(normalized);\r\n    }\r\n\r\n    for (const directive of rawBlockConfig?.verbatimEndDirectives ?? []) {\r\n      const normalized = normalizeDirectiveName(directive);\r\n      if (normalized) this.verbatimEndDirectives.add(normalized);\r\n    }\r\n  }\r\n\r\n  directives(): Directives {\r\n    return this._directives;\r\n  }\r\n\r\n  tokenize(): LexerResult {\r\n    while (this.pos < this.len) {\r\n      if (this.tryEmitIgnoreRange()) {\r\n        continue;\r\n      }\r\n\r\n      switch (this.state) {\r\n        case State.Data:\r\n          this.scanData();\r\n          break;\r\n        case State.RawText:\r\n          this.scanRawtext();\r\n          break;\r\n        case State.BladeComment:\r\n          this.scanBladeCommentContent();\r\n          break;\r\n        case State.Comment:\r\n          this.scanComment();\r\n          break;\r\n        case State.TagName:\r\n          this.scanTagName();\r\n          break;\r\n        case State.BeforeAttrName:\r\n          this.scanBeforeAttrName();\r\n          break;\r\n        case State.AttrName:\r\n          this.scanAttrName();\r\n          break;\r\n        case State.AfterAttrName:\r\n          this.scanAfterAttrName();\r\n          break;\r\n        case State.BeforeAttrValue:\r\n          this.scanBeforeAttrValue();\r\n          break;\r\n        case State.AttrValueQuoted:\r\n          this.scanAttrValueQuoted();\r\n          break;\r\n        case State.AttrValueUnquoted:\r\n          this.scanAttrValueUnquoted();\r\n          break;\r\n        default:\r\n          break;\r\n      }\r\n    }\r\n\r\n    // EOF in tag - emit SyntheticClose\r\n    if (\r\n      this.state === State.TagName ||\r\n      this.state === State.BeforeAttrName ||\r\n      this.state === State.AttrName ||\r\n      this.state === State.AfterAttrName ||\r\n      this.state === State.BeforeAttrValue ||\r\n      this.state === State.AttrValueQuoted ||\r\n      this.state === State.AttrValueUnquoted\r\n    ) {\r\n      this.emit(TokenType.SyntheticClose, this.pos, this.pos);\r\n    }\r\n\r\n    this.ignoreRangeCollector?.finish(this.snapshotIgnoreRangeResumeState(), this.len);\r\n\r\n    return { tokens: this.tokens, errors: this.errors };\r\n  }\r\n\r\n  private emit(type: TokenType, start: number, end: number): void {\r\n    this.tokens.push({ type, start, end });\r\n  }\r\n\r\n  private snapshotIgnoreRangeResumeState(): IgnoreRangeResumeState {\r\n    return {\r\n      state: this.state,\r\n      returnState: this.returnState,\r\n      rawtextTagName: this.rawtextTagName,\r\n      currentTagName: this.currentTagName,\r\n      isClosingTag: this.isClosingTag,\r\n      continuedTagName: this.continuedTagName,\r\n      inXmlDeclaration: this.inXmlDeclaration,\r\n      verbatim: this.verbatim,\r\n      verbatimReturnState: this.verbatimReturnState,\r\n      verbatimStartTokenIndex: this.verbatimStartTokenIndex,\r\n      phpBlock: this.phpBlock,\r\n      phpBlockStartTokenIndex: this.phpBlockStartTokenIndex,\r\n      phpTag: this.phpTag,\r\n      attrPhpDirectiveDepth: this.attrPhpDirectiveDepth,\r\n    };\r\n  }\r\n\r\n  private restoreIgnoreRangeResumeState(resume: IgnoreRangeResumeState): void {\r\n    this.state = resume.state;\r\n    this.returnState = resume.returnState;\r\n    this.rawtextTagName = resume.rawtextTagName;\r\n    this.currentTagName = resume.currentTagName;\r\n    this.isClosingTag = resume.isClosingTag;\r\n    this.continuedTagName = resume.continuedTagName;\r\n    this.inXmlDeclaration = resume.inXmlDeclaration;\r\n    this.verbatim = resume.verbatim;\r\n    this.verbatimReturnState = resume.verbatimReturnState;\r\n    this.verbatimStartTokenIndex = resume.verbatimStartTokenIndex ?? null;\r\n    this.phpBlock = resume.phpBlock;\r\n    this.phpBlockStartTokenIndex = resume.phpBlockStartTokenIndex ?? null;\r\n    this.phpTag = resume.phpTag;\r\n    this.attrPhpDirectiveDepth = resume.attrPhpDirectiveDepth;\r\n  }\r\n\r\n  private tryEmitIgnoreRange(): boolean {\r\n    const range = this.ignoreRanges[this.nextIgnoreRangeIndex];\r\n    if (!range || this.pos !== range.start) {\r\n      return false;\r\n    }\r\n\r\n    this.emit(TokenType.IgnoreRange, range.start, range.end);\r\n    this.pos = range.end;\r\n    this.restoreIgnoreRangeResumeState(range.resume);\r\n    this.nextIgnoreRangeIndex++;\r\n    return true;\r\n  }\r\n\r\n  private nextIgnoreRangeStart(): number | null {\r\n    const range = this.ignoreRanges[this.nextIgnoreRangeIndex];\r\n    return range ? range.start : null;\r\n  }\r\n\r\n  private recordBladeComment(\r\n    start: number,\r\n    end: number,\r\n    originState: State,\r\n    tagStart: number | null,\r\n  ): void {\r\n    this.ignoreRangeCollector?.handleBladeComment(\r\n      start,\r\n      end,\r\n      originState,\r\n      tagStart,\r\n      this.snapshotIgnoreRangeResumeState(),\r\n    );\r\n  }\r\n\r\n  private recordHtmlComment(\r\n    start: number,\r\n    end: number,\r\n    originState: State,\r\n    tagStart: number | null,\r\n  ): void {\r\n    this.ignoreRangeCollector?.handleHtmlComment(\r\n      start,\r\n      end,\r\n      originState,\r\n      tagStart,\r\n      this.snapshotIgnoreRangeResumeState(),\r\n    );\r\n  }\r\n\r\n  private beginBladeCommentCapture(originState: State, tagStart: number | null): void {\r\n    this.pendingBladeCommentOriginState = originState;\r\n    this.pendingBladeCommentTagStart = tagStart;\r\n  }\r\n\r\n  private beginHtmlCommentCapture(originState: State, tagStart: number | null): void {\r\n    this.pendingHtmlCommentOriginState = originState;\r\n    this.pendingHtmlCommentTagStart = tagStart;\r\n  }\r\n\r\n  private logError(reason: ErrorReason, offset: number): void {\r\n    this.errors.push({ reason, offset });\r\n  }\r\n\r\n  private peek(): string | null {\r\n    return this.pos < this.len ? this.src[this.pos] : null;\r\n  }\r\n\r\n  private peekAhead(n: number): string | null {\r\n    const p = this.pos + n;\r\n    return p < this.len ? this.src[p] : null;\r\n  }\r\n\r\n  private skipWhitespace(): void {\r\n    while (this.pos < this.len && isSpace(this.src.charCodeAt(this.pos))) {\r\n      this.pos++;\r\n    }\r\n  }\r\n\r\n  private skipAndEmitWhitespace(): void {\r\n    const start = this.pos;\r\n    while (this.pos < this.len && isSpace(this.src.charCodeAt(this.pos))) {\r\n      this.pos++;\r\n    }\r\n    if (start < this.pos) {\r\n      this.emit(TokenType.Whitespace, start, this.pos);\r\n    }\r\n  }\r\n\r\n  private scanAttributePhpDirectiveContent(): boolean {\r\n    if (this.attrPhpDirectiveDepth <= 0) return false;\r\n\r\n    const start = this.pos;\r\n\r\n    while (this.pos < this.len) {\r\n      const ch = this.src[this.pos];\r\n\r\n      if (ch === '\"' || ch === \"'\") {\r\n        this.pos++;\r\n        this.skipQuotedStringPrim(ch);\r\n        continue;\r\n      }\r\n\r\n      if (ch === \"`\") {\r\n        this.pos++;\r\n        this.skipBacktickStringPrim();\r\n        continue;\r\n      }\r\n\r\n      if (ch === \"/\" && this.pos + 1 < this.len) {\r\n        const next = this.src[this.pos + 1];\r\n        if (next === \"/\") {\r\n          this.pos += 2;\r\n          while (this.pos < this.len) {\r\n            const c = this.src[this.pos];\r\n            if (c === \"\\n\" || c === \"\\r\") {\r\n              this.pos++;\r\n              break;\r\n            }\r\n            this.pos++;\r\n          }\r\n          continue;\r\n        }\r\n        if (next === \"*\") {\r\n          this.pos += 2;\r\n          this.skipBlockCommentPrim();\r\n          continue;\r\n        }\r\n      }\r\n\r\n      if (ch === \"#\") {\r\n        this.pos++;\r\n        while (this.pos < this.len) {\r\n          const c = this.src[this.pos];\r\n          if (c === \"\\n\" || c === \"\\r\") {\r\n            this.pos++;\r\n            break;\r\n          }\r\n          this.pos++;\r\n        }\r\n        continue;\r\n      }\r\n\r\n      if (\r\n        ch === \"<\" &&\r\n        this.pos + 2 < this.len &&\r\n        this.src[this.pos + 1] === \"<\" &&\r\n        this.src[this.pos + 2] === \"<\"\r\n      ) {\r\n        this.pos += 3;\r\n        this.skipHeredocPrim();\r\n        continue;\r\n      }\r\n\r\n      if (ch === \"@\" && !this.verbatim && !this.phpTag) {\r\n        let nameEnd = this.pos + 1;\r\n        while (nameEnd < this.len) {\r\n          const cc = this.src.charCodeAt(nameEnd);\r\n          if (isAlnum(cc) || cc === 95) {\r\n            nameEnd++;\r\n          } else {\r\n            break;\r\n          }\r\n        }\r\n\r\n        if (nameEnd > this.pos + 1) {\r\n          const name = this.src.slice(this.pos + 1, nameEnd).toLowerCase();\r\n          if (name === \"php\" || name === \"endphp\") {\r\n            if (start < this.pos) {\r\n              this.emit(TokenType.Text, start, this.pos);\r\n            }\r\n            this.returnState = this.state;\r\n            this.scanDirective();\r\n            return true;\r\n          }\r\n        }\r\n      }\r\n\r\n      this.pos++;\r\n    }\r\n\r\n    if (start < this.pos) {\r\n      this.emit(TokenType.Text, start, this.pos);\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  private posRef(): PosRef {\r\n    return { value: this.pos };\r\n  }\r\n\r\n  private syncPos(ref: PosRef): void {\r\n    this.pos = ref.value;\r\n  }\r\n\r\n  private skipQuotedStringPrim(quote: string): void {\r\n    const ref = this.posRef();\r\n    skipQuotedString(this.src, ref, this.len, quote);\r\n    this.syncPos(ref);\r\n  }\r\n\r\n  private skipBlockCommentPrim(): void {\r\n    const ref = this.posRef();\r\n    skipBlockComment(this.src, ref, this.len);\r\n    this.syncPos(ref);\r\n  }\r\n\r\n  private skipHeredocPrim(): void {\r\n    const ref = this.posRef();\r\n    skipHeredoc(this.src, ref, this.len);\r\n    this.syncPos(ref);\r\n  }\r\n\r\n  private skipBacktickStringPrim(): void {\r\n    const ref = this.posRef();\r\n    skipBacktickString(this.src, ref, this.len);\r\n    this.syncPos(ref);\r\n  }\r\n\r\n  private skipTemplateLiteralPrim(): void {\r\n    const ref = this.posRef();\r\n    skipTemplateLiteral(this.src, ref, this.len);\r\n    this.syncPos(ref);\r\n  }\r\n\r\n  /**\r\n   * Skip line comment with warnings about ?> inside comments.\r\n   */\r\n  private skipLineCommentWithWarnings(): void {\r\n    const ref = this.posRef();\r\n    const detected = skipLineCommentDetecting(this.src, ref, this.len, [\"?>\"]);\r\n    this.syncPos(ref);\r\n\r\n    for (const d of detected) {\r\n      this.logError(ErrorReason.PhpCloseTagInComment, d.offset);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Detect if the current position starts a Blade/PHP construct.\r\n   * Used for construct collision detection inside echos.\r\n   */\r\n  private detectConstruct(): boolean {\r\n    if (this.pos >= this.len) return false;\r\n    const byte = this.src[this.pos];\r\n\r\n    // Triple echo: {{{\r\n    if (byte === \"{\" && this.peekAhead(1) === \"{\" && this.peekAhead(2) === \"{\") {\r\n      return true;\r\n    }\r\n\r\n    // Blade comment: {{--\r\n    if (\r\n      byte === \"{\" &&\r\n      this.peekAhead(1) === \"{\" &&\r\n      this.peekAhead(2) === \"-\" &&\r\n      this.peekAhead(3) === \"-\"\r\n    ) {\r\n      return true;\r\n    }\r\n\r\n    // Raw echo: {!!\r\n    if (byte === \"{\" && this.peekAhead(1) === \"!\" && this.peekAhead(2) === \"!\") {\r\n      return true;\r\n    }\r\n\r\n    // Echo: {{\r\n    if (byte === \"{\" && this.peekAhead(1) === \"{\") {\r\n      return true;\r\n    }\r\n\r\n    // Directive: @word\r\n    if (byte === \"@\" && this.pos + 1 < this.len) {\r\n      const next = this.src[this.pos + 1];\r\n      if (isAlpha(next.charCodeAt(0))) {\r\n        return true;\r\n      }\r\n    }\r\n\r\n    // PHP tag: <?php, <?=\r\n    if (byte === \"<\" && this.peekAhead(1) === \"?\") {\r\n      if (this.phpTagStartLength(this.pos) > 0) {\r\n        return true;\r\n      }\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  /**\r\n   * Case-insensitive ASCII word match at a source offset.\r\n   */\r\n  private hasAsciiWordAt(pos: number, word: string): boolean {\r\n    if (pos + word.length > this.len) return false;\r\n    for (let i = 0; i < word.length; i++) {\r\n      let code = this.src.charCodeAt(pos + i);\r\n      if (code >= 65 && code <= 90) code += 32;\r\n      if (code !== word.charCodeAt(i)) {\r\n        return false;\r\n      }\r\n    }\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Fast-forward to next character relevant to TSX generic scanning.\r\n   */\r\n  private nextInterestingPosForTsxGeneric(fromPos: number): number {\r\n    for (let i = fromPos; i < this.len; i++) {\r\n      switch (this.src.charCodeAt(i)) {\r\n        case 60: // <\r\n        case 62: // >\r\n        case 34: // \"\r\n        case 39: // '\r\n        case 96: // `\r\n        case 64: // @\r\n        case 10: // \\n\r\n        case 13: // \\r\r\n          return i;\r\n      }\r\n    }\r\n    return this.len;\r\n  }\r\n\r\n  /**\r\n   * Fast-forward to next character relevant to balanced JS-like scanning.\r\n   */\r\n  private nextInterestingPosForBalancedJsLike(fromPos: number): number {\r\n    for (let i = fromPos; i < this.len; i++) {\r\n      switch (this.src.charCodeAt(i)) {\r\n        case 123: // {\r\n        case 125: // }\r\n        case 40: // (\r\n        case 41: // )\r\n        case 34: // \"\r\n        case 39: // '\r\n        case 96: // `\r\n        case 47: // /\r\n        case 64: // @\r\n        case 10: // \\n\r\n        case 13: // \\r\r\n          return i;\r\n      }\r\n    }\r\n    return this.len;\r\n  }\r\n\r\n  private scanData(): void {\r\n    const start = this.pos;\r\n\r\n    while (this.pos < this.len) {\r\n      const nextIgnoreRangeStart = this.nextIgnoreRangeStart();\r\n      if (nextIgnoreRangeStart !== null && this.pos === nextIgnoreRangeStart) {\r\n        if (start < this.pos) {\r\n          if (this.phpBlock) {\r\n            this.emit(TokenType.PhpBlock, start, this.pos);\r\n          } else if (this.phpTag) {\r\n            this.emit(TokenType.PhpContent, start, this.pos);\r\n          } else {\r\n            this.emit(TokenType.Text, start, this.pos);\r\n          }\r\n        }\r\n        return;\r\n      }\r\n\r\n      const byte = this.src[this.pos];\r\n\r\n      if (this.phpBlock) {\r\n        if (byte === \"'\" || byte === '\"') {\r\n          this.pos++;\r\n          this.skipQuotedStringPrim(byte);\r\n          continue;\r\n        }\r\n\r\n        if (byte === \"`\") {\r\n          this.pos++;\r\n          this.skipBacktickStringPrim();\r\n          continue;\r\n        }\r\n\r\n        if (byte === \"/\" && this.pos + 1 < this.len) {\r\n          const next = this.src[this.pos + 1];\r\n          if (next === \"/\") {\r\n            this.pos += 2;\r\n            while (this.pos < this.len) {\r\n              const ch = this.src[this.pos];\r\n              if (ch === \"\\n\" || ch === \"\\r\") {\r\n                this.pos++;\r\n                break;\r\n              }\r\n              this.pos++;\r\n            }\r\n            continue;\r\n          }\r\n          if (next === \"*\") {\r\n            this.pos += 2;\r\n            this.skipBlockCommentPrim();\r\n            continue;\r\n          }\r\n        }\r\n\r\n        if (byte === \"#\") {\r\n          this.pos++;\r\n          while (this.pos < this.len) {\r\n            const ch = this.src[this.pos];\r\n            if (ch === \"\\n\" || ch === \"\\r\") {\r\n              this.pos++;\r\n              break;\r\n            }\r\n            this.pos++;\r\n          }\r\n          continue;\r\n        }\r\n\r\n        if (\r\n          byte === \"<\" &&\r\n          this.pos + 2 < this.len &&\r\n          this.src[this.pos + 1] === \"<\" &&\r\n          this.src[this.pos + 2] === \"<\"\r\n        ) {\r\n          this.pos += 3;\r\n          this.skipHeredocPrim();\r\n          continue;\r\n        }\r\n\r\n        if (byte === \"@\" && this.isEndphpAt(this.pos)) {\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.PhpBlock, start, this.pos);\r\n          }\r\n          this.scanDirective();\r\n          return;\r\n        }\r\n\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      if (byte === \"{\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n        // Escaped echo: previous char is @\r\n        const prevChar = this.pos > 0 ? this.src[this.pos - 1] : null;\r\n        if (prevChar === \"@\") {\r\n          this.pos++;\r\n          continue;\r\n        }\r\n\r\n        const next1 = this.peekAhead(1);\r\n\r\n        if (next1 === \"{\") {\r\n          const next2 = this.peekAhead(2);\r\n          const next3 = this.peekAhead(3);\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.Text, start, this.pos);\r\n          }\r\n\r\n          if (next2 === \"-\" && next3 === \"-\") {\r\n            this.beginBladeCommentCapture(State.Data, null);\r\n            this.scanBladeCommentStart();\r\n            return;\r\n          }\r\n          this.scanEcho();\r\n          return;\r\n        } else if (next1 === \"!\" && this.pos + 2 < this.len && this.src[this.pos + 2] === \"!\") {\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.Text, start, this.pos);\r\n          }\r\n          this.scanRawEcho();\r\n          return;\r\n        } else {\r\n          this.pos++;\r\n        }\r\n      } else if (\r\n        this.verbatim &&\r\n        this.verbatimReturnState === State.RawText &&\r\n        this.rawtextTagName.length > 0 &&\r\n        byte === \"<\" &&\r\n        this.isRawtextClosingTagAt(this.pos, this.rawtextTagName, this.rawtextTagName.length)\r\n      ) {\r\n        this.logError(ErrorReason.UnexpectedEof, this.pos);\r\n        this.recoverUnclosedRawtextVerbatimBlock(start);\r\n        return;\r\n      } else if (byte === \"@\") {\r\n        // Verbatim mode: only explicit terminators (e.g. @endverbatim,\r\n        // @endantlers) matter.\r\n        if (this.verbatim) {\r\n          if (this.isVerbatimTerminatorAt(this.pos)) {\r\n            if (start < this.pos) {\r\n              this.emit(TokenType.Text, start, this.pos);\r\n            }\r\n            this.scanDirective();\r\n            return;\r\n          }\r\n          this.pos++;\r\n          continue;\r\n        }\r\n\r\n        // In PHP tag mode, @ is just regular content\r\n        if (this.phpTag) {\r\n          this.pos++;\r\n          continue;\r\n        }\r\n\r\n        // Check if @ can start a directive\r\n        const canStart = canStartBladeDirectiveAt(this.src, this.pos);\r\n\r\n        if (canStart) {\r\n          // Check escape sequences: @@, @{{, @{!!\r\n          const nextPos = this.pos + 1;\r\n          let isEscaped = false;\r\n          if (nextPos < this.len) {\r\n            const nextByte = this.src[nextPos];\r\n            if (nextByte === \"@\") {\r\n              isEscaped = true;\r\n            } else if (nextByte === \"{\" && nextPos + 1 < this.len) {\r\n              const afterBrace = this.src[nextPos + 1];\r\n              if (afterBrace === \"{\" || afterBrace === \"!\") {\r\n                isEscaped = true;\r\n              }\r\n            }\r\n          }\r\n\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.Text, start, this.pos);\r\n          }\r\n\r\n          if (isEscaped) {\r\n            this.emit(TokenType.AtSign, this.pos, this.pos + 1);\r\n            this.pos++;\r\n            return;\r\n          }\r\n\r\n          this.scanDirective();\r\n          return;\r\n        } else {\r\n          this.pos++;\r\n        }\r\n      } else if (byte === \"<\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n        // DOCTYPE\r\n        if (\r\n          this.pos + 9 <= this.len &&\r\n          this.src[this.pos + 1] === \"!\" &&\r\n          this.src.slice(this.pos + 2, this.pos + 9).toLowerCase() === \"doctype\"\r\n        ) {\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.Text, start, this.pos);\r\n          }\r\n          this.scanDoctype();\r\n          return;\r\n        }\r\n\r\n        // CDATA section or conditional comment end: <![\r\n        if (\r\n          this.pos + 3 <= this.len &&\r\n          this.src[this.pos + 1] === \"!\" &&\r\n          this.src[this.pos + 2] === \"[\"\r\n        ) {\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.Text, start, this.pos);\r\n          }\r\n\r\n          // Try CDATA first: <![CDATA[\r\n          if (this.tryScanCdata()) {\r\n            return;\r\n          }\r\n\r\n          // Otherwise, try conditional comment end: <![endif]-->\r\n          this.tryScanConditionalCommentEnd();\r\n          return;\r\n        }\r\n\r\n        // HTML comment <!--\r\n        if (\r\n          this.pos + 4 <= this.len &&\r\n          this.src[this.pos + 1] === \"!\" &&\r\n          this.src[this.pos + 2] === \"-\" &&\r\n          this.src[this.pos + 3] === \"-\"\r\n        ) {\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.Text, start, this.pos);\r\n          }\r\n\r\n          // Check for conditional comment: <!--[if ...]>\r\n          if (this.tryScanConditionalComment()) {\r\n            return;\r\n          }\r\n\r\n          // Standard HTML comment\r\n          this.state = State.Comment;\r\n          return;\r\n        }\r\n\r\n        // Bogus comment with single dash: <!- (not <!--)\r\n        if (\r\n          this.pos + 3 <= this.len &&\r\n          this.src[this.pos + 1] === \"!\" &&\r\n          this.src[this.pos + 2] === \"-\" &&\r\n          (this.pos + 3 >= this.len || this.src[this.pos + 3] !== \"-\")\r\n        ) {\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.Text, start, this.pos);\r\n          }\r\n          const bogusStart = this.pos;\r\n          this.pos += 3; // Skip <!-\r\n          while (this.pos < this.len) {\r\n            if (this.src[this.pos] === \">\") {\r\n              this.pos++;\r\n              this.emit(TokenType.BogusComment, bogusStart, this.pos);\r\n              return;\r\n            }\r\n            if (\r\n              this.pos + 1 < this.len &&\r\n              this.src[this.pos] === \"-\" &&\r\n              this.src[this.pos + 1] === \">\"\r\n            ) {\r\n              this.pos += 2;\r\n              this.emit(TokenType.BogusComment, bogusStart, this.pos);\r\n              return;\r\n            }\r\n            this.pos++;\r\n          }\r\n          this.emit(TokenType.BogusComment, bogusStart, this.pos);\r\n          return;\r\n        }\r\n\r\n        // <? sequences: XML declaration, PI, bogus comment, PHP tag\r\n        if (this.pos + 1 < this.len && this.src[this.pos + 1] === \"?\") {\r\n          const scanStart = this.pos;\r\n          const tokensBefore = this.tokens.length;\r\n\r\n          if (\r\n            this.tryScanDecl() ||\r\n            this.tryScanProcessingInstruction() ||\r\n            this.tryScanBogusComment()\r\n          ) {\r\n            // Scanner matched and emitted tokens. Insert preceding text before them.\r\n            if (start < scanStart) {\r\n              this.tokens.splice(tokensBefore, 0, {\r\n                type: TokenType.Text,\r\n                start,\r\n                end: scanStart,\r\n              });\r\n            }\r\n            return;\r\n          }\r\n\r\n          // PHP tag: <?php, <?=\r\n          if (this.phpTagStartLength(this.pos) > 0) {\r\n            if (start < this.pos) {\r\n              this.emit(TokenType.Text, start, this.pos);\r\n            }\r\n            this.tryScanPhpTag();\r\n            return;\r\n          }\r\n\r\n          // None matched - treat < as regular text, advance past it\r\n          this.pos++;\r\n          continue;\r\n        }\r\n\r\n        // Bogus comment: <- ... -> (not <!--)\r\n        if (\r\n          this.pos + 1 < this.len &&\r\n          this.src[this.pos + 1] === \"-\" &&\r\n          (this.pos + 2 >= this.len || this.src[this.pos + 2] !== \"-\")\r\n        ) {\r\n          const scanStart = this.pos;\r\n          const tokensBefore = this.tokens.length;\r\n\r\n          if (this.tryScanBogusComment()) {\r\n            if (start < scanStart) {\r\n              this.tokens.splice(tokensBefore, 0, {\r\n                type: TokenType.Text,\r\n                start,\r\n                end: scanStart,\r\n              });\r\n            }\r\n            return;\r\n          }\r\n          // Didn't match - treat < as regular text, advance past it\r\n          this.pos++;\r\n          continue;\r\n        }\r\n\r\n        // Tag open: <alpha or </ or <_ or <> or <{ or <@\r\n        const nextChar = this.pos + 1 < this.len ? this.src[this.pos + 1] : null;\r\n        const isValidTagStart =\r\n          nextChar !== null &&\r\n          (isAlpha(nextChar.charCodeAt(0)) ||\r\n            nextChar === \"/\" ||\r\n            nextChar === \"_\" ||\r\n            nextChar === \">\" ||\r\n            nextChar === \"{\" ||\r\n            nextChar === \"@\");\r\n\r\n        if (isValidTagStart) {\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.Text, start, this.pos);\r\n          }\r\n          this.scanTagOpen();\r\n          return;\r\n        } else {\r\n          this.pos++;\r\n        }\r\n      } else if (byte === \"?\" && this.phpTag) {\r\n        // Check for ?> closing tag in PHP tag mode\r\n        if (this.isPhpTagEndAt(this.pos)) {\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.PhpContent, start, this.pos);\r\n          }\r\n          this.emit(TokenType.PhpTagEnd, this.pos, this.pos + 2);\r\n          this.pos += 2;\r\n          this.phpTag = false;\r\n          return;\r\n        }\r\n        this.pos++;\r\n      } else {\r\n        this.pos++;\r\n      }\r\n    }\r\n\r\n    if (start < this.pos) {\r\n      if (this.phpBlock) {\r\n        this.logError(ErrorReason.UnexpectedEof, this.pos);\r\n        this.emit(TokenType.PhpBlock, start, this.pos);\r\n      } else if (this.phpTag) {\r\n        this.emit(TokenType.PhpContent, start, this.pos);\r\n      } else if (this.verbatim) {\r\n        this.logError(ErrorReason.UnexpectedEof, this.pos);\r\n        this.emit(TokenType.Text, start, this.pos);\r\n      } else {\r\n        this.emit(TokenType.Text, start, this.pos);\r\n      }\r\n    }\r\n  }\r\n\r\n  private scanComment(): void {\r\n    const start = this.pos;\r\n    const originState = this.pendingHtmlCommentOriginState ?? State.Data;\r\n    const tagStart = this.pendingHtmlCommentTagStart;\r\n    this.pendingHtmlCommentOriginState = null;\r\n    this.pendingHtmlCommentTagStart = null;\r\n\r\n    this.emit(TokenType.CommentStart, start, start + 4);\r\n    this.pos += 4;\r\n\r\n    const contentStart = this.pos;\r\n\r\n    const closePos = this.src.indexOf(\"-->\", this.pos);\r\n\r\n    if (closePos === -1) {\r\n      // EOF without closing\r\n      if (contentStart < this.len) {\r\n        this.emit(TokenType.Text, contentStart, this.len);\r\n      }\r\n      this.logError(ErrorReason.UnexpectedEof, this.len);\r\n      this.pos = this.len;\r\n      this.state = State.Data;\r\n      this.recordHtmlComment(start, this.pos, originState, tagStart);\r\n      return;\r\n    }\r\n\r\n    // Found closing -->\r\n    if (contentStart < closePos) {\r\n      this.emit(TokenType.Text, contentStart, closePos);\r\n    }\r\n    this.emit(TokenType.CommentEnd, closePos, closePos + 3);\r\n    this.pos = closePos + 3;\r\n    this.state = State.Data;\r\n    this.recordHtmlComment(start, this.pos, originState, tagStart);\r\n  }\r\n\r\n  private tryScanBogusComment(): boolean {\r\n    if (this.pos + 1 >= this.len) return false;\r\n\r\n    const start = this.pos;\r\n\r\n    // <? ... > (but not PHP tag)\r\n    if (this.src[this.pos] === \"<\" && this.src[this.pos + 1] === \"?\") {\r\n      // Check if this is a PHP tag\r\n      const tagLen = this.phpTagStartLength(this.pos);\r\n      if (tagLen > 0) return false;\r\n\r\n      this.pos += 2;\r\n\r\n      while (this.pos < this.len) {\r\n        if (this.src[this.pos] === \">\") {\r\n          this.pos++;\r\n          this.emit(TokenType.BogusComment, start, this.pos);\r\n          return true;\r\n        }\r\n        this.pos++;\r\n      }\r\n\r\n      // EOF without closing. Restore position\r\n      this.pos = start;\r\n      return false;\r\n    }\r\n\r\n    // <- ... -> (but not <!--)\r\n    if (this.src[this.pos] === \"<\" && this.src[this.pos + 1] === \"-\") {\r\n      // Make sure this is not <!--\r\n      if (this.pos + 2 < this.len && this.src[this.pos + 2] === \"-\") {\r\n        return false;\r\n      }\r\n\r\n      this.pos += 2;\r\n\r\n      while (this.pos + 1 < this.len) {\r\n        if (this.src[this.pos] === \"-\" && this.src[this.pos + 1] === \">\") {\r\n          this.pos += 2;\r\n          this.emit(TokenType.BogusComment, start, this.pos);\r\n          return true;\r\n        }\r\n        this.pos++;\r\n      }\r\n\r\n      // EOF without closing. Restore position\r\n      this.pos = start;\r\n      return false;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  private scanBladeCommentStart(): void {\r\n    const start = this.pos;\r\n    this.pos += 4; // {{--\r\n    this.emit(TokenType.BladeCommentStart, start, this.pos);\r\n    this.state = State.BladeComment;\r\n  }\r\n\r\n  private scanBladeCommentContent(): void {\r\n    const start = this.pos;\r\n    const commentStart = start - 4;\r\n    const originState = this.pendingBladeCommentOriginState ?? this.returnState;\r\n    const tagStart = this.pendingBladeCommentTagStart;\r\n    this.pendingBladeCommentOriginState = null;\r\n    this.pendingBladeCommentTagStart = null;\r\n\r\n    while (this.pos < this.len) {\r\n      const closePos = this.src.indexOf(\"--}}\", this.pos);\r\n\r\n      if (closePos === -1) {\r\n        // EOF without closing\r\n        if (start < this.len) {\r\n          this.emit(TokenType.Text, start, this.len);\r\n        }\r\n        this.pos = this.len;\r\n        this.logError(ErrorReason.UnexpectedEof, this.len);\r\n        this.state = this.returnState;\r\n        this.returnState = State.Data;\r\n        this.recordBladeComment(commentStart, this.pos, originState, tagStart);\r\n        return;\r\n      }\r\n\r\n      if (closePos > start) {\r\n        this.emit(TokenType.Text, start, closePos);\r\n      }\r\n      this.emit(TokenType.BladeCommentEnd, closePos, closePos + 4);\r\n      this.pos = closePos + 4;\r\n      this.state = this.returnState;\r\n      this.returnState = State.Data;\r\n      this.recordBladeComment(commentStart, this.pos, originState, tagStart);\r\n      return;\r\n    }\r\n\r\n    this.state = this.returnState;\r\n    this.returnState = State.Data;\r\n    this.recordBladeComment(commentStart, this.pos, originState, tagStart);\r\n  }\r\n\r\n  private tryScanConditionalComment(): boolean {\r\n    if (this.pos + 5 >= this.len) return false;\r\n    if (this.src.slice(this.pos, this.pos + 5) !== \"<!--[\") return false;\r\n\r\n    const start = this.pos;\r\n    let scanPos = this.pos + 5;\r\n\r\n    while (scanPos + 1 < this.len) {\r\n      if (this.src[scanPos] === \"]\" && this.src[scanPos + 1] === \">\") {\r\n        const afterMarker = scanPos + 2;\r\n\r\n        // Downlevel-revealed start marker `<!--[if ...]><!-->` should be\r\n        // tokenized as a normal comment, not a conditional block start.\r\n        if (\r\n          afterMarker + 5 <= this.len &&\r\n          this.src.slice(afterMarker, afterMarker + 5) === \"<!-->\"\r\n        ) {\r\n          return false;\r\n        }\r\n\r\n        this.pos = afterMarker;\r\n        this.emit(TokenType.ConditionalCommentStart, start, this.pos);\r\n        return true;\r\n      }\r\n      scanPos++;\r\n    }\r\n\r\n    // EOF without closing \"]>\"\r\n    this.pos = this.len;\r\n    this.emit(TokenType.ConditionalCommentStart, start, this.pos);\r\n    return true;\r\n  }\r\n\r\n  private tryScanConditionalCommentEnd(): boolean {\r\n    if (this.pos + 3 > this.len) return false;\r\n    if (this.src.slice(this.pos, this.pos + 3) !== \"<![\") return false;\r\n\r\n    const start = this.pos;\r\n    this.pos += 3;\r\n\r\n    return this.scanConditionalClosing(start);\r\n  }\r\n\r\n  private scanConditionalClosing(start: number): boolean {\r\n    while (this.pos + 3 < this.len) {\r\n      if (\r\n        this.src[this.pos] === \"]\" &&\r\n        this.src[this.pos + 1] === \"-\" &&\r\n        this.src[this.pos + 2] === \"-\" &&\r\n        this.src[this.pos + 3] === \">\"\r\n      ) {\r\n        this.pos += 4;\r\n        this.emit(TokenType.ConditionalCommentEnd, start, this.pos);\r\n        return true;\r\n      }\r\n      this.pos++;\r\n    }\r\n\r\n    // EOF without closing \"]-->\"\r\n    this.pos = this.len;\r\n    this.emit(TokenType.ConditionalCommentEnd, start, this.pos);\r\n    return true;\r\n  }\r\n\r\n  private tryScanCdata(): boolean {\r\n    if (this.pos + 9 > this.len) return false;\r\n    if (this.src.slice(this.pos, this.pos + 9) !== \"<![CDATA[\") return false;\r\n\r\n    const start = this.pos;\r\n    this.emit(TokenType.CdataStart, start, start + 9);\r\n    this.pos += 9;\r\n\r\n    const contentStart = this.pos;\r\n    const closePos = this.src.indexOf(\"]]>\", this.pos);\r\n\r\n    if (closePos === -1) {\r\n      // EOF without closing\r\n      if (contentStart < this.len) {\r\n        this.emit(TokenType.Text, contentStart, this.len);\r\n      }\r\n      this.logError(ErrorReason.UnexpectedEof, this.len);\r\n      this.pos = this.len;\r\n      return true;\r\n    }\r\n\r\n    if (contentStart < closePos) {\r\n      this.emit(TokenType.Text, contentStart, closePos);\r\n    }\r\n    this.emit(TokenType.CdataEnd, closePos, closePos + 3);\r\n    this.pos = closePos + 3;\r\n    return true;\r\n  }\r\n\r\n  private tryScanProcessingInstruction(): boolean {\r\n    if (this.pos + 2 > this.len) return false;\r\n    if (this.src[this.pos] !== \"<\" || this.src[this.pos + 1] !== \"?\") {\r\n      return false;\r\n    }\r\n\r\n    if (this.pos + 2 >= this.len) return false;\r\n\r\n    const thirdChar = this.src[this.pos + 2];\r\n\r\n    // If space immediately after, it's a bogus comment\r\n    if (isSpace(thirdChar.charCodeAt(0))) return false;\r\n\r\n    if (!isAlpha(thirdChar.charCodeAt(0))) return false;\r\n\r\n    // Check if this is a PHP tag\r\n    if (this.phpTagStartLength(this.pos) > 0) return false;\r\n\r\n    // Scan the target name\r\n    const targetStart = this.pos + 2;\r\n    let targetEnd = targetStart;\r\n    while (targetEnd < this.len) {\r\n      const c = this.src[targetEnd];\r\n      const cc = c.charCodeAt(0);\r\n      if (isAlnum(cc) || c === \"-\" || c === \"_\" || c === \":\") {\r\n        targetEnd++;\r\n      } else {\r\n        break;\r\n      }\r\n    }\r\n\r\n    const targetName = this.src.slice(targetStart, targetEnd);\r\n\r\n    // xml is handled by tryScanDecl\r\n    if (targetName.toLowerCase() === \"xml\") return false;\r\n\r\n    const start = this.pos;\r\n    const piStartEnd = targetEnd;\r\n\r\n    this.emit(TokenType.PIStart, start, piStartEnd);\r\n    this.pos = piStartEnd;\r\n\r\n    const contentStart = this.pos;\r\n\r\n    while (this.pos + 1 < this.len) {\r\n      if (this.src[this.pos] === \"?\" && this.src[this.pos + 1] === \">\") {\r\n        if (contentStart < this.pos) {\r\n          this.emit(TokenType.Text, contentStart, this.pos);\r\n        }\r\n        this.emit(TokenType.PIEnd, this.pos, this.pos + 2);\r\n        this.pos += 2;\r\n        return true;\r\n      }\r\n      this.pos++;\r\n    }\r\n\r\n    // EOF without closing\r\n    if (contentStart < this.len) {\r\n      this.emit(TokenType.Text, contentStart, this.len);\r\n    }\r\n    this.pos = this.len;\r\n    this.logError(ErrorReason.UnexpectedEof, this.len);\r\n    return true;\r\n  }\r\n\r\n  private tryScanDecl(): boolean {\r\n    if (this.pos + 5 > this.len) return false;\r\n    if (this.src[this.pos] !== \"<\" || this.src[this.pos + 1] !== \"?\") {\r\n      return false;\r\n    }\r\n\r\n    const xmlMatch = this.hasAsciiWordAt(this.pos + 2, \"xml\");\r\n\r\n    if (!xmlMatch) return false;\r\n\r\n    // Make sure it's not a longer name like \"xmlfoo\"\r\n    if (this.pos + 5 < this.len) {\r\n      const next = this.src[this.pos + 5];\r\n      const cc = next.charCodeAt(0);\r\n      if (isAlnum(cc) || next === \"_\" || next === \"-\" || next === \":\") {\r\n        return false;\r\n      }\r\n    }\r\n\r\n    const start = this.pos;\r\n    this.emit(TokenType.DeclStart, start, start + 5);\r\n    this.pos += 5;\r\n\r\n    this.inXmlDeclaration = true;\r\n    this.state = State.BeforeAttrName;\r\n    return true;\r\n  }\r\n\r\n  private phpTagStartLength(pos: number): number {\r\n    if (pos + 2 > this.len || this.src[pos] !== \"<\" || this.src[pos + 1] !== \"?\") {\r\n      return 0;\r\n    }\r\n\r\n    // Check for <?php\r\n    if (pos + 5 <= this.len) {\r\n      const matchesPhp = this.hasAsciiWordAt(pos + 2, \"php\");\r\n\r\n      if (matchesPhp) {\r\n        if (pos + 5 < this.len) {\r\n          const next = this.src[pos + 5];\r\n          const cc = next.charCodeAt(0);\r\n          if (isAlnum(cc) || next === \"_\") {\r\n            return 0; // e.g., <?phps\r\n          }\r\n        }\r\n        return 5;\r\n      }\r\n    }\r\n\r\n    // Check for <?=\r\n    if (pos + 3 <= this.len && this.src[pos + 2] === \"=\") {\r\n      return 3;\r\n    }\r\n\r\n    // Just <? - not supported\r\n    return 0;\r\n  }\r\n\r\n  private isPhpTagEndAt(pos: number): boolean {\r\n    return pos + 2 <= this.len && this.src[pos] === \"?\" && this.src[pos + 1] === \">\";\r\n  }\r\n\r\n  private tryScanPhpTag(): boolean {\r\n    if (this.pos + 1 >= this.len || this.src[this.pos] !== \"<\" || this.src[this.pos + 1] !== \"?\") {\r\n      return false;\r\n    }\r\n\r\n    const start = this.pos;\r\n    this.pos += 2; // Skip <?\r\n\r\n    // Check for <?php\r\n    if (this.pos + 3 <= this.len) {\r\n      const matchesPhp = this.hasAsciiWordAt(this.pos, \"php\");\r\n\r\n      if (matchesPhp) {\r\n        if (this.pos + 3 < this.len) {\r\n          const next = this.src[this.pos + 3];\r\n          const cc = next.charCodeAt(0);\r\n          if (isAlnum(cc) || next === \"_\") {\r\n            this.pos = start;\r\n            return false;\r\n          }\r\n        }\r\n        this.pos += 3;\r\n      } else if (this.pos < this.len && this.src[this.pos] === \"=\") {\r\n        this.pos++; // <?=\r\n      } else {\r\n        this.pos = start;\r\n        return false;\r\n      }\r\n    } else if (this.pos < this.len && this.src[this.pos] === \"=\") {\r\n      this.pos++; // <?=\r\n    } else {\r\n      this.pos = start;\r\n      return false;\r\n    }\r\n\r\n    this.emit(TokenType.PhpTagStart, start, this.pos);\r\n    this.scanPhpContent();\r\n    return true;\r\n  }\r\n\r\n  private scanPhpContent(): void {\r\n    const start = this.pos;\r\n\r\n    while (true) {\r\n      if (this.pos >= this.len) {\r\n        if (this.pos > start) {\r\n          this.emit(TokenType.PhpContent, start, this.pos);\r\n        }\r\n        return;\r\n      }\r\n\r\n      // Check for ?> closing tag\r\n      if (this.pos + 1 < this.len && this.src[this.pos] === \"?\" && this.src[this.pos + 1] === \">\") {\r\n        if (this.pos > start) {\r\n          this.emit(TokenType.PhpContent, start, this.pos);\r\n        }\r\n        this.emit(TokenType.PhpTagEnd, this.pos, this.pos + 2);\r\n        this.pos += 2;\r\n        return;\r\n      }\r\n\r\n      const byte = this.src[this.pos];\r\n\r\n      if (byte === '\"' || byte === \"'\") {\r\n        this.pos++;\r\n        this.skipQuotedStringPrim(byte);\r\n      } else if (byte === \"/\" && this.pos + 1 < this.len) {\r\n        const next = this.src[this.pos + 1];\r\n        if (next === \"/\") {\r\n          this.pos += 2;\r\n          // Skip line comment stopping at ?>\r\n          while (this.pos < this.len) {\r\n            const ch = this.src[this.pos];\r\n            if (ch === \"\\n\" || ch === \"\\r\") {\r\n              this.pos++;\r\n              break;\r\n            }\r\n            if (\r\n              this.pos + 2 <= this.len &&\r\n              this.src[this.pos] === \"?\" &&\r\n              this.src[this.pos + 1] === \">\"\r\n            ) {\r\n              break; // Stop before ?>\r\n            }\r\n            this.pos++;\r\n          }\r\n        } else if (next === \"*\") {\r\n          this.pos += 2;\r\n          this.skipBlockCommentPrim();\r\n        } else {\r\n          this.pos++;\r\n        }\r\n      } else if (byte === \"#\") {\r\n        this.pos++;\r\n        // Skip line comment stopping at ?>\r\n        while (this.pos < this.len) {\r\n          const ch = this.src[this.pos];\r\n          if (ch === \"\\n\" || ch === \"\\r\") {\r\n            this.pos++;\r\n            break;\r\n          }\r\n          if (\r\n            this.pos + 2 <= this.len &&\r\n            this.src[this.pos] === \"?\" &&\r\n            this.src[this.pos + 1] === \">\"\r\n          ) {\r\n            break;\r\n          }\r\n          this.pos++;\r\n        }\r\n      } else if (\r\n        byte === \"<\" &&\r\n        this.pos + 2 < this.len &&\r\n        this.src[this.pos + 1] === \"<\" &&\r\n        this.src[this.pos + 2] === \"<\"\r\n      ) {\r\n        this.pos += 3;\r\n        this.skipHeredocPrim();\r\n      } else {\r\n        this.pos++;\r\n      }\r\n    }\r\n  }\r\n\r\n  private scanDoctype(): void {\r\n    this.emit(TokenType.DoctypeStart, this.pos, this.pos + 9);\r\n    this.pos += 9;\r\n\r\n    this.skipAndEmitWhitespace();\r\n\r\n    const contentStart = this.pos;\r\n    while (this.pos < this.len && this.src[this.pos] !== \">\") {\r\n      this.pos++;\r\n    }\r\n    if (contentStart < this.pos) {\r\n      this.emit(TokenType.Doctype, contentStart, this.pos);\r\n    }\r\n    if (this.pos < this.len && this.src[this.pos] === \">\") {\r\n      this.emit(TokenType.DoctypeEnd, this.pos, this.pos + 1);\r\n      this.pos++;\r\n    }\r\n  }\r\n\r\n  private scanTagOpen(): void {\r\n    const start = this.pos;\r\n    this.currentTagName = \"\";\r\n    this.currentTagStart = start;\r\n\r\n    this.emit(TokenType.LessThan, start, start + 1);\r\n    this.pos++;\r\n\r\n    if (this.pos < this.len && this.src[this.pos] === \"/\") {\r\n      this.emit(TokenType.Slash, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      this.isClosingTag = true;\r\n    } else {\r\n      this.isClosingTag = false;\r\n    }\r\n\r\n    this.state = State.TagName;\r\n  }\r\n\r\n  private checkRawtextMode(): State {\r\n    if (this.isClosingTag) return State.Data;\r\n    const tagNameLower = this.currentTagName.toLowerCase();\r\n    if (RAWTEXT_ELEMENTS.has(tagNameLower)) {\r\n      this.rawtextTagName = tagNameLower;\r\n      return State.RawText;\r\n    }\r\n    return State.Data;\r\n  }\r\n\r\n  private scanTagName(): void {\r\n    const start = this.pos;\r\n\r\n    if (this.continuedTagName && this.pos < this.len && isSpace(this.src.charCodeAt(this.pos))) {\r\n      this.continuedTagName = false;\r\n      this.state = State.BeforeAttrName;\r\n      return;\r\n    }\r\n\r\n    if (!this.continuedTagName) {\r\n      this.skipWhitespace();\r\n    }\r\n    this.continuedTagName = false;\r\n\r\n    // Empty/malformed tag like <> or </>\r\n    if (this.pos >= this.len || this.src[this.pos] === \">\" || this.src[this.pos] === \"/\") {\r\n      if (start < this.pos) {\r\n        this.emit(TokenType.Whitespace, start, this.pos);\r\n      }\r\n\r\n      if (this.pos < this.len) {\r\n        if (this.src[this.pos] === \">\") {\r\n          this.emit(TokenType.GreaterThan, this.pos, this.pos + 1);\r\n          this.pos++;\r\n          this.state = this.checkRawtextMode();\r\n        } else if (this.src[this.pos] === \"/\") {\r\n          this.emit(TokenType.Slash, this.pos, this.pos + 1);\r\n          this.pos++;\r\n          if (this.pos < this.len && this.src[this.pos] === \">\") {\r\n            this.emit(TokenType.GreaterThan, this.pos, this.pos + 1);\r\n            this.pos++;\r\n            this.state = State.Data;\r\n          } else {\r\n            this.state = State.BeforeAttrName;\r\n          }\r\n        }\r\n      } else {\r\n        this.emit(TokenType.SyntheticClose, this.pos, this.pos);\r\n        this.state = State.Data;\r\n      }\r\n      return;\r\n    }\r\n\r\n    const nameStart = this.pos;\r\n\r\n    while (this.pos < this.len) {\r\n      const ch = this.src[this.pos];\r\n\r\n      // Blade echo in tag name: <{{ $element }}>\r\n      if (ch === \"{\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n        if (this.pos > nameStart) {\r\n          this.emit(TokenType.TagName, nameStart, this.pos);\r\n        }\r\n        if (this.peekAhead(1) === \"{\") {\r\n          if (this.peekAhead(2) === \"-\" && this.peekAhead(3) === \"-\") {\r\n            this.returnState = State.TagName;\r\n            this.continuedTagName = true;\r\n            this.beginBladeCommentCapture(State.TagName, this.currentTagStart);\r\n            this.scanBladeCommentStart();\r\n            this.scanBladeCommentContent();\r\n            return;\r\n          }\r\n          this.returnState = State.TagName;\r\n          this.continuedTagName = true;\r\n          this.scanEcho();\r\n          return;\r\n        } else if (this.peekAhead(1) === \"!\" && this.peekAhead(2) === \"!\") {\r\n          this.returnState = State.TagName;\r\n          this.continuedTagName = true;\r\n          this.scanRawEcho();\r\n          return;\r\n        }\r\n        break;\r\n      }\r\n\r\n      const cc = ch.charCodeAt(0);\r\n      if (\r\n        isAlnum(cc) ||\r\n        ch === \"-\" ||\r\n        ch === \":\" ||\r\n        ch === \"_\" ||\r\n        ch === \"@\" ||\r\n        ch === \".\" ||\r\n        ch === \"[\" ||\r\n        ch === \"]\" ||\r\n        ch === \"$\"\r\n      ) {\r\n        this.pos++;\r\n      } else {\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (nameStart < this.pos) {\r\n      const tagNamePart = this.src.slice(nameStart, this.pos);\r\n      this.currentTagName += tagNamePart;\r\n      this.emit(TokenType.TagName, nameStart, this.pos);\r\n    }\r\n\r\n    if (this.pos >= this.len) {\r\n      this.emit(TokenType.SyntheticClose, this.pos, this.pos);\r\n      this.state = State.Data;\r\n      return;\r\n    }\r\n\r\n    const ch = this.src[this.pos];\r\n\r\n    if (ch === \"<\") {\r\n      // Check for PHP tag first\r\n      if (this.pos + 1 < this.len && this.src[this.pos + 1] === \"?\") {\r\n        if (this.tryScanPhpTag()) {\r\n          this.state = State.TagName;\r\n          this.continuedTagName = true;\r\n          return;\r\n        }\r\n      }\r\n\r\n      // Try TSX generic type parameter\r\n      if (this.tryScanTsxGenericType()) {\r\n        this.state = State.BeforeAttrName;\r\n        return;\r\n      }\r\n\r\n      // New tag starting before current is closed\r\n      this.emit(TokenType.SyntheticClose, this.pos, this.pos);\r\n      this.scanTagOpen();\r\n    } else if (ch === \">\") {\r\n      this.emit(TokenType.GreaterThan, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      this.state = this.checkRawtextMode();\r\n    } else if (ch === \"/\") {\r\n      this.emit(TokenType.Slash, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      this.skipWhitespace();\r\n      if (this.pos < this.len && this.src[this.pos] === \">\") {\r\n        this.emit(TokenType.GreaterThan, this.pos, this.pos + 1);\r\n        this.pos++;\r\n        this.state = State.Data;\r\n      } else {\r\n        this.state = State.BeforeAttrName;\r\n      }\r\n    } else if (isSpace(ch.charCodeAt(0))) {\r\n      this.state = State.BeforeAttrName;\r\n    } else {\r\n      this.state = State.BeforeAttrName;\r\n    }\r\n  }\r\n\r\n  private scanBeforeAttrName(): void {\r\n    if (this.scanAttributePhpDirectiveContent()) return;\r\n\r\n    const start = this.pos;\r\n\r\n    while (this.pos < this.len && isSpace(this.src.charCodeAt(this.pos))) {\r\n      this.pos++;\r\n    }\r\n\r\n    // Closing tags: only allow > or / after whitespace\r\n    if (this.isClosingTag) {\r\n      if (this.pos >= this.len) {\r\n        this.emit(TokenType.SyntheticClose, start, start);\r\n        this.pos = start;\r\n        this.state = State.Data;\r\n        return;\r\n      }\r\n      const ch = this.src[this.pos];\r\n      if (ch !== \">\" && ch !== \"/\") {\r\n        this.emit(TokenType.SyntheticClose, start, start);\r\n        this.pos = start;\r\n        this.state = State.Data;\r\n        return;\r\n      }\r\n    }\r\n\r\n    if (start < this.pos) {\r\n      this.emit(TokenType.Whitespace, start, this.pos);\r\n    }\r\n\r\n    if (this.pos >= this.len) {\r\n      this.emit(TokenType.SyntheticClose, this.pos, this.pos);\r\n      this.state = State.Data;\r\n      return;\r\n    }\r\n\r\n    const ch = this.src[this.pos];\r\n\r\n    // Blade directive as attribute: @if($condition)\r\n    if (ch === \"@\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n      let tempPos = this.pos + 1;\r\n      const nameStart = tempPos;\r\n      while (tempPos < this.len) {\r\n        const b = this.src.charCodeAt(tempPos);\r\n        if (isAlnum(b) || b === 95) {\r\n          tempPos++;\r\n        } else {\r\n          break;\r\n        }\r\n      }\r\n      if (tempPos > nameStart) {\r\n        const nameLower = this.src.slice(nameStart, tempPos).toLowerCase();\r\n        if (this.isAtAttributeCandidate(nameLower, tempPos)) {\r\n          // Frontend shorthand like @click / @mouseenter stays as an\r\n          // attribute name in tag context, even in accept-all mode.\r\n        } else if (this._directives.acceptsAll()) {\r\n          this.returnState = State.BeforeAttrName;\r\n          this.scanDirective();\r\n          return;\r\n        } else if (this._directives.isDirectiveLower(nameLower)) {\r\n          this.returnState = State.BeforeAttrName;\r\n          this.scanDirective();\r\n          return;\r\n        }\r\n      }\r\n      // Not a known directive, fall through to attr name\r\n    }\r\n\r\n    // PHP tag in attribute context\r\n    if (ch === \"<\" && this.pos + 1 < this.len && this.src[this.pos + 1] === \"?\") {\r\n      if (this.tryScanPhpTag()) {\r\n        this.state = State.BeforeAttrName;\r\n        return;\r\n      }\r\n    }\r\n\r\n    // HTML comment in attribute context\r\n    if (\r\n      ch === \"<\" &&\r\n      this.pos + 3 < this.len &&\r\n      this.src[this.pos + 1] === \"!\" &&\r\n      this.src[this.pos + 2] === \"-\" &&\r\n      this.src[this.pos + 3] === \"-\"\r\n    ) {\r\n      this.beginHtmlCommentCapture(State.BeforeAttrName, this.currentTagStart);\r\n      this.emit(TokenType.SyntheticClose, this.pos, this.pos);\r\n      this.state = State.Data;\r\n      return;\r\n    }\r\n\r\n    // TSX generic type parameter: <User> or <{ id: number }>\r\n    if (ch === \"<\") {\r\n      if (this.tryScanTsxGenericType()) {\r\n        return;\r\n      }\r\n\r\n      // New tag starting (malformed sequence)\r\n      this.emit(TokenType.SyntheticClose, this.pos, this.pos);\r\n      this.emit(TokenType.LessThan, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      this.state = State.TagName;\r\n      return;\r\n    }\r\n\r\n    // JSX shorthand attribute: {enabled} or {...props}\r\n    if (ch === \"{\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n      if (this.tryScanJsxShorthandAttribute()) {\r\n        return;\r\n      }\r\n    }\r\n\r\n    // Blade echo as attribute: {{ $attributes }}\r\n    if (ch === \"{\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n      if (this.peekAhead(1) === \"{\") {\r\n        if (this.peekAhead(2) === \"-\" && this.peekAhead(3) === \"-\") {\r\n          this.returnState = State.BeforeAttrName;\r\n          this.beginBladeCommentCapture(State.BeforeAttrName, this.currentTagStart);\r\n          this.scanBladeCommentStart();\r\n          this.scanBladeCommentContent();\r\n          return;\r\n        }\r\n        this.returnState = State.BeforeAttrName;\r\n        this.scanEcho();\r\n        // Check if echo is followed by attribute name continuation\r\n        if (this.pos < this.len) {\r\n          const nextCh = this.src[this.pos];\r\n          if (\r\n            nextCh !== \" \" &&\r\n            nextCh !== \"\\t\" &&\r\n            nextCh !== \"\\n\" &&\r\n            nextCh !== \"\\r\" &&\r\n            nextCh !== \">\" &&\r\n            nextCh !== \"/\" &&\r\n            nextCh !== \"=\" &&\r\n            nextCh !== \"<\"\r\n          ) {\r\n            this.state = State.AttrName;\r\n            return;\r\n          }\r\n        }\r\n        return;\r\n      } else if (this.peekAhead(1) === \"!\" && this.peekAhead(2) === \"!\") {\r\n        this.returnState = State.BeforeAttrName;\r\n        this.scanRawEcho();\r\n        return;\r\n      }\r\n    }\r\n\r\n    // XML declaration ending\r\n    if (\r\n      this.inXmlDeclaration &&\r\n      ch === \"?\" &&\r\n      this.pos + 1 < this.len &&\r\n      this.src[this.pos + 1] === \">\"\r\n    ) {\r\n      this.emit(TokenType.DeclEnd, this.pos, this.pos + 2);\r\n      this.pos += 2;\r\n      this.inXmlDeclaration = false;\r\n      this.state = State.Data;\r\n      return;\r\n    }\r\n\r\n    if (ch === \">\") {\r\n      this.emit(TokenType.GreaterThan, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      this.state = this.checkRawtextMode();\r\n    } else if (ch === \"/\") {\r\n      this.emit(TokenType.Slash, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      const wsStart = this.pos;\r\n      while (this.pos < this.len && isSpace(this.src.charCodeAt(this.pos))) {\r\n        this.pos++;\r\n      }\r\n      if (this.pos < this.len && this.src[this.pos] === \">\") {\r\n        this.emit(TokenType.GreaterThan, this.pos, this.pos + 1);\r\n        this.pos++;\r\n      } else if (this.pos >= this.len) {\r\n        this.emit(TokenType.SyntheticClose, this.pos, this.pos);\r\n      } else {\r\n        this.emit(TokenType.SyntheticClose, wsStart, wsStart);\r\n        this.pos = wsStart;\r\n      }\r\n      this.state = State.Data;\r\n    } else {\r\n      this.state = State.AttrName;\r\n    }\r\n  }\r\n\r\n  private scanAttrName(): void {\r\n    if (this.scanAttributePhpDirectiveContent()) return;\r\n\r\n    const start = this.pos;\r\n\r\n    // Detect special Blade attribute prefixes\r\n    let tokenType: TokenType = TokenType.AttributeName;\r\n    if (this.pos < this.len && this.src[this.pos] === \":\") {\r\n      if (this.pos + 1 < this.len && this.src[this.pos + 1] === \":\") {\r\n        tokenType = TokenType.EscapedAttribute;\r\n      } else if (this.pos + 1 < this.len && this.src[this.pos + 1] === \"$\") {\r\n        tokenType = TokenType.ShorthandAttribute;\r\n      } else {\r\n        tokenType = TokenType.BoundAttribute;\r\n      }\r\n    }\r\n\r\n    while (true) {\r\n      if (this.pos >= this.len) break;\r\n      const byte = this.src[this.pos];\r\n\r\n      // Blade echo in attr name: class-{{ $thing }}\r\n      if (byte === \"{\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n        if (this.peekAhead(1) === \"{\") {\r\n          if (this.pos > start) {\r\n            this.emit(tokenType, start, this.pos);\r\n          }\r\n          if (this.peekAhead(2) === \"-\" && this.peekAhead(3) === \"-\") {\r\n            const savedState = this.state;\r\n            this.returnState = State.Data;\r\n            this.beginBladeCommentCapture(State.AttrName, this.currentTagStart);\r\n            this.scanBladeCommentStart();\r\n            this.scanBladeCommentContent();\r\n            this.state = savedState;\r\n            this.scanAttrName();\r\n            return;\r\n          }\r\n          const savedState = this.state;\r\n          this.returnState = State.Data;\r\n          this.scanEcho();\r\n          this.state = savedState;\r\n          this.scanAttrName();\r\n          return;\r\n        } else if (this.peekAhead(1) === \"!\" && this.peekAhead(2) === \"!\") {\r\n          if (this.pos > start) {\r\n            this.emit(tokenType, start, this.pos);\r\n          }\r\n          const savedState = this.state;\r\n          this.returnState = State.Data;\r\n          this.scanRawEcho();\r\n          this.state = savedState;\r\n          this.scanAttrName();\r\n          return;\r\n        }\r\n        // Not a Blade echo. Let the normal attr-name flush below emit the\r\n        // prefix once; emitting before this point duplicates recovery text.\r\n        break;\r\n      }\r\n\r\n      // PHP tag in attr name\r\n      if (byte === \"<\" && this.pos + 1 < this.len && this.src[this.pos + 1] === \"?\") {\r\n        if (this.pos > start) {\r\n          this.emit(tokenType, start, this.pos);\r\n        }\r\n        if (this.tryScanPhpTag()) {\r\n          this.scanAttrName();\r\n          return;\r\n        }\r\n        break;\r\n      }\r\n\r\n      // Blade directive in attr name\r\n      if (byte === \"@\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n        let tempPos = this.pos + 1;\r\n        const nameStart = tempPos;\r\n        while (tempPos < this.len) {\r\n          const b = this.src.charCodeAt(tempPos);\r\n          if (isAlnum(b) || b === 95) tempPos++;\r\n          else break;\r\n        }\r\n\r\n        let isKnownDirective = false;\r\n        if (tempPos > nameStart) {\r\n          const nameLower = this.src.slice(nameStart, tempPos).toLowerCase();\r\n          if (this.isAtAttributeCandidate(nameLower, tempPos)) {\r\n            isKnownDirective = false;\r\n          } else if (this._directives.acceptsAll()) {\r\n            isKnownDirective = true;\r\n          } else {\r\n            isKnownDirective = this._directives.isDirectiveLower(nameLower);\r\n          }\r\n        }\r\n\r\n        if (isKnownDirective) {\r\n          if (this.pos > start) {\r\n            this.emit(tokenType, start, this.pos);\r\n          }\r\n          const savedState = this.state;\r\n          this.returnState = State.Data;\r\n          this.scanDirective();\r\n          this.state = savedState;\r\n          this.scanAttrName();\r\n          return;\r\n        }\r\n\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      const cc = byte.charCodeAt(0);\r\n      if (\r\n        isAlnum(cc) ||\r\n        byte === \"-\" ||\r\n        byte === \":\" ||\r\n        byte === \"_\" ||\r\n        byte === \"$\" ||\r\n        byte === \"@\" ||\r\n        byte === \".\" ||\r\n        byte === \"[\" ||\r\n        byte === \"]\" ||\r\n        byte === \"(\" ||\r\n        byte === \")\" ||\r\n        byte === \"*\" ||\r\n        byte === \"#\"\r\n      ) {\r\n        this.pos++;\r\n      } else {\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (start < this.pos) {\r\n      this.emit(tokenType, start, this.pos);\r\n    }\r\n\r\n    if (this.pos >= this.len) {\r\n      this.state = State.Data;\r\n      return;\r\n    }\r\n\r\n    const char = this.src[this.pos];\r\n\r\n    if (char === \"=\") {\r\n      this.emit(TokenType.Equals, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      this.state = State.BeforeAttrValue;\r\n    } else if (\r\n      this.inXmlDeclaration &&\r\n      char === \"?\" &&\r\n      this.pos + 1 < this.len &&\r\n      this.src[this.pos + 1] === \">\"\r\n    ) {\r\n      this.emit(TokenType.DeclEnd, this.pos, this.pos + 2);\r\n      this.pos += 2;\r\n      this.inXmlDeclaration = false;\r\n      this.state = State.Data;\r\n    } else if (char === \">\") {\r\n      this.emit(TokenType.GreaterThan, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      this.state = State.Data;\r\n    } else if (char === \"/\") {\r\n      this.emit(TokenType.Slash, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      if (this.pos < this.len && this.src[this.pos] === \">\") {\r\n        this.emit(TokenType.GreaterThan, this.pos, this.pos + 1);\r\n        this.pos++;\r\n        this.state = State.Data;\r\n      } else {\r\n        this.state = State.BeforeAttrName;\r\n      }\r\n    } else if (isSpace(char.charCodeAt(0))) {\r\n      this.state = State.AfterAttrName;\r\n    } else if (char === \"<\") {\r\n      this.state = State.BeforeAttrName;\r\n    } else {\r\n      this.emit(TokenType.Text, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      this.state = State.BeforeAttrName;\r\n    }\r\n  }\r\n\r\n  private scanAfterAttrName(): void {\r\n    if (this.scanAttributePhpDirectiveContent()) return;\r\n\r\n    this.skipAndEmitWhitespace();\r\n\r\n    if (this.pos >= this.len) {\r\n      this.state = State.Data;\r\n      return;\r\n    }\r\n\r\n    const char = this.src[this.pos];\r\n\r\n    if (char === \"=\") {\r\n      this.emit(TokenType.Equals, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      this.state = State.BeforeAttrValue;\r\n    } else if (\r\n      this.inXmlDeclaration &&\r\n      char === \"?\" &&\r\n      this.pos + 1 < this.len &&\r\n      this.src[this.pos + 1] === \">\"\r\n    ) {\r\n      this.emit(TokenType.DeclEnd, this.pos, this.pos + 2);\r\n      this.pos += 2;\r\n      this.inXmlDeclaration = false;\r\n      this.state = State.Data;\r\n    } else if (char === \">\") {\r\n      this.emit(TokenType.GreaterThan, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      this.state = State.Data;\r\n    } else if (char === \"/\") {\r\n      this.emit(TokenType.Slash, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      if (this.pos < this.len && this.src[this.pos] === \">\") {\r\n        this.emit(TokenType.GreaterThan, this.pos, this.pos + 1);\r\n        this.pos++;\r\n        this.state = State.Data;\r\n      } else {\r\n        this.state = State.BeforeAttrName;\r\n      }\r\n    } else {\r\n      this.state = State.BeforeAttrName;\r\n    }\r\n  }\r\n\r\n  private scanBeforeAttrValue(): void {\r\n    if (this.scanAttributePhpDirectiveContent()) return;\r\n\r\n    this.skipAndEmitWhitespace();\r\n\r\n    if (this.pos >= this.len) {\r\n      this.state = State.Data;\r\n      return;\r\n    }\r\n\r\n    const char = this.src[this.pos];\r\n\r\n    // Prioritize Blade echoes over JSX-style attributes\r\n    if (char === \"{\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n      if (this.peekAhead(1) === \"{\") {\r\n        // {{ or {{{\r\n        this.returnState = State.BeforeAttrName;\r\n        this.scanEcho();\r\n        this.state = State.BeforeAttrName;\r\n        return;\r\n      } else if (this.peekAhead(1) === \"!\" && this.peekAhead(2) === \"!\") {\r\n        // {!!\r\n        this.returnState = State.BeforeAttrName;\r\n        this.scanRawEcho();\r\n        this.state = State.BeforeAttrName;\r\n        return;\r\n      }\r\n\r\n      // Not a Blade echo, try JSX-style attribute value\r\n      if (this.scanJsxAttributeValue()) {\r\n        this.state = State.BeforeAttrName;\r\n        return;\r\n      }\r\n\r\n      // Not JSX, treat as unquoted value\r\n      this.state = State.AttrValueUnquoted;\r\n      return;\r\n    }\r\n\r\n    // Check for ({expression}) pattern\r\n    if (char === \"(\" && this.pos + 1 < this.len && this.src[this.pos + 1] === \"{\") {\r\n      if (this.scanJsxAttributeValue()) {\r\n        this.state = State.BeforeAttrName;\r\n        return;\r\n      }\r\n\r\n      this.state = State.AttrValueUnquoted;\r\n      return;\r\n    }\r\n\r\n    if (char === '\"' || char === \"'\") {\r\n      this.state = State.AttrValueQuoted;\r\n    } else if (\r\n      this.inXmlDeclaration &&\r\n      char === \"?\" &&\r\n      this.pos + 1 < this.len &&\r\n      this.src[this.pos + 1] === \">\"\r\n    ) {\r\n      this.emit(TokenType.DeclEnd, this.pos, this.pos + 2);\r\n      this.pos += 2;\r\n      this.inXmlDeclaration = false;\r\n      this.state = State.Data;\r\n    } else if (char === \">\") {\r\n      this.emit(TokenType.GreaterThan, this.pos, this.pos + 1);\r\n      this.pos++;\r\n      this.state = State.Data;\r\n    } else {\r\n      this.state = State.AttrValueUnquoted;\r\n    }\r\n  }\r\n\r\n  private scanAttrValueQuoted(): void {\r\n    if (this.scanAttributePhpDirectiveContent()) return;\r\n\r\n    const quote = this.src[this.pos];\r\n\r\n    this.emit(TokenType.Quote, this.pos, this.pos + 1);\r\n    this.pos++;\r\n\r\n    let valueStart = this.pos;\r\n\r\n    while (true) {\r\n      if (this.pos >= this.len) {\r\n        if (this.pos > valueStart) {\r\n          this.emit(TokenType.AttributeValue, valueStart, this.pos);\r\n        }\r\n        this.state = State.BeforeAttrName;\r\n        return;\r\n      }\r\n\r\n      // Find the next interesting character\r\n      const quotePos = this.src.indexOf(quote, this.pos);\r\n      const bracePos = this.src.indexOf(\"{\", this.pos);\r\n      const atPos = this.src.indexOf(\"@\", this.pos);\r\n\r\n      let nextPos = this.len;\r\n      if (quotePos !== -1 && quotePos < nextPos) nextPos = quotePos;\r\n      if (bracePos !== -1 && bracePos < nextPos) nextPos = bracePos;\r\n      if (atPos !== -1 && atPos < nextPos) nextPos = atPos;\r\n\r\n      if (nextPos === this.len) {\r\n        this.pos = this.len;\r\n        if (this.pos > valueStart) {\r\n          this.emit(TokenType.AttributeValue, valueStart, this.pos);\r\n        }\r\n        this.state = State.BeforeAttrName;\r\n        return;\r\n      }\r\n\r\n      this.pos = nextPos;\r\n      const byte = this.src[this.pos];\r\n\r\n      if (byte === quote) {\r\n        // Check if escaped\r\n        let backslashCount = 0;\r\n        let checkPos = this.pos - 1;\r\n        while (checkPos >= valueStart && this.src[checkPos] === \"\\\\\") {\r\n          backslashCount++;\r\n          checkPos--;\r\n        }\r\n        if (backslashCount % 2 === 1) {\r\n          this.pos++;\r\n          continue;\r\n        }\r\n\r\n        if (this.pos > valueStart) {\r\n          this.emit(TokenType.AttributeValue, valueStart, this.pos);\r\n        }\r\n        this.emit(TokenType.Quote, this.pos, this.pos + 1);\r\n        this.pos++;\r\n        this.state = State.BeforeAttrName;\r\n        return;\r\n      } else if (byte === \"{\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n        const savedPos = this.pos;\r\n\r\n        if (this.peekAhead(1) === \"{\") {\r\n          if (this.peekAhead(2) === \"-\" && this.peekAhead(3) === \"-\") {\r\n            if (savedPos > valueStart) {\r\n              this.emit(TokenType.AttributeValue, valueStart, savedPos);\r\n            }\r\n            this.returnState = State.AttrValueQuoted;\r\n            this.beginBladeCommentCapture(State.AttrValueQuoted, null);\r\n            this.scanBladeCommentStart();\r\n            this.scanBladeCommentContent();\r\n            valueStart = this.pos;\r\n            continue;\r\n          }\r\n          if (savedPos > valueStart) {\r\n            this.emit(TokenType.AttributeValue, valueStart, savedPos);\r\n          }\r\n          this.returnState = State.AttrValueQuoted;\r\n          this.scanEcho();\r\n          valueStart = this.pos;\r\n          continue;\r\n        } else if (this.peekAhead(1) === \"!\" && this.peekAhead(2) === \"!\") {\r\n          if (savedPos > valueStart) {\r\n            this.emit(TokenType.AttributeValue, valueStart, savedPos);\r\n          }\r\n          this.returnState = State.AttrValueQuoted;\r\n          this.scanRawEcho();\r\n          valueStart = this.pos;\r\n          continue;\r\n        }\r\n        this.pos = savedPos + 1;\r\n      } else if (byte === \"@\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n        const canStart = this.pos === valueStart || !isAlnum(this.src.charCodeAt(this.pos - 1));\r\n\r\n        if (canStart) {\r\n          const savedPos = this.pos;\r\n          if (savedPos > valueStart) {\r\n            this.emit(TokenType.AttributeValue, valueStart, savedPos);\r\n          }\r\n          this.returnState = State.AttrValueQuoted;\r\n          this.scanDirective();\r\n          valueStart = this.pos;\r\n          continue;\r\n        }\r\n        this.pos++;\r\n      } else {\r\n        this.pos++;\r\n      }\r\n    }\r\n  }\r\n\r\n  private scanAttrValueUnquoted(): void {\r\n    if (this.scanAttributePhpDirectiveContent()) return;\r\n\r\n    let valueStart = this.pos;\r\n\r\n    while (true) {\r\n      if (this.pos >= this.len) break;\r\n      const byte = this.src[this.pos];\r\n\r\n      // XML declaration ending\r\n      if (\r\n        this.inXmlDeclaration &&\r\n        byte === \"?\" &&\r\n        this.pos + 1 < this.len &&\r\n        this.src[this.pos + 1] === \">\"\r\n      ) {\r\n        break;\r\n      }\r\n\r\n      if (isSpace(byte.charCodeAt(0)) || byte === \">\") break;\r\n\r\n      // PHP tag in unquoted value\r\n      if (byte === \"<\" && this.pos + 1 < this.len && this.src[this.pos + 1] === \"?\") {\r\n        const savedPos = this.pos;\r\n        if (savedPos > valueStart) {\r\n          this.emit(TokenType.AttributeValue, valueStart, savedPos);\r\n        }\r\n        if (this.tryScanPhpTag()) {\r\n          valueStart = this.pos;\r\n          continue;\r\n        }\r\n        break;\r\n      }\r\n\r\n      // Blade echo in unquoted value\r\n      if (byte === \"{\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n        if (this.peekAhead(1) === \"{\") {\r\n          if (this.peekAhead(2) === \"-\" && this.peekAhead(3) === \"-\") {\r\n            if (this.pos > valueStart) {\r\n              this.emit(TokenType.AttributeValue, valueStart, this.pos);\r\n            }\r\n            this.returnState = State.AttrValueUnquoted;\r\n            this.beginBladeCommentCapture(State.AttrValueUnquoted, this.currentTagStart);\r\n            this.scanBladeCommentStart();\r\n            this.scanBladeCommentContent();\r\n            valueStart = this.pos;\r\n            continue;\r\n          }\r\n          if (this.pos > valueStart) {\r\n            this.emit(TokenType.AttributeValue, valueStart, this.pos);\r\n          }\r\n          this.returnState = State.AttrValueUnquoted;\r\n          this.scanEcho();\r\n          valueStart = this.pos;\r\n          continue;\r\n        } else if (this.peekAhead(1) === \"!\" && this.peekAhead(2) === \"!\") {\r\n          if (this.pos > valueStart) {\r\n            this.emit(TokenType.AttributeValue, valueStart, this.pos);\r\n          }\r\n          this.returnState = State.AttrValueUnquoted;\r\n          this.scanRawEcho();\r\n          valueStart = this.pos;\r\n          continue;\r\n        }\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      // Blade directive in unquoted value\r\n      if (byte === \"@\" && !this.verbatim && !this.phpBlock && !this.phpTag) {\r\n        const canStart = this.pos === valueStart || !isAlnum(this.src.charCodeAt(this.pos - 1));\r\n        if (canStart) {\r\n          if (this.pos > valueStart) {\r\n            this.emit(TokenType.AttributeValue, valueStart, this.pos);\r\n          }\r\n          this.returnState = State.AttrValueUnquoted;\r\n          this.scanDirective();\r\n          valueStart = this.pos;\r\n          continue;\r\n        }\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      this.pos++;\r\n    }\r\n\r\n    if (valueStart < this.pos) {\r\n      this.emit(TokenType.AttributeValue, valueStart, this.pos);\r\n    }\r\n    this.state = State.BeforeAttrName;\r\n  }\r\n\r\n  private scanDirective(): void {\r\n    const start = this.pos;\r\n    this.pos++; // skip @\r\n\r\n    const nameStart = this.pos;\r\n    let pos = nameStart;\r\n    while (pos < this.len) {\r\n      const cc = this.src.charCodeAt(pos);\r\n      if (isAlnum(cc) || cc === 95) {\r\n        pos++;\r\n      } else {\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (pos === nameStart) {\r\n      this.emit(TokenType.Text, start, start + 1);\r\n      this.state = this.returnState;\r\n      this.returnState = State.Data;\r\n      return;\r\n    }\r\n\r\n    const nameLower = this.src.slice(nameStart, pos).toLowerCase();\r\n\r\n    const isRawBlockDirective =\r\n      this.verbatimStartDirectives.has(nameLower) || this.verbatimEndDirectives.has(nameLower);\r\n\r\n    if (!isRawBlockDirective && !this._directives.isDirectiveLower(nameLower)) {\r\n      // Not a known directive, emit everything as text\r\n      this.pos = pos;\r\n      this.emit(TokenType.Text, start, pos);\r\n      this.state = this.returnState;\r\n      this.returnState = State.Data;\r\n      return;\r\n    }\r\n\r\n    // Skip whitespace before potential args\r\n    let argPos = pos;\r\n    while (argPos < this.len && isSpace(this.src.charCodeAt(argPos))) {\r\n      argPos++;\r\n    }\r\n    const hasArgs = argPos < this.len && this.src[argPos] === \"(\";\r\n\r\n    this.pos = pos;\r\n    const inTagAttributeState =\r\n      this.state === State.TagName ||\r\n      this.state === State.BeforeAttrName ||\r\n      this.state === State.AttrName ||\r\n      this.state === State.AfterAttrName ||\r\n      this.state === State.BeforeAttrValue ||\r\n      this.state === State.AttrValueQuoted ||\r\n      this.state === State.AttrValueUnquoted;\r\n\r\n    // @php without args -> PHP block mode\r\n    if (nameLower === \"php\" && !hasArgs && !inTagAttributeState) {\r\n      this.phpBlockStartTokenIndex = this.tokens.length;\r\n      this.emit(TokenType.PhpBlockStart, start, pos);\r\n      this.phpBlock = true;\r\n      this.state = this.returnState;\r\n      this.returnState = State.Data;\r\n      return;\r\n    }\r\n\r\n    if (nameLower === \"php\" && !hasArgs && inTagAttributeState) {\r\n      this.emit(TokenType.Directive, start, pos);\r\n      this.attrPhpDirectiveDepth++;\r\n      this.state = this.returnState;\r\n      this.returnState = State.Data;\r\n      return;\r\n    }\r\n\r\n    // @endphp\r\n    if (nameLower === \"endphp\" && !inTagAttributeState) {\r\n      this.emit(TokenType.PhpBlockEnd, start, pos);\r\n      if (this.phpBlock) {\r\n        this.phpBlock = false;\r\n        this.phpBlockStartTokenIndex = null;\r\n      }\r\n      this.state = this.returnState;\r\n      this.returnState = State.Data;\r\n      return;\r\n    }\r\n\r\n    if (nameLower === \"endphp\" && inTagAttributeState && this.attrPhpDirectiveDepth > 0) {\r\n      this.attrPhpDirectiveDepth--;\r\n    }\r\n\r\n    // @verbatim and plugin-provided raw blocks.\r\n    if (this.verbatimStartDirectives.has(nameLower)) {\r\n      this.verbatimStartTokenIndex = this.tokens.length;\r\n      this.emit(TokenType.VerbatimStart, start, pos);\r\n      this.verbatimReturnState = this.state;\r\n      this.verbatim = true;\r\n      this.state = State.Data;\r\n      this.returnState = State.Data;\r\n      return;\r\n    }\r\n\r\n    // @endverbatim and plugin-provided raw block terminators.\r\n    if (this.verbatimEndDirectives.has(nameLower)) {\r\n      this.emit(TokenType.VerbatimEnd, start, pos);\r\n      if (this.verbatimReturnState !== null) {\r\n        this.state = this.verbatimReturnState;\r\n        this.verbatimReturnState = null;\r\n      } else {\r\n        this.state = State.Data;\r\n      }\r\n      this.verbatim = false;\r\n      this.verbatimStartTokenIndex = null;\r\n      this.returnState = State.Data;\r\n      return;\r\n    }\r\n\r\n    this.emit(TokenType.Directive, start, pos);\r\n\r\n    if (hasArgs && argPos > pos) {\r\n      this.emit(TokenType.Whitespace, pos, argPos);\r\n      this.pos = argPos;\r\n    }\r\n\r\n    if (hasArgs) {\r\n      this.scanDirectiveArgs();\r\n    }\r\n\r\n    this.state = this.returnState;\r\n    this.returnState = State.Data;\r\n  }\r\n\r\n  private scanDirectiveArgs(): void {\r\n    const start = this.pos;\r\n    if (this.pos >= this.len || this.src[this.pos] !== \"(\") return;\r\n\r\n    this.pos++;\r\n    let depth = 1;\r\n    let firstRecoveryLineBreak = -1;\r\n\r\n    while (this.pos < this.len && depth > 0) {\r\n      const byte = this.src[this.pos];\r\n\r\n      if (byte === \"\\n\" && depth === 1 && firstRecoveryLineBreak < 0) {\r\n        firstRecoveryLineBreak = this.pos + 1;\r\n      }\r\n\r\n      if (byte === \"'\" || byte === '\"') {\r\n        this.pos++;\r\n        this.skipQuotedStringPrim(byte);\r\n      } else if (byte === \"`\") {\r\n        this.pos++;\r\n        this.skipBacktickStringPrim();\r\n      } else if (byte === \"<\" && this.peekAhead(1) === \"<\" && this.peekAhead(2) === \"<\") {\r\n        this.pos += 3;\r\n        this.skipHeredocPrim();\r\n      } else if (byte === \"/\" && this.peekAhead(1) === \"*\") {\r\n        this.pos += 2;\r\n        this.skipBlockCommentPrim();\r\n      } else if (byte === \"/\" && this.peekAhead(1) === \"/\") {\r\n        this.pos += 2;\r\n        this.skipLineCommentWithWarnings();\r\n      } else if (byte === \"#\") {\r\n        this.pos++;\r\n        this.skipLineCommentWithWarnings();\r\n      } else if (byte === \"(\") {\r\n        depth++;\r\n        this.pos++;\r\n      } else if (byte === \")\") {\r\n        depth--;\r\n        this.pos++;\r\n      } else {\r\n        this.pos++;\r\n      }\r\n    }\r\n\r\n    if (depth > 0) {\r\n      this.logError(ErrorReason.UnexpectedEof, this.pos);\r\n      // Recovery path for malformed directive args:\r\n      // emit a partial DirectiveArgs token, but stop at the first\r\n      // top-level line break to avoid consuming the entire document.\r\n      const fallbackEnd =\r\n        firstRecoveryLineBreak > 0 ? Math.min(firstRecoveryLineBreak, this.len) : this.pos;\r\n      this.pos = fallbackEnd;\r\n      this.emit(TokenType.DirectiveArgs, start, fallbackEnd);\r\n      return;\r\n    }\r\n\r\n    this.emit(TokenType.DirectiveArgs, start, this.pos);\r\n  }\r\n\r\n  private isVerbatimTerminatorAt(pos: number): boolean {\r\n    const name = this.readDirectiveNameAt(pos);\r\n    if (name === null) {\r\n      return false;\r\n    }\r\n\r\n    return this.verbatimEndDirectives.has(name);\r\n  }\r\n\r\n  private readDirectiveNameAt(pos: number): string | null {\r\n    if (pos >= this.len || this.src[pos] !== \"@\") return null;\r\n    const nameStart = pos + 1;\r\n    let end = nameStart;\r\n\r\n    while (end < this.len) {\r\n      const cc = this.src.charCodeAt(end);\r\n      if (isAlnum(cc) || cc === 95) {\r\n        end++;\r\n      } else {\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (end === nameStart) return null;\r\n\r\n    if (end < this.len) {\r\n      const next = this.src.charCodeAt(end);\r\n      if (isAlnum(next) || next === 95) {\r\n        return null;\r\n      }\r\n    }\r\n\r\n    return this.src.slice(nameStart, end).toLowerCase();\r\n  }\r\n\r\n  private isEndphpAt(pos: number): boolean {\r\n    if (pos + 7 > this.len || this.src[pos] !== \"@\") return false;\r\n    if (!this.hasAsciiWordAt(pos + 1, \"endphp\")) return false;\r\n    if (pos + 7 < this.len) {\r\n      const next = this.src.charCodeAt(pos + 7);\r\n      if (isAlnum(next) || next === 95) return false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  private scanEcho(): void {\r\n    if (this.peek() === \"{\" && this.peekAhead(1) === \"{\" && this.peekAhead(2) === \"{\") {\r\n      this.scanTripleEcho();\r\n      return;\r\n    }\r\n\r\n    const start = this.pos;\r\n    this.emit(TokenType.EchoStart, start, start + 2);\r\n    this.pos += 2;\r\n\r\n    const contentStart = this.pos;\r\n\r\n    while (this.pos < this.len) {\r\n      const byte = this.src[this.pos];\r\n\r\n      if (byte === \"'\") {\r\n        this.pos++;\r\n        this.skipQuotedStringPrim(\"'\");\r\n      } else if (byte === '\"') {\r\n        this.pos++;\r\n        this.skipQuotedStringPrim('\"');\r\n      } else if (byte === \"`\") {\r\n        this.pos++;\r\n        this.skipBacktickStringPrim();\r\n      } else if (byte === \"<\" && this.peekAhead(1) === \"<\" && this.peekAhead(2) === \"<\") {\r\n        this.pos += 3;\r\n        this.skipHeredocPrim();\r\n      } else if (byte === \"/\" && this.peekAhead(1) === \"*\") {\r\n        this.pos += 2;\r\n        this.skipBlockCommentPrim();\r\n      } else if (byte === \"/\" && this.peekAhead(1) === \"/\") {\r\n        this.pos += 2;\r\n        this.skipLineCommentWithWarnings();\r\n      } else if (byte === \"#\") {\r\n        this.pos++;\r\n        this.skipLineCommentWithWarnings();\r\n      } else if (byte === \"{\" || byte === \"@\" || byte === \"<\") {\r\n        // Construct collision detection\r\n        if (this.detectConstruct()) {\r\n          this.logError(ErrorReason.ConstructCollision, this.pos);\r\n          if (contentStart < this.pos) {\r\n            this.emit(TokenType.EchoContent, contentStart, this.pos);\r\n          }\r\n          this.state = this.returnState;\r\n          this.returnState = State.Data;\r\n          return;\r\n        }\r\n        this.pos++;\r\n      } else if (byte === \"}\" && this.peekAhead(1) === \"}\") {\r\n        if (contentStart < this.pos) {\r\n          this.emit(TokenType.EchoContent, contentStart, this.pos);\r\n        }\r\n        this.emit(TokenType.EchoEnd, this.pos, this.pos + 2);\r\n        this.pos += 2;\r\n        this.state = this.returnState;\r\n        this.returnState = State.Data;\r\n        return;\r\n      } else {\r\n        this.pos++;\r\n      }\r\n    }\r\n\r\n    // EOF\r\n    this.logError(ErrorReason.UnexpectedEof, this.len);\r\n    if (contentStart < this.pos) {\r\n      this.emit(TokenType.EchoContent, contentStart, this.pos);\r\n    }\r\n    this.pos = this.len;\r\n    this.state = this.returnState;\r\n    this.returnState = State.Data;\r\n  }\r\n\r\n  private scanRawEcho(): void {\r\n    const start = this.pos;\r\n    this.emit(TokenType.RawEchoStart, start, start + 3);\r\n    this.pos += 3;\r\n\r\n    const contentStart = this.pos;\r\n\r\n    while (this.pos < this.len) {\r\n      const byte = this.src[this.pos];\r\n\r\n      if (byte === \"'\") {\r\n        this.pos++;\r\n        this.skipQuotedStringPrim(\"'\");\r\n      } else if (byte === '\"') {\r\n        this.pos++;\r\n        this.skipQuotedStringPrim('\"');\r\n      } else if (byte === \"`\") {\r\n        this.pos++;\r\n        this.skipBacktickStringPrim();\r\n      } else if (byte === \"<\" && this.peekAhead(1) === \"<\" && this.peekAhead(2) === \"<\") {\r\n        this.pos += 3;\r\n        this.skipHeredocPrim();\r\n      } else if (byte === \"/\" && this.peekAhead(1) === \"*\") {\r\n        this.pos += 2;\r\n        this.skipBlockCommentPrim();\r\n      } else if (byte === \"/\" && this.peekAhead(1) === \"/\") {\r\n        this.pos += 2;\r\n        this.skipLineCommentWithWarnings();\r\n      } else if (byte === \"#\") {\r\n        this.pos++;\r\n        this.skipLineCommentWithWarnings();\r\n      } else if (byte === \"{\" || byte === \"@\" || byte === \"<\") {\r\n        if (this.detectConstruct()) {\r\n          this.logError(ErrorReason.ConstructCollision, this.pos);\r\n          if (contentStart < this.pos) {\r\n            this.emit(TokenType.EchoContent, contentStart, this.pos);\r\n          }\r\n          this.state = this.returnState;\r\n          this.returnState = State.Data;\r\n          return;\r\n        }\r\n        this.pos++;\r\n      } else if (byte === \"!\" && this.peekAhead(1) === \"!\" && this.peekAhead(2) === \"}\") {\r\n        if (contentStart < this.pos) {\r\n          this.emit(TokenType.EchoContent, contentStart, this.pos);\r\n        }\r\n        this.emit(TokenType.RawEchoEnd, this.pos, this.pos + 3);\r\n        this.pos += 3;\r\n        this.state = this.returnState;\r\n        this.returnState = State.Data;\r\n        return;\r\n      } else {\r\n        this.pos++;\r\n      }\r\n    }\r\n\r\n    this.logError(ErrorReason.UnexpectedEof, this.len);\r\n    if (contentStart < this.pos) {\r\n      this.emit(TokenType.EchoContent, contentStart, this.pos);\r\n    }\r\n    this.pos = this.len;\r\n    this.state = this.returnState;\r\n    this.returnState = State.Data;\r\n  }\r\n\r\n  private scanTripleEcho(): void {\r\n    const start = this.pos;\r\n    this.emit(TokenType.TripleEchoStart, start, start + 3);\r\n    this.pos += 3;\r\n\r\n    const contentStart = this.pos;\r\n\r\n    while (this.pos < this.len) {\r\n      const byte = this.src[this.pos];\r\n\r\n      if (byte === \"'\") {\r\n        this.pos++;\r\n        this.skipQuotedStringPrim(\"'\");\r\n      } else if (byte === '\"') {\r\n        this.pos++;\r\n        this.skipQuotedStringPrim('\"');\r\n      } else if (byte === \"`\") {\r\n        this.pos++;\r\n        this.skipBacktickStringPrim();\r\n      } else if (byte === \"<\" && this.peekAhead(1) === \"<\" && this.peekAhead(2) === \"<\") {\r\n        this.pos += 3;\r\n        this.skipHeredocPrim();\r\n      } else if (byte === \"/\" && this.peekAhead(1) === \"*\") {\r\n        this.pos += 2;\r\n        this.skipBlockCommentPrim();\r\n      } else if (byte === \"/\" && this.peekAhead(1) === \"/\") {\r\n        this.pos += 2;\r\n        this.skipLineCommentWithWarnings();\r\n      } else if (byte === \"#\") {\r\n        this.pos++;\r\n        this.skipLineCommentWithWarnings();\r\n      } else if (byte === \"{\" || byte === \"@\" || byte === \"<\") {\r\n        if (this.detectConstruct()) {\r\n          this.logError(ErrorReason.ConstructCollision, this.pos);\r\n          if (contentStart < this.pos) {\r\n            this.emit(TokenType.EchoContent, contentStart, this.pos);\r\n          }\r\n          this.state = this.returnState;\r\n          this.returnState = State.Data;\r\n          return;\r\n        }\r\n        this.pos++;\r\n      } else if (byte === \"}\" && this.peekAhead(1) === \"}\" && this.peekAhead(2) === \"}\") {\r\n        if (contentStart < this.pos) {\r\n          this.emit(TokenType.EchoContent, contentStart, this.pos);\r\n        }\r\n        this.emit(TokenType.TripleEchoEnd, this.pos, this.pos + 3);\r\n        this.pos += 3;\r\n        this.state = this.returnState;\r\n        this.returnState = State.Data;\r\n        return;\r\n      } else {\r\n        this.pos++;\r\n      }\r\n    }\r\n\r\n    this.logError(ErrorReason.UnexpectedEof, this.len);\r\n    if (contentStart < this.pos) {\r\n      this.emit(TokenType.EchoContent, contentStart, this.pos);\r\n    }\r\n    this.pos = this.len;\r\n    this.state = this.returnState;\r\n    this.returnState = State.Data;\r\n  }\r\n\r\n  private tryScanJsxShorthandAttribute(): boolean {\r\n    if (this.pos >= this.len || this.src[this.pos] !== \"{\") return false;\r\n\r\n    // Make sure it's not an echo\r\n    if (this.pos + 1 < this.len) {\r\n      const next = this.src[this.pos + 1];\r\n      if (next === \"{\" || next === \"!\") return false;\r\n    }\r\n\r\n    const start = this.pos;\r\n    const originalPos = this.pos;\r\n    this.pos++;\r\n\r\n    // Fast path for simple {name} with no nesting\r\n    let fastScanPos = this.pos;\r\n    while (fastScanPos < this.len) {\r\n      const byte = this.src[fastScanPos];\r\n\r\n      if (byte === \"}\") {\r\n        this.pos = fastScanPos + 1;\r\n        this.emit(TokenType.JsxShorthandAttribute, start, this.pos);\r\n        this.state = State.BeforeAttrName;\r\n        return true;\r\n      }\r\n\r\n      if (byte === \"{\" || byte === \"'\" || byte === '\"' || byte === \"`\" || byte === \"/\") {\r\n        break; // complex case\r\n      }\r\n\r\n      if (byte === \"\\n\" || byte === \"\\r\" || byte === \"@\") {\r\n        this.pos = originalPos;\r\n        return false;\r\n      }\r\n\r\n      fastScanPos++;\r\n    }\r\n\r\n    // Complex case - use balanced scanner\r\n    return this.scanBalancedJsLike(\r\n      start,\r\n      TokenType.JsxShorthandAttribute,\r\n      originalPos,\r\n      1, // braceDepth\r\n      0, // parenDepth\r\n      false, // trackParens\r\n      true, // allowComments\r\n      true, // abortOnDirective\r\n      true, // abortOnNewline\r\n    );\r\n  }\r\n\r\n  private scanJsxAttributeValue(): boolean {\r\n    const start = this.pos;\r\n    const originalPos = this.pos;\r\n\r\n    const startsWithParen = this.src[this.pos] === \"(\";\r\n    this.pos++;\r\n\r\n    const braceDepth = startsWithParen ? 0 : 1;\r\n    const parenDepth = startsWithParen ? 1 : 0;\r\n\r\n    // Fast path for simple {expr}\r\n    if (braceDepth === 1 && parenDepth === 0) {\r\n      let fastScanPos = this.pos;\r\n      while (fastScanPos < this.len) {\r\n        const byte = this.src[fastScanPos];\r\n\r\n        if (byte === \"}\") {\r\n          this.pos = fastScanPos + 1;\r\n          this.emit(TokenType.JsxAttributeValue, start, this.pos);\r\n          return true;\r\n        }\r\n\r\n        if (\r\n          byte === \"{\" ||\r\n          byte === \"(\" ||\r\n          byte === \"'\" ||\r\n          byte === '\"' ||\r\n          byte === \"`\" ||\r\n          byte === \"/\"\r\n        ) {\r\n          break;\r\n        }\r\n\r\n        if (byte === \"\\n\" || byte === \"\\r\" || byte === \"@\") {\r\n          this.pos = originalPos;\r\n          return false;\r\n        }\r\n\r\n        fastScanPos++;\r\n      }\r\n    }\r\n\r\n    return this.scanBalancedJsLike(\r\n      start,\r\n      TokenType.JsxAttributeValue,\r\n      originalPos,\r\n      braceDepth,\r\n      parenDepth,\r\n      true, // trackParens\r\n      true, // allowComments\r\n      true, // abortOnDirective\r\n      false, // abortOnNewline\r\n    );\r\n  }\r\n\r\n  private tryScanTsxGenericType(): boolean {\r\n    if (this.pos >= this.len || this.src[this.pos] !== \"<\") return false;\r\n\r\n    // Check if starting a PHP tag\r\n    if (this.pos + 1 < this.len && this.src[this.pos + 1] === \"?\") {\r\n      return false;\r\n    }\r\n\r\n    const start = this.pos;\r\n    const originalPos = this.pos;\r\n    this.pos++;\r\n\r\n    // Validate the next character looks like a generic start\r\n    if (this.pos < this.len) {\r\n      const nextByte = this.src[this.pos];\r\n\r\n      const isPascalCaseTag =\r\n        this.currentTagName !== \"\" &&\r\n        this.currentTagName[0] >= \"A\" &&\r\n        this.currentTagName[0] <= \"Z\";\r\n\r\n      let looksLikeGeneric =\r\n        nextByte === \"{\" || (nextByte >= \"A\" && nextByte <= \"Z\") || nextByte === \"_\";\r\n\r\n      if (isPascalCaseTag) {\r\n        looksLikeGeneric =\r\n          looksLikeGeneric ||\r\n          (nextByte >= \"a\" && nextByte <= \"z\") ||\r\n          (nextByte >= \"0\" && nextByte <= \"9\") ||\r\n          nextByte === \"[\" ||\r\n          nextByte === '\"' ||\r\n          nextByte === \"'\" ||\r\n          nextByte === \"(\" ||\r\n          nextByte === \" \" ||\r\n          nextByte === \"\\t\";\r\n      }\r\n\r\n      if (!looksLikeGeneric) {\r\n        this.pos = originalPos;\r\n        return false;\r\n      }\r\n    }\r\n\r\n    let depth = 1;\r\n\r\n    while (true) {\r\n      if (this.pos >= this.len) {\r\n        this.pos = originalPos;\r\n        return false;\r\n      }\r\n\r\n      const nextPos = this.nextInterestingPosForTsxGeneric(this.pos);\r\n      if (nextPos >= this.len) {\r\n        this.pos = originalPos;\r\n        return false;\r\n      }\r\n\r\n      this.pos = nextPos;\r\n      const byte = this.src[this.pos];\r\n\r\n      if (byte === \"<\") {\r\n        depth++;\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      if (byte === \">\") {\r\n        // Arrow function => should not close generics\r\n        if (this.pos > 0 && this.src[this.pos - 1] === \"=\") {\r\n          this.pos++;\r\n          continue;\r\n        }\r\n\r\n        depth--;\r\n        this.pos++;\r\n        if (depth === 0) {\r\n          this.emit(TokenType.TsxGenericType, start, this.pos);\r\n          return true;\r\n        }\r\n        continue;\r\n      }\r\n\r\n      if (byte === \"\\n\" || byte === \"\\r\" || byte === \"@\") {\r\n        this.pos = originalPos;\r\n        return false;\r\n      }\r\n\r\n      if (byte === '\"' || byte === \"'\") {\r\n        this.pos++;\r\n        this.skipQuotedStringPrim(byte);\r\n        continue;\r\n      }\r\n\r\n      if (byte === \"`\") {\r\n        this.pos++;\r\n        this.skipTemplateLiteralPrim();\r\n        continue;\r\n      }\r\n\r\n      this.pos++;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Balanced scanner for JSX-ish content.\r\n   */\r\n  private scanBalancedJsLike(\r\n    start: number,\r\n    tokenType: TokenType,\r\n    originalPos: number,\r\n    braceDepth: number,\r\n    parenDepth: number,\r\n    trackParens: boolean,\r\n    allowComments: boolean,\r\n    abortOnDirective: boolean,\r\n    abortOnNewline: boolean,\r\n  ): boolean {\r\n    while (true) {\r\n      if (this.pos >= this.len) {\r\n        this.emit(tokenType, start, this.pos);\r\n        return true;\r\n      }\r\n\r\n      const nextPos = this.nextInterestingPosForBalancedJsLike(this.pos);\r\n      if (nextPos >= this.len) {\r\n        this.pos = this.len;\r\n        this.emit(tokenType, start, this.pos);\r\n        return true;\r\n      }\r\n\r\n      this.pos = nextPos;\r\n      const byte = this.src[this.pos];\r\n\r\n      if (byte === \"{\") {\r\n        braceDepth++;\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      if (byte === \"}\") {\r\n        braceDepth--;\r\n        this.pos++;\r\n        if (braceDepth === 0 && (!trackParens || parenDepth === 0)) {\r\n          this.emit(tokenType, start, this.pos);\r\n          return true;\r\n        }\r\n        continue;\r\n      }\r\n\r\n      if (trackParens && byte === \"(\") {\r\n        parenDepth++;\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      if (trackParens && byte === \")\") {\r\n        parenDepth--;\r\n        this.pos++;\r\n        if (braceDepth === 0 && parenDepth === 0) {\r\n          this.emit(tokenType, start, this.pos);\r\n          return true;\r\n        }\r\n        continue;\r\n      }\r\n\r\n      if (byte === '\"' || byte === \"'\") {\r\n        this.pos++;\r\n        this.skipQuotedStringPrim(byte);\r\n        continue;\r\n      }\r\n\r\n      if (byte === \"`\") {\r\n        this.pos++;\r\n        this.skipTemplateLiteralPrim();\r\n        continue;\r\n      }\r\n\r\n      if (byte === \"/\") {\r\n        if (!allowComments) {\r\n          this.pos++;\r\n          continue;\r\n        }\r\n\r\n        if (this.pos + 1 < this.len) {\r\n          const next = this.src[this.pos + 1];\r\n          if (next === \"/\") {\r\n            this.pos += 2;\r\n            // Skip line comment to end of line\r\n            while (this.pos < this.len) {\r\n              const ch = this.src[this.pos];\r\n              if (ch === \"\\n\" || ch === \"\\r\") {\r\n                this.pos++;\r\n                if (ch === \"\\r\" && this.pos < this.len && this.src[this.pos] === \"\\n\") {\r\n                  this.pos++;\r\n                }\r\n                break;\r\n              }\r\n              this.pos++;\r\n            }\r\n            continue;\r\n          }\r\n          if (next === \"*\") {\r\n            this.pos += 2;\r\n            this.skipBlockCommentPrim();\r\n            continue;\r\n          }\r\n        }\r\n\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      if (abortOnDirective && byte === \"@\") {\r\n        this.pos = originalPos;\r\n        return false;\r\n      }\r\n\r\n      if (abortOnNewline && (byte === \"\\n\" || byte === \"\\r\")) {\r\n        this.pos = originalPos;\r\n        return false;\r\n      }\r\n\r\n      this.pos++;\r\n    }\r\n  }\r\n\r\n  private scanRawtext(): void {\r\n    const start = this.pos;\r\n    const tagName = this.rawtextTagName;\r\n    const tagNameLen = tagName.length;\r\n\r\n    while (this.pos < this.len) {\r\n      const nextIgnoreRangeStart = this.nextIgnoreRangeStart();\r\n      if (nextIgnoreRangeStart !== null && this.pos === nextIgnoreRangeStart) {\r\n        if (start < this.pos) {\r\n          this.emit(this.phpBlock ? TokenType.PhpBlock : TokenType.Text, start, this.pos);\r\n        }\r\n        return;\r\n      }\r\n\r\n      const byte = this.src[this.pos];\r\n\r\n      if (this.phpBlock) {\r\n        if (byte === \"'\" || byte === '\"') {\r\n          this.pos++;\r\n          this.skipQuotedStringPrim(byte);\r\n          continue;\r\n        }\r\n\r\n        if (byte === \"`\") {\r\n          this.pos++;\r\n          this.skipBacktickStringPrim();\r\n          continue;\r\n        }\r\n\r\n        if (byte === \"/\" && this.pos + 1 < this.len) {\r\n          const next = this.src[this.pos + 1];\r\n          if (next === \"/\") {\r\n            this.pos += 2;\r\n            while (this.pos < this.len) {\r\n              const ch = this.src[this.pos];\r\n              if (ch === \"\\n\" || ch === \"\\r\") {\r\n                this.pos++;\r\n                break;\r\n              }\r\n              this.pos++;\r\n            }\r\n            continue;\r\n          }\r\n          if (next === \"*\") {\r\n            this.pos += 2;\r\n            this.skipBlockCommentPrim();\r\n            continue;\r\n          }\r\n        }\r\n\r\n        if (byte === \"#\") {\r\n          this.pos++;\r\n          while (this.pos < this.len) {\r\n            const ch = this.src[this.pos];\r\n            if (ch === \"\\n\" || ch === \"\\r\") {\r\n              this.pos++;\r\n              break;\r\n            }\r\n            this.pos++;\r\n          }\r\n          continue;\r\n        }\r\n\r\n        if (byte === \"<\" && this.isRawtextClosingTagAt(this.pos, tagName, tagNameLen)) {\r\n          this.logError(ErrorReason.UnexpectedEof, this.pos);\r\n          this.recoverUnclosedRawtextPhpBlock(start);\r\n          return;\r\n        }\r\n\r\n        if (\r\n          byte === \"<\" &&\r\n          this.pos + 2 < this.len &&\r\n          this.src[this.pos + 1] === \"<\" &&\r\n          this.src[this.pos + 2] === \"<\"\r\n        ) {\r\n          this.pos += 3;\r\n          this.skipHeredocPrim();\r\n          continue;\r\n        }\r\n\r\n        if (byte === \"@\" && this.isEndphpAt(this.pos)) {\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.PhpBlock, start, this.pos);\r\n          }\r\n          this.returnState = State.RawText;\r\n          this.scanDirective();\r\n          return;\r\n        }\r\n\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      // Check for Blade constructs\r\n      if (byte === \"{\" && !this.verbatim) {\r\n        const next1 = this.peekAhead(1);\r\n\r\n        if (next1 === \"{\") {\r\n          const next2 = this.peekAhead(2);\r\n          const next3 = this.peekAhead(3);\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.Text, start, this.pos);\r\n          }\r\n          this.returnState = State.RawText;\r\n          if (next2 === \"-\" && next3 === \"-\") {\r\n            this.beginBladeCommentCapture(State.RawText, null);\r\n            this.scanBladeCommentStart();\r\n            return;\r\n          }\r\n          this.scanEcho();\r\n          return;\r\n        } else if (next1 === \"!\" && this.pos + 2 < this.len && this.src[this.pos + 2] === \"!\") {\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.Text, start, this.pos);\r\n          }\r\n          this.returnState = State.RawText;\r\n          this.scanRawEcho();\r\n          return;\r\n        }\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      // Directives in rawtext\r\n      if (byte === \"@\" && !this.verbatim && !this.phpBlock) {\r\n        const canStart = canStartBladeDirectiveAt(this.src, this.pos);\r\n\r\n        if (canStart) {\r\n          const nextPos = this.pos + 1;\r\n          let isEscaped = false;\r\n          if (nextPos < this.len) {\r\n            const nextByte = this.src[nextPos];\r\n            if (nextByte === \"@\") {\r\n              isEscaped = true;\r\n            } else if (nextByte === \"{\" && nextPos + 1 < this.len) {\r\n              const afterBrace = this.src[nextPos + 1];\r\n              if (afterBrace === \"{\" || afterBrace === \"!\") {\r\n                isEscaped = true;\r\n              }\r\n            }\r\n          }\r\n\r\n          if (start < this.pos) {\r\n            this.emit(TokenType.Text, start, this.pos);\r\n          }\r\n\r\n          if (isEscaped) {\r\n            this.emit(TokenType.AtSign, this.pos, this.pos + 1);\r\n            this.pos++;\r\n            return;\r\n          }\r\n\r\n          this.returnState = State.RawText;\r\n          this.scanDirective();\r\n          return;\r\n        }\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      // Check for closing tag\r\n      if (byte === \"<\") {\r\n        if (this.pos + 2 + tagNameLen <= this.len && this.src[this.pos + 1] === \"/\") {\r\n          const potentialTagName = this.src.slice(this.pos + 2, this.pos + 2 + tagNameLen);\r\n          if (potentialTagName.toLowerCase() === tagName) {\r\n            const afterTagPos = this.pos + 2 + tagNameLen;\r\n            if (afterTagPos < this.len) {\r\n              const afterTagChar = this.src[afterTagPos];\r\n              if (afterTagChar === \">\" || isSpace(afterTagChar.charCodeAt(0))) {\r\n                if (start < this.pos) {\r\n                  this.emit(TokenType.Text, start, this.pos);\r\n                }\r\n                this.rawtextTagName = \"\";\r\n\r\n                this.emit(TokenType.LessThan, this.pos, this.pos + 1);\r\n                this.pos++;\r\n                this.emit(TokenType.Slash, this.pos, this.pos + 1);\r\n                this.pos++;\r\n                this.emit(TokenType.TagName, this.pos, this.pos + tagNameLen);\r\n                this.currentTagName = potentialTagName;\r\n                this.isClosingTag = true;\r\n                this.pos += tagNameLen;\r\n\r\n                let peekPos = this.pos;\r\n                while (peekPos < this.len && isSpace(this.src.charCodeAt(peekPos))) {\r\n                  peekPos++;\r\n                }\r\n\r\n                if (peekPos < this.len && this.src[peekPos] === \">\") {\r\n                  if (this.pos < peekPos) {\r\n                    this.emit(TokenType.Whitespace, this.pos, peekPos);\r\n                    this.pos = peekPos;\r\n                  }\r\n                  this.emit(TokenType.GreaterThan, this.pos, this.pos + 1);\r\n                  this.pos++;\r\n                } else {\r\n                  this.emit(TokenType.SyntheticClose, this.pos, this.pos);\r\n                }\r\n                this.state = State.Data;\r\n                return;\r\n              }\r\n            } else if (afterTagPos === this.len) {\r\n              if (start < this.pos) {\r\n                this.emit(TokenType.Text, start, this.pos);\r\n              }\r\n              this.rawtextTagName = \"\";\r\n              this.emit(TokenType.LessThan, this.pos, this.pos + 1);\r\n              this.pos++;\r\n              this.emit(TokenType.Slash, this.pos, this.pos + 1);\r\n              this.pos++;\r\n              this.emit(TokenType.TagName, this.pos, this.pos + tagNameLen);\r\n              this.pos += tagNameLen;\r\n              this.state = State.Data;\r\n              return;\r\n            }\r\n          }\r\n        }\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      this.pos++;\r\n    }\r\n\r\n    // EOF\r\n    if (start < this.pos) {\r\n      if (this.phpBlock) {\r\n        this.logError(ErrorReason.UnexpectedEof, this.pos);\r\n        this.emit(TokenType.PhpBlock, start, this.pos);\r\n      } else {\r\n        this.emit(TokenType.Text, start, this.pos);\r\n      }\r\n    }\r\n    this.rawtextTagName = \"\";\r\n  }\r\n\r\n  private isRawtextClosingTagAt(pos: number, tagName: string, tagNameLen: number): boolean {\r\n    if (pos + 2 + tagNameLen > this.len || this.src[pos] !== \"<\" || this.src[pos + 1] !== \"/\") {\r\n      return false;\r\n    }\r\n\r\n    const potentialTagName = this.src.slice(pos + 2, pos + 2 + tagNameLen);\r\n    if (potentialTagName.toLowerCase() !== tagName) {\r\n      return false;\r\n    }\r\n\r\n    const afterTagPos = pos + 2 + tagNameLen;\r\n    if (afterTagPos === this.len) {\r\n      return true;\r\n    }\r\n\r\n    const afterTagChar = this.src[afterTagPos];\r\n    return afterTagChar === \">\" || isSpace(afterTagChar.charCodeAt(0));\r\n  }\r\n\r\n  private recoverUnclosedRawtextPhpBlock(contentStart: number): void {\r\n    if (this.phpBlockStartTokenIndex !== null) {\r\n      this.tokens[this.phpBlockStartTokenIndex].type = TokenType.Text;\r\n    }\r\n\r\n    if (contentStart < this.pos) {\r\n      this.emit(TokenType.Text, contentStart, this.pos);\r\n    }\r\n\r\n    this.phpBlock = false;\r\n    this.phpBlockStartTokenIndex = null;\r\n  }\r\n\r\n  private recoverUnclosedRawtextVerbatimBlock(contentStart: number): void {\r\n    if (this.verbatimStartTokenIndex !== null) {\r\n      this.tokens[this.verbatimStartTokenIndex].type = TokenType.Text;\r\n    }\r\n\r\n    if (contentStart < this.pos) {\r\n      this.emit(TokenType.Text, contentStart, this.pos);\r\n    }\r\n\r\n    this.verbatim = false;\r\n    this.verbatimReturnState = null;\r\n    this.verbatimStartTokenIndex = null;\r\n    this.state = State.RawText;\r\n    this.returnState = State.Data;\r\n  }\r\n}\r\n\r\nfunction isSpace(ch: number): boolean {\r\n  return ch === 32 || ch === 9 || ch === 10 || ch === 13;\r\n}\r\n\r\nfunction normalizeDirectiveName(name: string): string {\r\n  return name.trim().toLowerCase().replace(/^@/, \"\");\r\n}\r\n\r\nexport function tokenize(\r\n  source: string,\r\n  directives?: Directives,\r\n  rawBlockConfig?: LexerRawBlockConfig,\r\n): LexerResult {\r\n  return new Lexer(source, directives, rawBlockConfig).tokenize();\r\n}\r\n\r\nexport function tokenContent(source: string, token: Token): string {\r\n  return source.slice(token.start, token.end);\r\n}\r\n\r\nexport function reconstructFromTokens(tokens: Token[], source: string): string {\r\n  let result = \"\";\r\n  for (const token of tokens) {\r\n    result += source.slice(token.start, token.end);\r\n  }\r\n  return result;\r\n}\r\n","export type IgnoreCommentKind = \"ignore\" | \"ignore-start\" | \"ignore-end\";\nexport type IgnoreCommentWrapper = \"blade\" | \"html\";\n\nexport function getIgnoreCommentKindFromPayload(payload: string): IgnoreCommentKind | null {\n  switch (payload.trim().toLowerCase()) {\n    case \"format-ignore\":\n    case \"prettier-ignore\":\n      return \"ignore\";\n    case \"format-ignore-start\":\n    case \"prettier-ignore-start\":\n      return \"ignore-start\";\n    case \"format-ignore-end\":\n    case \"prettier-ignore-end\":\n      return \"ignore-end\";\n    default:\n      return null;\n  }\n}\n\nexport function getIgnoreCommentKindFromCommentText(\n  text: string,\n  wrapper: IgnoreCommentWrapper,\n): IgnoreCommentKind | null {\n  const payload =\n    wrapper === \"blade\"\n      ? (text.match(/^\\{\\{--\\s*([\\s\\S]*?)\\s*--\\}\\}$/s)?.[1] ?? null)\n      : (text.match(/^<!--\\s*([\\s\\S]*?)\\s*-->$/s)?.[1] ?? null);\n\n  if (payload === null) {\n    return null;\n  }\n\n  return getIgnoreCommentKindFromPayload(payload);\n}\n","import { getIgnoreCommentKindFromCommentText } from \"../ignore-markers.js\";\nimport { Directives } from \"./directives.js\";\nimport { Lexer, type LexerRawBlockConfig } from \"./lexer.js\";\nimport { State, type IgnoreRangeRegion, type IgnoreRangeResumeState } from \"./types.js\";\n\nfunction isTagIgnoreState(state: State): boolean {\n  switch (state) {\n    case State.TagName:\n    case State.BeforeAttrName:\n    case State.AttrName:\n    case State.AfterAttrName:\n    case State.BeforeAttrValue:\n    case State.AttrValueUnquoted:\n      return true;\n    default:\n      return false;\n  }\n}\n\nfunction isIgnoreMarkerAllowed(wrapper: \"blade\" | \"html\", originState: State): boolean {\n  if (originState === State.AttrValueQuoted) {\n    return false;\n  }\n\n  if (wrapper === \"html\") {\n    return originState !== State.RawText;\n  }\n\n  return true;\n}\n\nclass IgnoreRangeCollectorImpl {\n  private ranges: IgnoreRangeRegion[] = [];\n  private depth = 0;\n  private outerStart = -1;\n\n  constructor(private readonly source: string) {}\n\n  handleBladeComment(\n    start: number,\n    end: number,\n    originState: State,\n    tagStart: number | null,\n    resume: IgnoreRangeResumeState,\n  ): void {\n    this.handleComment(\"blade\", start, end, originState, tagStart, resume);\n  }\n\n  handleHtmlComment(\n    start: number,\n    end: number,\n    originState: State,\n    tagStart: number | null,\n    resume: IgnoreRangeResumeState,\n  ): void {\n    this.handleComment(\"html\", start, end, originState, tagStart, resume);\n  }\n\n  finish(resume: IgnoreRangeResumeState, eof: number): IgnoreRangeRegion[] {\n    if (this.depth > 0 && this.outerStart >= 0) {\n      this.ranges.push({\n        start: this.outerStart,\n        end: eof,\n        resume,\n      });\n      this.depth = 0;\n      this.outerStart = -1;\n    }\n\n    return this.ranges;\n  }\n\n  private handleComment(\n    wrapper: \"blade\" | \"html\",\n    start: number,\n    end: number,\n    originState: State,\n    tagStart: number | null,\n    resume: IgnoreRangeResumeState,\n  ): void {\n    if (!isIgnoreMarkerAllowed(wrapper, originState)) {\n      return;\n    }\n\n    const kind = getIgnoreCommentKindFromCommentText(this.source.slice(start, end), wrapper);\n    if (!kind) {\n      return;\n    }\n\n    if (kind === \"ignore-start\") {\n      if (this.depth === 0) {\n        this.outerStart =\n          isTagIgnoreState(originState) && tagStart !== null && tagStart >= 0 ? tagStart : start;\n      }\n      this.depth++;\n      return;\n    }\n\n    if (this.depth === 0) {\n      return;\n    }\n\n    this.depth--;\n    if (this.depth !== 0) {\n      return;\n    }\n\n    this.ranges.push({\n      start: this.outerStart >= 0 ? this.outerStart : start,\n      end,\n      resume,\n    });\n    this.outerStart = -1;\n  }\n}\n\nexport function collectIgnoreRanges(\n  source: string,\n  directives?: Directives,\n  rawBlockConfig?: LexerRawBlockConfig,\n): IgnoreRangeRegion[] {\n  const collector = new IgnoreRangeCollectorImpl(source);\n  new Lexer(source, directives, {\n    ...rawBlockConfig,\n    ignoreRangeCollector: collector,\n  }).tokenize();\n\n  return collector.finish(\n    {\n      state: State.Data,\n      returnState: State.Data,\n      rawtextTagName: \"\",\n      currentTagName: \"\",\n      isClosingTag: false,\n      continuedTagName: false,\n      inXmlDeclaration: false,\n      verbatim: false,\n      verbatimReturnState: null,\n      phpBlock: false,\n      phpTag: false,\n      attrPhpDirectiveDepth: 0,\n    },\n    source.length,\n  );\n}\n","import type { IgnoreRangeRegion } from \"../lexer/types.js\";\nimport type { Directives } from \"./directives.js\";\n\nexport const enum NodeKind {\n  Root = 0,\n  Element = 1,\n  Text = 2,\n  Fragment = 3,\n  Echo = 4,\n  RawEcho = 5,\n  TripleEcho = 6,\n  Directive = 7,\n  DirectiveBlock = 8,\n  Verbatim = 9,\n  PhpBlock = 10,\n  PhpTag = 11,\n  Comment = 12,\n  BogusComment = 13,\n  ConditionalComment = 14,\n  BladeComment = 15,\n  Doctype = 16,\n  Cdata = 17,\n  Decl = 18,\n  Attribute = 19,\n  JsxAttribute = 20,\n  UnpairedClosingTag = 21,\n  NonOutput = 22,\n  ElementName = 23,\n  ClosingElementName = 24,\n  AttributeWhitespace = 25,\n  AttributeName = 26,\n  AttributeValue = 27,\n  ProcessingInstruction = 28,\n  IgnoreRange = 29,\n}\n\nexport const NODE_KIND_LABELS: Record<number, string> = {\n  [NodeKind.Root]: \"Root\",\n  [NodeKind.Element]: \"Element\",\n  [NodeKind.Text]: \"Text\",\n  [NodeKind.Fragment]: \"Fragment\",\n  [NodeKind.Echo]: \"Echo\",\n  [NodeKind.RawEcho]: \"RawEcho\",\n  [NodeKind.TripleEcho]: \"TripleEcho\",\n  [NodeKind.Directive]: \"Directive\",\n  [NodeKind.DirectiveBlock]: \"DirectiveBlock\",\n  [NodeKind.Verbatim]: \"Verbatim\",\n  [NodeKind.PhpBlock]: \"PhpBlock\",\n  [NodeKind.PhpTag]: \"PhpTag\",\n  [NodeKind.Comment]: \"Comment\",\n  [NodeKind.BogusComment]: \"BogusComment\",\n  [NodeKind.ConditionalComment]: \"ConditionalComment\",\n  [NodeKind.BladeComment]: \"BladeComment\",\n  [NodeKind.Doctype]: \"Doctype\",\n  [NodeKind.Cdata]: \"Cdata\",\n  [NodeKind.Decl]: \"Decl\",\n  [NodeKind.Attribute]: \"Attribute\",\n  [NodeKind.JsxAttribute]: \"JsxAttribute\",\n  [NodeKind.UnpairedClosingTag]: \"UnpairedClosingTag\",\n  [NodeKind.NonOutput]: \"NonOutput\",\n  [NodeKind.ElementName]: \"ElementName\",\n  [NodeKind.ClosingElementName]: \"ClosingElementName\",\n  [NodeKind.AttributeWhitespace]: \"AttributeWhitespace\",\n  [NodeKind.AttributeName]: \"AttributeName\",\n  [NodeKind.AttributeValue]: \"AttributeValue\",\n  [NodeKind.ProcessingInstruction]: \"ProcessingInstruction\",\n  [NodeKind.IgnoreRange]: \"IgnoreRange\",\n};\n\nexport function nodeKindLabel(kind: number): string {\n  return NODE_KIND_LABELS[kind] ?? `Unknown(${kind})`;\n}\n\nexport const enum StructureRole {\n  None = 0,\n  Opening = 1,\n  Closing = 2,\n  Intermediate = 3,\n  Mixed = 4,\n}\n\nexport const enum ArgumentRequirement {\n  Optional = 0,\n  Required = 1,\n  NotAllowed = 2,\n}\n\nexport interface FlatNode {\n  kind: number;\n  parent: number;\n  firstChild: number;\n  lastChild: number;\n  nextSibling: number;\n  tokenStart: number;\n  tokenCount: number;\n  genericOffset: number;\n  data: number;\n}\n\nexport const NONE = -1;\n\nexport function createFlatNode(\n  kind: number,\n  parent: number,\n  tokenStart: number,\n  tokenCount = 0,\n  genericOffset = 0,\n  data = 0,\n): FlatNode {\n  return {\n    kind,\n    parent,\n    firstChild: NONE,\n    lastChild: NONE,\n    nextSibling: NONE,\n    tokenStart,\n    tokenCount,\n    genericOffset,\n    data,\n  };\n}\n\nexport interface BuildResult {\n  nodes: FlatNode[];\n  source: string;\n  tokens: readonly { type: number; start: number; end: number }[];\n  directives?: Directives;\n  ignoreRanges?: readonly IgnoreRangeRegion[];\n}\n\nexport interface DirectiveFrame {\n  blockIdx: number;\n  startDirectiveIdx: number;\n  name: string;\n  elementStackBase: number;\n  terminators: string[];\n  branches: string[];\n  openers: string[];\n}\n\nexport interface ConditionFrame {\n  blockIdx: number;\n  currentBranchIdx: number;\n  name: string;\n  elementStackBase: number;\n}\n\nexport interface SwitchFrame {\n  blockIdx: number;\n  switchDirectiveIdx: number;\n  currentCaseIdx: number | null;\n  name: string;\n  elementStackBase: number;\n}\n","/**\n * HTML void elements - elements that cannot have children and\n * must not have a closing tag.\n *\n * @see https://html.spec.whatwg.org/multipage/syntax.html#void-elements\n */\nexport const VOID_ELEMENTS: ReadonlySet<string> = new Set([\n  \"area\",\n  \"base\",\n  \"br\",\n  \"col\",\n  \"embed\",\n  \"hr\",\n  \"img\",\n  \"input\",\n  \"link\",\n  \"meta\",\n  \"param\",\n  \"source\",\n  \"track\",\n  \"wbr\",\n]);\n","/**\n * HTML5 optional closing tag rules.\n *\n * Rules define when an element's closing tag can be omitted:\n * - `autoCloseWhenSibling`: sibling element names that trigger auto-close\n * - `autoCloseAtParentEnd`: parent elements where this closes at parent's end\n *\n * @see https://html.spec.whatwg.org/multipage/syntax.html#optional-tags\n */\n\ninterface ClosingConditions {\n  autoCloseWhenSibling?: readonly string[];\n  autoCloseAtParentEnd?: readonly string[];\n}\n\nconst RULES: Readonly<Record<string, ClosingConditions>> = {\n  li: {\n    autoCloseWhenSibling: [\"li\"],\n    autoCloseAtParentEnd: [\"ul\", \"ol\", \"menu\"],\n  },\n  dt: {\n    autoCloseWhenSibling: [\"dt\", \"dd\"],\n    autoCloseAtParentEnd: [\"dl\"],\n  },\n  dd: {\n    autoCloseWhenSibling: [\"dt\", \"dd\"],\n    autoCloseAtParentEnd: [\"dl\"],\n  },\n  p: {\n    autoCloseWhenSibling: [\n      \"address\",\n      \"article\",\n      \"aside\",\n      \"blockquote\",\n      \"div\",\n      \"dl\",\n      \"fieldset\",\n      \"footer\",\n      \"form\",\n      \"h1\",\n      \"h2\",\n      \"h3\",\n      \"h4\",\n      \"h5\",\n      \"h6\",\n      \"header\",\n      \"hr\",\n      \"main\",\n      \"nav\",\n      \"ol\",\n      \"p\",\n      \"pre\",\n      \"section\",\n      \"table\",\n      \"ul\",\n    ],\n  },\n  option: {\n    autoCloseWhenSibling: [\"option\", \"optgroup\"],\n    autoCloseAtParentEnd: [\"select\", \"datalist\", \"optgroup\"],\n  },\n  optgroup: {\n    autoCloseWhenSibling: [\"optgroup\"],\n    autoCloseAtParentEnd: [\"select\"],\n  },\n  rt: {\n    autoCloseWhenSibling: [\"rt\", \"rp\"],\n    autoCloseAtParentEnd: [\"ruby\", \"rtc\"],\n  },\n  rp: {\n    autoCloseWhenSibling: [\"rt\", \"rp\"],\n    autoCloseAtParentEnd: [\"ruby\", \"rtc\"],\n  },\n  rb: {\n    autoCloseWhenSibling: [\"rb\", \"rt\", \"rp\", \"rtc\"],\n    autoCloseAtParentEnd: [\"ruby\"],\n  },\n  caption: {\n    autoCloseWhenSibling: [\"colgroup\", \"thead\", \"tbody\", \"tfoot\", \"tr\"],\n    autoCloseAtParentEnd: [\"table\"],\n  },\n  colgroup: {\n    autoCloseWhenSibling: [\"colgroup\", \"thead\", \"tbody\", \"tfoot\", \"tr\"],\n    autoCloseAtParentEnd: [\"table\"],\n  },\n  thead: {\n    autoCloseWhenSibling: [\"tbody\", \"tfoot\"],\n    autoCloseAtParentEnd: [\"table\"],\n  },\n  tbody: {\n    autoCloseWhenSibling: [\"tbody\", \"tfoot\"],\n    autoCloseAtParentEnd: [\"table\"],\n  },\n  tfoot: {\n    autoCloseAtParentEnd: [\"table\"],\n  },\n  tr: {\n    autoCloseWhenSibling: [\"tr\"],\n    autoCloseAtParentEnd: [\"table\", \"thead\", \"tbody\", \"tfoot\"],\n  },\n  td: {\n    autoCloseWhenSibling: [\"td\", \"th\"],\n    autoCloseAtParentEnd: [\"tr\"],\n  },\n  th: {\n    autoCloseWhenSibling: [\"td\", \"th\"],\n    autoCloseAtParentEnd: [\"tr\"],\n  },\n};\n\nexport function canOmitClosingTag(element: string): boolean {\n  return element in RULES;\n}\n\nexport function getClosingConditions(element: string): ClosingConditions | null {\n  return RULES[element] ?? null;\n}\n\nexport function shouldAutoCloseOnSibling(element: string, sibling: string): boolean {\n  const rules = RULES[element];\n  if (!rules?.autoCloseWhenSibling) return false;\n  return rules.autoCloseWhenSibling.includes(sibling);\n}\n\nexport function shouldAutoCloseAtParentEnd(element: string, parent: string | null): boolean {\n  const rules = RULES[element];\n  if (!rules?.autoCloseAtParentEnd || parent === null) return false;\n  return rules.autoCloseAtParentEnd.includes(parent);\n}\n\n/**\n * Check if an element is in a valid parent context for optional tag rules.\n */\nexport function isInValidParentContext(element: string, parent: string | null): boolean {\n  const conditions = RULES[element];\n  if (!conditions) return false;\n\n  const hasParentRules = conditions.autoCloseAtParentEnd !== undefined;\n  const hasSiblingRules = conditions.autoCloseWhenSibling !== undefined;\n\n  if (parent === element || parent === null) {\n    if (hasParentRules || parent === element) return false;\n  }\n\n  if (hasParentRules) {\n    return conditions.autoCloseAtParentEnd!.includes(parent!);\n  }\n\n  if (hasSiblingRules) {\n    // For sibling-triggered optional closures (notably <p>), allow root-level\n    // context so block siblings can auto-close the current element.\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * Check if an element should auto-close in the current context.\n */\nexport function shouldAutoCloseElement(\n  element: string,\n  nextElement: string | null,\n  parent: string | null,\n  atParentEnd: boolean,\n): boolean {\n  if (!canOmitClosingTag(element)) return false;\n\n  if (nextElement !== null && shouldAutoCloseOnSibling(element, nextElement)) {\n    return true;\n  }\n\n  if (atParentEnd && shouldAutoCloseAtParentEnd(element, parent)) {\n    return true;\n  }\n\n  return false;\n}\n","import { TokenType, type Token } from \"../lexer/types.js\";\nimport { NodeKind } from \"./types.js\";\n\nconst CONSTRUCT_PAIRS: Readonly<Record<number, number>> = {\n  [TokenType.EchoStart]: TokenType.EchoEnd,\n  [TokenType.RawEchoStart]: TokenType.RawEchoEnd,\n  [TokenType.TripleEchoStart]: TokenType.TripleEchoEnd,\n  [TokenType.PhpTagStart]: TokenType.PhpTagEnd,\n  [TokenType.PhpBlockStart]: TokenType.PhpBlockEnd,\n};\n\nconst CONSTRUCT_KINDS: Readonly<Record<number, number>> = {\n  [TokenType.EchoStart]: NodeKind.Echo,\n  [TokenType.RawEchoStart]: NodeKind.RawEcho,\n  [TokenType.TripleEchoStart]: NodeKind.TripleEcho,\n  [TokenType.PhpTagStart]: NodeKind.PhpTag,\n  [TokenType.PhpBlockStart]: NodeKind.PhpBlock,\n};\n\nexport function isConstructStart(tokenType: number): boolean {\n  return tokenType in CONSTRUCT_PAIRS;\n}\n\nexport function isEchoStart(tokenType: number): boolean {\n  return (\n    tokenType === TokenType.EchoStart ||\n    tokenType === TokenType.RawEchoStart ||\n    tokenType === TokenType.TripleEchoStart\n  );\n}\n\nexport function isPhpStart(tokenType: number): boolean {\n  return tokenType === TokenType.PhpBlockStart || tokenType === TokenType.PhpTagStart;\n}\n\nexport function getEndType(startType: number): number | null {\n  return CONSTRUCT_PAIRS[startType] ?? null;\n}\n\nexport function getNodeKind(startType: number): number | null {\n  return CONSTRUCT_KINDS[startType] ?? null;\n}\n\nexport function scanConstruct(\n  tokens: readonly Token[],\n  pos: number,\n  end: number,\n): [number, number] {\n  if (pos >= end) return [pos, 0];\n\n  const endType = getEndType(tokens[pos].type);\n  if (endType === null) return [pos + 1, 1];\n\n  let count = 1;\n  pos++;\n\n  while (pos < end && tokens[pos].type !== endType) {\n    count++;\n    pos++;\n  }\n\n  if (pos < end && tokens[pos].type === endType) {\n    count++;\n    pos++;\n  }\n\n  return [pos, count];\n}\n\nexport function countConstructTokens(tokens: readonly Token[], pos: number, end: number): number {\n  return scanConstruct(tokens, pos, end)[1];\n}\n\nexport function advancePast(tokens: readonly Token[], pos: number, end: number): number {\n  if (pos >= end) return pos;\n  if (isConstructStart(tokens[pos].type)) {\n    return scanConstruct(tokens, pos, end)[0];\n  }\n  return pos + 1;\n}\n","import { TokenType, type Token } from \"../lexer/types.js\";\r\nimport { StructureRole, ArgumentRequirement } from \"./types.js\";\r\n\r\nexport interface DiscoveredDirective {\r\n  name: string;\r\n  args: ArgumentRequirement;\r\n  role: StructureRole;\r\n  isCondition: boolean;\r\n  terminators: string[];\r\n  conditionLikeBranches: string[];\r\n  hasConditionLikeBranches: boolean;\r\n  terminator: string | null;\r\n  isSwitch: boolean;\r\n  switchParent: string | null;\r\n  isSwitchBranch: boolean;\r\n  isSwitchTerminator: boolean;\r\n  isConditionalPair: boolean;\r\n  pairingStrategy: string | null;\r\n  isConditionalClose: boolean;\r\n}\r\n\r\nfunction createDirective(\r\n  overrides: Partial<DiscoveredDirective> & { name: string },\r\n): DiscoveredDirective {\r\n  return {\r\n    args: ArgumentRequirement.Optional,\r\n    role: StructureRole.None,\r\n    isCondition: false,\r\n    terminators: [],\r\n    conditionLikeBranches: [],\r\n    hasConditionLikeBranches: false,\r\n    terminator: null,\r\n    isSwitch: false,\r\n    switchParent: null,\r\n    isSwitchBranch: false,\r\n    isSwitchTerminator: false,\r\n    isConditionalPair: false,\r\n    pairingStrategy: null,\r\n    isConditionalClose: false,\r\n    ...overrides,\r\n  };\r\n}\r\n\r\nexport class Directives {\r\n  private static defaultTemplate: Directives | null = null;\r\n  private directives = new Map<string, DiscoveredDirective>();\r\n  private conditions = new Set<string>();\r\n  private finalTerminators = new Set<string>();\r\n  private seenDirectives = new Set<string>();\r\n  private advisoryPairs = new Set<string>();\r\n  private advisoryConditions = new Set<string>();\r\n  private conditionBranchesCache: string[] | null = null;\r\n  private conditionTerminatorsCache: string[] | null = null;\r\n  private switchBranchesCache = new Map<string, string[]>();\r\n  private shared = false;\r\n\r\n  static withDefaults(extraDirectives: readonly unknown[] = []): Directives {\r\n    if (Directives.defaultTemplate === null) {\r\n      const template = new Directives();\r\n      // Load bundled directive definitions once.\r\n      for (const json of BUNDLED_DIRECTIVES) {\r\n        template.loadJson(json);\r\n      }\r\n      Directives.defaultTemplate = template;\r\n    }\r\n    const directives = Directives.defaultTemplate.forkShared();\r\n    if (extraDirectives.length > 0) {\r\n      directives.loadJson([...extraDirectives]);\r\n    }\r\n    return directives;\r\n  }\r\n\r\n  isDirective(name: string): boolean {\r\n    return this.directives.has(name.toLowerCase());\r\n  }\r\n\r\n  isCondition(name: string): boolean {\r\n    return this.conditions.has(name.toLowerCase());\r\n  }\r\n\r\n  isPaired(name: string): boolean {\r\n    const d = this.directives.get(name.toLowerCase());\r\n    if (!d) return false;\r\n    return d.role === StructureRole.Opening && d.terminators.length > 0 && d.terminator !== null;\r\n  }\r\n\r\n  isSwitch(name: string): boolean {\r\n    return this.getDirective(name)?.isSwitch ?? false;\r\n  }\r\n\r\n  isSwitchBranch(name: string): boolean {\r\n    return this.getDirective(name)?.isSwitchBranch ?? false;\r\n  }\r\n\r\n  isSwitchTerminator(name: string): boolean {\r\n    return this.getDirective(name)?.isSwitchTerminator ?? false;\r\n  }\r\n\r\n  isConditionalPair(name: string): boolean {\r\n    return this.getDirective(name)?.isConditionalPair ?? false;\r\n  }\r\n\r\n  isConditionalClose(name: string): boolean {\r\n    return this.getDirective(name)?.isConditionalClose ?? false;\r\n  }\r\n\r\n  isFinalTerminator(name: string): boolean {\r\n    return this.finalTerminators.has(name.toLowerCase());\r\n  }\r\n\r\n  getDirective(name: string): DiscoveredDirective | null {\r\n    return this.directives.get(name.toLowerCase()) ?? null;\r\n  }\r\n\r\n  getTerminator(name: string): string {\r\n    const lower = name.toLowerCase();\r\n    if (this.isFinalTerminator(lower)) return lower;\r\n\r\n    const d = this.directives.get(lower);\r\n    if (d?.terminator) return d.terminator;\r\n\r\n    return \"end\" + lower;\r\n  }\r\n\r\n  getTerminators(name: string): string[] {\r\n    const d = this.directives.get(name.toLowerCase());\r\n    if (!d) return [];\r\n    return d.terminators;\r\n  }\r\n\r\n  /** @internal */\r\n  getRegisteredDirectives(): DiscoveredDirective[] {\r\n    return [...this.directives.values()];\r\n  }\r\n\r\n  /** @internal */\r\n  getOpenersForTerminators(terminators: readonly string[]): string[] {\r\n    if (terminators.length === 0) {\r\n      return [];\r\n    }\r\n\r\n    const terminatorSet = new Set(terminators.map((name) => name.toLowerCase()));\r\n    const openers: string[] = [];\r\n    for (const directive of this.directives.values()) {\r\n      if (directive.role !== StructureRole.Opening) {\r\n        continue;\r\n      }\r\n      if (directive.terminators.some((terminator) => terminatorSet.has(terminator))) {\r\n        openers.push(directive.name.toLowerCase());\r\n      }\r\n    }\r\n\r\n    return openers;\r\n  }\r\n\r\n  getBranches(name: string): string[] {\r\n    const d = this.directives.get(name.toLowerCase());\r\n    if (!d || !d.isCondition) return [];\r\n    if (this.conditionBranchesCache === null) {\r\n      this.conditionBranchesCache = this.computeAllConditionBranches();\r\n    }\r\n    return this.conditionBranchesCache;\r\n  }\r\n\r\n  getSwitchBranches(switchName: string): string[] {\r\n    const lower = switchName.toLowerCase();\r\n    const cached = this.switchBranchesCache.get(lower);\r\n    if (cached) return cached;\r\n\r\n    const branches: string[] = [];\r\n    for (const d of this.directives.values()) {\r\n      if (d.switchParent === lower) {\r\n        branches.push(d.name);\r\n      }\r\n    }\r\n\r\n    this.switchBranchesCache.set(lower, branches);\r\n    return branches;\r\n  }\r\n\r\n  getConditionTerminators(): string[] {\r\n    if (this.conditionTerminatorsCache === null) {\r\n      const terminators: string[] = [];\r\n      for (const d of this.directives.values()) {\r\n        if (d.isCondition && d.role === StructureRole.Closing) {\r\n          terminators.push(d.name.toLowerCase());\r\n        }\r\n      }\r\n      this.conditionTerminatorsCache = terminators;\r\n    }\r\n    return this.conditionTerminatorsCache;\r\n  }\r\n\r\n  getPairingStrategy(name: string): string | null {\r\n    return this.getDirective(name)?.pairingStrategy ?? null;\r\n  }\r\n\r\n  /** @internal */\r\n  hasSeenDirective(name: string): boolean {\r\n    return this.seenDirectives.has(name.toLowerCase());\r\n  }\r\n\r\n  /** @internal */\r\n  hasAdvisoryPair(name: string): boolean {\r\n    return this.advisoryPairs.has(name.toLowerCase());\r\n  }\r\n\r\n  /** @internal */\r\n  hasAdvisoryCondition(name: string): boolean {\r\n    return this.advisoryConditions.has(name.toLowerCase());\r\n  }\r\n\r\n  registerDirective(name: string): void {\r\n    const lower = name.toLowerCase();\r\n    if (this.directives.has(lower)) return;\r\n    this.ensureMutable();\r\n    this.invalidateCaches();\r\n    this.directives.set(lower, createDirective({ name: lower }));\r\n  }\r\n\r\n  /**\r\n   * Discover custom paired directives from a token stream.\r\n   */\r\n  train(tokens: readonly Token[], source: string): void {\r\n    this.ensureMutable();\r\n    const found = new Map<string, boolean>();\r\n\r\n    for (const token of tokens) {\r\n      if (token.type !== TokenType.Directive) continue;\r\n      let name = source.slice(token.start, token.end).toLowerCase();\r\n      if (name.startsWith(\"@\")) name = name.slice(1);\r\n      this.seenDirectives.add(name);\r\n      found.set(name, true);\r\n    }\r\n\r\n    for (const directiveName of found.keys()) {\r\n      if (this.directives.has(directiveName)) continue;\r\n\r\n      const endName = \"end\" + directiveName;\r\n      const elseName = \"else\" + directiveName;\r\n      if (found.has(endName)) {\r\n        this.advisoryPairs.add(directiveName);\r\n      }\r\n      if (found.has(elseName)) {\r\n        this.advisoryConditions.add(directiveName);\r\n      }\r\n    }\r\n  }\r\n\r\n  loadJson(data: unknown[]): void {\r\n    this.ensureMutable();\r\n    for (const meta of data) {\r\n      if (!meta || typeof meta !== \"object\") continue;\r\n      const m = meta as Record<string, unknown>;\r\n\r\n      const argReq = this.parseArgumentRequirement(m.args);\r\n      const namesRaw = typeof m.name === \"string\" ? m.name : \"\";\r\n      const names = namesRaw\r\n        .split(\",\")\r\n        .map((s) => s.trim())\r\n        .filter(Boolean);\r\n\r\n      const structure =\r\n        typeof m.structure === \"object\" && m.structure !== null\r\n          ? (m.structure as Record<string, unknown>)\r\n          : null;\r\n\r\n      let role = StructureRole.None;\r\n      let isCondition = false;\r\n      let terminators: string[] = [];\r\n      let conditionLikeBranches: string[] = [];\r\n      let hasConditionLikeBranches = false;\r\n      let terminator: string | null = null;\r\n      let isSwitch = false;\r\n      let switchParent: string | null = null;\r\n      let isSwitchBranch = false;\r\n      let isSwitchTerminator = false;\r\n      let isConditionalPair = false;\r\n      let pairingStrategy: string | null = null;\r\n      let isConditionalClose = false;\r\n\r\n      if (structure) {\r\n        const roleVal = typeof structure.role === \"string\" ? structure.role : \"\";\r\n        role = this.parseStructureRole(roleVal);\r\n        isCondition = Boolean(structure.condition);\r\n\r\n        const termsVal = typeof structure.terminators === \"string\" ? structure.terminators : \"\";\r\n        const branchesVal = typeof structure.branches === \"string\" ? structure.branches : \"\";\r\n        terminators = this.parseTerminators(termsVal);\r\n        conditionLikeBranches = this.parseTerminators(branchesVal);\r\n        hasConditionLikeBranches = conditionLikeBranches.length > 0;\r\n\r\n        if (terminators.length > 0) {\r\n          terminator = terminators[terminators.length - 1];\r\n        }\r\n\r\n        if (structure.type === \"switch\") isSwitch = true;\r\n\r\n        if (typeof structure.parent === \"string\") {\r\n          switchParent = structure.parent.toLowerCase();\r\n        }\r\n\r\n        if (roleVal === \"branch\" && switchParent === \"switch\") {\r\n          isSwitchBranch = true;\r\n        }\r\n\r\n        if (roleVal === \"branch_terminator\" && switchParent === \"switch\") {\r\n          isSwitchTerminator = true;\r\n        }\r\n\r\n        if (roleVal === \"conditional_pair\") {\r\n          isConditionalPair = true;\r\n          if (typeof structure.pairing_strategy === \"string\") {\r\n            pairingStrategy = structure.pairing_strategy;\r\n          }\r\n        }\r\n\r\n        if (roleVal === \"conditional_close\") {\r\n          isConditionalClose = true;\r\n        }\r\n      }\r\n\r\n      for (const name of names) {\r\n        const directive = createDirective({\r\n          name,\r\n          args: argReq,\r\n          role,\r\n          isCondition,\r\n          terminators,\r\n          conditionLikeBranches,\r\n          hasConditionLikeBranches,\r\n          terminator,\r\n          isSwitch,\r\n          switchParent,\r\n          isSwitchBranch,\r\n          isSwitchTerminator,\r\n          isConditionalPair,\r\n          pairingStrategy,\r\n          isConditionalClose,\r\n        });\r\n        this.addDirective(directive);\r\n      }\r\n    }\r\n  }\r\n\r\n  private addDirective(directive: DiscoveredDirective): void {\r\n    this.ensureMutable();\r\n    this.invalidateCaches();\r\n    const name = directive.name.toLowerCase();\r\n\r\n    if (directive.role === StructureRole.Closing && directive.terminators.length === 0) {\r\n      this.finalTerminators.add(name);\r\n    }\r\n\r\n    this.directives.set(name, directive);\r\n\r\n    if (directive.isCondition) {\r\n      this.conditions.add(name);\r\n    }\r\n  }\r\n\r\n  private addPairedDirective(openName: string, closeName: string): void {\r\n    this.ensureMutable();\r\n    this.invalidateCaches();\r\n    const open = createDirective({\r\n      name: openName,\r\n      role: StructureRole.Opening,\r\n      terminators: [closeName],\r\n      terminator: closeName,\r\n    });\r\n\r\n    const close = createDirective({\r\n      name: closeName,\r\n      args: ArgumentRequirement.NotAllowed,\r\n      role: StructureRole.Closing,\r\n    });\r\n\r\n    this.directives.set(openName, open);\r\n    this.directives.set(closeName, close);\r\n  }\r\n\r\n  private addConditionDirective(condition: string): void {\r\n    this.ensureMutable();\r\n    this.invalidateCaches();\r\n    condition = condition.toLowerCase();\r\n    const elseCond = \"else\" + condition;\r\n    const endCond = \"end\" + condition;\r\n\r\n    this.conditions.add(condition);\r\n\r\n    this.directives.set(\r\n      condition,\r\n      createDirective({\r\n        name: condition,\r\n        args: ArgumentRequirement.Required,\r\n        role: StructureRole.Opening,\r\n        isCondition: true,\r\n        terminators: [elseCond, endCond],\r\n      }),\r\n    );\r\n\r\n    this.directives.set(\r\n      elseCond,\r\n      createDirective({\r\n        name: elseCond,\r\n        args: ArgumentRequirement.Required,\r\n        role: StructureRole.Mixed,\r\n        isCondition: true,\r\n        terminators: [elseCond, endCond],\r\n      }),\r\n    );\r\n\r\n    this.directives.set(\r\n      endCond,\r\n      createDirective({\r\n        name: endCond,\r\n        args: ArgumentRequirement.NotAllowed,\r\n        role: StructureRole.Closing,\r\n        isCondition: true,\r\n      }),\r\n    );\r\n  }\r\n\r\n  private computeAllConditionBranches(): string[] {\r\n    const branches = [\"else\"];\r\n    for (const d of this.directives.values()) {\r\n      if (d.isCondition && d.role === StructureRole.Opening) {\r\n        branches.push(...d.terminators);\r\n      }\r\n    }\r\n    return branches;\r\n  }\r\n\r\n  private parseTerminators(value: string): string[] {\r\n    return value\r\n      .split(\",\")\r\n      .map((s) => s.trim().toLowerCase())\r\n      .filter(Boolean);\r\n  }\r\n\r\n  private parseStructureRole(role: string): StructureRole {\r\n    switch (role) {\r\n      case \"open\":\r\n      case \"conditional_pair\":\r\n        return StructureRole.Opening;\r\n      case \"close\":\r\n      case \"conditional_close\":\r\n        return StructureRole.Closing;\r\n      case \"mixed\":\r\n        return StructureRole.Mixed;\r\n      default:\r\n        return StructureRole.None;\r\n    }\r\n  }\r\n\r\n  private parseArgumentRequirement(args: unknown): ArgumentRequirement {\r\n    if (args === null || args === undefined) return ArgumentRequirement.Optional;\r\n    if (args === true) return ArgumentRequirement.Required;\r\n    if (args === false) return ArgumentRequirement.NotAllowed;\r\n\r\n    if (typeof args === \"object\") {\r\n      const a = args as Record<string, unknown>;\r\n      if (!a.allowed) return ArgumentRequirement.NotAllowed;\r\n      if (a.required) return ArgumentRequirement.Required;\r\n    }\r\n\r\n    return ArgumentRequirement.Optional;\r\n  }\r\n\r\n  private invalidateCaches(): void {\r\n    this.conditionBranchesCache = null;\r\n    this.conditionTerminatorsCache = null;\r\n    this.switchBranchesCache.clear();\r\n  }\r\n\r\n  private forkShared(): Directives {\r\n    const copy = new Directives();\r\n    copy.directives = this.directives;\r\n    copy.conditions = this.conditions;\r\n    copy.finalTerminators = this.finalTerminators;\r\n    copy.seenDirectives = this.seenDirectives;\r\n    copy.advisoryPairs = this.advisoryPairs;\r\n    copy.advisoryConditions = this.advisoryConditions;\r\n    copy.conditionBranchesCache = this.conditionBranchesCache;\r\n    copy.conditionTerminatorsCache = this.conditionTerminatorsCache;\r\n    copy.switchBranchesCache = this.switchBranchesCache;\r\n    copy.shared = true;\r\n    return copy;\r\n  }\r\n\r\n  private ensureMutable(): void {\r\n    if (!this.shared) return;\r\n\r\n    this.directives = new Map(this.directives);\r\n    this.conditions = new Set(this.conditions);\r\n    this.finalTerminators = new Set(this.finalTerminators);\r\n    this.seenDirectives = new Set(this.seenDirectives);\r\n    this.advisoryPairs = new Set(this.advisoryPairs);\r\n    this.advisoryConditions = new Set(this.advisoryConditions);\r\n    this.conditionBranchesCache = this.conditionBranchesCache\r\n      ? [...this.conditionBranchesCache]\r\n      : null;\r\n    this.conditionTerminatorsCache = this.conditionTerminatorsCache\r\n      ? [...this.conditionTerminatorsCache]\r\n      : null;\r\n    this.switchBranchesCache = new Map(\r\n      [...this.switchBranchesCache.entries()].map(([key, value]) => [key, [...value]]),\r\n    );\r\n    this.shared = false;\r\n  }\r\n}\r\n\r\nconst BUNDLED_DIRECTIVES: unknown[][] = [\r\n  // conditions.json\r\n  [\r\n    {\r\n      name: \"if\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elseif,endif\" },\r\n    },\r\n    { name: \"elseif\", args: true, structure: { role: \"mixed\", terminators: \"elseif,endif\" } },\r\n    { name: \"else\", args: false, structure: { role: \"mixed\", terminators: \"endif\" } },\r\n    { name: \"endif\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"unless\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elseif,endunless\" },\r\n    },\r\n    { name: \"endunless\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"isset\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elseif,endIsset\" },\r\n    },\r\n    { name: \"endIsset\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"empty\",\r\n      args: true,\r\n      structure: { role: \"open\", terminators: \"endempty\", branches: \"else\" },\r\n    },\r\n    { name: \"endempty\", args: false, structure: { role: \"close\" } },\r\n    {\r\n      name: \"once\",\r\n      args: { allowed: true },\r\n      structure: { role: \"open\", condition: true, terminators: \"elseif,endif,endOnce\" },\r\n    },\r\n    { name: \"endOnce\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"pushIf\",\r\n      args: true,\r\n      structure: {\r\n        role: \"open\",\r\n        condition: true,\r\n        terminators: \"elsePushIf,elsePush,elseif,endPushIf\",\r\n      },\r\n    },\r\n    {\r\n      name: \"elsePushIf\",\r\n      args: true,\r\n      structure: {\r\n        role: \"mixed\",\r\n        condition: true,\r\n        terminators: \"elsePushIf,elsePush,elseif,endPushIf\",\r\n      },\r\n    },\r\n    {\r\n      name: \"elsePush\",\r\n      args: true,\r\n      structure: { role: \"mixed\", condition: true, terminators: \"endPushIf\" },\r\n    },\r\n    { name: \"endPushIf\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"hasStack\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elseif,endif\" },\r\n    },\r\n  ],\r\n  // auth.json\r\n  [\r\n    {\r\n      name: \"auth\",\r\n      args: { allowed: true },\r\n      structure: { role: \"open\", condition: true, terminators: \"elseauth,endauth\" },\r\n    },\r\n    {\r\n      name: \"elseauth\",\r\n      args: { allowed: true },\r\n      structure: { role: \"mixed\", condition: true, terminators: \"elseauth,endauth\" },\r\n    },\r\n    { name: \"endauth\", args: false, structure: { role: \"close\", condition: true } },\r\n  ],\r\n  // guest.json\r\n  [\r\n    {\r\n      name: \"guest\",\r\n      args: { allowed: true },\r\n      structure: { role: \"open\", condition: true, terminators: \"elseguest,endguest\" },\r\n    },\r\n    {\r\n      name: \"elseguest\",\r\n      args: { allowed: true },\r\n      structure: { role: \"mixed\", condition: true, terminators: \"elseguest,endguest\" },\r\n    },\r\n    { name: \"endguest\", args: false, structure: { role: \"close\", condition: true } },\r\n  ],\r\n  // authorizations.json\r\n  [\r\n    {\r\n      name: \"can\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elsecan,endcan\" },\r\n    },\r\n    {\r\n      name: \"elsecan\",\r\n      args: true,\r\n      structure: { role: \"mixed\", condition: true, terminators: \"elsecan,endcan\" },\r\n    },\r\n    { name: \"endcan\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"cannot\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elsecannot,endcannot\" },\r\n    },\r\n    {\r\n      name: \"elsecannot\",\r\n      args: true,\r\n      structure: { role: \"mixed\", condition: true, terminators: \"elsecannot,endcannot\" },\r\n    },\r\n    { name: \"endcannot\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"canany\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elsecanany,endcanany\" },\r\n    },\r\n    {\r\n      name: \"elsecanany\",\r\n      args: true,\r\n      structure: { role: \"mixed\", condition: true, terminators: \"elsecanany,endcanany\" },\r\n    },\r\n    { name: \"endcanany\", args: false, structure: { role: \"close\", condition: true } },\r\n  ],\r\n  // env.json\r\n  [\r\n    {\r\n      name: \"env\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elseenv,endenv\" },\r\n    },\r\n    { name: \"elseenv\", args: true, structure: { role: \"mixed\", condition: true } },\r\n    { name: \"endenv\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"production\",\r\n      args: false,\r\n      structure: { role: \"open\", condition: true, terminators: \"elseproduction,endproduction\" },\r\n    },\r\n    { name: \"elseproduction\", args: false, structure: { role: \"mixed\", condition: true } },\r\n    { name: \"endproduction\", args: false, structure: { role: \"close\", condition: true } },\r\n  ],\r\n  // for.json\r\n  [\r\n    { name: \"for\", args: true, structure: { role: \"open\", terminators: \"endfor\" } },\r\n    { name: \"endfor\", args: false, structure: { role: \"close\" } },\r\n  ],\r\n  // foreach.json\r\n  [\r\n    { name: \"foreach\", args: true, structure: { role: \"open\", terminators: \"endforeach\" } },\r\n    { name: \"endforeach\", args: false, structure: { role: \"close\" } },\r\n  ],\r\n  // forelse.json\r\n  [\r\n    {\r\n      name: \"forelse\",\r\n      args: true,\r\n      structure: { role: \"open\", terminators: \"endforelse\", branches: \"empty\" },\r\n    },\r\n    { name: \"endforelse\", args: false, structure: { role: \"close\" } },\r\n  ],\r\n  // while.json\r\n  [\r\n    { name: \"while\", args: true, structure: { role: \"open\", terminators: \"endwhile\" } },\r\n    { name: \"endwhile\", args: false, structure: { role: \"close\" } },\r\n  ],\r\n  // switch.json\r\n  [\r\n    { name: \"switch\", args: true, structure: { role: \"open\", type: \"switch\" } },\r\n    { name: \"case\", args: true, structure: { role: \"branch\", parent: \"switch\" } },\r\n    { name: \"default\", args: false, structure: { role: \"branch\", parent: \"switch\" } },\r\n    {\r\n      name: \"break\",\r\n      args: { allowed: true },\r\n      structure: { role: \"branch_terminator\", parent: \"switch\", optional: true },\r\n    },\r\n    { name: \"endSwitch\", args: false, structure: { role: \"close\" } },\r\n  ],\r\n  // error.json\r\n  [\r\n    {\r\n      name: \"error\",\r\n      args: true,\r\n      structure: { role: \"open\", terminators: \"enderror\", branches: \"else\" },\r\n    },\r\n    { name: \"enderror\", args: false, structure: { role: \"close\" } },\r\n  ],\r\n  // components.json\r\n  [\r\n    { name: \"props,aware\", args: true },\r\n    {\r\n      name: \"component\",\r\n      args: true,\r\n      structure: { role: \"open\", terminators: \"endComponent,endComponentClass\" },\r\n    },\r\n    {\r\n      name: \"endComponent,endComponentClass,endSlot,endComponentFirst\",\r\n      args: false,\r\n      structure: { role: \"close\" },\r\n    },\r\n    { name: \"slot\", args: true, structure: { role: \"open\", terminators: \"endSlot\" } },\r\n    {\r\n      name: \"componentFirst\",\r\n      args: true,\r\n      structure: { role: \"open\", terminators: \"endComponentFirst\" },\r\n    },\r\n  ],\r\n  // layouts.json\r\n  [\r\n    { name: \"extends,extendsFirst,yield\", args: true },\r\n    { name: \"parent\", args: false },\r\n    {\r\n      name: \"section\",\r\n      args: true,\r\n      structure: {\r\n        role: \"conditional_pair\",\r\n        terminators: \"show,append,overwrite,stop,endsection\",\r\n        pairing_strategy: \"section_style\",\r\n      },\r\n    },\r\n    {\r\n      name: \"show,append,overwrite,stop,endsection\",\r\n      args: false,\r\n      structure: { role: \"conditional_close\" },\r\n    },\r\n    {\r\n      name: \"hasSection,sectionMissing\",\r\n      args: true,\r\n      structure: {\r\n        role: \"open\",\r\n        condition: true,\r\n        terminators: \"elseif,else,endif,endhasSection,endsectionMissing\",\r\n      },\r\n    },\r\n    {\r\n      name: \"endhasSection,endsectionMissing\",\r\n      args: false,\r\n      structure: { role: \"close\", condition: true },\r\n    },\r\n  ],\r\n  // stacks.json\r\n  [\r\n    { name: \"stack\", args: true },\r\n    { name: \"push\", args: true, structure: { role: \"open\", terminators: \"endpush,endpushOnce\" } },\r\n    {\r\n      name: \"endpush,endpushOnce,endprepend,endprependOnce\",\r\n      args: false,\r\n      structure: { role: \"close\" },\r\n    },\r\n    {\r\n      name: \"pushOnce\",\r\n      args: true,\r\n      structure: { role: \"open\", terminators: \"endpush,endpushOnce\" },\r\n    },\r\n    {\r\n      name: \"prepend\",\r\n      args: true,\r\n      structure: { role: \"open\", terminators: \"endprepend,endprependOnce\" },\r\n    },\r\n    {\r\n      name: \"prependOnce\",\r\n      args: true,\r\n      structure: { role: \"open\", terminators: \"endprepend,endprependOnce\" },\r\n    },\r\n  ],\r\n  // fragments.json\r\n  [\r\n    { name: \"fragment\", args: true, structure: { role: \"open\", terminators: \"endfragment\" } },\r\n    { name: \"endfragment\", args: false, structure: { role: \"close\" } },\r\n  ],\r\n  // sessions.json\r\n  [\r\n    { name: \"session\", args: true, structure: { role: \"open\", terminators: \"endsession\" } },\r\n    { name: \"endsession\", args: false, structure: { role: \"close\" } },\r\n  ],\r\n  // contexts.json\r\n  [\r\n    { name: \"context\", args: true, structure: { role: \"open\", terminators: \"endcontext\" } },\r\n    { name: \"endcontext\", args: false, structure: { role: \"close\" } },\r\n  ],\r\n  // livewire.json\r\n  [\r\n    { name: \"persist\", args: true, structure: { role: \"open\", terminators: \"endpersist\" } },\r\n    { name: \"endpersist\", args: false, structure: { role: \"close\" } },\r\n    { name: \"teleport\", args: true, structure: { role: \"open\", terminators: \"endteleport\" } },\r\n    { name: \"endteleport\", args: false, structure: { role: \"close\" } },\r\n    { name: \"livewire\", args: true },\r\n    { name: \"livewireStyles,livewireScripts\", args: false },\r\n    { name: \"entangle\", args: true },\r\n    { name: \"this\" },\r\n    { name: \"volt\" },\r\n  ],\r\n  // spatie-permission.json\r\n  [\r\n    {\r\n      name: \"role\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elserole,endrole\" },\r\n    },\r\n    { name: \"endrole\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"hasrole\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elsehasrole,endhasrole\" },\r\n    },\r\n    { name: \"endhasrole\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"hasanyrole\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elsehasanyrole,endhasanyrole\" },\r\n    },\r\n    { name: \"endhasanyrole\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"hasallroles\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elsehasallroles,endhasallroles\" },\r\n    },\r\n    { name: \"endhasallroles\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"unlessrole\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elseunlessrole,endunlessrole\" },\r\n    },\r\n    { name: \"endunlessrole\", args: false, structure: { role: \"close\", condition: true } },\r\n  ],\r\n  // pennant.json (Feature Flags)\r\n  [\r\n    {\r\n      name: \"feature\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elsefeature,endfeature\" },\r\n    },\r\n    { name: \"endfeature\", args: false, structure: { role: \"close\", condition: true } },\r\n    {\r\n      name: \"featureany\",\r\n      args: true,\r\n      structure: { role: \"open\", condition: true, terminators: \"elsefeatureany,endfeatureany\" },\r\n    },\r\n    { name: \"endfeatureany\", args: false, structure: { role: \"close\", condition: true } },\r\n  ],\r\n  // translations.json\r\n  [\r\n    {\r\n      name: \"lang\",\r\n      structure: {\r\n        role: \"conditional_pair\",\r\n        terminators: \"endlang\",\r\n        pairing_strategy: \"lang_style\",\r\n      },\r\n    },\r\n    { name: \"choice\", args: true },\r\n    { name: \"endlang\", args: false, structure: { role: \"conditional_close\" } },\r\n  ],\r\n  // verbatim.json\r\n  [\r\n    { name: \"verbatim\", args: false, structure: { role: \"open\", terminators: \"endverbatim\" } },\r\n    { name: \"endverbatim\", args: false, structure: { role: \"close\" } },\r\n  ],\r\n  // includes.json\r\n  [\r\n    { name: \"each\", args: true },\r\n    { name: \"include\", args: true },\r\n    { name: \"includeIf\", args: true },\r\n    { name: \"includeWhen\", args: true },\r\n    { name: \"includeUnless\", args: true },\r\n    { name: \"includeFirst\", args: true },\r\n    { name: \"includeIsolated\", args: true },\r\n  ],\r\n  // basic.json\r\n  [\r\n    { name: \"csrf\", args: false },\r\n    { name: \"method\", args: true },\r\n    { name: \"inject\", args: true },\r\n    { name: \"dd\", args: true },\r\n    { name: \"dump\", args: true },\r\n    { name: \"js\", args: true },\r\n    { name: \"json\", args: true },\r\n    { name: \"vite\", args: { allowed: true } },\r\n    { name: \"viteReactRefresh\", args: false },\r\n    { name: \"fonts\", args: { allowed: true } },\r\n    { name: \"bool\", args: true },\r\n    { name: \"class\", args: true },\r\n    { name: \"style\", args: true },\r\n    { name: \"selected\", args: true },\r\n    { name: \"checked\", args: true },\r\n    { name: \"disabled\", args: true },\r\n    { name: \"required\", args: true },\r\n    { name: \"readonly\", args: true },\r\n    { name: \"old\", args: true },\r\n    { name: \"use\", args: true },\r\n    { name: \"unset\", args: true },\r\n    { name: \"inertia\", args: true },\r\n    { name: \"inertiaHead\" },\r\n    { name: \"filamentStyles,filamentScripts\", args: false },\r\n    { name: \"svg\", args: true },\r\n    { name: \"paddleJS\", args: false },\r\n    { name: \"continue\" },\r\n    { name: \"php\", args: { allowed: true }, structure: { role: \"open\", terminators: \"endphp\" } },\r\n    { name: \"endphp\", args: false, structure: { role: \"close\" } },\r\n  ],\r\n];\r\n","import { TokenType, type Token } from \"../lexer/types.js\";\nimport type { Directives } from \"./directives.js\";\n\nexport function extractDirectiveName(token: Token, source: string): string {\n  let text = source.slice(token.start, token.end);\n  if (text.startsWith(\"@\")) text = text.slice(1);\n  return text.toLowerCase();\n}\n\nexport function getTerminatorName(directiveName: string, directives: Directives | null): string {\n  if (directives !== null) {\n    return directives.getTerminator(directiveName);\n  }\n  return \"end\" + directiveName;\n}\n\nexport function getTerminatorNames(directiveName: string, directives: Directives | null): string[] {\n  if (directives !== null) {\n    const directive = directives.getDirective(directiveName);\n    if (directive !== null && directive.terminators.length > 0) {\n      return [...directive.terminators];\n    }\n  }\n  return [\"end\" + directiveName];\n}\n\n/**\n * Check for DirectiveArgs token following a directive.\n *\n * Handles optional whitespace between directive and args:\n *   `@if ($x)`  - whitespace then DirectiveArgs\n *   `@if($x)`   - DirectiveArgs immediately\n */\nexport function checkDirectiveArgs(\n  tokens: readonly Token[],\n  source: string,\n  startIdx: number,\n  endIdx: number,\n): { hasArgs: boolean; argsContent: string | null; consumed: number } {\n  const fast = checkDirectiveArgsFast(tokens, startIdx, endIdx);\n  if (!fast.hasArgs || fast.argsTokenIndex === -1) {\n    return { hasArgs: false, argsContent: null, consumed: fast.consumed };\n  }\n  const argsToken = tokens[fast.argsTokenIndex];\n  return {\n    hasArgs: true,\n    argsContent: source.slice(argsToken.start, argsToken.end),\n    consumed: fast.consumed,\n  };\n}\n\nexport function checkDirectiveArgsFast(\n  tokens: readonly Token[],\n  startIdx: number,\n  endIdx: number,\n): { hasArgs: boolean; argsTokenIndex: number; consumed: number } {\n  let consumed = 0;\n  let checkIdx = startIdx;\n\n  // Skip optional whitespace before args.\n  if (checkIdx < endIdx && tokens[checkIdx].type === TokenType.Whitespace) {\n    if (checkIdx + 1 < endIdx && tokens[checkIdx + 1].type === TokenType.DirectiveArgs) {\n      consumed++;\n      checkIdx++;\n    }\n  }\n\n  if (checkIdx < endIdx && tokens[checkIdx].type === TokenType.DirectiveArgs) {\n    consumed++;\n    return { hasArgs: true, argsTokenIndex: checkIdx, consumed };\n  }\n\n  return { hasArgs: false, argsTokenIndex: -1, consumed };\n}\n\n/**\n * Find a matching terminator for a directive (nesting-aware).\n *\n * Scans forward through tokens, tracking nesting depth of the same\n * directive name, and returns the token index of the matching terminator.\n */\nexport function findMatchingTerminator(\n  directiveName: string,\n  tokens: readonly Token[],\n  source: string,\n  startIdx: number,\n  endIdx: number,\n  directives: Directives | null,\n  maxLookahead = Infinity,\n): number | null {\n  const terminators = getTerminatorNames(directiveName, directives);\n  const primaryTerminator = getTerminatorName(directiveName, directives);\n  const needle = directiveName.toLowerCase();\n\n  let nesting = 0;\n  let checked = 0;\n  const limit = Math.min(endIdx, tokens.length);\n\n  for (let i = startIdx; i < limit; i++) {\n    if (tokens[i].type !== TokenType.Directive) continue;\n\n    checked++;\n    if (checked > maxLookahead) break;\n\n    const name = extractDirectiveName(tokens[i], source);\n\n    if (name === needle) {\n      nesting++;\n      continue;\n    }\n\n    if (terminators.includes(name) || name === primaryTerminator) {\n      if (nesting === 0) return i;\n      nesting--;\n    }\n  }\n\n  return null;\n}\n","import { TokenType, type Token } from \"../lexer/types.js\";\r\nimport { checkDirectiveArgsFast } from \"./directive-helper.js\";\r\n\r\ntype BranchBoundaryPredicate = (tokenIdx: number, name: string) => boolean;\r\ntype DirectiveIncludePredicate = (tokenIdx: number) => boolean;\r\n\r\nexport class DirectiveTokenIndex {\r\n  private byName = new Map<string, number[]>();\r\n  private allPositions: number[] = [];\r\n  private allNames: string[] = [];\r\n  private nameSetCache = new Map<string, Set<string>>();\r\n  private hasArgsByPosition = new Map<number, boolean>();\r\n\r\n  constructor(\r\n    tokens: readonly Token[],\r\n    source: string,\r\n    shouldInclude: DirectiveIncludePredicate = () => true,\r\n  ) {\r\n    for (let i = 0; i < tokens.length; i++) {\r\n      if (tokens[i].type !== TokenType.Directive) continue;\r\n      if (!shouldInclude(i)) continue;\r\n      const name = this.extractName(tokens[i], source);\r\n      this.allPositions.push(i);\r\n      this.allNames.push(name);\r\n      this.hasArgsByPosition.set(i, checkDirectiveArgsFast(tokens, i + 1, tokens.length).hasArgs);\r\n      let positions = this.byName.get(name);\r\n      if (!positions) {\r\n        positions = [];\r\n        this.byName.set(name, positions);\r\n      }\r\n      positions.push(i);\r\n    }\r\n  }\r\n\r\n  getPositionsAfter(name: string, minIdx: number): number[] {\r\n    name = name.toLowerCase();\r\n    const positions = this.byName.get(name);\r\n    if (!positions) return [];\r\n\r\n    const firstIdx = this.binarySearchGte(positions, minIdx);\r\n    if (firstIdx === null) return [];\r\n\r\n    return positions.slice(firstIdx);\r\n  }\r\n\r\n  existsAfter(name: string, minIdx: number): boolean {\r\n    name = name.toLowerCase();\r\n    const positions = this.byName.get(name);\r\n    if (!positions || positions.length === 0) return false;\r\n    if (positions[positions.length - 1] < minIdx) return false;\r\n    return this.binarySearchGte(positions, minIdx) !== null;\r\n  }\r\n\r\n  existsBetween(name: string, minIdx: number, maxIdxExclusive: number): boolean {\r\n    name = name.toLowerCase();\r\n    const positions = this.byName.get(name);\r\n    if (!positions || positions.length === 0) return false;\r\n    if (positions[positions.length - 1] < minIdx) return false;\r\n\r\n    const firstIdx = this.binarySearchGte(positions, minIdx);\r\n    if (firstIdx === null) return false;\r\n\r\n    return positions[firstIdx] < maxIdxExclusive;\r\n  }\r\n\r\n  hasArgs(position: number): boolean {\r\n    return this.hasArgsByPosition.get(position) === true;\r\n  }\r\n\r\n  findMatchingTerminator(\r\n    directiveName: string,\r\n    startIdx: number,\r\n    terminators: string[],\r\n    maxIdxExclusive: number | null = null,\r\n    initialNesting = 0,\r\n  ): number | null {\r\n    return this.findMatchingTerminatorForOpeners(\r\n      [directiveName],\r\n      startIdx,\r\n      terminators,\r\n      maxIdxExclusive,\r\n      initialNesting,\r\n    );\r\n  }\r\n\r\n  findMatchingTerminatorForOpeners(\r\n    openerNames: string[],\r\n    startIdx: number,\r\n    terminators: string[],\r\n    maxIdxExclusive: number | null = null,\r\n    initialNesting = 0,\r\n  ): number | null {\r\n    const firstIdx = this.binarySearchGte(this.allPositions, startIdx);\r\n    if (firstIdx === null) return null;\r\n\r\n    const openerSet = this.getNameSet(openerNames);\r\n    const terminatorSet = this.getNameSet(terminators);\r\n\r\n    let nesting = initialNesting;\r\n    for (let i = firstIdx; i < this.allPositions.length; i++) {\r\n      if (maxIdxExclusive !== null && this.allPositions[i] >= maxIdxExclusive) {\r\n        return null;\r\n      }\r\n\r\n      const name = this.allNames[i];\r\n      if (openerSet.has(name)) {\r\n        nesting++;\r\n        continue;\r\n      }\r\n      if (!terminatorSet.has(name)) continue;\r\n      if (nesting === 0) return this.allPositions[i];\r\n      nesting--;\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  hasTerminator(\r\n    directiveName: string,\r\n    startIdx: number,\r\n    terminators: string[],\r\n    maxIdxExclusive: number | null = null,\r\n  ): boolean {\r\n    return (\r\n      this.findMatchingTerminator(directiveName, startIdx, terminators, maxIdxExclusive) !== null\r\n    );\r\n  }\r\n\r\n  findMatchingBoundary(\r\n    directiveName: string,\r\n    startIdx: number,\r\n    terminatorNames: string[],\r\n    branchNames: string[] = [],\r\n    maxIdxExclusive: number | null = null,\r\n    initialNesting = 0,\r\n  ): number | null {\r\n    return this.findMatchingBoundaryForOpeners(\r\n      [directiveName],\r\n      startIdx,\r\n      terminatorNames,\r\n      branchNames,\r\n      maxIdxExclusive,\r\n      initialNesting,\r\n    );\r\n  }\r\n\r\n  findMatchingBoundaryForOpeners(\r\n    openerNames: string[],\r\n    startIdx: number,\r\n    terminatorNames: string[],\r\n    branchNames: string[] = [],\r\n    maxIdxExclusive: number | null = null,\r\n    initialNesting = 0,\r\n    shouldCountBranch?: BranchBoundaryPredicate,\r\n  ): number | null {\r\n    const firstIdx = this.binarySearchGte(this.allPositions, startIdx);\r\n    if (firstIdx === null) return null;\r\n\r\n    const openerSet = this.getNameSet(openerNames);\r\n    const terminatorSet = this.getNameSet(terminatorNames);\r\n    const branchSet = this.getNameSet(branchNames);\r\n\r\n    let nesting = initialNesting;\r\n    for (let i = firstIdx; i < this.allPositions.length; i++) {\r\n      if (maxIdxExclusive !== null && this.allPositions[i] >= maxIdxExclusive) {\r\n        return null;\r\n      }\r\n\r\n      const name = this.allNames[i];\r\n      if (openerSet.has(name)) {\r\n        nesting++;\r\n        continue;\r\n      }\r\n\r\n      if (branchSet.has(name)) {\r\n        if (nesting === 0) {\r\n          const position = this.allPositions[i];\r\n          if (!shouldCountBranch || shouldCountBranch(position, name)) {\r\n            return position;\r\n          }\r\n        }\r\n        continue;\r\n      }\r\n\r\n      if (!terminatorSet.has(name)) continue;\r\n      if (nesting === 0) {\r\n        return this.allPositions[i];\r\n      }\r\n      nesting--;\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  analyzeUnknownDirective(\r\n    directiveName: string,\r\n    startIdx: number,\r\n    terminatorNames: string[],\r\n    branchNames: string[] = [],\r\n    maxIdxExclusive: number | null = null,\r\n  ): { terminatorIdx: number | null; terminatorName: string | null; branchIdx: number | null } {\r\n    return this.analyzeUnknownDirectiveFamily(\r\n      [directiveName],\r\n      startIdx,\r\n      terminatorNames,\r\n      branchNames,\r\n      maxIdxExclusive,\r\n    );\r\n  }\r\n\r\n  analyzeUnknownDirectiveFamily(\r\n    openerNames: string[],\r\n    startIdx: number,\r\n    terminatorNames: string[],\r\n    branchNames: string[] = [],\r\n    maxIdxExclusive: number | null = null,\r\n  ): { terminatorIdx: number | null; terminatorName: string | null; branchIdx: number | null } {\r\n    const openerSet = this.getNameSet(openerNames);\r\n    const terminatorSet = this.getNameSet(terminatorNames);\r\n    const branchSet = this.getNameSet(branchNames);\r\n\r\n    const firstIdx = this.binarySearchGte(this.allPositions, startIdx);\r\n    if (firstIdx === null) {\r\n      return { terminatorIdx: null, terminatorName: null, branchIdx: null };\r\n    }\r\n\r\n    let nesting = 0;\r\n    let branchIdx: number | null = null;\r\n\r\n    for (let i = firstIdx; i < this.allPositions.length; i++) {\r\n      if (maxIdxExclusive !== null && this.allPositions[i] >= maxIdxExclusive) {\r\n        return { terminatorIdx: null, terminatorName: null, branchIdx: null };\r\n      }\r\n\r\n      const name = this.allNames[i];\r\n      if (openerSet.has(name)) {\r\n        nesting++;\r\n        continue;\r\n      }\r\n\r\n      if (terminatorSet.has(name)) {\r\n        if (nesting === 0) {\r\n          return {\r\n            terminatorIdx: this.allPositions[i],\r\n            terminatorName: name,\r\n            branchIdx,\r\n          };\r\n        }\r\n        nesting--;\r\n        continue;\r\n      }\r\n\r\n      if (branchSet.has(name) && nesting === 0 && branchIdx === null) {\r\n        branchIdx = this.allPositions[i];\r\n      }\r\n    }\r\n\r\n    return { terminatorIdx: null, terminatorName: null, branchIdx: null };\r\n  }\r\n\r\n  private extractName(token: Token, source: string): string {\r\n    let text = source.slice(token.start, token.end);\r\n    if (text.startsWith(\"@\")) text = text.slice(1);\r\n    return text.toLowerCase();\r\n  }\r\n\r\n  private getNameSet(names: string[]): Set<string> {\r\n    const key = names.join(\"|\").toLowerCase();\r\n    const cached = this.nameSetCache.get(key);\r\n    if (cached) return cached;\r\n\r\n    const set = new Set<string>();\r\n    for (const name of names) {\r\n      set.add(name.toLowerCase());\r\n    }\r\n    this.nameSetCache.set(key, set);\r\n    return set;\r\n  }\r\n\r\n  private binarySearchGte(arr: number[], target: number): number | null {\r\n    let lo = 0;\r\n    let hi = arr.length - 1;\r\n    let result: number | null = null;\r\n\r\n    while (lo <= hi) {\r\n      const mid = (lo + hi) >>> 1;\r\n      if (arr[mid] >= target) {\r\n        result = mid;\r\n        hi = mid - 1;\r\n      } else {\r\n        lo = mid + 1;\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n}\r\n","function isWhitespace(ch: string): boolean {\n  return ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\";\n}\n\nfunction skipWhitespace(str: string, pos: number): number {\n  while (pos < str.length && isWhitespace(str[pos])) pos++;\n  return pos;\n}\n\nfunction skipQuotedString(str: string, pos: number, quote: string): number {\n  while (pos < str.length) {\n    if (str[pos] === \"\\\\\") {\n      pos += 2;\n      continue;\n    }\n    if (str[pos] === quote) {\n      pos++;\n      return pos;\n    }\n    pos++;\n  }\n  return pos;\n}\n\nfunction isHeredocStart(str: string, pos: number): boolean {\n  return pos + 2 < str.length && str[pos] === \"<\" && str[pos + 1] === \"<\" && str[pos + 2] === \"<\";\n}\n\nfunction skipHeredoc(str: string, pos: number): number {\n  // Skip past the identifier and newline, then scan for matching end\n  let identStart = pos;\n  while (identStart < str.length && isWhitespace(str[identStart])) identStart++;\n\n  const isNowdoc = identStart < str.length && str[identStart] === \"'\";\n  if (isNowdoc) identStart++;\n\n  let identEnd = identStart;\n  while (identEnd < str.length && /[a-zA-Z0-9_]/.test(str[identEnd])) identEnd++;\n\n  const ident = str.slice(identStart, identEnd);\n  if (ident.length === 0) return pos;\n\n  // Skip to end of line\n  pos = identEnd;\n  if (isNowdoc && pos < str.length && str[pos] === \"'\") pos++;\n  while (pos < str.length && str[pos] !== \"\\n\") pos++;\n  if (pos < str.length) pos++; // skip newline\n\n  // Scan for identifier at start of line\n  while (pos < str.length) {\n    const lineStart = pos;\n    let checkPos = lineStart;\n    while (checkPos < str.length && (str[checkPos] === \" \" || str[checkPos] === \"\\t\")) checkPos++;\n\n    if (str.startsWith(ident, checkPos)) {\n      const afterIdent = checkPos + ident.length;\n      if (afterIdent >= str.length || str[afterIdent] === \";\" || str[afterIdent] === \"\\n\") {\n        return afterIdent < str.length ? afterIdent + 1 : afterIdent;\n      }\n    }\n\n    // Skip to next line\n    while (pos < str.length && str[pos] !== \"\\n\") pos++;\n    if (pos < str.length) pos++;\n  }\n\n  return pos;\n}\n\n/**\n * Count top-level arguments in a directive argument string.\n * The string should not include outer parentheses.\n */\nexport function countArguments(args: string): number {\n  const len = args.length;\n  if (len === 0) return 0;\n\n  let pos = skipWhitespace(args, 0);\n  if (pos >= len) return 0;\n\n  let count = 1;\n  let depth = 0;\n\n  while (pos < len) {\n    const ch = args[pos];\n\n    if (ch === '\"' || ch === \"'\") {\n      pos = skipQuotedString(args, pos + 1, ch);\n      continue;\n    }\n\n    if (isHeredocStart(args, pos)) {\n      pos = skipHeredoc(args, pos + 3);\n      continue;\n    }\n\n    if (ch === \"(\" || ch === \"[\" || ch === \"{\") {\n      depth++;\n      pos++;\n      continue;\n    }\n\n    if (ch === \")\" || ch === \"]\" || ch === \"}\") {\n      depth--;\n      pos++;\n      continue;\n    }\n\n    if (ch === \",\" && depth === 0) {\n      count++;\n    }\n\n    pos++;\n  }\n\n  return count;\n}\n\nexport function startsWithArray(args: string): boolean {\n  const pos = skipWhitespace(args, 0);\n  return pos < args.length && args[pos] === \"[\";\n}\n\nexport function isSimpleString(args: string): boolean {\n  let pos = skipWhitespace(args, 0);\n  if (pos >= args.length) return false;\n\n  const ch = args[pos];\n  if (ch !== '\"' && ch !== \"'\") return false;\n\n  pos = skipQuotedString(args, pos + 1, ch);\n  pos = skipWhitespace(args, pos);\n\n  return pos >= args.length;\n}\n\nexport function unwrapParentheses(args: string): string {\n  const trimmed = args.trim();\n  if (trimmed.startsWith(\"(\") && trimmed.endsWith(\")\")) {\n    return trimmed.slice(1, -1);\n  }\n  return trimmed;\n}\n","export type ScriptScanState =\r\n  | \"code\"\r\n  | \"single\"\r\n  | \"double\"\r\n  | \"template\"\r\n  | \"lineComment\"\r\n  | \"blockComment\"\r\n  | \"regex\"\r\n  | \"regexClass\";\r\n\r\nexport function isLikelyInsideScriptLiteralOrComment(\r\n  source: string,\r\n  contentStart: number,\r\n  offset: number,\r\n): boolean {\r\n  return getScriptScanStateAtOffset(source, contentStart, offset) !== \"code\";\r\n}\r\n\r\nexport function isLikelyInsideScriptComment(\r\n  source: string,\r\n  contentStart: number,\r\n  offset: number,\r\n): boolean {\r\n  const state = getScriptScanStateAtOffset(source, contentStart, offset);\r\n  return state === \"lineComment\" || state === \"blockComment\";\r\n}\r\n\r\nfunction getScriptScanStateAtOffset(\r\n  source: string,\r\n  contentStart: number,\r\n  offset: number,\r\n): ScriptScanState {\r\n  let state: ScriptScanState = \"code\";\r\n  const templateExpressionDepthStack: number[] = [];\r\n\r\n  for (let i = contentStart; i < offset; i++) {\r\n    const ch = source[i];\r\n    const next = i + 1 < offset ? source[i + 1] : \"\";\r\n\r\n    if (state === \"lineComment\") {\r\n      if (ch === \"\\n\") {\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"blockComment\") {\r\n      if (ch === \"*\" && next === \"/\") {\r\n        state = \"code\";\r\n        i++;\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"single\") {\r\n      if (ch === \"\\\\\") {\r\n        i++;\r\n        continue;\r\n      }\r\n      if (ch === \"'\") {\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"double\") {\r\n      if (ch === \"\\\\\") {\r\n        i++;\r\n        continue;\r\n      }\r\n      if (ch === '\"') {\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"template\") {\r\n      if (ch === \"\\\\\") {\r\n        i++;\r\n        continue;\r\n      }\r\n      if (ch === \"$\" && next === \"{\") {\r\n        templateExpressionDepthStack.push(1);\r\n        state = \"code\";\r\n        i++;\r\n        continue;\r\n      }\r\n      if (ch === \"`\") {\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"regex\") {\r\n      if (ch === \"\\\\\") {\r\n        i++;\r\n        continue;\r\n      }\r\n      if (ch === \"[\") {\r\n        state = \"regexClass\";\r\n        continue;\r\n      }\r\n      if (ch === \"/\") {\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"regexClass\") {\r\n      if (ch === \"\\\\\") {\r\n        i++;\r\n        continue;\r\n      }\r\n      if (ch === \"]\") {\r\n        state = \"regex\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    // code state\r\n    if (templateExpressionDepthStack.length > 0) {\r\n      if (ch === \"{\") {\r\n        templateExpressionDepthStack[templateExpressionDepthStack.length - 1]++;\r\n        continue;\r\n      }\r\n\r\n      if (ch === \"}\") {\r\n        templateExpressionDepthStack[templateExpressionDepthStack.length - 1]--;\r\n        if (templateExpressionDepthStack[templateExpressionDepthStack.length - 1] === 0) {\r\n          templateExpressionDepthStack.pop();\r\n          state = \"template\";\r\n        }\r\n        continue;\r\n      }\r\n    }\r\n\r\n    if (ch === \"/\" && next === \"/\") {\r\n      state = \"lineComment\";\r\n      i++;\r\n      continue;\r\n    }\r\n    if (ch === \"/\" && next === \"*\") {\r\n      state = \"blockComment\";\r\n      i++;\r\n      continue;\r\n    }\r\n    if (\r\n      ch === \"/\" &&\r\n      next !== \"/\" &&\r\n      next !== \"*\" &&\r\n      isLikelyRegexLiteralStart(source, contentStart, i)\r\n    ) {\r\n      state = \"regex\";\r\n      continue;\r\n    }\r\n    if (ch === \"'\") {\r\n      state = \"single\";\r\n      continue;\r\n    }\r\n    if (ch === '\"') {\r\n      state = \"double\";\r\n      continue;\r\n    }\r\n    if (ch === \"`\") {\r\n      state = \"template\";\r\n    }\r\n  }\r\n\r\n  return state;\r\n}\r\n\r\nconst REGEX_PREFIX_KEYWORDS = new Set([\r\n  \"return\",\r\n  \"throw\",\r\n  \"do\",\r\n  \"case\",\r\n  \"delete\",\r\n  \"void\",\r\n  \"typeof\",\r\n  \"instanceof\",\r\n  \"in\",\r\n  \"of\",\r\n  \"yield\",\r\n  \"await\",\r\n  \"else\",\r\n]);\r\n\r\nconst REGEX_AFTER_PAREN_KEYWORDS = new Set([\"if\", \"while\", \"for\", \"with\", \"catch\"]);\r\nconst IDENTIFIER_PART_RE = /^[$_\\p{ID_Continue}]$/u;\r\n\r\nfunction isIdentifierPart(ch: string): boolean {\r\n  return IDENTIFIER_PART_RE.test(ch);\r\n}\r\n\r\nfunction previousNonWhitespaceIndex(\r\n  source: string,\r\n  contentStart: number,\r\n  startExclusive: number,\r\n): number {\r\n  for (let i = startExclusive - 1; i >= contentStart; i--) {\r\n    const ch = source[i];\r\n    if (ch === \" \" || ch === \"\\t\" || ch === \"\\r\" || ch === \"\\n\") {\r\n      continue;\r\n    }\r\n    return i;\r\n  }\r\n\r\n  return -1;\r\n}\r\n\r\nfunction getPreviousIdentifierToken(\r\n  source: string,\r\n  contentStart: number,\r\n  index: number,\r\n): { token: string; start: number } | null {\r\n  if (index < contentStart || !isIdentifierPart(source[index])) {\r\n    return null;\r\n  }\r\n\r\n  let tokenStart = index;\r\n  while (tokenStart - 1 >= contentStart && isIdentifierPart(source[tokenStart - 1])) {\r\n    tokenStart--;\r\n  }\r\n\r\n  return {\r\n    token: source.slice(tokenStart, index + 1),\r\n    start: tokenStart,\r\n  };\r\n}\r\n\r\nfunction isRegexAfterConditionParen(\r\n  source: string,\r\n  contentStart: number,\r\n  closeParenIndex: number,\r\n): boolean {\r\n  let depth = 0;\r\n  let openParenIndex = -1;\r\n\r\n  for (let i = closeParenIndex; i >= contentStart; i--) {\r\n    const ch = source[i];\r\n    if (ch === \")\") {\r\n      depth++;\r\n      continue;\r\n    }\r\n\r\n    if (ch === \"(\") {\r\n      depth--;\r\n      if (depth === 0) {\r\n        openParenIndex = i;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  if (openParenIndex < 0) {\r\n    return false;\r\n  }\r\n\r\n  let i = openParenIndex - 1;\r\n  while (i >= contentStart) {\r\n    const ch = source[i];\r\n    if (ch === \" \" || ch === \"\\t\" || ch === \"\\r\" || ch === \"\\n\") {\r\n      i--;\r\n      continue;\r\n    }\r\n\r\n    const tokenInfo = getPreviousIdentifierToken(source, contentStart, i);\r\n    if (!tokenInfo) {\r\n      return false;\r\n    }\r\n\r\n    return REGEX_AFTER_PAREN_KEYWORDS.has(tokenInfo.token);\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\nfunction isLikelyRegexLiteralStart(\r\n  source: string,\r\n  contentStart: number,\r\n  slashIndex: number,\r\n): boolean {\r\n  for (let i = slashIndex - 1; i >= contentStart; i--) {\r\n    const ch = source[i];\r\n    if (ch === \" \" || ch === \"\\t\" || ch === \"\\r\" || ch === \"\\n\") {\r\n      continue;\r\n    }\r\n\r\n    // A slash after a completed string/template literal is division, not regex.\r\n    if (ch === \"'\" || ch === '\"' || ch === \"`\") {\r\n      return false;\r\n    }\r\n\r\n    if (isIdentifierPart(ch)) {\r\n      const tokenInfo = getPreviousIdentifierToken(source, contentStart, i);\r\n      return tokenInfo !== null && REGEX_PREFIX_KEYWORDS.has(tokenInfo.token);\r\n    }\r\n\r\n    if (ch === \")\") {\r\n      return isRegexAfterConditionParen(source, contentStart, i);\r\n    }\r\n\r\n    if (ch === \"+\" || ch === \"-\") {\r\n      const beforeIndex = previousNonWhitespaceIndex(source, contentStart, i);\r\n      if (beforeIndex >= contentStart && source[beforeIndex] === ch) {\r\n        return false;\r\n      }\r\n      return true;\r\n    }\r\n\r\n    if (ch === \"]\" || ch === \"}\") {\r\n      return false;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  return true;\r\n}\r\n","export function hasSwallowedTagSyntaxInOpeningSource(openingSource: string): boolean {\r\n  const firstNewlineIdx = openingSource.search(/[\\r\\n]/u);\r\n  if (firstNewlineIdx < 0) {\r\n    return false;\r\n  }\r\n\r\n  const tagPattern = /<(?!\\/)([A-Za-z][\\w:-]*)/gu;\r\n  const sourceAfterNewline = openingSource.slice(firstNewlineIdx);\r\n  return tagPattern.test(sourceAfterNewline);\r\n}\r\n","import { TokenType, type Token } from \"../lexer/types.js\";\r\nimport {\r\n  NodeKind,\r\n  StructureRole,\r\n  NONE,\r\n  createFlatNode,\r\n  type FlatNode,\r\n  type BuildResult,\r\n  type DirectiveFrame,\r\n  type ConditionFrame,\r\n  type SwitchFrame,\r\n} from \"./types.js\";\r\nimport { VOID_ELEMENTS } from \"./void-elements.js\";\r\nimport * as OptionalTags from \"./optional-tags.js\";\r\nimport * as Constructs from \"./construct-scanner.js\";\r\nimport { Directives } from \"./directives.js\";\r\nimport { extractDirectiveName, checkDirectiveArgsFast } from \"./directive-helper.js\";\r\nimport { DirectiveTokenIndex } from \"./directive-token-index.js\";\r\nimport { countArguments, startsWithArray, unwrapParentheses } from \"./argument-scanner.js\";\r\nimport { isLikelyInsideScriptLiteralOrComment } from \"../rawtext-script-scanner.js\";\r\nimport { hasSwallowedTagSyntaxInOpeningSource } from \"../malformed-tags.js\";\r\n\r\ntype PhpTagShorthandRole = \"open\" | \"branch\" | \"close\";\r\ntype PhpTagShorthandContext = \"if\" | \"switch\" | \"for\" | \"foreach\" | \"while\" | \"declare\";\r\n\r\ninterface PhpTagShorthandMatch {\r\n  role: PhpTagShorthandRole;\r\n  name: string;\r\n  context: PhpTagShorthandContext;\r\n}\r\n\r\nfunction classifyPhpTagShorthand(source: string): PhpTagShorthandMatch | null {\r\n  const phpTagMatch = source.match(/^<\\?(php)\\s*([\\s\\S]*?)\\s*\\?>$/i);\r\n  if (!phpTagMatch) return null;\r\n\r\n  const body = phpTagMatch[2]?.trim() ?? \"\";\r\n  if (body.length === 0) return null;\r\n\r\n  if (/^if\\b[\\s\\S]*:\\s*$/iu.test(body)) {\r\n    return { role: \"open\", name: \"if\", context: \"if\" };\r\n  }\r\n  if (/^elseif\\b[\\s\\S]*:\\s*$/iu.test(body)) {\r\n    return { role: \"branch\", name: \"elseif\", context: \"if\" };\r\n  }\r\n  if (/^else\\s*:\\s*$/iu.test(body)) {\r\n    return { role: \"branch\", name: \"else\", context: \"if\" };\r\n  }\r\n  if (/^endif\\s*;?\\s*$/iu.test(body)) {\r\n    return { role: \"close\", name: \"endif\", context: \"if\" };\r\n  }\r\n\r\n  if (/^switch\\b[\\s\\S]*:\\s*$/iu.test(body)) {\r\n    return { role: \"open\", name: \"switch\", context: \"switch\" };\r\n  }\r\n  if (/^case\\b[\\s\\S]*:\\s*$/iu.test(body)) {\r\n    return { role: \"branch\", name: \"case\", context: \"switch\" };\r\n  }\r\n  if (/^default\\s*:\\s*$/iu.test(body)) {\r\n    return { role: \"branch\", name: \"default\", context: \"switch\" };\r\n  }\r\n  if (/^endswitch\\s*;?\\s*$/iu.test(body)) {\r\n    return { role: \"close\", name: \"endswitch\", context: \"switch\" };\r\n  }\r\n\r\n  if (/^for\\b[\\s\\S]*:\\s*$/iu.test(body)) {\r\n    return { role: \"open\", name: \"for\", context: \"for\" };\r\n  }\r\n  if (/^endfor\\s*;?\\s*$/iu.test(body)) {\r\n    return { role: \"close\", name: \"endfor\", context: \"for\" };\r\n  }\r\n\r\n  if (/^foreach\\b[\\s\\S]*:\\s*$/iu.test(body)) {\r\n    return { role: \"open\", name: \"foreach\", context: \"foreach\" };\r\n  }\r\n  if (/^endforeach\\s*;?\\s*$/iu.test(body)) {\r\n    return { role: \"close\", name: \"endforeach\", context: \"foreach\" };\r\n  }\r\n\r\n  if (/^while\\b[\\s\\S]*:\\s*$/iu.test(body)) {\r\n    return { role: \"open\", name: \"while\", context: \"while\" };\r\n  }\r\n  if (/^endwhile\\s*;?\\s*$/iu.test(body)) {\r\n    return { role: \"close\", name: \"endwhile\", context: \"while\" };\r\n  }\r\n\r\n  if (/^declare\\b[\\s\\S]*:\\s*$/iu.test(body)) {\r\n    return { role: \"open\", name: \"declare\", context: \"declare\" };\r\n  }\r\n  if (/^enddeclare\\s*;?\\s*$/iu.test(body)) {\r\n    return { role: \"close\", name: \"enddeclare\", context: \"declare\" };\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\nexport class TreeBuilder {\r\n  private nodes: FlatNode[] = [];\r\n  private nodeCount = 0;\r\n\r\n  private openElements: number[] = [];\r\n  private openDirectives: DirectiveFrame[] = [];\r\n  private openConditions: ConditionFrame[] = [];\r\n  private openSwitches: SwitchFrame[] = [];\r\n  private openPhpTagConditions: ConditionFrame[] = [];\r\n\r\n  private pos = 0;\r\n\r\n  private tagNames = new Map<number, string>();\r\n  private rawTagNames = new Map<number, string>();\r\n  private dynamicTagNames = new Set<number>();\r\n  private tagNameStacks = new Map<string, number[]>();\r\n  private malformedRawElementIndexes = new Set<number>();\r\n  private malformedRawElementSources: Array<{ name: string; start: number }> = [];\r\n\r\n  private directiveIndex: DirectiveTokenIndex | null = null;\r\n  private scriptLiteralDirectiveTokenIndexes: Set<number> | null = null;\r\n  private attributeLiteralDirectiveTokenIndexes: Set<number> | null = null;\r\n  private attributeRegionEnd: number | null = null;\r\n  private discoveredDirectiveFamilyCache = new Map<\r\n    string,\r\n    {\r\n      elseName: string;\r\n      endName: string;\r\n      openers: string[];\r\n      hasAdvisoryPair: boolean;\r\n      hasAdvisoryCondition: boolean;\r\n    } | null\r\n  >();\r\n\r\n  private readonly maxElementDepth = 512;\r\n  private readonly maxDirectiveDepth = 256;\r\n  private readonly maxConditionDepth = 256;\r\n\r\n  constructor(\r\n    private readonly tokens: readonly Token[],\r\n    private readonly source: string,\r\n    private readonly directives: Directives = Directives.withDefaults(),\r\n  ) {}\r\n\r\n  build(): BuildResult {\r\n    this.nodes.push(createFlatNode(NodeKind.Root, NONE, 0, 0));\r\n    this.nodeCount = 1;\r\n    this.openElements.push(0);\r\n\r\n    const total = this.tokens.length;\r\n    while (this.pos < total) {\r\n      this.processToken();\r\n    }\r\n\r\n    this.closeRemainingDirectives();\r\n    this.closeRemainingElements();\r\n\r\n    return {\r\n      nodes: this.nodes,\r\n      source: this.source,\r\n      tokens: this.tokens,\r\n      directives: this.directives,\r\n    };\r\n  }\r\n\r\n  private processToken(): void {\r\n    const type = this.tokens[this.pos].type;\r\n\r\n    switch (type) {\r\n      case TokenType.LessThan:\r\n        this.processElementStart();\r\n        break;\r\n      case TokenType.Text:\r\n      case TokenType.TagName:\r\n        this.processText();\r\n        break;\r\n      case TokenType.Whitespace:\r\n        this.processText();\r\n        break;\r\n      case TokenType.AtSign:\r\n        this.processAtSign();\r\n        break;\r\n      case TokenType.EchoStart:\r\n        this.processEcho();\r\n        break;\r\n      case TokenType.RawEchoStart:\r\n        this.processRawEcho();\r\n        break;\r\n      case TokenType.TripleEchoStart:\r\n        this.processTripleEcho();\r\n        break;\r\n      case TokenType.Directive:\r\n        this.processDirective();\r\n        break;\r\n      case TokenType.VerbatimStart:\r\n        this.createBlockNode(this.pos, TokenType.VerbatimEnd, NodeKind.Verbatim);\r\n        break;\r\n      case TokenType.BladeCommentStart:\r\n        this.createBlockNode(this.pos, TokenType.BladeCommentEnd, NodeKind.BladeComment);\r\n        break;\r\n      case TokenType.CommentStart:\r\n        this.createBlockNode(this.pos, TokenType.CommentEnd, NodeKind.Comment);\r\n        break;\r\n      case TokenType.BogusComment:\r\n        this.addChild(createFlatNode(NodeKind.BogusComment, 0, this.pos, 1, 0, 1));\r\n        this.pos++;\r\n        break;\r\n      case TokenType.DoctypeStart:\r\n        this.createBlockNode(this.pos, TokenType.DoctypeEnd, NodeKind.Doctype);\r\n        break;\r\n      case TokenType.IgnoreRange:\r\n        this.addChild(createFlatNode(NodeKind.IgnoreRange, 0, this.pos, 1));\r\n        this.pos++;\r\n        break;\r\n      case TokenType.PhpBlockStart:\r\n        this.createBlockNode(this.pos, TokenType.PhpBlockEnd, NodeKind.PhpBlock);\r\n        break;\r\n      case TokenType.PhpTagStart:\r\n        this.processPhpTag();\r\n        break;\r\n      case TokenType.PhpBlockEnd:\r\n        this.processOrphanPhpBlockEnd();\r\n        break;\r\n      case TokenType.ConditionalCommentStart:\r\n        this.createConditionalComment();\r\n        break;\r\n      case TokenType.CdataStart:\r\n        this.createBlockNode(this.pos, TokenType.CdataEnd, NodeKind.Cdata);\r\n        break;\r\n      case TokenType.DeclStart:\r\n        this.createDecl();\r\n        break;\r\n      case TokenType.PIStart:\r\n        this.createBlockNode(this.pos, TokenType.PIEnd, NodeKind.ProcessingInstruction);\r\n        break;\r\n      case TokenType.ConditionalCommentEnd:\r\n      case TokenType.GreaterThan:\r\n        this.emitSingleTokenText();\r\n        break;\r\n      case TokenType.SyntheticClose:\r\n        this.pos++;\r\n        break;\r\n      default:\r\n        this.emitSingleTokenText();\r\n        break;\r\n    }\r\n  }\r\n\r\n  private addChild(node: FlatNode): number {\r\n    this.implicitlyCloseVoidElements();\r\n\r\n    const parentIdx = this.getCurrentParent();\r\n    node.parent = parentIdx;\r\n\r\n    const nodeIdx = this.nodeCount++;\r\n    this.nodes[nodeIdx] = node;\r\n\r\n    const parent = this.nodes[parentIdx];\r\n    if (parent.firstChild === NONE) {\r\n      parent.firstChild = nodeIdx;\r\n    } else {\r\n      this.nodes[parent.lastChild].nextSibling = nodeIdx;\r\n    }\r\n    parent.lastChild = nodeIdx;\r\n\r\n    return nodeIdx;\r\n  }\r\n\r\n  private getCurrentParent(): number {\r\n    const last = this.openElements[this.openElements.length - 1];\r\n    return last !== undefined ? last : 0;\r\n  }\r\n\r\n  private createFirstChild(\r\n    parentIdx: number,\r\n    kind: number,\r\n    tokenStart: number,\r\n    tokenCount: number,\r\n  ): number {\r\n    const childIdx = this.nodeCount++;\r\n    this.nodes[childIdx] = createFlatNode(kind, parentIdx, tokenStart, tokenCount);\r\n    this.nodes[parentIdx].firstChild = childIdx;\r\n    this.nodes[parentIdx].lastChild = childIdx;\r\n    return childIdx;\r\n  }\r\n\r\n  private createSiblingChild(\r\n    prevSiblingIdx: number,\r\n    parentIdx: number,\r\n    kind: number,\r\n    tokenStart: number,\r\n    tokenCount: number,\r\n  ): number {\r\n    const childIdx = this.nodeCount++;\r\n    this.nodes[childIdx] = createFlatNode(kind, parentIdx, tokenStart, tokenCount);\r\n    this.nodes[prevSiblingIdx].nextSibling = childIdx;\r\n    this.nodes[parentIdx].lastChild = childIdx;\r\n    return childIdx;\r\n  }\r\n\r\n  private popIfTop(idx: number): void {\r\n    if (this.openElements[this.openElements.length - 1] === idx) {\r\n      const popped = this.openElements.pop()!;\r\n      this.cleanupTagNameStack(popped);\r\n    }\r\n  }\r\n\r\n  private popElementsToDepth(targetDepth: number): void {\r\n    while (this.openElements.length > targetDepth) {\r\n      const popped = this.openElements.pop()!;\r\n      this.cleanupTagNameStack(popped);\r\n    }\r\n  }\r\n\r\n  private cleanupTagNameStack(elementIdx: number): void {\r\n    const tagName = this.tagNames.get(elementIdx);\r\n    this.tagNames.delete(elementIdx);\r\n    this.rawTagNames.delete(elementIdx);\r\n    this.dynamicTagNames.delete(elementIdx);\r\n    if (tagName === undefined) return;\r\n\r\n    const stack = this.tagNameStacks.get(tagName);\r\n    if (stack && stack.length > 0) {\r\n      stack.pop();\r\n      if (stack.length === 0) {\r\n        this.tagNameStacks.delete(tagName);\r\n      }\r\n    }\r\n  }\r\n\r\n  private checkElementDepth(): void {\r\n    if (this.openElements.length >= this.maxElementDepth) {\r\n      throw new Error(`Maximum element nesting depth (${this.maxElementDepth}) exceeded.`);\r\n    }\r\n  }\r\n\r\n  private checkDirectiveDepth(): void {\r\n    if (this.openDirectives.length >= this.maxDirectiveDepth) {\r\n      throw new Error(`Maximum directive nesting depth (${this.maxDirectiveDepth}) exceeded.`);\r\n    }\r\n  }\r\n\r\n  private checkConditionDepth(): void {\r\n    if (this.openConditions.length + this.openPhpTagConditions.length >= this.maxConditionDepth) {\r\n      throw new Error(`Maximum condition nesting depth (${this.maxConditionDepth}) exceeded.`);\r\n    }\r\n  }\r\n\r\n  private implicitlyCloseVoidElements(): void {\r\n    while (this.openElements.length > 1) {\r\n      const topIdx = this.openElements[this.openElements.length - 1];\r\n      const tagName = this.tagNames.get(topIdx);\r\n\r\n      if (tagName === undefined || !VOID_ELEMENTS.has(tagName)) break;\r\n\r\n      this.openElements.pop();\r\n\r\n      const stack = this.tagNameStacks.get(tagName);\r\n      if (stack) {\r\n        stack.pop();\r\n        if (stack.length === 0) this.tagNameStacks.delete(tagName);\r\n      }\r\n    }\r\n  }\r\n\r\n  private autoCloseElementsForSibling(newTag: string, closeAtToken: number): void {\r\n    if (newTag === \"\") return;\r\n\r\n    const conditions = OptionalTags.getClosingConditions(newTag);\r\n    if (conditions?.autoCloseAtParentEnd) {\r\n      const containerIndex = this.findNearestValidContainer(\r\n        conditions.autoCloseAtParentEnd as string[],\r\n      );\r\n      if (containerIndex >= 0) {\r\n        this.autoCloseElementsBetween(containerIndex, newTag, closeAtToken);\r\n        return;\r\n      }\r\n      return;\r\n    }\r\n\r\n    this.autoCloseImmediateParent(newTag, closeAtToken);\r\n  }\r\n\r\n  private autoCloseElementsBetween(\r\n    containerIndex: number,\r\n    newTag: string,\r\n    closeAtToken: number,\r\n  ): void {\r\n    let closeUpToIndex = -1;\r\n\r\n    for (let i = this.openElements.length - 1; i > containerIndex; i--) {\r\n      const elementIdx = this.openElements[i];\r\n      if (this.nodes[elementIdx].kind !== NodeKind.Element) continue;\r\n\r\n      const tagName = this.tagNames.get(elementIdx) ?? \"\";\r\n      if (tagName === \"\") continue;\r\n\r\n      const parentTagName = this.parentTagNameOf(elementIdx);\r\n\r\n      if (OptionalTags.shouldAutoCloseElement(tagName, newTag, parentTagName, false)) {\r\n        closeUpToIndex = i;\r\n      }\r\n    }\r\n\r\n    if (closeUpToIndex >= 0) {\r\n      while (this.openElements.length > closeUpToIndex) {\r\n        const popped = this.openElements.pop()!;\r\n        this.finalizeImplicitlyClosedElement(popped, closeAtToken);\r\n        this.cleanupTagNameStack(popped);\r\n      }\r\n    }\r\n  }\r\n\r\n  private autoCloseImmediateParent(newTag: string, closeAtToken: number): void {\r\n    if (this.openElements.length <= 1) return;\r\n\r\n    const currentIdx = this.openElements[this.openElements.length - 1];\r\n    if (this.nodes[currentIdx].kind !== NodeKind.Element) return;\r\n\r\n    const currentTagName = this.tagNames.get(currentIdx) ?? \"\";\r\n    if (currentTagName === \"\") return;\r\n\r\n    const parentTagName = this.parentTagNameOf(currentIdx);\r\n\r\n    if (!OptionalTags.isInValidParentContext(currentTagName, parentTagName)) return;\r\n\r\n    if (OptionalTags.shouldAutoCloseElement(currentTagName, newTag, parentTagName, false)) {\r\n      this.openElements.pop();\r\n      this.finalizeImplicitlyClosedElement(currentIdx, closeAtToken);\r\n      this.cleanupTagNameStack(currentIdx);\r\n    }\r\n  }\r\n\r\n  private finalizeImplicitlyClosedElement(elementIdx: number, closeAtToken: number): void {\r\n    if (this.nodes[elementIdx].kind !== NodeKind.Element) return;\r\n\r\n    const tokenCount = Math.max(0, closeAtToken - this.nodes[elementIdx].tokenStart);\r\n    if (tokenCount > this.nodes[elementIdx].tokenCount) {\r\n      this.nodes[elementIdx].tokenCount = tokenCount;\r\n    }\r\n  }\r\n\r\n  private findNearestValidContainer(validParents: string[]): number {\r\n    for (let i = this.openElements.length - 1; i > 0; i--) {\r\n      const elementIdx = this.openElements[i];\r\n      if (this.nodes[elementIdx].kind !== NodeKind.Element) continue;\r\n\r\n      const tagName = this.tagNames.get(elementIdx) ?? \"\";\r\n      if (tagName === \"\") continue;\r\n\r\n      if (validParents.includes(tagName)) return i;\r\n      if (this.isOptionalTagContainerBoundary(tagName)) return -1;\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  private isOptionalTagContainerBoundary(tagName: string): boolean {\r\n    return tagName === \"template\";\r\n  }\r\n\r\n  private parentTagNameOf(idx: number): string | null {\r\n    const parentIdx = this.nodes[idx].parent;\r\n    if (parentIdx <= 0 || !this.nodes[parentIdx]) return null;\r\n    if (this.nodes[parentIdx].kind !== NodeKind.Element) return null;\r\n    return this.tagNames.get(parentIdx) ?? null;\r\n  }\r\n\r\n  private closeRemainingElements(): void {\r\n    const totalTokens = this.tokens.length;\r\n    for (const elementIdx of this.openElements) {\r\n      if (elementIdx === 0) continue;\r\n      this.nodes[elementIdx].tokenCount = totalTokens - this.nodes[elementIdx].tokenStart;\r\n    }\r\n  }\r\n\r\n  private processText(): void {\r\n    const parentIdx = this.getCurrentParent();\r\n    const parent = this.nodes[parentIdx];\r\n\r\n    if (parent.lastChild !== NONE) {\r\n      const lastChild = this.nodes[parent.lastChild];\r\n      if (lastChild.kind === NodeKind.Text) {\r\n        lastChild.tokenCount++;\r\n        this.pos++;\r\n        return;\r\n      }\r\n    }\r\n\r\n    const startPos = this.pos;\r\n    this.pos++;\r\n\r\n    this.addChild(createFlatNode(NodeKind.Text, 0, startPos, 1));\r\n  }\r\n\r\n  private processAtSign(): void {\r\n    const startPos = this.pos;\r\n    this.pos++;\r\n    this.addChild(createFlatNode(NodeKind.NonOutput, 0, startPos, 1));\r\n  }\r\n\r\n  private emitSingleTokenText(): void {\r\n    const startPos = this.pos;\r\n    this.pos++;\r\n    this.addChild(createFlatNode(NodeKind.Text, 0, startPos, 1));\r\n  }\r\n\r\n  private processEcho(): void {\r\n    this.processEchoSpan(TokenType.EchoEnd, NodeKind.Echo);\r\n  }\r\n\r\n  private processRawEcho(): void {\r\n    this.processEchoSpan(TokenType.RawEchoEnd, NodeKind.RawEcho);\r\n  }\r\n\r\n  private processTripleEcho(): void {\r\n    this.processEchoSpan(TokenType.TripleEchoEnd, NodeKind.TripleEcho);\r\n  }\r\n\r\n  private processEchoSpan(endType: number, nodeKind: number): void {\r\n    const startPos = this.pos;\r\n    this.pos++;\r\n\r\n    const total = this.tokens.length;\r\n    while (this.pos < total) {\r\n      const type = this.tokens[this.pos].type;\r\n      if (type === endType) {\r\n        this.pos++;\r\n        break;\r\n      }\r\n      // Interrupted by another construct start\r\n      if (\r\n        type === TokenType.EchoStart ||\r\n        type === TokenType.RawEchoStart ||\r\n        type === TokenType.TripleEchoStart ||\r\n        type === TokenType.BladeCommentStart\r\n      ) {\r\n        // Emit what we have as text\r\n        this.addChild(createFlatNode(NodeKind.Text, 0, startPos, this.pos - startPos));\r\n        return;\r\n      }\r\n      this.pos++;\r\n    }\r\n\r\n    this.addChild(createFlatNode(nodeKind, 0, startPos, this.pos - startPos));\r\n  }\r\n\r\n  private createBlockNode(startPos: number, endTokenType: number, nodeKind: number): void {\r\n    let endPos = this.pos;\r\n    let hasClosing = false;\r\n    const total = this.tokens.length;\r\n\r\n    while (endPos < total) {\r\n      if (this.tokens[endPos].type === endTokenType) {\r\n        hasClosing = true;\r\n        endPos++;\r\n        break;\r\n      }\r\n      endPos++;\r\n    }\r\n\r\n    this.addChild(createFlatNode(nodeKind, 0, startPos, endPos - startPos, 0, hasClosing ? 1 : 0));\r\n    this.pos = endPos;\r\n  }\r\n\r\n  private getPhpTagTokenCount(startPos: number): { tokenCount: number; hasClosing: boolean } {\r\n    let endPos = startPos;\r\n    let hasClosing = false;\r\n    const total = this.tokens.length;\r\n\r\n    while (endPos < total) {\r\n      if (this.tokens[endPos].type === TokenType.PhpTagEnd) {\r\n        hasClosing = true;\r\n        endPos++;\r\n        break;\r\n      }\r\n      endPos++;\r\n    }\r\n\r\n    return { tokenCount: endPos - startPos, hasClosing };\r\n  }\r\n\r\n  private addStandalonePhpTag(startPos: number, tokenCount: number, hasClosing: boolean): void {\r\n    this.addChild(createFlatNode(NodeKind.PhpTag, 0, startPos, tokenCount, 0, hasClosing ? 1 : 0));\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private processPhpTag(): void {\r\n    const startPos = this.pos;\r\n    const { tokenCount, hasClosing } = this.getPhpTagTokenCount(startPos);\r\n    if (tokenCount <= 0) {\r\n      this.pos++;\r\n      return;\r\n    }\r\n\r\n    const startToken = this.tokens[startPos];\r\n    const endToken = this.tokens[startPos + tokenCount - 1];\r\n    const rawTag = this.source.slice(startToken.start, endToken.end);\r\n    const shorthand = classifyPhpTagShorthand(rawTag);\r\n\r\n    if (!shorthand) {\r\n      this.addStandalonePhpTag(startPos, tokenCount, hasClosing);\r\n      return;\r\n    }\r\n\r\n    if (shorthand.role === \"open\") {\r\n      this.openPhpTagCondition(shorthand, startPos, tokenCount, hasClosing);\r\n      return;\r\n    }\r\n\r\n    if (shorthand.role === \"branch\") {\r\n      this.openPhpTagConditionBranch(shorthand, startPos, tokenCount, hasClosing);\r\n      return;\r\n    }\r\n\r\n    this.closePhpTagCondition(shorthand, startPos, tokenCount, hasClosing);\r\n  }\r\n\r\n  private openPhpTagCondition(\r\n    shorthand: PhpTagShorthandMatch,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    hasClosing: boolean,\r\n  ): void {\r\n    const blockIdx = this.addChild(\r\n      createFlatNode(NodeKind.DirectiveBlock, 0, startPos, tokenCount),\r\n    );\r\n\r\n    const elementStackBase = this.openElements.length;\r\n    this.checkElementDepth();\r\n    this.openElements.push(blockIdx);\r\n\r\n    const branchIdx = this.addChild(\r\n      createFlatNode(NodeKind.PhpTag, 0, startPos, tokenCount, 0, hasClosing ? 1 : 0),\r\n    );\r\n\r\n    this.checkElementDepth();\r\n    this.openElements.push(branchIdx);\r\n\r\n    this.checkConditionDepth();\r\n    this.openPhpTagConditions.push({\r\n      blockIdx,\r\n      currentBranchIdx: branchIdx,\r\n      name: shorthand.context,\r\n      elementStackBase,\r\n    });\r\n\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private openPhpTagConditionBranch(\r\n    shorthand: PhpTagShorthandMatch,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    hasClosing: boolean,\r\n  ): void {\r\n    if (this.openPhpTagConditions.length === 0) {\r\n      this.addStandalonePhpTag(startPos, tokenCount, hasClosing);\r\n      return;\r\n    }\r\n\r\n    const frame = this.openPhpTagConditions[this.openPhpTagConditions.length - 1];\r\n\r\n    const isMatchingBranch =\r\n      (frame.name === \"if\" && (shorthand.name === \"elseif\" || shorthand.name === \"else\")) ||\r\n      (frame.name === \"switch\" && (shorthand.name === \"case\" || shorthand.name === \"default\"));\r\n\r\n    if (!isMatchingBranch) {\r\n      this.addStandalonePhpTag(startPos, tokenCount, hasClosing);\r\n      return;\r\n    }\r\n\r\n    this.popIfTop(frame.currentBranchIdx);\r\n    this.popElementsToDepth(frame.elementStackBase + 1);\r\n\r\n    const branchIdx = this.addChild(\r\n      createFlatNode(NodeKind.PhpTag, 0, startPos, tokenCount, 0, hasClosing ? 1 : 0),\r\n    );\r\n\r\n    this.checkElementDepth();\r\n    this.openElements.push(branchIdx);\r\n    frame.currentBranchIdx = branchIdx;\r\n\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private closePhpTagCondition(\r\n    shorthand: PhpTagShorthandMatch,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    hasClosing: boolean,\r\n  ): void {\r\n    if (this.openPhpTagConditions.length === 0) {\r\n      this.addStandalonePhpTag(startPos, tokenCount, hasClosing);\r\n      return;\r\n    }\r\n\r\n    const frame = this.openPhpTagConditions[this.openPhpTagConditions.length - 1];\r\n    const expectedCloser =\r\n      frame.name === \"if\"\r\n        ? \"endif\"\r\n        : frame.name === \"switch\"\r\n          ? \"endswitch\"\r\n          : frame.name === \"for\"\r\n            ? \"endfor\"\r\n            : frame.name === \"foreach\"\r\n              ? \"endforeach\"\r\n              : frame.name === \"while\"\r\n                ? \"endwhile\"\r\n                : \"enddeclare\";\r\n\r\n    if (shorthand.name !== expectedCloser) {\r\n      this.addStandalonePhpTag(startPos, tokenCount, hasClosing);\r\n      return;\r\n    }\r\n\r\n    this.openPhpTagConditions.pop();\r\n\r\n    this.popElementsToDepth(frame.elementStackBase + 1);\r\n    this.popIfTop(frame.currentBranchIdx);\r\n\r\n    this.addChild(createFlatNode(NodeKind.PhpTag, 0, startPos, tokenCount, 0, hasClosing ? 1 : 0));\r\n\r\n    this.popIfTop(frame.blockIdx);\r\n\r\n    const endPos = startPos + tokenCount;\r\n    this.nodes[frame.blockIdx].tokenCount = endPos - this.nodes[frame.blockIdx].tokenStart;\r\n\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private processOrphanPhpBlockEnd(): void {\r\n    const startPos = this.pos;\r\n    this.pos++;\r\n\r\n    const node = createFlatNode(NodeKind.Directive, 0, startPos, 1);\r\n    this.addChild(node);\r\n  }\r\n\r\n  private createConditionalComment(): void {\r\n    const startPos = this.pos;\r\n    const total = this.tokens.length;\r\n\r\n    let endPos = startPos + 1;\r\n    let hasClosing = false;\r\n\r\n    while (endPos < total) {\r\n      if (this.tokens[endPos].type === TokenType.ConditionalCommentEnd) {\r\n        hasClosing = true;\r\n        break;\r\n      }\r\n      endPos++;\r\n    }\r\n\r\n    const fullEndPos = hasClosing ? endPos + 1 : endPos;\r\n\r\n    const node = createFlatNode(\r\n      NodeKind.ConditionalComment,\r\n      0,\r\n      startPos,\r\n      fullEndPos - startPos,\r\n      0,\r\n      hasClosing ? 1 : 0,\r\n    );\r\n    const nodeIdx = this.addChild(node);\r\n\r\n    const elementStackDepth = this.openElements.length;\r\n\r\n    this.checkElementDepth();\r\n    this.openElements.push(nodeIdx);\r\n\r\n    this.pos = startPos + 1;\r\n    while (this.pos < endPos) {\r\n      this.processToken();\r\n    }\r\n\r\n    while (this.openElements.length > elementStackDepth + 1) {\r\n      const popped = this.openElements.pop()!;\r\n      this.cleanupTagNameStack(popped);\r\n    }\r\n\r\n    const popped = this.openElements.pop()!;\r\n    this.cleanupTagNameStack(popped);\r\n\r\n    this.pos = fullEndPos;\r\n  }\r\n\r\n  private createDecl(): void {\r\n    const tokens = this.tokens;\r\n    const total = tokens.length;\r\n    const startPos = this.pos;\r\n\r\n    let endPos = this.pos;\r\n    let hasClosing = false;\r\n    while (endPos < total) {\r\n      if (tokens[endPos].type === TokenType.DeclEnd) {\r\n        hasClosing = true;\r\n        break;\r\n      }\r\n      endPos++;\r\n    }\r\n\r\n    const declTokenCount = hasClosing ? endPos + 1 - startPos : endPos - startPos;\r\n\r\n    const declIdx = this.addChild(\r\n      createFlatNode(NodeKind.Decl, 0, startPos, declTokenCount, 0, hasClosing ? 1 : 0),\r\n    );\r\n\r\n    this.checkElementDepth();\r\n    this.openElements.push(declIdx);\r\n\r\n    this.pos++;\r\n\r\n    while (this.pos < total) {\r\n      const type = tokens[this.pos].type;\r\n\r\n      if (type === TokenType.DeclEnd) {\r\n        this.pos++;\r\n        break;\r\n      }\r\n\r\n      if (type === TokenType.Whitespace) {\r\n        this.addChild(createFlatNode(NodeKind.AttributeWhitespace, 0, this.pos, 1));\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      if (\r\n        type === TokenType.EchoStart ||\r\n        type === TokenType.RawEchoStart ||\r\n        type === TokenType.TripleEchoStart\r\n      ) {\r\n        this.processDeclEcho();\r\n        continue;\r\n      }\r\n\r\n      if (\r\n        type === TokenType.AttributeName ||\r\n        type === TokenType.BoundAttribute ||\r\n        type === TokenType.EscapedAttribute ||\r\n        type === TokenType.ShorthandAttribute\r\n      ) {\r\n        this.buildDeclAttribute(endPos);\r\n        continue;\r\n      }\r\n\r\n      this.pos++;\r\n    }\r\n\r\n    this.openElements.pop();\r\n  }\r\n\r\n  private processDeclEcho(): void {\r\n    const startPos = this.pos;\r\n    const total = this.tokens.length;\r\n    const startType = this.tokens[startPos].type;\r\n\r\n    const nodeKind = Constructs.getNodeKind(startType) ?? NodeKind.Echo;\r\n    const constructTokenCount = Constructs.countConstructTokens(this.tokens, startPos, total);\r\n    this.pos += constructTokenCount;\r\n\r\n    this.addChild(createFlatNode(nodeKind, 0, startPos, constructTokenCount));\r\n  }\r\n\r\n  private buildDeclAttribute(attrEnd: number): void {\r\n    const tokens = this.tokens;\r\n    const total = tokens.length;\r\n\r\n    const attrStart = this.pos;\r\n    let nameCount = 0;\r\n\r\n    while (this.pos < total && this.pos < attrEnd) {\r\n      const type = tokens[this.pos].type;\r\n      if (\r\n        type === TokenType.AttributeName ||\r\n        type === TokenType.EchoStart ||\r\n        type === TokenType.RawEchoStart ||\r\n        type === TokenType.TripleEchoStart\r\n      ) {\r\n        nameCount++;\r\n        this.pos++;\r\n        continue;\r\n      }\r\n      break;\r\n    }\r\n\r\n    if (nameCount === 0) {\r\n      this.pos++;\r\n      return;\r\n    }\r\n\r\n    const [hasValue, valueStart, valueCount] = this.scanDeclEqualsAndValue(attrEnd, total);\r\n\r\n    const attrTokenCount = this.pos - attrStart;\r\n\r\n    const attrIdx = this.addChild(createFlatNode(NodeKind.Attribute, 0, attrStart, attrTokenCount));\r\n\r\n    const nameIdx = this.createFirstChild(attrIdx, NodeKind.AttributeName, attrStart, nameCount);\r\n    this.buildDeclAttributeParts(attrStart, nameCount, nameIdx, false);\r\n\r\n    if (hasValue && valueCount > 0) {\r\n      const valueIdx = this.createSiblingChild(\r\n        nameIdx,\r\n        attrIdx,\r\n        NodeKind.AttributeValue,\r\n        valueStart,\r\n        valueCount,\r\n      );\r\n      this.buildDeclAttributeParts(valueStart, valueCount, valueIdx, true);\r\n    }\r\n  }\r\n\r\n  private scanDeclEqualsAndValue(attrEnd: number, total: number): [boolean, number, number] {\r\n    let hasValue = false;\r\n    let valueStart = 0;\r\n    let valueCount = 0;\r\n\r\n    let checkPos = this.pos;\r\n    if (checkPos < total && this.tokens[checkPos].type === TokenType.Whitespace) {\r\n      checkPos++;\r\n    }\r\n\r\n    if (checkPos < total && this.tokens[checkPos].type === TokenType.Equals) {\r\n      this.pos = checkPos + 1;\r\n\r\n      if (this.pos < total && this.tokens[this.pos].type === TokenType.Whitespace) {\r\n        this.pos++;\r\n      }\r\n\r\n      if (this.pos < total) {\r\n        valueStart = this.pos;\r\n        valueCount = this.scanDeclAttributeValue(attrEnd);\r\n        hasValue = valueCount > 0;\r\n      }\r\n    }\r\n\r\n    return [hasValue, valueStart, valueCount];\r\n  }\r\n\r\n  private scanDeclAttributeValue(attrEnd: number): number {\r\n    const total = this.tokens.length;\r\n\r\n    if (this.pos >= total || this.tokens[this.pos].type !== TokenType.Quote) {\r\n      return 0;\r\n    }\r\n\r\n    let count = 1;\r\n    this.pos++;\r\n\r\n    while (this.pos < total && this.pos < attrEnd) {\r\n      const type = this.tokens[this.pos].type;\r\n\r\n      if (type === TokenType.Quote) {\r\n        count++;\r\n        this.pos++;\r\n        break;\r\n      }\r\n\r\n      if (type === TokenType.DeclEnd) {\r\n        break;\r\n      }\r\n\r\n      count++;\r\n      this.pos++;\r\n    }\r\n\r\n    return count;\r\n  }\r\n\r\n  private buildDeclAttributeParts(\r\n    start: number,\r\n    count: number,\r\n    parentIdx: number,\r\n    isValue: boolean,\r\n  ): void {\r\n    let lastChildIdx = NONE;\r\n\r\n    for (let i = 0; i < count; i++) {\r\n      const tokenPos = start + i;\r\n      const type = this.tokens[tokenPos].type;\r\n\r\n      if (isValue) {\r\n        if (\r\n          type === TokenType.Quote ||\r\n          type === TokenType.EchoEnd ||\r\n          type === TokenType.RawEchoEnd ||\r\n          type === TokenType.TripleEchoEnd\r\n        ) {\r\n          continue;\r\n        }\r\n      }\r\n\r\n      const nodeKind = this.declPartNodeKind(type);\r\n\r\n      const partIdx = this.nodeCount++;\r\n      this.nodes[partIdx] = createFlatNode(nodeKind, parentIdx, tokenPos, 1);\r\n\r\n      if (lastChildIdx === NONE) {\r\n        this.nodes[parentIdx].firstChild = partIdx;\r\n      } else {\r\n        this.nodes[lastChildIdx].nextSibling = partIdx;\r\n      }\r\n      this.nodes[parentIdx].lastChild = partIdx;\r\n      lastChildIdx = partIdx;\r\n    }\r\n  }\r\n\r\n  private declPartNodeKind(type: number): number {\r\n    switch (type) {\r\n      case TokenType.EchoStart:\r\n        return NodeKind.Echo;\r\n      case TokenType.RawEchoStart:\r\n        return NodeKind.RawEcho;\r\n      case TokenType.TripleEchoStart:\r\n        return NodeKind.TripleEcho;\r\n      default:\r\n        return NodeKind.Text;\r\n    }\r\n  }\r\n\r\n  private processElementStart(): void {\r\n    const tokens = this.tokens;\r\n    const total = tokens.length;\r\n    const startPos = this.pos;\r\n\r\n    this.pos++; // skip '<'\r\n\r\n    if (startPos >= total || tokens[startPos].type !== TokenType.LessThan) return;\r\n\r\n    // Closing tag?\r\n    if (this.pos < total && tokens[this.pos].type === TokenType.Slash) {\r\n      this.processElementEnd();\r\n      return;\r\n    }\r\n\r\n    const tagNameStart = this.pos;\r\n    const [tagNameCount, genericOffset] = this.scanElementName();\r\n    const rawTagName = this.getRawNameText(tagNameStart, tagNameCount);\r\n    const isDynamicTagName = this.isDynamicTagName(tagNameStart, tagNameCount);\r\n\r\n    // Consume TsxGenericType if present after the tag name\r\n    if (this.pos < total && tokens[this.pos].type === TokenType.TsxGenericType) {\r\n      this.pos++;\r\n    }\r\n\r\n    if (tagNameCount === 0) {\r\n      this.addChild(createFlatNode(NodeKind.Text, 0, startPos, 1));\r\n      return;\r\n    }\r\n\r\n    const staticTagName = this.getTagNameText(tagNameStart, tagNameCount);\r\n    const lowerNewTag = staticTagName.toLowerCase();\r\n\r\n    if (!isDynamicTagName) {\r\n      this.autoCloseElementsForSibling(lowerNewTag, startPos);\r\n    }\r\n\r\n    const elementIdx = this.addChild(createFlatNode(NodeKind.Element, 0, startPos, 0));\r\n\r\n    const elementNameIdx = this.createFirstChild(\r\n      elementIdx,\r\n      NodeKind.ElementName,\r\n      tagNameStart,\r\n      tagNameCount,\r\n    );\r\n    this.buildElementNameParts(tagNameStart, tagNameCount, elementNameIdx);\r\n\r\n    // Attributes\r\n    this.buildAttributes(elementIdx, elementNameIdx);\r\n    if (this.hasSwallowedTagSyntaxInOpeningSource(startPos, this.pos)) {\r\n      this.malformedRawElementIndexes.add(elementIdx);\r\n      this.malformedRawElementSources.push({\r\n        name: lowerNewTag,\r\n        start: this.tokens[startPos].start,\r\n      });\r\n    }\r\n\r\n    // Self-closing detection\r\n    let selfClosing = false;\r\n    let syntheticClose = false;\r\n\r\n    if (this.pos < total && tokens[this.pos].type === TokenType.Slash) {\r\n      this.pos++;\r\n      selfClosing = this.pos < total && tokens[this.pos].type === TokenType.GreaterThan;\r\n    }\r\n\r\n    if (this.pos < total) {\r\n      const type = tokens[this.pos].type;\r\n      if (type === TokenType.GreaterThan) {\r\n        this.pos++;\r\n      } else if (type === TokenType.SyntheticClose) {\r\n        this.pos++;\r\n        syntheticClose = true;\r\n      }\r\n    }\r\n\r\n    this.nodes[elementIdx].tokenCount = this.pos - startPos;\r\n    this.nodes[elementIdx].genericOffset = genericOffset > 0 ? genericOffset + 1 : 0;\r\n    this.nodes[elementIdx].data = selfClosing ? 1 : 0;\r\n\r\n    // Decide if element stays open\r\n    let shouldStayOpen = !selfClosing;\r\n    if (syntheticClose && shouldStayOpen) {\r\n      // Synthetic closes indicate the opening tag was malformed. Keep the raw\r\n      // source text, but avoid carrying an open-element frame across tag\r\n      // boundaries, otherwise malformed inputs like \"<Map<R\" collapse siblings\r\n      // into a nested tree and drift across passes.\r\n      const nextType = this.pos < total ? tokens[this.pos].type : null;\r\n      if (this.pos >= total || nextType === TokenType.LessThan) {\r\n        shouldStayOpen = false;\r\n      }\r\n    }\r\n\r\n    if (!shouldStayOpen) return;\r\n\r\n    this.checkElementDepth();\r\n    this.openElements.push(elementIdx);\r\n    this.tagNames.set(elementIdx, lowerNewTag);\r\n    this.rawTagNames.set(elementIdx, rawTagName);\r\n    if (isDynamicTagName) {\r\n      this.dynamicTagNames.add(elementIdx);\r\n    }\r\n\r\n    if (lowerNewTag !== \"\" && !isDynamicTagName) {\r\n      let stack = this.tagNameStacks.get(lowerNewTag);\r\n      if (!stack) {\r\n        stack = [];\r\n        this.tagNameStacks.set(lowerNewTag, stack);\r\n      }\r\n      stack.push(this.openElements.length - 1);\r\n    }\r\n  }\r\n\r\n  private processElementEnd(): void {\r\n    const tokens = this.tokens;\r\n    const total = tokens.length;\r\n\r\n    const startPos = this.pos - 1; // before '<'\r\n    this.pos++; // skip '/'\r\n\r\n    const tagNameStartPos = this.pos;\r\n    let [tagNameCount] = this.scanElementName();\r\n    if (\r\n      tagNameCount === 0 &&\r\n      this.pos < total &&\r\n      tokens[this.pos].type === TokenType.AttributeName\r\n    ) {\r\n      tagNameCount = 1;\r\n      this.pos++;\r\n    }\r\n\r\n    const closingTagName =\r\n      tagNameCount > 0 ? this.getTagNameText(tagNameStartPos, tagNameCount) : \"\";\r\n    const closingRawTagName =\r\n      tagNameCount > 0 ? this.getRawNameText(tagNameStartPos, tagNameCount) : \"\";\r\n    const closingIsDynamicTagName =\r\n      tagNameCount > 0 ? this.isDynamicTagName(tagNameStartPos, tagNameCount) : false;\r\n\r\n    // Skip to '>' or SyntheticClose\r\n    while (\r\n      this.pos < total &&\r\n      tokens[this.pos].type !== TokenType.GreaterThan &&\r\n      tokens[this.pos].type !== TokenType.SyntheticClose\r\n    ) {\r\n      this.pos++;\r\n    }\r\n    if (this.pos < total) this.pos++;\r\n\r\n    if (tagNameCount === 0) {\r\n      this.addChild(createFlatNode(NodeKind.UnpairedClosingTag, 0, startPos, this.pos - startPos));\r\n      return;\r\n    }\r\n\r\n    this.closeMalformedRawSource(closingTagName);\r\n\r\n    // Directive scope boundary\r\n    let searchLimit = 1;\r\n    if (this.openDirectives.length > 0) {\r\n      const currentDirective = this.openDirectives[this.openDirectives.length - 1];\r\n      searchLimit = currentDirective.elementStackBase + 1;\r\n    }\r\n\r\n    const lowerClosingTag = closingTagName.toLowerCase();\r\n    let foundMatch = false;\r\n    let matchDepth = 0;\r\n    let matchedOpenElementsIndex = -1;\r\n\r\n    // Fast path: tagNameStacks\r\n    const stack = !closingIsDynamicTagName ? this.tagNameStacks.get(lowerClosingTag) : null;\r\n    if (stack && stack.length > 0) {\r\n      const openElementsCount = this.openElements.length;\r\n      for (let i = stack.length - 1; i >= 0; i--) {\r\n        const openElementsIndex = stack[i];\r\n        if (openElementsIndex >= searchLimit && openElementsIndex < openElementsCount) {\r\n          const elementIdx = this.openElements[openElementsIndex];\r\n          if ((this.tagNames.get(elementIdx) ?? \"\") === lowerClosingTag) {\r\n            matchedOpenElementsIndex = openElementsIndex;\r\n            foundMatch = true;\r\n            matchDepth = openElementsCount - openElementsIndex;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // Fallback: linear search for dynamic tags\r\n    if (!foundMatch) {\r\n      for (let i = this.openElements.length - 1; i >= searchLimit; i--) {\r\n        const elementIdx = this.openElements[i];\r\n        if (this.nodes[elementIdx].kind !== NodeKind.Element) continue;\r\n\r\n        const openTagName = this.tagNames.get(elementIdx) ?? \"\";\r\n        const openRawTagName = this.rawTagNames.get(elementIdx) ?? \"\";\r\n        const openIsDynamicTagName = this.dynamicTagNames.has(elementIdx);\r\n\r\n        if (openIsDynamicTagName || closingIsDynamicTagName) {\r\n          if (openRawTagName === closingRawTagName) {\r\n            foundMatch = true;\r\n            matchDepth = this.openElements.length - i;\r\n            matchedOpenElementsIndex = i;\r\n            break;\r\n          }\r\n          continue;\r\n        }\r\n\r\n        if (\r\n          openTagName.toLowerCase() === lowerClosingTag ||\r\n          this.isSlotClosingMatch(openRawTagName, closingRawTagName)\r\n        ) {\r\n          foundMatch = true;\r\n          matchDepth = this.openElements.length - i;\r\n          matchedOpenElementsIndex = i;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    if (foundMatch) {\r\n      const elementIdx = this.openElements[matchedOpenElementsIndex];\r\n      this.nodes[elementIdx].tokenCount = this.pos - this.nodes[elementIdx].tokenStart;\r\n\r\n      const closingNameIdx = this.createAndLinkClosingNameNode(\r\n        elementIdx,\r\n        tagNameStartPos,\r\n        tagNameCount,\r\n      );\r\n      this.buildElementNameParts(tagNameStartPos, tagNameCount, closingNameIdx);\r\n\r\n      for (let i = 0; i < matchDepth; i++) {\r\n        if (this.openElements.length > 1) {\r\n          const popped = this.openElements.pop()!;\r\n          this.cleanupTagNameStack(popped);\r\n        }\r\n      }\r\n      return;\r\n    }\r\n\r\n    // No match -> UnpairedClosingTag\r\n    this.addChild(\r\n      createFlatNode(\r\n        NodeKind.UnpairedClosingTag,\r\n        0,\r\n        startPos,\r\n        this.pos - startPos,\r\n        0,\r\n        tagNameCount,\r\n      ),\r\n    );\r\n  }\r\n\r\n  private createAndLinkClosingNameNode(\r\n    parentIdx: number,\r\n    tokenStart: number,\r\n    tokenCount: number,\r\n  ): number {\r\n    const idx = this.nodeCount++;\r\n    this.nodes[idx] = createFlatNode(\r\n      NodeKind.ClosingElementName,\r\n      parentIdx,\r\n      tokenStart,\r\n      tokenCount,\r\n    );\r\n\r\n    const lastChild = this.nodes[parentIdx].lastChild;\r\n    if (lastChild !== NONE) {\r\n      this.nodes[lastChild].nextSibling = idx;\r\n    } else {\r\n      this.nodes[parentIdx].firstChild = idx;\r\n    }\r\n    this.nodes[parentIdx].lastChild = idx;\r\n\r\n    return idx;\r\n  }\r\n\r\n  private isSlotClosingMatch(openTagName: string, closingTagName: string): boolean {\r\n    const lowerClose = closingTagName.toLowerCase();\r\n    if (lowerClose !== \"x-slot\") return false;\r\n\r\n    const lowerOpen = openTagName.toLowerCase();\r\n    return lowerOpen.startsWith(\"x-slot:\") || lowerOpen.startsWith(\"x-slot[\");\r\n  }\r\n\r\n  private scanElementName(): [number, number] {\r\n    const tokens = this.tokens;\r\n    const limit = tokens.length;\r\n    let count = 0;\r\n    let genericOffset = 0;\r\n\r\n    while (this.pos < limit) {\r\n      const type = tokens[this.pos].type;\r\n\r\n      if (this.isElementNameTerminator(type)) {\r\n        if (type === TokenType.TsxGenericType) {\r\n          genericOffset = count + 1;\r\n        }\r\n        break;\r\n      }\r\n\r\n      if (type === TokenType.TagName) {\r\n        count++;\r\n        this.pos++;\r\n        continue;\r\n      }\r\n\r\n      if (Constructs.isConstructStart(type)) {\r\n        const [newPos, constructCount] = Constructs.scanConstruct(tokens, this.pos, limit);\r\n        count += constructCount;\r\n        this.pos = newPos;\r\n        continue;\r\n      }\r\n\r\n      break;\r\n    }\r\n\r\n    return [count, genericOffset];\r\n  }\r\n\r\n  private isElementNameTerminator(type: number): boolean {\r\n    return (\r\n      type === TokenType.Whitespace ||\r\n      type === TokenType.GreaterThan ||\r\n      type === TokenType.Slash ||\r\n      type === TokenType.Directive ||\r\n      type === TokenType.TsxGenericType ||\r\n      type === TokenType.SyntheticClose\r\n    );\r\n  }\r\n\r\n  private buildElementNameParts(startPos: number, tokenCount: number, parentIdx: number): void {\r\n    const tokens = this.tokens;\r\n    const endPos = startPos + tokenCount;\r\n    let i = startPos;\r\n    let lastChildIdx: number | null = null;\r\n\r\n    while (i < endPos) {\r\n      const type = tokens[i].type;\r\n      let childTokenCount = 1;\r\n      let childNode: FlatNode | null = null;\r\n\r\n      if (type === TokenType.TagName) {\r\n        childNode = createFlatNode(NodeKind.Text, parentIdx, i, 1);\r\n      } else if (Constructs.isConstructStart(type)) {\r\n        const nodeKind = Constructs.getNodeKind(type) ?? NodeKind.Echo;\r\n        childTokenCount = Constructs.countConstructTokens(tokens, i, endPos);\r\n        childNode = createFlatNode(nodeKind, parentIdx, i, childTokenCount);\r\n      }\r\n\r\n      if (childNode !== null) {\r\n        const childIdx = this.nodeCount++;\r\n        this.nodes[childIdx] = childNode;\r\n\r\n        if (lastChildIdx === null) {\r\n          this.nodes[parentIdx].firstChild = childIdx;\r\n        } else {\r\n          this.nodes[lastChildIdx].nextSibling = childIdx;\r\n        }\r\n        this.nodes[parentIdx].lastChild = childIdx;\r\n        lastChildIdx = childIdx;\r\n      }\r\n\r\n      i += childTokenCount;\r\n    }\r\n  }\r\n\r\n  private getTagNameText(startPos: number, tokenCount: number): string {\r\n    let text = \"\";\r\n    const total = this.tokens.length;\r\n\r\n    for (let i = 0; i < tokenCount; i++) {\r\n      const idx = startPos + i;\r\n      if (idx >= total) break;\r\n      if (this.tokens[idx].type === TokenType.TagName) {\r\n        text += this.source.slice(this.tokens[idx].start, this.tokens[idx].end);\r\n      }\r\n    }\r\n    return text;\r\n  }\r\n\r\n  private getRawNameText(startPos: number, tokenCount: number): string {\r\n    let text = \"\";\r\n    const total = this.tokens.length;\r\n\r\n    for (let i = 0; i < tokenCount; i++) {\r\n      const idx = startPos + i;\r\n      if (idx >= total) break;\r\n      const token = this.tokens[idx];\r\n      text += this.source.slice(token.start, token.end);\r\n    }\r\n\r\n    return text;\r\n  }\r\n\r\n  private isDynamicTagName(startPos: number, tokenCount: number): boolean {\r\n    const total = this.tokens.length;\r\n    for (let i = 0; i < tokenCount; i++) {\r\n      const idx = startPos + i;\r\n      if (idx >= total) break;\r\n      if (this.tokens[idx].type !== TokenType.TagName) return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  // Attributes\r\n\r\n  private buildAttributes(elementIdx: number, _lastChildIdx: number): void {\r\n    const attrEnd = this.findAttributeRegionEnd();\r\n\r\n    this.openElements.push(elementIdx);\r\n    const savedDirectives = this.openDirectives;\r\n    const savedConditions = this.openConditions;\r\n    const savedAttributeRegionEnd = this.attributeRegionEnd;\r\n    this.openDirectives = [];\r\n    this.openConditions = [];\r\n    this.attributeRegionEnd = attrEnd;\r\n\r\n    try {\r\n      while (this.pos < attrEnd) {\r\n        const type = this.tokens[this.pos].type;\r\n\r\n        if (this.isInsideAttributePhpDirective()) {\r\n          if (type === TokenType.Directive) {\r\n            const directiveName = extractDirectiveName(this.tokens[this.pos], this.source);\r\n            if (directiveName === \"endphp\") {\r\n              this.processDirective();\r\n              continue;\r\n            }\r\n          }\r\n\r\n          if (Constructs.isConstructStart(type)) {\r\n            this.processConstructInAttributes(NodeKind.Echo);\r\n          } else {\r\n            this.processText();\r\n          }\r\n          continue;\r\n        }\r\n\r\n        if (type === TokenType.Whitespace) {\r\n          this.addChild(createFlatNode(NodeKind.AttributeWhitespace, 0, this.pos, 1));\r\n          this.pos++;\r\n          continue;\r\n        }\r\n\r\n        if (type === TokenType.Directive) {\r\n          if (this.isNonStructuralDirectiveToken(this.pos)) {\r\n            this.buildUnifiedAttribute(attrEnd);\r\n            continue;\r\n          }\r\n\r\n          this.processDirective();\r\n          continue;\r\n        }\r\n\r\n        if (type === TokenType.JsxShorthandAttribute) {\r\n          this.addChild(createFlatNode(NodeKind.JsxAttribute, 0, this.pos, 1));\r\n          this.pos++;\r\n          continue;\r\n        }\r\n\r\n        this.buildUnifiedAttribute(attrEnd);\r\n      }\r\n\r\n      this.closeRemainingAttributeDirectives();\r\n    } finally {\r\n      this.openDirectives = savedDirectives;\r\n      this.openConditions = savedConditions;\r\n      this.attributeRegionEnd = savedAttributeRegionEnd;\r\n      this.openElements.pop();\r\n    }\r\n  }\r\n\r\n  private isInsideAttributePhpDirective(): boolean {\r\n    if (this.openDirectives.length === 0) return false;\r\n    const top = this.openDirectives[this.openDirectives.length - 1];\r\n    return top.name === \"php\";\r\n  }\r\n\r\n  private findAttributeRegionEnd(): number {\r\n    let attrEnd = this.pos;\r\n    const total = this.tokens.length;\r\n\r\n    while (attrEnd < total) {\r\n      const type = this.tokens[attrEnd].type;\r\n\r\n      if (type === TokenType.GreaterThan || type === TokenType.SyntheticClose) break;\r\n\r\n      if (type === TokenType.Slash && attrEnd + 1 < total) {\r\n        const next = this.tokens[attrEnd + 1].type;\r\n        if (next === TokenType.GreaterThan || next === TokenType.SyntheticClose) break;\r\n      }\r\n\r\n      attrEnd++;\r\n    }\r\n\r\n    return attrEnd;\r\n  }\r\n\r\n  private buildUnifiedAttribute(attrEnd: number): void {\r\n    const attrStart = this.pos;\r\n    const bounds = this.scanAttributeBounds(attrEnd);\r\n\r\n    if (bounds.length === 0) {\r\n      this.pos++;\r\n      return;\r\n    }\r\n\r\n    this.pos = bounds.end;\r\n\r\n    const firstType = this.tokens[attrStart].type;\r\n    if (Constructs.isConstructStart(firstType)) {\r\n      const constructCount = Constructs.countConstructTokens(this.tokens, attrStart, attrEnd);\r\n      if (constructCount === bounds.length) {\r\n        this.pos = attrStart;\r\n        this.processConstructInAttributes(NodeKind.Echo);\r\n        return;\r\n      }\r\n    }\r\n\r\n    if (bounds.isNameValue) {\r\n      const attrIdx = this.addChild(\r\n        createFlatNode(NodeKind.Attribute, 0, attrStart, bounds.length),\r\n      );\r\n\r\n      const nameIdx = this.createFirstChild(\r\n        attrIdx,\r\n        NodeKind.AttributeName,\r\n        attrStart,\r\n        bounds.nameCount,\r\n      );\r\n      this.buildAttributeNameParts(attrStart, bounds.nameCount, nameIdx);\r\n\r\n      if (bounds.valueCount > 0) {\r\n        const valueIdx = this.createSiblingChild(\r\n          nameIdx,\r\n          attrIdx,\r\n          NodeKind.AttributeValue,\r\n          bounds.valueStart,\r\n          bounds.valueCount,\r\n        );\r\n        this.buildAttributeValueParts(bounds.valueStart, bounds.valueCount, valueIdx);\r\n      }\r\n      return;\r\n    }\r\n\r\n    // Standalone attribute (boolean)\r\n    const attrIdx = this.addChild(createFlatNode(NodeKind.Attribute, 0, attrStart, bounds.length));\r\n\r\n    const nameIdx = this.createFirstChild(\r\n      attrIdx,\r\n      NodeKind.AttributeName,\r\n      attrStart,\r\n      bounds.length,\r\n    );\r\n    this.buildAttributeNameParts(attrStart, bounds.length, nameIdx);\r\n  }\r\n\r\n  private scanAttributeBounds(attrEnd: number): {\r\n    length: number;\r\n    end: number;\r\n    isNameValue: boolean;\r\n    nameCount: number;\r\n    valueStart: number;\r\n    valueCount: number;\r\n  } {\r\n    const attrStart = this.pos;\r\n    let equalsPos = -1;\r\n    let nameEnd = -1;\r\n    let scanPos = this.pos;\r\n    let lastNonWhitespace = this.pos;\r\n\r\n    while (scanPos < attrEnd) {\r\n      const type = this.tokens[scanPos].type;\r\n\r\n      if (type === TokenType.Whitespace) {\r\n        let lookAhead = scanPos + 1;\r\n        while (lookAhead < attrEnd && this.tokens[lookAhead].type === TokenType.Whitespace) {\r\n          lookAhead++;\r\n        }\r\n        if (lookAhead < attrEnd && this.tokens[lookAhead].type === TokenType.Equals) {\r\n          scanPos = lookAhead;\r\n          continue;\r\n        }\r\n        break;\r\n      }\r\n\r\n      if (type === TokenType.Equals) {\r\n        equalsPos = scanPos;\r\n        nameEnd = lastNonWhitespace;\r\n        scanPos++;\r\n\r\n        while (scanPos < attrEnd && this.tokens[scanPos].type === TokenType.Whitespace) {\r\n          scanPos++;\r\n        }\r\n\r\n        if (scanPos < attrEnd) {\r\n          if (this.tokens[scanPos].type === TokenType.Quote) {\r\n            scanPos++;\r\n            while (scanPos < attrEnd && this.tokens[scanPos].type !== TokenType.Quote) {\r\n              scanPos = Constructs.advancePast(this.tokens, scanPos, attrEnd);\r\n            }\r\n            if (scanPos < attrEnd) scanPos++;\r\n          } else {\r\n            while (scanPos < attrEnd && this.tokens[scanPos].type !== TokenType.Whitespace) {\r\n              scanPos = Constructs.advancePast(this.tokens, scanPos, attrEnd);\r\n            }\r\n          }\r\n        }\r\n        break;\r\n      }\r\n\r\n      scanPos = Constructs.advancePast(this.tokens, scanPos, attrEnd);\r\n      lastNonWhitespace = scanPos;\r\n    }\r\n\r\n    const length = scanPos - attrStart;\r\n\r\n    if (length === 0) {\r\n      return {\r\n        length: 0,\r\n        end: scanPos,\r\n        isNameValue: false,\r\n        nameCount: 0,\r\n        valueStart: 0,\r\n        valueCount: 0,\r\n      };\r\n    }\r\n\r\n    if (equalsPos !== -1 && nameEnd !== -1) {\r\n      const nameCount = nameEnd - attrStart;\r\n      let valueStart = equalsPos + 1;\r\n      while (valueStart < scanPos && this.tokens[valueStart].type === TokenType.Whitespace) {\r\n        valueStart++;\r\n      }\r\n      const valueCount = scanPos - valueStart;\r\n\r\n      return { length, end: scanPos, isNameValue: true, nameCount, valueStart, valueCount };\r\n    }\r\n\r\n    return { length, end: scanPos, isNameValue: false, nameCount: 0, valueStart: 0, valueCount: 0 };\r\n  }\r\n\r\n  private buildAttributeNameParts(startPos: number, tokenCount: number, parentIdx: number): void {\r\n    this.buildParts(startPos, startPos + tokenCount, parentIdx, false);\r\n  }\r\n\r\n  private buildAttributeValueParts(startPos: number, tokenCount: number, parentIdx: number): void {\r\n    let i = startPos;\r\n    const endPos = startPos + tokenCount;\r\n\r\n    // Skip opening quote\r\n    if (i < endPos && this.tokens[i].type === TokenType.Quote) i++;\r\n\r\n    // Stop before closing quote\r\n    let effectiveEnd = endPos;\r\n    if (effectiveEnd > startPos && this.tokens[effectiveEnd - 1].type === TokenType.Quote) {\r\n      effectiveEnd--;\r\n    }\r\n\r\n    this.buildParts(i, effectiveEnd, parentIdx, true);\r\n  }\r\n\r\n  private buildParts(startPos: number, endPos: number, parentIdx: number, asValue: boolean): void {\r\n    let i = startPos;\r\n    let lastChildIdx: number | null = null;\r\n\r\n    while (i < endPos) {\r\n      const type = this.tokens[i].type;\r\n      let childTokenCount = 1;\r\n      let childNode: FlatNode;\r\n\r\n      if (this.isTextLike(type, asValue)) {\r\n        childNode = createFlatNode(NodeKind.Text, parentIdx, i, 1);\r\n      } else if (Constructs.isConstructStart(type)) {\r\n        const nodeKind = Constructs.getNodeKind(type) ?? NodeKind.Echo;\r\n        childTokenCount = Constructs.countConstructTokens(this.tokens, i, endPos);\r\n        childNode = createFlatNode(nodeKind, parentIdx, i, childTokenCount);\r\n      } else if (asValue && type === TokenType.Directive) {\r\n        let dirEnd = i + 1;\r\n        if (dirEnd < endPos && this.tokens[dirEnd].type === TokenType.DirectiveArgs) {\r\n          dirEnd++;\r\n        }\r\n        childTokenCount = dirEnd - i;\r\n        childNode = createFlatNode(NodeKind.Directive, parentIdx, i, childTokenCount);\r\n      } else {\r\n        childNode = createFlatNode(NodeKind.Text, parentIdx, i, 1);\r\n      }\r\n\r\n      const childIdx = this.nodeCount++;\r\n      this.nodes[childIdx] = childNode;\r\n\r\n      if (lastChildIdx === null) {\r\n        this.nodes[parentIdx].firstChild = childIdx;\r\n      } else {\r\n        this.nodes[lastChildIdx].nextSibling = childIdx;\r\n      }\r\n      this.nodes[parentIdx].lastChild = childIdx;\r\n      lastChildIdx = childIdx;\r\n\r\n      i += childTokenCount;\r\n    }\r\n  }\r\n\r\n  private isTextLike(type: number, asValue: boolean): boolean {\r\n    if (asValue) {\r\n      return type === TokenType.AttributeValue || type === TokenType.Text;\r\n    }\r\n    return (\r\n      type === TokenType.AttributeName ||\r\n      type === TokenType.BoundAttribute ||\r\n      type === TokenType.EscapedAttribute ||\r\n      type === TokenType.ShorthandAttribute ||\r\n      type === TokenType.Text\r\n    );\r\n  }\r\n\r\n  private processConstructInAttributes(defaultKind: number): void {\r\n    const startPos = this.pos;\r\n    const startType = this.tokens[startPos].type;\r\n    const nodeKind = Constructs.getNodeKind(startType) ?? defaultKind;\r\n    const constructTokenCount = Constructs.countConstructTokens(\r\n      this.tokens,\r\n      startPos,\r\n      this.tokens.length,\r\n    );\r\n    this.pos += constructTokenCount;\r\n\r\n    this.addChild(createFlatNode(nodeKind, 0, startPos, constructTokenCount));\r\n  }\r\n\r\n  private closeRemainingAttributeDirectives(): void {\r\n    while (this.openConditions.length > 0) {\r\n      const frame = this.openConditions.pop()!;\r\n      this.popIfTop(frame.currentBranchIdx);\r\n      this.popIfTop(frame.blockIdx);\r\n      this.nodes[frame.blockIdx].tokenCount = this.pos - this.nodes[frame.blockIdx].tokenStart;\r\n    }\r\n\r\n    while (this.openDirectives.length > 0) {\r\n      const frame = this.openDirectives.pop()!;\r\n      this.popIfTop(frame.startDirectiveIdx);\r\n      this.popIfTop(frame.blockIdx);\r\n      this.nodes[frame.blockIdx].tokenCount = this.pos - this.nodes[frame.blockIdx].tokenStart;\r\n    }\r\n  }\r\n\r\n  private processDirective(): void {\r\n    const startPos = this.pos;\r\n    if (this.isInsideMalformedRawElement() || this.isNonStructuralDirectiveToken(startPos)) {\r\n      this.processNonStructuralDirective(startPos);\r\n      return;\r\n    }\r\n\r\n    const directiveToken = this.tokens[this.pos];\r\n    const directiveName = extractDirectiveName(directiveToken, this.source);\r\n\r\n    let tokenCount = 1;\r\n    const argsInfo = checkDirectiveArgsFast(this.tokens, this.pos + 1, this.tokens.length);\r\n    tokenCount += argsInfo.consumed;\r\n    const argsContent =\r\n      argsInfo.argsTokenIndex >= 0\r\n        ? this.source.slice(\r\n            this.tokens[argsInfo.argsTokenIndex].start,\r\n            this.tokens[argsInfo.argsTokenIndex].end,\r\n          )\r\n        : null;\r\n\r\n    if (this.isSwitchRelatedDirective(directiveName)) {\r\n      this.processSwitchDirective(directiveName, startPos, tokenCount, null);\r\n      return;\r\n    }\r\n\r\n    if (this.directives.isConditionalPair(directiveName)) {\r\n      this.processConditionalPairingDirective(directiveName, startPos, tokenCount, argsContent);\r\n      return;\r\n    }\r\n\r\n    if (this.isConditionRelatedDirective(directiveName)) {\r\n      this.processConditionDirective(directiveName, startPos, tokenCount, argsContent);\r\n      return;\r\n    }\r\n\r\n    if (this.shouldTreatAsBranchOfOpenDirective(directiveName, argsContent)) {\r\n      this.openDirectiveBranch(directiveName, startPos, tokenCount, null);\r\n      return;\r\n    }\r\n\r\n    if (this.isClosingDirective(directiveName)) {\r\n      this.closeDirective(directiveName, startPos, tokenCount, null);\r\n      return;\r\n    }\r\n\r\n    if (directiveName === \"php\" && argsInfo.hasArgs) {\r\n      this.createStandaloneDirective(directiveName, startPos, tokenCount, null);\r\n      return;\r\n    }\r\n\r\n    if (\r\n      this.directives.isPaired(directiveName) &&\r\n      this.shouldOpenKnownPairedDirective(directiveName, startPos, tokenCount)\r\n    ) {\r\n      this.openPairedDirective(directiveName, startPos, tokenCount);\r\n      return;\r\n    }\r\n\r\n    if (this.tryOpenDiscoveredDirective(directiveName, startPos, tokenCount)) {\r\n      return;\r\n    }\r\n\r\n    this.createStandaloneDirective(directiveName, startPos, tokenCount, null);\r\n  }\r\n\r\n  private processNonStructuralDirective(startPos: number): void {\r\n    const argsInfo = checkDirectiveArgsFast(this.tokens, startPos + 1, this.tokens.length);\r\n    const tokenCount = 1 + argsInfo.consumed;\r\n    this.addChild(createFlatNode(NodeKind.Directive, 0, startPos, tokenCount));\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private tryOpenDiscoveredDirective(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n  ): boolean {\r\n    const family = this.resolveDiscoveredDirectiveFamily(directiveName);\r\n    if (family === null) {\r\n      return false;\r\n    }\r\n\r\n    const { hasAdvisoryCondition, elseName, endName, openers } = family;\r\n    const directiveIndex = this.getDirectiveIndex();\r\n    const directiveStart = startPos + tokenCount;\r\n\r\n    if (!hasAdvisoryCondition) {\r\n      const searchEnd = this.getDirectiveSearchEnd(openers, directiveStart, [endName]);\r\n      if (!this.hasDirectiveInSearchRange(directiveIndex, endName, directiveStart, searchEnd)) {\r\n        return false;\r\n      }\r\n\r\n      const terminatorIdx = directiveIndex.findMatchingTerminatorForOpeners(\r\n        openers,\r\n        directiveStart,\r\n        [endName],\r\n        searchEnd,\r\n      );\r\n\r\n      if (terminatorIdx === null) {\r\n        return false;\r\n      }\r\n\r\n      this.openPairedDirective(directiveName, startPos, tokenCount, {\r\n        terminators: [endName],\r\n        branches: [],\r\n        openers,\r\n      });\r\n\r\n      return true;\r\n    }\r\n\r\n    const genericConditionTerminators = this.directives.getConditionTerminators();\r\n    const terminators = genericConditionTerminators.includes(endName)\r\n      ? genericConditionTerminators\r\n      : [endName, ...genericConditionTerminators];\r\n    const branches = [elseName, \"else\", \"elseif\"];\r\n    const searchEnd = this.getDirectiveSearchEnd(openers, directiveStart, terminators, branches);\r\n    if (\r\n      !this.hasDirectiveInSearchRange(directiveIndex, endName, directiveStart, searchEnd) &&\r\n      !this.hasDirectiveInSearchRange(directiveIndex, elseName, directiveStart, searchEnd) &&\r\n      !genericConditionTerminators.some((name) =>\r\n        this.hasDirectiveInSearchRange(directiveIndex, name, directiveStart, searchEnd),\r\n      )\r\n    ) {\r\n      return false;\r\n    }\r\n\r\n    const analysis = directiveIndex.analyzeUnknownDirectiveFamily(\r\n      openers,\r\n      directiveStart,\r\n      terminators,\r\n      branches,\r\n      searchEnd,\r\n    );\r\n\r\n    if (analysis.terminatorIdx === null || analysis.terminatorName === null) {\r\n      return false;\r\n    }\r\n\r\n    const opensAsConditionLike =\r\n      hasAdvisoryCondition && (analysis.branchIdx !== null || analysis.terminatorName !== endName);\r\n\r\n    this.openPairedDirective(directiveName, startPos, tokenCount, {\r\n      terminators: opensAsConditionLike ? terminators : [endName],\r\n      branches: opensAsConditionLike ? branches : [],\r\n      openers,\r\n    });\r\n\r\n    return true;\r\n  }\r\n\r\n  private resolveDiscoveredDirectiveFamily(directiveName: string): {\r\n    elseName: string;\r\n    endName: string;\r\n    openers: string[];\r\n    hasAdvisoryPair: boolean;\r\n    hasAdvisoryCondition: boolean;\r\n  } | null {\r\n    directiveName = directiveName.toLowerCase();\r\n    if (this.discoveredDirectiveFamilyCache.has(directiveName)) {\r\n      return this.discoveredDirectiveFamilyCache.get(directiveName) ?? null;\r\n    }\r\n\r\n    if (this.directives.isDirective(directiveName)) {\r\n      this.discoveredDirectiveFamilyCache.set(directiveName, null);\r\n      return null;\r\n    }\r\n\r\n    let baseName = directiveName;\r\n    let unlessName = `unless${directiveName}`;\r\n    let isUnlessVariant = false;\r\n\r\n    if (directiveName.startsWith(\"unless\") && directiveName.length > \"unless\".length) {\r\n      const candidateBase = directiveName.slice(\"unless\".length);\r\n      if (candidateBase.length === 0 || this.directives.isDirective(candidateBase)) {\r\n        this.discoveredDirectiveFamilyCache.set(directiveName, null);\r\n        return null;\r\n      }\r\n\r\n      baseName = candidateBase;\r\n      unlessName = directiveName;\r\n      isUnlessVariant = true;\r\n    }\r\n\r\n    const elseName = `else${baseName}`;\r\n    const endName = `end${baseName}`;\r\n    const hasAdvisoryPair =\r\n      this.directives.hasAdvisoryPair(baseName) || this.directives.hasSeenDirective(endName);\r\n    const hasAdvisoryCondition =\r\n      this.directives.hasAdvisoryCondition(baseName) || this.directives.hasSeenDirective(elseName);\r\n\r\n    if (!hasAdvisoryPair && !hasAdvisoryCondition) {\r\n      this.discoveredDirectiveFamilyCache.set(directiveName, null);\r\n      return null;\r\n    }\r\n\r\n    const openers =\r\n      isUnlessVariant || this.directives.hasSeenDirective(unlessName)\r\n        ? [baseName, unlessName]\r\n        : [directiveName];\r\n\r\n    const family = { elseName, endName, openers, hasAdvisoryPair, hasAdvisoryCondition };\r\n    this.discoveredDirectiveFamilyCache.set(directiveName, family);\r\n    return family;\r\n  }\r\n\r\n  private hasDirectiveInSearchRange(\r\n    index: DirectiveTokenIndex,\r\n    directiveName: string,\r\n    minIdx: number,\r\n    maxIdxExclusive: number | null,\r\n  ): boolean {\r\n    return maxIdxExclusive === null\r\n      ? index.existsAfter(directiveName, minIdx)\r\n      : index.existsBetween(directiveName, minIdx, maxIdxExclusive);\r\n  }\r\n\r\n  private shouldOpenKnownPairedDirective(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n  ): boolean {\r\n    const directive = this.directives.getDirective(directiveName);\r\n    const terminators = directive?.terminators ?? [];\r\n    const branches = directive?.conditionLikeBranches ?? [];\r\n    return (\r\n      terminators.length > 0 &&\r\n      this.hasMatchingTerminatorInCurrentScope(\r\n        directiveName,\r\n        startPos + tokenCount,\r\n        terminators,\r\n        undefined,\r\n        branches,\r\n      )\r\n    );\r\n  }\r\n\r\n  private getDirectiveOpenersForTerminators(\r\n    directiveName: string,\r\n    terminators: readonly string[],\r\n  ): string[] {\r\n    const openers = this.directives.getOpenersForTerminators(terminators);\r\n    if (openers.length > 0) {\r\n      return openers;\r\n    }\r\n\r\n    return directiveName === \"\" ? [] : [directiveName.toLowerCase()];\r\n  }\r\n\r\n  private getDirectiveSearchEnd(\r\n    openerNames: string[],\r\n    startIdx: number,\r\n    candidateTerminators: readonly string[] = [],\r\n    candidateBranches: readonly string[] = [],\r\n  ): number | null {\r\n    let searchEnd = this.attributeRegionEnd;\r\n    searchEnd = this.takeEarlierBoundary(searchEnd, this.findOpenElementBoundary(startIdx));\r\n    searchEnd = this.takeEarlierBoundary(\r\n      searchEnd,\r\n      this.findOpenDirectiveBoundary(\r\n        openerNames,\r\n        candidateTerminators,\r\n        candidateBranches,\r\n        startIdx,\r\n      ),\r\n    );\r\n    searchEnd = this.takeEarlierBoundary(\r\n      searchEnd,\r\n      this.findOpenConditionBoundary(\r\n        openerNames,\r\n        candidateTerminators,\r\n        candidateBranches,\r\n        startIdx,\r\n      ),\r\n    );\r\n    searchEnd = this.takeEarlierBoundary(\r\n      searchEnd,\r\n      this.findOpenSwitchBoundary(openerNames, candidateTerminators, startIdx),\r\n    );\r\n\r\n    return searchEnd;\r\n  }\r\n\r\n  private takeEarlierBoundary(current: number | null, candidate: number | null): number | null {\r\n    if (candidate === null) {\r\n      return current;\r\n    }\r\n    if (current === null || candidate < current) {\r\n      return candidate;\r\n    }\r\n    return current;\r\n  }\r\n\r\n  private findOpenElementBoundary(startIdx: number): number | null {\r\n    let containingTagName: string | null = null;\r\n\r\n    for (let i = this.openElements.length - 1; i >= 0; i--) {\r\n      const elementIdx = this.openElements[i];\r\n      if (this.nodes[elementIdx]?.kind !== NodeKind.Element) continue;\r\n      containingTagName = this.tagNames.get(elementIdx) ?? null;\r\n      if (containingTagName !== null) {\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (containingTagName === null) {\r\n      return null;\r\n    }\r\n\r\n    let containingTagDepth = 0;\r\n    for (let i = startIdx; i < this.tokens.length; i++) {\r\n      if (this.tokens[i].type !== TokenType.LessThan) continue;\r\n      if (i + 2 >= this.tokens.length) continue;\r\n      if (this.tokens[i + 1].type === TokenType.Slash) {\r\n        if (this.tokens[i + 2].type !== TokenType.TagName) continue;\r\n\r\n        const closingTagName = this.source\r\n          .slice(this.tokens[i + 2].start, this.tokens[i + 2].end)\r\n          .toLowerCase();\r\n        if (closingTagName !== containingTagName) continue;\r\n\r\n        if (containingTagDepth === 0) {\r\n          return i;\r\n        }\r\n\r\n        containingTagDepth--;\r\n        continue;\r\n      }\r\n\r\n      if (this.tokens[i + 1].type !== TokenType.TagName) continue;\r\n      const openingTagName = this.source\r\n        .slice(this.tokens[i + 1].start, this.tokens[i + 1].end)\r\n        .toLowerCase();\r\n      if (openingTagName !== containingTagName) continue;\r\n\r\n      if (!this.isSelfClosingElementAt(i, this.tokens.length)) {\r\n        containingTagDepth++;\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private isSelfClosingElementAt(startIdx: number, limitIdx: number): boolean {\r\n    for (let i = startIdx + 1; i < limitIdx; i++) {\r\n      const type = this.tokens[i].type;\r\n      if (type === TokenType.GreaterThan) {\r\n        return this.tokens[i - 1]?.type === TokenType.Slash;\r\n      }\r\n      if (type === TokenType.SyntheticClose) {\r\n        return false;\r\n      }\r\n      if (type === TokenType.LessThan) {\r\n        return false;\r\n      }\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  private findOpenDirectiveBoundary(\r\n    openerNames: string[],\r\n    candidateTerminators: readonly string[],\r\n    candidateBranches: readonly string[],\r\n    startIdx: number,\r\n  ): number | null {\r\n    if (this.openDirectives.length === 0) {\r\n      return null;\r\n    }\r\n\r\n    let boundary: number | null = null;\r\n\r\n    for (const frame of this.openDirectives) {\r\n      if (frame.terminators.length === 0 && frame.branches.length === 0) continue;\r\n      const reservesCandidateCloser =\r\n        this.namesIntersect(frame.openers, openerNames) ||\r\n        this.namesIntersect(frame.terminators, candidateTerminators);\r\n      const branches = this.getBoundaryBranches(frame.branches, candidateBranches);\r\n      const boundaryIdx = this.findFrameBoundary(\r\n        frame.openers,\r\n        startIdx,\r\n        frame.terminators,\r\n        branches,\r\n        reservesCandidateCloser,\r\n        openerNames,\r\n      );\r\n      if (boundaryIdx !== null) {\r\n        boundary = this.takeEarlierBoundary(boundary, boundaryIdx);\r\n      }\r\n    }\r\n\r\n    return boundary;\r\n  }\r\n\r\n  private namesIntersect(left: readonly string[], right: readonly string[]): boolean {\r\n    if (left.length === 0 || right.length === 0) {\r\n      return false;\r\n    }\r\n\r\n    const rightSet = new Set(right);\r\n    return left.some((name) => rightSet.has(name));\r\n  }\r\n\r\n  private findOpenConditionBoundary(\r\n    openerNames: string[],\r\n    candidateTerminators: readonly string[],\r\n    candidateBranches: readonly string[],\r\n    startIdx: number,\r\n  ): number | null {\r\n    if (this.openConditions.length === 0) {\r\n      return null;\r\n    }\r\n\r\n    const terminators = this.directives.getConditionTerminators();\r\n    const conditionOpeners = this.getDirectiveOpenersForTerminators(\"\", terminators);\r\n    let boundary: number | null = null;\r\n\r\n    for (const frame of this.openConditions) {\r\n      const branches = this.getBoundaryBranches(\r\n        this.getConditionBoundaryBranches(frame.name),\r\n        candidateBranches,\r\n      );\r\n      const reservesCandidateCloser =\r\n        this.namesIntersect(conditionOpeners, openerNames) ||\r\n        this.namesIntersect(terminators, candidateTerminators);\r\n      const boundaryIdx = this.findFrameBoundary(\r\n        conditionOpeners,\r\n        startIdx,\r\n        terminators,\r\n        branches,\r\n        reservesCandidateCloser,\r\n        openerNames,\r\n      );\r\n      if (boundaryIdx !== null) {\r\n        boundary = this.takeEarlierBoundary(boundary, boundaryIdx);\r\n      }\r\n    }\r\n\r\n    return boundary;\r\n  }\r\n\r\n  private getConditionBoundaryBranches(directiveName: string): string[] {\r\n    const terminators = new Set(this.directives.getConditionTerminators());\r\n    return this.directives\r\n      .getBranches(directiveName)\r\n      .filter((branchName) => !terminators.has(branchName));\r\n  }\r\n\r\n  private findOpenSwitchBoundary(\r\n    openerNames: string[],\r\n    candidateTerminators: readonly string[],\r\n    startIdx: number,\r\n  ): number | null {\r\n    if (this.openSwitches.length === 0) {\r\n      return null;\r\n    }\r\n\r\n    let boundary: number | null = null;\r\n    for (const frame of this.openSwitches) {\r\n      const reservesCandidateCloser =\r\n        openerNames.includes(frame.name) ||\r\n        this.namesIntersect([\"endswitch\"], candidateTerminators);\r\n      const boundaryIdx = this.findFrameBoundary(\r\n        [frame.name],\r\n        startIdx,\r\n        [\"endswitch\"],\r\n        this.directives.getSwitchBranches(frame.name),\r\n        reservesCandidateCloser,\r\n        openerNames,\r\n      );\r\n      if (boundaryIdx !== null) {\r\n        boundary = this.takeEarlierBoundary(boundary, boundaryIdx);\r\n      }\r\n    }\r\n\r\n    return boundary;\r\n  }\r\n\r\n  private getBoundaryBranches(\r\n    frameBranches: string[],\r\n    candidateBranches: readonly string[],\r\n  ): string[] {\r\n    if (candidateBranches.length === 0 || frameBranches.length === 0) {\r\n      return frameBranches;\r\n    }\r\n\r\n    const candidateBranchSet = new Set(candidateBranches);\r\n    return frameBranches.filter((branchName) => !candidateBranchSet.has(branchName));\r\n  }\r\n\r\n  private findFrameBoundary(\r\n    openerNames: string[],\r\n    startIdx: number,\r\n    terminators: string[],\r\n    branches: string[],\r\n    reservesCandidateCloser: boolean,\r\n    candidateOpenerNames: readonly string[] = [],\r\n  ): number | null {\r\n    const index = this.getDirectiveIndex();\r\n    const candidateOpenerSet =\r\n      candidateOpenerNames.length > 0 ? new Set(candidateOpenerNames) : null;\r\n    const shouldCountBranch =\r\n      candidateOpenerSet === null\r\n        ? undefined\r\n        : (tokenIdx: number, name: string): boolean => {\r\n            const boundaryIsShadowed = this.isBranchBoundaryShadowed(startIdx, tokenIdx, name);\r\n            if (!candidateOpenerSet.has(name)) {\r\n              return !boundaryIsShadowed;\r\n            }\r\n\r\n            const directive = this.directives.getDirective(name);\r\n            if (directive?.role !== StructureRole.Opening || directive.terminators.length === 0) {\r\n              return !boundaryIsShadowed;\r\n            }\r\n\r\n            return !index.hasArgs(tokenIdx) && !boundaryIsShadowed;\r\n          };\r\n    const find = (initialNesting: number): number | null =>\r\n      branches.length > 0\r\n        ? index.findMatchingBoundaryForOpeners(\r\n            openerNames,\r\n            startIdx,\r\n            terminators,\r\n            branches,\r\n            null,\r\n            initialNesting,\r\n            shouldCountBranch,\r\n          )\r\n        : index.findMatchingTerminatorForOpeners(\r\n            openerNames,\r\n            startIdx,\r\n            terminators,\r\n            null,\r\n            initialNesting,\r\n          );\r\n\r\n    if (!reservesCandidateCloser) {\r\n      return find(0);\r\n    }\r\n\r\n    return find(1) ?? find(0);\r\n  }\r\n\r\n  private isBranchBoundaryShadowed(\r\n    startIdx: number,\r\n    boundaryIdx: number,\r\n    branchName: string,\r\n  ): boolean {\r\n    const stack: Array<{ terminators: string[]; branches: string[] }> = [];\r\n    const branch = branchName.toLowerCase();\r\n\r\n    for (let i = startIdx; i < boundaryIdx; i++) {\r\n      const token = this.tokens[i];\r\n      if (token.type !== TokenType.Directive) {\r\n        continue;\r\n      }\r\n      if (this.isNonStructuralDirectiveToken(i)) {\r\n        continue;\r\n      }\r\n\r\n      const directiveName = extractDirectiveName(token, this.source);\r\n      const top = stack[stack.length - 1];\r\n      if (top) {\r\n        if (top.terminators.includes(directiveName)) {\r\n          stack.pop();\r\n          continue;\r\n        }\r\n        if (top.branches.includes(directiveName)) {\r\n          continue;\r\n        }\r\n      }\r\n\r\n      const hasArgs = checkDirectiveArgsFast(this.tokens, i + 1, boundaryIdx).hasArgs;\r\n      const shield = this.getBranchBoundaryShield(directiveName, hasArgs, branch);\r\n      if (shield !== null) {\r\n        stack.push(shield);\r\n      }\r\n    }\r\n\r\n    return stack.length > 0;\r\n  }\r\n\r\n  private getBranchBoundaryShield(\r\n    directiveName: string,\r\n    hasArgs: boolean,\r\n    branchName: string,\r\n  ): { terminators: string[]; branches: string[] } | null {\r\n    const directive = this.directives.getDirective(directiveName);\r\n    if (\r\n      directive === null ||\r\n      directive.role !== StructureRole.Opening ||\r\n      directive.terminators.length === 0\r\n    ) {\r\n      return null;\r\n    }\r\n\r\n    if (directiveName === branchName && !hasArgs) {\r\n      return null;\r\n    }\r\n\r\n    const branches = directive.isCondition\r\n      ? this.getConditionBoundaryBranches(directiveName)\r\n      : directive.conditionLikeBranches;\r\n    if (!branches.includes(branchName)) {\r\n      return null;\r\n    }\r\n\r\n    return {\r\n      terminators: directive.isCondition\r\n        ? this.directives.getConditionTerminators()\r\n        : directive.terminators,\r\n      branches,\r\n    };\r\n  }\r\n\r\n  private isClosingDirective(directiveName: string): boolean {\r\n    if (this.openDirectives.length === 0) return false;\r\n\r\n    for (let i = this.openDirectives.length - 1; i >= 0; i--) {\r\n      const frame = this.openDirectives[i];\r\n      if (frame.terminators.includes(directiveName)) return true;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  private isBranchOfOpenDirective(directiveName: string): boolean {\r\n    if (this.openDirectives.length === 0) return false;\r\n\r\n    for (let i = this.openDirectives.length - 1; i >= 0; i--) {\r\n      const frame = this.openDirectives[i];\r\n      if (frame.branches.includes(directiveName)) return true;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  private shouldTreatAsBranchOfOpenDirective(\r\n    directiveName: string,\r\n    argsContent: string | null,\r\n  ): boolean {\r\n    if (!this.isBranchOfOpenDirective(directiveName)) {\r\n      return false;\r\n    }\r\n\r\n    const directive = this.directives.getDirective(directiveName);\r\n    if (\r\n      argsContent !== null &&\r\n      directive?.role === StructureRole.Opening &&\r\n      directive.terminators.length > 0\r\n    ) {\r\n      return false;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  private openPairedDirective(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    frameMeta?: { terminators: string[]; branches: string[]; openers: string[] },\r\n  ): void {\r\n    const blockIdx = this.addChild(\r\n      createFlatNode(NodeKind.DirectiveBlock, 0, startPos, tokenCount),\r\n    );\r\n\r\n    const elementStackBase = this.openElements.length;\r\n    this.checkElementDepth();\r\n    this.openElements.push(blockIdx);\r\n\r\n    const startDirectiveIdx = this.addChild(\r\n      createFlatNode(NodeKind.Directive, 0, startPos, tokenCount),\r\n    );\r\n\r\n    this.checkDirectiveDepth();\r\n    const directive = this.directives.getDirective(directiveName);\r\n    const terminators = frameMeta?.terminators ?? directive?.terminators ?? [];\r\n    const branches = frameMeta?.branches ?? directive?.conditionLikeBranches ?? [];\r\n    const openers =\r\n      frameMeta?.openers ?? this.getDirectiveOpenersForTerminators(directiveName, terminators);\r\n    this.openDirectives.push({\r\n      blockIdx,\r\n      startDirectiveIdx,\r\n      name: directiveName,\r\n      elementStackBase,\r\n      terminators,\r\n      branches,\r\n      openers,\r\n    });\r\n\r\n    this.checkElementDepth();\r\n    this.openElements.push(startDirectiveIdx);\r\n\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private openDirectiveBranch(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): void {\r\n    if (this.openDirectives.length === 0) {\r\n      this.createStandaloneDirective(directiveName, startPos, tokenCount, argsContent);\r\n      return;\r\n    }\r\n\r\n    let matchedIdx = -1;\r\n    for (let i = this.openDirectives.length - 1; i >= 0; i--) {\r\n      const frame = this.openDirectives[i];\r\n      if (frame.branches.includes(directiveName)) {\r\n        matchedIdx = i;\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (matchedIdx === -1) {\r\n      this.createStandaloneDirective(directiveName, startPos, tokenCount, argsContent);\r\n      return;\r\n    }\r\n\r\n    while (this.openDirectives.length - 1 > matchedIdx) {\r\n      const unmatchedFrame = this.openDirectives.pop()!;\r\n      this.closeUnmatchedDirectiveAtBoundary(unmatchedFrame, startPos);\r\n    }\r\n\r\n    const frame = this.openDirectives[matchedIdx];\r\n    this.popIfTop(frame.startDirectiveIdx);\r\n    this.popElementsToDepth(frame.elementStackBase + 1);\r\n\r\n    const branchIdx = this.addChild(createFlatNode(NodeKind.Directive, 0, startPos, tokenCount));\r\n\r\n    this.checkElementDepth();\r\n    this.openElements.push(branchIdx);\r\n    frame.startDirectiveIdx = branchIdx;\r\n\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private closeDirective(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): void {\r\n    let matchedIdx = -1;\r\n\r\n    for (let i = this.openDirectives.length - 1; i >= 0; i--) {\r\n      const frame = this.openDirectives[i];\r\n      if (frame.terminators.includes(directiveName)) {\r\n        matchedIdx = i;\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (matchedIdx === -1) {\r\n      this.createStandaloneDirective(directiveName, startPos, tokenCount, argsContent);\r\n      return;\r\n    }\r\n\r\n    while (this.openDirectives.length - 1 > matchedIdx) {\r\n      const unmatchedFrame = this.openDirectives.pop()!;\r\n      this.closeUnmatchedDirectiveAtBoundary(unmatchedFrame, startPos);\r\n    }\r\n\r\n    const frame = this.openDirectives.pop()!;\r\n    this.closeMatchedDirective(frame, startPos, tokenCount);\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private closeUnmatchedDirectiveAtBoundary(frame: DirectiveFrame, boundaryPos: number): void {\r\n    this.popElementsToDepth(frame.elementStackBase + 2);\r\n    this.popIfTop(frame.startDirectiveIdx);\r\n    this.popIfTop(frame.blockIdx);\r\n    this.nodes[frame.blockIdx].tokenCount = boundaryPos - this.nodes[frame.blockIdx].tokenStart;\r\n  }\r\n\r\n  private closeMatchedDirective(frame: DirectiveFrame, startPos: number, tokenCount: number): void {\r\n    this.popElementsToDepth(frame.elementStackBase + 2);\r\n    this.popIfTop(frame.startDirectiveIdx);\r\n\r\n    this.addChild(createFlatNode(NodeKind.Directive, 0, startPos, tokenCount));\r\n\r\n    this.popIfTop(frame.blockIdx);\r\n\r\n    const endPos = startPos + tokenCount;\r\n    this.nodes[frame.blockIdx].tokenCount = endPos - this.nodes[frame.blockIdx].tokenStart;\r\n  }\r\n\r\n  private createStandaloneDirective(\r\n    _directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    _argsContent: string | null,\r\n  ): void {\r\n    this.addChild(createFlatNode(NodeKind.Directive, 0, startPos, tokenCount));\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private isConditionRelatedDirective(directiveName: string): boolean {\r\n    if (this.directives.isCondition(directiveName)) return true;\r\n\r\n    if (this.openConditions.length > 0) {\r\n      const currentCondition = this.openConditions[this.openConditions.length - 1];\r\n      const branches = this.directives.getBranches(currentCondition.name);\r\n      for (const branch of branches) {\r\n        if (branch.toLowerCase() === directiveName) return true;\r\n      }\r\n    }\r\n\r\n    const terminators = this.directives.getConditionTerminators();\r\n    return terminators.includes(directiveName);\r\n  }\r\n\r\n  private processConditionDirective(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): void {\r\n    if (\r\n      this.tryHandleConditionDirectiveWithOpenDirective(\r\n        directiveName,\r\n        startPos,\r\n        tokenCount,\r\n        argsContent,\r\n      )\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    const terminators = this.directives.getConditionTerminators();\r\n    const isFinalTerminator = terminators.includes(directiveName);\r\n\r\n    if (isFinalTerminator && this.openConditions.length > 0) {\r\n      this.closeCondition(directiveName, startPos, tokenCount, argsContent);\r\n      return;\r\n    }\r\n\r\n    if (this.openConditions.length > 0) {\r\n      const currentCondition = this.openConditions[this.openConditions.length - 1];\r\n      const branches = this.directives.getBranches(currentCondition.name);\r\n      for (const branch of branches) {\r\n        if (branch.toLowerCase() === directiveName) {\r\n          this.openConditionBranch(directiveName, startPos, tokenCount, argsContent);\r\n          return;\r\n        }\r\n      }\r\n    }\r\n\r\n    const directive = this.directives.getDirective(directiveName);\r\n    if (\r\n      this.directives.isCondition(directiveName) &&\r\n      directive !== null &&\r\n      directive.role === StructureRole.Opening\r\n    ) {\r\n      if (this.shouldOpenKnownConditionDirective(directiveName, startPos, tokenCount)) {\r\n        this.openCondition(directiveName, startPos, tokenCount, argsContent);\r\n      } else {\r\n        this.createStandaloneDirective(directiveName, startPos, tokenCount, argsContent);\r\n      }\r\n      return;\r\n    }\r\n\r\n    this.createStandaloneDirective(directiveName, startPos, tokenCount, argsContent);\r\n  }\r\n\r\n  private shouldOpenKnownConditionDirective(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n  ): boolean {\r\n    const terminators = this.directives.getConditionTerminators();\r\n    const branches = this.getConditionBoundaryBranches(directiveName);\r\n    return (\r\n      terminators.length > 0 &&\r\n      this.hasMatchingTerminatorInCurrentScope(\r\n        directiveName,\r\n        startPos + tokenCount,\r\n        terminators,\r\n        undefined,\r\n        branches,\r\n      )\r\n    );\r\n  }\r\n\r\n  private tryHandleConditionDirectiveWithOpenDirective(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): boolean {\r\n    const directiveMatch = this.getMatchingOpenDirectiveFrame(directiveName);\r\n    if (directiveMatch === null) {\r\n      return false;\r\n    }\r\n\r\n    const directive = this.directives.getDirective(directiveName);\r\n    if (\r\n      directiveMatch.kind === \"branch\" &&\r\n      argsContent !== null &&\r\n      directive?.role === StructureRole.Opening &&\r\n      this.directives.isCondition(directiveName)\r\n    ) {\r\n      return false;\r\n    }\r\n\r\n    const conditionMatch = this.getMatchingOpenConditionFrame(directiveName);\r\n    if (\r\n      conditionMatch !== null &&\r\n      this.getConditionFrameTokenStart(conditionMatch.frame) >=\r\n        this.getDirectiveFrameTokenStart(directiveMatch.frame)\r\n    ) {\r\n      return false;\r\n    }\r\n\r\n    if (directiveMatch.kind === \"branch\") {\r\n      this.openDirectiveBranch(directiveName, startPos, tokenCount, argsContent);\r\n      return true;\r\n    }\r\n\r\n    this.closeDirective(directiveName, startPos, tokenCount, argsContent);\r\n    return true;\r\n  }\r\n\r\n  private getMatchingOpenDirectiveFrame(\r\n    directiveName: string,\r\n  ): { frame: DirectiveFrame; kind: \"branch\" | \"close\" } | null {\r\n    if (this.openDirectives.length === 0) {\r\n      return null;\r\n    }\r\n\r\n    for (let i = this.openDirectives.length - 1; i >= 0; i--) {\r\n      const frame = this.openDirectives[i];\r\n      if (frame.branches.includes(directiveName)) {\r\n        return { frame, kind: \"branch\" };\r\n      }\r\n      if (frame.terminators.includes(directiveName)) {\r\n        return { frame, kind: \"close\" };\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private getMatchingOpenConditionFrame(\r\n    directiveName: string,\r\n  ): { frame: ConditionFrame; kind: \"branch\" | \"close\" } | null {\r\n    if (this.openConditions.length === 0) {\r\n      return null;\r\n    }\r\n\r\n    const frame = this.openConditions[this.openConditions.length - 1];\r\n    const terminators = this.directives.getConditionTerminators();\r\n    if (terminators.includes(directiveName)) {\r\n      return { frame, kind: \"close\" };\r\n    }\r\n\r\n    const branches = this.directives.getBranches(frame.name);\r\n    if (branches.includes(directiveName)) {\r\n      return { frame, kind: \"branch\" };\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private getDirectiveFrameTokenStart(frame: DirectiveFrame): number {\r\n    return this.nodes[frame.startDirectiveIdx]?.tokenStart ?? -1;\r\n  }\r\n\r\n  private getConditionFrameTokenStart(frame: ConditionFrame): number {\r\n    return this.nodes[frame.currentBranchIdx]?.tokenStart ?? -1;\r\n  }\r\n\r\n  private openCondition(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    _argsContent: string | null,\r\n  ): void {\r\n    const blockIdx = this.addChild(\r\n      createFlatNode(NodeKind.DirectiveBlock, 0, startPos, tokenCount),\r\n    );\r\n\r\n    const elementStackBase = this.openElements.length;\r\n    this.checkElementDepth();\r\n    this.openElements.push(blockIdx);\r\n\r\n    const branchIdx = this.addChild(createFlatNode(NodeKind.Directive, 0, startPos, tokenCount));\r\n\r\n    this.checkElementDepth();\r\n    this.openElements.push(branchIdx);\r\n\r\n    this.checkConditionDepth();\r\n    this.openConditions.push({\r\n      blockIdx,\r\n      currentBranchIdx: branchIdx,\r\n      name: directiveName,\r\n      elementStackBase,\r\n    });\r\n\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private openConditionBranch(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    _argsContent: string | null,\r\n  ): void {\r\n    if (this.openConditions.length === 0) {\r\n      this.createStandaloneDirective(directiveName, startPos, tokenCount, _argsContent);\r\n      return;\r\n    }\r\n\r\n    const frame = this.openConditions[this.openConditions.length - 1];\r\n\r\n    this.popIfTop(frame.currentBranchIdx);\r\n    this.popElementsToDepth(frame.elementStackBase + 1);\r\n\r\n    const branchIdx = this.addChild(createFlatNode(NodeKind.Directive, 0, startPos, tokenCount));\r\n\r\n    this.checkElementDepth();\r\n    this.openElements.push(branchIdx);\r\n\r\n    frame.currentBranchIdx = branchIdx;\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private closeCondition(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    _argsContent: string | null,\r\n  ): void {\r\n    if (this.openConditions.length === 0) {\r\n      this.createStandaloneDirective(directiveName, startPos, tokenCount, _argsContent);\r\n      return;\r\n    }\r\n\r\n    const frame = this.openConditions.pop()!;\r\n\r\n    this.popElementsToDepth(frame.elementStackBase + 1);\r\n    this.popIfTop(frame.currentBranchIdx);\r\n\r\n    this.addChild(createFlatNode(NodeKind.Directive, 0, startPos, tokenCount));\r\n\r\n    this.popIfTop(frame.blockIdx);\r\n\r\n    const endPos = startPos + tokenCount;\r\n    this.nodes[frame.blockIdx].tokenCount = endPos - this.nodes[frame.blockIdx].tokenStart;\r\n\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private isSwitchRelatedDirective(directiveName: string): boolean {\r\n    if (this.directives.isSwitch(directiveName)) return true;\r\n    if (directiveName === \"endswitch\") return true;\r\n    if (this.openSwitches.length > 0) {\r\n      if (this.directives.isSwitchBranch(directiveName)) return true;\r\n      if (this.directives.isSwitchTerminator(directiveName)) return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  private processSwitchDirective(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): void {\r\n    if (directiveName === \"endswitch\" && this.openSwitches.length > 0) {\r\n      this.closeSwitch(directiveName, startPos, tokenCount, argsContent);\r\n    } else if (this.directives.isSwitchTerminator(directiveName) && this.openSwitches.length > 0) {\r\n      this.processSwitchBreak(directiveName, startPos, tokenCount, argsContent);\r\n    } else if (this.openSwitches.length > 0 && this.directives.isSwitchBranch(directiveName)) {\r\n      this.openSwitchCase(directiveName, startPos, tokenCount, argsContent);\r\n    } else if (this.directives.isSwitch(directiveName)) {\r\n      if (this.shouldOpenSwitch(directiveName, startPos, tokenCount)) {\r\n        this.openSwitch(directiveName, startPos, tokenCount, argsContent);\r\n      } else {\r\n        this.createStandaloneDirective(directiveName, startPos, tokenCount, argsContent);\r\n      }\r\n    } else {\r\n      this.createStandaloneDirective(directiveName, startPos, tokenCount, argsContent);\r\n    }\r\n  }\r\n\r\n  private shouldOpenSwitch(directiveName: string, startPos: number, tokenCount: number): boolean {\r\n    const directiveStart = startPos + tokenCount;\r\n    return this.hasMatchingTerminatorInCurrentScope(\r\n      directiveName,\r\n      directiveStart,\r\n      [\"endswitch\"],\r\n      [directiveName],\r\n    );\r\n  }\r\n\r\n  private openSwitch(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    _argsContent: string | null,\r\n  ): void {\r\n    const blockIdx = this.addChild(\r\n      createFlatNode(NodeKind.DirectiveBlock, 0, startPos, tokenCount),\r\n    );\r\n\r\n    const elementStackBase = this.openElements.length;\r\n    this.checkElementDepth();\r\n    this.openElements.push(blockIdx);\r\n\r\n    const switchDirectiveIdx = this.addChild(\r\n      createFlatNode(NodeKind.Directive, 0, startPos, tokenCount),\r\n    );\r\n\r\n    this.checkDirectiveDepth();\r\n    this.openSwitches.push({\r\n      blockIdx,\r\n      switchDirectiveIdx,\r\n      currentCaseIdx: null,\r\n      name: directiveName,\r\n      elementStackBase,\r\n    });\r\n\r\n    this.checkElementDepth();\r\n    this.openElements.push(switchDirectiveIdx);\r\n\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private openSwitchCase(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): void {\r\n    if (this.openSwitches.length === 0) {\r\n      this.createStandaloneDirective(directiveName, startPos, tokenCount, argsContent);\r\n      return;\r\n    }\r\n\r\n    const frame = this.openSwitches[this.openSwitches.length - 1];\r\n\r\n    this.popElementsToDepth(frame.elementStackBase + 2);\r\n\r\n    if (frame.currentCaseIdx !== null) {\r\n      this.popIfTop(frame.currentCaseIdx);\r\n    }\r\n\r\n    const caseIdx = this.addChild(createFlatNode(NodeKind.Directive, 0, startPos, tokenCount));\r\n\r\n    frame.currentCaseIdx = caseIdx;\r\n    this.checkElementDepth();\r\n    this.openElements.push(caseIdx);\r\n\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private processSwitchBreak(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): void {\r\n    if (this.openSwitches.length === 0) {\r\n      this.createStandaloneDirective(directiveName, startPos, tokenCount, argsContent);\r\n      return;\r\n    }\r\n\r\n    const frame = this.openSwitches[this.openSwitches.length - 1];\r\n    if (frame.currentCaseIdx === null) {\r\n      this.createStandaloneDirective(directiveName, startPos, tokenCount, argsContent);\r\n      return;\r\n    }\r\n\r\n    this.addChild(createFlatNode(NodeKind.Directive, 0, startPos, tokenCount));\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private closeSwitch(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): void {\r\n    if (this.openSwitches.length === 0) {\r\n      this.createStandaloneDirective(directiveName, startPos, tokenCount, argsContent);\r\n      return;\r\n    }\r\n\r\n    const frame = this.openSwitches.pop()!;\r\n\r\n    this.popElementsToDepth(frame.elementStackBase + 2);\r\n\r\n    if (frame.currentCaseIdx !== null) {\r\n      this.popIfTop(frame.currentCaseIdx);\r\n    }\r\n\r\n    this.popIfTop(frame.switchDirectiveIdx);\r\n\r\n    this.addChild(createFlatNode(NodeKind.Directive, 0, startPos, tokenCount));\r\n\r\n    this.popIfTop(frame.blockIdx);\r\n\r\n    const endPos = startPos + tokenCount;\r\n    this.nodes[frame.blockIdx].tokenCount = endPos - this.nodes[frame.blockIdx].tokenStart;\r\n\r\n    this.pos += tokenCount;\r\n  }\r\n\r\n  private processConditionalPairingDirective(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): void {\r\n    if (this.shouldPairDirective(directiveName, startPos, tokenCount, argsContent)) {\r\n      if (this.directives.isCondition(directiveName)) {\r\n        this.openCondition(directiveName, startPos, tokenCount, argsContent);\r\n      } else {\r\n        this.openPairedDirective(directiveName, startPos, tokenCount);\r\n      }\r\n    } else {\r\n      this.createStandaloneDirective(directiveName, startPos, tokenCount, argsContent);\r\n    }\r\n  }\r\n\r\n  private shouldPairDirective(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): boolean {\r\n    const strategy = this.directives.getPairingStrategy(directiveName);\r\n    if (strategy === null) return false;\r\n\r\n    switch (strategy) {\r\n      case \"lang_style\":\r\n        return this.shouldPairLangStyle(directiveName, startPos, tokenCount, argsContent);\r\n      case \"no_arguments_block\":\r\n        return this.shouldPairNoArgumentsBlock(directiveName, startPos, tokenCount, argsContent);\r\n      case \"section_style\":\r\n        return this.shouldPairSectionStyle(directiveName, startPos, tokenCount, argsContent);\r\n      case \"single_argument_block\":\r\n        return this.shouldPairSingleArgumentBlock(directiveName, startPos, tokenCount, argsContent);\r\n      default:\r\n        return false;\r\n    }\r\n  }\r\n\r\n  private shouldPairLangStyle(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): boolean {\r\n    // @lang with no args or array args -> paired\r\n    if (argsContent === null || startsWithArray(unwrapParentheses(argsContent))) {\r\n      return this.hasMatchingTerminatorInCurrentScope(directiveName, startPos + tokenCount);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  private shouldPairSectionStyle(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): boolean {\r\n    // @section with 2+ args -> standalone (inline)\r\n    if (argsContent !== null) {\r\n      const argCount = countArguments(unwrapParentheses(argsContent));\r\n      if (argCount >= 2) return false;\r\n    }\r\n    return this.hasMatchingTerminatorInCurrentScope(directiveName, startPos + tokenCount);\r\n  }\r\n\r\n  private shouldPairNoArgumentsBlock(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): boolean {\r\n    if (getDirectiveArgumentCount(argsContent) !== 0) {\r\n      return false;\r\n    }\r\n\r\n    return this.hasMatchingTerminatorInCurrentScope(directiveName, startPos + tokenCount);\r\n  }\r\n\r\n  private shouldPairSingleArgumentBlock(\r\n    directiveName: string,\r\n    startPos: number,\r\n    tokenCount: number,\r\n    argsContent: string | null,\r\n  ): boolean {\r\n    if (getDirectiveArgumentCount(argsContent) !== 1) {\r\n      return false;\r\n    }\r\n\r\n    return this.hasMatchingTerminatorInCurrentScope(directiveName, startPos + tokenCount);\r\n  }\r\n\r\n  private hasMatchingTerminatorInCurrentScope(\r\n    directiveName: string,\r\n    afterPos: number,\r\n    terminatorsOverride?: readonly string[],\r\n    openerNames?: string[],\r\n    branchNames?: readonly string[],\r\n  ): boolean {\r\n    const terminators = terminatorsOverride ?? this.directives.getTerminators(directiveName);\r\n    const searchTerminators = terminators.length > 0 ? terminators : [`end${directiveName}`];\r\n    const searchBranches = branchNames ?? [];\r\n    const searchOpeners =\r\n      openerNames ?? this.getDirectiveOpenersForTerminators(directiveName, searchTerminators);\r\n    const searchEnd = this.getDirectiveSearchEnd(\r\n      searchOpeners,\r\n      afterPos,\r\n      searchTerminators,\r\n      searchBranches,\r\n    );\r\n    const directiveIndex = this.getDirectiveIndex();\r\n\r\n    return (\r\n      directiveIndex.findMatchingTerminatorForOpeners(\r\n        searchOpeners,\r\n        afterPos,\r\n        [...searchTerminators],\r\n        searchEnd,\r\n      ) !== null\r\n    );\r\n  }\r\n\r\n  private closeRemainingDirectives(): void {\r\n    const endPos = this.tokens.length;\r\n\r\n    while (this.openSwitches.length > 0) {\r\n      const frame = this.openSwitches.pop()!;\r\n      if (frame.currentCaseIdx !== null) this.popIfTop(frame.currentCaseIdx);\r\n      this.popIfTop(frame.switchDirectiveIdx);\r\n      this.popIfTop(frame.blockIdx);\r\n      this.nodes[frame.blockIdx].tokenCount = endPos - this.nodes[frame.blockIdx].tokenStart;\r\n    }\r\n\r\n    while (this.openConditions.length > 0) {\r\n      const frame = this.openConditions.pop()!;\r\n      this.popIfTop(frame.currentBranchIdx);\r\n      this.popIfTop(frame.blockIdx);\r\n      this.nodes[frame.blockIdx].tokenCount = endPos - this.nodes[frame.blockIdx].tokenStart;\r\n    }\r\n\r\n    while (this.openPhpTagConditions.length > 0) {\r\n      const frame = this.openPhpTagConditions.pop()!;\r\n      this.popIfTop(frame.currentBranchIdx);\r\n      this.popIfTop(frame.blockIdx);\r\n      this.nodes[frame.blockIdx].tokenCount = endPos - this.nodes[frame.blockIdx].tokenStart;\r\n    }\r\n\r\n    while (this.openDirectives.length > 0) {\r\n      const frame = this.openDirectives.pop()!;\r\n      this.popIfTop(frame.startDirectiveIdx);\r\n      this.popIfTop(frame.blockIdx);\r\n      this.nodes[frame.blockIdx].tokenCount = endPos - this.nodes[frame.blockIdx].tokenStart;\r\n    }\r\n  }\r\n\r\n  private isNonStructuralDirectiveToken(tokenIdx: number): boolean {\r\n    return (\r\n      this.isScriptLiteralDirectiveToken(tokenIdx) ||\r\n      this.isAttributeLiteralDirectiveToken(tokenIdx)\r\n    );\r\n  }\r\n\r\n  private isInsideMalformedRawElement(): boolean {\r\n    for (let i = this.openElements.length - 1; i >= 0; i--) {\r\n      if (this.malformedRawElementIndexes.has(this.openElements[i])) {\r\n        return true;\r\n      }\r\n    }\r\n\r\n    const tokenStart = this.tokens[this.pos]?.start ?? -1;\r\n    for (const source of this.malformedRawElementSources) {\r\n      if (tokenStart > source.start) {\r\n        return true;\r\n      }\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  private closeMalformedRawSource(closingTagName: string): void {\r\n    const lowerClosingTagName = closingTagName.toLowerCase();\r\n    for (let i = this.malformedRawElementSources.length - 1; i >= 0; i--) {\r\n      if (this.malformedRawElementSources[i].name !== lowerClosingTagName) {\r\n        continue;\r\n      }\r\n\r\n      this.malformedRawElementSources.splice(i, 1);\r\n      return;\r\n    }\r\n  }\r\n\r\n  private hasSwallowedTagSyntaxInOpeningSource(startIdx: number, endIdx: number): boolean {\r\n    if (endIdx <= startIdx || endIdx >= this.tokens.length) {\r\n      return false;\r\n    }\r\n\r\n    const start = this.tokens[startIdx].start + 1;\r\n    const end = this.tokens[endIdx].end;\r\n    return hasSwallowedTagSyntaxInOpeningSource(this.source.slice(start, end));\r\n  }\r\n\r\n  private isScriptLiteralDirectiveToken(tokenIdx: number): boolean {\r\n    if (this.tokens[tokenIdx]?.type !== TokenType.Directive) {\r\n      return false;\r\n    }\r\n\r\n    return this.getScriptLiteralDirectiveTokenIndexes().has(tokenIdx);\r\n  }\r\n\r\n  private getScriptLiteralDirectiveTokenIndexes(): Set<number> {\r\n    if (this.scriptLiteralDirectiveTokenIndexes === null) {\r\n      this.scriptLiteralDirectiveTokenIndexes = this.buildScriptLiteralDirectiveTokenIndexes();\r\n    }\r\n\r\n    return this.scriptLiteralDirectiveTokenIndexes;\r\n  }\r\n\r\n  private buildScriptLiteralDirectiveTokenIndexes(): Set<number> {\r\n    const tokenIndexes = new Set<number>();\r\n    const total = this.tokens.length;\r\n\r\n    for (let i = 0; i < total; i++) {\r\n      if (!this.isStaticOpeningTagAt(i, \"script\")) {\r\n        continue;\r\n      }\r\n\r\n      const openingTagEnd = this.findTagEndTokenIndex(i);\r\n      if (openingTagEnd === null || this.tokens[openingTagEnd].type !== TokenType.GreaterThan) {\r\n        continue;\r\n      }\r\n\r\n      const contentStart = this.tokens[openingTagEnd].end;\r\n      const closingTagStart = this.findStaticClosingTagStart(openingTagEnd + 1, \"script\");\r\n      const contentEndTokenIdx = closingTagStart ?? total;\r\n\r\n      for (let j = openingTagEnd + 1; j < contentEndTokenIdx; j++) {\r\n        if (this.tokens[j].type !== TokenType.Directive) {\r\n          continue;\r\n        }\r\n\r\n        if (isLikelyInsideScriptLiteralOrComment(this.source, contentStart, this.tokens[j].start)) {\r\n          tokenIndexes.add(j);\r\n        }\r\n      }\r\n\r\n      if (closingTagStart === null) {\r\n        break;\r\n      }\r\n      i = closingTagStart;\r\n    }\r\n\r\n    return tokenIndexes;\r\n  }\r\n\r\n  private isAttributeLiteralDirectiveToken(tokenIdx: number): boolean {\r\n    if (this.tokens[tokenIdx]?.type !== TokenType.Directive) {\r\n      return false;\r\n    }\r\n\r\n    return this.getAttributeLiteralDirectiveTokenIndexes().has(tokenIdx);\r\n  }\r\n\r\n  private getAttributeLiteralDirectiveTokenIndexes(): Set<number> {\r\n    if (this.attributeLiteralDirectiveTokenIndexes === null) {\r\n      this.attributeLiteralDirectiveTokenIndexes =\r\n        this.buildAttributeLiteralDirectiveTokenIndexes();\r\n    }\r\n\r\n    return this.attributeLiteralDirectiveTokenIndexes;\r\n  }\r\n\r\n  private buildAttributeLiteralDirectiveTokenIndexes(): Set<number> {\r\n    const tokenIndexes = new Set<number>();\r\n    const total = this.tokens.length;\r\n\r\n    for (let i = 0; i < total; i++) {\r\n      if (this.tokens[i].type !== TokenType.LessThan) {\r\n        continue;\r\n      }\r\n      if (this.tokens[i + 1]?.type === TokenType.Slash) {\r\n        continue;\r\n      }\r\n\r\n      const tagEnd = this.findTagEndTokenIndex(i);\r\n      if (tagEnd === null) {\r\n        continue;\r\n      }\r\n\r\n      let j = i + 1;\r\n      while (j < tagEnd) {\r\n        if (this.tokens[j].type !== TokenType.Equals) {\r\n          j++;\r\n          continue;\r\n        }\r\n\r\n        let valueStart = j + 1;\r\n        while (valueStart < tagEnd && this.tokens[valueStart].type === TokenType.Whitespace) {\r\n          valueStart++;\r\n        }\r\n\r\n        if (valueStart >= tagEnd || this.tokens[valueStart].type !== TokenType.Quote) {\r\n          j++;\r\n          continue;\r\n        }\r\n\r\n        const valueEnd = this.findQuoteTokenIndex(valueStart + 1, tagEnd);\r\n        if (valueEnd === null) {\r\n          j++;\r\n          continue;\r\n        }\r\n\r\n        const contentStart = this.tokens[valueStart].end;\r\n        for (let k = valueStart + 1; k < valueEnd; k++) {\r\n          if (this.tokens[k].type !== TokenType.Directive) {\r\n            continue;\r\n          }\r\n\r\n          if (\r\n            isLikelyInsideScriptLiteralOrComment(this.source, contentStart, this.tokens[k].start)\r\n          ) {\r\n            tokenIndexes.add(k);\r\n          }\r\n        }\r\n\r\n        j = valueEnd + 1;\r\n      }\r\n\r\n      i = tagEnd;\r\n    }\r\n\r\n    this.addRecoverableAttributeLiteralDirectiveTokenIndexes(tokenIndexes);\r\n\r\n    return tokenIndexes;\r\n  }\r\n\r\n  private addRecoverableAttributeLiteralDirectiveTokenIndexes(tokenIndexes: Set<number>): void {\r\n    for (let i = 0; i < this.tokens.length; i++) {\r\n      if (this.tokens[i].type !== TokenType.Directive || tokenIndexes.has(i)) {\r\n        continue;\r\n      }\r\n\r\n      const contentStart = this.findRecoverableAttributeValueContentStart(i);\r\n      if (contentStart === null) {\r\n        continue;\r\n      }\r\n\r\n      if (isLikelyInsideScriptLiteralOrComment(this.source, contentStart, this.tokens[i].start)) {\r\n        tokenIndexes.add(i);\r\n      }\r\n    }\r\n  }\r\n\r\n  private findRecoverableAttributeValueContentStart(tokenIdx: number): number | null {\r\n    const tagStartTokenIdx = this.findPreviousOpeningTagStartTokenIndex(tokenIdx);\r\n    if (tagStartTokenIdx === null) {\r\n      return null;\r\n    }\r\n\r\n    if (\r\n      !this.isBeforeSourceTagClose(this.tokens[tagStartTokenIdx].start, this.tokens[tokenIdx].start)\r\n    ) {\r\n      return null;\r\n    }\r\n\r\n    return this.findRecoverableAttributeValueContentStartBefore(tagStartTokenIdx, tokenIdx);\r\n  }\r\n\r\n  private findPreviousOpeningTagStartTokenIndex(tokenIdx: number): number | null {\r\n    for (let i = tokenIdx - 1; i >= 0; i--) {\r\n      if (this.tokens[i].type === TokenType.GreaterThan) {\r\n        return null;\r\n      }\r\n\r\n      if (this.tokens[i].type !== TokenType.LessThan) {\r\n        continue;\r\n      }\r\n\r\n      if (this.tokens[i + 1]?.type === TokenType.Slash) {\r\n        return null;\r\n      }\r\n\r\n      if (this.tokens[i + 1]?.type !== TokenType.TagName) {\r\n        return null;\r\n      }\r\n\r\n      return i;\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private isBeforeSourceTagClose(tagStart: number, offset: number): boolean {\r\n    let quote: '\"' | \"'\" | null = null;\r\n\r\n    for (let i = tagStart + 1; i < offset; i++) {\r\n      const ch = this.source[i];\r\n\r\n      if (quote !== null) {\r\n        if (ch === quote) {\r\n          quote = null;\r\n        }\r\n        continue;\r\n      }\r\n\r\n      if (ch === '\"' || ch === \"'\") {\r\n        quote = ch;\r\n        continue;\r\n      }\r\n\r\n      if (ch === \">\") {\r\n        return false;\r\n      }\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  private findRecoverableAttributeValueContentStartBefore(\r\n    tagStartTokenIdx: number,\r\n    tokenIdx: number,\r\n  ): number | null {\r\n    for (let i = tokenIdx - 1; i > tagStartTokenIdx; i--) {\r\n      if (this.tokens[i].type !== TokenType.Quote) {\r\n        continue;\r\n      }\r\n\r\n      const beforeQuoteTokenIdx = this.previousNonWhitespaceTokenIndex(tagStartTokenIdx + 1, i);\r\n      if (\r\n        beforeQuoteTokenIdx >= 0 &&\r\n        this.tokens[beforeQuoteTokenIdx].type === TokenType.Equals &&\r\n        this.isUnclosedAttributeQuoteBefore(this.tokens[i].start, this.tokens[tokenIdx].start)\r\n      ) {\r\n        return this.tokens[i].end;\r\n      }\r\n    }\r\n\r\n    const tagStart = this.tokens[tagStartTokenIdx].start;\r\n    const offset = this.tokens[tokenIdx].start;\r\n    for (let i = offset - 1; i > tagStart; i--) {\r\n      const ch = this.source[i];\r\n      if (ch !== '\"' && ch !== \"'\") {\r\n        continue;\r\n      }\r\n\r\n      const beforeQuote = this.previousNonWhitespaceSourceIndex(tagStart + 1, i);\r\n      if (\r\n        beforeQuote >= 0 &&\r\n        this.source[beforeQuote] === \"=\" &&\r\n        this.isUnclosedAttributeQuoteBefore(i, offset)\r\n      ) {\r\n        return i + 1;\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private previousNonWhitespaceTokenIndex(startIdx: number, endExclusive: number): number {\r\n    for (let i = endExclusive - 1; i >= startIdx; i--) {\r\n      if (this.tokens[i].type === TokenType.Whitespace) {\r\n        continue;\r\n      }\r\n\r\n      return i;\r\n    }\r\n\r\n    return -1;\r\n  }\r\n\r\n  private previousNonWhitespaceSourceIndex(startIdx: number, endExclusive: number): number {\r\n    for (let i = endExclusive - 1; i >= startIdx; i--) {\r\n      const ch = this.source[i];\r\n      if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\r\n        continue;\r\n      }\r\n\r\n      return i;\r\n    }\r\n\r\n    return -1;\r\n  }\r\n\r\n  private isUnclosedAttributeQuoteBefore(quoteOffset: number, offset: number): boolean {\r\n    const quote = this.source[quoteOffset];\r\n    if (quote !== '\"' && quote !== \"'\") {\r\n      return false;\r\n    }\r\n\r\n    for (let i = quoteOffset + 1; i < offset; i++) {\r\n      if (this.source[i] === quote) {\r\n        return false;\r\n      }\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  private isStaticOpeningTagAt(tokenIdx: number, tagName: string): boolean {\r\n    if (tokenIdx + 1 >= this.tokens.length) {\r\n      return false;\r\n    }\r\n    if (this.tokens[tokenIdx].type !== TokenType.LessThan) {\r\n      return false;\r\n    }\r\n    if (this.tokens[tokenIdx + 1].type !== TokenType.TagName) {\r\n      return false;\r\n    }\r\n\r\n    const actual = this.source\r\n      .slice(this.tokens[tokenIdx + 1].start, this.tokens[tokenIdx + 1].end)\r\n      .toLowerCase();\r\n    return actual === tagName;\r\n  }\r\n\r\n  private findStaticClosingTagStart(startIdx: number, tagName: string): number | null {\r\n    for (let i = startIdx; i + 2 < this.tokens.length; i++) {\r\n      if (this.tokens[i].type !== TokenType.LessThan) {\r\n        continue;\r\n      }\r\n      if (this.tokens[i + 1].type !== TokenType.Slash) {\r\n        continue;\r\n      }\r\n      if (this.tokens[i + 2].type !== TokenType.TagName) {\r\n        continue;\r\n      }\r\n\r\n      const actual = this.source\r\n        .slice(this.tokens[i + 2].start, this.tokens[i + 2].end)\r\n        .toLowerCase();\r\n      if (actual === tagName) {\r\n        return i;\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private findTagEndTokenIndex(startIdx: number): number | null {\r\n    for (let i = startIdx + 1; i < this.tokens.length; i++) {\r\n      const type = this.tokens[i].type;\r\n      if (type === TokenType.GreaterThan || type === TokenType.SyntheticClose) {\r\n        return i;\r\n      }\r\n      if (i > startIdx + 1 && type === TokenType.LessThan) {\r\n        return null;\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private findQuoteTokenIndex(startIdx: number, endIdx: number): number | null {\r\n    for (let i = startIdx; i < endIdx; i++) {\r\n      if (this.tokens[i].type === TokenType.Quote) {\r\n        return i;\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private getDirectiveIndex(): DirectiveTokenIndex {\r\n    if (this.directiveIndex === null) {\r\n      this.directiveIndex = new DirectiveTokenIndex(\r\n        this.tokens,\r\n        this.source,\r\n        (tokenIdx) => !this.isNonStructuralDirectiveToken(tokenIdx),\r\n      );\r\n    }\r\n    return this.directiveIndex;\r\n  }\r\n}\r\n\r\nexport function buildTree(\r\n  tokens: readonly Token[],\r\n  source: string,\r\n  directives?: Directives,\r\n): BuildResult {\r\n  return new TreeBuilder(tokens, source, directives).build();\r\n}\r\n\r\nfunction getDirectiveArgumentCount(argsContent: string | null): number {\r\n  if (argsContent === null) return 0;\r\n  return countArguments(unwrapParentheses(argsContent));\r\n}\r\n","/**\n * Pragma detection and insertion for Blade templates.\n *\n * Supports both HTML comments and Blade comments:\n *   <!-- @format -->  or  {{-- @format --}}\n *   <!-- @prettier --> or  {{-- @prettier --}}\n */\n\nconst HTML_PRAGMA_RE = /^\\s*<!--\\s*@(?:format|prettier)\\s*-->/;\n\nconst BLADE_PRAGMA_RE = /^\\s*\\{\\{--\\s*@(?:format|prettier)\\s*--\\}\\}/;\n\nexport function hasPragma(text: string): boolean {\n  return HTML_PRAGMA_RE.test(text) || BLADE_PRAGMA_RE.test(text);\n}\n\nexport function insertPragma(text: string): string {\n  return `<!-- @format -->\\n\\n${text}`;\n}\n","import type {\n  TreeDirectiveArgsDefinition,\n  TreeDirectiveDefinition,\n} from \"../../tree/directive-definitions.js\";\n\nexport interface SageDirectiveMetadata {\n  name: string;\n  allowsArguments: boolean;\n  isConditionDirective: boolean;\n}\n\nconst SAGE_ACF_DIRECTIVES: readonly TreeDirectiveDefinition[] = [\n  { name: \"fields\", args: true, structure: { role: \"open\", terminators: \"endfields\" } },\n  { name: \"endfields\", args: false, structure: { role: \"close\" } },\n  {\n    name: \"hasfields\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endhasfields\" },\n  },\n  { name: \"endhasfields\", args: false, structure: { role: \"close\", condition: true } },\n  { name: \"field\", args: true },\n  {\n    name: \"hasfield,isfield\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endfield\" },\n  },\n  { name: \"endfield\", args: false, structure: { role: \"close\", condition: true } },\n  { name: \"sub\", args: true },\n  {\n    name: \"hassub,issub\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endsub\" },\n  },\n  { name: \"endsub\", args: false, structure: { role: \"close\", condition: true } },\n  { name: \"layouts\", args: true, structure: { role: \"open\", terminators: \"endlayouts\" } },\n  { name: \"endlayouts\", args: false, structure: { role: \"close\" } },\n  {\n    name: \"layout\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endlayout\" },\n  },\n  { name: \"endlayout\", args: false, structure: { role: \"close\", condition: true } },\n  { name: \"group\", args: true, structure: { role: \"open\", terminators: \"endgroup\" } },\n  { name: \"endgroup\", args: false, structure: { role: \"close\" } },\n  { name: \"options\", args: true, structure: { role: \"open\", terminators: \"endoptions\" } },\n  { name: \"endoptions\", args: false, structure: { role: \"close\" } },\n  {\n    name: \"hasoptions\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endhasoptions\" },\n  },\n  { name: \"endhasoptions\", args: false, structure: { role: \"close\", condition: true } },\n  { name: \"option\", args: true },\n  {\n    name: \"hasoption,isoption\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endoption\" },\n  },\n  { name: \"endoption\", args: false, structure: { role: \"close\", condition: true } },\n];\n\nconst SAGE_HELPER_DIRECTIVES: readonly TreeDirectiveDefinition[] = [\n  {\n    name: \"istrue\",\n    args: true,\n    structure: {\n      role: \"conditional_pair\",\n      condition: true,\n      terminators: \"endistrue\",\n      pairing_strategy: \"single_argument_block\",\n    },\n  },\n  {\n    name: \"isfalse\",\n    args: true,\n    structure: {\n      role: \"conditional_pair\",\n      condition: true,\n      terminators: \"endisfalse\",\n      pairing_strategy: \"single_argument_block\",\n    },\n  },\n  {\n    name: \"isnull\",\n    args: true,\n    structure: {\n      role: \"conditional_pair\",\n      condition: true,\n      terminators: \"endisnull\",\n      pairing_strategy: \"single_argument_block\",\n    },\n  },\n  {\n    name: \"isnotnull\",\n    args: true,\n    structure: {\n      role: \"conditional_pair\",\n      condition: true,\n      terminators: \"endisnotnull\",\n      pairing_strategy: \"single_argument_block\",\n    },\n  },\n  {\n    name: \"notempty\",\n    args: true,\n    structure: {\n      role: \"conditional_pair\",\n      condition: true,\n      terminators: \"endnotempty\",\n      pairing_strategy: \"single_argument_block\",\n    },\n  },\n  {\n    name: \"endistrue,endisfalse,endisnull,endisnotnull,endnotempty\",\n    args: false,\n    structure: { role: \"close\", condition: true },\n  },\n  {\n    name: \"instanceof\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endinstanceof\" },\n  },\n  { name: \"endinstanceof\", args: false, structure: { role: \"close\", condition: true } },\n  {\n    name: \"typeof\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endtypeof\" },\n  },\n  { name: \"endtypeof\", args: false, structure: { role: \"close\", condition: true } },\n  { name: \"global\", args: true },\n  { name: \"set\", args: true },\n  { name: \"unset\", args: true },\n  { name: \"extract\", args: true },\n  { name: \"implode\", args: true },\n  { name: \"repeat\", args: true, structure: { role: \"open\", terminators: \"endrepeat\" } },\n  { name: \"endrepeat\", args: false, structure: { role: \"close\" } },\n  {\n    name: \"stylesheet\",\n    structure: {\n      role: \"conditional_pair\",\n      terminators: \"endstylesheet\",\n      pairing_strategy: \"no_arguments_block\",\n    },\n  },\n  {\n    name: \"script\",\n    structure: {\n      role: \"conditional_pair\",\n      terminators: \"endscript\",\n      pairing_strategy: \"no_arguments_block\",\n    },\n  },\n  { name: \"endstylesheet,endscript\", args: false, structure: { role: \"conditional_close\" } },\n  { name: \"js\", args: true },\n  { name: \"inline\", args: true },\n];\n\nconst SAGE_WORDPRESS_DIRECTIVES: readonly TreeDirectiveDefinition[] = [\n  { name: \"query\", args: true },\n  { name: \"posts\", args: true, structure: { role: \"open\", terminators: \"endposts\" } },\n  { name: \"endposts\", args: false, structure: { role: \"close\" } },\n  {\n    name: \"hasposts\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endhasposts\" },\n  },\n  {\n    name: \"noposts\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endnoposts\" },\n  },\n  {\n    name: \"endhasposts,endnoposts\",\n    args: false,\n    structure: { role: \"close\", condition: true },\n  },\n  { name: \"postmeta,title,permalink,thumbnail,author,authorurl,published,modified\", args: true },\n  { name: \"content,excerpt,wphead,wpfooter,wpbodyopen\", args: false },\n  { name: \"category,categories,term,terms,image,shortcode,wpautop,wpautokp\", args: true },\n  { name: \"action,filter,bodyclass,postclass,sidebar,thememod,menu\", args: true },\n  {\n    name: \"role\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endrole\" },\n  },\n  { name: \"endrole\", args: false, structure: { role: \"close\", condition: true } },\n  {\n    name: \"user\",\n    args: false,\n    structure: { role: \"open\", condition: true, terminators: \"enduser\" },\n  },\n  { name: \"enduser\", args: false, structure: { role: \"close\", condition: true } },\n  {\n    name: \"guest\",\n    args: false,\n    structure: { role: \"open\", condition: true, terminators: \"endguest\" },\n  },\n  { name: \"endguest\", args: false, structure: { role: \"close\", condition: true } },\n  {\n    name: \"hassidebar\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endhassidebar\" },\n  },\n  {\n    name: \"hasmenu\",\n    args: true,\n    structure: { role: \"open\", condition: true, terminators: \"endhasmenu\" },\n  },\n  {\n    name: \"endhassidebar,endhasmenu\",\n    args: false,\n    structure: { role: \"close\", condition: true },\n  },\n  { name: \"__\", args: true },\n];\n\nexport const SAGE_TREE_DIRECTIVES: readonly TreeDirectiveDefinition[] = [\n  ...SAGE_ACF_DIRECTIVES,\n  ...SAGE_HELPER_DIRECTIVES,\n  ...SAGE_WORDPRESS_DIRECTIVES,\n];\n\nfunction splitDirectiveNames(value: string): string[] {\n  return value\n    .split(\",\")\n    .map((name) => name.trim().toLowerCase())\n    .filter(Boolean);\n}\n\nfunction allowsDirectiveArguments(args: TreeDirectiveArgsDefinition): boolean {\n  if (args === false) {\n    return false;\n  }\n\n  if (typeof args === \"object\" && args !== null && args.allowed === false) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction isConditionDirective(definition: TreeDirectiveDefinition): boolean {\n  if (!definition.structure?.condition) {\n    return false;\n  }\n\n  return definition.structure.role === \"open\" || definition.structure.role === \"conditional_pair\";\n}\n\nconst SAGE_DIRECTIVE_METADATA = new Map<string, SageDirectiveMetadata>();\n\nfor (const definition of SAGE_TREE_DIRECTIVES) {\n  const directiveMetadata = {\n    allowsArguments: allowsDirectiveArguments(definition.args),\n    isConditionDirective: isConditionDirective(definition),\n  };\n\n  for (const name of splitDirectiveNames(definition.name)) {\n    SAGE_DIRECTIVE_METADATA.set(name, {\n      name,\n      ...directiveMetadata,\n    });\n  }\n}\n\nexport const SAGE_DECLARED_DIRECTIVE_NAMES = Object.freeze([...SAGE_DIRECTIVE_METADATA.keys()]);\nexport const SAGE_ARGUMENT_DIRECTIVE_NAMES = Object.freeze(\n  SAGE_DECLARED_DIRECTIVE_NAMES.filter(\n    (name) => SAGE_DIRECTIVE_METADATA.get(name)?.allowsArguments === true,\n  ),\n);\n\nexport function getSageDirectiveMetadata(name: string): SageDirectiveMetadata | null {\n  return SAGE_DIRECTIVE_METADATA.get(name.trim().toLowerCase()) ?? null;\n}\n","import type { DirectivePhpWrapperContext } from \"../lexer/directives.js\";\nimport type { TreeDirectiveDefinition } from \"../tree/directive-definitions.js\";\n\nexport const DIRECTIVE_PHP_FORMAT_ARGS_PLACEHOLDER = \"__BLADE_DIRECTIVE_ARGS__\";\n\nexport type DirectivePhpFormattingMode = \"safe\" | \"aggressive\";\n\nexport interface DirectivePhpFormatTemplate {\n  key: string;\n  template: string;\n}\n\nexport interface DirectivePhpFormattingContext extends DirectivePhpWrapperContext {\n  mode: DirectivePhpFormattingMode;\n}\n\nexport interface BladeSyntaxPlugin {\n  name: string;\n  lexerDirectives: readonly string[];\n  treeDirectives: readonly TreeDirectiveDefinition[];\n  verbatimStartDirectives: readonly string[];\n  verbatimEndDirectives: readonly string[];\n  getDirectivePhpFormatTemplates?(\n    directiveName: string,\n    context: DirectivePhpFormattingContext,\n  ): readonly DirectivePhpFormatTemplate[];\n}\n","import {\n  DIRECTIVE_PHP_FORMAT_ARGS_PLACEHOLDER,\n  type DirectivePhpFormatTemplate,\n  type DirectivePhpFormattingContext,\n} from \"../types.js\";\nimport { getSageDirectiveMetadata } from \"./metadata.js\";\n\nconst DIRECTIVE_CALL_TEMPLATE = `<?php __b(${DIRECTIVE_PHP_FORMAT_ARGS_PLACEHOLDER});`;\nconst DIRECTIVE_GLOBAL_TEMPLATE = `<?php global ${DIRECTIVE_PHP_FORMAT_ARGS_PLACEHOLDER};`;\nconst DIRECTIVE_IF_TEMPLATE = `<?php if (${DIRECTIVE_PHP_FORMAT_ARGS_PLACEHOLDER}) {}`;\nconst DIRECTIVE_QUERY_TEMPLATE = `<?php $__blade_sage_query__ = new WP_Query(${DIRECTIVE_PHP_FORMAT_ARGS_PLACEHOLDER});`;\nconst DIRECTIVE_REPEAT_TEMPLATE = `<?php $__currentLoopData = range(1, ${DIRECTIVE_PHP_FORMAT_ARGS_PLACEHOLDER}); foreach ($__currentLoopData as $__i) : endforeach; ?>`;\nconst DIRECTIVE_POSTS_TEMPLATE = `<?php $__blade_sage_query__ = ${DIRECTIVE_PHP_FORMAT_ARGS_PLACEHOLDER}; if ($__blade_sage_query__) : while (true) : endwhile; endif; ?>`;\n\nfunction withCallFallback(\n  key: string,\n  template: string,\n  directiveName: string,\n): readonly DirectivePhpFormatTemplate[] {\n  return [\n    { key, template },\n    { key: `sage-call:${directiveName}`, template: DIRECTIVE_CALL_TEMPLATE },\n  ];\n}\n\nconst SAGE_DIRECTIVE_TEMPLATES = new Map<string, readonly DirectivePhpFormatTemplate[]>([\n  [\"global\", withCallFallback(\"sage-global\", DIRECTIVE_GLOBAL_TEMPLATE, \"global\")],\n  [\"posts\", withCallFallback(\"sage-posts\", DIRECTIVE_POSTS_TEMPLATE, \"posts\")],\n  [\"query\", withCallFallback(\"sage-query\", DIRECTIVE_QUERY_TEMPLATE, \"query\")],\n  [\"repeat\", withCallFallback(\"sage-repeat\", DIRECTIVE_REPEAT_TEMPLATE, \"repeat\")],\n]);\n\nexport function getSageDirectivePhpFormatTemplates(\n  directiveName: string,\n  context: DirectivePhpFormattingContext,\n): readonly DirectivePhpFormatTemplate[] {\n  const normalizedDirectiveName = directiveName.trim().toLowerCase();\n\n  const direct = SAGE_DIRECTIVE_TEMPLATES.get(normalizedDirectiveName);\n  if (direct) return direct;\n\n  const metadata = getSageDirectiveMetadata(normalizedDirectiveName);\n  if (metadata === null || !metadata.allowsArguments) {\n    return [];\n  }\n\n  if (\n    metadata.isConditionDirective ||\n    context.isConditionLikeDirective?.(normalizedDirectiveName)\n  ) {\n    return withCallFallback(\n      `sage-if:${normalizedDirectiveName}`,\n      DIRECTIVE_IF_TEMPLATE,\n      normalizedDirectiveName,\n    );\n  }\n\n  return [{ key: `sage-call:${normalizedDirectiveName}`, template: DIRECTIVE_CALL_TEMPLATE }];\n}\n","import { SAGE_TREE_DIRECTIVES } from \"./metadata.js\";\nimport { getSageDirectivePhpFormatTemplates } from \"./print.js\";\nimport { type BladeSyntaxPlugin } from \"../types.js\";\n\nexport const SAGE_PLUGIN_NAME = \"log1x/sage-directives\";\n\nexport const sagePlugin: BladeSyntaxPlugin = {\n  name: SAGE_PLUGIN_NAME,\n  // The parser tokenizes directives permissively, so Sage only needs tree metadata.\n  lexerDirectives: [],\n  treeDirectives: SAGE_TREE_DIRECTIVES,\n  verbatimStartDirectives: [],\n  verbatimEndDirectives: [],\n  getDirectivePhpFormatTemplates: getSageDirectivePhpFormatTemplates,\n};\n","import type { BladeSyntaxPlugin } from \"./types.js\";\n\nconst STATAMIC_VERBATIM_START_DIRECTIVES = [\"antlers\"] as const;\nconst STATAMIC_VERBATIM_END_DIRECTIVES = [\"endantlers\"] as const;\n\nexport const statamicPlugin: BladeSyntaxPlugin = {\n  name: \"statamic\",\n  lexerDirectives: [...STATAMIC_VERBATIM_START_DIRECTIVES, ...STATAMIC_VERBATIM_END_DIRECTIVES],\n  treeDirectives: [\n    {\n      name: \"antlers\",\n      args: false,\n      structure: { role: \"open\", terminators: \"endantlers\" },\n    },\n    {\n      name: \"endantlers\",\n      args: false,\n      structure: { role: \"close\" },\n    },\n  ],\n  verbatimStartDirectives: STATAMIC_VERBATIM_START_DIRECTIVES,\n  verbatimEndDirectives: STATAMIC_VERBATIM_END_DIRECTIVES,\n};\n","import type { TreeDirectiveDefinition } from \"../tree/directive-definitions.js\";\nimport { SAGE_PLUGIN_NAME, sagePlugin } from \"./sage/index.js\";\nimport type { BladeSyntaxPlugin } from \"./types.js\";\nimport { statamicPlugin } from \"./statamic.js\";\n\nexport interface BladeSyntaxProfile {\n  lexerDirectives: string[];\n  treeDirectives: TreeDirectiveDefinition[];\n  verbatimStartDirectives: string[];\n  verbatimEndDirectives: string[];\n}\n\nconst BUILTIN_BLADE_SYNTAX_PLUGINS = new Map<string, BladeSyntaxPlugin>([\n  [SAGE_PLUGIN_NAME, sagePlugin],\n  [\"statamic\", statamicPlugin],\n]);\nconst resolvedBladeSyntaxPluginsCache = new WeakMap<object, BladeSyntaxPlugin[]>();\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n  return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction isBladeSyntaxPlugin(value: unknown): value is BladeSyntaxPlugin {\n  if (!isRecord(value)) return false;\n\n  if (typeof value.name !== \"string\") return false;\n  if (!isStringArray(value.lexerDirectives)) return false;\n  if (!Array.isArray(value.treeDirectives)) return false;\n  if (!isStringArray(value.verbatimStartDirectives)) return false;\n  if (!isStringArray(value.verbatimEndDirectives)) return false;\n\n  return true;\n}\n\nfunction normalizeDirectiveName(name: string): string {\n  return name.trim().toLowerCase().replace(/^@/, \"\");\n}\n\nfunction parseBladeSyntaxPluginTokens(value: unknown): unknown[] {\n  if (!Array.isArray(value)) return [];\n\n  const out: unknown[] = [];\n  for (const entry of value) {\n    if (typeof entry === \"string\") {\n      for (const token of entry.split(\",\")) {\n        const trimmed = token.trim();\n        if (trimmed) out.push(trimmed);\n      }\n      continue;\n    }\n    out.push(entry);\n  }\n  return out;\n}\n\nfunction resolveBladeSyntaxPluginEntry(value: unknown): BladeSyntaxPlugin | null {\n  if (typeof value === \"string\") {\n    return BUILTIN_BLADE_SYNTAX_PLUGINS.get(normalizeDirectiveName(value)) ?? null;\n  }\n\n  if (isBladeSyntaxPlugin(value)) {\n    return value;\n  }\n\n  return null;\n}\n\nexport function resolveBladeSyntaxProfile(options?: unknown): BladeSyntaxProfile {\n  const resolvedPlugins = resolveBladeSyntaxPlugins(options);\n  const lexerDirectives = new Set<string>();\n  const verbatimStartDirectives = new Set<string>();\n  const verbatimEndDirectives = new Set<string>();\n  const treeDirectives: TreeDirectiveDefinition[] = [];\n\n  for (const plugin of resolvedPlugins) {\n    for (const directive of plugin.lexerDirectives) {\n      const normalized = normalizeDirectiveName(directive);\n      if (normalized) lexerDirectives.add(normalized);\n    }\n    for (const directive of plugin.verbatimStartDirectives) {\n      const normalized = normalizeDirectiveName(directive);\n      if (normalized) verbatimStartDirectives.add(normalized);\n    }\n    for (const directive of plugin.verbatimEndDirectives) {\n      const normalized = normalizeDirectiveName(directive);\n      if (normalized) verbatimEndDirectives.add(normalized);\n    }\n    for (const directive of plugin.treeDirectives) {\n      treeDirectives.push(directive);\n    }\n  }\n\n  return {\n    lexerDirectives: [...lexerDirectives],\n    treeDirectives,\n    verbatimStartDirectives: [...verbatimStartDirectives],\n    verbatimEndDirectives: [...verbatimEndDirectives],\n  };\n}\n\nexport function resolveBladeSyntaxPlugins(options?: unknown): BladeSyntaxPlugin[] {\n  const optionRecord = isRecord(options) ? options : {};\n  const cached = resolvedBladeSyntaxPluginsCache.get(optionRecord);\n  if (cached) {\n    return cached;\n  }\n\n  const rawPlugins = parseBladeSyntaxPluginTokens(optionRecord.bladeSyntaxPlugins);\n\n  const seenPluginNames = new Set<string>();\n  const resolvedPlugins: BladeSyntaxPlugin[] = [];\n\n  for (const entry of rawPlugins) {\n    const plugin = resolveBladeSyntaxPluginEntry(entry);\n    if (!plugin) continue;\n\n    const key = plugin.name.toLowerCase();\n    if (seenPluginNames.has(key)) continue;\n    seenPluginNames.add(key);\n    resolvedPlugins.push(plugin);\n  }\n\n  resolvedBladeSyntaxPluginsCache.set(optionRecord, resolvedPlugins);\n  return resolvedPlugins;\n}\n","const DELIMITER_LENGTH = 3;\nexport const FRONT_MATTER_MARK = Symbol.for(\"PRETTIER_IS_FRONT_MATTER\");\ntype FrontMatterMarked = { [FRONT_MATTER_MARK]?: true };\n\nexport interface FrontMatterPosition {\n  index: number;\n  line: number; // 1-based\n  column: number; // 0-based\n}\n\nexport interface FrontMatter {\n  language: string;\n  explicitLanguage: string | null;\n  value: string;\n  startDelimiter: string;\n  endDelimiter: string;\n  raw: string;\n  start: FrontMatterPosition;\n  end: FrontMatterPosition;\n  [FRONT_MATTER_MARK]: true;\n}\n\nexport interface ParsedFrontMatter {\n  frontMatter?: FrontMatter;\n  content: string;\n}\n\nexport function markFrontMatter(value: object): void {\n  (value as FrontMatterMarked)[FRONT_MATTER_MARK] = true;\n}\n\nexport function hasFrontMatterMark(value: unknown): boolean {\n  if (!value || typeof value !== \"object\") return false;\n  return (value as FrontMatterMarked)[FRONT_MATTER_MARK] === true;\n}\n\nfunction replaceNonLineBreaksWithSpace(text: string): string {\n  return text.replaceAll(/[^\\r\\n]/g, \" \");\n}\n\nfunction findLineBreakIndex(text: string, start: number): number {\n  for (let i = start; i < text.length; i++) {\n    const ch = text[i];\n    if (ch === \"\\n\" || ch === \"\\r\") {\n      return i;\n    }\n  }\n  return -1;\n}\n\nfunction skipLineBreak(text: string, index: number): number {\n  if (index < 0 || index >= text.length) return index;\n  if (text[index] === \"\\r\" && index + 1 < text.length && text[index + 1] === \"\\n\") {\n    return index + 2;\n  }\n  return index + 1;\n}\n\nfunction getLineAndColumnAtEnd(text: string): { line: number; column: number } {\n  let line = 1;\n  let column = 0;\n\n  for (let i = 0; i < text.length; i++) {\n    const ch = text[i];\n    if (ch === \"\\n\") {\n      line++;\n      column = 0;\n      continue;\n    }\n    if (ch === \"\\r\") {\n      if (i + 1 < text.length && text[i + 1] === \"\\n\") {\n        i++;\n      }\n      line++;\n      column = 0;\n      continue;\n    }\n    column++;\n  }\n\n  return { line, column };\n}\n\nfunction getFrontMatter(text: string): FrontMatter | undefined {\n  const startDelimiter = text.slice(0, DELIMITER_LENGTH);\n  if (startDelimiter !== \"---\" && startDelimiter !== \"+++\") {\n    return;\n  }\n\n  const firstLineBreakIndex = findLineBreakIndex(text, DELIMITER_LENGTH);\n  if (firstLineBreakIndex === -1) {\n    return;\n  }\n\n  const contentStartIndex = skipLineBreak(text, firstLineBreakIndex);\n\n  const explicitLanguage = text.slice(DELIMITER_LENGTH, firstLineBreakIndex).trim();\n\n  let language = explicitLanguage;\n  if (!language) {\n    language = startDelimiter === \"+++\" ? \"toml\" : \"yaml\";\n  }\n\n  const allowYamlAltDelimiter = startDelimiter === \"---\" && language === \"yaml\";\n\n  let endDelimiterStartIndex = -1;\n  let endDelimiterEndIndex = -1;\n  let cursor = contentStartIndex;\n\n  while (cursor <= text.length) {\n    const lineBreakIndex = findLineBreakIndex(text, cursor);\n    const lineEnd = lineBreakIndex === -1 ? text.length : lineBreakIndex;\n    const line = text.slice(cursor, lineEnd);\n\n    if (line === startDelimiter || (allowYamlAltDelimiter && line === \"...\")) {\n      endDelimiterStartIndex = cursor;\n      endDelimiterEndIndex = lineEnd;\n      break;\n    }\n\n    if (lineBreakIndex === -1) {\n      break;\n    }\n\n    cursor = skipLineBreak(text, lineBreakIndex);\n  }\n\n  if (endDelimiterStartIndex === -1 || endDelimiterEndIndex === -1) {\n    return;\n  }\n\n  const frontMatterEndIndex = endDelimiterEndIndex;\n  const raw = text.slice(0, frontMatterEndIndex);\n  const endPosition = getLineAndColumnAtEnd(raw);\n  const endDelimiter = text.slice(endDelimiterStartIndex, endDelimiterEndIndex);\n\n  return {\n    language,\n    explicitLanguage: explicitLanguage || null,\n    value: text.slice(contentStartIndex, endDelimiterStartIndex),\n    startDelimiter,\n    endDelimiter,\n    raw,\n    start: { line: 1, column: 0, index: 0 },\n    end: {\n      index: raw.length,\n      line: endPosition.line,\n      column: endPosition.column,\n    },\n    [FRONT_MATTER_MARK]: true,\n  };\n}\n\nexport function parseFrontMatter(text: string): ParsedFrontMatter {\n  const frontMatter = getFrontMatter(text);\n  if (!frontMatter) {\n    return { content: text };\n  }\n\n  return {\n    frontMatter,\n    content: replaceNonLineBreaksWithSpace(frontMatter.raw) + text.slice(frontMatter.raw.length),\n  };\n}\n","export function buildLineOffsets(source: string): number[] {\n  const offsets = [0];\n  for (let i = 0; i < source.length; i++) {\n    if (source[i] === \"\\n\") {\n      offsets.push(i + 1);\n      continue;\n    }\n\n    if (source[i] === \"\\r\") {\n      if (i + 1 < source.length && source[i + 1] === \"\\n\") {\n        i++;\n      }\n      offsets.push(i + 1);\n    }\n  }\n  return offsets;\n}\n\nexport function getLine(offset: number, lineOffsets: number[]): number {\n  let lo = 0;\n  let hi = lineOffsets.length - 1;\n  while (lo < hi) {\n    const mid = (lo + hi + 1) >> 1;\n    if (lineOffsets[mid] <= offset) {\n      lo = mid;\n    } else {\n      hi = mid - 1;\n    }\n  }\n  return lo;\n}\n","import type { Parser } from \"prettier\";\r\nimport { tokenize } from \"./lexer/lexer.js\";\r\nimport { Directives as LexerDirectives } from \"./lexer/directives.js\";\r\nimport { collectIgnoreRanges } from \"./lexer/ignore-ranges.js\";\r\nimport { buildTree } from \"./tree/tree-builder.js\";\r\nimport { Directives as TreeDirectives } from \"./tree/directives.js\";\r\nimport type { WrappedNode } from \"./types.js\";\r\nimport { NodeKind, NONE, type BuildResult, type FlatNode } from \"./tree/types.js\";\r\nimport { TokenType, type IgnoreRangeRegion } from \"./lexer/types.js\";\r\nimport { hasPragma } from \"./pragma.js\";\r\nimport { resolveBladeSyntaxProfile } from \"./plugins/runtime.js\";\r\nimport { markFrontMatter, parseFrontMatter, type FrontMatter } from \"./front-matter.js\";\r\nimport { buildLineOffsets, getLine } from \"./line-offsets.js\";\r\n\r\nconst INTERNAL_KINDS = new Set([\r\n  NodeKind.ElementName,\r\n  NodeKind.ClosingElementName,\r\n  NodeKind.Attribute,\r\n  NodeKind.JsxAttribute,\r\n  NodeKind.AttributeName,\r\n  NodeKind.AttributeValue,\r\n  NodeKind.AttributeWhitespace,\r\n]);\r\n\r\nconst OPENING_TAG_INTERNAL_KINDS = new Set([\r\n  NodeKind.ElementName,\r\n  NodeKind.Attribute,\r\n  NodeKind.JsxAttribute,\r\n  NodeKind.AttributeWhitespace,\r\n  NodeKind.Directive,\r\n  NodeKind.DirectiveBlock,\r\n  NodeKind.Echo,\r\n  NodeKind.RawEcho,\r\n  NodeKind.TripleEcho,\r\n  NodeKind.PhpTag,\r\n  NodeKind.PhpBlock,\r\n]);\r\n\r\nconst IGNORE_RANGES_OPTION = \"__bladeIgnoreRanges\";\r\n\r\ntype ParserOptionsWithIgnoreRanges = Record<string, unknown> & {\r\n  [IGNORE_RANGES_OPTION]?: IgnoreRangeRegion[];\r\n};\r\n\r\nfunction buildTokenLineNumbers(\r\n  tokens: BuildResult[\"tokens\"],\r\n  lineOffsets: number[],\r\n): { startLines: number[]; endLines: number[] } {\r\n  const startLines: number[] = [];\r\n  const endLines: number[] = [];\r\n  startLines.length = tokens.length;\r\n  endLines.length = tokens.length;\r\n\r\n  let line = 0;\r\n  for (let i = 0; i < tokens.length; i++) {\r\n    const token = tokens[i];\r\n\r\n    while (line + 1 < lineOffsets.length && lineOffsets[line + 1] <= token.start) {\r\n      line++;\r\n    }\r\n    startLines[i] = line;\r\n\r\n    const endOffset = token.end > token.start ? token.end - 1 : token.end;\r\n    while (line + 1 < lineOffsets.length && lineOffsets[line + 1] <= endOffset) {\r\n      line++;\r\n    }\r\n    endLines[i] = line;\r\n  }\r\n\r\n  return { startLines, endLines };\r\n}\r\n\r\nfunction wrapTree(result: BuildResult): WrappedNode {\r\n  const { nodes, tokens, source } = result;\r\n  const wrapped: WrappedNode[] = [];\r\n  wrapped.length = nodes.length;\r\n  const lineOffsets = buildLineOffsets(source);\r\n  const tokenLines = buildTokenLineNumbers(tokens, lineOffsets);\r\n\r\n  // First pass: create all WrappedNodes without relationships.\r\n  for (let i = 0; i < nodes.length; i++) {\r\n    const flat = nodes[i];\r\n    const [start, end] = nodeSourceRange(flat, tokens);\r\n    let startLine = 0;\r\n    let endLine = 0;\r\n    if (flat.tokenCount > 0) {\r\n      const firstTokenIdx = flat.tokenStart;\r\n      const lastTokenIdx = flat.tokenStart + flat.tokenCount - 1;\r\n      startLine = tokenLines.startLines[firstTokenIdx];\r\n      endLine = tokenLines.endLines[lastTokenIdx];\r\n    }\r\n\r\n    wrapped[i] = {\r\n      kind: flat.kind as NodeKind,\r\n      flatIndex: i,\r\n      flat,\r\n      parent: null,\r\n      children: [],\r\n      source,\r\n      start,\r\n      end,\r\n      rawText: shouldMaterializeRawText(flat.kind) ? ownTokenText(flat, tokens, source) : \"\",\r\n      buildResult: result,\r\n      attrs: [],\r\n      tagName: \"\",\r\n      rawTagName: \"\",\r\n      rawClosingTagName: \"\",\r\n      fullName: \"\",\r\n      name: \"\",\r\n      namespace: \"\",\r\n      hasClosingTag: false,\r\n      openTagEndOffset: 0,\r\n      closingTagStartOffset: 0,\r\n      startLine,\r\n      endLine,\r\n      prev: null,\r\n      next: null,\r\n      isSelfClosing: false,\r\n      hasHtmComponentClosingTag: false,\r\n      condition: \"\",\r\n      complete: true,\r\n      conditionalStartIsRevealed: false,\r\n      conditionalEndIsHidden: false,\r\n      isIeConditionalStartComment: false,\r\n      ieConditionalStartCondition: \"\",\r\n      cssDisplay: \"inline\",\r\n      isWhitespaceSensitive: false,\r\n      isIndentationSensitive: false,\r\n      isLeadingSpaceSensitive: false,\r\n      isTrailingSpaceSensitive: false,\r\n      isDanglingSpaceSensitive: false,\r\n      hasLeadingSpaces: false,\r\n      hasTrailingSpaces: false,\r\n      hasDanglingSpaces: false,\r\n    };\r\n  }\r\n\r\n  // Second pass: wire parent/children, filtering internal kinds from children.\r\n  for (let i = 0; i < nodes.length; i++) {\r\n    const flat = nodes[i];\r\n    let childIdx = flat.firstChild;\r\n    while (childIdx !== NONE) {\r\n      const child = wrapped[childIdx];\r\n      child.parent = wrapped[i];\r\n\r\n      if (child.kind !== \"frontMatter\" && INTERNAL_KINDS.has(child.kind)) {\r\n        // Route structural children to appropriate properties.\r\n        // Attribute nodes belong in `attrs` only for Element parents.\r\n        // In other contexts (notably directive blocks parsed in attribute\r\n        // regions), attribute nodes must remain printable body children.\r\n        if (child.kind === NodeKind.Attribute || child.kind === NodeKind.JsxAttribute) {\r\n          if (wrapped[i].kind !== NodeKind.Element) {\r\n            wrapped[i].children.push(child);\r\n            childIdx = nodes[childIdx].nextSibling;\r\n            continue;\r\n          }\r\n          wrapped[i].attrs.push(child);\r\n        }\r\n        if (child.kind === NodeKind.ElementName) {\r\n          const raw = child.rawText;\r\n          wrapped[i].rawTagName = raw;\r\n          wrapped[i].fullName = raw;\r\n          const colonIdx = raw.indexOf(\":\");\r\n          if (colonIdx >= 0) {\r\n            wrapped[i].namespace = raw.slice(0, colonIdx);\r\n            wrapped[i].name = raw.slice(colonIdx + 1);\r\n            wrapped[i].tagName = raw.slice(colonIdx + 1).toLowerCase();\r\n          } else {\r\n            wrapped[i].namespace = \"\";\r\n            wrapped[i].name = raw;\r\n            wrapped[i].tagName = raw.toLowerCase();\r\n          }\r\n        }\r\n        if (child.kind === NodeKind.ClosingElementName) {\r\n          wrapped[i].hasClosingTag = true;\r\n          wrapped[i].rawClosingTagName = child.rawText;\r\n        }\r\n      } else {\r\n        wrapped[i].children.push(child);\r\n      }\r\n\r\n      childIdx = nodes[childIdx].nextSibling;\r\n    }\r\n\r\n    // Compute opening/closing tag offsets for Element nodes.\r\n    // openTagEndOffset equivalent to Prettier's startSourceSpan.end.offset (position after \">\")\r\n    // closingTagStartOffset equivalent to Prettier's endSourceSpan.start.offset (position of \"</\")\r\n    if (flat.kind === NodeKind.Element && flat.tokenCount > 0) {\r\n      const tokenEnd = flat.tokenStart + flat.tokenCount;\r\n      let openingTokenEnd = tokenEnd;\r\n      let childIdx = flat.firstChild;\r\n      while (childIdx !== NONE) {\r\n        const child = wrapped[childIdx];\r\n        if (child.kind === \"frontMatter\" || !OPENING_TAG_INTERNAL_KINDS.has(child.kind)) {\r\n          openingTokenEnd = Math.min(openingTokenEnd, child.flat.tokenStart);\r\n          break;\r\n        }\r\n        childIdx = nodes[childIdx].nextSibling;\r\n      }\r\n\r\n      // Opening tag: find first GreaterThan token (lexer ensures > never appears inside attr values)\r\n      for (let j = flat.tokenStart; j < openingTokenEnd; j++) {\r\n        if (tokens[j].type === TokenType.GreaterThan) {\r\n          wrapped[i].openTagEndOffset = tokens[j].end;\r\n          break;\r\n        }\r\n      }\r\n      // Closing tag: find last LessThan+Slash pair (scanning backwards)\r\n      if (wrapped[i].hasClosingTag) {\r\n        for (let j = tokenEnd - 1; j > flat.tokenStart; j--) {\r\n          if (tokens[j].type === TokenType.Slash && tokens[j - 1].type === TokenType.LessThan) {\r\n            wrapped[i].closingTagStartOffset = tokens[j - 1].start;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // Extract condition text and compute offsets for ConditionalComment nodes.\r\n    // Opening token: ConditionalCommentStart \"<!--[if CONDITION]>\"\r\n    // Closing token: ConditionalCommentEnd \"<![endif]-->\"\r\n    if (flat.kind === NodeKind.ConditionalComment && flat.tokenCount > 0) {\r\n      const firstToken = tokens[flat.tokenStart];\r\n      if (firstToken.type === TokenType.ConditionalCommentStart) {\r\n        const text = source.slice(firstToken.start, firstToken.end);\r\n        wrapped[i].conditionalStartIsRevealed = text.endsWith(\"]><!-->\");\r\n        // Use [^\\]]* to match condition across newlines, then normalize whitespace.\r\n        // Reference: prettier-main/src/language-html/parse/conditional-comment.js\r\n        const match = text.match(/^<!--\\[if\\s*([^\\]]*)\\]>/);\r\n        if (match) {\r\n          wrapped[i].condition = match[1].trim().replace(/\\s+/g, \" \");\r\n        }\r\n        // openTagEndOffset = position right after \"<!--[if ...]>\"\r\n        wrapped[i].openTagEndOffset = firstToken.end;\r\n      }\r\n      // Check completeness: has ConditionalCommentEnd token\r\n      const lastToken = tokens[flat.tokenStart + flat.tokenCount - 1];\r\n      const isComplete = lastToken.type === TokenType.ConditionalCommentEnd;\r\n      wrapped[i].complete = isComplete;\r\n      if (isComplete) {\r\n        const endText = source.slice(lastToken.start, lastToken.end);\r\n        wrapped[i].conditionalEndIsHidden = endText.startsWith(\"<!--<![\");\r\n        wrapped[i].hasClosingTag = true;\r\n        // closingTagStartOffset = position of \"<![endif]-->\"\r\n        wrapped[i].closingTagStartOffset = lastToken.start;\r\n      }\r\n    }\r\n\r\n    if (flat.kind === NodeKind.Comment) {\r\n      const condition = parseIeConditionalStartCommentCondition(wrapped[i].rawText);\r\n      if (condition !== null) {\r\n        wrapped[i].isIeConditionalStartComment = true;\r\n        wrapped[i].ieConditionalStartCondition = condition;\r\n      }\r\n    }\r\n  }\r\n\r\n  return wrapped[0]; // root\r\n}\r\n\r\nfunction nodeSourceRange(node: FlatNode, tokens: BuildResult[\"tokens\"]): [number, number] {\r\n  if (node.tokenCount === 0) return [0, 0];\r\n  const first = tokens[node.tokenStart];\r\n  const last = tokens[node.tokenStart + node.tokenCount - 1];\r\n  return [first.start, last.end];\r\n}\r\n\r\n/**\r\n * Get source text for a node's \"own\" tokens - tokens that belong to this node\r\n * but not to any of its children. For leaf nodes this is the full text.\r\n * For container nodes (Element, DirectiveBlock) this is typically empty or\r\n * just the structural tokens (tags, directive markers).\r\n */\r\nfunction ownTokenText(node: FlatNode, tokens: BuildResult[\"tokens\"], source: string): string {\r\n  if (node.tokenCount === 0) return \"\";\r\n  const s = tokens[node.tokenStart];\r\n  const e = tokens[node.tokenStart + node.tokenCount - 1];\r\n  return source.slice(s.start, e.end);\r\n}\r\n\r\nfunction shouldMaterializeRawText(kind: number): boolean {\r\n  switch (kind) {\r\n    case NodeKind.Text:\r\n    case NodeKind.Comment:\r\n    case NodeKind.BogusComment:\r\n    case NodeKind.BladeComment:\r\n    case NodeKind.IgnoreRange:\r\n    case NodeKind.Doctype:\r\n    case NodeKind.ElementName:\r\n    case NodeKind.ClosingElementName:\r\n      return true;\r\n    default:\r\n      return false;\r\n  }\r\n}\r\n\r\nfunction parseCommentValue(rawText: string): string | null {\r\n  const match = rawText.match(/^<!--([\\s\\S]*?)-->$/);\r\n  return match ? match[1] : null;\r\n}\r\n\r\nfunction parseIeConditionalStartCommentCondition(rawText: string): string | null {\r\n  const value = parseCommentValue(rawText);\r\n  if (value === null) return null;\r\n  const match = value.match(/^\\[if([^\\]]*)\\]><!$/s);\r\n  if (!match) return null;\r\n  return match[1].trim().replace(/\\s+/g, \" \");\r\n}\r\n\r\nfunction prependFrontMatterNode(root: WrappedNode, source: string, frontMatter: FrontMatter): void {\r\n  const lineOffsets = buildLineOffsets(source);\r\n  const endLine = getLine(Math.max(frontMatter.end.index - 1, 0), lineOffsets);\r\n\r\n  const frontMatterNode: WrappedNode = {\r\n    kind: \"frontMatter\",\r\n    flatIndex: -1,\r\n    flat: root.flat,\r\n    parent: root,\r\n    children: [],\r\n    source,\r\n    start: frontMatter.start.index,\r\n    end: frontMatter.end.index,\r\n    rawText: frontMatter.raw,\r\n    raw: frontMatter.raw,\r\n    value: frontMatter.value,\r\n    language: frontMatter.language,\r\n    explicitLanguage: frontMatter.explicitLanguage,\r\n    startDelimiter: frontMatter.startDelimiter,\r\n    endDelimiter: frontMatter.endDelimiter,\r\n    buildResult: root.buildResult,\r\n    attrs: [],\r\n    tagName: \"\",\r\n    rawTagName: \"\",\r\n    rawClosingTagName: \"\",\r\n    fullName: \"\",\r\n    name: \"\",\r\n    namespace: \"\",\r\n    hasClosingTag: false,\r\n    openTagEndOffset: 0,\r\n    closingTagStartOffset: 0,\r\n    startLine: 0,\r\n    endLine,\r\n    prev: null,\r\n    next: null,\r\n    isSelfClosing: true,\r\n    hasHtmComponentClosingTag: false,\r\n    condition: \"\",\r\n    complete: true,\r\n    conditionalStartIsRevealed: false,\r\n    conditionalEndIsHidden: false,\r\n    isIeConditionalStartComment: false,\r\n    ieConditionalStartCondition: \"\",\r\n    cssDisplay: \"inline\",\r\n    isWhitespaceSensitive: false,\r\n    isIndentationSensitive: false,\r\n    isLeadingSpaceSensitive: false,\r\n    isTrailingSpaceSensitive: false,\r\n    isDanglingSpaceSensitive: false,\r\n    hasLeadingSpaces: false,\r\n    hasTrailingSpaces: false,\r\n    hasDanglingSpaces: false,\r\n  };\r\n\r\n  markFrontMatter(frontMatterNode);\r\n  root.children.unshift(frontMatterNode);\r\n}\r\n\r\nfunction parse(text: string, options?: unknown): WrappedNode {\r\n  const { frontMatter, content } = parseFrontMatter(text);\r\n\r\n  const syntaxProfile = resolveBladeSyntaxProfile(options);\r\n  const lexerDirectives = LexerDirectives.acceptAll();\r\n  const parserOptions = (options ?? {}) as ParserOptionsWithIgnoreRanges;\r\n  const ignoreRanges =\r\n    parserOptions[IGNORE_RANGES_OPTION] ??\r\n    collectIgnoreRanges(content, lexerDirectives, {\r\n      verbatimStartDirectives: syntaxProfile.verbatimStartDirectives,\r\n      verbatimEndDirectives: syntaxProfile.verbatimEndDirectives,\r\n    });\r\n\r\n  const { tokens } = tokenize(content, lexerDirectives, {\r\n    verbatimStartDirectives: syntaxProfile.verbatimStartDirectives,\r\n    verbatimEndDirectives: syntaxProfile.verbatimEndDirectives,\r\n    ignoreRanges,\r\n  });\r\n\r\n  const directives = TreeDirectives.withDefaults(syntaxProfile.treeDirectives);\r\n  directives.train(tokens, content);\r\n  const result = buildTree(tokens, content, directives);\r\n  result.ignoreRanges = ignoreRanges;\r\n  const root = wrapTree(result);\r\n\r\n  if (frontMatter) {\r\n    prependFrontMatterNode(root, text, frontMatter);\r\n  }\r\n\r\n  return root;\r\n}\r\n\r\nfunction preprocess(text: string, options?: unknown): string {\r\n  const { content } = parseFrontMatter(text);\r\n  const syntaxProfile = resolveBladeSyntaxProfile(options);\r\n  const lexerDirectives = LexerDirectives.acceptAll();\r\n  const parserOptions = (options ?? {}) as ParserOptionsWithIgnoreRanges;\r\n\r\n  parserOptions[IGNORE_RANGES_OPTION] = collectIgnoreRanges(content, lexerDirectives, {\r\n    verbatimStartDirectives: syntaxProfile.verbatimStartDirectives,\r\n    verbatimEndDirectives: syntaxProfile.verbatimEndDirectives,\r\n  });\r\n\r\n  return text;\r\n}\r\n\r\nexport const bladeParser: Parser<WrappedNode> = {\r\n  parse,\r\n  preprocess,\r\n  hasPragma,\r\n  astFormat: \"blade-ast\",\r\n  locStart: (node: WrappedNode) => node.start,\r\n  locEnd: (node: WrappedNode) => node.end,\r\n};\r\n","import type { Printer, AstPath, Doc, Options } from \"prettier\";\nimport { doc } from \"prettier\";\nimport type { WrappedNode } from \"../types.js\";\nimport { NodeKind } from \"../tree/types.js\";\nimport { TokenType } from \"../lexer/types.js\";\nimport { preprocess } from \"../preprocess.js\";\nimport { insertPragma } from \"../pragma.js\";\nimport { fullText } from \"./utils.js\";\nimport { printElement } from \"./element.js\";\nimport { printChildren } from \"./children.js\";\nimport { printText } from \"./text.js\";\nimport { printDirective, printDirectiveBlock } from \"./directive.js\";\nimport { printEcho } from \"./echo.js\";\nimport { printComment, printBladeComment } from \"./comment.js\";\nimport { printDoctype } from \"./doctype.js\";\nimport { printOpeningTagPrefix, printClosingTagSuffix, printAttribute } from \"./tag.js\";\nimport { embed } from \"./embed.js\";\n\nconst { group, hardline } = doc.builders;\ntype FrontMatterPrinterFeatures = {\n  experimental_frontMatterSupport?: {\n    massageAstNode?: boolean;\n    embed?: boolean;\n    print?: boolean;\n  };\n};\n\ntype BladePrinter = Printer<WrappedNode> & {\n  features?: FrontMatterPrinterFeatures;\n};\n\nfunction assertNever(x: never): never {\n  throw new Error(`Unhandled node kind in printer: ${String(x)}`);\n}\n\nfunction genericPrint(\n  path: AstPath<WrappedNode>,\n  options: Options,\n  print: (path: AstPath<WrappedNode>) => Doc,\n): Doc {\n  const node = path.node;\n\n  switch (node.kind) {\n    case \"frontMatter\":\n      return fullText(node);\n\n    case NodeKind.Root: {\n      const children = printChildren(path, print, options);\n      if (children.length === 0) return \"\";\n      return shouldPreserveIgnoreRangeEof(node) ? group(children) : [group(children), hardline];\n    }\n\n    case NodeKind.Element:\n    case NodeKind.ConditionalComment:\n      return printElement(path, options, print);\n\n    case NodeKind.Text:\n      return printText(node, options);\n\n    case NodeKind.IgnoreRange:\n      return printIgnoreRange(node);\n\n    case NodeKind.Echo:\n    case NodeKind.RawEcho:\n    case NodeKind.TripleEcho:\n      return [\n        printOpeningTagPrefix(node, options),\n        printEcho(node, options),\n        printClosingTagSuffix(node, options),\n      ];\n\n    case NodeKind.Directive:\n      return printDirective(node, options);\n\n    case NodeKind.DirectiveBlock:\n      return printDirectiveBlock(node, path, print, options);\n\n    case NodeKind.Comment:\n    case NodeKind.BogusComment:\n      return printComment(node, options);\n\n    case NodeKind.BladeComment:\n      return printBladeComment(node);\n\n    case NodeKind.Attribute:\n    case NodeKind.JsxAttribute:\n      return printAttribute(node, options);\n\n    case NodeKind.Doctype:\n      return printDoctype(node, options);\n\n    case NodeKind.Verbatim:\n    case NodeKind.PhpBlock:\n    case NodeKind.PhpTag:\n      return printRawBlockNode(node);\n\n    case NodeKind.Cdata:\n    case NodeKind.Decl:\n    case NodeKind.ProcessingInstruction:\n      return [\n        printOpeningTagPrefix(node, options),\n        printRawDelimitedNode(node),\n        printClosingTagSuffix(node, options),\n      ];\n\n    case NodeKind.Fragment:\n      return printChildren(path, print, options);\n\n    case NodeKind.NonOutput:\n      return fullText(node);\n\n    case NodeKind.UnpairedClosingTag:\n      return trimTrailingWhitespaceAtEof(node);\n\n    case NodeKind.ElementName:\n    case NodeKind.AttributeWhitespace:\n    case NodeKind.AttributeName:\n    case NodeKind.AttributeValue:\n      return fullText(node);\n\n    case NodeKind.ClosingElementName:\n      return trimTrailingWhitespaceAtEof(node);\n\n    default:\n      return assertNever(node.kind);\n  }\n}\n\nexport const bladePrinter: BladePrinter = {\n  features: {\n    experimental_frontMatterSupport: {\n      massageAstNode: true,\n      embed: true,\n      print: true,\n    },\n  },\n  preprocess,\n  print: genericPrint,\n  embed,\n  insertPragma,\n  getVisitorKeys(_node: WrappedNode): string[] {\n    return [\"children\", \"attrs\"];\n  },\n};\n\nfunction printRawBlockNode(node: WrappedNode): string {\n  return trimUnterminatedNodeAtEof(node);\n}\n\nfunction printIgnoreRange(node: WrappedNode): string {\n  return fullText(node);\n}\n\nfunction printRawDelimitedNode(node: WrappedNode): string {\n  return trimUnterminatedNodeAtEof(node);\n}\n\nfunction trimUnterminatedNodeAtEof(node: WrappedNode): string {\n  const text = fullText(node);\n  if (!isUnterminatedDelimitedNodeAtEof(node)) {\n    return text;\n  }\n\n  // Unterminated delimited nodes can absorb EOF whitespace. Trimming keeps pass-2\n  // idempotency stable while preserving all non-whitespace content.\n  return text.replace(/\\s+$/u, \"\");\n}\n\nfunction isUnterminatedDelimitedNodeAtEof(node: WrappedNode): boolean {\n  if (node.end !== node.source.length) {\n    return false;\n  }\n\n  const closingToken = getClosingTokenForDelimitedNode(node.kind);\n  if (closingToken === null) {\n    return false;\n  }\n\n  const start = node.flat.tokenStart;\n  const end = start + node.flat.tokenCount;\n  const tokens = node.buildResult.tokens;\n\n  for (let i = start; i < end; i++) {\n    if (tokens[i].type === closingToken) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction getClosingTokenForDelimitedNode(kind: WrappedNode[\"kind\"]): TokenType | null {\n  switch (kind) {\n    case NodeKind.Verbatim:\n      return TokenType.VerbatimEnd;\n    case NodeKind.PhpBlock:\n      return TokenType.PhpBlockEnd;\n    case NodeKind.PhpTag:\n      return TokenType.PhpTagEnd;\n    case NodeKind.Cdata:\n      return TokenType.CdataEnd;\n    case NodeKind.Decl:\n      return TokenType.DeclEnd;\n    case NodeKind.ProcessingInstruction:\n      return TokenType.PIEnd;\n    default:\n      return null;\n  }\n}\n\nfunction trimTrailingWhitespaceAtEof(node: WrappedNode): string {\n  const text = fullText(node);\n  if (node.end !== node.source.length) {\n    return text;\n  }\n  return text.replace(/\\s+$/u, \"\");\n}\n\nfunction shouldPreserveIgnoreRangeEof(node: WrappedNode): boolean {\n  if (node.kind !== NodeKind.Root || node.children.length === 0) {\n    return false;\n  }\n\n  const lastChild = node.children[node.children.length - 1];\n  return lastChild.kind === NodeKind.IgnoreRange && lastChild.end === lastChild.source.length;\n}\n","const HTML_WS_BOTH = /^[\\t\\n\\f\\r ]+|[\\t\\n\\f\\r ]+$/g;\nconst HTML_WS_START = /^[\\t\\n\\f\\r ]+/;\nconst HTML_WS_END = /[\\t\\n\\f\\r ]+$/;\nconst HTML_WS_CHAR = /[\\t\\n\\f\\r ]/;\n\nexport function htmlTrim(s: string): string {\n  return s.replace(HTML_WS_BOTH, \"\");\n}\n\nexport function htmlTrimStart(s: string): string {\n  return s.replace(HTML_WS_START, \"\");\n}\n\nexport function htmlTrimEnd(s: string): string {\n  return s.replace(HTML_WS_END, \"\");\n}\n\nexport function hasHtmlWhitespaceCharacter(s: string): boolean {\n  return HTML_WS_CHAR.test(s);\n}\n","import type { WrappedNode } from \"../types.js\";\nimport { nodeKindLabel } from \"../tree/types.js\";\n\nexport interface PreprocessStage {\n  name: string;\n  run: () => void;\n  validateParents?: boolean;\n  validateSiblings?: boolean;\n}\n\ninterface ExecutePreprocessStageOptions {\n  validateStages: boolean;\n}\n\nfunction getNodeKindName(node: WrappedNode): string {\n  return typeof node.kind === \"number\" ? nodeKindLabel(node.kind) : node.kind;\n}\n\nfunction assertParentLinks(node: WrappedNode): void {\n  for (const child of node.children) {\n    if (child.parent !== node) {\n      throw new Error(\n        `Invalid parent link: child ${getNodeKindName(child)} does not point to parent ${getNodeKindName(node)}`,\n      );\n    }\n    assertParentLinks(child);\n  }\n}\n\nfunction assertSiblingLinks(node: WrappedNode): void {\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i];\n    const expectedPrev = i > 0 ? node.children[i - 1] : null;\n    const expectedNext = i < node.children.length - 1 ? node.children[i + 1] : null;\n    if (child.prev !== expectedPrev || child.next !== expectedNext) {\n      throw new Error(\n        `Invalid sibling links on ${getNodeKindName(child)} under ${getNodeKindName(node)}`,\n      );\n    }\n    assertSiblingLinks(child);\n  }\n}\n\nfunction runPreprocessStage(\n  ast: WrappedNode,\n  stage: PreprocessStage,\n  options: ExecutePreprocessStageOptions,\n): void {\n  stage.run();\n  if (!options.validateStages) {\n    return;\n  }\n\n  try {\n    if (stage.validateParents) {\n      assertParentLinks(ast);\n    }\n    if (stage.validateSiblings) {\n      assertSiblingLinks(ast);\n    }\n  } catch (error) {\n    const message = error instanceof Error ? error.message : \"unknown preprocess failure\";\n    throw new Error(`[preprocess:${stage.name}] ${message}`);\n  }\n}\n\nexport function executePreprocessStages(\n  ast: WrappedNode,\n  stages: PreprocessStage[],\n  { validateStages = false }: { validateStages?: boolean } = {},\n): void {\n  for (const stage of stages) {\n    runPreprocessStage(ast, stage, { validateStages });\n  }\n}\n","export function isBlockLikeCssDisplay(display: string): boolean {\n  return display === \"block\" || display === \"list-item\" || display.startsWith(\"table\");\n}\n\nexport function isFirstChildLeadingSpaceSensitiveCssDisplay(display: string): boolean {\n  return !isBlockLikeCssDisplay(display) && display !== \"inline-block\";\n}\n\nexport function isLastChildTrailingSpaceSensitiveCssDisplay(display: string): boolean {\n  return !isBlockLikeCssDisplay(display) && display !== \"inline-block\";\n}\n\nexport function isNextLeadingSpaceSensitiveCssDisplay(display: string): boolean {\n  return !isBlockLikeCssDisplay(display);\n}\n\nexport function isPrevTrailingSpaceSensitiveCssDisplay(display: string): boolean {\n  return !isBlockLikeCssDisplay(display);\n}\n","export const CSS_DISPLAY_TAGS: Record<string, string> = {\n  // hidden\n  area: \"none\",\n  base: \"none\",\n  basefont: \"none\",\n  datalist: \"none\",\n  head: \"none\",\n  link: \"none\",\n  meta: \"none\",\n  noembed: \"none\",\n  noframes: \"none\",\n  param: \"block\",\n  rp: \"none\",\n  title: \"none\",\n  // block-like but need visibility\n  script: \"block\",\n  style: \"block\",\n  // explicit inline\n  template: \"inline\",\n  // block\n  address: \"block\",\n  article: \"block\",\n  aside: \"block\",\n  blockquote: \"block\",\n  body: \"block\",\n  center: \"block\",\n  dd: \"block\",\n  details: \"block\",\n  dialog: \"block\",\n  dir: \"block\",\n  div: \"block\",\n  dl: \"block\",\n  dt: \"block\",\n  fieldset: \"block\",\n  figcaption: \"block\",\n  figure: \"block\",\n  footer: \"block\",\n  form: \"block\",\n  h1: \"block\",\n  h2: \"block\",\n  h3: \"block\",\n  h4: \"block\",\n  h5: \"block\",\n  h6: \"block\",\n  header: \"block\",\n  hgroup: \"block\",\n  hr: \"block\",\n  html: \"block\",\n  legend: \"block\",\n  li: \"block\",\n  listing: \"block\",\n  main: \"block\",\n  marquee: \"inline-block\",\n  menu: \"block\",\n  nav: \"block\",\n  ol: \"block\",\n  optgroup: \"block\",\n  option: \"block\",\n  p: \"block\",\n  plaintext: \"block\",\n  pre: \"block\",\n  search: \"block\",\n  section: \"block\",\n  source: \"block\",\n  summary: \"block\",\n  table: \"table\",\n  track: \"block\",\n  ul: \"block\",\n  xmp: \"block\",\n  // table\n  caption: \"table-caption\",\n  tr: \"table-row\",\n  td: \"table-cell\",\n  th: \"table-cell\",\n  thead: \"table-header-group\",\n  tbody: \"table-row-group\",\n  tfoot: \"table-footer-group\",\n  col: \"table-column\",\n  colgroup: \"table-column-group\",\n  // inline-block\n  button: \"inline-block\",\n  meter: \"inline-block\",\n  progress: \"inline-block\",\n  select: \"inline-block\",\n  textarea: \"inline-block\",\n  video: \"inline-block\",\n  audio: \"inline-block\",\n  object: \"inline-block\",\n  // ruby\n  ruby: \"ruby\",\n  rt: \"ruby-text\",\n  svg: \"inline-block\",\n};\n\nexport const CSS_DISPLAY_DEFAULT = \"inline\";\n\nexport const CSS_WHITE_SPACE_TAGS: Record<string, string> = {\n  listing: \"pre\",\n  plaintext: \"pre\",\n  pre: \"pre\",\n  xmp: \"pre\",\n  nobr: \"nowrap\",\n  table: \"initial\",\n  textarea: \"pre-wrap\",\n  td: \"normal\",\n  th: \"normal\",\n};\n\nexport const CSS_WHITE_SPACE_DEFAULT = \"normal\";\n","import type { Options } from \"prettier\";\nimport type { WrappedNode } from \"./types.js\";\nimport { NodeKind } from \"./tree/types.js\";\n\nconst VUE_ROOT_ELEMENTS = new Set([\"template\", \"style\", \"script\"]);\n\nexport function hasParent(node: WrappedNode, predicate: (node: WrappedNode) => boolean): boolean {\n  let current: WrappedNode | null = node;\n  while (current) {\n    if (predicate(current)) return true;\n    current = current.parent;\n  }\n  return false;\n}\n\nexport function isUnknownNamespace(node: WrappedNode): boolean {\n  const namespace = node.namespace.toLowerCase();\n  const hasExplicitNamespace = node.fullName.includes(\":\");\n  return (\n    node.kind === NodeKind.Element &&\n    !hasExplicitNamespace &&\n    namespace !== \"\" &&\n    ![\"html\", \"svg\"].includes(namespace)\n  );\n}\n\nexport function isEchoLike(node: WrappedNode): boolean {\n  return (\n    node.kind === NodeKind.Echo ||\n    node.kind === NodeKind.RawEcho ||\n    node.kind === NodeKind.TripleEcho\n  );\n}\n\n/**\n * Text-like in printer terms:\n * text/cdata/comments + Blade interpolation nodes.\n */\nexport function isTextLikeNode(node: WrappedNode): boolean {\n  if (node.kind === NodeKind.Comment) {\n    return !node.isIeConditionalStartComment;\n  }\n  return (\n    node.kind === NodeKind.Text ||\n    node.kind === NodeKind.Cdata ||\n    node.kind === NodeKind.BogusComment ||\n    node.kind === NodeKind.UnpairedClosingTag ||\n    isEchoLike(node)\n  );\n}\n\n/**\n * Text-like in whitespace-sensitivity terms:\n * only raw text and Blade interpolation nodes.\n */\nexport function isWhitespaceTextLikeNode(node: WrappedNode): boolean {\n  return node.kind === NodeKind.Text || isEchoLike(node);\n}\n\nexport function isVueSfcBlock(node: WrappedNode, options: Options): boolean {\n  return (\n    (options as Record<string, unknown>).parser === \"vue\" &&\n    node.kind === NodeKind.Element &&\n    node.parent?.kind === NodeKind.Root &&\n    node.fullName.toLowerCase() !== \"html\"\n  );\n}\n\nexport function isVueCustomBlock(node: WrappedNode, options: Options): boolean {\n  return isVueSfcBlock(node, options) && !VUE_ROOT_ELEMENTS.has(node.fullName);\n}\n\nexport function isVueNonHtmlBlock(node: WrappedNode, options: Options): boolean {\n  return isVueSfcBlock(node, options) && isVueCustomBlock(node, options);\n}\n\nexport function isScriptLikeTag(node: WrappedNode, options?: Options): boolean {\n  if (node.kind !== NodeKind.Element) return false;\n  const full = node.fullName.toLowerCase();\n  return (\n    full === \"script\" ||\n    full === \"style\" ||\n    full === \"svg:style\" ||\n    full === \"svg:script\" ||\n    ((node.namespace === \"svg\" || node.parent?.namespace === \"svg\") &&\n      (node.tagName === \"script\" || node.tagName === \"style\")) ||\n    (full === \"mj-style\" && (options as Record<string, unknown>)?.parser === \"mjml\") ||\n    (isUnknownNamespace(node) && (node.tagName === \"script\" || node.tagName === \"style\"))\n  );\n}\n","/**\n * Preprocessing pipeline - runs on the WrappedNode tree before printing.\n *\n * Ported from Prettier's print-preprocess.js, adapted for our flat-node AST.\n */\nimport type { Options } from \"prettier\";\nimport type { WrappedNode } from \"./types.js\";\nimport { NodeKind } from \"./tree/types.js\";\nimport { VOID_ELEMENTS } from \"./tree/void-elements.js\";\nimport { hasFrontMatterMark } from \"./front-matter.js\";\nimport { buildLineOffsets, getLine } from \"./line-offsets.js\";\nimport {\n  htmlTrim,\n  htmlTrimStart,\n  htmlTrimEnd,\n  hasHtmlWhitespaceCharacter,\n} from \"./html-whitespace.js\";\nimport { executePreprocessStages, type PreprocessStage } from \"./preprocess/pipeline.js\";\nimport {\n  isBlockLikeCssDisplay,\n  isFirstChildLeadingSpaceSensitiveCssDisplay,\n  isLastChildTrailingSpaceSensitiveCssDisplay,\n  isNextLeadingSpaceSensitiveCssDisplay,\n  isPrevTrailingSpaceSensitiveCssDisplay,\n} from \"./preprocess/whitespace-model.js\";\nimport {\n  CSS_DISPLAY_TAGS,\n  CSS_DISPLAY_DEFAULT,\n  CSS_WHITE_SPACE_TAGS,\n  CSS_WHITE_SPACE_DEFAULT,\n} from \"./constants.js\";\nimport {\n  hasParent,\n  isUnknownNamespace,\n  isScriptLikeTag,\n  isEchoLike,\n  isWhitespaceTextLikeNode,\n  isVueSfcBlock,\n  isVueCustomBlock,\n} from \"./node-predicates.js\";\n\nfunction isWhitespaceOnlyText(node: WrappedNode): boolean {\n  return node.kind === NodeKind.Text && /^[\\t\\n\\f\\r ]*$/.test(node.rawText);\n}\n\nfunction getPrevNonWhitespaceSibling(node: WrappedNode): WrappedNode | null {\n  let sibling = node.prev;\n  while (sibling) {\n    if (!isWhitespaceOnlyText(sibling)) return sibling;\n    sibling = sibling.prev;\n  }\n  return null;\n}\n\nfunction isBladeSlotElement(node: WrappedNode): boolean {\n  if (node.kind !== NodeKind.Element) return false;\n  return /^x-slot(?::|\\[|$)/iu.test(node.fullName);\n}\n\nfunction getCssDisplay(node: WrappedNode, options: Options): string {\n  // Every root block in Vue SFC is a block.\n  if (isVueSfcBlock(node, options)) return \"block\";\n\n  // Blade slots are semantically block-like in templates; treating them as\n  // block avoids cramped inline wrapping and aligns with Laravel whitespace trim.\n  if (isBladeSlotElement(node)) return \"block\";\n\n  // Comment display hint: <!-- display: block -->\n  const prevSibling = getPrevNonWhitespaceSibling(node);\n  if (prevSibling?.kind === NodeKind.Comment) {\n    const match = prevSibling.rawText.match(/^<!--\\s*display:\\s*([a-z]+)\\s*-->$/);\n    if (match) return match[1];\n  }\n\n  // SVG namespace handling.\n  if (node.kind === NodeKind.Element && node.namespace === \"svg\") {\n    if (\n      hasParent(\n        node,\n        (parent) =>\n          parent.kind === NodeKind.Element &&\n          parent.namespace === \"svg\" &&\n          parent.tagName === \"foreignobject\",\n      )\n    ) {\n      // Inside foreignObject - fall through to CSS_DISPLAY_TAGS lookup.\n    } else {\n      return node.tagName === \"svg\" ? \"inline-block\" : \"block\";\n    }\n  }\n\n  const wsSensitivity = (options as Record<string, unknown>).htmlWhitespaceSensitivity as\n    | string\n    | undefined;\n\n  // Reference lookup is by local tag name (node.name in Prettier).\n  // Our equivalent is tagName (already lowercase).\n  const lowerName = node.tagName;\n\n  switch (wsSensitivity) {\n    case \"strict\":\n      return \"inline\";\n    case \"ignore\":\n      return \"block\";\n    default: // \"css\"\n      if (\n        node.kind === NodeKind.Element &&\n        (!node.namespace ||\n          hasParent(\n            node,\n            (parent) =>\n              parent.kind === NodeKind.Element &&\n              parent.namespace === \"svg\" &&\n              parent.tagName === \"foreignobject\",\n          ) ||\n          isUnknownNamespace(node)) &&\n        lowerName in CSS_DISPLAY_TAGS\n      ) {\n        return CSS_DISPLAY_TAGS[lowerName];\n      }\n  }\n\n  // Directive blocks behave like block elements for layout.\n  if (node.kind === NodeKind.DirectiveBlock) return \"block\";\n\n  // Root is block.\n  if (node.kind === NodeKind.Root) return \"block\";\n\n  return CSS_DISPLAY_DEFAULT;\n}\n\nfunction getCssWhiteSpace(node: WrappedNode): string {\n  if (node.kind === NodeKind.Element && (!node.namespace || isUnknownNamespace(node))) {\n    const lowerName = node.tagName;\n    if (lowerName in CSS_WHITE_SPACE_TAGS) {\n      return CSS_WHITE_SPACE_TAGS[lowerName];\n    }\n  }\n  return CSS_WHITE_SPACE_DEFAULT;\n}\n\nfunction isPreLikeNode(node: WrappedNode): boolean {\n  return getCssWhiteSpace(node).startsWith(\"pre\");\n}\n\nfunction isFrontMatterNode(node: WrappedNode): boolean {\n  return hasFrontMatterMark(node);\n}\n\n/**\n * Infer implicit namespace for elements without an explicit prefix.\n * Mirrors HTML/SVG tree behavior used by Prettier's HTML parser.\n */\nfunction addImplicitNamespaces(node: WrappedNode, inheritedNamespace = \"\"): void {\n  let childNamespace = inheritedNamespace;\n\n  if (node.kind === NodeKind.Element) {\n    if (!node.fullName.includes(\":\")) {\n      if (node.tagName === \"svg\") {\n        node.namespace = \"svg\";\n      } else if (\n        inheritedNamespace === \"svg\" &&\n        node.parent?.kind === NodeKind.Element &&\n        node.parent.tagName !== \"foreignobject\"\n      ) {\n        node.namespace = \"svg\";\n      } else if (\n        inheritedNamespace === \"svg\" &&\n        node.parent?.kind === NodeKind.Element &&\n        node.parent.tagName === \"foreignobject\"\n      ) {\n        node.namespace = \"\";\n      }\n    }\n\n    childNamespace = node.namespace;\n    if (node.namespace === \"svg\" && node.tagName === \"foreignobject\") {\n      childNamespace = \"\";\n    }\n  }\n\n  for (const child of node.children) {\n    addImplicitNamespaces(child, childNamespace);\n  }\n}\n\nconst isTextLikeNode = isWhitespaceTextLikeNode;\n\n/**\n * Stage 0: Remove ignorable first line feed from pre-like elements.\n * Per HTML spec, a leading newline in <pre>, <textarea>, and <listing>\n * is ignored by browsers. Prettier strips it during preprocessing so that\n * the formatter can re-insert it consistently via lineBeforeChildren.\n * Ported from Prettier's print-preprocess.js removeIgnorableFirstLf.\n */\nconst IGNORE_FIRST_LF_TAGS = new Set([\"pre\", \"textarea\", \"listing\"]);\n\nfunction removeIgnorableFirstLf(node: WrappedNode): void {\n  if (\n    node.kind === NodeKind.Element &&\n    IGNORE_FIRST_LF_TAGS.has(node.fullName.toLowerCase()) &&\n    node.children.length > 0 &&\n    node.children[0].kind === NodeKind.Text &&\n    node.children[0].rawText[0] === \"\\n\"\n  ) {\n    const text = node.children[0];\n    if (text.rawText.length === 1) {\n      // The entire text node was just \"\\n\" - remove it.\n      node.children.splice(0, 1);\n    } else {\n      // Strip the leading \"\\n\" from the text content.\n      text.rawText = text.rawText.slice(1);\n      text.start += 1;\n    }\n  }\n\n  for (const child of node.children) {\n    removeIgnorableFirstLf(child);\n  }\n}\n\nfunction addCssDisplay(node: WrappedNode, options: Options): void {\n  node.cssDisplay = getCssDisplay(node, options);\n  for (const child of node.children) {\n    addCssDisplay(child, options);\n  }\n}\n\nfunction addWhitespaceFlags(node: WrappedNode, options: Options): void {\n  node.isWhitespaceSensitive =\n    isScriptLikeTag(node, options) || isEchoLike(node) || isPreLikeNode(node);\n  node.isIndentationSensitive = isPreLikeNode(node);\n  for (const child of node.children) {\n    addWhitespaceFlags(child, options);\n  }\n}\n\nfunction addSiblings(node: WrappedNode): void {\n  for (let i = 0; i < node.children.length; i++) {\n    node.children[i].prev = i > 0 ? node.children[i - 1] : null;\n    node.children[i].next = i < node.children.length - 1 ? node.children[i + 1] : null;\n  }\n  for (const child of node.children) {\n    addSiblings(child);\n  }\n}\n\nfunction extractWhitespace(node: WrappedNode, lineOffsets: number[]): void {\n  const children = node.children;\n\n  if (children.length === 0) {\n    return;\n  }\n\n  // Check for dangling: all children are whitespace-only text.\n  if (\n    children.length === 1 &&\n    children[0].kind === NodeKind.Text &&\n    htmlTrim(children[0].rawText).length === 0\n  ) {\n    node.hasDanglingSpaces = children[0].rawText.length > 0;\n    children.splice(0, 1);\n    return;\n  }\n\n  // If the node is whitespace-sensitive, don't strip anything.\n  if (node.isWhitespaceSensitive) return;\n\n  for (let i = children.length - 1; i >= 0; i--) {\n    const child = children[i];\n    if (child.kind !== NodeKind.Text) continue;\n\n    const text = child.rawText;\n    const trimmed = htmlTrim(text);\n\n    if (!trimmed) {\n      // Pure whitespace text node - transfer space info to siblings and remove.\n      const prev = children[i - 1];\n      const next = children[i + 1];\n      if (prev) prev.hasTrailingSpaces = true;\n      if (next) next.hasLeadingSpaces = true;\n      if (!prev && !next) {\n        // Only child and is whitespace - becomes dangling.\n        node.hasDanglingSpaces = true;\n      }\n      children.splice(i, 1);\n      continue;\n    }\n\n    // Has content - check leading/trailing whitespace.\n    const leadingLen = text.length - htmlTrimStart(text).length;\n    const trailingLen = text.length - htmlTrimEnd(text).length;\n\n    if (leadingLen > 0) {\n      child.hasLeadingSpaces = true;\n      const prev = children[i - 1];\n      if (prev) prev.hasTrailingSpaces = true;\n    }\n    if (trailingLen > 0) {\n      child.hasTrailingSpaces = true;\n      const next = children[i + 1];\n      if (next) next.hasLeadingSpaces = true;\n    }\n\n    // Trim the raw text so the printer gets clean content.\n    child.rawText = trimmed;\n\n    // Update line numbers to reflect the trimmed content's actual position\n    // in the source. Without this, startLine/endLine span the full token\n    // including leading/trailing whitespace, which breaks hasSurroundingLineBreak.\n    const contentStart = child.start + leadingLen;\n    const contentEnd = child.end - trailingLen;\n    child.startLine = getLine(contentStart, lineOffsets);\n    child.endLine = getLine(contentEnd > 0 ? contentEnd - 1 : 0, lineOffsets);\n  }\n\n  // Recurse.\n  for (const child of children) {\n    extractWhitespace(child, lineOffsets);\n  }\n}\n\nfunction addSpaceSensitivity(node: WrappedNode, options: Options): void {\n  const children = node.children;\n\n  if (children.length === 0) {\n    node.isDanglingSpaceSensitive = isDanglingSpaceSensitive(node);\n    return;\n  }\n\n  // First pass: calculate each child's sensitivity independently.\n  for (const child of children) {\n    child.isLeadingSpaceSensitive = isLeadingSpaceSensitive(child, options);\n    child.isTrailingSpaceSensitive = isTrailingSpaceSensitive(child, options);\n  }\n\n  // Second pass: reconcile between siblings.\n  for (let i = 0; i < children.length; i++) {\n    const child = children[i];\n\n    if (i > 0) {\n      // Leading space only matters if prev sibling's trailing space also matters.\n      child.isLeadingSpaceSensitive =\n        children[i - 1].isTrailingSpaceSensitive && child.isLeadingSpaceSensitive;\n    }\n\n    if (i < children.length - 1) {\n      // Trailing space only matters if next sibling's leading space also matters.\n      child.isTrailingSpaceSensitive =\n        children[i + 1].isLeadingSpaceSensitive && child.isTrailingSpaceSensitive;\n    }\n  }\n\n  // Recurse.\n  for (const child of children) {\n    addSpaceSensitivity(child, options);\n  }\n}\n\nfunction isLeadingSpaceSensitive(node: WrappedNode, options: Options): boolean {\n  const result = _isLeadingSpaceSensitive(node, options);\n\n  // Special case: first child of elements that ignore first LF (pre, textarea, listing).\n  // After removeIgnorableFirstLf strips the leading \"\\n\", the first child should NOT\n  // borrow the parent's \">\" marker. Only interpolation nodes are exempt.\n  // Reference: prettier-main/src/language-html/utilities/index.js:142-148\n  if (\n    result &&\n    !node.prev &&\n    node.parent &&\n    IGNORE_FIRST_LF_TAGS.has(node.parent.fullName.toLowerCase())\n  ) {\n    return isEchoLike(node);\n  }\n\n  return result;\n}\n\nfunction _isLeadingSpaceSensitive(node: WrappedNode, options: Options): boolean {\n  if (isFrontMatterNode(node)) return false;\n\n  // DirectiveBlock (angularControlFlowBlock equivalent) is never space-sensitive.\n  if (node.kind === NodeKind.DirectiveBlock) return false;\n\n  const parent = node.parent;\n  const prev = node.prev;\n\n  // Text-like or interpolation adjacent to text-like/interpolation always preserves space.\n  if (\n    (isTextLikeNode(node) || isEchoLike(node)) &&\n    prev &&\n    (isTextLikeNode(prev) || isEchoLike(prev))\n  ) {\n    return true;\n  }\n\n  if (!parent || parent.cssDisplay === \"none\") return false;\n  if (isPreLikeNode(parent)) return true;\n\n  // First child.\n  if (!prev) {\n    if (\n      parent.kind === NodeKind.Root ||\n      (isPreLikeNode(node) && parent) ||\n      isScriptLikeTag(parent, options) ||\n      isVueCustomBlock(parent, options) ||\n      !isFirstChildLeadingSpaceSensitiveCssDisplay(parent.cssDisplay)\n    ) {\n      return false;\n    }\n    return true;\n  }\n\n  // Not first child - check previous sibling's display.\n  if (!isNextLeadingSpaceSensitiveCssDisplay(prev.cssDisplay)) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction isTrailingSpaceSensitive(node: WrappedNode, options: Options): boolean {\n  if (isFrontMatterNode(node)) return false;\n\n  // DirectiveBlock (angularControlFlowBlock equivalent) is never space-sensitive.\n  if (node.kind === NodeKind.DirectiveBlock) return false;\n\n  const parent = node.parent;\n  const next = node.next;\n\n  // Text-like or interpolation adjacent to text-like/interpolation always preserves space.\n  if (\n    (isTextLikeNode(node) || isEchoLike(node)) &&\n    next &&\n    (isTextLikeNode(next) || isEchoLike(next))\n  ) {\n    return true;\n  }\n\n  if (!parent || parent.cssDisplay === \"none\") return false;\n  if (isPreLikeNode(parent)) return true;\n\n  // Last child.\n  if (!next) {\n    if (\n      parent.kind === NodeKind.Root ||\n      (isPreLikeNode(node) && parent) ||\n      isScriptLikeTag(parent, options) ||\n      isVueCustomBlock(parent, options) ||\n      !isLastChildTrailingSpaceSensitiveCssDisplay(parent.cssDisplay)\n    ) {\n      return false;\n    }\n    return true;\n  }\n\n  // Not last child - check next sibling's display.\n  if (!isPrevTrailingSpaceSensitiveCssDisplay(next.cssDisplay)) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction isDanglingSpaceSensitive(node: WrappedNode): boolean {\n  return (\n    !isBlockLikeCssDisplay(node.cssDisplay) &&\n    node.cssDisplay !== \"inline-block\" &&\n    !isScriptLikeTag(node)\n  );\n}\n\n/**\n * Set unified isSelfClosing flag.\n * Ported from Prettier's print-preprocess.js addIsSelfClosing.\n *\n * Reference: node.isSelfClosing = !node.children ||\n *   (node.kind === \"element\" && (node.tagDefinition.isVoid || <self-closing spans>))\n *\n * For elements: only void elements (br, img, etc.) or self-closing slash (/>) are self-closing.\n * An element that merely lacks a closing tag (e.g. <html> inside a conditional comment)\n * is NOT self-closing - it's just unterminated.\n */\nfunction addIsSelfClosing(node: WrappedNode): void {\n  if (node.kind === NodeKind.Element) {\n    node.isSelfClosing =\n      // HTML void element (br, img, input, etc.)\n      VOID_ELEMENTS.has(node.fullName.toLowerCase()) ||\n      // Self-closing slash (stored in flat.data)\n      node.flat.data === 1;\n  } else {\n    // Non-element nodes: self-closing if they have no children array concept.\n    // In our AST all nodes have children[], so leaf-type nodes (Text, Comment,\n    // Echo, etc.) with no children are self-closing.\n    node.isSelfClosing = node.children.length === 0;\n  }\n  for (const child of node.children) {\n    addIsSelfClosing(child);\n  }\n}\n\n/**\n * Detect HTM component closing tags (`<//>` syntax).\n * Ported from Prettier's print-preprocess.js addHasHtmComponentClosingTag.\n */\nfunction addHasHtmComponentClosingTag(node: WrappedNode): void {\n  if (node.kind === NodeKind.Element && node.hasClosingTag) {\n    // Check if closing tag source text matches HTM's `<//>`\n    // We look at the end of the source from the closing tag position\n    const closingStart = node.source.lastIndexOf(\"</\", node.end);\n    if (closingStart >= 0) {\n      const closingText = node.source.slice(closingStart, node.end);\n      node.hasHtmComponentClosingTag = /^<\\s*\\/\\s*\\/\\s*>$/.test(closingText);\n    }\n  }\n  for (const child of node.children) {\n    addHasHtmComponentClosingTag(child);\n  }\n}\n\n/**\n * Merge simple inline elements into adjacent text nodes.\n * Ported from Prettier's print-preprocess.js mergeSimpleElementIntoText.\n *\n * Example:\n *   before<span>_</span>after -> one text node:\n *   before<span>_</span>after\n */\nfunction mergeSimpleElementIntoText(node: WrappedNode): void {\n  const children = node.children;\n\n  for (let i = 0; i < children.length; i++) {\n    const child = children[i];\n\n    if (child.kind !== NodeKind.Element) {\n      mergeSimpleElementIntoText(child);\n      continue;\n    }\n\n    const prev = i > 0 ? children[i - 1] : null;\n    const next = i < children.length - 1 ? children[i + 1] : null;\n    const firstChild = child.children[0];\n\n    const isSimpleElement =\n      child.attrs.length === 0 &&\n      child.children.length === 1 &&\n      firstChild.kind === NodeKind.Text &&\n      !hasHtmlWhitespaceCharacter(firstChild.rawText) &&\n      !firstChild.hasLeadingSpaces &&\n      !firstChild.hasTrailingSpaces &&\n      child.isLeadingSpaceSensitive &&\n      !child.hasLeadingSpaces &&\n      child.isTrailingSpaceSensitive &&\n      !child.hasTrailingSpaces &&\n      prev?.kind === NodeKind.Text &&\n      next?.kind === NodeKind.Text;\n\n    if (!isSimpleElement) {\n      mergeSimpleElementIntoText(child);\n      continue;\n    }\n\n    prev.rawText +=\n      `<${child.rawTagName}>` + firstChild.rawText + `</${child.rawTagName}>` + next.rawText;\n    prev.end = next.end;\n    prev.endLine = next.endLine;\n    prev.isTrailingSpaceSensitive = next.isTrailingSpaceSensitive;\n    prev.hasTrailingSpaces = next.hasTrailingSpaces;\n\n    // Remove merged element and the following text node.\n    children.splice(i, 2);\n    i--;\n  }\n}\n\nconst VALIDATE_PREPROCESS_STAGES =\n  typeof process !== \"undefined\" && process.env.FORTE_VALIDATE_PREPROCESS === \"1\";\n\nexport function preprocess(ast: WrappedNode, options: Options): WrappedNode {\n  const lineOffsets = buildLineOffsets(ast.source);\n  const stages: PreprocessStage[] = [\n    {\n      name: \"removeIgnorableFirstLf\",\n      run: () => removeIgnorableFirstLf(ast),\n      validateParents: true,\n    },\n    {\n      name: \"mergeIfConditionalStartEndCommentIntoElementOpeningTag\",\n      run: () => mergeIfConditionalStartEndCommentIntoElementOpeningTag(ast),\n      validateParents: true,\n    },\n    {\n      name: \"addImplicitNamespaces\",\n      run: () => addImplicitNamespaces(ast),\n      validateParents: true,\n    },\n    {\n      name: \"addSiblings:initial\",\n      run: () => addSiblings(ast),\n      validateSiblings: true,\n    },\n    {\n      name: \"addCssDisplay\",\n      run: () => addCssDisplay(ast, options),\n    },\n    {\n      name: \"addIsSelfClosing\",\n      run: () => addIsSelfClosing(ast),\n    },\n    {\n      name: \"addHasHtmComponentClosingTag\",\n      run: () => addHasHtmComponentClosingTag(ast),\n    },\n    {\n      name: \"addWhitespaceFlags\",\n      run: () => addWhitespaceFlags(ast, options),\n    },\n    {\n      name: \"extractWhitespace\",\n      run: () => extractWhitespace(ast, lineOffsets),\n      validateParents: true,\n    },\n    {\n      name: \"addSiblings:postExtractWhitespace\",\n      run: () => addSiblings(ast),\n      validateSiblings: true,\n    },\n    {\n      name: \"addSpaceSensitivity\",\n      run: () => addSpaceSensitivity(ast, options),\n    },\n    {\n      name: \"mergeSimpleElementIntoText\",\n      run: () => mergeSimpleElementIntoText(ast),\n      validateParents: true,\n    },\n    {\n      name: \"addSiblings:postMergeSimpleElementIntoText\",\n      run: () => addSiblings(ast),\n      validateSiblings: true,\n    },\n    {\n      name: \"promoteOpeningTagChildrenToAttrs\",\n      run: () => promoteOpeningTagChildrenToAttrs(ast),\n      validateParents: true,\n    },\n    {\n      name: \"addSiblings:postPromoteOpeningTagChildrenToAttrs\",\n      run: () => addSiblings(ast),\n      validateSiblings: true,\n    },\n    {\n      name: \"addSpaceSensitivity:postPromoteOpeningTagChildrenToAttrs\",\n      run: () => addSpaceSensitivity(ast, options),\n    },\n  ];\n\n  executePreprocessStages(ast, stages, {\n    validateStages: VALIDATE_PREPROCESS_STAGES,\n  });\n  return ast;\n}\n\nfunction isOpeningTagContextChild(parent: WrappedNode, child: WrappedNode): boolean {\n  if (parent.kind !== NodeKind.Element) return false;\n  if (parent.openTagEndOffset <= 0) return false;\n\n  return (\n    child.start >= parent.start &&\n    child.start < parent.openTagEndOffset &&\n    child.end <= parent.openTagEndOffset\n  );\n}\n\nfunction promoteOpeningTagChildrenToAttrs(node: WrappedNode): void {\n  for (const child of node.children) {\n    promoteOpeningTagChildrenToAttrs(child);\n  }\n\n  if (node.kind !== NodeKind.Element) {\n    return;\n  }\n\n  if (node.children.length === 0) {\n    return;\n  }\n\n  const moved: WrappedNode[] = [];\n  const retained: WrappedNode[] = [];\n\n  for (const child of node.children) {\n    if (isOpeningTagContextChild(node, child)) {\n      // Opening-tag embedded constructs should be printed as attribute payload,\n      // not as flow/content nodes with marker borrowing behavior.\n      child.prev = null;\n      child.next = null;\n      child.isLeadingSpaceSensitive = false;\n      child.isTrailingSpaceSensitive = false;\n      child.hasLeadingSpaces = false;\n      child.hasTrailingSpaces = false;\n      moved.push(child);\n    } else {\n      retained.push(child);\n    }\n  }\n\n  if (moved.length === 0) {\n    return;\n  }\n\n  node.children = retained;\n  node.attrs = [...node.attrs, ...moved].sort((a, b) =>\n    a.start === b.start ? a.end - b.end : a.start - b.start,\n  );\n}\n\nfunction mergeIfConditionalStartEndCommentIntoElementOpeningTag(node: WrappedNode): void {\n  if (node.children.length === 0) {\n    return;\n  }\n\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i];\n\n    if (child.kind !== NodeKind.Element) {\n      mergeIfConditionalStartEndCommentIntoElementOpeningTag(child);\n      continue;\n    }\n\n    const prev = i > 0 ? node.children[i - 1] : null;\n    const firstChild = child.children[0];\n    const condition = prev ? parseIeConditionalStartComment(prev) : null;\n\n    const canMerge =\n      !!condition &&\n      prev !== null &&\n      prev.end === child.start &&\n      !!firstChild &&\n      firstChild.kind === NodeKind.Comment &&\n      firstChild.start === child.openTagEndOffset &&\n      isIeConditionalEndComment(firstChild);\n\n    if (!canMerge) {\n      mergeIfConditionalStartEndCommentIntoElementOpeningTag(child);\n      continue;\n    }\n\n    child.condition = condition;\n    child.start = prev.start;\n    child.startLine = prev.startLine;\n    child.openTagEndOffset = firstChild.end;\n\n    node.children.splice(i - 1, 1);\n    i--;\n    child.children.splice(0, 1);\n\n    mergeIfConditionalStartEndCommentIntoElementOpeningTag(child);\n  }\n}\n\nfunction parseCommentValue(node: WrappedNode): string | null {\n  if (node.kind !== NodeKind.Comment) return null;\n  const match = node.rawText.match(/^<!--([\\s\\S]*?)-->$/);\n  return match ? match[1] : null;\n}\n\nfunction parseIeConditionalStartComment(node: WrappedNode): string | null {\n  const value = parseCommentValue(node);\n  if (!value) return null;\n  const match = value.match(/^\\[if([^\\]]*)\\]><!$/s);\n  if (!match) return null;\n  return match[1].trim().replace(/\\s+/g, \" \");\n}\n\nfunction isIeConditionalEndComment(node: WrappedNode): boolean {\n  const value = parseCommentValue(node);\n  return !!value && /^<!\\s*\\[endif\\]$/s.test(value);\n}\n","import { htmlTags } from \"@prettier/html-tags\";\nimport { htmlElementAttributes } from \"html-element-attributes\";\n\nexport const HTML_TAGS: ReadonlySet<string> = new Set(htmlTags);\n\nexport const HTML_ELEMENT_ATTRIBUTES: ReadonlyMap<string, ReadonlySet<string>> = new Map(\n  Object.entries(htmlElementAttributes).map(([tagName, attributes]) => [\n    tagName,\n    new Set(attributes),\n  ]),\n);\n","import { isAsciiAlnum } from \"../lexer/scan-primitives.js\";\r\n\r\n// Standard CSS at-rules plus framework/preprocessor rules that should not be\r\n// stolen by Blade directive detection inside style content.\r\nexport const CSS_AT_RULE_NAMES: ReadonlySet<string> = new Set([\r\n  \"charset\",\r\n  \"import\",\r\n  \"namespace\",\r\n  \"media\",\r\n  \"supports\",\r\n  \"layer\",\r\n  \"container\",\r\n  \"scope\",\r\n  \"font-face\",\r\n  \"font-feature-values\",\r\n  \"font-palette-values\",\r\n  \"property\",\r\n  \"counter-style\",\r\n  \"keyframes\",\r\n  \"-webkit-keyframes\",\r\n  \"-moz-keyframes\",\r\n  \"-o-keyframes\",\r\n  \"page\",\r\n  \"starting-style\",\r\n  \"view-transition\",\r\n  \"document\",\r\n  \"custom-media\",\r\n  \"tailwind\",\r\n  \"apply\",\r\n  \"screen\",\r\n  \"responsive\",\r\n  \"variants\",\r\n  \"utility\",\r\n  \"theme\",\r\n  \"plugin\",\r\n  \"config\",\r\n  \"use\",\r\n  \"forward\",\r\n  \"mixin\",\r\n  \"include\",\r\n  \"function\",\r\n  \"return\",\r\n  \"if\",\r\n  \"else\",\r\n  \"for\",\r\n  \"each\",\r\n  \"while\",\r\n  \"at-root\",\r\n  \"extend\",\r\n  \"debug\",\r\n  \"warn\",\r\n  \"error\",\r\n]);\r\n\r\nexport function extractStyleAtRuleNameAt(source: string, pos: number): string | null {\r\n  if (pos < 0 || pos >= source.length || source[pos] !== \"@\") return null;\r\n\r\n  let i = pos + 1;\r\n  const start = i;\r\n  while (i < source.length) {\r\n    const code = source.charCodeAt(i);\r\n    if (!isAsciiAlnum(code) && code !== 45 && code !== 95) break;\r\n    i++;\r\n  }\r\n\r\n  if (i === start) return null;\r\n  return source.slice(start, i).toLowerCase();\r\n}\r\n\r\nexport function isKnownStyleAtRuleName(name: string): boolean {\r\n  return CSS_AT_RULE_NAMES.has(name.toLowerCase());\r\n}\r\n","import type { WrappedNode } from \"../types.js\";\r\nimport { NodeKind } from \"../tree/types.js\";\r\nimport { isFrontendEventStyleAtName } from \"../frontend-attribute-names.js\";\r\nimport { isAsciiAlnum, isAsciiAlpha } from \"../lexer/scan-primitives.js\";\r\nimport { extractStyleAtRuleNameAt, isKnownStyleAtRuleName } from \"./style-at-rules.js\";\r\n\r\ntype RawContentContext = \"style\" | \"script\" | \"generic\";\r\n\r\nfunction extractDirectiveName(text: string): string | null {\r\n  const trimmed = text.trimStart();\r\n  if (!trimmed.startsWith(\"@\")) return null;\r\n\r\n  let i = 1;\r\n  if (i >= trimmed.length) return null;\r\n\r\n  const first = trimmed.charCodeAt(i);\r\n  if (!isAsciiAlpha(first) && first !== 95) return null;\r\n\r\n  while (i < trimmed.length) {\r\n    const code = trimmed.charCodeAt(i);\r\n    if (!isAsciiAlnum(code) && code !== 95) break;\r\n    i++;\r\n  }\r\n\r\n  return trimmed.slice(1, i).toLowerCase();\r\n}\r\n\r\nfunction hasPhpLikeMarkers(text: string): boolean {\r\n  const hasCallWithLiteralArgs = /@[A-Za-z_][A-Za-z0-9_]*\\s*\\(\\s*['\"`[]/u.test(text);\r\n  let hasNamedArgs = false;\r\n  const openParen = text.indexOf(\"(\");\r\n  const closeParen = text.lastIndexOf(\")\");\r\n  if (openParen >= 0 && closeParen > openParen) {\r\n    const args = text.slice(openParen + 1, closeParen);\r\n    hasNamedArgs = /(^|,)\\s*[A-Za-z_][A-Za-z0-9_]*\\s*:/u.test(args);\r\n  }\r\n  return (\r\n    text.includes(\"$\") ||\r\n    text.includes(\"->\") ||\r\n    text.includes(\"::\") ||\r\n    text.includes(\"=>\") ||\r\n    hasCallWithLiteralArgs ||\r\n    hasNamedArgs\r\n  );\r\n}\r\n\r\nfunction hasDirectiveCallArgs(text: string): boolean {\r\n  return /@[A-Za-z_][A-Za-z0-9_]*\\s*\\(/u.test(text);\r\n}\r\n\r\nfunction isDirectiveNodeBladeLike(node: WrappedNode, context: RawContentContext): boolean {\r\n  const text = node.source.slice(node.start, node.end);\r\n  const name = extractDirectiveName(text);\r\n  if (!name) return false;\r\n\r\n  if (context === \"style\") {\r\n    const styleAtRuleName = extractStyleAtRuleNameAt(node.source, node.start);\r\n    if (styleAtRuleName && isKnownStyleAtRuleName(styleAtRuleName)) {\r\n      const trainedDirectives = node.buildResult.directives;\r\n      if (!trainedDirectives?.isDirective(name)) {\r\n        return false;\r\n      }\r\n\r\n      return styleAtRuleName === name && (hasPhpLikeMarkers(text) || hasDirectiveCallArgs(text));\r\n    }\r\n\r\n    if (isFrontendEventStyleAtName(name)) {\r\n      return hasPhpLikeMarkers(text);\r\n    }\r\n  } else if (isFrontendEventStyleAtName(name)) {\r\n    return hasPhpLikeMarkers(text);\r\n  }\r\n\r\n  const trainedDirectives = node.buildResult.directives;\r\n  if (trainedDirectives?.isDirective(name)) {\r\n    return true;\r\n  }\r\n\r\n  // Unknown directive-like token in raw content: only treat as Blade-like\r\n  // when it clearly carries PHP-like syntax.\r\n  return hasPhpLikeMarkers(text);\r\n}\r\n\r\nexport function isBladeConstructChild(\r\n  node: WrappedNode,\r\n  context: RawContentContext = \"generic\",\r\n): boolean {\r\n  switch (node.kind) {\r\n    case NodeKind.Echo:\r\n    case NodeKind.RawEcho:\r\n    case NodeKind.TripleEcho:\r\n    case NodeKind.PhpTag:\r\n    case NodeKind.PhpBlock:\r\n    case NodeKind.DirectiveBlock:\r\n    case NodeKind.IgnoreRange:\r\n      return true;\r\n    case NodeKind.Directive:\r\n      return isDirectiveNodeBladeLike(node, context);\r\n    default:\r\n      return false;\r\n  }\r\n}\r\n\r\nfunction elementContent(node: WrappedNode): string {\r\n  if (node.openTagEndOffset > 0 && node.closingTagStartOffset > node.openTagEndOffset) {\r\n    return node.source.slice(node.openTagEndOffset, node.closingTagStartOffset);\r\n  }\r\n\r\n  if (node.children.length === 0) return \"\";\r\n  const start = node.children[0].start;\r\n  const end = node.children[node.children.length - 1].end;\r\n  if (end <= start) return \"\";\r\n  return node.source.slice(start, end);\r\n}\r\n\r\nexport function parentContainsBladeSyntax(\r\n  node: WrappedNode,\r\n  context: RawContentContext = \"generic\",\r\n): boolean {\r\n  if (node.kind !== NodeKind.Element) return false;\r\n\r\n  if (node.children.some((child) => isBladeConstructChild(child, context))) {\r\n    return true;\r\n  }\r\n\r\n  const content = elementContent(node);\r\n  return (\r\n    content.includes(\"{{\") ||\r\n    content.includes(\"{!!\") ||\r\n    content.includes(\"{{{\") ||\r\n    content.includes(\"<?php\")\r\n  );\r\n}\r\n","import type { Options } from \"prettier\";\nimport type { WrappedNode } from \"../types.js\";\nimport { NodeKind } from \"../tree/types.js\";\nimport { TokenType } from \"../lexer/types.js\";\nimport { HTML_ELEMENT_ATTRIBUTES } from \"../html-data.js\";\nimport { hasFrontMatterMark } from \"../front-matter.js\";\nimport { getIgnoreCommentKindFromCommentText, type IgnoreCommentKind } from \"../ignore-markers.js\";\nimport { isBladeConstructChild, parentContainsBladeSyntax } from \"./blade-syntax.js\";\nimport { isEchoLike, isScriptLikeTag, isVueNonHtmlBlock } from \"../node-predicates.js\";\n\nexport type AttributeValueKind = \"none\" | \"static_text\" | \"pure_construct\" | \"mixed_structured\";\n\nexport type AttributeNamePartKind =\n  | \"text\"\n  | \"echo\"\n  | \"raw_echo\"\n  | \"triple_echo\"\n  | \"directive\"\n  | \"php_tag\"\n  | \"php_block\";\n\nexport interface AttributeNamePart {\n  kind: AttributeNamePartKind;\n  text: string;\n}\n\nconst VALUE_CONSTRUCT_END: Readonly<Record<number, number>> = {\n  [TokenType.EchoStart]: TokenType.EchoEnd,\n  [TokenType.RawEchoStart]: TokenType.RawEchoEnd,\n  [TokenType.TripleEchoStart]: TokenType.TripleEchoEnd,\n  [TokenType.PhpTagStart]: TokenType.PhpTagEnd,\n  [TokenType.PhpBlockStart]: TokenType.PhpBlockEnd,\n};\n\ntype AttributeValueRange = {\n  hasValue: boolean;\n  start: number;\n  end: number;\n  quoted: boolean;\n  quote: string | null;\n};\n\nexport function fullText(node: WrappedNode): string {\n  return node.source.slice(node.start, node.end);\n}\n\nexport function isFrontMatterNode(node: WrappedNode): boolean {\n  return hasFrontMatterMark(node);\n}\n\n// Element structure helpers\n\nexport function isVoidElement(node: WrappedNode): boolean {\n  if (node.children.length > 0) return false;\n  return !node.hasClosingTag;\n}\n\nexport function isSelfClosing(node: WrappedNode): boolean {\n  if (node.kind !== NodeKind.Element) return false;\n  // The tree builder stores self-closing status in flat.data (1 = self-closing).\n  return node.flat.data === 1;\n}\n\n// Node classification helpers\n\nexport function isBlockLike(node: WrappedNode): boolean {\n  const d = node.cssDisplay;\n  return (\n    d === \"block\" ||\n    d === \"list-item\" ||\n    d.startsWith(\"table\") ||\n    node.kind === NodeKind.DirectiveBlock\n  );\n}\n\nexport function isIeConditionalStartComment(node: WrappedNode): boolean {\n  return node.kind === NodeKind.Comment && node.isIeConditionalStartComment;\n}\n\n/**\n * Is this a pre-like node (whitespace/indentation sensitive)?\n * Uses the preprocessed flag rather than a hardcoded tag list.\n */\nexport function isPreLikeNode(node: WrappedNode): boolean {\n  return node.isIndentationSensitive;\n}\n\nexport function canHaveInterpolation(node: WrappedNode, options: Options): boolean {\n  return node.children !== undefined && !isScriptLikeTag(node, options);\n}\n\nexport function getLastDescendant(node: WrappedNode): WrappedNode {\n  let current = node;\n  while (current.children.length > 0) {\n    current = current.children[current.children.length - 1];\n  }\n  return current;\n}\n\nexport function hasLeadingLineBreak(node: WrappedNode): boolean {\n  if (!node.hasLeadingSpaces) return false;\n  if (node.prev) return node.prev.endLine < node.startLine;\n  if (!node.parent) return false;\n  return node.parent.kind === NodeKind.Root || node.parent.startLine < node.startLine;\n}\n\nexport function hasTrailingLineBreak(node: WrappedNode): boolean {\n  if (!node.hasTrailingSpaces) return false;\n  if (node.next) return node.next.startLine > node.endLine;\n  if (!node.parent) return false;\n  return node.parent.kind === NodeKind.Root || node.parent.endLine > node.endLine;\n}\n\nexport function hasSurroundingLineBreak(node: WrappedNode): boolean {\n  return hasLeadingLineBreak(node) && hasTrailingLineBreak(node);\n}\n\n/**\n * Does a node have any non-text children?\n * Reference uses child.kind !== \"text\". We exclude Echo variants too since\n * they're inline-like for Blade (matching reference's \"interpolation\").\n */\nfunction hasNonTextChild(node: WrappedNode): boolean {\n  return (\n    node.children?.some((child) => child.kind !== NodeKind.Text && !isEchoLike(child)) ?? false\n  );\n}\n\nexport function forceBreakChildren(node: WrappedNode): boolean {\n  if (node.kind !== NodeKind.Element) return false;\n  if (node.children.length === 0) return false;\n  return (\n    [\"html\", \"head\", \"ul\", \"ol\", \"select\"].includes(node.tagName) ||\n    (node.cssDisplay.startsWith(\"table\") && node.cssDisplay !== \"table-cell\")\n  );\n}\n\n/**\n * Element content must break onto separate lines.\n * Ported from Prettier: checks if any child has non-text grandchildren\n * (NOT if any child IS non-text - that's a different semantic).\n */\nexport function forceBreakContent(node: WrappedNode): boolean {\n  if (forceBreakChildren(node)) return true;\n\n  if (node.kind !== NodeKind.Element) return false;\n  if (node.children.length === 0) return false;\n\n  if (isBladeSlotElement(node)) return true;\n\n  const firstChild = node.children[0];\n  const lastChild = node.children[node.children.length - 1];\n\n  return (\n    [\"body\", \"script\", \"style\"].includes(node.tagName) ||\n    node.children.some((child) => hasNonTextChild(child)) ||\n    // Single non-text/non-interpolation child with surrounding line breaks forces break.\n    (firstChild === lastChild &&\n      firstChild.kind !== NodeKind.Text &&\n      !isEchoLike(firstChild) &&\n      hasLeadingLineBreak(firstChild) &&\n      (!lastChild.isTrailingSpaceSensitive || hasTrailingLineBreak(lastChild)))\n  );\n}\n\nfunction isBladeSlotElement(node: WrappedNode): boolean {\n  if (node.kind !== NodeKind.Element) return false;\n\n  const fullName = node.fullName.toLowerCase();\n  return (\n    fullName === \"x-slot\" ||\n    fullName.startsWith(\"x-slot:\") ||\n    fullName.startsWith(\"x-slot[\") ||\n    fullName.startsWith(\"x-slot:[\")\n  );\n}\n\nexport function preferHardlineAsSurroundingSpaces(node: WrappedNode): boolean {\n  switch (node.kind) {\n    case NodeKind.Comment:\n    case NodeKind.BogusComment:\n    case NodeKind.BladeComment:\n    case NodeKind.ConditionalComment:\n    case NodeKind.Directive:\n    case NodeKind.DirectiveBlock:\n      return true;\n    case NodeKind.Element:\n      return node.tagName === \"script\" || node.tagName === \"select\";\n    default:\n      return false;\n  }\n}\n\nexport function preferHardlineAsLeadingSpaces(node: WrappedNode): boolean {\n  return (\n    preferHardlineAsSurroundingSpaces(node) ||\n    (!!node.prev && preferHardlineAsTrailingSpaces(node.prev)) ||\n    hasSurroundingLineBreak(node)\n  );\n}\n\nexport function preferHardlineAsTrailingSpaces(node: WrappedNode): boolean {\n  return (\n    preferHardlineAsSurroundingSpaces(node) ||\n    (node.kind === NodeKind.Element && node.tagName === \"br\") ||\n    hasSurroundingLineBreak(node)\n  );\n}\n\n/**\n * Should content be preserved verbatim?\n * Ported from Prettier's shouldPreserveContent with full reference logic.\n */\nexport function shouldPreserveContent(node: WrappedNode, options?: Options): boolean {\n  // Unterminated node in IE conditional comment.\n  if (node.kind === NodeKind.ConditionalComment && node.children.length > 0) {\n    const lastChild = node.children[node.children.length - 1];\n    if (!lastChild.isSelfClosing && !lastChild.hasClosingTag) {\n      return true;\n    }\n  }\n\n  // Incomplete IE conditional comment.\n  if (node.kind === NodeKind.ConditionalComment && !node.complete) {\n    return true;\n  }\n\n  // If conditional content contains unpaired closing tags, keep original text.\n  if (\n    node.kind === NodeKind.ConditionalComment &&\n    node.children.some((child) => child.kind === NodeKind.UnpairedClosingTag)\n  ) {\n    return true;\n  }\n\n  // Pre-like node with non-text/non-interpolation children.\n  if (\n    isPreLikeNode(node) &&\n    node.children.some((child) => child.kind !== NodeKind.Text && !isEchoLike(child))\n  ) {\n    return true;\n  }\n\n  // Blade/PHP constructs inside raw-content elements are not stable when\n  // embedding is bypassed or disabled; preserve raw content to prevent\n  // indentation drift across passes.\n  if (\n    node.kind === NodeKind.Element &&\n    isScriptLikeTag(node, options) &&\n    shouldPreserveRawContentElementWithBlade(node, options)\n  ) {\n    return true;\n  }\n\n  // Vue non-HTML block.\n  if (\n    options &&\n    isVueNonHtmlBlock(node, options) &&\n    !isScriptLikeTag(node, options) &&\n    !isEchoLike(node)\n  ) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction shouldPreserveRawContentElementWithBlade(node: WrappedNode, options?: Options): boolean {\n  const context =\n    node.tagName === \"script\" ? \"script\" : node.tagName === \"style\" ? \"style\" : \"generic\";\n\n  if (context === \"script\") {\n    const hasScriptBladeConstruct = node.children.some(\n      (child) => child.kind !== NodeKind.IgnoreRange && isBladeConstructChild(child, \"script\"),\n    );\n    if (!hasScriptBladeConstruct) {\n      return false;\n    }\n\n    return (\n      !options ||\n      (options as Record<string, unknown>).embeddedLanguageFormatting === \"off\" ||\n      inferElementParser(node, options) === undefined\n    );\n  }\n\n  return parentContainsBladeSyntax(node, context);\n}\n\nconst HTML_WS_REGEX = /[\\t\\n\\f\\r ]+/;\n\nexport function htmlTrimLeadingBlankLines(s: string): string {\n  return s.replaceAll(/^[\\t\\f\\r ]*\\n/g, \"\");\n}\n\nexport function htmlTrimPreserveIndentation(s: string): string {\n  return htmlTrimLeadingBlankLines(s.replace(/[\\t\\n\\f\\r ]+$/, \"\"));\n}\n\nexport function getLeadingAndTrailingHtmlWhitespace(s: string): {\n  leadingWhitespace: string;\n  trailingWhitespace: string;\n  text: string;\n} {\n  let text = s;\n  const leadingMatch = text.match(/^[\\t\\n\\f\\r ]+/);\n  const leadingWhitespace = leadingMatch ? leadingMatch[0] : \"\";\n  if (leadingWhitespace) text = text.slice(leadingWhitespace.length);\n  const trailingMatch = text.match(/[\\t\\n\\f\\r ]+$/);\n  const trailingWhitespace = trailingMatch ? trailingMatch[0] : \"\";\n  if (trailingWhitespace) text = text.slice(0, -trailingWhitespace.length);\n  return { leadingWhitespace, trailingWhitespace, text };\n}\n\nexport function htmlWhitespaceSplit(s: string): string[] {\n  return s.split(HTML_WS_REGEX);\n}\n\n/**\n * Dedent a multi-line string by removing the common leading whitespace.\n * Ported from Prettier's htmlWhitespace.dedentString.\n */\nexport function dedentString(s: string): string {\n  const lines = s.split(\"\\n\");\n  let minIndent = Infinity;\n  for (const line of lines) {\n    if (line.trim().length === 0) continue;\n    const indent = line.match(/^[\\t ]*/)?.[0].length ?? 0;\n    if (indent < minIndent) minIndent = indent;\n  }\n  if (minIndent === 0 || minIndent === Infinity) return s;\n  return lines.map((line) => line.slice(minIndent)).join(\"\\n\");\n}\n\nexport function forceNextEmptyLine(node: WrappedNode): boolean {\n  if (isFrontMatterNode(node)) return true;\n  return !!node.next && node.endLine + 1 < node.next.startLine;\n}\n\ntype IgnoreApplyMode = \"single\";\n\ninterface ChildPrintSegmentBase {\n  startIndex: number;\n  endIndex: number;\n  first: WrappedNode;\n  last: WrappedNode;\n  sourceStart: number;\n  sourceEnd: number;\n}\n\nexport interface ChildPrintSegment extends ChildPrintSegmentBase {}\n\nconst ignoredChildrenCache = new WeakMap<WrappedNode, Map<WrappedNode, IgnoreApplyMode>>();\n\nexport function hasPrettierIgnore(node: WrappedNode): boolean {\n  if (node.kind === NodeKind.Attribute) return false;\n  if (!node.parent) return false;\n  const ignoredChildren = getIgnoredChildren(node.parent);\n  return ignoredChildren.has(node);\n}\n\nexport function getPrettierIgnoreMode(node: WrappedNode): IgnoreApplyMode | null {\n  if (node.kind === NodeKind.Attribute) return null;\n  if (!node.parent) return null;\n  const ignoredChildren = getIgnoredChildren(node.parent);\n  return ignoredChildren.get(node) ?? null;\n}\n\nfunction getIgnoredChildren(parent: WrappedNode): Map<WrappedNode, IgnoreApplyMode> {\n  const cached = ignoredChildrenCache.get(parent);\n  if (cached) return cached;\n\n  const ignored = new Map<WrappedNode, IgnoreApplyMode>();\n  let ignoreNextCount = 0;\n\n  for (const child of parent.children) {\n    const ignoreKind = getIgnoreCommentKind(child);\n\n    if (ignoreNextCount > 0 && ignoreKind !== \"ignore\") {\n      ignored.set(child, \"single\");\n      ignoreNextCount--;\n    }\n\n    if (ignoreKind === \"ignore\") {\n      ignoreNextCount = Math.max(ignoreNextCount, 1);\n    }\n  }\n\n  ignoredChildrenCache.set(parent, ignored);\n  return ignored;\n}\n\nexport function getIgnoreCommentKind(node: WrappedNode): IgnoreCommentKind | null {\n  if (node.kind === NodeKind.Comment) {\n    return getIgnoreCommentKindFromCommentText(fullText(node), \"html\");\n  }\n  if (node.kind === NodeKind.BladeComment) {\n    return getIgnoreCommentKindFromCommentText(fullText(node), \"blade\");\n  }\n  return null;\n}\n\nexport function getPrintableSubtreeEnd(node: WrappedNode): number {\n  let end = node.end;\n\n  const subtreeChildren =\n    node.attrs.length === 0\n      ? node.children\n      : node.children.length === 0\n        ? node.attrs\n        : [...node.attrs, ...node.children].sort((left, right) =>\n            left.start !== right.start ? left.start - right.start : left.end - right.end,\n          );\n\n  for (const child of subtreeChildren) {\n    end = Math.max(end, getPrintableSubtreeEnd(child));\n  }\n\n  return end;\n}\n\nexport function getChildPrintSegments(children: readonly WrappedNode[]): ChildPrintSegment[] {\n  return children.map((child, index) => ({\n    startIndex: index,\n    endIndex: index,\n    first: child,\n    last: child,\n    sourceStart: child.start,\n    sourceEnd: getPrintableSubtreeEnd(child),\n  }));\n}\n\nexport function getAttributeName(node: WrappedNode): string {\n  const rawName = getAttributeNameRaw(node);\n  if (!rawName) return \"\";\n\n  const br = node.buildResult;\n  const tokenStart = node.flat.tokenStart;\n  const tokenEnd = tokenStart + node.flat.tokenCount;\n  for (let i = tokenStart; i < tokenEnd; i++) {\n    const token = br.tokens[i];\n    if (\n      token.type === TokenType.AttributeName ||\n      token.type === TokenType.BoundAttribute ||\n      token.type === TokenType.EscapedAttribute ||\n      token.type === TokenType.ShorthandAttribute\n    ) {\n      return br.source.slice(token.start, token.end);\n    }\n  }\n\n  return rawName;\n}\n\nexport function getAttributeNameRaw(node: WrappedNode): string {\n  const br = node.buildResult;\n  const tokenStart = node.flat.tokenStart;\n  const tokenEnd = tokenStart + node.flat.tokenCount;\n\n  let start = -1;\n  let end = -1;\n  for (let i = tokenStart; i < tokenEnd; i++) {\n    const token = br.tokens[i];\n    if (token.type === TokenType.Equals) break;\n    if (start === -1) start = token.start;\n    if (token.type !== TokenType.Whitespace) end = token.end;\n  }\n\n  if (start === -1 || end === -1 || end < start) return \"\";\n  return br.source.slice(start, end);\n}\n\nexport function isStaticAttributeName(node: WrappedNode): boolean {\n  const br = node.buildResult;\n  const tokenStart = node.flat.tokenStart;\n  const tokenEnd = tokenStart + node.flat.tokenCount;\n\n  for (let i = tokenStart; i < tokenEnd; i++) {\n    const tokenType = br.tokens[i].type;\n    if (tokenType === TokenType.Equals) break;\n    if (\n      tokenType === TokenType.EchoStart ||\n      tokenType === TokenType.RawEchoStart ||\n      tokenType === TokenType.TripleEchoStart ||\n      tokenType === TokenType.Directive ||\n      tokenType === TokenType.PhpTagStart\n    ) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nexport function getStaticAttributeNameLower(node: WrappedNode): string | null {\n  if (!isStaticAttributeName(node)) return null;\n  const raw = getAttributeNameRaw(node);\n  if (!raw) return null;\n  return raw.toLowerCase();\n}\n\nexport function getAttributeNameParts(node: WrappedNode): AttributeNamePart[] {\n  const br = node.buildResult;\n  const tokenStart = node.flat.tokenStart;\n  const tokenEnd = tokenStart + node.flat.tokenCount;\n  const parts: AttributeNamePart[] = [];\n\n  for (let i = tokenStart; i < tokenEnd; i++) {\n    const token = br.tokens[i];\n    if (\n      token.type === TokenType.EchoStart ||\n      token.type === TokenType.RawEchoStart ||\n      token.type === TokenType.TripleEchoStart ||\n      token.type === TokenType.PhpTagStart ||\n      token.type === TokenType.PhpBlockStart\n    ) {\n      const endType =\n        token.type === TokenType.EchoStart\n          ? TokenType.EchoEnd\n          : token.type === TokenType.RawEchoStart\n            ? TokenType.RawEchoEnd\n            : token.type === TokenType.TripleEchoStart\n              ? TokenType.TripleEchoEnd\n              : token.type === TokenType.PhpTagStart\n                ? TokenType.PhpTagEnd\n                : TokenType.PhpBlockEnd;\n      const start = token.start;\n      let end = token.end;\n\n      i++;\n      while (i < tokenEnd) {\n        const current = br.tokens[i];\n        end = current.end;\n        if (current.type === endType) {\n          break;\n        }\n        i++;\n      }\n\n      parts.push({\n        kind:\n          token.type === TokenType.EchoStart\n            ? \"echo\"\n            : token.type === TokenType.RawEchoStart\n              ? \"raw_echo\"\n              : token.type === TokenType.TripleEchoStart\n                ? \"triple_echo\"\n                : token.type === TokenType.PhpTagStart\n                  ? \"php_tag\"\n                  : \"php_block\",\n        text: br.source.slice(start, end),\n      });\n      continue;\n    }\n\n    if (token.type === TokenType.Equals) break;\n    if (token.type === TokenType.Whitespace) continue;\n\n    if (\n      token.type === TokenType.AttributeName ||\n      token.type === TokenType.BoundAttribute ||\n      token.type === TokenType.EscapedAttribute ||\n      token.type === TokenType.ShorthandAttribute ||\n      token.type === TokenType.Text\n    ) {\n      parts.push({\n        kind: \"text\",\n        text: br.source.slice(token.start, token.end),\n      });\n      continue;\n    }\n\n    if (token.type === TokenType.Directive) {\n      const start = token.start;\n      let end = token.end;\n      if (i + 1 < tokenEnd && br.tokens[i + 1].type === TokenType.DirectiveArgs) {\n        i++;\n        end = br.tokens[i].end;\n      }\n      parts.push({ kind: \"directive\", text: br.source.slice(start, end) });\n      continue;\n    }\n\n    parts.push({ kind: \"text\", text: br.source.slice(token.start, token.end) });\n  }\n\n  return parts;\n}\n\nexport function isStaticElementName(node: WrappedNode): boolean {\n  if (node.kind !== NodeKind.Element) return true;\n  return (\n    !node.rawTagName.includes(\"{{\") &&\n    !node.rawTagName.includes(\"{!!\") &&\n    !node.rawTagName.includes(\"<?\") &&\n    !node.rawTagName.includes(\"@\")\n  );\n}\n\nfunction getAttributeValueRange(node: WrappedNode): AttributeValueRange | null {\n  const br = node.buildResult;\n  const tokenStart = node.flat.tokenStart;\n  const tokenEnd = tokenStart + node.flat.tokenCount;\n\n  let equalsIndex = -1;\n  for (let i = tokenStart; i < tokenEnd; i++) {\n    if (br.tokens[i].type === TokenType.Equals) {\n      equalsIndex = i;\n      break;\n    }\n  }\n\n  if (equalsIndex === -1) return null;\n\n  let valueStart = equalsIndex + 1;\n  while (valueStart < tokenEnd && br.tokens[valueStart].type === TokenType.Whitespace) {\n    valueStart++;\n  }\n\n  if (valueStart >= tokenEnd) {\n    return {\n      hasValue: true,\n      start: valueStart,\n      end: valueStart,\n      quoted: false,\n      quote: null,\n    };\n  }\n\n  const isQuoted = br.tokens[valueStart].type === TokenType.Quote;\n  if (!isQuoted) {\n    return {\n      hasValue: true,\n      start: valueStart,\n      end: tokenEnd,\n      quoted: false,\n      quote: null,\n    };\n  }\n\n  const quote = br.source.slice(br.tokens[valueStart].start, br.tokens[valueStart].end);\n\n  let end = tokenEnd;\n  if (end > valueStart + 1 && br.tokens[end - 1].type === TokenType.Quote) {\n    end--;\n  }\n\n  return {\n    hasValue: true,\n    start: valueStart + 1,\n    end,\n    quoted: true,\n    quote,\n  };\n}\n\nexport function getAttributeRawValue(node: WrappedNode): string | null {\n  const br = node.buildResult;\n  const range = getAttributeValueRange(node);\n  if (!range?.hasValue) return null;\n  const { start: valueStart, end: valueEnd, quoted } = range;\n  if (valueStart >= valueEnd) return \"\";\n\n  let value = \"\";\n  for (let i = valueStart; i < valueEnd; i++) {\n    const token = br.tokens[i];\n    // Guard against malformed token streams with stray quote tokens.\n    if (quoted && token.type === TokenType.Quote) {\n      continue;\n    }\n    value += br.source.slice(token.start, token.end);\n  }\n\n  return value;\n}\n\nexport function getAttributeValueQuote(node: WrappedNode): string | null {\n  const range = getAttributeValueRange(node);\n  if (!range?.hasValue || !range.quoted) return null;\n  return range.quote;\n}\n\nexport function getAttributeValueKind(node: WrappedNode): AttributeValueKind {\n  const br = node.buildResult;\n  const range = getAttributeValueRange(node);\n  if (!range?.hasValue) return \"none\";\n  if (range.start >= range.end) return \"static_text\";\n\n  let hasDynamic = false;\n  let hasText = false;\n\n  for (let i = range.start; i < range.end; i++) {\n    const token = br.tokens[i];\n\n    if (token.type === TokenType.JsxAttributeValue) {\n      hasDynamic = true;\n      continue;\n    }\n\n    const endType = VALUE_CONSTRUCT_END[token.type];\n\n    if (endType !== undefined) {\n      hasDynamic = true;\n      i++;\n      while (i < range.end && br.tokens[i].type !== endType) {\n        i++;\n      }\n      continue;\n    }\n\n    if (token.type === TokenType.Directive) {\n      hasDynamic = true;\n      if (i + 1 < range.end && br.tokens[i + 1].type === TokenType.DirectiveArgs) {\n        i++;\n      }\n      continue;\n    }\n\n    const text = br.source.slice(token.start, token.end);\n    if (text.includes(\"<?\")) {\n      hasDynamic = true;\n      continue;\n    }\n\n    hasText = true;\n  }\n\n  if (!hasDynamic) return \"static_text\";\n  return hasText ? \"mixed_structured\" : \"pure_construct\";\n}\n\nexport function isStaticAttributeValue(node: WrappedNode): boolean {\n  return getAttributeValueKind(node) === \"static_text\";\n}\n\nexport function unescapeQuoteEntities(text: string): string {\n  return text.replaceAll(\"&apos;\", \"'\").replaceAll(\"&quot;\", '\"');\n}\n\nexport function getUnescapedAttributeValue(node: WrappedNode): string {\n  const raw = getAttributeRawValue(node);\n  return raw ? unescapeQuoteEntities(raw) : \"\";\n}\n\n/**\n * Build a {name: value} map from an Element's attribute children.\n * Reference uses node.attrMap - we derive it from the attrs array.\n */\nexport function getAttrMap(node: WrappedNode): Record<string, string> {\n  const map: Record<string, string> = {};\n  for (const attr of node.attrs) {\n    if (!isStaticAttributeName(attr)) continue;\n    const name = getAttributeNameRaw(attr);\n    const value = getAttributeRawValue(attr);\n    if (name) map[name.toLowerCase()] = value ?? \"\";\n  }\n  return map;\n}\n\n/**\n * Infer the sub-parser for a script/style element.\n * Reference: utilities/index.js inferElementParser, inferScriptParser, inferStyleParser.\n */\nexport function inferElementParser(node: WrappedNode, options: Options): string | undefined {\n  return inferScriptParser(node, options) ?? inferStyleParser(node, options);\n}\n\nfunction inferScriptParser(node: WrappedNode, options: Options): string | undefined {\n  // Use fullName to avoid matching <html:script> or other namespaced variants.\n  if (node.fullName.toLowerCase() !== \"script\") return;\n  const attrMap = getAttrMap(node);\n  if (\"src\" in attrMap) return;\n  const { type, lang } = attrMap;\n  if (!lang && !type) return \"babel\";\n  return inferParserByLanguage(options, lang) ?? inferParserByTypeAttribute(type);\n}\n\nfunction inferStyleParser(node: WrappedNode, options: Options): string | undefined {\n  // Use fullName to avoid matching <html:style> or other namespaced variants.\n  if (node.fullName.toLowerCase() !== \"style\") return;\n  const { lang } = getAttrMap(node);\n  if (lang) {\n    return inferParserByLanguage(options, lang);\n  }\n  return \"css\";\n}\n\ntype SupportLanguageLike = {\n  name?: string;\n  aliases?: string[];\n  extensions?: string[];\n  parsers?: string[];\n};\n\n/**\n * Port of Prettier's inferParser(..., { language }) behavior:\n * - reverse plugin order\n * - match by `name.toLowerCase()`, aliases, then extensions\n */\nfunction inferParserByLanguage(options: Options, language: string | undefined): string | undefined {\n  if (!language) return;\n\n  const plugins = ((options as Record<string, unknown>).plugins ?? []) as unknown[];\n  const languages = plugins\n    .slice()\n    .reverse()\n    .flatMap((plugin) => {\n      const p = plugin as Record<string, unknown>;\n      return Array.isArray(p.languages) ? (p.languages as SupportLanguageLike[]) : [];\n    });\n\n  const matchedLanguage =\n    languages.find(({ name }) => typeof name === \"string\" && name.toLowerCase() === language) ??\n    languages.find(({ aliases }) => Array.isArray(aliases) && aliases.includes(language)) ??\n    languages.find(\n      ({ extensions }) => Array.isArray(extensions) && extensions.includes(`.${language}`),\n    );\n\n  return matchedLanguage?.parsers?.[0];\n}\n\nconst SCRIPT_TYPE_ATTRIBUTE_PARSER_MAP: Readonly<Record<string, string>> = {\n  module: \"babel\",\n  \"text/javascript\": \"babel\",\n  \"text/babel\": \"babel\",\n  \"text/jsx\": \"babel\",\n  \"application/javascript\": \"babel\",\n  \"application/x-typescript\": \"typescript\",\n  \"text/markdown\": \"markdown\",\n  \"text/html\": \"html\",\n  \"text/x-handlebars-template\": \"glimmer\",\n};\n\nfunction inferParserByTypeAttribute(type: string | undefined): string | undefined {\n  if (!type) return;\n\n  const explicitParser = SCRIPT_TYPE_ATTRIBUTE_PARSER_MAP[type];\n  if (explicitParser) {\n    return explicitParser;\n  }\n\n  if (type.endsWith(\"json\") || type.endsWith(\"importmap\") || type === \"speculationrules\") {\n    return \"json\";\n  }\n\n  return;\n}\n\n/**\n * Normalize an attribute name: lowercase known HTML attributes on known elements.\n */\nexport function normalizeAttributeName(name: string, parentNode: WrappedNode | null): string {\n  if (!parentNode || parentNode.kind !== NodeKind.Element) return name;\n  // Only normalize non-namespaced attributes (no \":\" prefix like v-bind:, x-on:, etc.)\n  if (name.includes(\":\")) return name;\n  const lowerName = name.toLowerCase();\n  const elementName = parentNode.tagName; // already lowercase\n  if (\n    HTML_ELEMENT_ATTRIBUTES.has(elementName) &&\n    (HTML_ELEMENT_ATTRIBUTES.get(\"*\")!.has(lowerName) ||\n      HTML_ELEMENT_ATTRIBUTES.get(elementName)!.has(lowerName))\n  ) {\n    return lowerName;\n  }\n  return name;\n}\n","import type { AstPath, Doc, Options } from \"prettier\";\r\nimport { doc } from \"prettier\";\r\nimport type { WrappedNode } from \"../types.js\";\r\nimport { NodeKind } from \"../tree/types.js\";\r\nimport { TokenType } from \"../lexer/types.js\";\r\nimport { isEchoLike, isScriptLikeTag, isVueCustomBlock } from \"../node-predicates.js\";\r\nimport { shouldPreserveContent, forceBreakContent } from \"./utils.js\";\r\nimport {\r\n  shouldInsertOptionalClosingTags,\r\n  shouldKeepHeadAndBodyAtRoot,\r\n  shouldPreserveInlineIntentElement,\r\n} from \"./blade-options.js\";\r\nimport {\r\n  printOpeningTag,\r\n  printClosingTag,\r\n  printOpeningTagPrefix,\r\n  printClosingTagSuffix,\r\n  printOpeningTagEndMarker,\r\n  printClosingTagStartMarker,\r\n  printClosingTagEndMarker,\r\n  needsToBorrowPrevClosingTagEndMarker,\r\n  needsToBorrowLastChildClosingTagEndMarker,\r\n  needsToBorrowParentOpeningTagEndMarker,\r\n  needsToBorrowParentClosingTagStartMarker,\r\n} from \"./tag.js\";\r\nimport { printChildren } from \"./children.js\";\r\nimport { replaceEndOfLine } from \"./doc-utils.js\";\r\nimport { hasSwallowedTagSyntaxInOpeningSource } from \"../malformed-tags.js\";\r\n\r\nconst {\r\n  group,\r\n  indent,\r\n  indentIfBreak,\r\n  ifBreak,\r\n  breakParent,\r\n  dedentToRoot,\r\n  softline,\r\n  line,\r\n  hardline,\r\n} = doc.builders;\r\n\r\nexport function printElement(\r\n  path: AstPath<WrappedNode>,\r\n  options: Options,\r\n  print: (path: AstPath<WrappedNode>) => Doc,\r\n): Doc {\r\n  const node = path.node;\r\n  if (shouldPreserveMalformedOpeningTag(node, options)) {\r\n    return printMalformedOpeningTag(node);\r\n  }\r\n\r\n  const forceInlineIntentLayout = shouldKeepInlineIntentLayout(node, options);\r\n  const forceMultilineSvgChildren = shouldForceMultilineSvgChildren(node);\r\n  const keepHeadBodyAtRoot = shouldKeepHtmlHeadBodyAtRoot(node, options);\r\n\r\n  // Preserve content verbatim (e.g. <pre> with non-text children).\r\n  if (shouldPreserveContent(node, options)) {\r\n    return [\r\n      printOpeningTagPrefix(node, options),\r\n      group(printOpeningTag(path, options, print)),\r\n      replaceEndOfLine(getNodeContent(node, options)),\r\n      ...printClosingTag(node, options),\r\n      printClosingTagSuffix(node, options),\r\n    ];\r\n  }\r\n\r\n  /**\r\n   * Hug content: single interpolation child without surrounding spaces.\r\n   * Indent only when the opening tag attributes break.\r\n   *\r\n   *     <div>{{ interpolation }}</div>\r\n   *\r\n   * exception: break if the opening tag breaks\r\n   *\r\n   *     <div\r\n   *       long\r\n   *     >{{\r\n   *       interpolation\r\n   *     }}</div>\r\n   */\r\n  const shouldHugContent =\r\n    node.children.length === 1 &&\r\n    isEchoLike(node.children[0]) &&\r\n    node.children[0].isLeadingSpaceSensitive &&\r\n    !node.children[0].hasLeadingSpaces &&\r\n    node.children[0].isTrailingSpaceSensitive &&\r\n    !node.children[0].hasTrailingSpaces;\r\n\r\n  const attrGroupId = Symbol(\"element-attr-group-id\");\r\n\r\n  const printTag = (content: Doc): Doc =>\r\n    group([\r\n      group(printOpeningTag(path, options, print), { id: attrGroupId }),\r\n      content,\r\n      printClosingTag(node, options),\r\n    ]);\r\n\r\n  const printChildrenDoc = (childrenDoc: Doc): Doc => {\r\n    if (forceInlineIntentLayout) {\r\n      return flattenInlineIntentChildren(childrenDoc);\r\n    }\r\n    if (keepHeadBodyAtRoot) {\r\n      return childrenDoc;\r\n    }\r\n    if (shouldHugContent) {\r\n      return indentIfBreak(childrenDoc, { groupId: attrGroupId });\r\n    }\r\n    if (\r\n      (isScriptLikeTag(node, options) || isVueCustomBlock(node, options)) &&\r\n      node.parent?.kind === NodeKind.Root &&\r\n      (options as Record<string, unknown>).parser === \"vue\" &&\r\n      !(options as Record<string, unknown>).vueIndentScriptAndStyle\r\n    ) {\r\n      return childrenDoc;\r\n    }\r\n    return indent(childrenDoc);\r\n  };\r\n\r\n  const printLineBeforeChildren = (): Doc => {\r\n    const firstChild = node.children[0];\r\n    if (forceInlineIntentLayout) {\r\n      return \"\";\r\n    }\r\n    if (forceMultilineSvgChildren) {\r\n      return hardline;\r\n    }\r\n    if (shouldHugContent) {\r\n      return ifBreak(softline, \"\", { groupId: attrGroupId });\r\n    }\r\n    if (firstChild.hasLeadingSpaces && firstChild.isLeadingSpaceSensitive) {\r\n      return line;\r\n    }\r\n    if (\r\n      firstChild.kind === NodeKind.Text &&\r\n      node.isWhitespaceSensitive &&\r\n      node.isIndentationSensitive\r\n    ) {\r\n      return dedentToRoot(softline);\r\n    }\r\n    return softline;\r\n  };\r\n\r\n  const printLineAfterChildren = (): Doc => {\r\n    const lastChild = node.children[node.children.length - 1];\r\n    if (forceInlineIntentLayout) {\r\n      return \"\";\r\n    }\r\n    if (forceMultilineSvgChildren) {\r\n      return hardline;\r\n    }\r\n    if (!node.hasClosingTag && !node.isSelfClosing && !shouldInsertOptionalClosingTags(options)) {\r\n      return \"\";\r\n    }\r\n\r\n    if (isRecoveryUnclosedElementWithClosingText(node)) {\r\n      return \"\";\r\n    }\r\n\r\n    const needsToBorrow = node.next\r\n      ? needsToBorrowPrevClosingTagEndMarker(node.next)\r\n      : needsToBorrowLastChildClosingTagEndMarker(node.parent!);\r\n\r\n    if (needsToBorrow) {\r\n      if (lastChild.hasTrailingSpaces && lastChild.isTrailingSpaceSensitive) {\r\n        return \" \";\r\n      }\r\n      return \"\";\r\n    }\r\n\r\n    if (shouldHugContent) {\r\n      return ifBreak(softline, \"\", { groupId: attrGroupId });\r\n    }\r\n\r\n    if (lastChild.hasTrailingSpaces && lastChild.isTrailingSpaceSensitive) {\r\n      return line;\r\n    }\r\n\r\n    // For pre-like elements or comment last children whose content ends with\r\n    // a newline at the expected indentation, suppress the extra softline.\r\n    const lastChildTrailingValue =\r\n      lastChild.kind === NodeKind.Comment ? getCommentValue(lastChild.rawText) : lastChild.rawText;\r\n    if (\r\n      (lastChild.kind === NodeKind.Comment ||\r\n        lastChild.kind === NodeKind.BogusComment ||\r\n        (lastChild.kind === NodeKind.Text &&\r\n          node.isWhitespaceSensitive &&\r\n          node.isIndentationSensitive)) &&\r\n      endsWithIndentedNewline(\r\n        lastChildTrailingValue,\r\n        (options.tabWidth ?? 2) * countAncestors(path),\r\n      )\r\n    ) {\r\n      return \"\";\r\n    }\r\n\r\n    return softline;\r\n  };\r\n\r\n  // Empty element.\r\n  if (node.children.length === 0) {\r\n    const shouldPrintDanglingSpaceLine =\r\n      node.hasDanglingSpaces &&\r\n      node.isDanglingSpaceSensitive &&\r\n      !shouldSuppressDanglingSpaceAtEof(node);\r\n    return printTag(shouldPrintDanglingSpaceLine ? line : \"\");\r\n  }\r\n\r\n  return printTag([\r\n    forceBreakContent(node) ? breakParent : \"\",\r\n    printChildrenDoc([printLineBeforeChildren(), printChildren(path, print, options)]),\r\n    printLineAfterChildren(),\r\n  ]);\r\n}\r\n\r\nfunction shouldPreserveMalformedOpeningTag(node: WrappedNode, options: Options): boolean {\r\n  if (node.kind !== NodeKind.Element || node.hasClosingTag || node.isSelfClosing) {\r\n    return false;\r\n  }\r\n\r\n  if (node.openTagEndOffset > node.start && !hasSwallowedTagSyntaxInOpeningTag(node)) {\r\n    return false;\r\n  }\r\n\r\n  if (isRecoverableUnterminatedOpeningEcho(node)) {\r\n    return false;\r\n  }\r\n\r\n  if (!shouldInsertOptionalClosingTags(options)) {\r\n    return true;\r\n  }\r\n\r\n  return hasComplexMalformedOpeningSyntax(node);\r\n}\r\n\r\nfunction isRecoverableUnterminatedOpeningEcho(node: WrappedNode): boolean {\r\n  if (node.kind !== NodeKind.Element) {\r\n    return false;\r\n  }\r\n\r\n  if (node.attrs.length > 0 || node.children.length !== 1) {\r\n    return false;\r\n  }\r\n\r\n  const onlyChild = node.children[0];\r\n  return (\r\n    (onlyChild.kind === NodeKind.Echo ||\r\n      onlyChild.kind === NodeKind.RawEcho ||\r\n      onlyChild.kind === NodeKind.TripleEcho) &&\r\n    onlyChild.start >= node.start &&\r\n    onlyChild.end === node.end\r\n  );\r\n}\r\n\r\nfunction hasComplexMalformedOpeningSyntax(node: WrappedNode): boolean {\r\n  const tokens = node.buildResult.tokens;\r\n  const start = node.flat.tokenStart;\r\n  const end = start + node.flat.tokenCount;\r\n\r\n  for (let i = start; i < end; i++) {\r\n    switch (tokens[i].type) {\r\n      case TokenType.TsxGenericType:\r\n      case TokenType.Directive:\r\n      case TokenType.DirectiveArgs:\r\n      case TokenType.EchoStart:\r\n      case TokenType.RawEchoStart:\r\n      case TokenType.TripleEchoStart:\r\n      case TokenType.PhpTagStart:\r\n      case TokenType.PhpBlockStart:\r\n        return true;\r\n      default:\r\n        break;\r\n    }\r\n  }\r\n\r\n  return (\r\n    node.attrs.length > 1 ||\r\n    node.children.length > 0 ||\r\n    node.source.slice(node.start + 1, node.end).includes(\"<\")\r\n  );\r\n}\r\n\r\nfunction printMalformedOpeningTag(node: WrappedNode): string {\r\n  return node.source.slice(node.start, maxDescendantEnd(node)).replace(/\\s+$/u, \"\");\r\n}\r\n\r\nfunction hasSwallowedTagSyntaxInOpeningTag(node: WrappedNode): boolean {\r\n  if (node.openTagEndOffset <= node.start) {\r\n    return false;\r\n  }\r\n\r\n  const openingSource = node.source.slice(node.start + 1, node.openTagEndOffset);\r\n  return hasSwallowedTagSyntaxInOpeningSource(openingSource);\r\n}\r\n\r\nfunction maxDescendantEnd(node: WrappedNode): number {\r\n  let end = node.end;\r\n  for (const child of node.children) {\r\n    end = Math.max(end, maxDescendantEnd(child));\r\n  }\r\n\r\n  return end;\r\n}\r\n\r\nfunction flattenInlineIntentChildren(childrenDoc: Doc): Doc {\r\n  return doc.utils.mapDoc(childrenDoc, (current) => {\r\n    if (current === softline) {\r\n      return \"\";\r\n    }\r\n    if (current === line || current === hardline) {\r\n      return \" \";\r\n    }\r\n    if (current === breakParent) {\r\n      return \"\";\r\n    }\r\n    return current;\r\n  }) as Doc;\r\n}\r\n\r\nfunction isRecoveryUnclosedElementWithClosingText(node: WrappedNode): boolean {\r\n  return (\r\n    node.kind === NodeKind.Element &&\r\n    !node.hasClosingTag &&\r\n    !node.isSelfClosing &&\r\n    node.rawTagName.length > 0 &&\r\n    node.openTagEndOffset > 0 &&\r\n    node.source\r\n      .slice(node.openTagEndOffset, node.end)\r\n      .toLowerCase()\r\n      .includes(`</${node.rawTagName.toLowerCase()}`)\r\n  );\r\n}\r\n\r\nfunction shouldKeepInlineIntentLayout(node: WrappedNode, options: Options): boolean {\r\n  if (node.kind !== NodeKind.Element) return false;\r\n  if (node.children.length === 0) return false;\r\n  if (!node.hasClosingTag) return false;\r\n  if (node.openTagEndOffset <= node.start) return false;\r\n  if (node.closingTagStartOffset <= node.openTagEndOffset) return false;\r\n  if (!shouldPreserveInlineIntentElement(options, node.tagName, node.namespace)) {\r\n    return false;\r\n  }\r\n  if (containsBlockDirectiveDescendant(node)) {\r\n    return false;\r\n  }\r\n\r\n  // Mixed inline/multiline icon trees are a common source of one-pass drift.\r\n  // For svg roots with multiple element children, prefer stable multiline\r\n  // layout over aggressive single-line preservation.\r\n  if (node.tagName === \"svg\") {\r\n    let elementChildCount = 0;\r\n    for (const child of node.children) {\r\n      if (child.kind === NodeKind.Element) {\r\n        elementChildCount++;\r\n        if (elementChildCount > 1) {\r\n          return false;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return hasInlineIntentShellSource(node);\r\n}\r\n\r\nfunction shouldSuppressDanglingSpaceAtEof(node: WrappedNode): boolean {\r\n  if (node.kind !== NodeKind.Element) return false;\r\n  if (node.end !== node.source.length) return false;\r\n  return !node.hasClosingTag && !node.isSelfClosing;\r\n}\r\n\r\nfunction hasInlineIntentShellSource(node: WrappedNode): boolean {\r\n  const source = node.source.slice(node.start, node.end);\r\n  if (!/[\\r\\n]/u.test(source)) {\r\n    return true;\r\n  }\r\n\r\n  const firstChild = node.children[0];\r\n  const lastChild = node.children[node.children.length - 1];\r\n  if (!firstChild || !lastChild) {\r\n    return false;\r\n  }\r\n\r\n  const openingGap = node.source.slice(node.openTagEndOffset, firstChild.start);\r\n  if (/[\\r\\n]/u.test(openingGap)) {\r\n    return false;\r\n  }\r\n\r\n  const closingGap = node.source.slice(lastChild.end, node.closingTagStartOffset);\r\n  return !/[\\r\\n]/u.test(closingGap);\r\n}\r\n\r\nfunction shouldForceMultilineSvgChildren(node: WrappedNode): boolean {\r\n  if (node.kind !== NodeKind.Element) return false;\r\n  if (node.tagName === \"clippath\") {\r\n    for (const child of node.children) {\r\n      if (child.kind === NodeKind.Element) {\r\n        return true;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  if (node.tagName !== \"svg\") return false;\r\n\r\n  let elementChildCount = 0;\r\n  for (const child of node.children) {\r\n    if (child.kind === NodeKind.Element) {\r\n      elementChildCount++;\r\n      if (elementChildCount > 1) {\r\n        return true;\r\n      }\r\n    }\r\n  }\r\n  return false;\r\n}\r\n\r\nfunction containsBlockDirectiveDescendant(node: WrappedNode): boolean {\r\n  const stack = [...node.children];\r\n  while (stack.length > 0) {\r\n    const current = stack.pop()!;\r\n    if (\r\n      current.kind === NodeKind.DirectiveBlock ||\r\n      (current.kind === NodeKind.Directive && current.children.length > 0)\r\n    ) {\r\n      return true;\r\n    }\r\n    for (let i = 0; i < current.children.length; i++) {\r\n      stack.push(current.children[i]);\r\n    }\r\n  }\r\n  return false;\r\n}\r\n\r\nfunction shouldKeepHtmlHeadBodyAtRoot(node: WrappedNode, options: Options): boolean {\r\n  if (!shouldKeepHeadAndBodyAtRoot(options)) return false;\r\n  if (node.kind !== NodeKind.Element) return false;\r\n  if (node.namespace.length > 0) return false;\r\n  if (node.tagName !== \"html\") return false;\r\n  if (node.parent?.kind !== NodeKind.Root) return false;\r\n\r\n  const directElementChildren = node.children.filter(\r\n    (child): child is WrappedNode => child.kind === NodeKind.Element,\r\n  );\r\n  if (directElementChildren.length === 0) return false;\r\n\r\n  return directElementChildren.every(\r\n    (child) =>\r\n      child.namespace.length === 0 && (child.tagName === \"head\" || child.tagName === \"body\"),\r\n  );\r\n}\r\n\r\n/**\r\n * Count ancestor depth, matching reference's `path.ancestors.length - 1`.\r\n * path.ancestors includes all ancestors; subtracting 1 gives depth from root.\r\n */\r\nfunction countAncestors(path: AstPath<WrappedNode>): number {\r\n  // Match Prettier HTML reference exactly: path.ancestors.length - 1.\r\n  // When unavailable, prefer 0-depth fallback instead of parent-chain depth,\r\n  // which over-indents this heuristic and changes line-after-children behavior.\r\n  if (\"ancestors\" in path && Array.isArray(path.ancestors)) {\r\n    return Math.max((path.ancestors as unknown[]).length - 1, 0);\r\n  }\r\n  return 0;\r\n}\r\n\r\n/**\r\n * Get the raw content between the opening and closing tags.\r\n * Ported from Prettier's get-node-content.js.\r\n *\r\n * Uses openTagEndOffset / closingTagStartOffset (equivalent to Prettier's startSourceSpan.end\r\n * / endSourceSpan.start) to read verbatim from the **original** source text,\r\n * exactly as the reference does with `options.originalText.slice(start, end)`.\r\n */\r\nfunction getNodeContent(node: WrappedNode, options?: Options): string {\r\n  if (!node.hasClosingTag) return \"\";\r\n  if (!node.openTagEndOffset && !node.closingTagStartOffset) return \"\";\r\n\r\n  let start = node.openTagEndOffset;\r\n  if (node.children.length > 0 && needsToBorrowParentOpeningTagEndMarker(node.children[0])) {\r\n    start -= printOpeningTagEndMarker(node).length;\r\n  }\r\n\r\n  let end = node.closingTagStartOffset;\r\n  const last = node.children.length > 0 ? node.children[node.children.length - 1] : null;\r\n  if (last && needsToBorrowParentClosingTagStartMarker(last)) {\r\n    end += printClosingTagStartMarker(node, options).length;\r\n  } else if (needsToBorrowLastChildClosingTagEndMarker(node)) {\r\n    end -= printClosingTagEndMarker(last!, options).length;\r\n  }\r\n\r\n  return node.source.slice(start, end);\r\n}\r\n\r\nfunction getCommentValue(rawText: string): string {\r\n  const match = rawText.match(/^<!--([\\s\\S]*?)-->$/);\r\n  return match ? match[1] : rawText;\r\n}\r\n\r\nfunction endsWithIndentedNewline(value: string, indentWidth: number): boolean {\r\n  let index = value.length - 1;\r\n  let wsCount = 0;\r\n\r\n  while (index >= 0) {\r\n    const ch = value.charCodeAt(index);\r\n    if (ch !== 32 && ch !== 9) break;\r\n    wsCount++;\r\n    index--;\r\n  }\r\n\r\n  return wsCount === indentWidth && index >= 0 && value.charCodeAt(index) === 10;\r\n}\r\n","import type { Options } from \"prettier\";\nimport { getCanonicalDirectiveName } from \"../lexer/directives.js\";\n\nexport type DirectiveCaseMode = \"preserve\" | \"canonical\" | \"lower\";\nexport type DirectiveArgSpacingMode = \"preserve\" | \"none\" | \"space\";\nexport type DirectiveArgSpacingRule = DirectiveArgSpacingMode | number;\nexport type DirectiveBlockStyle = \"preserve\" | \"inline-if-short\" | \"multiline\";\nexport type BladeBlankLinesMode = \"preserve\" | \"always\";\nexport type EchoSpacingMode = \"preserve\" | \"space\" | \"tight\";\nexport type SlotClosingTagMode = \"canonical\" | \"preserve\";\nexport type VoidElementSlashMode = \"always\" | \"never\" | \"preserve\";\n\nconst directiveCaseMapCache = new WeakMap<object, Map<string, string>>();\nconst directiveArgSpacingOverridesCache = new WeakMap<\n  object,\n  Map<string, DirectiveArgSpacingRule>\n>();\nconst inlineIntentElementsCache = new WeakMap<object, Set<string>>();\nconst bladeComponentPrefixesCache = new WeakMap<object, string[]>();\n\nconst DEFAULT_INLINE_INTENT_ELEMENTS = [\"p\", \"svg\", \"svg:*\"] as const;\nconst DEFAULT_BLADE_COMPONENT_PREFIXES = [\n  \"x\",\n  \"s\",\n  \"statamic\",\n  \"flux\",\n  \"livewire\",\n  \"native\",\n] as const;\nexport const DEFAULT_DIRECTIVE_ARG_SPACING_OVERRIDE_TOKENS = Object.freeze([\n  \"if\",\n  \"elseif\",\n  \"unless\",\n  \"while\",\n  \"for\",\n  \"foreach\",\n  \"forelse\",\n  \"switch\",\n  \"case\",\n] as const);\nexport const DEFAULT_DIRECTIVE_ARG_SPACING_OVERRIDES = Object.freeze({\n  if: \"space\",\n  elseif: \"space\",\n  unless: \"space\",\n  while: \"space\",\n  for: \"space\",\n  foreach: \"space\",\n  forelse: \"space\",\n  switch: \"space\",\n  case: \"space\",\n} satisfies Record<string, DirectiveArgSpacingMode>);\n\nfunction normalizeDirectiveName(name: string): string {\n  return name.startsWith(\"@\") ? name.slice(1) : name;\n}\n\nfunction normalizeDirectiveLookupName(name: string): string {\n  return normalizeDirectiveName(name.trim()).toLowerCase();\n}\n\nfunction dedupStrings(items: string[]): string[] {\n  const seen = new Set<string>();\n  const result: string[] = [];\n  for (const item of items) {\n    if (seen.has(item)) continue;\n    seen.add(item);\n    result.push(item);\n  }\n  return result;\n}\n\nfunction sanitizeDirectiveCaseValue(value: string): string {\n  const trimmed = value.trim();\n  if (!trimmed) return trimmed;\n  return normalizeDirectiveName(trimmed);\n}\n\nfunction parseDirectiveCaseMapValue(value: unknown): Map<string, string> {\n  const out = new Map<string, string>();\n\n  if (!value) return out;\n\n  if (typeof value === \"string\") {\n    const trimmed = value.trim();\n    if (!trimmed) return out;\n    try {\n      const parsed = JSON.parse(trimmed) as unknown;\n      return parseDirectiveCaseMapValue(parsed);\n    } catch {\n      return out;\n    }\n  }\n\n  if (typeof value !== \"object\") return out;\n\n  for (const [rawKey, rawValue] of Object.entries(value as Record<string, unknown>)) {\n    if (typeof rawValue !== \"string\") continue;\n    const key = normalizeDirectiveName(rawKey).toLowerCase();\n    const directiveName = sanitizeDirectiveCaseValue(rawValue);\n    if (!key || !directiveName) continue;\n    out.set(key, directiveName);\n  }\n\n  return out;\n}\n\nfunction parseLowercaseStringArray(value: unknown): string[] {\n  if (!Array.isArray(value)) {\n    return [];\n  }\n\n  const normalized = value\n    .filter((item): item is string => typeof item === \"string\")\n    .flatMap((item) => item.split(/[,\\s]+/u).map((token) => token.trim().toLowerCase()))\n    .filter(Boolean);\n\n  return dedupStrings(normalized);\n}\n\nfunction expandBladeComponentPrefixToken(token: string): string[] {\n  if (token.endsWith(\"-\") || token.endsWith(\":\")) {\n    return [token];\n  }\n\n  // Bare logical prefix (`x`) expands to both supported component tag forms.\n  if (/^[a-z0-9_]+$/u.test(token)) {\n    return [`${token}-`, `${token}:`];\n  }\n\n  return [token];\n}\n\nfunction normalizeBladeComponentPrefixes(tokens: string[]): string[] {\n  return dedupStrings(tokens.flatMap(expandBladeComponentPrefixToken));\n}\n\nfunction getDirectiveCaseMap(options: Options): Map<string, string> {\n  const key = options as unknown as object;\n  const cached = directiveCaseMapCache.get(key);\n  if (cached) return cached;\n\n  const parsed = parseDirectiveCaseMapValue(\n    (options as Record<string, unknown>).bladeDirectiveCaseMap,\n  );\n  directiveCaseMapCache.set(key, parsed);\n  return parsed;\n}\n\nexport function getDirectiveCaseMode(options: Options): DirectiveCaseMode {\n  const value = (options as Record<string, unknown>).bladeDirectiveCase;\n  return value === \"canonical\" || value === \"lower\" ? value : \"preserve\";\n}\n\nexport function getDirectiveArgSpacingMode(options: Options): DirectiveArgSpacingMode {\n  const value = (options as Record<string, unknown>).bladeDirectiveArgSpacing;\n  if (value === \"preserve\" || value === \"none\" || value === \"space\") {\n    return value;\n  }\n  return \"space\";\n}\n\nfunction parseDirectiveArgSpacingRule(value: unknown): DirectiveArgSpacingRule | null {\n  if (typeof value !== \"string\") {\n    return null;\n  }\n\n  const normalized = value.trim().toLowerCase();\n  if (/^\\d+$/u.test(normalized)) {\n    return Number.parseInt(normalized, 10);\n  }\n  if (normalized === \"preserve\" || normalized === \"none\" || normalized === \"space\") {\n    return normalized;\n  }\n\n  return null;\n}\n\nfunction parseDirectiveArgSpacingOverrideToken(\n  token: string,\n): [string, DirectiveArgSpacingRule] | null {\n  const trimmed = token.trim();\n  if (!trimmed) return null;\n\n  const separatorIndex = trimmed.indexOf(\"=\");\n  if (separatorIndex === -1) {\n    const key = normalizeDirectiveLookupName(trimmed);\n    return key ? [key, \"space\"] : null;\n  }\n\n  const key = normalizeDirectiveLookupName(trimmed.slice(0, separatorIndex));\n  const rule = parseDirectiveArgSpacingRule(trimmed.slice(separatorIndex + 1));\n  if (!key || rule === null) return null;\n  return [key, rule];\n}\n\nfunction parseDirectiveArgSpacingOverridesValue(\n  value: unknown,\n): Map<string, DirectiveArgSpacingRule> {\n  const out = new Map<string, DirectiveArgSpacingRule>();\n\n  if (!Array.isArray(value)) {\n    return out;\n  }\n\n  for (const item of value) {\n    if (typeof item !== \"string\") continue;\n    const parsed = parseDirectiveArgSpacingOverrideToken(item);\n    if (!parsed) continue;\n    const [key, rule] = parsed;\n    out.set(key, rule);\n  }\n\n  return out;\n}\n\nexport function getDirectiveArgSpacingOverrides(\n  options: Options,\n): Map<string, DirectiveArgSpacingRule> {\n  const key = options as unknown as object;\n  const cached = directiveArgSpacingOverridesCache.get(key);\n  if (cached) return cached;\n\n  const rawValue = (options as Record<string, unknown>).bladeDirectiveArgSpacingOverrides;\n  const result =\n    rawValue === undefined || rawValue === null\n      ? parseDirectiveArgSpacingOverridesValue(DEFAULT_DIRECTIVE_ARG_SPACING_OVERRIDE_TOKENS)\n      : parseDirectiveArgSpacingOverridesValue(rawValue);\n\n  directiveArgSpacingOverridesCache.set(key, result);\n  return result;\n}\n\nexport function getDirectiveArgSpacingText(\n  authoredSpacing: string,\n  rule: DirectiveArgSpacingRule,\n): string {\n  if (rule === \"preserve\") {\n    return authoredSpacing;\n  }\n\n  if (rule === \"none\") {\n    return \"\";\n  }\n\n  if (rule === \"space\") {\n    return \" \";\n  }\n\n  return \" \".repeat(rule);\n}\n\nexport function resolveDirectiveArgSpacingRule(\n  directiveName: string,\n  options: Options,\n  inBladeComponentAttribute = false,\n): DirectiveArgSpacingRule {\n  if (inBladeComponentAttribute) {\n    return 0;\n  }\n\n  const normalized = normalizeDirectiveLookupName(directiveName);\n  if (normalized) {\n    const override = getDirectiveArgSpacingOverrides(options).get(normalized);\n    if (override !== undefined) {\n      return override;\n    }\n  }\n\n  return getDirectiveArgSpacingMode(options);\n}\n\nexport function getDirectiveBlockStyle(options: Options): DirectiveBlockStyle {\n  const value = (options as Record<string, unknown>).bladeDirectiveBlockStyle;\n  if (value === \"inline-if-short\" || value === \"multiline\") return value;\n  return \"preserve\";\n}\n\nexport function getBladeBlankLinesMode(options: Options): BladeBlankLinesMode {\n  const value = (options as Record<string, unknown>).bladeBlankLinesAroundDirectives;\n  if (value === \"always\") return value;\n  return \"preserve\";\n}\n\nexport function getEchoSpacingMode(options: Options): EchoSpacingMode {\n  const value = (options as Record<string, unknown>).bladeEchoSpacing;\n  if (value === \"space\" || value === \"tight\") return value;\n  return \"preserve\";\n}\n\nexport function getSlotClosingTagMode(options: Options): SlotClosingTagMode {\n  const value = (options as Record<string, unknown>).bladeSlotClosingTag;\n  if (value === \"preserve\") return \"preserve\";\n  return \"canonical\";\n}\n\nexport function getVoidElementSlashMode(options: Options): VoidElementSlashMode {\n  const value = (options as Record<string, unknown>).bladeVoidElementSlash;\n  if (value === \"never\" || value === \"preserve\") return value;\n  return \"always\";\n}\n\nexport function shouldInsertOptionalClosingTags(options: Options): boolean {\n  const value = (options as Record<string, unknown>).bladeInsertOptionalClosingTags;\n  return value === true;\n}\n\nexport function shouldKeepHeadAndBodyAtRoot(options: Options): boolean {\n  const value = (options as Record<string, unknown>).bladeKeepHeadAndBodyAtRoot;\n  return value === true;\n}\n\nexport function getInlineIntentElements(options: Options): Set<string> {\n  const key = options as unknown as object;\n  const cached = inlineIntentElementsCache.get(key);\n  if (cached) return cached;\n\n  const rawValue = (options as Record<string, unknown>).bladeInlineIntentElements;\n  const parsed = parseLowercaseStringArray(rawValue);\n  const values =\n    rawValue === undefined || rawValue === null ? [...DEFAULT_INLINE_INTENT_ELEMENTS] : parsed;\n\n  const result = new Set(values);\n  inlineIntentElementsCache.set(key, result);\n  return result;\n}\n\nexport function shouldPreserveInlineIntentElement(\n  options: Options,\n  tagName: string,\n  namespace = \"\",\n): boolean {\n  const normalizedTagName = tagName.toLowerCase();\n  const normalizedNamespace = namespace.toLowerCase();\n  const set = getInlineIntentElements(options);\n  if (set.has(normalizedTagName)) {\n    return true;\n  }\n  if (normalizedNamespace) {\n    return set.has(`${normalizedNamespace}:${normalizedTagName}`);\n  }\n  return false;\n}\n\nexport function shouldPreserveInlineIntentAttributes(\n  options: Options,\n  tagName: string,\n  namespace = \"\",\n): boolean {\n  if (shouldPreserveInlineIntentElement(options, tagName, namespace)) {\n    return true;\n  }\n\n  const normalizedTagName = tagName.toLowerCase();\n  const normalizedNamespace = namespace.toLowerCase();\n  if (!normalizedNamespace) {\n    return false;\n  }\n\n  if (normalizedNamespace === \"svg\" && normalizedTagName === \"foreignobject\") {\n    return false;\n  }\n\n  return shouldPreserveInlineIntentNamespace(options, normalizedNamespace);\n}\n\nexport function shouldPreserveInlineIntentNamespace(options: Options, namespace: string): boolean {\n  const normalizedNamespace = namespace.toLowerCase();\n  return getInlineIntentElements(options).has(`${normalizedNamespace}:*`);\n}\n\nexport function getBladeComponentPrefixes(options: Options): string[] {\n  const key = options as unknown as object;\n  const cached = bladeComponentPrefixesCache.get(key);\n  if (cached) return cached;\n\n  const rawValue = (options as Record<string, unknown>).bladeComponentPrefixes;\n  const parsed = parseLowercaseStringArray(rawValue);\n  const values = normalizeBladeComponentPrefixes(\n    rawValue === undefined || rawValue === null ? [...DEFAULT_BLADE_COMPONENT_PREFIXES] : parsed,\n  );\n\n  bladeComponentPrefixesCache.set(key, values);\n  return values;\n}\n\nexport function isBladeComponentTagName(fullName: string, options: Options): boolean {\n  const normalized = fullName.trim().toLowerCase();\n  if (!normalized) return false;\n  return getBladeComponentPrefixes(options).some((prefix) => normalized.startsWith(prefix));\n}\n\nexport function formatDirectiveNameToken(rawDirectiveToken: string, options: Options): string {\n  if (!rawDirectiveToken.startsWith(\"@\")) {\n    return rawDirectiveToken;\n  }\n\n  const name = rawDirectiveToken.slice(1);\n  const lowerName = name.toLowerCase();\n  const mode = getDirectiveCaseMode(options);\n\n  if (mode === \"preserve\") {\n    return rawDirectiveToken;\n  }\n\n  if (mode === \"lower\") {\n    return `@${lowerName}`;\n  }\n\n  const map = getDirectiveCaseMap(options);\n  const mapped = map.get(lowerName);\n  if (mapped) {\n    return `@${mapped}`;\n  }\n\n  const canonical = getCanonicalDirectiveName(name);\n  if (!canonical) {\n    return rawDirectiveToken;\n  }\n\n  return `@${canonical}`;\n}\n","import type { AstPath, Doc, Options } from \"prettier\";\r\nimport { doc } from \"prettier\";\r\nimport type { WrappedNode } from \"../types.js\";\r\nimport { NodeKind } from \"../tree/types.js\";\r\nimport { TokenType } from \"../lexer/types.js\";\r\nimport { HTML_TAGS } from \"../html-data.js\";\r\nimport { VOID_ELEMENTS } from \"../tree/void-elements.js\";\r\nimport {\r\n  getEchoSpacingMode,\r\n  getSlotClosingTagMode,\r\n  getVoidElementSlashMode,\r\n  shouldInsertOptionalClosingTags,\r\n  shouldPreserveInlineIntentAttributes,\r\n  shouldPreserveInlineIntentElement,\r\n  shouldPreserveInlineIntentNamespace,\r\n} from \"./blade-options.js\";\r\nimport { formatAttributeNameForPrint } from \"./attribute-name.js\";\r\nimport { isTextLikeNode, isVueSfcBlock } from \"../node-predicates.js\";\r\nimport {\r\n  isPreLikeNode,\r\n  getLastDescendant,\r\n  hasPrettierIgnore,\r\n  shouldPreserveContent,\r\n  getAttributeNameRaw,\r\n  getStaticAttributeNameLower,\r\n  isStaticAttributeName,\r\n  getAttributeValueKind,\r\n  getAttributeValueQuote,\r\n  getAttributeRawValue,\r\n  unescapeQuoteEntities,\r\n  normalizeAttributeName,\r\n  isIeConditionalStartComment,\r\n} from \"./utils.js\";\r\nimport { getDoctypeStartMarker } from \"./doctype-utils.js\";\r\nimport { replaceEndOfLine } from \"./doc-utils.js\";\r\nimport { hasSwallowedTagSyntaxInOpeningSource } from \"../malformed-tags.js\";\r\n\r\nconst { indent, line, softline, hardline, join } = doc.builders;\r\n\r\nconst unpairedClosingTagIndexCache = new WeakMap<WrappedNode, Map<string, number[]>>();\r\n\r\nfunction canBorrowParentTagMarkers(node: WrappedNode): boolean {\r\n  return (\r\n    (node.kind === NodeKind.Element && !isMalformedOpeningRecoveryElement(node)) ||\r\n    node.kind === NodeKind.ConditionalComment\r\n  );\r\n}\r\n\r\nfunction isMalformedOpeningRecoveryElement(node: WrappedNode): boolean {\r\n  if (node.kind !== NodeKind.Element || node.hasClosingTag || node.isSelfClosing) {\r\n    return false;\r\n  }\r\n\r\n  if (node.openTagEndOffset <= node.start) {\r\n    return true;\r\n  }\r\n\r\n  const openingSource = node.source.slice(node.start + 1, node.openTagEndOffset);\r\n  return hasSwallowedTagSyntaxInOpeningSource(openingSource);\r\n}\r\n\r\n/**\r\n * Get the display tag name for marker output.\r\n * Matches Prettier's `node.rawName` after postprocess normalization:\r\n * - SVG namespace: preserve original case (e.g. `linearGradient`)\r\n * - Known HTML tags: lowercase (browsers normalize HTML tags to lowercase)\r\n * - Unknown tags (custom elements): preserve original case\r\n */\r\nfunction getDisplayTagName(node: WrappedNode): string {\r\n  const trimMalformedEofName = (name: string): string =>\r\n    shouldTrimMalformedEofTagName(node) ? name.replace(/\\s+$/u, \"\") : name;\r\n\r\n  if (node.namespace === \"svg\") {\r\n    return trimMalformedEofName(node.rawTagName);\r\n  }\r\n  if (node.kind === NodeKind.Element && node.flat.genericOffset > 0) {\r\n    return trimMalformedEofName(node.rawTagName);\r\n  }\r\n  // Match Prettier's normalizeName: lowercase if the FULL name (with namespace\r\n  // prefix) is a known HTML tag. \"html:div\" is NOT known -> preserves case.\r\n  // \"div\" IS known -> lowercased.\r\n  // Reference: prettier-main/src/language-html/parse/postprocess.js normalizeName\r\n  const fullLower = node.rawTagName.toLowerCase();\r\n  if (HTML_TAGS.has(fullLower)) {\r\n    return trimMalformedEofName(fullLower);\r\n  }\r\n  return trimMalformedEofName(node.rawTagName);\r\n}\r\n\r\nfunction shouldTrimMalformedEofTagName(node: WrappedNode): boolean {\r\n  return (\r\n    node.kind === NodeKind.Element &&\r\n    node.end === node.source.length &&\r\n    node.openTagEndOffset <= node.start &&\r\n    !node.hasClosingTag\r\n  );\r\n}\r\n\r\nfunction getElementGenericSuffix(node: WrappedNode): string {\r\n  if (node.kind !== NodeKind.Element) return \"\";\r\n\r\n  const tokens = node.buildResult.tokens;\r\n  const tokenStart = node.flat.tokenStart;\r\n  const tokenEnd = tokenStart + node.flat.tokenCount;\r\n\r\n  for (let i = tokenStart + 1; i < tokenEnd; i++) {\r\n    const token = tokens[i];\r\n    if (token.type === TokenType.TsxGenericType) {\r\n      return node.buildResult.source.slice(token.start, token.end);\r\n    }\r\n    if (\r\n      token.type === TokenType.Whitespace ||\r\n      token.type === TokenType.GreaterThan ||\r\n      token.type === TokenType.Slash ||\r\n      token.type === TokenType.SyntheticClose\r\n    ) {\r\n      break;\r\n    }\r\n  }\r\n\r\n  return \"\";\r\n}\r\n\r\nfunction isStandardHtmlVoidElement(node: WrappedNode): boolean {\r\n  return node.kind === NodeKind.Element && VOID_ELEMENTS.has(node.fullName.toLowerCase());\r\n}\r\n\r\nfunction hasAuthoredSelfClosingSlash(node: WrappedNode): boolean {\r\n  return node.kind === NodeKind.Element && node.flat.data === 1;\r\n}\r\n\r\nfunction shouldPrintSelfClosingSlash(node: WrappedNode, options?: Options): boolean {\r\n  if (node.kind !== NodeKind.Element || !node.isSelfClosing) {\r\n    return false;\r\n  }\r\n\r\n  if (!isStandardHtmlVoidElement(node)) {\r\n    return true;\r\n  }\r\n\r\n  switch (options ? getVoidElementSlashMode(options) : \"always\") {\r\n    case \"never\":\r\n      return false;\r\n    case \"preserve\":\r\n      return hasAuthoredSelfClosingSlash(node);\r\n    case \"always\":\r\n      return true;\r\n  }\r\n}\r\n\r\nfunction isDynamicTagNameText(name: string): boolean {\r\n  return name.includes(\"{{\") || name.includes(\"{!!\") || name.includes(\"<?\") || name.includes(\"@\");\r\n}\r\n\r\nfunction hasShorthandSlotClosingTag(node: WrappedNode): boolean {\r\n  if (!node.rawClosingTagName) return false;\r\n  const openTagName = node.rawTagName.toLowerCase();\r\n  if (!openTagName.startsWith(\"x-slot:\") && !openTagName.startsWith(\"x-slot[\")) {\r\n    return false;\r\n  }\r\n  return node.rawClosingTagName.toLowerCase() === \"x-slot\";\r\n}\r\n\r\nfunction getDisplayClosingTagName(node: WrappedNode, options?: Options): string {\r\n  if (\r\n    options &&\r\n    getSlotClosingTagMode(options) === \"preserve\" &&\r\n    hasShorthandSlotClosingTag(node)\r\n  ) {\r\n    return node.rawClosingTagName;\r\n  }\r\n\r\n  if (\r\n    node.rawClosingTagName &&\r\n    (isDynamicTagNameText(node.rawTagName) || isDynamicTagNameText(node.rawClosingTagName))\r\n  ) {\r\n    return node.rawClosingTagName;\r\n  }\r\n  return getDisplayTagName(node);\r\n}\r\n\r\nfunction isBorrowableMarkerNode(node: WrappedNode): boolean {\r\n  if (isMalformedOpeningRecoveryElement(node)) {\r\n    return false;\r\n  }\r\n\r\n  return (\r\n    node.kind === NodeKind.Element ||\r\n    node.kind === NodeKind.ConditionalComment ||\r\n    node.kind === NodeKind.Comment ||\r\n    node.kind === NodeKind.BogusComment\r\n  );\r\n}\r\n\r\nfunction canBorrowPrevClosingTagEndMarker(node: WrappedNode): boolean {\r\n  return (\r\n    node.kind === NodeKind.Element ||\r\n    node.kind === NodeKind.ConditionalComment ||\r\n    node.kind === NodeKind.Text ||\r\n    node.kind === NodeKind.Comment ||\r\n    node.kind === NodeKind.BogusComment ||\r\n    node.kind === NodeKind.Echo ||\r\n    node.kind === NodeKind.RawEcho ||\r\n    node.kind === NodeKind.TripleEcho ||\r\n    node.kind === NodeKind.Doctype ||\r\n    node.kind === NodeKind.Cdata ||\r\n    node.kind === NodeKind.Decl ||\r\n    node.kind === NodeKind.ProcessingInstruction\r\n  );\r\n}\r\n\r\nfunction getRoot(node: WrappedNode): WrappedNode {\r\n  let current = node;\r\n  while (current.parent) {\r\n    current = current.parent;\r\n  }\r\n  return current;\r\n}\r\n\r\nfunction getUnpairedClosingTagName(node: WrappedNode): string | null {\r\n  if (node.kind !== NodeKind.UnpairedClosingTag) return null;\r\n  const raw = node.source.slice(node.start, node.end).trim();\r\n  const match = raw.match(/^<\\s*\\/\\s*([^\\s>/]+)\\s*>?$/);\r\n  return match?.[1]?.toLowerCase() ?? null;\r\n}\r\n\r\nfunction buildUnpairedClosingTagIndex(root: WrappedNode): Map<string, number[]> {\r\n  const index = new Map<string, number[]>();\r\n  const stack: WrappedNode[] = [root];\r\n\r\n  while (stack.length > 0) {\r\n    const node = stack.pop()!;\r\n\r\n    const name = getUnpairedClosingTagName(node);\r\n    if (name) {\r\n      const list = index.get(name);\r\n      if (list) {\r\n        list.push(node.start);\r\n      } else {\r\n        index.set(name, [node.start]);\r\n      }\r\n    }\r\n\r\n    for (let i = node.children.length - 1; i >= 0; i--) {\r\n      stack.push(node.children[i]);\r\n    }\r\n  }\r\n\r\n  for (const positions of index.values()) {\r\n    positions.sort((a, b) => a - b);\r\n  }\r\n\r\n  return index;\r\n}\r\n\r\nfunction getUnpairedClosingTagIndex(root: WrappedNode): Map<string, number[]> {\r\n  const cached = unpairedClosingTagIndexCache.get(root);\r\n  if (cached) return cached;\r\n\r\n  const built = buildUnpairedClosingTagIndex(root);\r\n  unpairedClosingTagIndexCache.set(root, built);\r\n  return built;\r\n}\r\n\r\nfunction hasFutureMatchingUnpairedClosingTag(node: WrappedNode): boolean {\r\n  if (node.kind !== NodeKind.Element) return false;\r\n  if (!node.tagName) return false;\r\n\r\n  const root = getRoot(node);\r\n  const index = getUnpairedClosingTagIndex(root);\r\n  const openTagName = node.tagName.toLowerCase();\r\n  const candidateClosingNames = new Set<string>([openTagName]);\r\n\r\n  // Blade slot shorthand: </x-slot> can close <x-slot:foo> / <x-slot[foo]>.\r\n  if (openTagName.startsWith(\"x-slot:\") || openTagName.startsWith(\"x-slot[\")) {\r\n    candidateClosingNames.add(\"x-slot\");\r\n  }\r\n\r\n  for (const candidate of candidateClosingNames) {\r\n    const positions = index.get(candidate) ?? [];\r\n    let lo = 0;\r\n    let hi = positions.length - 1;\r\n    while (lo <= hi) {\r\n      const mid = (lo + hi) >> 1;\r\n      if (positions[mid] <= node.end) {\r\n        lo = mid + 1;\r\n      } else {\r\n        return true;\r\n      }\r\n    }\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\n/**\r\n * Should the next node borrow the previous closing tag's end marker (`>`)?\r\n * e.g. `<p></p\\n>123` - the `>` is printed with the text node.\r\n */\r\nexport function needsToBorrowPrevClosingTagEndMarker(node: WrappedNode): boolean {\r\n  return (\r\n    canBorrowPrevClosingTagEndMarker(node) &&\r\n    !!node.prev &&\r\n    isBorrowableMarkerNode(node.prev) &&\r\n    node.prev.kind !== NodeKind.Doctype &&\r\n    node.kind !== NodeKind.DirectiveBlock &&\r\n    !isTextLikeNode(node.prev) &&\r\n    node.isLeadingSpaceSensitive &&\r\n    !node.hasLeadingSpaces\r\n  );\r\n}\r\n\r\n/**\r\n * Should the parent borrow its last child's closing tag end marker?\r\n * e.g. `<p><a></a\\n></p\\n>` - the inner `>` is printed with closing `</p`.\r\n */\r\nexport function needsToBorrowLastChildClosingTagEndMarker(node: WrappedNode): boolean {\r\n  if (!canBorrowParentTagMarkers(node)) {\r\n    return false;\r\n  }\r\n\r\n  const last = node.children[node.children.length - 1];\r\n  return (\r\n    !!last &&\r\n    isBorrowableMarkerNode(last) &&\r\n    last.isTrailingSpaceSensitive &&\r\n    !last.hasTrailingSpaces &&\r\n    !isTextLikeNode(getLastDescendant(last)) &&\r\n    !isPreLikeNode(node)\r\n  );\r\n}\r\n\r\n/**\r\n * Should this node borrow the parent's closing tag start marker (`</tag`)?\r\n * e.g. `<p>123</p>` - the `</p` is printed on the same line as `123`.\r\n */\r\nexport function needsToBorrowParentClosingTagStartMarker(node: WrappedNode): boolean {\r\n  return (\r\n    !isMalformedOpeningRecoveryElement(node) &&\r\n    !node.next &&\r\n    !node.hasTrailingSpaces &&\r\n    node.isTrailingSpaceSensitive &&\r\n    isTextLikeNode(getLastDescendant(node))\r\n  );\r\n}\r\n\r\n/**\r\n * Should this text node borrow the next opening tag's start marker (`<tag`)?\r\n * e.g. `123<p>` - the `<p` is printed on the same line as `123`.\r\n */\r\nexport function needsToBorrowNextOpeningTagStartMarker(node: WrappedNode): boolean {\r\n  return (\r\n    !!node.next &&\r\n    isBorrowableMarkerNode(node.next) &&\r\n    !isTextLikeNode(node.next) &&\r\n    isTextLikeNode(node) &&\r\n    node.isTrailingSpaceSensitive &&\r\n    !node.hasTrailingSpaces\r\n  );\r\n}\r\n\r\n/**\r\n * Should this node borrow the parent's opening tag end marker (`>`)?\r\n * e.g. `<p\\n>123` - the `>` is printed with `123`.\r\n */\r\nexport function needsToBorrowParentOpeningTagEndMarker(node: WrappedNode): boolean {\r\n  // Only nodes that print `printOpeningTagPrefix(...)` can safely borrow\r\n  // the parent's opening `>` marker.\r\n  const canBorrow =\r\n    node.kind === NodeKind.Text ||\r\n    node.kind === NodeKind.Comment ||\r\n    node.kind === NodeKind.BogusComment ||\r\n    node.kind === NodeKind.Echo ||\r\n    node.kind === NodeKind.RawEcho ||\r\n    node.kind === NodeKind.TripleEcho ||\r\n    node.kind === NodeKind.Doctype ||\r\n    node.kind === NodeKind.Cdata ||\r\n    node.kind === NodeKind.Decl ||\r\n    node.kind === NodeKind.ProcessingInstruction ||\r\n    node.kind === NodeKind.Element ||\r\n    node.kind === NodeKind.ConditionalComment;\r\n\r\n  // Dotted component names (e.g. <x:editor.button>) are prone to\r\n  // one-pass marker drift when their first child borrows the opening `>`.\r\n  // Keep the parent's `>` attached to the opening tag for stable output.\r\n  if (node.parent?.kind === NodeKind.Element && node.parent.rawTagName.includes(\".\")) {\r\n    return false;\r\n  }\r\n\r\n  return canBorrow && !node.prev && node.isLeadingSpaceSensitive && !node.hasLeadingSpaces;\r\n}\r\n\r\nfunction shouldNotPrintClosingTag(node: WrappedNode, options: Options): boolean {\r\n  if (\r\n    node.kind === NodeKind.Element &&\r\n    !node.isSelfClosing &&\r\n    !node.hasClosingTag &&\r\n    !shouldInsertOptionalClosingTags(options)\r\n  ) {\r\n    return true;\r\n  }\r\n\r\n  const hasClosingTagLikeTextInBody =\r\n    node.kind === NodeKind.Element &&\r\n    !node.isSelfClosing &&\r\n    !node.hasClosingTag &&\r\n    node.rawTagName.length > 0 &&\r\n    node.openTagEndOffset > 0 &&\r\n    node.source\r\n      .slice(node.openTagEndOffset, node.end)\r\n      .toLowerCase()\r\n      .includes(`</${node.rawTagName.toLowerCase()}`);\r\n\r\n  if (\r\n    node.kind === NodeKind.Element &&\r\n    !node.isSelfClosing &&\r\n    !node.hasClosingTag &&\r\n    hasFutureMatchingUnpairedClosingTag(node)\r\n  ) {\r\n    return true;\r\n  }\r\n\r\n  const hasUnpairedClosingChild =\r\n    node.kind === NodeKind.Element &&\r\n    node.children.some((child) => child.kind === NodeKind.UnpairedClosingTag);\r\n\r\n  return (\r\n    !node.isSelfClosing &&\r\n    !node.hasClosingTag &&\r\n    (hasClosingTagLikeTextInBody ||\r\n      hasPrettierIgnore(node) ||\r\n      shouldPreserveContent(node.parent!, options) ||\r\n      hasUnpairedClosingChild)\r\n  );\r\n}\r\n\r\nexport function printOpeningTagStartMarker(node: WrappedNode, options?: Options): string {\r\n  switch (node.kind) {\r\n    case NodeKind.ConditionalComment:\r\n      return `<!--[if ${node.condition}`;\r\n    case NodeKind.Comment:\r\n      if (isIeConditionalStartComment(node)) {\r\n        return `<!--[if ${node.ieConditionalStartCondition}`;\r\n      }\r\n      return \"<!--\";\r\n    case NodeKind.BogusComment:\r\n      return \"<!--\";\r\n    case NodeKind.Echo:\r\n      return \"{{\";\r\n    case NodeKind.RawEcho:\r\n      return \"{!!\";\r\n    case NodeKind.TripleEcho:\r\n      return \"{{{\";\r\n    case NodeKind.Doctype:\r\n      return getDoctypeStartMarker(node.rawText, options);\r\n    case NodeKind.Element:\r\n      if (node.condition) {\r\n        return `<!--[if ${node.condition}]><!--><${getDisplayTagName(node)}${getElementGenericSuffix(node)}`;\r\n      }\r\n      return `<${getDisplayTagName(node)}${getElementGenericSuffix(node)}`;\r\n    default:\r\n      return `<${getDisplayTagName(node)}`;\r\n  }\r\n}\r\n\r\nexport function printOpeningTagEndMarker(node: WrappedNode, options?: Options): string {\r\n  switch (node.kind) {\r\n    case NodeKind.ConditionalComment:\r\n      return node.conditionalStartIsRevealed ? \"]><!-->\" : \"]>\";\r\n    case NodeKind.Element:\r\n      // Recovery mode: do not invent a missing \">\" for malformed start tags.\r\n      // This keeps malformed EOF inputs stable across passes.\r\n      const hasFutureMatchingCloser = hasFutureMatchingUnpairedClosingTag(node);\r\n      if (\r\n        node.openTagEndOffset <= node.start &&\r\n        !node.hasClosingTag &&\r\n        !(options && shouldInsertOptionalClosingTags(options)) &&\r\n        !hasFutureMatchingCloser\r\n      ) {\r\n        return \"\";\r\n      }\r\n      if (node.condition) {\r\n        return \"><!--<![endif]-->\";\r\n      }\r\n      return \">\";\r\n    default:\r\n      return \">\";\r\n  }\r\n}\r\n\r\nexport function printClosingTagStartMarker(node: WrappedNode, options?: Options): string {\r\n  if (options && shouldNotPrintClosingTag(node, options)) {\r\n    return \"\";\r\n  }\r\n  switch (node.kind) {\r\n    case NodeKind.ConditionalComment:\r\n      return node.conditionalEndIsHidden ? \"<!--<!\" : \"<!\";\r\n    case NodeKind.Element:\r\n      if (node.hasHtmComponentClosingTag) {\r\n        return \"<//\";\r\n      }\r\n      return `</${getDisplayClosingTagName(node, options)}`;\r\n    default:\r\n      return `</${getDisplayTagName(node)}`;\r\n  }\r\n}\r\n\r\nexport function printClosingTagEndMarker(node: WrappedNode, options?: Options): string {\r\n  if (options && shouldNotPrintClosingTag(node, options)) {\r\n    return \"\";\r\n  }\r\n  switch (node.kind) {\r\n    case NodeKind.ConditionalComment:\r\n      return \"[endif]-->\";\r\n    case NodeKind.Comment:\r\n      return isIeConditionalStartComment(node) ? \"]><!-->\" : \">\";\r\n    case NodeKind.Echo:\r\n      return \"}}\";\r\n    case NodeKind.RawEcho:\r\n      return \"!!}\";\r\n    case NodeKind.TripleEcho:\r\n      return \"}}}\";\r\n    case NodeKind.Element:\r\n      if (shouldPrintSelfClosingSlash(node, options)) {\r\n        return \"/>\";\r\n      }\r\n      return \">\";\r\n    default:\r\n      return \">\";\r\n  }\r\n}\r\n\r\n/**\r\n * Prefix for the opening tag: borrows parent's `>` or prev's `>`.\r\n * Used by text/comment nodes to glue their start to a preceding marker.\r\n */\r\nexport function printOpeningTagPrefix(node: WrappedNode, options?: Options): Doc {\r\n  return needsToBorrowParentOpeningTagEndMarker(node)\r\n    ? node.parent && canBorrowParentTagMarkers(node.parent)\r\n      ? printOpeningTagEndMarker(node.parent, options)\r\n      : \"\"\r\n    : needsToBorrowPrevClosingTagEndMarker(node)\r\n      ? printClosingTagEndMarker(node.prev!, options)\r\n      : \"\";\r\n}\r\n\r\n/**\r\n * Opening tag start: prefix + `<tagname`.\r\n * Suppressed if the previous node borrows this node's `<tagname`.\r\n */\r\nexport function printOpeningTagStart(node: WrappedNode, options?: Options): Doc {\r\n  return node.prev && needsToBorrowNextOpeningTagStartMarker(node.prev)\r\n    ? \"\"\r\n    : [printOpeningTagPrefix(node, options), printOpeningTagStartMarker(node, options)];\r\n}\r\n\r\n/**\r\n * Opening tag end: `>`.\r\n * Suppressed if the first child borrows the parent's `>`.\r\n */\r\nfunction printOpeningTagEnd(node: WrappedNode, options?: Options): Doc {\r\n  const firstChild = node.children[0];\r\n  return firstChild && needsToBorrowParentOpeningTagEndMarker(firstChild)\r\n    ? \"\"\r\n    : printOpeningTagEndMarker(node, options);\r\n}\r\n\r\n/**\r\n * Suffix for the closing tag: borrows parent's `</tag` or next's `<tag`.\r\n * Used by text/comment nodes to glue their end to a following marker.\r\n */\r\nexport function printClosingTagSuffix(node: WrappedNode, options?: Options): Doc {\r\n  if (needsToBorrowParentClosingTagStartMarker(node)) {\r\n    if (\r\n      node.parent &&\r\n      canBorrowParentTagMarkers(node.parent) &&\r\n      canBorrowParentClosingMarkerStart(node.parent, options)\r\n    ) {\r\n      return printClosingTagStartMarker(node.parent, options);\r\n    }\r\n    return \"\";\r\n  }\r\n\r\n  return needsToBorrowNextOpeningTagStartMarker(node)\r\n    ? printOpeningTagStartMarker(node.next!, options)\r\n    : \"\";\r\n}\r\n\r\nfunction canBorrowParentClosingMarkerStart(parent: WrappedNode, options?: Options): boolean {\r\n  if (parent.kind !== NodeKind.Element) {\r\n    return true;\r\n  }\r\n\r\n  if (parent.hasClosingTag) {\r\n    return true;\r\n  }\r\n\r\n  return options ? shouldInsertOptionalClosingTags(options) : false;\r\n}\r\n\r\n/**\r\n * Closing tag prefix: borrows last child's `>` if applicable.\r\n */\r\nfunction printClosingTagPrefix(node: WrappedNode, options?: Options): Doc {\r\n  return needsToBorrowLastChildClosingTagEndMarker(node)\r\n    ? printClosingTagEndMarker(node.children[node.children.length - 1], options)\r\n    : \"\";\r\n}\r\n\r\n/**\r\n * Closing tag start: `</tagname`.\r\n * Suppressed if last child borrows the parent's `</tag`.\r\n */\r\nfunction printClosingTagStart(node: WrappedNode, options?: Options): Doc {\r\n  const lastChild = node.children[node.children.length - 1];\r\n  return lastChild && needsToBorrowParentClosingTagStartMarker(lastChild)\r\n    ? \"\"\r\n    : [printClosingTagPrefix(node, options), printClosingTagStartMarker(node, options)];\r\n}\r\n\r\n/**\r\n * Closing tag end: `>` + suffix.\r\n * Suppressed if next sibling or parent borrows the `>`.\r\n */\r\nexport function printClosingTagEnd(node: WrappedNode, options?: Options): Doc {\r\n  return (\r\n    node.next\r\n      ? needsToBorrowPrevClosingTagEndMarker(node.next)\r\n      : needsToBorrowLastChildClosingTagEndMarker(node.parent!)\r\n  )\r\n    ? \"\"\r\n    : [printClosingTagEndMarker(node, options), printClosingTagSuffix(node, options)];\r\n}\r\n\r\nexport function getPrettierIgnoreAttributeCommentData(value: string): boolean | string[] | false {\r\n  const match = value.trim().match(/^prettier-ignore-attribute(?:\\s+(.+))?$/s);\r\n  if (!match) return false;\r\n  if (!match[1]) return true;\r\n  return match[1].split(/\\s+/);\r\n}\r\n\r\nexport function printOpeningTag(\r\n  path: AstPath<WrappedNode>,\r\n  options: Options,\r\n  print: (path: AstPath<WrappedNode>) => Doc,\r\n): Doc {\r\n  const node = path.node;\r\n  return [\r\n    printOpeningTagStart(node, options),\r\n    printAttributes(path, options, print),\r\n    node.isSelfClosing ? \"\" : printOpeningTagEnd(node, options),\r\n  ];\r\n}\r\n\r\nexport function printClosingTag(node: WrappedNode, options: Options): Doc[] {\r\n  return [\r\n    node.isSelfClosing ? \"\" : printClosingTagStart(node, options),\r\n    printClosingTagEnd(node, options),\r\n  ];\r\n}\r\n\r\nfunction printAttributes(\r\n  path: AstPath<WrappedNode>,\r\n  options: Options,\r\n  print: (path: AstPath<WrappedNode>) => Doc,\r\n): Doc {\r\n  const node = path.node;\r\n  const printsSelfClosingSlash = shouldPrintSelfClosingSlash(node, options);\r\n  const bracketSameLine = (options as Record<string, unknown>).bracketSameLine as\r\n    | boolean\r\n    | undefined;\r\n\r\n  if (node.attrs.length === 0) {\r\n    return printsSelfClosingSlash ? \" \" : \"\";\r\n  }\r\n\r\n  const ignoreAttributeData =\r\n    node.prev?.kind === NodeKind.Comment &&\r\n    getPrettierIgnoreAttributeCommentData(\r\n      node.prev.rawText.replace(/^<!--\\s*/, \"\").replace(/\\s*-->$/, \"\"),\r\n    );\r\n\r\n  const hasPrettierIgnoreAttribute =\r\n    typeof ignoreAttributeData === \"boolean\"\r\n      ? () => ignoreAttributeData\r\n      : Array.isArray(ignoreAttributeData)\r\n        ? (attribute: WrappedNode) => {\r\n            if (attribute.kind !== NodeKind.Attribute && attribute.kind !== NodeKind.JsxAttribute) {\r\n              return false;\r\n            }\r\n            const attrName = getAttributeNameRaw(attribute);\r\n            return ignoreAttributeData.includes(attrName);\r\n          }\r\n        : () => false;\r\n\r\n  const printedAttrs = path.map((attrPath) => {\r\n    const attribute = attrPath.node;\r\n    if (hasPrettierIgnoreAttribute(attribute)) {\r\n      return replaceEndOfLine(node.source.slice(attribute.start, attribute.end));\r\n    }\r\n    return print(attrPath);\r\n  }, \"attrs\");\r\n\r\n  // forceNotToBreakAttrContent for <script src>\r\n  const forceNotToBreakAttrContent =\r\n    node.kind === NodeKind.Element &&\r\n    node.fullName.toLowerCase() === \"script\" &&\r\n    node.attrs.length === 1 &&\r\n    getStaticAttributeNameLower(node.attrs[0]) === \"src\" &&\r\n    node.children.length === 0;\r\n\r\n  const forceInlineIntentAttributeLayout = shouldKeepInlineIntentAttributeLayout(node, options);\r\n  const forceMultilineSvgAttributeLayout = shouldForceMultilineSvgAttributeLayout(node, options);\r\n\r\n  const shouldPrintAttributePerLine =\r\n    !forceInlineIntentAttributeLayout &&\r\n    !forceMultilineSvgAttributeLayout &&\r\n    (options as Record<string, unknown>).singleAttributePerLine &&\r\n    node.attrs.length > 1 &&\r\n    !isVueSfcBlock(node, options);\r\n\r\n  const attrLine = shouldPrintAttributePerLine ? hardline : line;\r\n\r\n  const parts: Doc[] = [\r\n    indent([\r\n      forceNotToBreakAttrContent || forceInlineIntentAttributeLayout\r\n        ? \" \"\r\n        : forceMultilineSvgAttributeLayout\r\n          ? hardline\r\n          : line,\r\n      join(\r\n        forceInlineIntentAttributeLayout\r\n          ? \" \"\r\n          : forceMultilineSvgAttributeLayout\r\n            ? hardline\r\n            : attrLine,\r\n        printedAttrs,\r\n      ),\r\n    ]),\r\n  ];\r\n\r\n  // Determine trailing whitespace before the end marker.\r\n  const firstChild = node.children[0];\r\n  const forceFlat =\r\n    (firstChild && needsToBorrowParentOpeningTagEndMarker(firstChild)) ||\r\n    (node.isSelfClosing &&\r\n      node.parent !== null &&\r\n      needsToBorrowLastChildClosingTagEndMarker(node.parent)) ||\r\n    forceInlineIntentAttributeLayout ||\r\n    forceNotToBreakAttrContent;\r\n\r\n  if (forceMultilineSvgAttributeLayout) {\r\n    parts.push(hardline);\r\n  } else if (forceFlat) {\r\n    parts.push(printsSelfClosingSlash ? \" \" : \"\");\r\n  } else if (bracketSameLine) {\r\n    parts.push(printsSelfClosingSlash ? \" \" : \"\");\r\n  } else {\r\n    parts.push(printsSelfClosingSlash ? line : softline);\r\n  }\r\n\r\n  return parts;\r\n}\r\n\r\nfunction shouldKeepInlineIntentAttributeLayout(node: WrappedNode, options: Options): boolean {\r\n  if (node.kind !== NodeKind.Element) return false;\r\n  if (node.attrs.length === 0) return false;\r\n  if (node.openTagEndOffset <= node.start) return false;\r\n\r\n  if (!shouldPreserveInlineIntentAttributes(options, node.tagName, node.namespace)) {\r\n    return false;\r\n  }\r\n\r\n  const openingSource = node.source.slice(node.start, node.openTagEndOffset);\r\n  // Blade echo/directive constructs inside the opening tag can expand into\r\n  // multiline docs after PHP formatting. For these cases, avoid forced inline\r\n  // attribute layout so first-pass and second-pass output converge.\r\n  if (\r\n    openingSource.includes(\"{{\") ||\r\n    openingSource.includes(\"{!!\") ||\r\n    openingSource.includes(\"{{{\")\r\n  ) {\r\n    return false;\r\n  }\r\n  return !/[\\r\\n]/u.test(openingSource);\r\n}\r\n\r\nfunction shouldForceMultilineSvgAttributeLayout(node: WrappedNode, options: Options): boolean {\r\n  if (node.kind !== NodeKind.Element) return false;\r\n  if (node.namespace !== \"svg\") return false;\r\n  if (node.attrs.length === 0) return false;\r\n  return !hasInlineIntentAttributeConfig(node, options);\r\n}\r\n\r\nfunction hasInlineIntentAttributeConfig(node: WrappedNode, options: Options): boolean {\r\n  if (node.kind !== NodeKind.Element) return false;\r\n  return (\r\n    shouldPreserveInlineIntentElement(options, node.tagName, node.namespace) ||\r\n    shouldPreserveInlineIntentNamespace(options, node.namespace)\r\n  );\r\n}\r\n\r\n// Ported from Prettier's utilities/get-preferred-quote.js\r\nfunction getPreferredQuote(value: string, preferred: string): string {\r\n  const alt = preferred === '\"' ? \"'\" : '\"';\r\n  let prefCount = 0;\r\n  let altCount = 0;\r\n  for (const ch of value) {\r\n    if (ch === preferred) prefCount++;\r\n    else if (ch === alt) altCount++;\r\n  }\r\n  return prefCount > altCount ? alt : preferred;\r\n}\r\n\r\ntype AttributeValueTokenRange = {\r\n  start: number;\r\n  end: number;\r\n};\r\n\r\nfunction getAttributeValueTokenRange(node: WrappedNode): AttributeValueTokenRange | null {\r\n  const br = node.buildResult;\r\n  const tokenStart = node.flat.tokenStart;\r\n  const tokenEnd = tokenStart + node.flat.tokenCount;\r\n\r\n  let equalsIndex = -1;\r\n  for (let i = tokenStart; i < tokenEnd; i++) {\r\n    if (br.tokens[i].type === TokenType.Equals) {\r\n      equalsIndex = i;\r\n      break;\r\n    }\r\n  }\r\n\r\n  if (equalsIndex === -1) return null;\r\n\r\n  let valueStart = equalsIndex + 1;\r\n  while (valueStart < tokenEnd && br.tokens[valueStart].type === TokenType.Whitespace) {\r\n    valueStart++;\r\n  }\r\n\r\n  if (valueStart >= tokenEnd) {\r\n    return { start: valueStart, end: valueStart };\r\n  }\r\n\r\n  if (br.tokens[valueStart].type !== TokenType.Quote) {\r\n    return { start: valueStart, end: tokenEnd };\r\n  }\r\n\r\n  let valueEnd = tokenEnd;\r\n  if (valueEnd > valueStart + 1 && br.tokens[valueEnd - 1].type === TokenType.Quote) {\r\n    valueEnd--;\r\n  }\r\n\r\n  return { start: valueStart + 1, end: valueEnd };\r\n}\r\n\r\nfunction getEchoConstructInfo(\r\n  tokenType: TokenType,\r\n): { open: string; close: string; endType: TokenType } | null {\r\n  if (tokenType === TokenType.EchoStart) {\r\n    return { open: \"{{\", close: \"}}\", endType: TokenType.EchoEnd };\r\n  }\r\n  if (tokenType === TokenType.RawEchoStart) {\r\n    return { open: \"{!!\", close: \"!!}\", endType: TokenType.RawEchoEnd };\r\n  }\r\n  if (tokenType === TokenType.TripleEchoStart) {\r\n    return { open: \"{{{\", close: \"}}}\", endType: TokenType.TripleEchoEnd };\r\n  }\r\n  return null;\r\n}\r\n\r\nfunction formatEchoConstruct(\r\n  raw: string,\r\n  open: string,\r\n  close: string,\r\n  spacing: ReturnType<typeof getEchoSpacingMode>,\r\n): string {\r\n  if (spacing === \"preserve\") {\r\n    return raw;\r\n  }\r\n\r\n  if (!raw.startsWith(open) || !raw.endsWith(close)) {\r\n    return raw;\r\n  }\r\n\r\n  const content = raw.slice(open.length, raw.length - close.length);\r\n  const trimmed = content.trim();\r\n\r\n  if (trimmed.length === 0) {\r\n    return spacing === \"tight\" ? `${open}${close}` : `${open} ${close}`;\r\n  }\r\n\r\n  if (trimmed.includes(\"\\n\")) {\r\n    return `${open}\\n${trimmed}\\n${close}`;\r\n  }\r\n\r\n  return spacing === \"tight\" ? `${open}${trimmed}${close}` : `${open} ${trimmed} ${close}`;\r\n}\r\n\r\nfunction formatDynamicAttributeValue(\r\n  node: WrappedNode,\r\n  originalValue: string,\r\n  options: Options,\r\n): string {\r\n  const spacing = getEchoSpacingMode(options);\r\n  if (spacing === \"preserve\") {\r\n    return originalValue;\r\n  }\r\n\r\n  const range = getAttributeValueTokenRange(node);\r\n  if (!range || range.start >= range.end) {\r\n    return originalValue;\r\n  }\r\n\r\n  const br = node.buildResult;\r\n  let output = \"\";\r\n\r\n  for (let i = range.start; i < range.end; i++) {\r\n    const token = br.tokens[i];\r\n    const echoInfo = getEchoConstructInfo(token.type);\r\n\r\n    if (!echoInfo) {\r\n      output += br.source.slice(token.start, token.end);\r\n      continue;\r\n    }\r\n\r\n    const segmentStart = token.start;\r\n    let segmentEnd = token.end;\r\n\r\n    i++;\r\n    while (i < range.end) {\r\n      const current = br.tokens[i];\r\n      segmentEnd = current.end;\r\n      if (current.type === echoInfo.endType) {\r\n        break;\r\n      }\r\n      i++;\r\n    }\r\n\r\n    output += formatEchoConstruct(\r\n      br.source.slice(segmentStart, segmentEnd),\r\n      echoInfo.open,\r\n      echoInfo.close,\r\n      spacing,\r\n    );\r\n  }\r\n\r\n  return output;\r\n}\r\n\r\nexport function printAttribute(node: WrappedNode, options: Options): Doc {\r\n  const br = node.buildResult;\r\n  const tc = node.flat.tokenCount;\r\n\r\n  let isBound = false;\r\n  let isShorthand = false;\r\n  let isEscaped = false;\r\n\r\n  for (let i = 0; i < tc; i++) {\r\n    const t = br.tokens[node.flat.tokenStart + i];\r\n    if (t.type === TokenType.BoundAttribute) isBound = true;\r\n    if (t.type === TokenType.ShorthandAttribute) isShorthand = true;\r\n    if (t.type === TokenType.EscapedAttribute) isEscaped = true;\r\n  }\r\n\r\n  const rawName = formatAttributeNameForPrint(node, options);\r\n  const name =\r\n    isBound || isShorthand || isEscaped || !isStaticAttributeName(node)\r\n      ? rawName\r\n      : normalizeAttributeName(rawName, node.parent);\r\n  const value = getAttributeRawValue(node);\r\n  const valueKind = getAttributeValueKind(node);\r\n\r\n  if (value === null) {\r\n    return name;\r\n  }\r\n\r\n  if (valueKind !== \"static_text\") {\r\n    const formattedDynamicValue = formatDynamicAttributeValue(node, value, options);\r\n    const quote = getAttributeValueQuote(node);\r\n    return quote\r\n      ? [name, \"=\", quote, replaceEndOfLine(formattedDynamicValue), quote]\r\n      : [name, \"=\", replaceEndOfLine(formattedDynamicValue)];\r\n  }\r\n\r\n  // Normalize quotes: unescape entities, choose preferred quote, re-escape.\r\n  const unescaped = unescapeQuoteEntities(value);\r\n  const quote = getPreferredQuote(unescaped, '\"');\r\n  const escaped =\r\n    quote === '\"' ? unescaped.replaceAll('\"', \"&quot;\") : unescaped.replaceAll(\"'\", \"&apos;\");\r\n\r\n  return [name, \"=\", quote, replaceEndOfLine(escaped), quote];\r\n}\r\n","import type { Options } from \"prettier\";\nimport type { WrappedNode } from \"../types.js\";\nimport { NodeKind } from \"../tree/types.js\";\nimport {\n  getAttributeNameParts,\n  getAttributeNameRaw,\n  isStaticAttributeName,\n  type AttributeNamePart,\n} from \"./utils.js\";\nimport {\n  formatDirectiveNameToken,\n  getEchoSpacingMode,\n  getDirectiveArgSpacingText,\n  isBladeComponentTagName,\n  resolveDirectiveArgSpacingRule,\n} from \"./blade-options.js\";\n\nfunction getEchoDelimiters(part: AttributeNamePart): { open: string; close: string } | null {\n  switch (part.kind) {\n    case \"echo\":\n      return { open: \"{{\", close: \"}}\" };\n    case \"raw_echo\":\n      return { open: \"{!!\", close: \"!!}\" };\n    case \"triple_echo\":\n      return { open: \"{{{\", close: \"}}}\" };\n    default:\n      return null;\n  }\n}\n\nfunction formatEchoPart(part: AttributeNamePart, options: Options): string {\n  const spacing = getEchoSpacingMode(options);\n  if (spacing === \"preserve\") return part.text;\n\n  const delimiters = getEchoDelimiters(part);\n  if (!delimiters) return part.text;\n\n  const { open, close } = delimiters;\n  if (!part.text.startsWith(open) || !part.text.endsWith(close)) {\n    return part.text;\n  }\n\n  const content = part.text.slice(open.length, part.text.length - close.length);\n  const trimmed = content.trim();\n\n  if (trimmed.length === 0) {\n    return spacing === \"tight\" ? `${open}${close}` : `${open} ${close}`;\n  }\n\n  if (trimmed.includes(\"\\n\")) {\n    return `${open}\\n${trimmed}\\n${close}`;\n  }\n\n  if (spacing === \"tight\") {\n    return `${open}${trimmed}${close}`;\n  }\n\n  return `${open} ${trimmed} ${close}`;\n}\n\nfunction isComponentAttributeName(node: WrappedNode, options: Options): boolean {\n  return (\n    node.parent?.kind === NodeKind.Element && isBladeComponentTagName(node.parent.fullName, options)\n  );\n}\n\nfunction formatDirectivePart(part: AttributeNamePart, node: WrappedNode, options: Options): string {\n  if (!part.text.startsWith(\"@\")) return part.text;\n\n  const argsStart = part.text.indexOf(\"(\");\n  if (argsStart === -1) {\n    return formatDirectiveNameToken(part.text, options);\n  }\n\n  const beforeArgs = part.text.slice(0, argsStart);\n  const trimmedName = beforeArgs.trimEnd();\n  const spacing = beforeArgs.slice(trimmedName.length);\n  const args = part.text.slice(argsStart);\n  const formattedName = formatDirectiveNameToken(trimmedName, options);\n  const spacingRule = resolveDirectiveArgSpacingRule(\n    trimmedName,\n    options,\n    isComponentAttributeName(node, options),\n  );\n\n  if (spacingRule === \"preserve\") {\n    return `${formattedName}${spacing}${args}`;\n  }\n\n  const normalizedArgs = args.trimStart();\n  return `${formattedName}${getDirectiveArgSpacingText(\"\", spacingRule)}${normalizedArgs}`;\n}\n\nfunction formatAttributeNamePart(\n  part: AttributeNamePart,\n  node: WrappedNode,\n  options: Options,\n): string {\n  switch (part.kind) {\n    case \"echo\":\n    case \"raw_echo\":\n    case \"triple_echo\":\n      return formatEchoPart(part, options);\n    case \"directive\":\n      return formatDirectivePart(part, node, options);\n    case \"php_tag\":\n    case \"php_block\":\n    case \"text\":\n    default:\n      return part.text;\n  }\n}\n\nexport function formatAttributeNameForPrint(node: WrappedNode, options: Options): string {\n  if (isStaticAttributeName(node)) {\n    return getAttributeNameRaw(node);\n  }\n\n  const parts = getAttributeNameParts(node);\n  if (parts.length === 0) {\n    return getAttributeNameRaw(node);\n  }\n\n  return parts.map((part) => formatAttributeNamePart(part, node, options)).join(\"\");\n}\n","import type { Options } from \"prettier\";\n\nconst DOCTYPE_START = \"<!DOCTYPE\";\nconst DOCTYPE_START_LOWER = \"<!doctype\";\n\nfunction parseDoctype(rawText: string): {\n  normalizedValue: string;\n  isSimpleHtml5: boolean;\n} | null {\n  const valueMatch = rawText.match(/^<!DOCTYPE\\s+(.*?)\\s*>$/is);\n  if (!valueMatch) return null;\n\n  const value = valueMatch[1];\n  const normalizedValue = value.replace(/^html\\b/i, \"html\").replace(/\\s+/g, \" \");\n  const isSimpleHtml5 = /^html$/i.test(normalizedValue);\n  return { normalizedValue, isSimpleHtml5 };\n}\n\nexport function getDoctypeStartMarker(rawText: string, options?: Options): string {\n  const parsed = parseDoctype(rawText);\n  const filepath = options?.filepath;\n  const hasFilepath = typeof filepath === \"string\" && filepath.length > 0;\n  const isHtmlFilepath = hasFilepath && /\\.html?$/i.test(filepath);\n\n  if (!parsed) {\n    return rawText.slice(0, DOCTYPE_START.length);\n  }\n\n  // Preserve original marker case in non-HTML files (e.g. .blade.php).\n  if (hasFilepath && !isHtmlFilepath) {\n    return rawText.slice(0, DOCTYPE_START.length);\n  }\n\n  if (parsed.isSimpleHtml5) {\n    return DOCTYPE_START_LOWER;\n  }\n\n  return DOCTYPE_START;\n}\n\nexport function formatDoctype(rawText: string, options?: Options): string {\n  const parsed = parseDoctype(rawText);\n  if (!parsed) {\n    // Malformed EOF doctypes (e.g. \"<!DOCTYPE\" without closing \">\") can\n    // absorb trailing newlines into the doctype token and drift each pass.\n    // Trim trailing whitespace for this malformed shape to keep output stable.\n    if (/^<!doctype\\b/i.test(rawText) && !rawText.includes(\">\")) {\n      return rawText.trimEnd();\n    }\n    return rawText;\n  }\n  return `${getDoctypeStartMarker(rawText, options)} ${parsed.normalizedValue}>`;\n}\n","import type { Doc } from \"prettier\";\nimport { doc } from \"prettier\";\nimport {\n  htmlTrimStart as sharedHtmlTrimStart,\n  htmlTrimEnd as sharedHtmlTrimEnd,\n} from \"../html-whitespace.js\";\n\nexport function replaceEndOfLine(text: string, replacement: Doc = doc.builders.literalline): Doc[] {\n  const parts: Doc[] = [];\n  const lines = text.split(\"\\n\");\n  for (let i = 0; i < lines.length; i++) {\n    if (i > 0) parts.push(replacement);\n    if (lines[i]) parts.push(lines[i]);\n  }\n  return parts;\n}\n\nexport function htmlTrimStart(s: string): string {\n  return sharedHtmlTrimStart(s);\n}\n\nexport function htmlTrimEnd(s: string): string {\n  return sharedHtmlTrimEnd(s);\n}\n","import type { AstPath, Doc, Options } from \"prettier\";\nimport { doc } from \"prettier\";\nimport type { WrappedNode } from \"../types.js\";\nimport { NodeKind } from \"../tree/types.js\";\nimport { isTextLikeNode, isEchoLike } from \"../node-predicates.js\";\nimport {\n  getChildPrintSegments,\n  hasPrettierIgnore,\n  getPrettierIgnoreMode,\n  forceBreakChildren,\n  forceNextEmptyLine,\n  getPrintableSubtreeEnd,\n  preferHardlineAsLeadingSpaces,\n  type ChildPrintSegment,\n} from \"./utils.js\";\nimport {\n  needsToBorrowNextOpeningTagStartMarker,\n  needsToBorrowPrevClosingTagEndMarker,\n  needsToBorrowParentClosingTagStartMarker,\n  printOpeningTagPrefix,\n  printOpeningTagStartMarker,\n  printClosingTagSuffix,\n  printClosingTagEndMarker,\n} from \"./tag.js\";\nimport { htmlTrimEnd, htmlTrimStart, replaceEndOfLine } from \"./doc-utils.js\";\nimport { ifBreakChain } from \"./if-break-chain.js\";\n\nconst { breakParent, group, hardline, softline, line } = doc.builders;\n\nfunction getSourceBetween(prev: WrappedNode, next: WrappedNode): string {\n  if (prev.source !== next.source) {\n    return \"\";\n  }\n\n  return prev.source.slice(prev.end, next.start);\n}\n\nfunction isIgnoreRangeNode(node: WrappedNode): boolean {\n  return node.kind === NodeKind.IgnoreRange;\n}\n\n/**\n * Print a child node, handling prettier-ignore by emitting raw source.\n * Ported from Prettier's print/children.js printChild\n */\nfunction printChild(\n  childPath: AstPath<WrappedNode>,\n  options: Options,\n  print: (path: AstPath<WrappedNode>) => Doc,\n): Doc {\n  const child = childPath.node;\n  const ignoreMode = getPrettierIgnoreMode(child);\n\n  if (hasPrettierIgnore(child) && ignoreMode === \"single\") {\n    const endLocation = getPrintableSubtreeEnd(child);\n    let preservedText = htmlTrimEnd(\n      child.source.slice(\n        child.start +\n          (child.prev && needsToBorrowNextOpeningTagStartMarker(child.prev)\n            ? printOpeningTagStartMarker(child).length\n            : 0),\n        endLocation -\n          (child.next && needsToBorrowPrevClosingTagEndMarker(child.next)\n            ? printClosingTagEndMarker(child, options).length\n            : 0),\n      ),\n    );\n\n    // Our text node boundaries include leading indentation that Prettier's\n    // parser doesn't attach to ignored text nodes. Remove it to avoid\n    // double-indenting when surrounding docs already provide spacing.\n    if (child.kind === NodeKind.Text && ignoreMode === \"single\") {\n      preservedText = htmlTrimStart(preservedText);\n    }\n\n    return [\n      printOpeningTagPrefix(child, options),\n      replaceEndOfLine(preservedText),\n      printClosingTagSuffix(child, options),\n    ];\n  }\n\n  return print(childPath);\n}\n\nfunction getSourceBetweenSegments(prev: ChildPrintSegment, next: ChildPrintSegment): string {\n  if (prev.first.source !== next.first.source) {\n    return \"\";\n  }\n\n  return prev.first.source.slice(prev.sourceEnd, next.sourceStart);\n}\n\nfunction hasEmptyLineBetweenSegments(prev: ChildPrintSegment, next: ChildPrintSegment): boolean {\n  if (!isIgnoreRangeNode(prev.last) && !isIgnoreRangeNode(next.first)) {\n    return forceNextEmptyLine(prev.last);\n  }\n\n  const sourceBetween = getSourceBetweenSegments(prev, next);\n\n  return /(?:\\r\\n|\\r|\\n)[^\\S\\r\\n]*(?:\\r\\n|\\r|\\n)/u.test(sourceBetween);\n}\n\nfunction printBetweenSegments(prev: ChildPrintSegment, next: ChildPrintSegment): Doc {\n  if (isIgnoreRangeNode(prev.last) || isIgnoreRangeNode(next.first)) {\n    const sourceBetween = getSourceBetweenSegments(prev, next);\n    if (sourceBetween.length === 0) {\n      return \"\";\n    }\n\n    if (/(?:\\r\\n|\\r|\\n)[^\\S\\r\\n]*(?:\\r\\n|\\r|\\n)/u.test(sourceBetween)) {\n      return [hardline, hardline];\n    }\n\n    if (/[\\r\\n]/u.test(sourceBetween)) {\n      return hardline;\n    }\n\n    return sourceBetween;\n  }\n\n  return printBetweenLine(prev.last, next.first);\n}\n\n/**\n * Determine line break between two adjacent content nodes.\n * Ported from Prettier's print/children.js printBetweenLine.\n */\nfunction printBetweenLine(prev: WrappedNode, next: WrappedNode): Doc {\n  const sourceBetween = getSourceBetween(prev, next);\n\n  if (isIgnoreRangeNode(prev) || isIgnoreRangeNode(next)) {\n    if (sourceBetween.length === 0) {\n      return \"\";\n    }\n    if (/(?:\\r\\n|\\r|\\n)[^\\S\\r\\n]*(?:\\r\\n|\\r|\\n)/u.test(sourceBetween)) {\n      return [hardline, hardline];\n    }\n    if (/[\\r\\n]/u.test(sourceBetween)) {\n      return hardline;\n    }\n    return sourceBetween;\n  }\n\n  // Escaped blade prefixes (e.g. @@, @{{, @{!!) must stay attached to\n  // the following construct/text to preserve semantics.\n  if (prev.kind === NodeKind.NonOutput || next.kind === NodeKind.NonOutput) {\n    return \"\";\n  }\n\n  // Case 1: Both text-like - respect trailing space sensitivity.\n  if (isTextLikeNode(prev) && isTextLikeNode(next)) {\n    if (prev.isTrailingSpaceSensitive) {\n      if (prev.hasTrailingSpaces) {\n        if (isEchoLike(prev) || isEchoLike(next)) {\n          return \" \";\n        }\n        return preferHardlineAsLeadingSpaces(next) ? hardline : line;\n      }\n      return \"\";\n    }\n    if (isEchoLike(prev) || isEchoLike(next)) {\n      return \"\";\n    }\n    return preferHardlineAsLeadingSpaces(next) ? hardline : softline;\n  }\n\n  // Case 2: Marker borrowing - tags glue together.\n  if (\n    (needsToBorrowNextOpeningTagStartMarker(prev) &&\n      (hasPrettierIgnore(next) ||\n        next.children.length > 0 ||\n        next.isSelfClosing ||\n        (next.kind === NodeKind.Element && next.attrs.length > 0))) ||\n    (prev.kind === NodeKind.Element &&\n      prev.isSelfClosing &&\n      needsToBorrowPrevClosingTagEndMarker(next))\n  ) {\n    return \"\";\n  }\n\n  // Case 3: Block-like or hardline-preferred - always hardline.\n  if (\n    !next.isLeadingSpaceSensitive ||\n    preferHardlineAsLeadingSpaces(next) ||\n    (needsToBorrowPrevClosingTagEndMarker(next) &&\n      prev.children.length > 0 &&\n      needsToBorrowParentClosingTagStartMarker(prev.children[prev.children.length - 1]) &&\n      prev.children[prev.children.length - 1].children.length > 0 &&\n      needsToBorrowParentClosingTagStartMarker(\n        prev.children[prev.children.length - 1].children[\n          prev.children[prev.children.length - 1].children.length - 1\n        ],\n      ))\n  ) {\n    return hardline;\n  }\n\n  // Case 4: Has leading spaces - breakable space.\n  if (next.hasLeadingSpaces) {\n    return line;\n  }\n\n  // Default: softline.\n  return softline;\n}\n\nexport function printChildren(\n  path: AstPath<WrappedNode>,\n  print: (path: AstPath<WrappedNode>) => Doc,\n  options: Options,\n): Doc[] {\n  const node = path.node;\n  const segments = getChildPrintSegments(node.children);\n  const printedChildren = path.map(\n    (childPath) => printChild(childPath, options, print),\n    \"children\",\n  );\n\n  // Force-break mode: certain elements (ul, ol, table, etc.) always break.\n  if (forceBreakChildren(node)) {\n    return [\n      breakParent,\n      ...segments.map((segment, segmentIndex) => {\n        const prevSegment = segmentIndex > 0 ? segments[segmentIndex - 1] : null;\n        const prevBetweenLine = !prevSegment ? \"\" : printBetweenSegments(prevSegment, segment);\n        return [\n          !prevBetweenLine\n            ? \"\"\n            : [prevBetweenLine, hasEmptyLineBetweenSegments(prevSegment!, segment) ? hardline : \"\"],\n          printedChildren[segment.startIndex],\n        ];\n      }),\n    ];\n  }\n\n  // Normal mode: use group IDs for proper inline element formatting.\n  const needsGroupIds = segments.some((segment) => !isTextLikeNode(segment.first));\n  const groupIds = needsGroupIds ? segments.map(() => Symbol(\"\")) : [];\n\n  return segments.map((segment, childIndex) => {\n    const childNode = segment.first;\n    const segmentDoc = printedChildren[segment.startIndex];\n\n    // Text-like nodes: simpler handling - no group wrapping needed.\n    if (isTextLikeNode(childNode)) {\n      const prevSegment = childIndex > 0 ? segments[childIndex - 1] : null;\n      if (prevSegment && isTextLikeNode(prevSegment.last)) {\n        const prevBetweenLine = printBetweenSegments(prevSegment, segment);\n        if (prevBetweenLine) {\n          if (hasEmptyLineBetweenSegments(prevSegment, segment)) {\n            return [hardline, hardline, segmentDoc];\n          }\n          return [prevBetweenLine, segmentDoc];\n        }\n      }\n      return segmentDoc;\n    }\n\n    // Non-text nodes: wrap in groups with leading/trailing parts.\n    const prevParts: Doc[] = [];\n    const leadingParts: Doc[] = [];\n    const trailingParts: Doc[] = [];\n    const nextParts: Doc[] = [];\n\n    const prevSegment = childIndex > 0 ? segments[childIndex - 1] : null;\n    const prevBetweenLine = prevSegment ? printBetweenSegments(prevSegment, segment) : \"\";\n\n    const nextSegment = childIndex + 1 < segments.length ? segments[childIndex + 1] : null;\n    const nextBetweenLine = nextSegment ? printBetweenSegments(segment, nextSegment) : \"\";\n\n    if (prevBetweenLine) {\n      if (hasEmptyLineBetweenSegments(prevSegment!, segment)) {\n        prevParts.push(hardline, hardline);\n      } else if (prevBetweenLine === hardline) {\n        prevParts.push(hardline);\n      } else if (prevSegment && isTextLikeNode(prevSegment.last)) {\n        leadingParts.push(prevBetweenLine);\n      } else {\n        leadingParts.push(ifBreakChain(softline, [groupIds[childIndex - 1]]));\n      }\n    }\n\n    if (nextBetweenLine) {\n      if (nextSegment && hasEmptyLineBetweenSegments(segment, nextSegment)) {\n        if (isTextLikeNode(nextSegment.first)) {\n          nextParts.push(hardline, hardline);\n        }\n      } else if (nextBetweenLine === hardline) {\n        if (nextSegment && isTextLikeNode(nextSegment.first)) {\n          nextParts.push(hardline);\n        }\n      } else {\n        trailingParts.push(nextBetweenLine);\n      }\n    }\n\n    return [\n      ...prevParts,\n      group([\n        ...leadingParts,\n        group([segmentDoc, ...trailingParts], {\n          id: groupIds[childIndex],\n        }),\n      ]),\n      ...nextParts,\n    ];\n  });\n}\n","import type { Doc } from \"prettier\";\nimport { doc } from \"prettier\";\n\nconst { ifBreak } = doc.builders;\n\n/**\n * Apply nested `ifBreak` checks from right to left so a flat-space fallback\n * can be gated by one or more parent groups.\n */\nexport function ifBreakChain(\n  flatDoc: Doc,\n  groupIds: Array<symbol | undefined>,\n  breakDoc: Doc = \"\",\n): Doc {\n  let chained = flatDoc;\n  for (let i = groupIds.length - 1; i >= 0; i--) {\n    const groupId = groupIds[i];\n    if (!groupId) {\n      continue;\n    }\n    chained = ifBreak(breakDoc, chained, { groupId });\n  }\n  return chained;\n}\n","import type { Doc, Options } from \"prettier\";\nimport { doc } from \"prettier\";\nimport type { WrappedNode } from \"../types.js\";\nimport { isEchoLike } from \"../node-predicates.js\";\nimport { dedentString, htmlTrimPreserveIndentation } from \"./utils.js\";\nimport { printOpeningTagPrefix, printClosingTagSuffix } from \"./tag.js\";\nimport { replaceEndOfLine } from \"./doc-utils.js\";\n\nconst { line, hardline, fill, join } = doc.builders;\n\n/**\n * Print a text node.\n * Ported from Prettier's printer-html.js case \"text\" +\n * utilities/index.js getTextValueParts.\n *\n * The prefix/suffix (for marker borrowing) are ALWAYS included,\n * even for whitespace-sensitive parents. The whitespace handling\n * inside the text varies by parent sensitivity.\n */\nexport function printText(node: WrappedNode, options?: Options): Doc {\n  const text = node.rawText;\n\n  // Interpolation parent (Echo-like): replace trailing newline with hardline.\n  if (node.parent && isEchoLike(node.parent)) {\n    const trailingNewlineRegex = /\\n[^\\S\\n]*$/;\n    const hasTrailingNewline = trailingNewlineRegex.test(text);\n    const value = hasTrailingNewline ? text.replace(trailingNewlineRegex, \"\") : text;\n    return [replaceEndOfLine(value), hasTrailingNewline ? hardline : \"\"];\n  }\n\n  const prefix = printOpeningTagPrefix(node, options);\n  const suffix = printClosingTagSuffix(node, options);\n\n  // Three-way branch from getTextValueParts:\n  const printed = getTextValueParts(node);\n\n  // Attach prefix to first content part, suffix to last.\n  // Following Prettier's pop/push pattern so single-word case works too.\n  if (Array.isArray(printed) && printed.length > 0) {\n    printed[0] = [prefix, printed[0]];\n    printed.push([printed.pop()!, suffix]);\n    return fill(printed);\n  }\n\n  return [prefix, printed, suffix];\n}\n\n/**\n * Three-way text value splitting.\n * Ported from Prettier's utilities/index.js getTextValueParts.\n */\nfunction getTextValueParts(node: WrappedNode): Doc[] {\n  const value = node.rawText;\n\n  if (node.parent?.isWhitespaceSensitive) {\n    if (node.parent.isIndentationSensitive) {\n      // Branch 1: WS-sensitive + indent-sensitive -> literalline\n      return replaceEndOfLine(value);\n    }\n    // Branch 2: WS-sensitive + NOT indent-sensitive -> dedent + hardline\n    return replaceEndOfLine(dedentString(htmlTrimPreserveIndentation(value)), hardline);\n  }\n\n  // Branch 3: Normal -> split on whitespace, join with line\n  return join(line, value.split(/[\\t\\n\\f\\r ]+/)) as Doc[];\n}\n","import type { AstPath, Doc, Options } from \"prettier\";\r\nimport { doc } from \"prettier\";\r\nimport type { WrappedNode } from \"../types.js\";\r\nimport { NodeKind, StructureRole } from \"../tree/types.js\";\r\nimport { TokenType } from \"../lexer/types.js\";\r\nimport {\r\n  formatDirectiveNameToken,\r\n  getBladeBlankLinesMode,\r\n  getDirectiveArgSpacingText,\r\n  getDirectiveBlockStyle,\r\n} from \"./blade-options.js\";\r\nimport {\r\n  getDirectiveName,\r\n  getEffectiveDirectiveArgSpacingRule,\r\n  isDirectiveInElementOpenTag,\r\n} from \"./directive-spacing-context.js\";\r\nimport { trimTrailingHorizontalWhitespace } from \"../string-utils.js\";\r\nimport { isEchoLike, isTextLikeNode } from \"../node-predicates.js\";\r\nimport {\r\n  fullText,\r\n  preferHardlineAsLeadingSpaces,\r\n  getChildPrintSegments,\r\n  getPrintableSubtreeEnd,\r\n  getPrettierIgnoreMode,\r\n  hasPrettierIgnore,\r\n  type ChildPrintSegment,\r\n} from \"./utils.js\";\r\nimport { htmlTrimEnd, htmlTrimStart, replaceEndOfLine } from \"./doc-utils.js\";\r\nimport {\r\n  needsToBorrowNextOpeningTagStartMarker,\r\n  needsToBorrowPrevClosingTagEndMarker,\r\n  printOpeningTagPrefix,\r\n  printOpeningTagStartMarker,\r\n  printClosingTagSuffix,\r\n  printClosingTagEndMarker,\r\n} from \"./tag.js\";\r\n\r\nconst { indent, hardline } = doc.builders;\r\n\r\ntype BranchNodeKind = NodeKind.Directive | NodeKind.PhpTag;\r\n\r\nfunction isBranchNode(node: WrappedNode): node is WrappedNode & { kind: BranchNodeKind } {\r\n  return node.kind === NodeKind.Directive || node.kind === NodeKind.PhpTag;\r\n}\r\n\r\nfunction isIgnoreRangeNode(node: WrappedNode): boolean {\r\n  return node.kind === NodeKind.IgnoreRange;\r\n}\r\n\r\nfunction printIgnoredDirectiveBodyChild(\r\n  childPath: AstPath<WrappedNode>,\r\n  options: Options,\r\n): Doc | null {\r\n  const child = childPath.node;\r\n  const ignoreMode = getPrettierIgnoreMode(child);\r\n\r\n  if (!(hasPrettierIgnore(child) && ignoreMode === \"single\")) {\r\n    return null;\r\n  }\r\n\r\n  const endLocation = getPrintableSubtreeEnd(child);\r\n  let preservedText = htmlTrimEnd(\r\n    child.source.slice(\r\n      child.start +\r\n        (child.prev && needsToBorrowNextOpeningTagStartMarker(child.prev)\r\n          ? printOpeningTagStartMarker(child).length\r\n          : 0),\r\n      endLocation -\r\n        (child.next && needsToBorrowPrevClosingTagEndMarker(child.next)\r\n          ? printClosingTagEndMarker(child, options).length\r\n          : 0),\r\n    ),\r\n  );\r\n\r\n  if (child.kind === NodeKind.Text && ignoreMode === \"single\") {\r\n    preservedText = htmlTrimStart(preservedText);\r\n  }\r\n\r\n  return [\r\n    printOpeningTagPrefix(child, options),\r\n    replaceEndOfLine(preservedText),\r\n    printClosingTagSuffix(child, options),\r\n  ];\r\n}\r\n\r\nfunction getSourceBetweenSegments(prev: ChildPrintSegment, next: ChildPrintSegment): string {\r\n  if (prev.first.source !== next.first.source) {\r\n    return \"\";\r\n  }\r\n\r\n  return getSourceBetweenBounds(prev.first.source, prev.sourceEnd, next.sourceStart);\r\n}\r\n\r\nfunction printBetweenSegments(prev: ChildPrintSegment, next: ChildPrintSegment): Doc {\r\n  if (isIgnoreRangeNode(prev.last) || isIgnoreRangeNode(next.first)) {\r\n    const sourceBetween = getSourceBetweenSegments(prev, next);\r\n    if (sourceBetween.length === 0) {\r\n      return \"\";\r\n    }\r\n\r\n    if (!/[\\r\\n]/u.test(sourceBetween)) {\r\n      return sourceBetween;\r\n    }\r\n\r\n    if (hasBlankLineBetween(sourceBetween) && shouldPreserveBodyBlankLine(prev.last, next.first)) {\r\n      return [hardline, hardline];\r\n    }\r\n\r\n    return hardline;\r\n  }\r\n\r\n  return printBetweenLine(prev.last, next.first);\r\n}\r\n\r\nexport function printDirective(node: WrappedNode, options: Options): Doc {\r\n  return renderDirectiveTokens(node, options);\r\n}\r\n\r\nfunction renderDirectiveTokens(node: WrappedNode, options: Options): string {\r\n  const br = node.buildResult;\r\n  const tc = node.flat.tokenCount;\r\n  let result = \"\";\r\n  const argSpacingRule = getEffectiveDirectiveArgSpacingRule(node, options);\r\n  const start = node.flat.tokenStart;\r\n  let sawDirectiveToken = false;\r\n  let sawArgsToken = false;\r\n\r\n  for (let i = 0; i < tc; i++) {\r\n    const tokenIndex = start + i;\r\n    const t = br.tokens[tokenIndex];\r\n    const prev = tokenIndex > start ? br.tokens[tokenIndex - 1] : null;\r\n    const next = tokenIndex + 1 < start + tc ? br.tokens[tokenIndex + 1] : null;\r\n    const tokenText = br.source.slice(t.start, t.end);\r\n\r\n    if (t.type === TokenType.Directive) {\r\n      result += formatDirectiveNameToken(tokenText, options);\r\n      sawDirectiveToken = true;\r\n      if (next?.type === TokenType.DirectiveArgs) {\r\n        result += getDirectiveArgSpacingText(\"\", argSpacingRule);\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (!sawDirectiveToken) {\r\n      continue;\r\n    }\r\n\r\n    if (\r\n      t.type === TokenType.Whitespace &&\r\n      prev?.type === TokenType.Directive &&\r\n      next?.type === TokenType.DirectiveArgs\r\n    ) {\r\n      result += getDirectiveArgSpacingText(tokenText, argSpacingRule);\r\n      continue;\r\n    }\r\n\r\n    if (t.type === TokenType.DirectiveArgs && !sawArgsToken) {\r\n      // Normalize line-tail spaces inside directive args so malformed or\r\n      // intentionally odd arg layouts still converge without trailing-space\r\n      // churn across passes/options.\r\n      result += trimTrailingHorizontalWhitespace(tokenText);\r\n      sawArgsToken = true;\r\n      continue;\r\n    }\r\n\r\n    // Recovery mode: unclosed directive blocks can have opener token ranges\r\n    // that spill into body content. Stop when header tokens end.\r\n    break;\r\n  }\r\n\r\n  if (!sawDirectiveToken) {\r\n    if (tc === 1 && br.tokens[start]?.type === TokenType.PhpBlockEnd) {\r\n      return fullText(node);\r\n    }\r\n\r\n    return \"\";\r\n  }\r\n\r\n  if (hasUnterminatedDirectiveArgs(node)) {\r\n    // Recovery mode: keep malformed args content, but trim trailing whitespace\r\n    // so root-level hardline emission stays idempotent across passes.\r\n    return result.replace(/\\s+$/u, \"\");\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction hasUnterminatedDirectiveArgs(node: WrappedNode): boolean {\r\n  const start = node.flat.tokenStart;\r\n  const end = start + node.flat.tokenCount;\r\n  const tokens = node.buildResult.tokens;\r\n\r\n  for (let i = start; i < end; i++) {\r\n    const token = tokens[i];\r\n    if (token.type !== TokenType.DirectiveArgs) continue;\r\n\r\n    const text = node.source.slice(token.start, token.end);\r\n    if (!text.startsWith(\"(\")) return false;\r\n    return !text.trimEnd().endsWith(\")\");\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\nexport function printDirectiveBlock(\r\n  node: WrappedNode,\r\n  path: AstPath<WrappedNode>,\r\n  print: (path: AstPath<WrappedNode>) => Doc,\r\n  options: Options,\r\n): Doc {\r\n  if (shouldFallbackMalformedDirectiveBlock(node)) {\r\n    return fullText(node).replace(/\\s+$/u, \"\");\r\n  }\r\n\r\n  if (shouldFallbackUnterminatedRootDirectiveBlock(node)) {\r\n    return fullText(node).replace(/\\s+$/u, \"\");\r\n  }\r\n\r\n  // Tree structure:\r\n  //   DirectiveBlock\r\n  //     Directive (@if)        <- opener; its children are the body content\r\n  //       Text / Element ...   <- body\r\n  //     Directive (@else)      <- intermediate; its children are branch body\r\n  //       Text / Element ...\r\n  //     Directive (@endif)     <- closer; no children\r\n\r\n  const children = node.children;\r\n  if (children.length === 0) return \"\";\r\n\r\n  const style = getDirectiveBlockStyle(options);\r\n  if (style !== \"multiline\" && shouldPreserveInlineBlock(node, style)) {\r\n    return printDirectiveBlockInline(path, print, options);\r\n  }\r\n\r\n  return printDirectiveBlockMultiline(node, path, print, options);\r\n}\r\n\r\nfunction shouldFallbackMalformedDirectiveBlock(node: WrappedNode): boolean {\r\n  return node.children.some((child) => !isBranchNode(child));\r\n}\r\n\r\nfunction shouldFallbackUnterminatedRootDirectiveBlock(node: WrappedNode): boolean {\r\n  if (node.parent?.kind !== NodeKind.Root) {\r\n    return false;\r\n  }\r\n\r\n  // Treat trailing root whitespace as EOF-equivalent so pass-2 formatting\r\n  // does not toggle fallback behavior.\r\n  if (/\\S/u.test(node.source.slice(node.end))) {\r\n    return false;\r\n  }\r\n\r\n  const branches = node.children.filter((child) => isBranchNode(child));\r\n  if (branches.length === 0) {\r\n    return false;\r\n  }\r\n\r\n  const lastBranch = branches[branches.length - 1];\r\n  if (lastBranch.children.length === 0) {\r\n    return false;\r\n  }\r\n\r\n  // PHP alternative-syntax blocks are especially brittle when truncated.\r\n  if (branches.some((branch) => branch.kind === NodeKind.PhpTag)) {\r\n    return true;\r\n  }\r\n\r\n  // Keep normal structured formatting for simple unterminated directive bodies\r\n  // (for example: @if (...)<newline><p>Hello world).\r\n  if (isSimpleUnterminatedDirectiveBody(lastBranch)) {\r\n    return false;\r\n  }\r\n\r\n  return true;\r\n}\r\n\r\nfunction isSimpleUnterminatedDirectiveBody(branch: WrappedNode): boolean {\r\n  const meaningfulChildren = branch.children.filter(\r\n    (child) => !(child.kind === NodeKind.Text && child.rawText.trim().length === 0),\r\n  );\r\n\r\n  if (meaningfulChildren.length !== 1) {\r\n    return false;\r\n  }\r\n\r\n  return isSimpleLeafBodyNode(meaningfulChildren[0]);\r\n}\r\n\r\nfunction isSimpleLeafBodyNode(node: WrappedNode): boolean {\r\n  if (\r\n    node.kind === NodeKind.Text ||\r\n    node.kind === NodeKind.Echo ||\r\n    node.kind === NodeKind.RawEcho ||\r\n    node.kind === NodeKind.TripleEcho\r\n  ) {\r\n    return true;\r\n  }\r\n\r\n  if (node.kind !== NodeKind.Element) {\r\n    return false;\r\n  }\r\n\r\n  if (node.attrs.length > 0) {\r\n    return false;\r\n  }\r\n\r\n  let hasAttribute = false;\r\n  let hasNestedElement = false;\r\n\r\n  const stack: WrappedNode[] = [...node.children];\r\n  while (stack.length > 0) {\r\n    const current = stack.pop()!;\r\n    if (current.kind === NodeKind.Attribute || current.kind === NodeKind.JsxAttribute) {\r\n      hasAttribute = true;\r\n      continue;\r\n    }\r\n    if (current.kind === NodeKind.Element) {\r\n      hasNestedElement = true;\r\n      break;\r\n    }\r\n    if (current.children.length > 0) {\r\n      stack.push(...current.children);\r\n    }\r\n  }\r\n\r\n  return !hasAttribute && !hasNestedElement;\r\n}\r\n\r\nfunction printDirectiveBody(\r\n  branchPath: AstPath<WrappedNode>,\r\n  print: (path: AstPath<WrappedNode>) => Doc,\r\n  options: Options,\r\n): Doc[] {\r\n  const docs: Doc[] = [];\r\n  const branch = branchPath.node;\r\n  const segments = getChildPrintSegments(branch.children);\r\n  const renderedChildren = branchPath.map((childPath) => {\r\n    const child = childPath.node;\r\n    if (isBranchNode(child) && child.children.length > 0) {\r\n      return {\r\n        branchDoc:\r\n          child.kind === NodeKind.Directive\r\n            ? renderDirectiveTokens(child, options)\r\n            : print(childPath),\r\n        nestedDocs: printDirectiveBody(childPath, print, options),\r\n      };\r\n    }\r\n\r\n    return {\r\n      branchDoc: printDirectiveBodyChild(childPath, print, options),\r\n      nestedDocs: [],\r\n    };\r\n  }, \"children\");\r\n\r\n  for (const [segmentIndex, segment] of segments.entries()) {\r\n    const child = segment.first;\r\n\r\n    if (docs.length > 0) {\r\n      const prev = segments[segmentIndex - 1];\r\n      if (prev) {\r\n        docs.push(printBetweenSegments(prev, segment));\r\n      }\r\n    }\r\n\r\n    const rendered = renderedChildren[segment.startIndex];\r\n    if (!rendered) {\r\n      continue;\r\n    }\r\n\r\n    // Directive children with their own body (e.g. @case/@default inside\r\n    // @switch): print the directive marker, then recurse into its body\r\n    // indented - mirroring how printDirectiveBlockMultiline handles its\r\n    // direct Directive children.\r\n    if (isBranchNode(child) && child.children.length > 0) {\r\n      docs.push(rendered.branchDoc);\r\n      const nestedDocs = rendered.nestedDocs;\r\n      if (nestedDocs.length > 0) {\r\n        docs.push(indent([hardline, nestedDocs]));\r\n      }\r\n    } else {\r\n      docs.push(rendered.branchDoc);\r\n    }\r\n  }\r\n\r\n  return docs;\r\n}\r\n\r\nfunction printDirectiveBodyInline(\r\n  branchPath: AstPath<WrappedNode>,\r\n  print: (path: AstPath<WrappedNode>) => Doc,\r\n  options: Options,\r\n): Doc[] {\r\n  const docs: Doc[] = [];\r\n  const segments = getChildPrintSegments(branchPath.node.children);\r\n  const printedChildren = branchPath.map(\r\n    (childPath) => printDirectiveBodyChild(childPath, print, options),\r\n    \"children\",\r\n  );\r\n\r\n  for (const [segmentIndex, segment] of segments.entries()) {\r\n    const prev = segmentIndex > 0 ? segments[segmentIndex - 1] : null;\r\n    if (prev !== null) {\r\n      const between =\r\n        isIgnoreRangeNode(prev.last) || isIgnoreRangeNode(segment.first)\r\n          ? getSourceBetweenSegments(prev, segment)\r\n          : getSourceBetween(prev.last, segment.first);\r\n\r\n      if (isIgnoreRangeNode(prev.last) || isIgnoreRangeNode(segment.first)) {\r\n        if (between.length > 0) {\r\n          docs.push(\r\n            hasBlankLineBetween(between)\r\n              ? [hardline, hardline]\r\n              : /[\\r\\n]/u.test(between)\r\n                ? hardline\r\n                : between,\r\n          );\r\n        }\r\n      } else if (/\\s/.test(between)) {\r\n        docs.push(\" \");\r\n      }\r\n    }\r\n\r\n    const printed = printedChildren[segment.startIndex];\r\n    if (printed !== \"\") {\r\n      docs.push(printed);\r\n    }\r\n  }\r\n\r\n  return docs;\r\n}\r\n\r\nfunction printDirectiveBlockInline(\r\n  path: AstPath<WrappedNode>,\r\n  print: (path: AstPath<WrappedNode>) => Doc,\r\n  options: Options,\r\n): Doc {\r\n  const segments: Doc[] = [];\r\n  let previousDirective: WrappedNode | null = null;\r\n\r\n  path.each((childPath) => {\r\n    const child = childPath.node;\r\n    if (!isBranchNode(child)) {\r\n      segments.push(print(childPath));\r\n      return;\r\n    }\r\n\r\n    if (segments.length > 0) {\r\n      const separator = getInlineDirectiveSeparator(previousDirective, child);\r\n      if (separator.length > 0) {\r\n        segments.push(separator);\r\n      }\r\n    }\r\n\r\n    segments.push(print(childPath));\r\n    if (child.children.length > 0) {\r\n      const body = printDirectiveBodyInline(childPath, print, options);\r\n      if (body.length > 0) {\r\n        segments.push(\" \", body);\r\n      }\r\n    }\r\n\r\n    previousDirective = child;\r\n  }, \"children\");\r\n\r\n  return segments;\r\n}\r\n\r\nfunction printDirectiveBlockMultiline(\r\n  node: WrappedNode,\r\n  path: AstPath<WrappedNode>,\r\n  print: (path: AstPath<WrappedNode>) => Doc,\r\n  options: Options,\r\n): Doc {\r\n  const branches = node.children.filter((child) => isBranchNode(child));\r\n  if (branches.length === 0) {\r\n    return path.map((childPath) => print(childPath), \"children\");\r\n  }\r\n\r\n  const segments: Doc[] = [];\r\n  const separators: Doc[] = [];\r\n  const blankMode = getBladeBlankLinesMode(options);\r\n  let directiveIndex = 0;\r\n\r\n  path.each((childPath) => {\r\n    const child = childPath.node;\r\n    if (!isBranchNode(child)) return;\r\n\r\n    const segment: Doc[] = [print(childPath)];\r\n    if (child.children.length > 0) {\r\n      const bodyDocs = printDirectiveBody(childPath, print, options);\r\n      if (bodyDocs.length > 0) {\r\n        segment.push(indent([hardline, bodyDocs]));\r\n      }\r\n    }\r\n    segments.push(segment);\r\n\r\n    const nextDirective = branches[directiveIndex + 1];\r\n    if (!nextDirective) return;\r\n\r\n    separators.push(getDirectiveSeparator(child, nextDirective, blankMode));\r\n    directiveIndex++;\r\n  }, \"children\");\r\n\r\n  if (segments.length === 1) return segments[0];\r\n\r\n  const output: Doc[] = [segments[0]];\r\n  for (let i = 0; i < separators.length; i++) {\r\n    output.push(separators[i], segments[i + 1]);\r\n  }\r\n  return output;\r\n}\r\n\r\nfunction printDirectiveBodyChild(\r\n  childPath: AstPath<WrappedNode>,\r\n  print: (path: AstPath<WrappedNode>) => Doc,\r\n  options: Options,\r\n): Doc {\r\n  const child = childPath.node;\r\n  const ignored = printIgnoredDirectiveBodyChild(childPath, options);\r\n  if (ignored !== null) {\r\n    return ignored;\r\n  }\r\n\r\n  if (\r\n    child.kind === NodeKind.Text &&\r\n    ((child.prev !== null && isEchoLike(child.prev)) ||\r\n      (child.next !== null && isEchoLike(child.next)))\r\n  ) {\r\n    return replaceEndOfLine(child.rawText);\r\n  }\r\n\r\n  return print(childPath);\r\n}\r\n\r\nfunction shouldPreserveInlineBlock(\r\n  node: WrappedNode,\r\n  style: ReturnType<typeof getDirectiveBlockStyle>,\r\n): boolean {\r\n  const inlineAtTopLevel = isInlineDirectiveBlock(node);\r\n  if (inlineAtTopLevel) return true;\r\n\r\n  if (style !== \"inline-if-short\") {\r\n    return false;\r\n  }\r\n\r\n  // Optional inline-if-short heuristic:\r\n  // keep only very small blocks inline when the body is simple text/echo.\r\n  const directives = node.children.filter((child) => isBranchNode(child));\r\n  if (directives.length !== 2) return false;\r\n\r\n  const opener = directives[0];\r\n  if (opener.children.length !== 1) return false;\r\n  const onlyBody = opener.children[0];\r\n  if (\r\n    onlyBody.kind !== NodeKind.Text &&\r\n    onlyBody.kind !== NodeKind.Echo &&\r\n    onlyBody.kind !== NodeKind.RawEcho &&\r\n    onlyBody.kind !== NodeKind.TripleEcho\r\n  ) {\r\n    return false;\r\n  }\r\n\r\n  return fullText(node).trim().length <= 60;\r\n}\r\n\r\nfunction getDirectiveSeparator(\r\n  prev: WrappedNode,\r\n  next: WrappedNode,\r\n  mode: ReturnType<typeof getBladeBlankLinesMode>,\r\n): Doc {\r\n  if (shouldSuppressDirectiveSeparator(prev, next)) {\r\n    return \"\";\r\n  }\r\n  const between = getDirectiveSourceBetweenBranches(prev, next);\r\n  if (mode === \"always\") {\r\n    return [hardline, hardline];\r\n  }\r\n  return hasBlankLineBetween(between) ? [hardline, hardline] : hardline;\r\n}\r\n\r\nfunction getInlineDirectiveSeparator(prev: WrappedNode | null, next: WrappedNode): string {\r\n  if (!prev) return \"\";\r\n  if (shouldSuppressDirectiveSeparator(prev, next)) {\r\n    return \"\";\r\n  }\r\n  const between = getSourceBetween(prev, next);\r\n  if (between.length === 0) {\r\n    return \"\";\r\n  }\r\n  return /\\s$/.test(between) ? \" \" : \"\";\r\n}\r\n\r\nfunction hasBlankLineBetween(between: string): boolean {\r\n  return /\\r?\\n\\s*\\r?\\n/.test(between);\r\n}\r\n\r\nfunction getPhpTagKeyword(node: WrappedNode): string | null {\r\n  if (node.kind !== NodeKind.PhpTag) {\r\n    return null;\r\n  }\r\n\r\n  const match = fullText(node)\r\n    .trim()\r\n    .match(/^<\\?(?:php)?\\s*([a-z_][a-z0-9_]*)/iu);\r\n  return match?.[1]?.toLowerCase() ?? null;\r\n}\r\n\r\nfunction shouldSuppressDirectiveSeparator(prev: WrappedNode, next: WrappedNode): boolean {\r\n  // PHP alternative switch syntax requires zero output between\r\n  // `switch (...):` and the first `case`/`default`.\r\n  return (\r\n    prev.children.length === 0 &&\r\n    getPhpTagKeyword(prev) === \"switch\" &&\r\n    (getPhpTagKeyword(next) === \"case\" || getPhpTagKeyword(next) === \"default\")\r\n  );\r\n}\r\n\r\nfunction isInlineDirectiveBlock(node: WrappedNode): boolean {\r\n  const directives = node.children.filter((child) => isBranchNode(child));\r\n  if (directives.length === 0) return false;\r\n\r\n  for (let i = 0; i < directives.length; i++) {\r\n    const directive = directives[i];\r\n\r\n    if (directive.children.length > 0) {\r\n      const firstBodyChild = directive.children[0];\r\n      if (firstBodyChild.startLine > directive.endLine) {\r\n        return false;\r\n      }\r\n\r\n      for (const child of directive.children) {\r\n        if (child.endLine > child.startLine) {\r\n          return false;\r\n        }\r\n        if (!isDirectiveInElementOpenTag(directive) && child.kind === NodeKind.Element) {\r\n          return false;\r\n        }\r\n      }\r\n\r\n      for (let j = 1; j < directive.children.length; j++) {\r\n        if (directive.children[j].startLine > directive.children[j - 1].endLine) {\r\n          return false;\r\n        }\r\n      }\r\n    }\r\n\r\n    const nextDirective = directives[i + 1];\r\n    const branchEndLine =\r\n      directive.children.length > 0\r\n        ? directive.children[directive.children.length - 1].endLine\r\n        : directive.endLine;\r\n    if (nextDirective && nextDirective.startLine > branchEndLine) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  return true;\r\n}\r\n\r\nfunction getSourceBetween(prev: WrappedNode, next: WrappedNode): string {\r\n  if (prev.source !== next.source) {\r\n    return \"\";\r\n  }\r\n  return getSourceBetweenBounds(prev.source, prev.end, next.start);\r\n}\r\n\r\nfunction getSourceBetweenBounds(source: string, start: number, end: number): string {\r\n  if (start > end) {\r\n    return \"\";\r\n  }\r\n  return source.slice(start, end);\r\n}\r\n\r\nfunction getDirectiveSourceBetweenBranches(\r\n  prevDirective: WrappedNode,\r\n  nextDirective: WrappedNode,\r\n): string {\r\n  if (prevDirective.source !== nextDirective.source) {\r\n    return \"\";\r\n  }\r\n  const prevBranchEnd = getDirectiveBranchEnd(prevDirective);\r\n  return getSourceBetweenBounds(prevDirective.source, prevBranchEnd, nextDirective.start);\r\n}\r\n\r\nfunction getDirectiveBranchEnd(directive: WrappedNode): number {\r\n  if (directive.children.length === 0) {\r\n    return directive.end;\r\n  }\r\n  return directive.children[directive.children.length - 1].end;\r\n}\r\n\r\nfunction printBetweenLine(prev: WrappedNode, next: WrappedNode): Doc {\r\n  // Escaped blade prefixes (e.g. @@, @{{, @{!!) must stay attached to\r\n  // the following construct/text to preserve semantics.\r\n  if (prev.kind === NodeKind.NonOutput || next.kind === NodeKind.NonOutput) {\r\n    return \"\";\r\n  }\r\n\r\n  const sourceBetween = getSourceBetween(prev, next);\r\n  const hasLineBreakBetweenNodes = /[\\r\\n]/.test(sourceBetween) || next.startLine > prev.endLine;\r\n\r\n  if (isIgnoreRangeNode(prev) || isIgnoreRangeNode(next)) {\r\n    if (sourceBetween.length === 0) {\r\n      return \"\";\r\n    }\r\n    if (hasBlankLineBetween(sourceBetween)) {\r\n      return [hardline, hardline];\r\n    }\r\n    if (hasLineBreakBetweenNodes) {\r\n      return hardline;\r\n    }\r\n    return sourceBetween;\r\n  }\r\n\r\n  if (hasBlankLineBetween(sourceBetween) && shouldPreserveBodyBlankLine(prev, next)) {\r\n    return [hardline, hardline];\r\n  }\r\n\r\n  // Case 1: Both text-like - respect trailing space sensitivity.\r\n  if (isTextLikeNode(prev) && isTextLikeNode(next)) {\r\n    if (prev.isTrailingSpaceSensitive) {\r\n      if (prev.hasTrailingSpaces) {\r\n        if (isEchoLike(prev) || isEchoLike(next)) {\r\n          return hasLineBreakBetweenNodes ? hardline : \" \";\r\n        }\r\n        return preferHardlineAsLeadingSpaces(next) ? hardline : doc.builders.line;\r\n      }\r\n      return \"\";\r\n    }\r\n    if (isEchoLike(prev) || isEchoLike(next)) {\r\n      return hasLineBreakBetweenNodes ? hardline : \"\";\r\n    }\r\n    return preferHardlineAsLeadingSpaces(next) ? hardline : doc.builders.softline;\r\n  }\r\n\r\n  // Case 2: Block-like or hardline-preferred - always hardline.\r\n  if (!next.isLeadingSpaceSensitive || preferHardlineAsLeadingSpaces(next)) {\r\n    return hardline;\r\n  }\r\n\r\n  // Case 3: Has leading spaces - breakable space.\r\n  if (next.hasLeadingSpaces) {\r\n    return doc.builders.line;\r\n  }\r\n\r\n  // Default: softline.\r\n  return doc.builders.softline;\r\n}\r\n\r\nfunction shouldPreserveBodyBlankLine(prev: WrappedNode, next: WrappedNode): boolean {\r\n  // Branch markers such as @else/@elseif/@case/@default already have dedicated\r\n  // separator handling. Preserving source blank lines here causes pass-2\r\n  // duplication when an outer mode like `always` inserts its own branch gap.\r\n  if (isBranchBoundaryDirective(prev) || isBranchBoundaryDirective(next)) {\r\n    return false;\r\n  }\r\n\r\n  if (isMeaningfulBodySibling(prev) && isMeaningfulBodySibling(next)) {\r\n    return true;\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\nfunction isBranchBoundaryDirective(node: WrappedNode): boolean {\r\n  if (node.kind !== NodeKind.Directive) {\r\n    return false;\r\n  }\r\n\r\n  const name = getDirectiveName(node);\r\n  if (name === null) {\r\n    return false;\r\n  }\r\n\r\n  const directive = node.buildResult.directives?.getDirective(name);\r\n  if (!directive) {\r\n    return false;\r\n  }\r\n\r\n  return (\r\n    directive.role === StructureRole.Mixed ||\r\n    directive.role === StructureRole.Closing ||\r\n    directive.isSwitchBranch ||\r\n    directive.isSwitchTerminator ||\r\n    directive.isConditionalClose\r\n  );\r\n}\r\n\r\nfunction isMeaningfulBodySibling(node: WrappedNode): boolean {\r\n  if (node.kind === NodeKind.NonOutput) {\r\n    return false;\r\n  }\r\n\r\n  return !(node.kind === NodeKind.Text && fullText(node).trim().length === 0);\r\n}\r\n","import type { Options } from \"prettier\";\nimport type { WrappedNode } from \"../types.js\";\nimport { TokenType } from \"../lexer/types.js\";\nimport { NodeKind } from \"../tree/types.js\";\nimport {\n  isBladeComponentTagName,\n  resolveDirectiveArgSpacingRule,\n  type DirectiveArgSpacingRule,\n} from \"./blade-options.js\";\n\nexport function getDirectiveName(node: WrappedNode): string | null {\n  const start = node.flat.tokenStart;\n  const end = start + node.flat.tokenCount;\n  const tokens = node.buildResult.tokens;\n\n  for (let i = start; i < end; i++) {\n    const token = tokens[i];\n    if (token.type !== TokenType.Directive) continue;\n\n    const raw = node.source.slice(token.start, token.end);\n    return raw.startsWith(\"@\") ? raw.slice(1).toLowerCase() : raw.toLowerCase();\n  }\n\n  return null;\n}\n\nexport function getDirectiveAttributeContextElement(node: WrappedNode): WrappedNode | null {\n  let current = node;\n  while (current.parent?.kind === NodeKind.DirectiveBlock) {\n    current = current.parent;\n  }\n\n  const parent = current.parent;\n  if (!parent || parent.kind !== NodeKind.Element) {\n    return null;\n  }\n\n  return current.end <= parent.openTagEndOffset ? parent : null;\n}\n\nexport function isDirectiveInElementOpenTag(node: WrappedNode): boolean {\n  return getDirectiveAttributeContextElement(node) !== null;\n}\n\nexport function isDirectiveInBladeComponentAttributeContext(\n  node: WrappedNode,\n  options: Options,\n): boolean {\n  const element = getDirectiveAttributeContextElement(node);\n  if (!element) {\n    return false;\n  }\n\n  return isBladeComponentTagName(element.fullName, options);\n}\n\nexport function getEffectiveDirectiveArgSpacingRule(\n  node: WrappedNode,\n  options: Options,\n): DirectiveArgSpacingRule {\n  return resolveDirectiveArgSpacingRule(\n    getDirectiveName(node) ?? \"\",\n    options,\n    isDirectiveInBladeComponentAttributeContext(node, options),\n  );\n}\n","export function trimFinalLineBreak(text: string): string {\n  if (text.endsWith(\"\\r\\n\")) return text.slice(0, -2);\n  if (text.endsWith(\"\\n\")) return text.slice(0, -1);\n  return text;\n}\n\nexport function normalizeLineEndingsToLf(text: string): string {\n  return text.replace(/\\r\\n?/gu, \"\\n\");\n}\n\nexport function safeSerialize(value: unknown): string {\n  try {\n    return JSON.stringify(value) ?? \"\";\n  } catch {\n    return String(value);\n  }\n}\n\nexport function trimTrailingHorizontalWhitespace(value: string): string {\n  return value.replace(/[ \\t]+(?=\\r?\\n|$)/gu, \"\");\n}\n","import type { Doc, Options } from \"prettier\";\nimport { doc } from \"prettier\";\nimport type { WrappedNode } from \"../types.js\";\nimport { TokenType } from \"../lexer/types.js\";\nimport { NodeKind } from \"../tree/types.js\";\nimport { isScriptLikeTag } from \"../node-predicates.js\";\nimport { getEchoSpacingMode } from \"./blade-options.js\";\nimport { replaceEndOfLine } from \"./doc-utils.js\";\nimport { getEchoDelimiters, normalizeMultilineEchoIndentText } from \"./echo-normalization.js\";\nimport { fullText } from \"./utils.js\";\n\nconst { hardline } = doc.builders;\n\nexport function printEcho(node: WrappedNode, options: Options): Doc {\n  const spacing = getEchoSpacingMode(options);\n  if (spacing === \"preserve\") {\n    const raw = isUnterminatedEchoAtEof(node)\n      ? trimTrailingWhitespace(fullText(node))\n      : fullText(node);\n    return shouldNormalizeMultilineEchoIndent(node, options)\n      ? replaceEndOfLine(normalizeMultilineEchoIndentText(node, raw, options), hardline)\n      : raw;\n  }\n\n  const content = getEchoContent(node);\n  if (content === null) {\n    return fullText(node);\n  }\n\n  const trimmed = content.trim();\n  const { open, close } = getEchoDelimiters(node) ?? { open: \"{{\", close: \"}}\" };\n\n  if (trimmed.length === 0) {\n    return spacing === \"tight\" ? `${open}${close}` : `${open} ${close}`;\n  }\n\n  if (trimmed.includes(\"\\n\")) {\n    const raw = `${open}\\n${trimmed}\\n${close}`;\n    return shouldNormalizeMultilineEchoIndent(node, options)\n      ? replaceEndOfLine(normalizeMultilineEchoIndentText(node, raw, options), hardline)\n      : raw;\n  }\n\n  if (spacing === \"tight\") {\n    return `${open}${trimmed}${close}`;\n  }\n\n  return `${open} ${trimmed} ${close}`;\n}\n\nfunction getEchoContent(node: WrappedNode): string | null {\n  const start = node.flat.tokenStart;\n  const end = start + node.flat.tokenCount;\n  const tokens = node.buildResult.tokens;\n  const parts: string[] = [];\n\n  for (let i = start; i < end; i++) {\n    const token = tokens[i];\n    if (token.type === TokenType.EchoContent) {\n      parts.push(node.source.slice(token.start, token.end));\n    }\n  }\n\n  if (parts.length === 0) return null;\n  return parts.join(\"\");\n}\n\nfunction shouldNormalizeMultilineEchoIndent(node: WrappedNode, options: Options): boolean {\n  const raw = fullText(node);\n  return (\n    !!node.parent &&\n    isScriptLikeTag(node.parent, options) &&\n    (raw.includes(\"\\n\") || raw.includes(\"\\r\"))\n  );\n}\n\nfunction isUnterminatedEchoAtEof(node: WrappedNode): boolean {\n  if (node.end !== node.source.length) {\n    return false;\n  }\n\n  const start = node.flat.tokenStart;\n  const end = start + node.flat.tokenCount;\n  const tokens = node.buildResult.tokens;\n  const endType =\n    node.kind === NodeKind.RawEcho\n      ? TokenType.RawEchoEnd\n      : node.kind === NodeKind.TripleEcho\n        ? TokenType.TripleEchoEnd\n        : TokenType.EchoEnd;\n\n  for (let i = start; i < end; i++) {\n    if (tokens[i].type === endType) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction trimTrailingWhitespace(value: string): string {\n  return value.replace(/\\s+$/u, \"\");\n}\n","import type { Options } from \"prettier\";\nimport { normalizeLineEndingsToLf } from \"../string-utils.js\";\nimport { NodeKind } from \"../tree/types.js\";\nimport { dedentString } from \"./utils.js\";\n\nexport interface EchoDelimiters {\n  readonly open: string;\n  readonly close: string;\n}\n\nexport function getEchoDelimiters(node: { kind: unknown }): EchoDelimiters | null {\n  switch (node.kind) {\n    case NodeKind.RawEcho:\n      return { open: \"{!!\", close: \"!!}\" };\n    case NodeKind.TripleEcho:\n      return { open: \"{{{\", close: \"}}}\" };\n    case NodeKind.Echo:\n      return { open: \"{{\", close: \"}}\" };\n    default:\n      return null;\n  }\n}\n\nexport function normalizeMultilineEchoIndentText(\n  node: { kind: unknown },\n  value: string,\n  options: Options,\n): string {\n  if (!value.includes(\"\\n\") && !value.includes(\"\\r\")) {\n    return value;\n  }\n\n  const delimiters = getEchoDelimiters(node);\n  if (delimiters === null) {\n    return value;\n  }\n\n  const normalized = normalizeLineEndingsToLf(value).trim();\n  if (!normalized.startsWith(delimiters.open) || !normalized.endsWith(delimiters.close)) {\n    return value;\n  }\n\n  const inner = stripBoundaryLineBreaks(\n    normalized.slice(delimiters.open.length, normalized.length - delimiters.close.length),\n  ).replace(/\\n[^\\S\\r\\n]*$/u, \"\");\n  if (inner.trim().length === 0) {\n    return `${delimiters.open}\\n${delimiters.close}`;\n  }\n\n  const indentUnit = getIndentUnit(options);\n  const body = dedentString(inner)\n    .split(\"\\n\")\n    .map((line) => (line.trim().length === 0 ? \"\" : `${indentUnit}${line}`))\n    .join(\"\\n\");\n\n  return `${delimiters.open}\\n${body}\\n${delimiters.close}`;\n}\n\nfunction getIndentUnit(options: Options): string {\n  const raw = (options as Record<string, unknown>).tabWidth;\n  const tabWidth = typeof raw === \"number\" && Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : 2;\n  return (options as Record<string, unknown>).useTabs === true ? \"\\t\" : \" \".repeat(tabWidth);\n}\n\nfunction stripBoundaryLineBreaks(value: string): string {\n  let next = value;\n\n  if (next.startsWith(\"\\r\\n\")) {\n    next = next.slice(2);\n  } else if (next.startsWith(\"\\n\")) {\n    next = next.slice(1);\n  }\n\n  if (next.endsWith(\"\\r\\n\")) {\n    next = next.slice(0, -2);\n  } else if (next.endsWith(\"\\n\")) {\n    next = next.slice(0, -1);\n  }\n\n  return next;\n}\n","import type { Doc, Options } from \"prettier\";\nimport type { WrappedNode } from \"../types.js\";\nimport { fullText } from \"./utils.js\";\nimport { isIeConditionalStartComment } from \"./utils.js\";\nimport {\n  printOpeningTagPrefix,\n  printClosingTagSuffix,\n  printOpeningTagStart,\n  printClosingTagEnd,\n} from \"./tag.js\";\nimport { replaceEndOfLine } from \"./doc-utils.js\";\n\n/**\n * Print a comment node.\n * Ported from Prettier's printer-html.js comment case.\n * Wraps in replaceEndOfLine to normalize multi-line comments.\n */\nexport function printComment(node: WrappedNode, options: Options): Doc {\n  if (isIeConditionalStartComment(node)) {\n    return [printOpeningTagStart(node, options), printClosingTagEnd(node, options)];\n  }\n\n  return [\n    printOpeningTagPrefix(node, options),\n    replaceEndOfLine(fullText(node)),\n    printClosingTagSuffix(node, options),\n  ];\n}\n\nexport function printBladeComment(node: WrappedNode): Doc {\n  return fullText(node);\n}\n","import type { Doc, Options } from \"prettier\";\nimport type { WrappedNode } from \"../types.js\";\nimport { printOpeningTagPrefix, printClosingTagSuffix } from \"./tag.js\";\nimport { formatDoctype } from \"./doctype-utils.js\";\n\n/**\n * Print a doctype node.\n * Simple HTML5 doctype (`<!DOCTYPE html>`) is lowercased.\n * Complex doctypes (PUBLIC/SYSTEM) preserve uppercase `<!DOCTYPE`.\n */\nexport function printDoctype(node: WrappedNode, options: Options): Doc {\n  return [\n    printOpeningTagPrefix(node, options),\n    formatDoctype(node.rawText, options),\n    printClosingTagSuffix(node, options),\n  ];\n}\n","import type { AstPath, Doc, Options } from \"prettier\";\nimport { doc } from \"prettier\";\nimport { format as prettierFormat } from \"prettier\";\nimport type { WrappedNode } from \"../types.js\";\nimport { NodeKind } from \"../tree/types.js\";\nimport { trimFinalLineBreak } from \"../string-utils.js\";\nimport { isScriptLikeTag } from \"../node-predicates.js\";\nimport { inferElementParser, getAttrMap, dedentString } from \"./utils.js\";\nimport { isBladeConstructChild, parentContainsBladeSyntax } from \"./blade-syntax.js\";\nimport {\n  printOpeningTag,\n  printClosingTag,\n  printOpeningTagPrefix,\n  printClosingTagSuffix,\n} from \"./tag.js\";\nimport { printEmbedAttribute } from \"./embed/attribute.js\";\nimport {\n  formatDirectiveNodeArgs,\n  formatEchoNode,\n  formatPhpBlockNode,\n  formatPhpTagNode,\n  isPhpFormattingEnabled,\n} from \"./embed/php.js\";\nimport { resolvePhpPlugins } from \"./embed/php-plugin.js\";\nimport {\n  embedMixedRawContentElement,\n  embedUnparsedRawContentElement,\n  shouldBypassStyleParserEmbedding,\n  shouldUseMixedRawContentEmbedding,\n  shouldUseUnparsedRawContentEmbedding,\n} from \"./embed/raw-content.js\";\nimport { resolveEmbeddedParserPlugins } from \"./embed/embedded-parser-plugins.js\";\nimport { fullText } from \"./utils.js\";\nimport { replaceEndOfLine } from \"./doc-utils.js\";\nimport { shouldPreserveInlineIntentElement } from \"./blade-options.js\";\n\nconst { breakParent, group, hardline, indent } = doc.builders;\nconst INLINE_INTENT_EMBED_TAGS = new Set([\"p\", \"svg\"]);\nconst INLINE_INTENT_MIN_LENGTH = 160;\nconst INLINE_INTENT_TRIGGER_WIDTH_MULTIPLIER = 2;\nconst INLINE_INTENT_SUBFORMAT_WIDTH_MULTIPLIER = 8;\nconst INLINE_INTENT_GUARD_FLAG = \"__bladeInlineIntentDelegated\";\n\ntype EmbedPrint = (selector?: string | number | Array<string | number> | AstPath) => Doc;\n\ntype EmbeddedDocPrinter = (\n  textToDoc: (text: string, options: Options) => Promise<Doc>,\n  print: EmbedPrint,\n  path: AstPath,\n  options: Options,\n) => Doc | Promise<Doc | undefined> | undefined;\n\ntype EmbedResult = EmbeddedDocPrinter | null;\n\ntype EmbedHandler = (path: AstPath<WrappedNode>, options: Options) => EmbedResult;\n\nfunction handleElementEmbed(path: AstPath<WrappedNode>, options: Options): EmbedResult {\n  const node = path.node;\n\n  if (shouldUseInlineIntentElementEmbed(node, options)) {\n    return async (\n      _textToDoc: (text: string, options: Options) => Promise<Doc>,\n      _print: EmbedPrint,\n    ) => {\n      try {\n        const delegated = await prettierFormat(\n          fullText(node),\n          createInlineIntentSubformatOptions(options),\n        );\n        return replaceEndOfLine(trimFinalLineBreak(delegated), hardline);\n      } catch {\n        return fullText(node);\n      }\n    };\n  }\n\n  // Script-like tags are normally embedded from their text child.\n  // Our permissive lexer may split style content into directives/text;\n  // in that case, embed from raw element content for parity.\n  if (isScriptLikeTag(node, options)) {\n    if (shouldUseUnparsedRawContentEmbedding(node, options)) {\n      return (_textToDoc: (text: string, options: Options) => Promise<Doc>, print: EmbedPrint) => {\n        return embedUnparsedRawContentElement(path, options, print);\n      };\n    }\n\n    if (shouldUseMixedRawContentEmbedding(node, options)) {\n      return async (\n        textToDoc: (text: string, options: Options) => Promise<Doc>,\n        print: EmbedPrint,\n      ) => {\n        return (\n          (await embedMixedRawContentElement(\n            path as AstPath<WrappedNode>,\n            options,\n            textToDoc,\n            print,\n          )) ?? fullText(node)\n        );\n      };\n    }\n\n    const parser = inferElementParser(node, options);\n    if (\n      parser &&\n      node.tagName === \"style\" &&\n      node.children.some((child) => child.kind !== NodeKind.Text)\n    ) {\n      // CSS embedding is unstable when Blade/PHP constructs appear in style\n      // content. Fall back to native node printing in that case.\n      if (node.children.some((child) => isBladeConstructChild(child, \"style\"))) {\n        return null;\n      }\n      return async (\n        textToDoc: (text: string, options: Options) => Promise<Doc>,\n        print: EmbedPrint,\n      ) => {\n        const rawValue = getRawElementContent(node);\n        const value =\n          parser === \"markdown\" ? dedentString(rawValue.replace(/^[^\\S\\n]*\\n/, \"\")) : rawValue;\n\n        const plugins = await resolveEmbeddedParserPlugins(options, parser);\n\n        const textToDocOptions: Record<string, unknown> = {\n          parser,\n          __embeddedInHtml: true,\n          plugins,\n        };\n\n        const docContent = await textToDoc(value, textToDocOptions as Options);\n        const isEmpty = /^\\s*$/.test(rawValue) || docContent === \"\";\n\n        return [\n          printOpeningTagPrefix(node, options),\n          group(\n            printOpeningTag(\n              path as AstPath<WrappedNode>,\n              options,\n              print as unknown as (path: AstPath<WrappedNode>) => Doc,\n            ),\n          ),\n          isEmpty ? \"\" : indent([hardline, docContent]),\n          isEmpty ? \"\" : hardline,\n          printClosingTag(node, options),\n          printClosingTagSuffix(node, options),\n        ];\n      };\n    }\n    return null;\n  }\n\n  // Vue non-HTML blocks would be handled here but not applicable for Blade.\n  return null;\n}\n\nfunction handleTextEmbed(path: AstPath<WrappedNode>, options: Options): EmbedResult {\n  const node = path.node;\n  if (node.parent && isScriptLikeTag(node.parent, options)) {\n    if (shouldBypassStyleParserEmbedding(node.parent, options)) {\n      return null;\n    }\n\n    const parser = inferElementParser(node.parent, options);\n    if (parser) {\n      if (parser === \"css\" && parentContainsBladeSyntax(node.parent, \"style\")) {\n        return null;\n      }\n\n      return async (\n        textToDoc: (text: string, options: Options) => Promise<Doc>,\n        _print: EmbedPrint,\n      ) => {\n        // Get raw text content (rawText has the text between tags)\n        const rawValue = node.rawText;\n        const value =\n          parser === \"markdown\" ? dedentString(rawValue.replace(/^[^\\S\\n]*\\n/, \"\")) : rawValue;\n\n        const plugins = await resolveEmbeddedParserPlugins(options, parser);\n\n        const textToDocOptions: Record<string, unknown> = {\n          parser,\n          __embeddedInHtml: true,\n          plugins,\n        };\n\n        // For babel in HTML, determine source type from parent's type attribute\n        if (parser === \"babel\") {\n          let sourceType = \"script\";\n          const attrMap = getAttrMap(node.parent!);\n          if (\n            attrMap.type === \"module\" ||\n            ((attrMap.type === \"text/babel\" || attrMap.type === \"text/jsx\") &&\n              attrMap[\"data-type\"] === \"module\")\n          ) {\n            sourceType = \"module\";\n          }\n          textToDocOptions.__babelSourceType = sourceType;\n        }\n\n        return [\n          breakParent,\n          printOpeningTagPrefix(node, options),\n          await textToDoc(value, textToDocOptions as Options),\n          printClosingTagSuffix(node, options),\n        ];\n      };\n    }\n  }\n  return null;\n}\n\nfunction handleAttributeEmbed(path: AstPath<WrappedNode>, options: Options): EmbedResult {\n  return printEmbedAttribute(path as AstPath<WrappedNode>, options);\n}\n\nfunction handleEchoEmbed(path: AstPath<WrappedNode>, options: Options): EmbedResult {\n  if (!isPhpFormattingEnabled(options)) return null;\n\n  const node = path.node;\n  return async (\n    _textToDoc: (text: string, options: Options) => Promise<Doc>,\n    print: EmbedPrint,\n  ) => {\n    const formatted = await formatEchoNode(node, options);\n    if (formatted === null) {\n      return print(path);\n    }\n    const rendered = replaceEndOfLine(formatted, hardline);\n    return [printOpeningTagPrefix(node, options), rendered, printClosingTagSuffix(node, options)];\n  };\n}\n\nfunction handleDirectiveEmbed(path: AstPath<WrappedNode>, options: Options): EmbedResult {\n  if (!isPhpFormattingEnabled(options)) return null;\n\n  const node = path.node;\n  return async (\n    _textToDoc: (text: string, options: Options) => Promise<Doc>,\n    print: EmbedPrint,\n  ) => {\n    const phpPlugins = await resolvePhpPlugins(options);\n    if (!phpPlugins) {\n      // No PHP parser available: fall back to the normal directive printer\n      // so Blade spacing options still apply.\n      return print(path);\n    }\n\n    const formatted = await formatDirectiveNodeArgs(node, options);\n    if (formatted === null) {\n      return print(path);\n    }\n    return replaceEndOfLine(formatted, hardline);\n  };\n}\n\nfunction handlePhpBlockEmbed(path: AstPath<WrappedNode>, options: Options): EmbedResult {\n  if (!isPhpFormattingEnabled(options)) return null;\n\n  const node = path.node;\n  return async (\n    _textToDoc: (text: string, options: Options) => Promise<Doc>,\n    print: EmbedPrint,\n  ) => {\n    const formatted = await formatPhpBlockNode(node, options);\n    if (formatted === null) {\n      return print(path);\n    }\n    const rendered = replaceEndOfLine(formatted, hardline);\n    return [printOpeningTagPrefix(node, options), rendered, printClosingTagSuffix(node, options)];\n  };\n}\n\nfunction handlePhpTagEmbed(path: AstPath<WrappedNode>, options: Options): EmbedResult {\n  if (!isPhpFormattingEnabled(options)) return null;\n\n  const node = path.node;\n  return async (\n    _textToDoc: (text: string, options: Options) => Promise<Doc>,\n    print: EmbedPrint,\n  ) => {\n    const formatted = await formatPhpTagNode(node, options);\n    if (formatted === null) {\n      return print(path);\n    }\n    const rendered = replaceEndOfLine(formatted, hardline);\n    return [printOpeningTagPrefix(node, options), rendered, printClosingTagSuffix(node, options)];\n  };\n}\n\nconst EMBED_HANDLERS: Partial<Record<NodeKind, EmbedHandler>> = {\n  [NodeKind.Element]: handleElementEmbed,\n  [NodeKind.Text]: handleTextEmbed,\n  [NodeKind.Attribute]: handleAttributeEmbed,\n  [NodeKind.JsxAttribute]: handleAttributeEmbed,\n  [NodeKind.Echo]: handleEchoEmbed,\n  [NodeKind.RawEcho]: handleEchoEmbed,\n  [NodeKind.TripleEcho]: handleEchoEmbed,\n  [NodeKind.Directive]: handleDirectiveEmbed,\n  [NodeKind.PhpBlock]: handlePhpBlockEmbed,\n  [NodeKind.PhpTag]: handlePhpTagEmbed,\n};\n\nexport function embed(path: AstPath, options: Options): EmbedResult {\n  const node = path.node as WrappedNode;\n  const handler = EMBED_HANDLERS[node.kind as NodeKind];\n  if (!handler) return null;\n  return handler(path as AstPath<WrappedNode>, options);\n}\n\nfunction getRawElementContent(node: WrappedNode): string {\n  if (!node.hasClosingTag) return \"\";\n  if (node.openTagEndOffset > 0 && node.closingTagStartOffset > node.openTagEndOffset) {\n    return node.source.slice(node.openTagEndOffset, node.closingTagStartOffset);\n  }\n  if (node.children.length === 0) return \"\";\n  const start = node.children[0].start;\n  const end = node.children[node.children.length - 1].end;\n  return node.source.slice(start, end);\n}\n\nfunction shouldUseInlineIntentElementEmbed(node: WrappedNode, options: Options): boolean {\n  if (node.kind !== NodeKind.Element) return false;\n  if (!node.hasClosingTag) return false;\n  if ((options as Record<string, unknown>)[INLINE_INTENT_GUARD_FLAG]) {\n    return false;\n  }\n  if (!INLINE_INTENT_EMBED_TAGS.has(node.tagName)) return false;\n  if (!shouldPreserveInlineIntentElement(options, node.tagName, node.namespace)) {\n    return false;\n  }\n\n  const source = fullText(node).trimEnd();\n  if (source.length < getInlineIntentLengthThreshold(options)) return false;\n  if (source.includes(\"\\n\") || source.includes(\"\\r\")) return false;\n\n  return true;\n}\n\nfunction getInlineIntentLengthThreshold(options: Options): number {\n  const candidate = Number(options.printWidth);\n  if (!Number.isFinite(candidate) || candidate <= 0) {\n    return INLINE_INTENT_MIN_LENGTH;\n  }\n  return Math.max(\n    INLINE_INTENT_MIN_LENGTH,\n    Math.floor(candidate * INLINE_INTENT_TRIGGER_WIDTH_MULTIPLIER),\n  );\n}\n\nfunction createInlineIntentSubformatOptions(options: Options): Options {\n  const base = { ...(options as Record<string, unknown>) };\n  const printWidth = Number(options.printWidth);\n  const computedPrintWidth =\n    Number.isFinite(printWidth) && printWidth > 0\n      ? Math.max(200, Math.floor(printWidth * INLINE_INTENT_SUBFORMAT_WIDTH_MULTIPLIER))\n      : 200;\n\n  return {\n    ...base,\n    parser: \"blade\",\n    printWidth: computedPrintWidth,\n    [INLINE_INTENT_GUARD_FLAG]: true,\n  } as Options;\n}\n","import type { AstPath, Doc, Options } from \"prettier\";\nimport { doc } from \"prettier\";\nimport { format as prettierFormat } from \"prettier\";\nimport parseSrcset from \"@prettier/parse-srcset\";\nimport type { WrappedNode } from \"../../types.js\";\nimport { normalizeLineEndingsToLf } from \"../../string-utils.js\";\nimport { isHtmlEventAttribute } from \"../../frontend-attribute-names.js\";\nimport { NodeKind } from \"../../tree/types.js\";\nimport { formatAttributeNameForPrint } from \"../attribute-name.js\";\nimport {\n  fullText,\n  getStaticAttributeNameLower,\n  getAttributeNameRaw,\n  isStaticAttributeName,\n  isStaticAttributeValue,\n  getUnescapedAttributeValue,\n  normalizeAttributeName,\n} from \"../utils.js\";\nimport { formatAttributeValue, printExpand } from \"./utilities.js\";\nimport { alpineAttributePrinters } from \"./alpine-attributes.js\";\nimport { sortClassNamesWithTailwind } from \"./tailwind.js\";\nimport { resolveEmbeddedParserPlugins } from \"./embedded-parser-plugins.js\";\nimport { resolvePhpPlugins } from \"./php-plugin.js\";\nimport { isPhpFormattingEnabled } from \"./php.js\";\nimport { isBladeComponentTagName, shouldPreserveInlineIntentAttributes } from \"../blade-options.js\";\n\nconst { group, join, line, ifBreak } = doc.builders;\n\nfunction hasBladeValueSyntax(node: WrappedNode): boolean {\n  const text = fullText(node);\n  // {{ ... }}, {{-- comment --}}, and {!! raw !!} all start with these prefixes.\n  return text.includes(\"{{\") || text.includes(\"{!!\");\n}\n\nfunction isSyntaxError(error: unknown): boolean {\n  return (\n    typeof error === \"object\" &&\n    error !== null &&\n    \"cause\" in error &&\n    typeof (error as { cause?: unknown }).cause === \"object\" &&\n    (error as { cause?: { code?: string } }).cause?.code === \"BABEL_PARSER_SYNTAX_ERROR\"\n  );\n}\n\nconst VUE_BIND_PREFIX = \"v-bind:\";\n\nfunction isColonBoundAttributeName(name: string): boolean {\n  const trimmed = name.trimStart();\n  return trimmed.startsWith(\":\") || trimmed.toLowerCase().startsWith(VUE_BIND_PREFIX);\n}\n\nfunction isBladeComponentElement(node: WrappedNode | null, options: Options): boolean {\n  if (!node || node.kind !== NodeKind.Element) return false;\n  return isBladeComponentTagName(node.fullName, options);\n}\n\nfunction createPhpAttributeOptions(options: Options, plugins: unknown[]): Options {\n  const baseOptions = {\n    ...(options as Record<string, unknown>),\n  };\n\n  delete baseOptions.parser;\n  delete baseOptions.parentParser;\n  delete baseOptions.plugins;\n  delete baseOptions.rangeStart;\n  delete baseOptions.rangeEnd;\n  delete baseOptions.cursorOffset;\n\n  const runtime = globalThis as Record<string, unknown>;\n  const isBrowserRuntime = typeof runtime.window === \"object\";\n  const phpVersion = baseOptions.phpVersion;\n  if (\n    isBrowserRuntime &&\n    (phpVersion === undefined ||\n      phpVersion === null ||\n      phpVersion === \"auto\" ||\n      phpVersion === \"composer\")\n  ) {\n    baseOptions.phpVersion = \"8.4\";\n  }\n\n  // The bound attribute wrapper is always \"...\", so prefer single quotes inside\n  // the PHP expression to minimize &quot; escaping of nested literals.\n  baseOptions.singleQuote = true;\n\n  return {\n    ...baseOptions,\n    parser: \"php\",\n    plugins,\n  } as Options;\n}\n\nfunction wrapBoundAttributeExpression(value: string): string {\n  // Keep the wrapper light so array literals preserve their original shape.\n  return `<?php __blade_bound_attr__(${value});`;\n}\n\nfunction extractWrapperCallArgument(formatted: string): string | null {\n  const wrapperIndex = formatted.indexOf(\"__blade_bound_attr__\");\n  if (wrapperIndex < 0) return null;\n\n  const openIndex = formatted.indexOf(\"(\", wrapperIndex);\n  if (openIndex < 0) return null;\n\n  let depth = 0;\n  let inSingle = false;\n  let inDouble = false;\n  let inLineComment = false;\n  let inBlockComment = false;\n  let escape = false;\n\n  for (let i = openIndex; i < formatted.length; i++) {\n    const char = formatted[i];\n    const next = formatted[i + 1] ?? \"\";\n\n    if (inLineComment) {\n      if (char === \"\\n\") {\n        inLineComment = false;\n      }\n      continue;\n    }\n\n    if (inBlockComment) {\n      if (char === \"*\" && next === \"/\") {\n        inBlockComment = false;\n        i += 1;\n      }\n      continue;\n    }\n\n    if (inSingle) {\n      if (escape) {\n        escape = false;\n        continue;\n      }\n      if (char === \"\\\\\") {\n        escape = true;\n        continue;\n      }\n      if (char === \"'\") {\n        inSingle = false;\n      }\n      continue;\n    }\n\n    if (inDouble) {\n      if (escape) {\n        escape = false;\n        continue;\n      }\n      if (char === \"\\\\\") {\n        escape = true;\n        continue;\n      }\n      if (char === '\"') {\n        inDouble = false;\n      }\n      continue;\n    }\n\n    if (char === \"/\" && next === \"/\") {\n      inLineComment = true;\n      i += 1;\n      continue;\n    }\n    if (char === \"#\") {\n      inLineComment = true;\n      continue;\n    }\n    if (char === \"/\" && next === \"*\") {\n      inBlockComment = true;\n      i += 1;\n      continue;\n    }\n\n    if (char === \"'\") {\n      inSingle = true;\n      continue;\n    }\n    if (char === '\"') {\n      inDouble = true;\n      continue;\n    }\n\n    if (char === \"(\") {\n      depth += 1;\n      continue;\n    }\n\n    if (char === \")\") {\n      depth -= 1;\n      if (depth === 0) {\n        return formatted.slice(openIndex + 1, i);\n      }\n    }\n  }\n\n  return null;\n}\n\nfunction dedentMultiline(text: string): string {\n  const normalized = normalizeLineEndingsToLf(text);\n  if (!normalized.includes(\"\\n\")) return normalized.trim();\n  const lines = normalized.trim().split(\"\\n\");\n  let minIndent = Number.POSITIVE_INFINITY;\n  for (const line of lines) {\n    if (line.trim().length === 0) continue;\n    const indent = line.match(/^[\\t ]*/u)?.[0].length ?? 0;\n    if (indent < minIndent) {\n      minIndent = indent;\n    }\n  }\n  if (!Number.isFinite(minIndent) || minIndent <= 0) {\n    return lines.join(\"\\n\");\n  }\n  return lines\n    .map((line) => (line.trim().length === 0 ? \"\" : line.slice(Math.min(minIndent, line.length))))\n    .join(\"\\n\");\n}\n\nfunction indentMultilineRelativeToAttributeName(value: string, attributeName: string): string {\n  if (!value.includes(\"\\n\")) return value;\n\n  const lines = value.split(\"\\n\");\n  const nonEmpty = lines.map((line) => line.trim()).filter(Boolean);\n  const first = nonEmpty[0] ?? \"\";\n  const last = nonEmpty[nonEmpty.length - 1] ?? \"\";\n\n  // Only reindent stable multiline payloads that benefit from attribute-relative alignment.\n  const isWrappedMethodCall = first.includes(\"->\") && first.endsWith(\"(\") && last === \")\";\n  const isBracketWrapped = first === \"[\" && last === \"]\";\n  const shouldApplyRelativeIndent = isWrappedMethodCall || isBracketWrapped;\n  if (!shouldApplyRelativeIndent) {\n    return value;\n  }\n\n  const continuationLines = lines.slice(1).filter((line) => line.trim().length > 0);\n  if (continuationLines.length > 0) {\n    const minContinuationIndent = Math.min(\n      ...continuationLines.map((line) => line.match(/^[\\t ]*/u)?.[0].length ?? 0),\n    );\n\n    // Strip shared continuation indentation so repeated passes do not deepen indentation.\n    if (minContinuationIndent > 0) {\n      for (let i = 1; i < lines.length; i++) {\n        const line = lines[i];\n        if (line.trim().length === 0) continue;\n        lines[i] = line.slice(Math.min(minContinuationIndent, line.length));\n      }\n    }\n  }\n\n  const continuationIndentSize = isBracketWrapped\n    ? Math.max(2, Math.floor(attributeName.length / 2))\n    : attributeName.length;\n  const continuationIndent = \" \".repeat(continuationIndentSize);\n  const bracketClosingIndent = isBracketWrapped\n    ? \" \".repeat(Math.max(4, Math.floor(attributeName.length / 3)))\n    : continuationIndent;\n\n  return lines\n    .map((line, index) => {\n      if (index === 0) return line;\n      if (line.trim().length === 0) return \"\";\n      if (isBracketWrapped && line.trim() === \"]\") {\n        return `${bracketClosingIndent}${line.trimStart()}`;\n      }\n      return `${continuationIndent}${line}`;\n    })\n    .join(\"\\n\");\n}\n\nasync function formatAsPhpBoundAttributeValue(\n  value: string,\n  options: Options,\n): Promise<string | undefined> {\n  const plugins = await resolvePhpPlugins(options);\n  if (!plugins) return undefined;\n\n  try {\n    const formatted = await prettierFormat(\n      wrapBoundAttributeExpression(value),\n      createPhpAttributeOptions(options, plugins),\n    );\n    const extracted = extractWrapperCallArgument(normalizeLineEndingsToLf(formatted));\n    if (extracted === null) return undefined;\n    const normalized = dedentMultiline(extracted)\n      // The wrapper call can introduce a top-level trailing comma; drop it when unwrapping.\n      .replace(/,\\s*$/u, \"\")\n      .replace(/;\\s*$/u, \"\");\n    return normalized || undefined;\n  } catch {\n    return undefined;\n  }\n}\n\ntype EmbedPrint = (selector?: string | number | Array<string | number> | AstPath) => Doc;\n\ntype AttrPredicate = (path: AstPath<WrappedNode>, options: Options) => boolean;\ntype AttrPrint = (\n  textToDoc: (text: string, options: Options) => Promise<Doc>,\n  print: EmbedPrint,\n  path: AstPath<WrappedNode>,\n  options: Options,\n) => Doc | Promise<Doc | undefined>;\n\ninterface AttrPrinter {\n  test: AttrPredicate;\n  print: AttrPrint;\n}\n\nconst isSrcset: AttrPredicate = (path) => {\n  const node = path.node;\n  const name = getStaticAttributeNameLower(node);\n  if (name === null) return false;\n  if (!isStaticAttributeValue(node)) return false;\n  return (\n    name === \"srcset\" &&\n    node.parent !== null &&\n    (node.parent.fullName.toLowerCase() === \"img\" ||\n      node.parent.fullName.toLowerCase() === \"source\")\n  );\n};\n\nconst SRCSET_UNITS = {\n  width: \"w\",\n  height: \"h\",\n  density: \"x\",\n} as const;\n\ntype SrcsetDescriptorType = keyof typeof SRCSET_UNITS;\n\ntype SrcsetCandidate = {\n  source: { value: string };\n} & Partial<Record<SrcsetDescriptorType, { value: number }>>;\n\nconst printSrcset: AttrPrint = (_textToDoc, _print, path) => {\n  const value = getUnescapedAttributeValue(path.node);\n  const srcset = parseSrcset(value) as SrcsetCandidate[];\n\n  if (srcset.length === 0) return value;\n\n  const srcsetTypes = Object.keys(SRCSET_UNITS) as SrcsetDescriptorType[];\n  const types = srcsetTypes.filter((type) =>\n    srcset.some((candidate) => Object.hasOwn(candidate, type)),\n  );\n\n  if (types.length > 1) {\n    throw new Error(\"Mixed descriptor in srcset is not supported\");\n  }\n\n  const [key] = types;\n  const unit = key ? SRCSET_UNITS[key] : \"\";\n\n  const urls = srcset.map((candidate) => candidate.source.value);\n  const maxUrlLength = Math.max(...urls.map((u) => u.length));\n\n  const descriptors = srcset.map((candidate) =>\n    key && candidate[key] ? String(candidate[key].value) : \"\",\n  );\n  const descriptorLeftLengths = descriptors.map((d) => {\n    const idx = d.indexOf(\".\");\n    return idx === -1 ? d.length : idx;\n  });\n  const maxDescriptorLeftLength = Math.max(...descriptorLeftLengths);\n\n  return printExpand(\n    join(\n      [\",\", line],\n      urls.map((url, index) => {\n        const parts: Doc[] = [url];\n        const descriptor = descriptors[index];\n        if (descriptor) {\n          const urlPadding = maxUrlLength - url.length + 1;\n          const descriptorPadding = maxDescriptorLeftLength - descriptorLeftLengths[index];\n          const alignment = \" \".repeat(urlPadding + descriptorPadding);\n          parts.push(ifBreak(alignment, \" \"), descriptor + unit);\n        }\n        return parts;\n      }),\n    ),\n  );\n};\n\nconst isStyle: AttrPredicate = (path, options) => {\n  const node = path.node;\n  const name = getStaticAttributeNameLower(node);\n  if (!isStaticAttributeValue(node)) return false;\n  return (\n    name === \"style\" &&\n    !(options as Record<string, unknown>).parentParser &&\n    !hasBladeValueSyntax(node)\n  );\n};\n\nfunction shouldPreserveInlineSvgStyleAttribute(\n  path: AstPath<WrappedNode>,\n  options: Options,\n): boolean {\n  const node = path.node;\n  const parent = node.parent;\n  if (!parent || parent.kind !== NodeKind.Element) return false;\n  if (parent.namespace !== \"svg\") return false;\n  if (!shouldPreserveInlineIntentAttributes(options, parent.tagName, parent.namespace)) {\n    return false;\n  }\n  if (fullText(parent).includes(\"\\n\") || fullText(parent).includes(\"\\r\")) return false;\n  if (fullText(node).includes(\"\\n\") || fullText(node).includes(\"\\r\")) return false;\n  return true;\n}\n\nconst printStyle: AttrPrint = async (textToDoc, _print, path, options) => {\n  const value = getUnescapedAttributeValue(path.node);\n  if (shouldPreserveInlineSvgStyleAttribute(path, options)) {\n    return value;\n  }\n  const plugins = await resolveEmbeddedParserPlugins(options, \"css\");\n  return printExpand(\n    await textToDoc(value, {\n      parser: \"css\",\n      __isHTMLStyleAttribute: true,\n      plugins,\n    } as Options),\n  );\n};\n\nconst isEventHandler: AttrPredicate = (path, options) => {\n  const node = path.node;\n  const name = getStaticAttributeNameLower(node);\n  if (!name) return false;\n  if (!isStaticAttributeValue(node)) return false;\n  return (\n    isHtmlEventAttribute(name) &&\n    !(options as Record<string, unknown>).parentParser &&\n    !hasBladeValueSyntax(node)\n  );\n};\n\nconst printEventHandler: AttrPrint = async (textToDoc, _print, path, options) => {\n  const value = getUnescapedAttributeValue(path.node);\n  const plugins = await resolveEmbeddedParserPlugins(options, \"babel\");\n  return formatAttributeValue(\n    value,\n    textToDoc,\n    {\n      parser: \"babel\",\n      __isHtmlInlineEventHandler: true,\n      plugins,\n    },\n    () => false,\n  );\n};\n\n// - Blade component tags: treat :attr values as PHP\n// - Non-Blade tags: treat :attr values as JS expressions\n\nconst isColonBoundAttribute: AttrPredicate = (path, options) => {\n  if ((options as Record<string, unknown>).parentParser) return false;\n\n  const node = path.node;\n  if (!isStaticAttributeName(node)) return false;\n  if (!isStaticAttributeValue(node)) return false;\n  if (hasBladeValueSyntax(node)) return false;\n\n  const name = getAttributeNameRaw(node);\n  if (!name) return false;\n  return isColonBoundAttributeName(name);\n};\n\nconst printColonBoundAttribute: AttrPrint = async (textToDoc, _print, path, options) => {\n  const node = path.node;\n  if (!isStaticAttributeName(node) || !isStaticAttributeValue(node)) {\n    return undefined;\n  }\n\n  const name = getAttributeNameRaw(node);\n  if (!name || !isColonBoundAttributeName(name)) {\n    return undefined;\n  }\n\n  const value = getUnescapedAttributeValue(node);\n  if (!value) return undefined;\n\n  if (isBladeComponentElement(node.parent, options)) {\n    if (!isPhpFormattingEnabled(options)) {\n      return undefined;\n    }\n\n    const formattedValue = await formatAsPhpBoundAttributeValue(value, options);\n    if (!formattedValue) return undefined;\n\n    const normalizedName = normalizeAttributeName(name, node.parent);\n    const indentedValue = indentMultilineRelativeToAttributeName(formattedValue, normalizedName);\n    return indentedValue.includes(\"\\n\") ? printExpand(indentedValue) : indentedValue;\n  }\n\n  try {\n    return await formatAttributeValue(value, textToDoc, { parser: \"__js_expression\" });\n  } catch (error) {\n    if (!isSyntaxError(error)) {\n      throw error;\n    }\n\n    try {\n      return await formatAttributeValue(value, textToDoc, {\n        parser: \"babel\",\n        __isHtmlInlineEventHandler: true,\n      });\n    } catch (fallbackError) {\n      if (!isSyntaxError(fallbackError)) {\n        throw fallbackError;\n      }\n      return undefined;\n    }\n  }\n};\n\nconst isClassNames: AttrPredicate = (path, options) => {\n  const node = path.node;\n  const name = getStaticAttributeNameLower(node);\n  if (!isStaticAttributeValue(node)) return false;\n  return (\n    (name === \"class\" || name === \"classname\") &&\n    !(options as Record<string, unknown>).parentParser &&\n    !hasBladeValueSyntax(node)\n  );\n};\n\nconst printClassNames: AttrPrint = async (_textToDoc, _print, path, options) => {\n  const value = getUnescapedAttributeValue(path.node);\n  const tailwindSortedValue = await sortClassNamesWithTailwind(value, options);\n\n  if (tailwindSortedValue !== null) {\n    return tailwindSortedValue;\n  }\n\n  return value.trim().split(/\\s+/).join(\" \");\n};\n\nconst isPermissionsPolicy: AttrPredicate = (path, options) => {\n  const node = path.node;\n  const name = getStaticAttributeNameLower(node);\n  if (!isStaticAttributeValue(node)) return false;\n  return (\n    name === \"allow\" &&\n    !(options as Record<string, unknown>).parentParser &&\n    node.parent !== null &&\n    node.parent.fullName.toLowerCase() === \"iframe\" &&\n    !hasBladeValueSyntax(node)\n  );\n};\n\nfunction parsePermissionsPolicy(value: string): Array<{ name: string; value: string[] }> {\n  return value\n    .split(\";\")\n    .map((s) => s.trim())\n    .filter(Boolean)\n    .map((directive) => {\n      const parts = directive.split(/\\s+/);\n      return { name: parts[0], value: parts.slice(1) };\n    });\n}\n\nconst printPermissionsPolicy: AttrPrint = (_textToDoc, _print, path) => {\n  const value = getUnescapedAttributeValue(path.node);\n  const directives = parsePermissionsPolicy(value);\n\n  if (directives.length === 0) return [\"\"];\n\n  return printExpand(\n    directives.map(({ name, value: vals }, index) => [\n      [name, ...vals].join(\" \"),\n      index === directives.length - 1 ? ifBreak(\";\") : [\";\", line],\n    ]),\n  );\n};\n\ninterface RawPrinter {\n  test: AttrPredicate;\n  print: AttrPrint;\n  allowSingleQuoteWrapper?: boolean;\n}\n\nconst rawPrinters: RawPrinter[] = [\n  { test: isSrcset, print: printSrcset },\n  { test: isStyle, print: printStyle },\n  { test: isEventHandler, print: printEventHandler },\n  {\n    test: isColonBoundAttribute,\n    print: printColonBoundAttribute,\n    allowSingleQuoteWrapper: true,\n  },\n  { test: isClassNames, print: printClassNames },\n  { test: isPermissionsPolicy, print: printPermissionsPolicy },\n  ...alpineAttributePrinters,\n];\n\nfunction collectDocStringContent(d: Doc): string {\n  let result = \"\";\n  doc.utils.mapDoc(d, (sub) => {\n    if (typeof sub === \"string\") {\n      result += sub;\n    }\n    return sub;\n  });\n  return result;\n}\n\n/**\n * Wrap a value printer to handle quoting and &quot; escaping.\n */\nfunction createAttributePrinter(\n  printValue: AttrPrint,\n  { allowSingleQuoteWrapper = false }: { allowSingleQuoteWrapper?: boolean } = {},\n): AttrPrint {\n  return async (textToDoc, print, path, options) => {\n    let valueDoc = await printValue(textToDoc, print, path, options);\n    if (!valueDoc) return undefined;\n\n    const rawName = formatAttributeNameForPrint(path.node, options);\n    const name = isStaticAttributeName(path.node)\n      ? normalizeAttributeName(rawName, path.node.parent)\n      : rawName;\n\n    // Swap outer wrapper to single quotes when the value contains double\n    // quotes but no single quotes (e.g. PHP interpolated strings like\n    // \"Hello $name\"). Keeps output readable instead of escaping to &quot;.\n    if (allowSingleQuoteWrapper) {\n      const content = collectDocStringContent(valueDoc as Doc);\n      if (content.includes('\"') && !content.includes(\"'\")) {\n        return [name, \"='\", group(valueDoc as Doc), \"'\"];\n      }\n    }\n\n    // Escape double quotes in string parts of the doc\n    valueDoc = doc.utils.mapDoc(valueDoc as Doc, (d) =>\n      typeof d === \"string\" ? d.replaceAll('\"', \"&quot;\") : d,\n    );\n\n    return [name, '=\"', group(valueDoc), '\"'];\n  };\n}\n\nconst printers: AttrPrinter[] = rawPrinters.map(({ test, print: p, allowSingleQuoteWrapper }) => ({\n  test,\n  print: createAttributePrinter(p, { allowSingleQuoteWrapper }),\n}));\n\n/**\n * Check if an attribute should use embedded formatting.\n * Returns a print function or null.\n */\nexport function printEmbedAttribute(\n  path: AstPath<WrappedNode>,\n  options: Options,\n):\n  | ((\n      textToDoc: (text: string, options: Options) => Promise<Doc>,\n      print: EmbedPrint,\n      path: AstPath,\n      options: Options,\n    ) => Promise<Doc | undefined> | Doc | undefined)\n  | null {\n  const node = path.node;\n  const value = getUnescapedAttributeValue(node);\n\n  if (!value) return null;\n\n  // Find the first matching printer\n  const match = printers.find(({ test }) => test(path, options));\n  if (!match) return null;\n\n  // Wrap to match Prettier's embed callback signature\n  return (textToDoc, print, cbPath, cbOptions) =>\n    match.print(textToDoc, print, cbPath as AstPath<WrappedNode>, cbOptions);\n}\n","import type { Doc, Options } from \"prettier\";\nimport { doc } from \"prettier\";\n\nconst { group, indent, softline } = doc.builders;\n\n/**\n * Wrap a doc in indent + softline for expanded attribute values.\n */\nexport function printExpand(content: Doc, canHaveTrailingWhitespace = true): Doc {\n  return [indent([softline, content]), canHaveTrailingWhitespace ? softline : \"\"];\n}\n\n/**\n * Determine if a JS expression AST should be hugged (kept on one line).\n */\nexport function shouldHugJsExpression(\n  ast: Record<string, unknown>,\n  options: Record<string, unknown>,\n): boolean {\n  const rootNode =\n    ast.type === \"NGRoot\"\n      ? (ast.node as Record<string, unknown>)?.type === \"NGMicrosyntax\" &&\n        Array.isArray((ast.node as Record<string, unknown>)?.body) &&\n        ((ast.node as Record<string, unknown>).body as unknown[]).length === 1 &&\n        ((ast.node as Record<string, unknown>).body as Record<string, unknown>[])[0]?.type ===\n          \"NGMicrosyntaxExpression\"\n        ? (\n            ((ast.node as Record<string, unknown>).body as Record<string, unknown>[])[0] as Record<\n              string,\n              unknown\n            >\n          ).expression\n        : ast.node\n      : ast.type === \"JsExpressionRoot\"\n        ? ast.node\n        : ast;\n\n  if (!rootNode || typeof rootNode !== \"object\") return false;\n\n  const root = rootNode as Record<string, unknown>;\n  return (\n    root.type === \"ObjectExpression\" ||\n    root.type === \"ArrayExpression\" ||\n    ((options.parser === \"__vue_expression\" ||\n      options.parser === \"__vue_ts_expression\" ||\n      options.parser === \"__ng_binding\" ||\n      options.parser === \"__ng_directive\") &&\n      (root.type === \"TemplateLiteral\" || root.type === \"StringLiteral\"))\n  );\n}\n\n/**\n * Format an attribute value using a sub-parser.\n */\nexport async function formatAttributeValue(\n  code: string,\n  textToDoc: (text: string, options: Options) => Promise<Doc>,\n  options: Record<string, unknown>,\n  shouldHugFn?: (ast: Record<string, unknown>, options: Record<string, unknown>) => boolean,\n): Promise<Doc> {\n  const textToDocOptions: Record<string, unknown> = {\n    __isInHtmlAttribute: true,\n    __embeddedInHtml: true,\n    ...options,\n  };\n\n  let shouldHug = true;\n  if (shouldHugFn) {\n    textToDocOptions.__onHtmlBindingRoot = (\n      ast: Record<string, unknown>,\n      opts: Record<string, unknown>,\n    ) => {\n      shouldHug = shouldHugFn(ast, opts);\n    };\n  }\n\n  const result = await textToDoc(code, textToDocOptions as Options);\n\n  return shouldHug ? group(result) : printExpand(result);\n}\n","import type { AstPath, Doc, Options } from \"prettier\";\nimport type { WrappedNode } from \"../../types.js\";\nimport {\n  getAttributeNameRaw,\n  getUnescapedAttributeValue,\n  isStaticAttributeName,\n  isStaticAttributeValue,\n} from \"../utils.js\";\nimport { formatAttributeValue, shouldHugJsExpression } from \"./utilities.js\";\n\ntype AttrPredicate = (path: AstPath<WrappedNode>, options: Options) => boolean;\ntype AttrPrint = (\n  textToDoc: (text: string, options: Options) => Promise<Doc>,\n  print: (selector?: string | number | Array<string | number> | AstPath) => Doc,\n  path: AstPath<WrappedNode>,\n  options: Options,\n) => Doc | Promise<Doc | undefined>;\n\nexport interface AlpineAttrPrinter {\n  test: AttrPredicate;\n  print: AttrPrint;\n}\n\ntype AlpineDirectiveKind = \"expression\" | \"statement\";\n\ninterface AlpineDirectiveInfo {\n  kind: AlpineDirectiveKind;\n  name: string;\n}\n\nfunction getLineIndent(line: string): number {\n  return line.match(/^[\\t ]*/u)?.[0].length ?? 0;\n}\n\nfunction isBracketPair(open: string, close: string): boolean {\n  return (\n    (open === \"[\" && close === \"]\") ||\n    (open === \"{\" && close === \"}\") ||\n    (open === \"(\" && close === \")\")\n  );\n}\n\nfunction normalizeMultilineFallbackValueIndentation(value: string): string {\n  if (!value.includes(\"\\n\")) return value;\n\n  const lines = value.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n\n  let firstNonEmpty = -1;\n  let lastNonEmpty = -1;\n  for (let i = 0; i < lines.length; i++) {\n    if (lines[i].trim().length === 0) continue;\n    if (firstNonEmpty === -1) firstNonEmpty = i;\n    lastNonEmpty = i;\n  }\n\n  if (firstNonEmpty === -1 || lastNonEmpty === -1 || firstNonEmpty >= lastNonEmpty) {\n    return value;\n  }\n\n  const firstTrimmed = lines[firstNonEmpty].trim();\n  const lastTrimmed = lines[lastNonEmpty].trim();\n  if (firstTrimmed.length === 0 || lastTrimmed.length === 0) {\n    return value;\n  }\n\n  const open = firstTrimmed[0];\n  const close = lastTrimmed[0];\n  if (!isBracketPair(open, close)) {\n    return value;\n  }\n\n  const closeIndent = getLineIndent(lines[lastNonEmpty]);\n  let minMiddleIndent = Number.POSITIVE_INFINITY;\n\n  for (let i = firstNonEmpty + 1; i < lastNonEmpty; i++) {\n    if (lines[i].trim().length === 0) continue;\n    const indent = getLineIndent(lines[i]);\n    if (indent < minMiddleIndent) minMiddleIndent = indent;\n  }\n\n  if (!Number.isFinite(minMiddleIndent)) {\n    return value;\n  }\n\n  const targetMiddleIndent = closeIndent + 2;\n  const shiftLeft = minMiddleIndent - targetMiddleIndent;\n  if (shiftLeft <= 0) {\n    return value;\n  }\n\n  const output = [...lines];\n  for (let i = firstNonEmpty + 1; i < lastNonEmpty; i++) {\n    const line = output[i];\n    if (line.trim().length === 0) {\n      continue;\n    }\n    output[i] = line.slice(Math.min(shiftLeft, line.length));\n  }\n\n  return output.join(\"\\n\");\n}\n\nfunction hasBladeValueSyntax(node: WrappedNode): boolean {\n  const value = getUnescapedAttributeValue(node);\n  // {{ ... }}, {{-- comment --}}, and {!! raw !!} all start with these prefixes.\n  return value.includes(\"{{\") || value.includes(\"{!!\");\n}\n\nconst ALPINE_DIRECTIVES = new Map<string, AlpineDirectiveKind>([\n  // Core directives\n  [\"x-data\", \"expression\"],\n  [\"x-model\", \"expression\"],\n  [\"x-modelable\", \"expression\"],\n  [\"x-show\", \"expression\"],\n  [\"x-if\", \"expression\"],\n  [\"x-for\", \"expression\"],\n  [\"x-text\", \"expression\"],\n  [\"x-html\", \"expression\"],\n  [\"x-effect\", \"expression\"],\n  [\"x-id\", \"expression\"],\n  [\"x-teleport\", \"expression\"],\n  [\"x-init\", \"statement\"],\n  // Plugin directives\n  [\"x-intersect\", \"expression\"],\n  [\"x-trap\", \"expression\"],\n  [\"x-mask\", \"expression\"],\n  [\"x-sort\", \"expression\"],\n  [\"x-anchor\", \"expression\"],\n  [\"x-persist\", \"expression\"],\n  [\"x-resize\", \"statement\"],\n]);\n\nfunction getAlpineDirectiveInfo(name: string): AlpineDirectiveInfo | null {\n  const lower = name.toLowerCase();\n\n  if (lower.startsWith(\"@\") || lower.startsWith(\"x-on:\")) {\n    return { kind: \"statement\", name };\n  }\n\n  if (lower.startsWith(\":\") || lower.startsWith(\"x-bind:\")) {\n    return { kind: \"expression\", name };\n  }\n\n  for (const [directive, kind] of ALPINE_DIRECTIVES) {\n    if (\n      lower === directive ||\n      lower.startsWith(`${directive}.`) ||\n      lower.startsWith(`${directive}:`)\n    ) {\n      return { kind, name };\n    }\n  }\n\n  return null;\n}\n\nfunction isSyntaxError(error: unknown): boolean {\n  return (\n    typeof error === \"object\" &&\n    error !== null &&\n    \"cause\" in error &&\n    typeof (error as { cause?: unknown }).cause === \"object\" &&\n    (error as { cause?: { code?: string } }).cause?.code === \"BABEL_PARSER_SYNTAX_ERROR\"\n  );\n}\n\nasync function formatAsExpression(\n  value: string,\n  textToDoc: (text: string, options: Options) => Promise<Doc>,\n): Promise<Doc> {\n  return formatAttributeValue(\n    value,\n    textToDoc,\n    { parser: \"__js_expression\" },\n    shouldHugJsExpression,\n  );\n}\n\nasync function formatAsStatement(\n  value: string,\n  textToDoc: (text: string, options: Options) => Promise<Doc>,\n): Promise<Doc> {\n  return formatAttributeValue(\n    value,\n    textToDoc,\n    { parser: \"babel\", __isHtmlInlineEventHandler: true },\n    () => false,\n  );\n}\n\nasync function printAlpineDirective(\n  info: AlpineDirectiveInfo,\n  value: string,\n  textToDoc: (text: string, options: Options) => Promise<Doc>,\n): Promise<Doc> {\n  const strategies =\n    info.kind === \"statement\"\n      ? [formatAsStatement, formatAsExpression]\n      : [formatAsExpression, formatAsStatement];\n\n  let lastError: unknown;\n\n  for (const strategy of strategies) {\n    try {\n      return await strategy(value, textToDoc);\n    } catch (error) {\n      if (!isSyntaxError(error)) {\n        throw error;\n      }\n      lastError = error;\n    }\n  }\n\n  if (lastError) {\n    return normalizeMultilineFallbackValueIndentation(value);\n  }\n\n  return value;\n}\n\nconst isAlpineAttribute: AttrPredicate = (path, options) => {\n  if ((options as Record<string, unknown>).parentParser) {\n    return false;\n  }\n\n  const node = path.node;\n  if (hasBladeValueSyntax(node)) {\n    return false;\n  }\n  if (!isStaticAttributeValue(node)) {\n    return false;\n  }\n\n  if (!isStaticAttributeName(node)) {\n    return false;\n  }\n\n  const name = getAttributeNameRaw(node);\n  if (!name) {\n    return false;\n  }\n\n  return getAlpineDirectiveInfo(name) !== null;\n};\n\nconst printAlpineAttribute: AttrPrint = async (textToDoc, _print, path) => {\n  const node = path.node;\n  if (!isStaticAttributeName(node)) {\n    return undefined;\n  }\n\n  const name = getAttributeNameRaw(node);\n  const info = getAlpineDirectiveInfo(name);\n  if (!info) {\n    return undefined;\n  }\n\n  const value = getUnescapedAttributeValue(node);\n  if (!value) {\n    return undefined;\n  }\n  if (!isStaticAttributeValue(node)) {\n    return undefined;\n  }\n\n  return printAlpineDirective(info, value, textToDoc);\n};\n\nexport const alpineAttributePrinters: AlpineAttrPrinter[] = [\n  {\n    test: isAlpineAttribute,\n    print: printAlpineAttribute,\n  },\n];\n","import type { Options } from \"prettier\";\nimport { safeSerialize } from \"../../string-utils.js\";\n\ntype TailwindHtmlParser = {\n  parse: (text: string, options: Options) => Promise<unknown> | unknown;\n};\ntype TailwindHtmlParserEntry = TailwindHtmlParser | (() => Promise<unknown> | unknown);\n\nconst MAX_CLASS_SORT_CACHE_SIZE = 500;\nconst parserIds = new WeakMap<object, number>();\nconst classSortCache = new Map<string, string>();\nlet nextParserId = 1;\nlet importedTailwindParserPromise: Promise<TailwindHtmlParser | null> | null = null;\n\nfunction getPlugins(options: Options): unknown[] {\n  const plugins = (options as Record<string, unknown>).plugins;\n  return Array.isArray(plugins) ? plugins : [];\n}\n\nfunction hasTailwindOptionShape(plugin: Record<string, unknown>): boolean {\n  const options = plugin.options;\n  if (!options || typeof options !== \"object\") return false;\n\n  const optionRecord = options as Record<string, unknown>;\n  return (\n    \"tailwindConfig\" in optionRecord ||\n    \"tailwindStylesheet\" in optionRecord ||\n    \"tailwindAttributes\" in optionRecord ||\n    \"tailwindFunctions\" in optionRecord\n  );\n}\n\nfunction isTailwindHtmlParser(value: unknown): value is TailwindHtmlParser {\n  return (\n    !!value &&\n    typeof value === \"object\" &&\n    typeof (value as { parse?: unknown }).parse === \"function\"\n  );\n}\n\nfunction getHtmlParserEntryFromPlugin(\n  plugin: Record<string, unknown>,\n): TailwindHtmlParserEntry | null {\n  const parsers = plugin.parsers;\n  if (!parsers || typeof parsers !== \"object\") return null;\n\n  const htmlParser = (parsers as Record<string, unknown>).html;\n  if (isTailwindHtmlParser(htmlParser)) return htmlParser;\n  if (typeof htmlParser === \"function\") return htmlParser as TailwindHtmlParserEntry;\n  return null;\n}\n\nasync function resolveHtmlParserEntry(\n  entry: TailwindHtmlParserEntry,\n): Promise<TailwindHtmlParser | null> {\n  if (isTailwindHtmlParser(entry)) return entry;\n\n  try {\n    const loaded = await entry();\n    return isTailwindHtmlParser(loaded) ? loaded : null;\n  } catch {\n    return null;\n  }\n}\n\nasync function resolveHtmlParserEntryFromPlugin(\n  plugin: Record<string, unknown>,\n): Promise<TailwindHtmlParser | null> {\n  const entry = getHtmlParserEntryFromPlugin(plugin);\n  return entry ? resolveHtmlParserEntry(entry) : null;\n}\n\nfunction isTailwindPlugin(plugin: Record<string, unknown>): boolean {\n  return plugin.name === \"prettier-plugin-tailwindcss\" || hasTailwindOptionShape(plugin);\n}\n\nasync function findTailwindParserInLoadedPlugins(\n  options: Options,\n): Promise<TailwindHtmlParser | null> {\n  for (const plugin of getPlugins(options)) {\n    if (!plugin || typeof plugin !== \"object\") continue;\n\n    const pluginRecord = plugin as Record<string, unknown>;\n    if (!isTailwindPlugin(pluginRecord)) continue;\n\n    const parserEntry = getHtmlParserEntryFromPlugin(pluginRecord);\n    if (!parserEntry) continue;\n\n    const htmlParser = await resolveHtmlParserEntry(parserEntry);\n    if (htmlParser) return htmlParser;\n  }\n\n  return null;\n}\n\nfunction hasTailwindPluginReference(options: Options): boolean {\n  for (const plugin of getPlugins(options)) {\n    if (typeof plugin === \"string\") {\n      if (plugin.includes(\"prettier-plugin-tailwindcss\")) {\n        return true;\n      }\n      continue;\n    }\n\n    if (plugin instanceof URL) {\n      if (plugin.href.includes(\"prettier-plugin-tailwindcss\")) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nasync function loadTailwindParserFromModule(): Promise<TailwindHtmlParser | null> {\n  if (!importedTailwindParserPromise) {\n    importedTailwindParserPromise = (async () => {\n      try {\n        const tailwindModuleId = \"prettier-plugin-tailwindcss\";\n        const mod = await import(tailwindModuleId);\n        const moduleRecord = mod as Record<string, unknown>;\n\n        const directParser = await resolveHtmlParserEntryFromPlugin(moduleRecord);\n        if (directParser) return directParser;\n\n        const defaultExport = moduleRecord.default;\n        if (!defaultExport || typeof defaultExport !== \"object\") return null;\n        return resolveHtmlParserEntryFromPlugin(defaultExport as Record<string, unknown>);\n      } catch {\n        return null;\n      }\n    })();\n  }\n\n  return importedTailwindParserPromise;\n}\n\nasync function resolveTailwindParser(options: Options): Promise<TailwindHtmlParser | null> {\n  const loadedParser = await findTailwindParserInLoadedPlugins(options);\n  if (loadedParser) return loadedParser;\n\n  if (!hasTailwindPluginReference(options)) return null;\n  return loadTailwindParserFromModule();\n}\n\nfunction encodeSyntheticHtmlAttributeValue(value: string): string {\n  return value.replaceAll(\"&\", \"&amp;\").replaceAll('\"', \"&quot;\").replaceAll(\"<\", \"&lt;\");\n}\n\nfunction decodeSyntheticHtmlAttributeValue(value: string): string {\n  return value.replaceAll(\"&quot;\", '\"').replaceAll(\"&lt;\", \"<\").replaceAll(\"&amp;\", \"&\");\n}\n\nfunction extractClassAttributeValue(ast: unknown): string | null {\n  const stack: unknown[] = [ast];\n  const visited = new Set<object>();\n\n  while (stack.length > 0) {\n    const current = stack.pop();\n    if (!current || typeof current !== \"object\") continue;\n    if (visited.has(current)) continue;\n    visited.add(current);\n\n    const record = current as Record<string, unknown>;\n    if (record.name === \"class\" && typeof record.value === \"string\") {\n      return record.value;\n    }\n\n    for (const value of Object.values(record)) {\n      if (!value || typeof value !== \"object\") continue;\n      if (Array.isArray(value)) {\n        for (let i = value.length - 1; i >= 0; i--) {\n          stack.push(value[i]);\n        }\n      } else {\n        stack.push(value);\n      }\n    }\n  }\n\n  return null;\n}\n\nfunction getParserId(parser: TailwindHtmlParser): number {\n  const key = parser as unknown as object;\n  let parserId = parserIds.get(key);\n  if (!parserId) {\n    parserId = nextParserId++;\n    parserIds.set(key, parserId);\n  }\n  return parserId;\n}\n\nfunction getSortCacheKey(parser: TailwindHtmlParser, value: string, options: Options): string {\n  const opts = options as Record<string, unknown>;\n  const parserId = getParserId(parser);\n  const optionsKey = safeSerialize({\n    filepath: opts.filepath,\n    tailwindConfig: opts.tailwindConfig,\n    tailwindEntryPoint: opts.tailwindEntryPoint,\n    tailwindStylesheet: opts.tailwindStylesheet,\n    tailwindPackageName: opts.tailwindPackageName,\n    tailwindAttributes: opts.tailwindAttributes,\n    tailwindFunctions: opts.tailwindFunctions,\n    tailwindPreserveWhitespace: opts.tailwindPreserveWhitespace,\n    tailwindPreserveDuplicates: opts.tailwindPreserveDuplicates,\n  });\n  return `${parserId}|${optionsKey}|${value}`;\n}\n\nfunction setCachedSortResult(key: string, value: string): void {\n  if (classSortCache.size >= MAX_CLASS_SORT_CACHE_SIZE) {\n    classSortCache.clear();\n  }\n  classSortCache.set(key, value);\n}\n\nfunction createTailwindParseOptions(options: Options): Options {\n  return {\n    ...(options as Record<string, unknown>),\n    parser: \"html\",\n  } as Options;\n}\n\nexport async function sortClassNamesWithTailwind(\n  value: string,\n  options: Options,\n): Promise<string | null> {\n  if (value.trim().length === 0) {\n    return \"\";\n  }\n\n  const tailwindParser = await resolveTailwindParser(options);\n  if (!tailwindParser) return null;\n\n  const cacheKey = getSortCacheKey(tailwindParser, value, options);\n  const cached = classSortCache.get(cacheKey);\n  if (cached !== undefined) return cached;\n\n  try {\n    const encodedValue = encodeSyntheticHtmlAttributeValue(value);\n    const ast = await tailwindParser.parse(\n      `<div class=\"${encodedValue}\"></div>`,\n      createTailwindParseOptions(options),\n    );\n    const sortedClassValue = extractClassAttributeValue(ast);\n    if (typeof sortedClassValue !== \"string\") return null;\n\n    const decodedValue = decodeSyntheticHtmlAttributeValue(sortedClassValue);\n    setCachedSortResult(cacheKey, decodedValue);\n    return decodedValue;\n  } catch {\n    return null;\n  }\n}\n","import type { Options } from \"prettier\";\n\ntype PluginLike = {\n  parsers?: Record<string, unknown>;\n};\n\nconst EMBEDDED_PARSER_PLUGIN_MODULES: Readonly<Record<string, readonly string[]>> = {\n  babel: [\"prettier/plugins/babel\", \"prettier/plugins/estree\"],\n  \"babel-ts\": [\"prettier/plugins/babel\", \"prettier/plugins/estree\"],\n  flow: [\"prettier/plugins/babel\", \"prettier/plugins/estree\"],\n  typescript: [\"prettier/plugins/typescript\", \"prettier/plugins/estree\"],\n  css: [\"prettier/plugins/postcss\"],\n  scss: [\"prettier/plugins/postcss\"],\n  less: [\"prettier/plugins/postcss\"],\n  markdown: [\"prettier/plugins/markdown\"],\n  mdx: [\"prettier/plugins/markdown\"],\n};\n\nconst importedPluginPromises = new Map<string, Promise<unknown | null>>();\n\nfunction getPlugins(options: Options): unknown[] {\n  const plugins = (options as Record<string, unknown>).plugins;\n  return Array.isArray(plugins) ? plugins : [];\n}\n\nfunction hasParser(plugin: unknown, parser: string): boolean {\n  if (!plugin || typeof plugin !== \"object\") return false;\n  const parsers = (plugin as PluginLike).parsers;\n  if (!parsers || typeof parsers !== \"object\") return false;\n  return parser in parsers;\n}\n\nfunction getDefaultExportCandidate(plugin: unknown): unknown | null {\n  if (!plugin || typeof plugin !== \"object\") return null;\n  const defaultExport = (plugin as { default?: unknown }).default;\n  return defaultExport && typeof defaultExport === \"object\" ? defaultExport : null;\n}\n\nfunction normalizePlugin(plugin: unknown): unknown {\n  const defaultExport = getDefaultExportCandidate(plugin);\n  if (defaultExport) {\n    const defaultRecord = defaultExport as Record<string, unknown>;\n    if (\n      typeof defaultRecord.parsers === \"object\" ||\n      typeof defaultRecord.printers === \"object\" ||\n      Array.isArray(defaultRecord.languages)\n    ) {\n      return defaultExport;\n    }\n  }\n\n  return plugin;\n}\n\nfunction hasParserInPlugins(plugins: readonly unknown[], parser: string): boolean {\n  return plugins.some((plugin) => hasParser(plugin, parser));\n}\n\nasync function loadPluginModule(moduleId: string): Promise<unknown | null> {\n  let promise = importedPluginPromises.get(moduleId);\n  if (!promise) {\n    promise = (async () => {\n      try {\n        const mod = await import(moduleId);\n        return normalizePlugin(mod as Record<string, unknown>);\n      } catch {\n        return null;\n      }\n    })();\n    importedPluginPromises.set(moduleId, promise);\n  }\n\n  return promise;\n}\n\nexport async function resolveEmbeddedParserPlugins(\n  options: Options,\n  parser: string,\n): Promise<unknown[]> {\n  const plugins = getPlugins(options).map(normalizePlugin);\n  if (hasParserInPlugins(plugins, parser)) {\n    return plugins;\n  }\n\n  const moduleIds = EMBEDDED_PARSER_PLUGIN_MODULES[parser] ?? [];\n  if (moduleIds.length === 0) {\n    return plugins;\n  }\n\n  const resolved = [...plugins];\n  for (const moduleId of moduleIds) {\n    const plugin = await loadPluginModule(moduleId);\n    if (!plugin) continue;\n    if (resolved.includes(plugin)) continue;\n    resolved.push(plugin);\n  }\n\n  return resolved;\n}\n","import type { Options } from \"prettier\";\n\ntype PhpParser = {\n  parse: (text: string, options: Options) => Promise<unknown> | unknown;\n};\n\ntype PhpPluginLike = {\n  parsers?: Record<string, unknown>;\n};\n\ntype ModuleImporter = (moduleId: string) => Promise<unknown>;\n\nlet importedPhpPluginPromise: Promise<unknown | null> | null = null;\nconst PHP_PLUGIN_MODULE_IDS = [\"@prettier/plugin-php\", \"@prettier/plugin-php/standalone\"] as const;\nlet moduleImporter: ModuleImporter = (moduleId) => import(moduleId);\n\nfunction getPlugins(options: Options): unknown[] {\n  const plugins = (options as Record<string, unknown>).plugins;\n  return Array.isArray(plugins) ? plugins : [];\n}\n\nfunction getDefaultExportCandidate(plugin: unknown): unknown | null {\n  if (!plugin || typeof plugin !== \"object\") return null;\n  const defaultExport = (plugin as { default?: unknown }).default;\n  return defaultExport && typeof defaultExport === \"object\" ? defaultExport : null;\n}\n\nfunction isPhpParser(value: unknown): value is PhpParser {\n  return (\n    !!value &&\n    typeof value === \"object\" &&\n    typeof (value as { parse?: unknown }).parse === \"function\"\n  );\n}\n\nfunction isPhpParserFunction(value: unknown): boolean {\n  return typeof value === \"function\";\n}\n\nfunction hasPhpParser(plugin: unknown): boolean {\n  if (!plugin || typeof plugin !== \"object\") return false;\n  const phpEntry = (plugin as PhpPluginLike).parsers?.php;\n  return isPhpParser(phpEntry) || isPhpParserFunction(phpEntry);\n}\n\nfunction normalizePlugin(plugin: unknown): unknown {\n  if (hasPhpParser(plugin)) {\n    return plugin;\n  }\n\n  const defaultExport = getDefaultExportCandidate(plugin);\n  if (defaultExport && hasPhpParser(defaultExport)) {\n    return defaultExport;\n  }\n\n  return plugin;\n}\n\nasync function loadPhpPluginFromModule(): Promise<unknown | null> {\n  if (!importedPhpPluginPromise) {\n    importedPhpPluginPromise = (async () => {\n      for (const phpModuleId of PHP_PLUGIN_MODULE_IDS) {\n        try {\n          const mod = await moduleImporter(phpModuleId);\n          const moduleRecord = mod as Record<string, unknown>;\n\n          if (hasPhpParser(moduleRecord)) {\n            return moduleRecord;\n          }\n\n          const defaultExport = moduleRecord.default;\n          if (hasPhpParser(defaultExport)) {\n            return defaultExport;\n          }\n        } catch {\n          // Try the next known module id.\n        }\n      }\n\n      return null;\n    })();\n  }\n\n  return importedPhpPluginPromise;\n}\n\nexport function resetPhpPluginResolverForTests(): void {\n  importedPhpPluginPromise = null;\n  moduleImporter = (moduleId) => import(moduleId);\n}\n\nexport function setPhpPluginModuleImporterForTests(importer: ModuleImporter): void {\n  importedPhpPluginPromise = null;\n  moduleImporter = importer;\n}\n\nexport async function resolvePhpPlugins(options: Options): Promise<unknown[] | null> {\n  const plugins = getPlugins(options).map(normalizePlugin);\n\n  if (plugins.some(hasPhpParser)) {\n    return plugins;\n  }\n\n  const phpPlugin = await loadPhpPluginFromModule();\n  if (!phpPlugin) {\n    return null;\n  }\n\n  return [...plugins, phpPlugin];\n}\n","import type { Options } from \"prettier\";\nimport { format as prettierFormat } from \"prettier\";\nimport type { WrappedNode } from \"../../types.js\";\nimport { trimFinalLineBreak, normalizeLineEndingsToLf, safeSerialize } from \"../../string-utils.js\";\nimport { isEchoLike } from \"../../node-predicates.js\";\nimport { TokenType } from \"../../lexer/types.js\";\nimport {\n  getDirectivePhpWrapperKinds,\n  type DirectivePhpWrapperContext,\n  type DirectivePhpWrapperKind,\n} from \"../../lexer/directives.js\";\nimport {\n  DIRECTIVE_PHP_FORMAT_ARGS_PLACEHOLDER,\n  type DirectivePhpFormattingContext,\n} from \"../../plugins/types.js\";\nimport { resolveBladeSyntaxPlugins } from \"../../plugins/runtime.js\";\nimport { NodeKind } from \"../../tree/types.js\";\nimport { fullText } from \"../utils.js\";\nimport {\n  getEchoSpacingMode,\n  getDirectiveArgSpacingText,\n  isBladeComponentTagName,\n} from \"../blade-options.js\";\nimport {\n  getDirectiveName,\n  getEffectiveDirectiveArgSpacingRule,\n} from \"../directive-spacing-context.js\";\nimport { resolvePhpPlugins } from \"./php-plugin.js\";\n\ntype PhpFormattingMode = \"off\" | \"safe\" | \"aggressive\";\ntype ActivePhpFormattingMode = Exclude<PhpFormattingMode, \"off\">;\ntype PhpFormattingTarget = \"directiveArgs\" | \"echo\" | \"phpBlock\" | \"phpTag\";\n\nconst MAX_PHP_FORMAT_CACHE_SIZE = 500;\nconst START_MARKER_COMMENT = \"/*__BLADE_PHP_FMT_START__*/\";\nconst END_MARKER_COMMENT = \"/*__BLADE_PHP_FMT_END__*/\";\nconst DIRECTIVE_START_MARKER_COMMENT = \"/*__BDS__*/\";\nconst DIRECTIVE_END_MARKER_COMMENT = \"/*__BDE__*/\";\nconst phpFormatCache = new Map<string, string | null>();\nconst BROWSER_DEFAULT_PHP_VERSION = \"8.4\";\nconst PHP_INLINE_WRAPPER_PRINT_WIDTH_MARGIN = 8;\nconst FORCED_DIRECTIVE_ARG_TRAILING_COMMA = false;\nconst DIRECTIVE_ARG_FINAL_ARRAY_TRAILING_COMMA_ALLOWED_DIRECTIVES = new Set([\"aware\", \"props\"]);\n\nfunction getMode(options: Options): PhpFormattingMode {\n  const rawOptions = options as Record<string, unknown>;\n  const mode = rawOptions.bladePhpFormatting;\n  if (mode === \"safe\" || mode === \"aggressive\") {\n    return mode;\n  }\n\n  return \"off\";\n}\n\nfunction parsePhpFormattingTargets(options: Options): Set<PhpFormattingTarget> {\n  const raw = (options as Record<string, unknown>).bladePhpFormattingTargets;\n  const allTargets: PhpFormattingTarget[] = [\"directiveArgs\", \"echo\", \"phpBlock\", \"phpTag\"];\n\n  if (raw === undefined || raw === null) {\n    return new Set(allTargets);\n  }\n  if (!Array.isArray(raw)) {\n    return new Set(allTargets);\n  }\n  if (raw.length === 0) {\n    return new Set<PhpFormattingTarget>();\n  }\n\n  const normalized = raw\n    .filter((item): item is string => typeof item === \"string\")\n    .flatMap((item) => item.split(/[,\\s]+/u))\n    .map((token) => token.trim().toLowerCase())\n    .filter(Boolean);\n\n  const out = new Set<PhpFormattingTarget>();\n  for (const token of normalized) {\n    if (token === \"all\") {\n      return new Set(allTargets);\n    }\n    if (token === \"none\") {\n      continue;\n    }\n    if (token === \"echo\" || token === \"echoes\") {\n      out.add(\"echo\");\n      continue;\n    }\n    if (token === \"directiveargs\" || token === \"directive-args\" || token === \"directive_args\") {\n      out.add(\"directiveArgs\");\n      continue;\n    }\n    if (token === \"phpblock\" || token === \"php-block\" || token === \"php_block\") {\n      out.add(\"phpBlock\");\n      continue;\n    }\n    if (token === \"phptag\" || token === \"php-tag\" || token === \"php_tag\") {\n      out.add(\"phpTag\");\n      continue;\n    }\n  }\n\n  return out;\n}\n\nfunction isPhpTargetEnabled(options: Options, target: PhpFormattingTarget): boolean {\n  return parsePhpFormattingTargets(options).has(target);\n}\n\nexport function isPhpFormattingEnabled(options: Options): boolean {\n  return getMode(options) !== \"off\";\n}\n\nexport function isPhpTagNode(node: WrappedNode): boolean {\n  return node.kind === NodeKind.PhpTag;\n}\n\nexport function isPhpBlockNode(node: WrappedNode): boolean {\n  return node.kind === NodeKind.PhpBlock;\n}\n\nexport const isEchoNode = isEchoLike;\n\n// Standalone echoes inside the open tag of a Blade component compile into a\n// double-quoted PHP string by Laravel's ComponentTagCompiler, so emitting\n// double quotes inside the echo would terminate that outer string. Force\n// single quotes when the parent element is a registered Blade component.\nfunction isInBladeComponentOpenTag(node: WrappedNode, options: Options): boolean {\n  const parent = node.parent;\n  if (!parent || parent.kind !== NodeKind.Element) return false;\n  if (parent.openTagEndOffset === 0) return false;\n  if (node.end > parent.openTagEndOffset) return false;\n  return isBladeComponentTagName(parent.fullName, options);\n}\n\nexport function isDirectiveWithArgsNode(node: WrappedNode): boolean {\n  if (node.kind !== NodeKind.Directive) return false;\n  return findFirstToken(node, TokenType.DirectiveArgs) !== null;\n}\n\nfunction nodeTokens(node: WrappedNode): readonly { type: number; start: number; end: number }[] {\n  const start = node.flat.tokenStart;\n  const end = start + node.flat.tokenCount;\n  return node.buildResult.tokens.slice(start, end);\n}\n\nfunction findFirstToken(\n  node: WrappedNode,\n  type: TokenType,\n): { type: number; start: number; end: number } | null {\n  for (const token of nodeTokens(node)) {\n    if (token.type === type) return token;\n  }\n  return null;\n}\n\nfunction getTextBetweenMarkers(\n  formatted: string,\n  startMarker = START_MARKER_COMMENT,\n  endMarker = END_MARKER_COMMENT,\n): string | null {\n  const startMarkerIndex = formatted.indexOf(startMarker);\n  if (startMarkerIndex < 0) return null;\n\n  const contentStart = startMarkerIndex + startMarker.length;\n  const endMarkerIndex = formatted.indexOf(endMarker, contentStart);\n  if (endMarkerIndex < 0) return null;\n\n  return formatted.slice(contentStart, endMarkerIndex);\n}\n\nfunction dedentMultiline(text: string): string {\n  const normalized = normalizeLineEndingsToLf(text);\n  if (!normalized.includes(\"\\n\")) return normalized.trim();\n\n  const trimmed = normalized.trim();\n  if (!trimmed) return \"\";\n\n  const lines = trimmed.split(\"\\n\");\n\n  function getLineIndent(line: string): number {\n    return line.match(/^[\\t ]*/)?.[0].length ?? 0;\n  }\n\n  function getMinIndent(input: string[]): number {\n    let minIndent = Number.POSITIVE_INFINITY;\n    for (const line of input) {\n      if (line.trim().length === 0) continue;\n      const indent = getLineIndent(line);\n      if (indent < minIndent) {\n        minIndent = indent;\n      }\n    }\n    return minIndent;\n  }\n\n  function stripIndent(input: string[], amount: number): string[] {\n    if (!Number.isFinite(amount) || amount <= 0) {\n      return input;\n    }\n    return input.map((line) =>\n      line.trim().length === 0 ? \"\" : line.slice(Math.min(amount, line.length)),\n    );\n  }\n\n  function normalizeBracketWrappedContinuationIndent(input: string[]): string[] {\n    if (input.length < 2) return input;\n\n    const first = input[0].trim();\n    const expectedClose = first === \"[\" ? \"]\" : first === \"{\" ? \"}\" : first === \"(\" ? \")\" : null;\n    if (!expectedClose) return input;\n\n    let lastNonEmpty = -1;\n    for (let i = input.length - 1; i >= 0; i--) {\n      if (input[i].trim().length > 0) {\n        lastNonEmpty = i;\n        break;\n      }\n    }\n    if (lastNonEmpty <= 0) return input;\n    if (input[lastNonEmpty].trim() !== expectedClose) return input;\n\n    const closingIndent = getLineIndent(input[lastNonEmpty]);\n    if (closingIndent <= 0) return input;\n\n    const out = [...input];\n    for (let i = 1; i <= lastNonEmpty; i++) {\n      const line = out[i];\n      if (line.trim().length === 0) {\n        out[i] = \"\";\n        continue;\n      }\n      out[i] = line.slice(Math.min(closingIndent, line.length));\n    }\n    return out;\n  }\n\n  const dedented = stripIndent(lines, getMinIndent(lines));\n  return normalizeBracketWrappedContinuationIndent(dedented).join(\"\\n\");\n}\n\nfunction normalizePayload(text: string): string {\n  return dedentMultiline(text);\n}\n\nfunction normalizePhpDocBlockIndentation(payload: string): string {\n  if (!payload.includes(\"/**\")) return payload;\n\n  const lines = payload.split(\"\\n\");\n  const out = [...lines];\n\n  for (let i = 0; i < lines.length; i++) {\n    const openMatch = lines[i].match(/^(\\s*)\\/\\*\\*/u);\n    if (!openMatch) continue;\n\n    const baseIndent = openMatch[1];\n    for (let j = i + 1; j < lines.length; j++) {\n      const trimmed = lines[j].trim();\n      if (trimmed.length === 0) {\n        out[j] = \"\";\n        continue;\n      }\n\n      if (trimmed.startsWith(\"*/\")) {\n        out[j] = `${baseIndent} ${trimmed}`;\n        i = j;\n        break;\n      }\n\n      if (trimmed.startsWith(\"*\")) {\n        out[j] = `${baseIndent} ${trimmed}`;\n      }\n    }\n  }\n\n  return out.join(\"\\n\");\n}\n\nfunction getIndentUnit(options: Options): string {\n  const raw = (options as Record<string, unknown>).tabWidth;\n  const tabWidth = typeof raw === \"number\" && Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : 2;\n  return (options as Record<string, unknown>).useTabs === true ? \"\\t\" : \" \".repeat(tabWidth);\n}\n\nfunction indentMultilinePayload(payload: string, options: Options): string {\n  const indentUnit = getIndentUnit(options);\n  const lines = payload.split(\"\\n\");\n\n  return lines.map((line) => (line.trim().length === 0 ? \"\" : `${indentUnit}${line}`)).join(\"\\n\");\n}\n\nfunction getHeredocOrNowdocLabel(line: string): string | null {\n  const match = line.match(/<<<[ \\t]*(['\"]?)([A-Za-z_\\x80-\\xff][A-Za-z0-9_\\x80-\\xff]*)\\1/u);\n  return match?.[2] ?? null;\n}\n\nfunction isHeredocOrNowdocTerminator(line: string, label: string): boolean {\n  const trimmed = line.trim();\n  return trimmed === label || trimmed === `${label};`;\n}\n\nfunction indentPhpBlockBody(payload: string, options: Options): string {\n  const indentUnit = getIndentUnit(options);\n  const lines = payload.split(\"\\n\");\n  let heredocLabel: string | null = null;\n\n  return lines\n    .map((line) => {\n      if (heredocLabel !== null) {\n        const out = line;\n        if (isHeredocOrNowdocTerminator(line, heredocLabel)) {\n          heredocLabel = null;\n        }\n        return out;\n      }\n\n      if (line.trim().length === 0) {\n        return \"\";\n      }\n\n      const startLabel = getHeredocOrNowdocLabel(line);\n      const out = `${indentUnit}${line}`;\n      if (startLabel) {\n        heredocLabel = startLabel;\n      }\n      return out;\n    })\n    .join(\"\\n\");\n}\n\nfunction stripTrailingSemicolon(text: string): string {\n  return text.replace(/;\\s*$/u, \"\");\n}\n\nfunction hasTrailingComma(text: string): boolean {\n  return /,\\s*$/u.test(text);\n}\n\nfunction normalizeTrailingComma(text: string, shouldHaveTrailingComma: boolean): string {\n  const trimmedEnd = text.replace(/\\s+$/u, \"\");\n  const suffix = text.slice(trimmedEnd.length);\n\n  if (shouldHaveTrailingComma) {\n    if (hasTrailingComma(trimmedEnd)) {\n      return `${trimmedEnd}${suffix}`;\n    }\n    return `${trimmedEnd},${suffix}`;\n  }\n\n  return `${trimmedEnd.replace(/,\\s*$/u, \"\")}${suffix}`;\n}\n\nfunction hasFinalArrayTrailingComma(text: string): boolean {\n  return /,\\s*\\]\\s*$/u.test(text);\n}\n\nfunction shouldPreserveFinalArrayTrailingComma(\n  directiveName: string,\n  argsInner: string,\n  options: Options,\n): boolean {\n  if ((options as Record<string, unknown>).trailingCommaPHP === false) {\n    return false;\n  }\n  return (\n    DIRECTIVE_ARG_FINAL_ARRAY_TRAILING_COMMA_ALLOWED_DIRECTIVES.has(directiveName.toLowerCase()) &&\n    hasFinalArrayTrailingComma(argsInner.trimEnd())\n  );\n}\n\nfunction normalizeFinalArrayTrailingComma(text: string, shouldHaveTrailingComma: boolean): string {\n  const trimmedEnd = text.replace(/\\s+$/u, \"\");\n  const suffix = text.slice(trimmedEnd.length);\n\n  if (shouldHaveTrailingComma) {\n    if (hasFinalArrayTrailingComma(trimmedEnd)) {\n      return `${trimmedEnd}${suffix}`;\n    }\n    return `${trimmedEnd.replace(/([^\\s,])(\\s*\\])$/u, \"$1,$2\")}${suffix}`;\n  }\n\n  return `${trimmedEnd.replace(/,\\s*(\\]\\s*)$/u, \"$1\")}${suffix}`;\n}\n\nfunction hasWrappedMultilineDirectiveArgs(rawArgs: string): boolean {\n  if (!/[\\r\\n]/u.test(rawArgs)) return false;\n  return /^\\(\\s*\\r?\\n/u.test(rawArgs);\n}\n\nfunction normalizeWrappedDirectiveArgsPayload(payload: string): string {\n  const lines = payload.split(\"\\n\");\n  if (lines.length <= 1) {\n    return payload.trim();\n  }\n\n  let minIndent = Number.POSITIVE_INFINITY;\n  for (let i = 1; i < lines.length; i++) {\n    const line = lines[i];\n    if (line.trim().length === 0) continue;\n    const indent = line.match(/^[\\t ]*/u)?.[0].length ?? 0;\n    if (indent < minIndent) {\n      minIndent = indent;\n    }\n  }\n\n  if (!Number.isFinite(minIndent) || minIndent <= 0) {\n    return payload;\n  }\n\n  return lines\n    .map((line, index) => {\n      if (index === 0 || line.trim().length === 0) {\n        return line;\n      }\n      return line.slice(Math.min(minIndent, line.length));\n    })\n    .join(\"\\n\");\n}\n\nfunction tryCollapseDirectivePayloadSingleLine(payload: string): string | null {\n  if (!/[\\r\\n]/u.test(payload)) {\n    const single = payload.trim();\n    return single.length > 0 ? single : null;\n  }\n\n  // Keep multiline formatting when comments/heredoc-like constructs are present.\n  if (\n    /\\/\\*/u.test(payload) ||\n    /(^|[^:])\\/\\/+/u.test(payload) ||\n    /(^|\\s)#[^\\n]*/u.test(payload) ||\n    /<<<[ \\t]*[A-Za-z_'\"]/u.test(payload)\n  ) {\n    return null;\n  }\n\n  const collapsed = payload.replace(/\\s+/gu, \" \").trim();\n  return collapsed.length > 0 ? collapsed : null;\n}\n\nfunction getPrintWidth(options: Options): number {\n  const raw = (options as Record<string, unknown>).printWidth;\n  if (typeof raw === \"number\" && Number.isFinite(raw) && raw > 0) {\n    return Math.floor(raw);\n  }\n  return 80;\n}\n\nfunction getInlineWrapperSyntaxOverhead(snippet: string): number {\n  let maxOverhead = 0;\n\n  for (const line of snippet.split(/\\r\\n?|\\n/u)) {\n    const startMarkerIndex = line.indexOf(START_MARKER_COMMENT);\n    if (startMarkerIndex < 0) continue;\n\n    const endMarkerIndex = line.indexOf(\n      END_MARKER_COMMENT,\n      startMarkerIndex + START_MARKER_COMMENT.length,\n    );\n    if (endMarkerIndex < 0) continue;\n\n    const prefixLength = startMarkerIndex;\n    const suffixLength = line.length - (endMarkerIndex + END_MARKER_COMMENT.length);\n    maxOverhead = Math.max(maxOverhead, prefixLength + suffixLength);\n  }\n\n  return maxOverhead;\n}\n\nfunction getCompensatedDelegatedPhpPrintWidth(snippet: string, options: Options): number {\n  const basePrintWidth = getPrintWidth(options);\n  const inlineWrapperOverhead = getInlineWrapperSyntaxOverhead(snippet);\n\n  if (inlineWrapperOverhead === 0) {\n    return basePrintWidth;\n  }\n\n  return basePrintWidth + inlineWrapperOverhead + PHP_INLINE_WRAPPER_PRINT_WIDTH_MARGIN;\n}\n\nfunction shouldPreferInlineDirectiveArgs(\n  node: WrappedNode,\n  directiveName: string,\n  payload: string,\n  options: Options,\n): boolean {\n  if (directiveName === \"php\") {\n    return true;\n  }\n\n  const printWidth = getPrintWidth(options);\n  const spacing = getDirectiveArgSpacingText(\n    \"\",\n    getEffectiveDirectiveArgSpacingRule(node, options),\n  );\n  const preview = `@${directiveName}${spacing}(${payload})`;\n  return preview.length <= printWidth;\n}\n\nfunction getPhpFormatCacheKey(\n  snippet: string,\n  mode: PhpFormattingMode,\n  options: Options,\n  trailingCommaPHPOverride?: boolean,\n  singleQuoteOverride?: boolean,\n): string {\n  const opts = options as Record<string, unknown>;\n  const optionsKey = safeSerialize({\n    mode,\n    printWidth: opts.printWidth,\n    tabWidth: opts.tabWidth,\n    useTabs: opts.useTabs,\n    singleQuote: singleQuoteOverride === undefined ? opts.singleQuote : singleQuoteOverride,\n    semi: opts.semi,\n    trailingComma: opts.trailingComma,\n    bracketSpacing: opts.bracketSpacing,\n    jsxSingleQuote: opts.jsxSingleQuote,\n    quoteProps: opts.quoteProps,\n    endOfLine: opts.endOfLine,\n    phpVersion: opts.phpVersion,\n    trailingCommaPHP:\n      trailingCommaPHPOverride === undefined ? opts.trailingCommaPHP : trailingCommaPHPOverride,\n    braceStyle: opts.braceStyle,\n  });\n\n  return `${optionsKey}|${snippet}`;\n}\n\nfunction setCachedPhpFormatResult(key: string, value: string | null): void {\n  if (phpFormatCache.size >= MAX_PHP_FORMAT_CACHE_SIZE) {\n    phpFormatCache.clear();\n  }\n  phpFormatCache.set(key, value);\n}\n\nfunction createPhpFormatOptions(\n  options: Options,\n  plugins: unknown[],\n  trailingCommaPHPOverride?: boolean,\n  singleQuoteOverride?: boolean,\n): Options {\n  const baseOptions = {\n    ...(options as Record<string, unknown>),\n  };\n\n  delete baseOptions.parser;\n  delete baseOptions.parentParser;\n  delete baseOptions.plugins;\n  delete baseOptions.rangeStart;\n  delete baseOptions.rangeEnd;\n  delete baseOptions.cursorOffset;\n\n  const runtime = globalThis as Record<string, unknown>;\n  const isBrowserRuntime = typeof runtime.window === \"object\";\n  const phpVersion = baseOptions.phpVersion;\n  const needsBrowserPhpVersionFallback =\n    phpVersion === undefined ||\n    phpVersion === null ||\n    phpVersion === \"auto\" ||\n    phpVersion === \"composer\";\n\n  // In browser bundles, @prettier/plugin-php can't always auto-detect phpVersion\n  // from composer.json because fs/path are externalized. Pin a safe modern default.\n  if (isBrowserRuntime && needsBrowserPhpVersionFallback) {\n    baseOptions.phpVersion = BROWSER_DEFAULT_PHP_VERSION;\n  }\n\n  if (trailingCommaPHPOverride !== undefined) {\n    baseOptions.trailingCommaPHP = trailingCommaPHPOverride;\n  }\n\n  if (singleQuoteOverride !== undefined) {\n    baseOptions.singleQuote = singleQuoteOverride;\n  }\n\n  return {\n    ...baseOptions,\n    parser: \"php\",\n    plugins,\n  } as Options;\n}\n\nasync function formatPhpSnippet(\n  snippet: string,\n  options: Options,\n  mode: PhpFormattingMode,\n  trailingCommaPHPOverride?: boolean,\n  singleQuoteOverride?: boolean,\n): Promise<string | null> {\n  const plugins = await resolvePhpPlugins(options);\n  if (!plugins) return null;\n\n  const cacheKey = getPhpFormatCacheKey(\n    snippet,\n    mode,\n    options,\n    trailingCommaPHPOverride,\n    singleQuoteOverride,\n  );\n  if (phpFormatCache.has(cacheKey)) {\n    return phpFormatCache.get(cacheKey) ?? null;\n  }\n\n  try {\n    const formatted = await prettierFormat(\n      snippet,\n      createPhpFormatOptions(options, plugins, trailingCommaPHPOverride, singleQuoteOverride),\n    );\n    const normalized = normalizeLineEndingsToLf(trimFinalLineBreak(formatted));\n    setCachedPhpFormatResult(cacheKey, normalized);\n    return normalized;\n  } catch {\n    setCachedPhpFormatResult(cacheKey, null);\n    return null;\n  }\n}\n\nfunction getDirectiveWrapperContext(node: WrappedNode): DirectivePhpWrapperContext {\n  const trainedDirectives = node.buildResult.directives;\n  if (!trainedDirectives) return {};\n\n  return {\n    hasDirective: (name: string) =>\n      trainedDirectives.isDirective(name) || trainedDirectives.hasSeenDirective(name),\n    isConditionLikeDirective: (name: string) =>\n      trainedDirectives.isCondition(name) || trainedDirectives.hasAdvisoryCondition(name),\n  };\n}\n\nfunction createDirectiveArgsMarkerPayload(args: string): string {\n  return `${DIRECTIVE_START_MARKER_COMMENT}${args}${DIRECTIVE_END_MARKER_COMMENT}`;\n}\n\nfunction wrapDirectiveArgs(args: string, kind: DirectivePhpWrapperKind): string {\n  const payload = createDirectiveArgsMarkerPayload(args);\n\n  switch (kind) {\n    case \"for\":\n      return `<?php for (${payload}) {}`;\n    case \"foreach\":\n      return `<?php foreach (${payload}) {}`;\n    case \"while\":\n      return `<?php while (${payload}) {}`;\n    case \"switch\":\n      return `<?php switch (${payload}) {}`;\n    case \"case\":\n      return `<?php switch (true) { case (${payload}): break; }`;\n    case \"if\":\n      return `<?php if (${payload}) {}`;\n    case \"call\":\n    default:\n      return `<?php __b(${payload});`;\n  }\n}\n\nfunction wrapDirectiveArgsWithTemplate(args: string, template: string): string | null {\n  if (!template.includes(DIRECTIVE_PHP_FORMAT_ARGS_PLACEHOLDER)) {\n    return null;\n  }\n\n  const payload = createDirectiveArgsMarkerPayload(args);\n  return template.replaceAll(DIRECTIVE_PHP_FORMAT_ARGS_PLACEHOLDER, payload);\n}\n\ninterface DirectivePhpFormatAttempt {\n  preserveWrappedMultilineArgs: boolean;\n  wrapped: string;\n}\n\nfunction getDirectivePhpFormatAttempts(\n  directiveName: string,\n  args: string,\n  mode: ActivePhpFormattingMode,\n  options: Options,\n  context: DirectivePhpWrapperContext,\n): DirectivePhpFormatAttempt[] {\n  const attempts: DirectivePhpFormatAttempt[] = [];\n  const seenDedupeKeys = new Set<string>();\n  const pluginContext: DirectivePhpFormattingContext = { ...context, mode };\n\n  for (const plugin of resolveBladeSyntaxPlugins(options)) {\n    const templates = plugin.getDirectivePhpFormatTemplates?.(directiveName, pluginContext) ?? [];\n\n    for (const template of templates) {\n      const dedupeKey = template.key.trim();\n      if (!dedupeKey || seenDedupeKeys.has(dedupeKey)) {\n        continue;\n      }\n\n      const wrapped = wrapDirectiveArgsWithTemplate(args, template.template);\n      if (wrapped === null) {\n        continue;\n      }\n\n      seenDedupeKeys.add(dedupeKey);\n      attempts.push({\n        preserveWrappedMultilineArgs: true,\n        wrapped,\n      });\n    }\n  }\n\n  for (const wrapperKind of getDirectivePhpWrapperKinds(directiveName, mode, context)) {\n    const dedupeKey = `builtin:${wrapperKind}`;\n    if (seenDedupeKeys.has(dedupeKey)) {\n      continue;\n    }\n\n    seenDedupeKeys.add(dedupeKey);\n    attempts.push({\n      preserveWrappedMultilineArgs: wrapperKind !== \"call\",\n      wrapped: wrapDirectiveArgs(args, wrapperKind),\n    });\n  }\n\n  return attempts;\n}\n\nfunction wrapEchoExpression(expression: string): string {\n  return `<?php ${START_MARKER_COMMENT} echo ${expression}; ${END_MARKER_COMMENT}`;\n}\n\nfunction stripLeadingEchoKeyword(text: string): string {\n  return text.replace(/^\\s*echo\\b\\s*/u, \"\");\n}\n\nfunction rebuildDirectiveWithFormattedArgs(\n  node: WrappedNode,\n  formattedArgs: string,\n  options: Options,\n): string {\n  const start = node.flat.tokenStart;\n  const end = start + node.flat.tokenCount;\n  const tokens = node.buildResult.tokens;\n  const argSpacingRule = getEffectiveDirectiveArgSpacingRule(node, options);\n  let result = \"\";\n  let sawDirectiveToken = false;\n  let sawArgsToken = false;\n\n  for (let i = start; i < end; i++) {\n    const token = tokens[i];\n    const prev = i > start ? tokens[i - 1] : null;\n    const next = i + 1 < end ? tokens[i + 1] : null;\n    const tokenText = node.source.slice(token.start, token.end);\n\n    if (token.type === TokenType.Directive) {\n      result += tokenText;\n      sawDirectiveToken = true;\n      if (next?.type === TokenType.DirectiveArgs) {\n        result += getDirectiveArgSpacingText(\"\", argSpacingRule);\n      }\n      continue;\n    }\n\n    if (!sawDirectiveToken) {\n      continue;\n    }\n\n    if (\n      token.type === TokenType.Whitespace &&\n      prev?.type === TokenType.Directive &&\n      next?.type === TokenType.DirectiveArgs\n    ) {\n      result += getDirectiveArgSpacingText(tokenText, argSpacingRule);\n      continue;\n    }\n\n    if (token.type === TokenType.DirectiveArgs && !sawArgsToken) {\n      result += formattedArgs;\n      sawArgsToken = true;\n      continue;\n    }\n\n    // Unclosed directive blocks can have opener token ranges that spill into body content.\n    break;\n  }\n\n  return sawDirectiveToken ? result : \"\";\n}\n\nfunction getEchoDelimiters(node: WrappedNode): {\n  open: string;\n  close: string;\n} {\n  switch (node.kind) {\n    case NodeKind.RawEcho:\n      return { open: \"{!!\", close: \"!!}\" };\n    case NodeKind.TripleEcho:\n      return { open: \"{{{\", close: \"}}}\" };\n    case NodeKind.Echo:\n    default:\n      return { open: \"{{\", close: \"}}\" };\n  }\n}\n\nfunction getEchoContent(node: WrappedNode): string | null {\n  const tokens = nodeTokens(node);\n  const parts: string[] = [];\n\n  for (const token of tokens) {\n    if (token.type === TokenType.EchoContent) {\n      parts.push(node.source.slice(token.start, token.end));\n    }\n  }\n\n  if (parts.length === 0) return null;\n  return parts.join(\"\");\n}\n\nfunction isWhitespaceTextNode(node: WrappedNode | null): boolean {\n  return node?.kind === NodeKind.Text && node.rawText.trim().length === 0;\n}\n\nfunction isNonWhitespaceTextNode(node: WrappedNode | null): boolean {\n  return node?.kind === NodeKind.Text && node.rawText.trim().length > 0;\n}\n\nfunction isEchoInAttributeLikeTextRun(node: WrappedNode): boolean {\n  if (node.prev?.kind !== NodeKind.Text || node.next?.kind !== NodeKind.Text) {\n    return false;\n  }\n\n  const prevTrimmed = node.prev.rawText.trimEnd();\n  const nextTrimmed = node.next.rawText.trimStart();\n\n  return /=\\s*[\"']$/.test(prevTrimmed) && /^[\"']/.test(nextTrimmed);\n}\n\nfunction shouldCompensateInlineEchoPrintWidth(node: WrappedNode): boolean {\n  const parent = node.parent;\n  if (!parent || parent.kind !== NodeKind.Element) {\n    return false;\n  }\n\n  if (parent.tagName === \"style\" || parent.tagName === \"script\") {\n    return false;\n  }\n\n  // Opening-tag echoes interact with attribute layout and should keep the base width.\n  if (node.start < parent.openTagEndOffset) {\n    return false;\n  }\n\n  if (parent.fullName === \"title\") {\n    return (\n      (node.prev === null || isWhitespaceTextNode(node.prev)) &&\n      (node.next === null || isWhitespaceTextNode(node.next))\n    );\n  }\n\n  return isNonWhitespaceTextNode(node.prev) || isNonWhitespaceTextNode(node.next);\n}\n\nfunction withCompensatedInlineEchoPrintWidth(wrappedSnippet: string, options: Options): Options {\n  return {\n    ...(options as Record<string, unknown>),\n    printWidth: getCompensatedDelegatedPhpPrintWidth(wrappedSnippet, options),\n  } as Options;\n}\n\nexport async function formatDirectiveNodeArgs(\n  node: WrappedNode,\n  options: Options,\n): Promise<string | null> {\n  const mode = getMode(options);\n  if (mode === \"off\") return null;\n  if (!isPhpTargetEnabled(options, \"directiveArgs\")) return null;\n  if (!isDirectiveWithArgsNode(node)) return null;\n  const activeMode: ActivePhpFormattingMode = mode;\n\n  const argsToken = findFirstToken(node, TokenType.DirectiveArgs);\n  if (!argsToken) return null;\n\n  const rawArgs = node.source.slice(argsToken.start, argsToken.end);\n  if (!rawArgs.startsWith(\"(\") || !rawArgs.endsWith(\")\")) return null;\n\n  const argsInner = rawArgs.slice(1, -1);\n  if (argsInner.trim().length === 0) return null;\n  const hasWrappedMultilineArgs = hasWrappedMultilineDirectiveArgs(rawArgs);\n  const originalWasSingleLine = !/[\\r\\n]/u.test(argsInner);\n  const originalHadTrailingComma = hasTrailingComma(argsInner.trimEnd());\n\n  const directiveName = getDirectiveName(node) ?? \"\";\n  const shouldPreserveArrayTrailingComma = shouldPreserveFinalArrayTrailingComma(\n    directiveName,\n    argsInner,\n    options,\n  );\n  const directiveWrapperContext = getDirectiveWrapperContext(node);\n  const formatAttempts = getDirectivePhpFormatAttempts(\n    directiveName,\n    argsInner,\n    activeMode,\n    options,\n    directiveWrapperContext,\n  );\n\n  for (const attempt of formatAttempts) {\n    const wrapped = attempt.wrapped;\n    const formatted = await formatPhpSnippet(\n      wrapped,\n      options,\n      activeMode,\n      FORCED_DIRECTIVE_ARG_TRAILING_COMMA,\n    );\n    if (!formatted) continue;\n\n    const extracted = getTextBetweenMarkers(\n      formatted,\n      DIRECTIVE_START_MARKER_COMMENT,\n      DIRECTIVE_END_MARKER_COMMENT,\n    );\n    if (extracted === null) continue;\n\n    const normalizedPayload = normalizePayload(extracted);\n    const payload = normalizeFinalArrayTrailingComma(\n      normalizeTrailingComma(\n        normalizedPayload,\n        originalHadTrailingComma || hasTrailingComma(normalizedPayload.trimEnd()),\n      ),\n      shouldPreserveArrayTrailingComma,\n    );\n    const collapsedInlinePayload = originalWasSingleLine\n      ? tryCollapseDirectivePayloadSingleLine(payload)\n      : null;\n    const finalPayload =\n      collapsedInlinePayload &&\n      shouldPreferInlineDirectiveArgs(node, directiveName, collapsedInlinePayload, options)\n        ? collapsedInlinePayload\n        : payload;\n    const shouldPreserveWrappedMultilineArgs =\n      hasWrappedMultilineArgs && attempt.preserveWrappedMultilineArgs;\n    const formattedArgs = shouldPreserveWrappedMultilineArgs\n      ? `(\\n${indentMultilinePayload(\n          normalizeWrappedDirectiveArgsPayload(dedentMultiline(finalPayload)),\n          options,\n        )}\\n)`\n      : `(${finalPayload})`;\n    return rebuildDirectiveWithFormattedArgs(node, formattedArgs, options);\n  }\n\n  return null;\n}\n\nexport async function formatEchoNode(node: WrappedNode, options: Options): Promise<string | null> {\n  const mode = getMode(options);\n  if (mode === \"off\") return null;\n  if (!isPhpTargetEnabled(options, \"echo\")) return null;\n  if (!isEchoNode(node)) return null;\n  if (isEchoInAttributeLikeTextRun(node)) return null;\n\n  const content = getEchoContent(node);\n  if (content === null || content.trim().length === 0) return null;\n  const trimmedContent = content.trim();\n\n  const wrapped = wrapEchoExpression(trimmedContent);\n  const delegatedOptions = shouldCompensateInlineEchoPrintWidth(node)\n    ? withCompensatedInlineEchoPrintWidth(wrapped, options)\n    : options;\n  const singleQuoteOverride = isInBladeComponentOpenTag(node, options) ? true : undefined;\n  const formatted = await formatPhpSnippet(\n    wrapped,\n    delegatedOptions,\n    mode,\n    undefined,\n    singleQuoteOverride,\n  );\n  if (!formatted) return null;\n\n  const extracted = getTextBetweenMarkers(formatted);\n  if (extracted === null) return null;\n\n  const expression = normalizePayload(stripLeadingEchoKeyword(extracted));\n  const normalizedExpression = normalizePayload(stripTrailingSemicolon(expression));\n  if (!normalizedExpression) return null;\n\n  const delimiters = getEchoDelimiters(node);\n  if (normalizedExpression.includes(\"\\n\")) {\n    const indentedExpression = indentMultilinePayload(normalizedExpression, options);\n    return `${delimiters.open}\\n${indentedExpression}\\n${delimiters.close}`;\n  }\n\n  const spacing = getEchoSpacingMode(options);\n  if (spacing === \"tight\") {\n    return `${delimiters.open}${normalizedExpression}${delimiters.close}`;\n  }\n\n  return `${delimiters.open} ${normalizedExpression} ${delimiters.close}`;\n}\n\nexport async function formatPhpTagNode(\n  node: WrappedNode,\n  options: Options,\n): Promise<string | null> {\n  const mode = getMode(options);\n  if (mode === \"off\") return null;\n  if (!isPhpTargetEnabled(options, \"phpTag\")) return null;\n  if (!isPhpTagNode(node)) return null;\n\n  const raw = fullText(node);\n  if (raw.trim().length === 0) return null;\n\n  return formatPhpSnippet(raw, options, mode);\n}\n\nexport async function formatPhpBlockNode(\n  node: WrappedNode,\n  options: Options,\n): Promise<string | null> {\n  const mode = getMode(options);\n  if (mode === \"off\") return null;\n  if (!isPhpTargetEnabled(options, \"phpBlock\")) return null;\n  if (!isPhpBlockNode(node)) return null;\n\n  const startToken = findFirstToken(node, TokenType.PhpBlockStart);\n  const endToken = findFirstToken(node, TokenType.PhpBlockEnd);\n  if (!startToken || !endToken) return null;\n\n  const opener = node.source.slice(startToken.start, startToken.end);\n  const closer = node.source.slice(endToken.start, endToken.end);\n  const body = node.source.slice(startToken.end, endToken.start);\n\n  const wrapped = `<?php\\n${START_MARKER_COMMENT}\\n${body}\\n${END_MARKER_COMMENT}\\n`;\n  const formatted = await formatPhpSnippet(wrapped, options, mode);\n  if (!formatted) return null;\n\n  const extracted = getTextBetweenMarkers(formatted);\n  if (extracted === null) return null;\n\n  const formattedBody = normalizePhpDocBlockIndentation(dedentMultiline(extracted));\n  const originalBlockText = node.source.slice(startToken.start, endToken.end);\n  const originallyInline = !/[\\r\\n]/.test(originalBlockText);\n\n  if (originallyInline && !formattedBody.includes(\"\\n\")) {\n    if (formattedBody.length === 0) {\n      return `${opener} ${closer}`;\n    }\n    return `${opener} ${formattedBody} ${closer}`;\n  }\n\n  if (formattedBody.length === 0) {\n    return `${opener}\\n${closer}`;\n  }\n\n  const indentedBody = indentPhpBlockBody(formattedBody, options);\n  return `${opener}\\n${indentedBody}\\n${closer}`;\n}\n","import type { AstPath, Doc, Options } from \"prettier\";\r\nimport { doc } from \"prettier\";\r\nimport { format as prettierFormat } from \"prettier\";\r\nimport type { WrappedNode } from \"../../types.js\";\r\nimport {\r\n  trimFinalLineBreak,\r\n  normalizeLineEndingsToLf,\r\n  trimTrailingHorizontalWhitespace,\r\n} from \"../../string-utils.js\";\r\nimport {\r\n  isLikelyInsideScriptComment,\r\n  isLikelyInsideScriptLiteralOrComment,\r\n} from \"../../rawtext-script-scanner.js\";\r\nimport { NodeKind, StructureRole } from \"../../tree/types.js\";\r\nimport { TokenType } from \"../../lexer/types.js\";\r\nimport { dedentString, fullText, getAttrMap, inferElementParser } from \"../utils.js\";\r\nimport {\r\n  printClosingTag,\r\n  printClosingTagSuffix,\r\n  printOpeningTag,\r\n  printOpeningTagPrefix,\r\n} from \"../tag.js\";\r\nimport { printDirective } from \"../directive.js\";\r\nimport { printEcho } from \"../echo.js\";\r\nimport { normalizeMultilineEchoIndentText } from \"../echo-normalization.js\";\r\nimport { replaceEndOfLine } from \"../doc-utils.js\";\r\nimport { getEchoSpacingMode } from \"../blade-options.js\";\r\nimport { isBladeConstructChild, parentContainsBladeSyntax } from \"../blade-syntax.js\";\r\nimport {\r\n  formatDirectiveNodeArgs,\r\n  formatEchoNode,\r\n  formatPhpBlockNode,\r\n  formatPhpTagNode,\r\n  isPhpFormattingEnabled,\r\n} from \"./php.js\";\r\nimport { resolveEmbeddedParserPlugins } from \"./embedded-parser-plugins.js\";\r\n\r\nconst { group, hardline, indent } = doc.builders;\r\n\r\ntype EmbedPrint = (selector?: string | number | Array<string | number> | AstPath) => Doc;\r\n\r\ntype LeafConstructNode = WrappedNode & {\r\n  kind:\r\n    | NodeKind.Directive\r\n    | NodeKind.Echo\r\n    | NodeKind.RawEcho\r\n    | NodeKind.TripleEcho\r\n    | NodeKind.PhpBlock\r\n    | NodeKind.PhpTag\r\n    | NodeKind.BladeComment\r\n    | NodeKind.Comment\r\n    | NodeKind.BogusComment\r\n    | NodeKind.NonOutput;\r\n};\r\n\r\ntype PlaceholderKind = \"expr\" | \"stmt\";\r\n\r\ninterface PlaceholderSlot {\r\n  readonly node: LeafConstructNode;\r\n  readonly start: number;\r\n  readonly end: number;\r\n  readonly marker: string;\r\n  readonly replacementText: string;\r\n}\r\n\r\ninterface PlaceholderCandidate {\r\n  readonly node: LeafConstructNode;\r\n  readonly start: number;\r\n  readonly end: number;\r\n  readonly kind: PlaceholderKind;\r\n  readonly inStyleValueContext: boolean;\r\n  readonly replacementText: string;\r\n}\r\n\r\ninterface StyleCommentSlot {\r\n  readonly marker: string;\r\n  readonly text: string;\r\n}\r\n\r\ntype TextTransform = (value: string) => string;\r\n\r\nconst EXPRESSION_DIRECTIVES = new Set([\"json\", \"js\", \"entangle\", \"this\"]);\r\nfunction isLeafConstructNode(node: WrappedNode): node is LeafConstructNode {\r\n  switch (node.kind) {\r\n    case NodeKind.Directive:\r\n    case NodeKind.Echo:\r\n    case NodeKind.RawEcho:\r\n    case NodeKind.TripleEcho:\r\n    case NodeKind.PhpBlock:\r\n    case NodeKind.PhpTag:\r\n    case NodeKind.BladeComment:\r\n    case NodeKind.Comment:\r\n    case NodeKind.BogusComment:\r\n    case NodeKind.NonOutput:\r\n      return true;\r\n    default:\r\n      return false;\r\n  }\r\n}\r\n\r\nfunction extractDirectiveName(node: WrappedNode): string | null {\r\n  if (node.kind !== NodeKind.Directive) return null;\r\n  const tokenStart = node.flat.tokenStart;\r\n  const tokenEnd = tokenStart + node.flat.tokenCount;\r\n  const tokens = node.buildResult.tokens;\r\n\r\n  for (let i = tokenStart; i < tokenEnd; i++) {\r\n    const token = tokens[i];\r\n    if (token.type !== TokenType.Directive) continue;\r\n    const raw = node.source.slice(token.start, token.end);\r\n    if (!raw.startsWith(\"@\")) return null;\r\n    return raw.slice(1).toLowerCase();\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\nfunction hasDirectiveArgsToken(node: WrappedNode): boolean {\r\n  if (node.kind !== NodeKind.Directive) return false;\r\n\r\n  const tokenStart = node.flat.tokenStart;\r\n  const tokenEnd = tokenStart + node.flat.tokenCount;\r\n  const tokens = node.buildResult.tokens;\r\n\r\n  for (let i = tokenStart; i < tokenEnd; i++) {\r\n    if (tokens[i].type === TokenType.DirectiveArgs) {\r\n      return true;\r\n    }\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\nfunction isPhpDirectiveWithArgs(node: WrappedNode): boolean {\r\n  return extractDirectiveName(node) === \"php\" && hasDirectiveArgsToken(node);\r\n}\r\n\r\nfunction isExpressionDirective(node: WrappedNode): boolean {\r\n  const name = extractDirectiveName(node);\r\n  return name !== null && (EXPRESSION_DIRECTIVES.has(name) || isPhpDirectiveWithArgs(node));\r\n}\r\n\r\nfunction isKnownBladeDirective(node: WrappedNode): boolean {\r\n  const name = extractDirectiveName(node);\r\n  if (!name) {\r\n    return false;\r\n  }\r\n\r\n  return node.buildResult.directives?.getDirective(name) !== undefined;\r\n}\r\n\r\nfunction getPlaceholderKind(node: LeafConstructNode): PlaceholderKind {\r\n  switch (node.kind) {\r\n    case NodeKind.Echo:\r\n    case NodeKind.RawEcho:\r\n    case NodeKind.TripleEcho:\r\n      return \"expr\";\r\n    case NodeKind.PhpTag:\r\n    case NodeKind.PhpBlock:\r\n      return \"expr\";\r\n    case NodeKind.Directive: {\r\n      return isExpressionDirective(node) ? \"expr\" : \"stmt\";\r\n    }\r\n    default:\r\n      return \"stmt\";\r\n  }\r\n}\r\n\r\nfunction isMultilineEchoConstruct(node: LeafConstructNode): boolean {\r\n  if (!isEchoConstruct(node)) {\r\n    return false;\r\n  }\r\n\r\n  const raw = fullText(node);\r\n  return raw.includes(\"\\n\") || raw.includes(\"\\r\");\r\n}\r\n\r\nfunction isEchoConstruct(node: LeafConstructNode): boolean {\r\n  if (\r\n    node.kind !== NodeKind.Echo &&\r\n    node.kind !== NodeKind.RawEcho &&\r\n    node.kind !== NodeKind.TripleEcho\r\n  ) {\r\n    return false;\r\n  }\r\n\r\n  return true;\r\n}\r\n\r\nfunction isBladeOrPhpFallbackConstruct(node: LeafConstructNode): boolean {\r\n  switch (node.kind) {\r\n    case NodeKind.Directive:\r\n    case NodeKind.Echo:\r\n    case NodeKind.RawEcho:\r\n    case NodeKind.TripleEcho:\r\n    case NodeKind.PhpBlock:\r\n    case NodeKind.PhpTag:\r\n    case NodeKind.BladeComment:\r\n      return true;\r\n    default:\r\n      return false;\r\n  }\r\n}\r\n\r\nfunction isStyleParser(parser: string): boolean {\r\n  return parser === \"css\" || parser === \"scss\" || parser === \"less\";\r\n}\r\n\r\nfunction getPlaceholderMarker(\r\n  markerSessionKey: string,\r\n  kind: PlaceholderKind,\r\n  index: number,\r\n  parser: string,\r\n  inStyleValueContext = false,\r\n): string {\r\n  if (isStyleParser(parser)) {\r\n    if (inStyleValueContext) {\r\n      return `__blade_value_slot_${markerSessionKey}_${index}__`;\r\n    }\r\n    return kind === \"expr\"\r\n      ? `/*__blade_expr_slot_${markerSessionKey}_${index}__*/`\r\n      : `@__blade_stmt_slot_${markerSessionKey}_${index};`;\r\n  }\r\n\r\n  if (kind === \"expr\") {\r\n    return `__blade_expr_slot_${markerSessionKey}_${index}__`;\r\n  }\r\n  return `/*__blade_stmt_slot_${markerSessionKey}_${index}__*/`;\r\n}\r\n\r\nfunction createMarkerSessionKey(source: string, start: number, end: number): string {\r\n  const base = `${source.length.toString(36)}_${start.toString(36)}_${end.toString(36)}`;\r\n\r\n  for (let attempt = 0; ; attempt++) {\r\n    const candidate = attempt === 0 ? base : `${base}_${attempt.toString(36)}`;\r\n    if (\r\n      !source.includes(`__blade_expr_slot_${candidate}_`) &&\r\n      !source.includes(`__blade_stmt_slot_${candidate}_`) &&\r\n      !source.includes(`__blade_value_slot_${candidate}_`)\r\n    ) {\r\n      return candidate;\r\n    }\r\n  }\r\n}\r\n\r\nfunction isInCssValueContext(source: string, slotStart: number, contentStart: number): boolean {\r\n  for (let i = slotStart - 1; i >= contentStart; i--) {\r\n    const ch = source[i];\r\n    if (ch === \" \" || ch === \"\\t\" || ch === \"\\r\" || ch === \"\\n\") {\r\n      continue;\r\n    }\r\n    if (ch === \":\") {\r\n      return true;\r\n    }\r\n    if (ch === \"}\") {\r\n      // Blade echo closers (e.g. \"}}\", \"}}}\") appear in CSS values and should\r\n      // not be treated like CSS declaration/block boundaries.\r\n      if (\r\n        (i - 1 >= contentStart && source[i - 1] === \"}\") ||\r\n        (i + 1 < slotStart && source[i + 1] === \"}\") ||\r\n        (i - 1 >= contentStart && source[i - 1] === \"!\")\r\n      ) {\r\n        continue;\r\n      }\r\n      return false;\r\n    }\r\n    if (ch === \"{\") {\r\n      // Blade echo openers (e.g. \"{{\", \"{{{\", \"{!!\") appear in CSS values.\r\n      if (\r\n        (i - 1 >= contentStart && source[i - 1] === \"{\") ||\r\n        (i + 1 < slotStart && source[i + 1] === \"{\") ||\r\n        (i + 1 < slotStart && source[i + 1] === \"!\")\r\n      ) {\r\n        continue;\r\n      }\r\n      return false;\r\n    }\r\n    if (ch === \";\") {\r\n      return false;\r\n    }\r\n    // Keep scanning through property/value tokens until declaration boundaries.\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\nfunction getElementContentRange(node: WrappedNode): { start: number; end: number } {\r\n  if (node.openTagEndOffset > 0 && node.closingTagStartOffset > node.openTagEndOffset) {\r\n    return { start: node.openTagEndOffset, end: node.closingTagStartOffset };\r\n  }\r\n\r\n  if (node.children.length === 0) {\r\n    return { start: node.start, end: node.start };\r\n  }\r\n\r\n  return {\r\n    start: node.children[0].start,\r\n    end: node.children[node.children.length - 1].end,\r\n  };\r\n}\r\n\r\nfunction collectLeafConstructs(node: WrappedNode, start: number, end: number): LeafConstructNode[] {\r\n  const out: LeafConstructNode[] = [];\r\n  const stack: WrappedNode[] = [...node.children];\r\n\r\n  while (stack.length > 0) {\r\n    const current = stack.pop()!;\r\n    if (current.end <= start || current.start >= end) {\r\n      continue;\r\n    }\r\n\r\n    if (isLeafConstructNode(current)) {\r\n      if (current.start >= start && current.end <= end) {\r\n        out.push(current);\r\n      }\r\n      if (current.kind !== NodeKind.Directive || current.children.length === 0) {\r\n        continue;\r\n      }\r\n    }\r\n\r\n    for (let i = current.children.length - 1; i >= 0; i--) {\r\n      stack.push(current.children[i]);\r\n    }\r\n  }\r\n\r\n  out.sort((a, b) => a.start - b.start || a.end - b.end);\r\n  return out;\r\n}\r\n\r\nfunction getReplacementRange(node: LeafConstructNode): { start: number; end: number } {\r\n  if (node.kind !== NodeKind.Directive) {\r\n    return { start: node.start, end: node.end };\r\n  }\r\n\r\n  const tokenStart = node.flat.tokenStart;\r\n  const tokenEnd = tokenStart + node.flat.tokenCount;\r\n  if (node.flat.tokenCount <= 0) {\r\n    return { start: node.start, end: node.end };\r\n  }\r\n\r\n  const first = node.buildResult.tokens[tokenStart];\r\n  const last = node.buildResult.tokens[tokenEnd - 1];\r\n  if (!first || !last) {\r\n    return { start: node.start, end: node.end };\r\n  }\r\n\r\n  return { start: first.start, end: last.end };\r\n}\r\n\r\nfunction docToFlatString(value: Doc): string | null {\r\n  if (typeof value === \"string\") return value;\r\n  if (!Array.isArray(value)) return null;\r\n\r\n  let out = \"\";\r\n  for (const part of value) {\r\n    const rendered = docToFlatString(part);\r\n    if (rendered === null) return null;\r\n    out += rendered;\r\n  }\r\n\r\n  return out;\r\n}\r\n\r\nasync function getConstructReplacementText(\r\n  node: LeafConstructNode,\r\n  options: Options,\r\n): Promise<string> {\r\n  switch (node.kind) {\r\n    case NodeKind.Echo:\r\n    case NodeKind.RawEcho:\r\n    case NodeKind.TripleEcho: {\r\n      const formatted = await formatEchoNode(node, options);\r\n      if (formatted !== null) return normalizeMultilineEchoIndentText(node, formatted, options);\r\n      const rendered = docToFlatString(printEcho(node, options));\r\n      return normalizeMultilineEchoIndentText(node, rendered ?? fullText(node), options);\r\n    }\r\n    case NodeKind.Directive: {\r\n      const formatted = await formatDirectiveNodeArgs(node, options);\r\n      if (formatted !== null) return formatted;\r\n      const rendered = docToFlatString(printDirective(node, options));\r\n      return rendered ?? fullText(node);\r\n    }\r\n    case NodeKind.PhpTag: {\r\n      const formatted = await formatPhpTagNode(node, options);\r\n      return formatted ?? fullText(node);\r\n    }\r\n    case NodeKind.PhpBlock: {\r\n      const formatted = await formatPhpBlockNode(node, options);\r\n      return formatted ?? fullText(node);\r\n    }\r\n    default:\r\n      return fullText(node);\r\n  }\r\n}\r\n\r\nfunction buildMaskedSource(\r\n  source: string,\r\n  start: number,\r\n  end: number,\r\n  slots: readonly PlaceholderSlot[],\r\n): string {\r\n  let cursor = start;\r\n  let out = \"\";\r\n\r\n  for (const slot of slots) {\r\n    out += source.slice(cursor, slot.start);\r\n    out += slot.marker;\r\n    cursor = slot.end;\r\n  }\r\n\r\n  out += source.slice(cursor, end);\r\n  return out;\r\n}\r\n\r\nfunction normalizeStyleValueReplacementText(value: string): string {\r\n  const lines = normalizeLineEndingsToLf(value).split(\"\\n\");\r\n  if (lines.length <= 1) {\r\n    return value;\r\n  }\r\n\r\n  let minIndent = Number.POSITIVE_INFINITY;\r\n  for (let i = 1; i < lines.length; i++) {\r\n    const line = lines[i];\r\n    if (!line || line.trim().length === 0) {\r\n      continue;\r\n    }\r\n\r\n    const indent = line.match(/^[ \\t]*/u)?.[0].length ?? 0;\r\n    if (indent < minIndent) {\r\n      minIndent = indent;\r\n    }\r\n  }\r\n\r\n  if (!Number.isFinite(minIndent) || minIndent <= 0) {\r\n    return lines.join(\"\\n\");\r\n  }\r\n\r\n  for (let i = 1; i < lines.length; i++) {\r\n    const line = lines[i];\r\n    if (!line || line.trim().length === 0) {\r\n      continue;\r\n    }\r\n\r\n    lines[i] = line.slice(Math.min(minIndent, line.length));\r\n  }\r\n\r\n  return lines.join(\"\\n\");\r\n}\r\n\r\nfunction applyMarkerReplacements(\r\n  value: string,\r\n  slots: readonly PlaceholderSlot[],\r\n): { text: string; allFound: boolean } {\r\n  let out = value;\r\n  let allFound = true;\r\n\r\n  for (const slot of slots) {\r\n    const start = out.indexOf(slot.marker);\r\n    if (start < 0) {\r\n      allFound = false;\r\n      continue;\r\n    }\r\n\r\n    const duplicate = out.indexOf(slot.marker, start + slot.marker.length) >= 0;\r\n    if (duplicate) {\r\n      allFound = false;\r\n      continue;\r\n    }\r\n\r\n    out = `${out.slice(0, start)}${slot.replacementText}${out.slice(start + slot.marker.length)}`;\r\n  }\r\n\r\n  return { text: out, allFound };\r\n}\r\n\r\nfunction maskStyleDirectiveLikeComments(\r\n  value: string,\r\n  markerSessionKey: string,\r\n): { text: string; slots: readonly StyleCommentSlot[] } {\r\n  const slots: StyleCommentSlot[] = [];\r\n  let index = 0;\r\n  const masked = value.replace(/\\/\\*[^]*?\\*\\//gu, (match) => {\r\n    if (!match.includes(\"@\")) {\r\n      return match;\r\n    }\r\n\r\n    const marker = `/*__blade_comment_slot_${markerSessionKey}_${index}__*/`;\r\n    slots.push({ marker, text: match });\r\n    index++;\r\n    return marker;\r\n  });\r\n\r\n  return { text: masked, slots };\r\n}\r\n\r\nfunction applyStyleCommentReplacements(\r\n  value: string,\r\n  slots: readonly StyleCommentSlot[],\r\n): { text: string; allFound: boolean } {\r\n  let out = value;\r\n  let allFound = true;\r\n\r\n  for (const slot of slots) {\r\n    const start = out.indexOf(slot.marker);\r\n    if (start < 0) {\r\n      allFound = false;\r\n      continue;\r\n    }\r\n\r\n    const duplicate = out.indexOf(slot.marker, start + slot.marker.length) >= 0;\r\n    if (duplicate) {\r\n      allFound = false;\r\n      continue;\r\n    }\r\n\r\n    out = `${out.slice(0, start)}${slot.text}${out.slice(start + slot.marker.length)}`;\r\n  }\r\n\r\n  return { text: out, allFound };\r\n}\r\n\r\nfunction getEmbeddedTextToDocOptions(node: WrappedNode, parser: string): Options {\r\n  const textToDocOptions: Record<string, unknown> = {\r\n    parser,\r\n    __embeddedInHtml: true,\r\n  };\r\n\r\n  if (parser === \"babel\") {\r\n    let sourceType = \"script\";\r\n    const attrMap = getAttrMap(node);\r\n    if (\r\n      attrMap.type === \"module\" ||\r\n      ((attrMap.type === \"text/babel\" || attrMap.type === \"text/jsx\") &&\r\n        attrMap[\"data-type\"] === \"module\")\r\n    ) {\r\n      sourceType = \"module\";\r\n    }\r\n    textToDocOptions.__babelSourceType = sourceType;\r\n  }\r\n\r\n  return textToDocOptions as Options;\r\n}\r\n\r\nasync function createSubformatOptions(\r\n  options: Options,\r\n  parser: string,\r\n  node: WrappedNode,\r\n): Promise<Options> {\r\n  const base = { ...(options as Record<string, unknown>) };\r\n  delete base.parser;\r\n  delete base.parentParser;\r\n  delete base.plugins;\r\n  delete base.rangeStart;\r\n  delete base.rangeEnd;\r\n  delete base.cursorOffset;\r\n\r\n  const plugins = await resolveEmbeddedParserPlugins(options, parser);\r\n\r\n  return {\r\n    ...base,\r\n    ...getEmbeddedTextToDocOptions(node, parser),\r\n    plugins: plugins as Options[\"plugins\"],\r\n  } as Options;\r\n}\r\n\r\nfunction buildScriptLikeElementDoc(\r\n  path: AstPath<WrappedNode>,\r\n  node: WrappedNode,\r\n  options: Options,\r\n  print: EmbedPrint,\r\n  content: Doc,\r\n  rawValue: string,\r\n  contentAlreadyIndented = false,\r\n): Doc {\r\n  const isEmpty = /^\\s*$/.test(rawValue);\r\n\r\n  return [\r\n    printOpeningTagPrefix(node, options),\r\n    group(printOpeningTag(path, options, print as unknown as (path: AstPath<WrappedNode>) => Doc)),\r\n    isEmpty ? \"\" : contentAlreadyIndented ? [hardline, content] : indent([hardline, content]),\r\n    isEmpty ? \"\" : hardline,\r\n    printClosingTag(node, options),\r\n    printClosingTagSuffix(node, options),\r\n  ];\r\n}\r\n\r\nfunction stripBoundaryLineBreaks(value: string): string {\r\n  let next = value;\r\n\r\n  if (next.startsWith(\"\\r\\n\")) {\r\n    next = next.slice(2);\r\n  } else if (next.startsWith(\"\\n\")) {\r\n    next = next.slice(1);\r\n  }\r\n\r\n  if (next.endsWith(\"\\r\\n\")) {\r\n    next = next.slice(0, -2);\r\n  } else if (next.endsWith(\"\\n\")) {\r\n    next = next.slice(0, -1);\r\n  }\r\n\r\n  return next;\r\n}\r\n\r\nfunction trimTrailingWhitespaceOnlyLine(value: string): string {\r\n  return value.replace(/\\r?\\n[^\\S\\r\\n]*$/u, \"\");\r\n}\r\n\r\nfunction applyTextTransforms(value: string, transforms: readonly TextTransform[]): string {\r\n  let next = value;\r\n\r\n  for (const transform of transforms) {\r\n    next = transform(next);\r\n  }\r\n\r\n  return next;\r\n}\r\n\r\nfunction normalizeEmbeddedRawContentFallback(value: string): string {\r\n  return applyTextTransforms(value, [\r\n    stripBoundaryLineBreaks,\r\n    trimTrailingWhitespaceOnlyLine,\r\n    dedentString,\r\n    normalizeLineEndingsToLf,\r\n  ]);\r\n}\r\n\r\nfunction getIndentUnit(options: Options): string {\r\n  return options.useTabs === true ? \"\\t\" : \" \".repeat(options.tabWidth ?? 2);\r\n}\r\n\r\nfunction normalizeStyleEmbeddedOutput(value: string, options: Options): string {\r\n  const indentUnit = getIndentUnit(options);\r\n\r\n  return applyTextTransforms(value, [\r\n    normalizeStyleDirectiveBoundaries,\r\n    normalizeStyleBladeValueIndentation,\r\n    normalizeStyleStructuralDirectiveSemicolons,\r\n    normalizeStyleDirectiveCommentChains,\r\n    normalizeStyleDirectiveCommentSelectorLines,\r\n    normalizeStyleDirectiveChainBlankLines,\r\n    normalizeStyleBlankLineRuns,\r\n    normalizeStyleStandaloneSemicolonLines,\r\n    repairStyleBrokenCommentClosers,\r\n    normalizeStyleCommentRunLines,\r\n    (next) => normalizeStyleDirectiveSelectorAlignment(next, indentUnit),\r\n    trimTrailingHorizontalWhitespace,\r\n  ]);\r\n}\r\n\r\nfunction normalizeEmbeddedOutput(value: string, tagName: string, options: Options): string {\r\n  const normalized = tagName === \"style\" ? normalizeStyleEmbeddedOutput(value, options) : value;\r\n\r\n  return applyTextTransforms(normalized, [\r\n    normalizeLineEndingsToLf,\r\n    trimTrailingWhitespaceOnlyLine,\r\n    trimFinalLineBreak,\r\n  ]);\r\n}\r\n\r\nfunction normalizeStyleDirectiveBoundaries(value: string): string {\r\n  type ScanState = \"code\" | \"single\" | \"double\" | \"lineComment\" | \"blockComment\";\r\n  const directivePattern = /^@[A-Za-z_][A-Za-z0-9_]*(?:\\s*\\([^)]*\\))?/u;\r\n  let state: ScanState = \"code\";\r\n  let out = \"\";\r\n\r\n  for (let i = 0; i < value.length; i++) {\r\n    const ch = value[i];\r\n    const next = i + 1 < value.length ? value[i + 1] : \"\";\r\n\r\n    if (state === \"lineComment\") {\r\n      out += ch;\r\n      if (ch === \"\\n\") {\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"blockComment\") {\r\n      out += ch;\r\n      if (ch === \"*\" && next === \"/\") {\r\n        out += \"/\";\r\n        i++;\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"single\") {\r\n      out += ch;\r\n      if (ch === \"\\\\\") {\r\n        if (i + 1 < value.length) {\r\n          out += value[i + 1];\r\n          i++;\r\n        }\r\n        continue;\r\n      }\r\n      if (ch === \"'\") {\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"double\") {\r\n      out += ch;\r\n      if (ch === \"\\\\\") {\r\n        if (i + 1 < value.length) {\r\n          out += value[i + 1];\r\n          i++;\r\n        }\r\n        continue;\r\n      }\r\n      if (ch === '\"') {\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (ch === \"/\" && next === \"*\") {\r\n      out += \"/*\";\r\n      i++;\r\n      state = \"blockComment\";\r\n      continue;\r\n    }\r\n\r\n    if (ch === \"/\" && next === \"/\" && shouldTreatAsStyleLineComment(value, 0, i)) {\r\n      out += \"//\";\r\n      i++;\r\n      state = \"lineComment\";\r\n      continue;\r\n    }\r\n\r\n    if (ch === \"'\") {\r\n      out += ch;\r\n      state = \"single\";\r\n      continue;\r\n    }\r\n\r\n    if (ch === '\"') {\r\n      out += ch;\r\n      state = \"double\";\r\n      continue;\r\n    }\r\n\r\n    if (ch === \"}\" && value[i - 1] !== \"{\" && next !== \"}\") {\r\n      let j = i + 1;\r\n      while (j < value.length) {\r\n        const ws = value[j];\r\n        if (ws === \" \" || ws === \"\\t\" || ws === \"\\r\" || ws === \"\\n\") {\r\n          j++;\r\n          continue;\r\n        }\r\n        break;\r\n      }\r\n\r\n      if (j > i + 1 && directivePattern.test(value.slice(j))) {\r\n        out += \"}\\n\";\r\n        i = j - 1;\r\n        continue;\r\n      }\r\n    }\r\n\r\n    out += ch;\r\n  }\r\n\r\n  return out;\r\n}\r\n\r\nconst STYLE_DIRECTIVE_BLOCK_OPENERS = new Set([\r\n  \"if\",\r\n  \"unless\",\r\n  \"isset\",\r\n  \"empty\",\r\n  \"for\",\r\n  \"foreach\",\r\n  \"forelse\",\r\n  \"while\",\r\n  \"switch\",\r\n  \"php\",\r\n  \"verbatim\",\r\n]);\r\n\r\nconst STYLE_DIRECTIVE_BLOCK_CLOSERS = new Set([\r\n  \"endif\",\r\n  \"endunless\",\r\n  \"endisset\",\r\n  \"endempty\",\r\n  \"endfor\",\r\n  \"endforeach\",\r\n  \"endforelse\",\r\n  \"endwhile\",\r\n  \"endswitch\",\r\n  \"endphp\",\r\n  \"endverbatim\",\r\n]);\r\n\r\nconst STYLE_DIRECTIVE_BRANCHES = new Set([\"else\", \"elseif\", \"empty\", \"case\", \"default\"]);\r\nconst STYLE_RAW_BLADE_FALLBACK_RE =\r\n  /(?:\\{\\{|\\{!!|@(?:elseif|endif|endunless|endisset|endempty|endfor|endforeach|endforelse|endwhile|endswitch|endphp|endverbatim|foreach|forelse|case|default)\\b)/u;\r\n\r\nexport const LARGE_STYLE_EMBED_CHAR_THRESHOLD = 20_000;\r\nexport const LARGE_STYLE_EMBED_LINE_THRESHOLD = 300;\r\nconst UNSTABLE_STYLE_ESCAPED_SLASH_LITERAL = /\\/[^\\r\\n;{}]*\\\\\\s*\\/\\s*\\//u;\r\n\r\nfunction getDirectiveNameFromLine(trimmedLine: string): string | null {\r\n  const match = trimmedLine.match(/^@([A-Za-z_][A-Za-z0-9_]*)/u);\r\n  return match ? match[1].toLowerCase() : null;\r\n}\r\n\r\nfunction isStyleDirectiveBoundary(node: WrappedNode): boolean {\r\n  const name = extractDirectiveName(node);\r\n  if (name === null) return false;\r\n  if (STYLE_DIRECTIVE_BRANCHES.has(name) || STYLE_DIRECTIVE_BLOCK_CLOSERS.has(name)) {\r\n    return true;\r\n  }\r\n\r\n  return (\r\n    name.startsWith(\"end\") && node.buildResult.directives?.hasSeenDirective(name.slice(3)) === true\r\n  );\r\n}\r\n\r\nfunction isConstructInsideStyleLiteralOrComment(\r\n  node: LeafConstructNode,\r\n  source: string,\r\n  contentStart: number,\r\n  contentEnd: number,\r\n): boolean {\r\n  if (node.kind === NodeKind.Directive) {\r\n    return isDirectiveInsideStyleLiteralOrComment(node, source, contentStart, contentEnd);\r\n  }\r\n\r\n  const replacementRange = getReplacementRange(node);\r\n  if (replacementRange.start < contentStart || replacementRange.end > contentEnd) {\r\n    return false;\r\n  }\r\n\r\n  if (isInsideStyleCommentByLineHeuristic(source, contentStart, replacementRange.start)) {\r\n    return true;\r\n  }\r\n\r\n  return isLikelyInsideStyleLiteralOrComment(source, contentStart, replacementRange.start);\r\n}\r\n\r\nfunction isStyleCommentLine(trimmedLine: string): boolean {\r\n  return (\r\n    (trimmedLine.startsWith(\"/*\") && trimmedLine.endsWith(\"*/\")) || trimmedLine.startsWith(\"//\")\r\n  );\r\n}\r\n\r\nfunction normalizeStyleDirectiveLineArgSpacing(line: string): string {\r\n  const match = line.match(/^([ \\t]*)@([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/u);\r\n  if (!match) {\r\n    return line;\r\n  }\r\n\r\n  const indent = match[1];\r\n  const name = match[2].toLowerCase();\r\n  if (\r\n    !STYLE_DIRECTIVE_BLOCK_OPENERS.has(name) &&\r\n    !STYLE_DIRECTIVE_BRANCHES.has(name) &&\r\n    !STYLE_DIRECTIVE_BLOCK_CLOSERS.has(name) &&\r\n    !EXPRESSION_DIRECTIVES.has(name)\r\n  ) {\r\n    return line;\r\n  }\r\n\r\n  return line.replace(/^([ \\t]*)@([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/u, `${indent}@$2 (`);\r\n}\r\n\r\nfunction isBladeValueLine(trimmedLine: string): boolean {\r\n  return (\r\n    trimmedLine.startsWith(\"@\") ||\r\n    trimmedLine.startsWith(\"{{\") ||\r\n    trimmedLine.startsWith(\"{!!\") ||\r\n    trimmedLine.startsWith(\"<?php\")\r\n  );\r\n}\r\n\r\nfunction splitStyleBladeValueChunks(trimmedLine: string): string[] {\r\n  const directivePattern = /(?:^|\\s)(@[A-Za-z_][A-Za-z0-9_]*(?:\\s*\\([^)]*\\))?)(?=\\s|$)/gu;\r\n  const chunks: string[] = [];\r\n  let cursor = 0;\r\n\r\n  for (const match of trimmedLine.matchAll(directivePattern)) {\r\n    const directive = match[1];\r\n    if (!directive) {\r\n      continue;\r\n    }\r\n\r\n    const fullMatch = match[0];\r\n    const fullStart = match.index ?? 0;\r\n    const directiveStart = fullStart + fullMatch.lastIndexOf(directive);\r\n\r\n    const before = trimmedLine.slice(cursor, directiveStart).trim();\r\n    if (before.length > 0) {\r\n      chunks.push(before);\r\n    }\r\n\r\n    chunks.push(directive);\r\n    cursor = directiveStart + directive.length;\r\n  }\r\n\r\n  const tail = trimmedLine.slice(cursor).trim();\r\n  if (tail.length > 0) {\r\n    chunks.push(tail);\r\n  }\r\n\r\n  if (chunks.length === 0 && trimmedLine.length > 0) {\r\n    chunks.push(trimmedLine);\r\n  }\r\n\r\n  return chunks;\r\n}\r\n\r\nfunction normalizeStyleBladeValueIndentation(value: string): string {\r\n  const lines = value.split(/\\r?\\n/u);\r\n\r\n  for (let i = 0; i < lines.length; i++) {\r\n    const current = lines[i];\r\n    if (!/:\\s*$/u.test(current)) continue;\r\n\r\n    const baseIndent = current.match(/^\\s*/u)?.[0] ?? \"\";\r\n    const firstContent = i + 1;\r\n    if (firstContent >= lines.length) continue;\r\n\r\n    let semicolonIndex = -1;\r\n    let sawBladeValueContent = false;\r\n    const valueChunks: string[] = [];\r\n\r\n    for (let j = firstContent; j < lines.length; j++) {\r\n      const trimmed = lines[j].trim();\r\n      if (trimmed.length === 0) continue;\r\n\r\n      let lineBody = trimmed;\r\n      let sawTrailingSemicolon = false;\r\n\r\n      if (lineBody === \";\") {\r\n        semicolonIndex = j;\r\n        break;\r\n      }\r\n\r\n      if (lineBody.endsWith(\";\")) {\r\n        sawTrailingSemicolon = true;\r\n        semicolonIndex = j;\r\n        lineBody = lineBody.slice(0, -1).trimEnd();\r\n      }\r\n\r\n      if (lineBody.length > 0) {\r\n        const chunks = splitStyleBladeValueChunks(lineBody);\r\n        valueChunks.push(...chunks);\r\n\r\n        if (chunks.some((chunk) => isBladeValueLine(chunk))) {\r\n          sawBladeValueContent = true;\r\n        }\r\n      }\r\n\r\n      if (sawTrailingSemicolon) {\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (!sawBladeValueContent || semicolonIndex < 0 || valueChunks.length === 0) continue;\r\n\r\n    let depth = 0;\r\n    const replacementLines: string[] = [];\r\n    for (const chunk of valueChunks) {\r\n      const trimmed = chunk.trim();\r\n      if (trimmed.length === 0) continue;\r\n\r\n      const directiveName = getDirectiveNameFromLine(trimmed);\r\n      if (\r\n        directiveName &&\r\n        (STYLE_DIRECTIVE_BLOCK_CLOSERS.has(directiveName) ||\r\n          STYLE_DIRECTIVE_BRANCHES.has(directiveName))\r\n      ) {\r\n        depth = Math.max(0, depth - 1);\r\n      }\r\n\r\n      const lineIndent = `${baseIndent}  ${\"  \".repeat(depth)}`;\r\n      replacementLines.push(`${lineIndent}${trimmed}`);\r\n\r\n      if (\r\n        directiveName &&\r\n        (STYLE_DIRECTIVE_BLOCK_OPENERS.has(directiveName) ||\r\n          STYLE_DIRECTIVE_BRANCHES.has(directiveName))\r\n      ) {\r\n        depth++;\r\n      }\r\n    }\r\n\r\n    replacementLines.push(`${baseIndent}  ;`);\r\n    lines.splice(firstContent, semicolonIndex - firstContent + 1, ...replacementLines);\r\n    i = firstContent + replacementLines.length - 1;\r\n  }\r\n\r\n  return lines.join(\"\\n\");\r\n}\r\n\r\nfunction normalizeStyleStructuralDirectiveSemicolons(value: string): string {\r\n  type ScanState = \"code\" | \"single\" | \"double\" | \"lineComment\" | \"blockComment\";\r\n  let state: ScanState = \"code\";\r\n  let out = \"\";\r\n  let lineCode = \"\";\r\n\r\n  for (let i = 0; i < value.length; i++) {\r\n    const ch = value[i];\r\n    const next = i + 1 < value.length ? value[i + 1] : \"\";\r\n\r\n    if (state === \"lineComment\") {\r\n      out += ch;\r\n      if (ch === \"\\n\") {\r\n        state = \"code\";\r\n        lineCode = \"\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"blockComment\") {\r\n      out += ch;\r\n      if (ch === \"\\n\") {\r\n        lineCode = \"\";\r\n      }\r\n      if (ch === \"*\" && next === \"/\") {\r\n        out += \"/\";\r\n        i++;\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"single\") {\r\n      out += ch;\r\n      if (ch === \"\\\\\") {\r\n        if (i + 1 < value.length) {\r\n          out += value[i + 1];\r\n          i++;\r\n        }\r\n        continue;\r\n      }\r\n      if (ch === \"'\") {\r\n        state = \"code\";\r\n      }\r\n      if (ch === \"\\n\") {\r\n        lineCode = \"\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"double\") {\r\n      out += ch;\r\n      if (ch === \"\\\\\") {\r\n        if (i + 1 < value.length) {\r\n          out += value[i + 1];\r\n          i++;\r\n        }\r\n        continue;\r\n      }\r\n      if (ch === '\"') {\r\n        state = \"code\";\r\n      }\r\n      if (ch === \"\\n\") {\r\n        lineCode = \"\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (ch === \"/\" && next === \"*\") {\r\n      out += \"/*\";\r\n      i++;\r\n      state = \"blockComment\";\r\n      continue;\r\n    }\r\n\r\n    if (ch === \"/\" && next === \"/\" && shouldTreatAsStyleLineComment(value, 0, i)) {\r\n      out += \"//\";\r\n      i++;\r\n      state = \"lineComment\";\r\n      continue;\r\n    }\r\n\r\n    if (ch === \"'\") {\r\n      out += ch;\r\n      lineCode += ch;\r\n      state = \"single\";\r\n      continue;\r\n    }\r\n\r\n    if (ch === '\"') {\r\n      out += ch;\r\n      lineCode += ch;\r\n      state = \"double\";\r\n      continue;\r\n    }\r\n\r\n    if (ch === \";\") {\r\n      const directiveMatch = lineCode.match(/@([A-Za-z_][A-Za-z0-9_]*)(?:\\s*\\([^)]*\\))?\\s*$/u);\r\n      if (directiveMatch && lineCode.trimStart().startsWith(\"@\")) {\r\n        const name = directiveMatch[1].toLowerCase();\r\n        if (\r\n          STYLE_DIRECTIVE_BLOCK_OPENERS.has(name) ||\r\n          STYLE_DIRECTIVE_BRANCHES.has(name) ||\r\n          STYLE_DIRECTIVE_BLOCK_CLOSERS.has(name)\r\n        ) {\r\n          let j = i + 1;\r\n          while (j < value.length) {\r\n            const ws = value[j];\r\n            if (ws === \" \" || ws === \"\\t\" || ws === \"\\r\") {\r\n              j++;\r\n              continue;\r\n            }\r\n            break;\r\n          }\r\n\r\n          const nextCh = j < value.length ? value[j] : \"\";\r\n          const nextNextCh = j + 1 < value.length ? value[j + 1] : \"\";\r\n          if (\r\n            nextCh === \"\" ||\r\n            nextCh === \"\\n\" ||\r\n            (nextCh === \"/\" && nextNextCh === \"*\") ||\r\n            (nextCh === \"/\" && nextNextCh === \"/\")\r\n          ) {\r\n            continue;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    out += ch;\r\n    if (ch === \"\\n\") {\r\n      lineCode = \"\";\r\n    } else {\r\n      lineCode += ch;\r\n    }\r\n  }\r\n\r\n  return out;\r\n}\r\n\r\nfunction normalizeStyleDirectiveCommentChains(value: string): string {\r\n  const lines = value.split(/\\r?\\n/u);\r\n  const out: string[] = [];\r\n\r\n  for (const line of lines) {\r\n    const trimmed = line.trim();\r\n    if (trimmed.length === 0 || !trimmed.includes(\"@\")) {\r\n      out.push(line);\r\n      continue;\r\n    }\r\n\r\n    const indent = line.match(/^\\s*/u)?.[0] ?? \"\";\r\n    const tokenRe = /@[A-Za-z_][A-Za-z0-9_]*(?:\\s*\\([^)]*\\))?|\\/\\*[^]*?\\*\\//gu;\r\n    const tokens = Array.from(trimmed.matchAll(tokenRe), (match) => match[0].trim());\r\n    if (tokens.length <= 1) {\r\n      out.push(line);\r\n      continue;\r\n    }\r\n\r\n    const remainder = trimmed\r\n      .replace(/@[A-Za-z_][A-Za-z0-9_]*(?:\\s*\\([^)]*\\))?|\\/\\*[^]*?\\*\\//gu, \"\")\r\n      .trim();\r\n    if (remainder.length > 0) {\r\n      out.push(line);\r\n      continue;\r\n    }\r\n\r\n    if (\r\n      !tokens.some((token) => token.startsWith(\"@\")) ||\r\n      !tokens.every((token) => token.startsWith(\"@\") || token.startsWith(\"/*\"))\r\n    ) {\r\n      out.push(line);\r\n      continue;\r\n    }\r\n\r\n    for (const token of tokens) {\r\n      if (token.startsWith(\"@\")) {\r\n        out.push(normalizeStyleDirectiveLineArgSpacing(`${indent}${token}`));\r\n      } else {\r\n        out.push(`${indent}${token}`);\r\n      }\r\n    }\r\n  }\r\n\r\n  return out.join(\"\\n\");\r\n}\r\n\r\nfunction normalizeStyleDirectiveCommentSelectorLines(value: string): string {\r\n  const lines = value.split(/\\r?\\n/u);\r\n  const out: string[] = [];\r\n  const selectorLikeStartRe = /^([.#:[*]|[A-Za-z_]).*\\{/u;\r\n\r\n  for (const line of lines) {\r\n    const indent = line.match(/^\\s*/u)?.[0] ?? \"\";\r\n    const trimmed = line.trim();\r\n    const directiveMatch = trimmed.match(/^@[A-Za-z_][A-Za-z0-9_]*(?:\\s*\\([^)]*\\))?/u);\r\n    if (!directiveMatch) {\r\n      out.push(line);\r\n      continue;\r\n    }\r\n\r\n    const directiveName = getDirectiveNameFromLine(directiveMatch[0]);\r\n    if (\r\n      !directiveName ||\r\n      (!STYLE_DIRECTIVE_BLOCK_OPENERS.has(directiveName) &&\r\n        !STYLE_DIRECTIVE_BRANCHES.has(directiveName) &&\r\n        !STYLE_DIRECTIVE_BLOCK_CLOSERS.has(directiveName))\r\n    ) {\r\n      out.push(line);\r\n      continue;\r\n    }\r\n\r\n    let cursor = directiveMatch[0].length;\r\n    const comments: string[] = [];\r\n    for (;;) {\r\n      const rest = trimmed.slice(cursor).trimStart();\r\n      if (!rest.startsWith(\"/*\")) {\r\n        break;\r\n      }\r\n\r\n      const commentEnd = rest.indexOf(\"*/\");\r\n      if (commentEnd < 0) {\r\n        break;\r\n      }\r\n\r\n      comments.push(rest.slice(0, commentEnd + 2));\r\n      cursor = trimmed.length - rest.length + commentEnd + 2;\r\n    }\r\n\r\n    const tail = trimmed.slice(cursor).trimStart();\r\n    if (comments.length === 0 || tail.length === 0 || !selectorLikeStartRe.test(tail)) {\r\n      out.push(line);\r\n      continue;\r\n    }\r\n\r\n    out.push(normalizeStyleDirectiveLineArgSpacing(`${indent}${directiveMatch[0]}`));\r\n    for (const comment of comments) {\r\n      out.push(`${indent}${comment}`);\r\n    }\r\n    out.push(`${indent}${tail}`);\r\n  }\r\n\r\n  return out.join(\"\\n\");\r\n}\r\n\r\nfunction classifyStyleDirectiveChainLine(\r\n  line: string,\r\n): \"structuralDirective\" | \"directiveComment\" | \"genericComment\" | \"other\" {\r\n  const trimmed = line.trim();\r\n  if (trimmed.length === 0) {\r\n    return \"other\";\r\n  }\r\n\r\n  const directiveName = getDirectiveNameFromLine(trimmed);\r\n  if (\r\n    directiveName &&\r\n    (STYLE_DIRECTIVE_BLOCK_OPENERS.has(directiveName) ||\r\n      STYLE_DIRECTIVE_BRANCHES.has(directiveName) ||\r\n      STYLE_DIRECTIVE_BLOCK_CLOSERS.has(directiveName))\r\n  ) {\r\n    return \"structuralDirective\";\r\n  }\r\n\r\n  if (isStyleCommentLine(trimmed)) {\r\n    if (/^\\/\\*\\s*@/u.test(trimmed) || /^\\/\\/\\s*@/u.test(trimmed)) {\r\n      return \"directiveComment\";\r\n    }\r\n\r\n    return \"genericComment\";\r\n  }\r\n\r\n  return \"other\";\r\n}\r\n\r\nfunction normalizeStyleDirectiveChainBlankLines(value: string): string {\r\n  const lines = value.split(/\\r?\\n/u);\r\n  const out: string[] = [];\r\n\r\n  for (let i = 0; i < lines.length; i++) {\r\n    const current = lines[i];\r\n    if (current.trim().length > 0) {\r\n      out.push(current);\r\n      continue;\r\n    }\r\n\r\n    let prevIndex = out.length - 1;\r\n    while (prevIndex >= 0 && out[prevIndex].trim().length === 0) {\r\n      prevIndex--;\r\n    }\r\n\r\n    let nextIndex = i + 1;\r\n    while (nextIndex < lines.length && lines[nextIndex].trim().length === 0) {\r\n      nextIndex++;\r\n    }\r\n\r\n    if (prevIndex < 0 || nextIndex >= lines.length) {\r\n      out.push(current);\r\n      continue;\r\n    }\r\n\r\n    const prevKind = classifyStyleDirectiveChainLine(out[prevIndex]);\r\n    const nextKind = classifyStyleDirectiveChainLine(lines[nextIndex]);\r\n    const shouldDrop =\r\n      (prevKind === \"structuralDirective\" && nextKind === \"structuralDirective\") ||\r\n      (prevKind === \"structuralDirective\" && nextKind === \"genericComment\") ||\r\n      (prevKind === \"genericComment\" && nextKind === \"structuralDirective\") ||\r\n      (prevKind === \"directiveComment\" && nextKind === \"structuralDirective\") ||\r\n      (prevKind === \"structuralDirective\" && nextKind === \"directiveComment\") ||\r\n      (prevKind === \"directiveComment\" && nextKind === \"genericComment\") ||\r\n      (prevKind === \"genericComment\" && nextKind === \"directiveComment\");\r\n\r\n    if (!shouldDrop) {\r\n      out.push(current);\r\n    }\r\n  }\r\n\r\n  return out.join(\"\\n\");\r\n}\r\n\r\nfunction normalizeStyleBlankLineRuns(value: string): string {\r\n  const lines = value.split(/\\r?\\n/u);\r\n  const out: string[] = [];\r\n  let blankRun = 0;\r\n\r\n  for (const line of lines) {\r\n    if (line.trim().length === 0) {\r\n      blankRun++;\r\n      if (blankRun <= 1) {\r\n        out.push(\"\");\r\n      }\r\n      continue;\r\n    }\r\n\r\n    blankRun = 0;\r\n    out.push(line);\r\n  }\r\n\r\n  return out.join(\"\\n\");\r\n}\r\n\r\nfunction normalizeStyleStandaloneSemicolonLines(value: string): string {\r\n  const lines = value.split(/\\r?\\n/u);\r\n  const out: string[] = [];\r\n\r\n  for (let i = 0; i < lines.length; i++) {\r\n    const trimmed = lines[i].trim();\r\n    if (trimmed !== \";\") {\r\n      out.push(lines[i]);\r\n      continue;\r\n    }\r\n\r\n    let prevIndex = out.length - 1;\r\n    while (prevIndex >= 0 && out[prevIndex].trim().length === 0) {\r\n      prevIndex--;\r\n    }\r\n    if (prevIndex < 0) {\r\n      out.push(lines[i]);\r\n      continue;\r\n    }\r\n\r\n    const previousDirective = getDirectiveNameFromLine(out[prevIndex].trim());\r\n    const isStructuralDirective =\r\n      previousDirective !== null &&\r\n      (STYLE_DIRECTIVE_BLOCK_OPENERS.has(previousDirective) ||\r\n        STYLE_DIRECTIVE_BRANCHES.has(previousDirective) ||\r\n        STYLE_DIRECTIVE_BLOCK_CLOSERS.has(previousDirective));\r\n\r\n    if (isStructuralDirective) {\r\n      let inValueContext = false;\r\n      for (let j = prevIndex - 1; j >= 0; j--) {\r\n        const candidate = out[j].trim();\r\n        if (candidate.length === 0) {\r\n          continue;\r\n        }\r\n\r\n        if (\r\n          getDirectiveNameFromLine(candidate) !== null ||\r\n          isStyleCommentLine(candidate) ||\r\n          isBladeValueLine(candidate)\r\n        ) {\r\n          continue;\r\n        }\r\n\r\n        if (candidate.endsWith(\":\")) {\r\n          inValueContext = true;\r\n        }\r\n        break;\r\n      }\r\n\r\n      if (inValueContext) {\r\n        out.push(lines[i]);\r\n        continue;\r\n      }\r\n    }\r\n\r\n    if (!isStructuralDirective) {\r\n      out.push(lines[i]);\r\n    }\r\n  }\r\n\r\n  return out.join(\"\\n\");\r\n}\r\n\r\nfunction repairStyleBrokenCommentClosers(value: string): string {\r\n  const lines = value.split(/\\r?\\n/u);\r\n  const out = lines.map((line) => {\r\n    const trimmedStart = line.trimStart();\r\n    if (!trimmedStart.startsWith(\"/*\")) {\r\n      return line;\r\n    }\r\n\r\n    const trimmedEnd = line.trimEnd();\r\n    if (trimmedEnd.endsWith(\"*/\")) {\r\n      return line;\r\n    }\r\n\r\n    if (trimmedEnd.endsWith(\"*;\")) {\r\n      return line.replace(/\\*;$/u, \"*/\");\r\n    }\r\n\r\n    if (trimmedEnd.endsWith(\"*\")) {\r\n      return `${line}/`;\r\n    }\r\n\r\n    return line;\r\n  });\r\n\r\n  return out.join(\"\\n\");\r\n}\r\n\r\nfunction normalizeStyleCommentRunLines(value: string): string {\r\n  const lines = value.split(/\\r?\\n/u);\r\n  const out: string[] = [];\r\n  const selectorLikeStartRe = /^([.#:[*]|[A-Za-z_]).*\\{/u;\r\n\r\n  for (const line of lines) {\r\n    const indent = line.match(/^\\s*/u)?.[0] ?? \"\";\r\n    const trimmed = line.trim();\r\n    if (!trimmed.startsWith(\"/*\")) {\r\n      out.push(line);\r\n      continue;\r\n    }\r\n\r\n    const comments: string[] = [];\r\n    let cursor = 0;\r\n    let parseFailed = false;\r\n\r\n    for (;;) {\r\n      const rest = trimmed.slice(cursor).trimStart();\r\n      if (!rest.startsWith(\"/*\")) {\r\n        break;\r\n      }\r\n\r\n      const commentEnd = rest.indexOf(\"*/\");\r\n      if (commentEnd < 0) {\r\n        parseFailed = true;\r\n        break;\r\n      }\r\n\r\n      comments.push(rest.slice(0, commentEnd + 2));\r\n      cursor = trimmed.length - rest.length + commentEnd + 2;\r\n    }\r\n\r\n    if (parseFailed || comments.length === 0) {\r\n      out.push(line);\r\n      continue;\r\n    }\r\n\r\n    const tail = trimmed.slice(cursor).trimStart();\r\n    const shouldSplit =\r\n      comments.length >= 2 ||\r\n      (tail.length > 0 &&\r\n        (selectorLikeStartRe.test(tail) || tail.startsWith(\"@\") || tail.startsWith(\"/*\")));\r\n    if (!shouldSplit) {\r\n      out.push(line);\r\n      continue;\r\n    }\r\n\r\n    for (const comment of comments) {\r\n      out.push(`${indent}${comment}`);\r\n    }\r\n    if (tail.length > 0) {\r\n      out.push(`${indent}${tail}`);\r\n    }\r\n  }\r\n\r\n  return out.join(\"\\n\");\r\n}\r\n\r\nfunction isStyleStructuralDirectiveLine(trimmedLine: string): boolean {\r\n  const name = getDirectiveNameFromLine(trimmedLine);\r\n  return (\r\n    name !== null &&\r\n    (STYLE_DIRECTIVE_BLOCK_OPENERS.has(name) ||\r\n      STYLE_DIRECTIVE_BRANCHES.has(name) ||\r\n      STYLE_DIRECTIVE_BLOCK_CLOSERS.has(name))\r\n  );\r\n}\r\n\r\nfunction isCssContextBlockOpenLine(trimmedLine: string): boolean {\r\n  return trimmedLine.endsWith(\"{\") && !isStyleStructuralDirectiveLine(trimmedLine);\r\n}\r\n\r\nfunction isCssContextBlockCloseLine(trimmedLine: string): boolean {\r\n  return trimmedLine === \"}\";\r\n}\r\n\r\nfunction isStyleSelectorLikeLine(trimmedLine: string): boolean {\r\n  return /^([.#:[*]|[A-Za-z_]).*\\{\\s*$/u.test(trimmedLine);\r\n}\r\n\r\n// CSS treats the Blade statement marker as an at-rule and can pull it back to\r\n// the style-root indent. Restore the surrounding CSS block indent afterward.\r\nfunction normalizeStyleDirectiveCssContextIndent(value: string, indentUnit: string): string {\r\n  const lines = value.split(/\\r?\\n/u);\r\n\r\n  for (let i = 0; i < lines.length; i++) {\r\n    const trimmed = lines[i].trim();\r\n    if (!isStyleStructuralDirectiveLine(trimmed)) {\r\n      continue;\r\n    }\r\n\r\n    let prevIndex = i - 1;\r\n    while (prevIndex >= 0 && lines[prevIndex].trim().length === 0) {\r\n      prevIndex--;\r\n    }\r\n    if (prevIndex < 0) {\r\n      continue;\r\n    }\r\n\r\n    const previous = lines[prevIndex];\r\n    const previousTrimmed = previous.trim();\r\n    const currentIndent = lines[i].match(/^\\s*/u)?.[0] ?? \"\";\r\n    const previousIndent = previous.match(/^\\s*/u)?.[0] ?? \"\";\r\n    let nextIndent: string | null = null;\r\n\r\n    if (\r\n      isCssContextBlockCloseLine(previousTrimmed) &&\r\n      previousIndent.length > currentIndent.length\r\n    ) {\r\n      nextIndent = previousIndent;\r\n    } else if (isCssContextBlockOpenLine(previousTrimmed)) {\r\n      const nestedIndent = `${previousIndent}${indentUnit}`;\r\n      if (nestedIndent.length > currentIndent.length) {\r\n        nextIndent = nestedIndent;\r\n      }\r\n    }\r\n\r\n    if (nextIndent !== null) {\r\n      lines[i] = `${nextIndent}${trimmed}`;\r\n\r\n      let nextIndex = i + 1;\r\n      while (nextIndex < lines.length && lines[nextIndex].trim().length === 0) {\r\n        nextIndex++;\r\n      }\r\n\r\n      if (nextIndex < lines.length) {\r\n        const nextTrimmed = lines[nextIndex].trim();\r\n        const nextCurrentIndent = lines[nextIndex].match(/^\\s*/u)?.[0] ?? \"\";\r\n        if (isStyleSelectorLikeLine(nextTrimmed) && nextCurrentIndent.length < nextIndent.length) {\r\n          lines[nextIndex] = `${nextIndent}${nextTrimmed}`;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return lines.join(\"\\n\");\r\n}\r\n\r\nfunction normalizeStyleDirectiveSelectorAlignment(value: string, indentUnit: string): string {\r\n  const lines = value.split(/\\r?\\n/u);\r\n  const selectorLikeStartRe = /^([.#:[*]|[A-Za-z_]).*\\{\\s*$/u;\r\n  for (let iteration = 0; iteration < 4; iteration++) {\r\n    let changed = false;\r\n\r\n    for (let i = 0; i < lines.length; i++) {\r\n      const normalized = normalizeStyleDirectiveLineArgSpacing(lines[i]);\r\n      if (normalized !== lines[i]) {\r\n        lines[i] = normalized;\r\n        changed = true;\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < lines.length; i++) {\r\n      const currentTrimmed = lines[i].trim();\r\n      if (currentTrimmed.length === 0) {\r\n        continue;\r\n      }\r\n\r\n      let prevIndex = i - 1;\r\n      while (prevIndex >= 0 && lines[prevIndex].trim().length === 0) {\r\n        prevIndex--;\r\n      }\r\n      if (prevIndex < 0) {\r\n        continue;\r\n      }\r\n\r\n      const previousTrimmed = lines[prevIndex].trim();\r\n      const directiveName = getDirectiveNameFromLine(previousTrimmed);\r\n      if (\r\n        !directiveName ||\r\n        (!STYLE_DIRECTIVE_BLOCK_OPENERS.has(directiveName) &&\r\n          !STYLE_DIRECTIVE_BRANCHES.has(directiveName) &&\r\n          !STYLE_DIRECTIVE_BLOCK_CLOSERS.has(directiveName))\r\n      ) {\r\n        continue;\r\n      }\r\n\r\n      if (!currentTrimmed.endsWith(\"{\") || getDirectiveNameFromLine(currentTrimmed) !== null) {\r\n        continue;\r\n      }\r\n\r\n      const previousIndent = lines[prevIndex].match(/^\\s*/u)?.[0] ?? \"\";\r\n      const currentIndent = lines[i].match(/^\\s*/u)?.[0] ?? \"\";\r\n      if (currentIndent.length <= previousIndent.length) {\r\n        continue;\r\n      }\r\n\r\n      const nextLine = `${previousIndent}${currentTrimmed}`;\r\n      if (nextLine !== lines[i]) {\r\n        lines[i] = nextLine;\r\n        changed = true;\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < lines.length; i++) {\r\n      const currentTrimmed = lines[i].trim();\r\n      if (\r\n        !isStyleCommentLine(currentTrimmed) ||\r\n        (!/^\\/\\*\\s*@/u.test(currentTrimmed) && !/^\\/\\/\\s*@/u.test(currentTrimmed))\r\n      ) {\r\n        continue;\r\n      }\r\n\r\n      let prevIndex = i - 1;\r\n      while (prevIndex >= 0 && lines[prevIndex].trim().length === 0) {\r\n        prevIndex--;\r\n      }\r\n      if (prevIndex < 0) {\r\n        continue;\r\n      }\r\n\r\n      const previousTrimmed = lines[prevIndex].trim();\r\n      let previousIndent = lines[prevIndex].match(/^\\s*/u)?.[0] ?? \"\";\r\n      let previousDirective = getDirectiveNameFromLine(previousTrimmed);\r\n      if (\r\n        !previousDirective ||\r\n        (!STYLE_DIRECTIVE_BLOCK_OPENERS.has(previousDirective) &&\r\n          !STYLE_DIRECTIVE_BRANCHES.has(previousDirective) &&\r\n          !STYLE_DIRECTIVE_BLOCK_CLOSERS.has(previousDirective))\r\n      ) {\r\n        let anchorIndex = prevIndex - 1;\r\n        while (anchorIndex >= 0) {\r\n          const anchorTrimmed = lines[anchorIndex].trim();\r\n          if (anchorTrimmed.length === 0 || isStyleCommentLine(anchorTrimmed)) {\r\n            anchorIndex--;\r\n            continue;\r\n          }\r\n\r\n          const anchorDirective = getDirectiveNameFromLine(anchorTrimmed);\r\n          if (\r\n            anchorDirective &&\r\n            (STYLE_DIRECTIVE_BLOCK_OPENERS.has(anchorDirective) ||\r\n              STYLE_DIRECTIVE_BRANCHES.has(anchorDirective) ||\r\n              STYLE_DIRECTIVE_BLOCK_CLOSERS.has(anchorDirective))\r\n          ) {\r\n            previousDirective = anchorDirective;\r\n            previousIndent = lines[anchorIndex].match(/^\\s*/u)?.[0] ?? \"\";\r\n          }\r\n          break;\r\n        }\r\n      }\r\n\r\n      if (\r\n        !previousDirective ||\r\n        (!STYLE_DIRECTIVE_BLOCK_OPENERS.has(previousDirective) &&\r\n          !STYLE_DIRECTIVE_BRANCHES.has(previousDirective) &&\r\n          !STYLE_DIRECTIVE_BLOCK_CLOSERS.has(previousDirective))\r\n      ) {\r\n        continue;\r\n      }\r\n\r\n      const currentIndent = lines[i].match(/^\\s*/u)?.[0] ?? \"\";\r\n      if (currentIndent.length <= previousIndent.length) {\r\n        continue;\r\n      }\r\n\r\n      const nextLine = `${previousIndent}${currentTrimmed}`;\r\n      if (nextLine !== lines[i]) {\r\n        lines[i] = nextLine;\r\n        changed = true;\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < lines.length; i++) {\r\n      const currentTrimmed = lines[i].trim();\r\n      const currentDirective = getDirectiveNameFromLine(currentTrimmed);\r\n      if (\r\n        !currentDirective ||\r\n        (!STYLE_DIRECTIVE_BLOCK_OPENERS.has(currentDirective) &&\r\n          !STYLE_DIRECTIVE_BRANCHES.has(currentDirective) &&\r\n          !STYLE_DIRECTIVE_BLOCK_CLOSERS.has(currentDirective))\r\n      ) {\r\n        continue;\r\n      }\r\n\r\n      let prevIndex = i - 1;\r\n      while (prevIndex >= 0 && lines[prevIndex].trim().length === 0) {\r\n        prevIndex--;\r\n      }\r\n      if (prevIndex < 0) {\r\n        continue;\r\n      }\r\n\r\n      const previousTrimmed = lines[prevIndex].trim();\r\n      const previousIndent = lines[prevIndex].match(/^\\s*/u)?.[0] ?? \"\";\r\n      const currentIndent = lines[i].match(/^\\s*/u)?.[0] ?? \"\";\r\n\r\n      if (\r\n        (STYLE_DIRECTIVE_BRANCHES.has(currentDirective) ||\r\n          STYLE_DIRECTIVE_BLOCK_CLOSERS.has(currentDirective) ||\r\n          STYLE_DIRECTIVE_BLOCK_OPENERS.has(currentDirective)) &&\r\n        isStyleCommentLine(previousTrimmed) &&\r\n        currentIndent.length > previousIndent.length\r\n      ) {\r\n        const nextLine = `${previousIndent}${currentTrimmed}`;\r\n        if (nextLine !== lines[i]) {\r\n          lines[i] = nextLine;\r\n          changed = true;\r\n        }\r\n        continue;\r\n      }\r\n\r\n      const previousDirective = getDirectiveNameFromLine(previousTrimmed);\r\n      if (\r\n        !previousDirective ||\r\n        (!STYLE_DIRECTIVE_BLOCK_OPENERS.has(previousDirective) &&\r\n          !STYLE_DIRECTIVE_BRANCHES.has(previousDirective) &&\r\n          !STYLE_DIRECTIVE_BLOCK_CLOSERS.has(previousDirective))\r\n      ) {\r\n        continue;\r\n      }\r\n\r\n      if (currentIndent.length <= previousIndent.length) {\r\n        continue;\r\n      }\r\n\r\n      const shouldAlign =\r\n        STYLE_DIRECTIVE_BRANCHES.has(currentDirective) ||\r\n        STYLE_DIRECTIVE_BLOCK_CLOSERS.has(currentDirective) ||\r\n        STYLE_DIRECTIVE_BRANCHES.has(previousDirective) ||\r\n        STYLE_DIRECTIVE_BLOCK_CLOSERS.has(previousDirective);\r\n      if (shouldAlign) {\r\n        const nextLine = `${previousIndent}${currentTrimmed}`;\r\n        if (nextLine !== lines[i]) {\r\n          lines[i] = nextLine;\r\n          changed = true;\r\n        }\r\n        continue;\r\n      }\r\n\r\n      // Malformed style chains like:\r\n      // @if (...)\r\n      //   @if (...) :root { ... }\r\n      // can receive one-pass extra indent before converging. Stabilize opener\r\n      // alignment only when the current opener is immediately followed by a\r\n      // selector-like line.\r\n      if (\r\n        STYLE_DIRECTIVE_BLOCK_OPENERS.has(currentDirective) &&\r\n        STYLE_DIRECTIVE_BLOCK_OPENERS.has(previousDirective)\r\n      ) {\r\n        let nextIndex = i + 1;\r\n        let chainLeadsToSelector = false;\r\n\r\n        while (nextIndex < lines.length) {\r\n          const nextTrimmed = lines[nextIndex].trim();\r\n          if (nextTrimmed.length === 0) {\r\n            nextIndex++;\r\n            continue;\r\n          }\r\n\r\n          if (nextTrimmed === currentTrimmed) {\r\n            nextIndex++;\r\n            continue;\r\n          }\r\n\r\n          if (isStyleCommentLine(nextTrimmed)) {\r\n            nextIndex++;\r\n            continue;\r\n          }\r\n\r\n          const nextDirective = getDirectiveNameFromLine(nextTrimmed);\r\n          if (nextDirective && STYLE_DIRECTIVE_BLOCK_OPENERS.has(nextDirective)) {\r\n            nextIndex++;\r\n            continue;\r\n          }\r\n          if (\r\n            nextDirective &&\r\n            (STYLE_DIRECTIVE_BRANCHES.has(nextDirective) ||\r\n              STYLE_DIRECTIVE_BLOCK_CLOSERS.has(nextDirective))\r\n          ) {\r\n            nextIndex++;\r\n            continue;\r\n          }\r\n\r\n          if (selectorLikeStartRe.test(nextTrimmed)) {\r\n            chainLeadsToSelector = true;\r\n          }\r\n          break;\r\n        }\r\n\r\n        if (chainLeadsToSelector) {\r\n          const nextLine = `${previousIndent}${currentTrimmed}`;\r\n          if (nextLine !== lines[i]) {\r\n            lines[i] = nextLine;\r\n            changed = true;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    if (!changed) {\r\n      break;\r\n    }\r\n  }\r\n\r\n  const lineAdjusted = normalizeStyleDirectiveCssContextIndent(lines.join(\"\\n\"), indentUnit);\r\n  const directiveAligned = lineAdjusted.replace(\r\n    /((?:^|\\n)([ \\t]*)@(?:else|elseif|case|default|endif|endunless|endisset|endempty|endfor|endforeach|endforelse|endwhile|endswitch|endphp|endverbatim)[^\\n]*\\n)[ \\t]+(@(?:if|unless|isset|empty|for|foreach|forelse|while|switch|php|verbatim|else|elseif|case|default|endif|endunless|endisset|endempty|endfor|endforeach|endforelse|endwhile|endswitch|endphp|endverbatim)[^\\n]*)(?=\\n|$)/gu,\r\n    (_match, prefix: string, indent: string, directiveLine: string) =>\r\n      `${prefix}${indent}${directiveLine.trimStart()}`,\r\n  );\r\n\r\n  return directiveAligned.replace(\r\n    /((?:^|\\n)([ \\t]*)@(?:if|unless|isset|empty|for|foreach|forelse|while|switch|php|verbatim|else|elseif|case|default|endif|endunless|endisset|endempty|endfor|endforeach|endforelse|endwhile|endswitch|endphp|endverbatim)[^\\n]*\\n)[ \\t]+(([.#:[*]|[A-Za-z_])[^\\n]*\\{[ \\t]*)(?=\\n|$)/gu,\r\n    (_match, prefix: string, indent: string, selectorStart: string) =>\r\n      `${prefix}${indent}${selectorStart}`,\r\n  );\r\n}\r\n\r\nexport function shouldUseMixedRawContentEmbedding(node: WrappedNode, options: Options): boolean {\r\n  if (shouldBypassStyleParserEmbedding(node, options)) {\r\n    return false;\r\n  }\r\n\r\n  const parser = inferElementParser(node, options);\r\n  if (!parser) return false;\r\n\r\n  if (!isPhpFormattingEnabled(options) && node.tagName === \"script\") {\r\n    const range = getElementContentRange(node);\r\n    const constructs = collectLeafConstructs(node, range.start, range.end);\r\n    if (constructs.length === 0) {\r\n      return false;\r\n    }\r\n\r\n    if (\r\n      getEchoSpacingMode(options) !== \"preserve\" &&\r\n      constructs.some(\r\n        (child) =>\r\n          isEchoConstruct(child) &&\r\n          !isConstructInsideScriptLiteralOrComment(child, node.source, range.start, range.end),\r\n      )\r\n    ) {\r\n      return true;\r\n    }\r\n\r\n    if (\r\n      constructs.some(\r\n        (child) =>\r\n          isMultilineEchoConstruct(child) &&\r\n          !isConstructInsideScriptLiteralOrComment(child, node.source, range.start, range.end),\r\n      )\r\n    ) {\r\n      return true;\r\n    }\r\n\r\n    if (\r\n      constructs.some(\r\n        (child) =>\r\n          child.kind === NodeKind.PhpBlock ||\r\n          child.kind === NodeKind.PhpTag ||\r\n          (child.kind === NodeKind.Directive &&\r\n            !isDirectiveInsideScriptLiteralOrComment(child, node.source, range.start, range.end) &&\r\n            (isStructuralScriptDirective(child) ||\r\n              isExpressionScriptDirective(child) ||\r\n              isInlineScriptDirectiveExpression(child, node.source, range.start, range.end) ||\r\n              isStandaloneScriptDirective(child, node.source, range.start, range.end))),\r\n      )\r\n    ) {\r\n      return true;\r\n    }\r\n\r\n    return constructs.some(\r\n      (child) =>\r\n        child.kind === NodeKind.Directive &&\r\n        isKnownBladeDirective(child) &&\r\n        isDirectiveInsideScriptLiteralOrComment(child, node.source, range.start, range.end),\r\n    );\r\n  }\r\n\r\n  if (node.tagName === \"script\") {\r\n    const range = getElementContentRange(node);\r\n    const constructs = collectLeafConstructs(node, range.start, range.end);\r\n    if (constructs.length === 0) {\r\n      return false;\r\n    }\r\n\r\n    if (\r\n      constructs.some((child) => {\r\n        if (\r\n          child.kind === NodeKind.Directive &&\r\n          isDirectiveInsideScriptLiteralOrComment(child, node.source, range.start, range.end)\r\n        ) {\r\n          return false;\r\n        }\r\n\r\n        return isBladeConstructChild(child, \"script\");\r\n      })\r\n    ) {\r\n      return true;\r\n    }\r\n\r\n    if (\r\n      constructs.some(\r\n        (child) =>\r\n          child.kind === NodeKind.Directive &&\r\n          isKnownBladeDirective(child) &&\r\n          isDirectiveInsideScriptLiteralOrComment(child, node.source, range.start, range.end),\r\n      )\r\n    ) {\r\n      return true;\r\n    }\r\n\r\n    return parentContainsBladeSyntax(node, \"script\");\r\n  }\r\n\r\n  if (node.children.length > 0) {\r\n    if (node.children.some((child) => isBladeConstructChild(child, \"style\"))) {\r\n      return true;\r\n    }\r\n  }\r\n\r\n  const range = getElementContentRange(node);\r\n  const constructs = collectLeafConstructs(node, range.start, range.end);\r\n  if (\r\n    constructs.some(\r\n      (child) =>\r\n        child.kind === NodeKind.Directive &&\r\n        isKnownBladeDirective(child) &&\r\n        isDirectiveInsideStyleLiteralOrComment(child, node.source, range.start, range.end),\r\n    )\r\n  ) {\r\n    return true;\r\n  }\r\n\r\n  const rawValue = node.source.slice(range.start, range.end);\r\n  if (STYLE_RAW_BLADE_FALLBACK_RE.test(rawValue)) {\r\n    return true;\r\n  }\r\n\r\n  return parentContainsBladeSyntax(node, \"style\");\r\n}\r\n\r\nexport function shouldUseUnparsedRawContentEmbedding(node: WrappedNode, options: Options): boolean {\r\n  if (shouldBypassStyleParserEmbedding(node, options)) {\r\n    return true;\r\n  }\r\n\r\n  const range = getElementContentRange(node);\r\n  const constructs = collectLeafConstructs(node, range.start, range.end);\r\n  const hasMultilineEcho = constructs.some(isMultilineEchoConstruct);\r\n\r\n  const parser = inferElementParser(node, options);\r\n  if (!parser) {\r\n    return constructs.some(isBladeOrPhpFallbackConstruct);\r\n  }\r\n\r\n  if (!hasMultilineEcho) {\r\n    return false;\r\n  }\r\n\r\n  return (\r\n    node.tagName === \"script\" &&\r\n    constructs.some(\r\n      (child) =>\r\n        isMultilineEchoConstruct(child) &&\r\n        isConstructInsideScriptComment(child, node.source, range.start, range.end),\r\n    )\r\n  );\r\n}\r\n\r\nexport function embedUnparsedRawContentElement(\r\n  path: AstPath<WrappedNode>,\r\n  options: Options,\r\n  print: EmbedPrint,\r\n): Doc {\r\n  const node = path.node;\r\n  const range = getElementContentRange(node);\r\n  const rawValue = node.source.slice(range.start, range.end);\r\n  const fallback = normalizeEmbeddedRawContentFallback(rawValue);\r\n\r\n  return buildScriptLikeElementDoc(\r\n    path,\r\n    node,\r\n    options,\r\n    print,\r\n    replaceEndOfLine(fallback, hardline),\r\n    rawValue,\r\n  );\r\n}\r\n\r\nfunction isStructuralScriptDirective(node: WrappedNode): boolean {\r\n  if (node.kind !== NodeKind.Directive) {\r\n    return false;\r\n  }\r\n\r\n  if (node.children.length > 0) {\r\n    return true;\r\n  }\r\n\r\n  const name = extractDirectiveName(node);\r\n  if (!name) {\r\n    return false;\r\n  }\r\n\r\n  const directive = node.buildResult.directives?.getDirective(name);\r\n  if (!directive) {\r\n    return false;\r\n  }\r\n\r\n  return (\r\n    directive.role !== StructureRole.None ||\r\n    directive.isCondition ||\r\n    directive.isSwitch ||\r\n    directive.isSwitchBranch ||\r\n    directive.isSwitchTerminator ||\r\n    directive.isConditionalPair ||\r\n    directive.isConditionalClose ||\r\n    directive.hasConditionLikeBranches ||\r\n    directive.terminators.length > 0\r\n  );\r\n}\r\n\r\nfunction isExpressionScriptDirective(node: WrappedNode): boolean {\r\n  if (node.kind !== NodeKind.Directive) {\r\n    return false;\r\n  }\r\n\r\n  return isExpressionDirective(node);\r\n}\r\n\r\nfunction isStandaloneScriptDirective(\r\n  node: LeafConstructNode,\r\n  source: string,\r\n  contentStart: number,\r\n  contentEnd: number,\r\n): boolean {\r\n  if (node.kind !== NodeKind.Directive) {\r\n    return false;\r\n  }\r\n\r\n  const replacementRange = getReplacementRange(node);\r\n  if (replacementRange.start < contentStart || replacementRange.end > contentEnd) {\r\n    return false;\r\n  }\r\n\r\n  if (isLikelyInsideScriptLiteralOrComment(source, contentStart, replacementRange.start)) {\r\n    return false;\r\n  }\r\n\r\n  const lineStart = Math.max(\r\n    contentStart,\r\n    source.lastIndexOf(\"\\n\", Math.max(contentStart, replacementRange.start) - 1) + 1,\r\n  );\r\n  let lineEnd = source.indexOf(\"\\n\", replacementRange.end);\r\n  if (lineEnd < 0 || lineEnd > contentEnd) {\r\n    lineEnd = contentEnd;\r\n  }\r\n\r\n  const before = source.slice(lineStart, replacementRange.start);\r\n  const after = source.slice(replacementRange.end, lineEnd);\r\n  return before.trim().length === 0 && after.trim().length === 0;\r\n}\r\n\r\nfunction isDirectiveInsideScriptLiteralOrComment(\r\n  node: LeafConstructNode,\r\n  source: string,\r\n  contentStart: number,\r\n  contentEnd: number,\r\n): boolean {\r\n  if (node.kind !== NodeKind.Directive) {\r\n    return false;\r\n  }\r\n\r\n  return isConstructInsideScriptLiteralOrComment(node, source, contentStart, contentEnd);\r\n}\r\n\r\nfunction isConstructInsideScriptLiteralOrComment(\r\n  node: LeafConstructNode,\r\n  source: string,\r\n  contentStart: number,\r\n  contentEnd: number,\r\n): boolean {\r\n  const replacementRange = getReplacementRange(node);\r\n  if (replacementRange.start < contentStart || replacementRange.end > contentEnd) {\r\n    return false;\r\n  }\r\n\r\n  return isLikelyInsideScriptLiteralOrComment(source, contentStart, replacementRange.start);\r\n}\r\n\r\nfunction isConstructInsideScriptComment(\r\n  node: LeafConstructNode,\r\n  source: string,\r\n  contentStart: number,\r\n  contentEnd: number,\r\n): boolean {\r\n  const replacementRange = getReplacementRange(node);\r\n  if (replacementRange.start < contentStart || replacementRange.end > contentEnd) {\r\n    return false;\r\n  }\r\n\r\n  return isLikelyInsideScriptComment(source, contentStart, replacementRange.start);\r\n}\r\n\r\nfunction isDirectiveInsideStyleLiteralOrComment(\r\n  node: LeafConstructNode,\r\n  source: string,\r\n  contentStart: number,\r\n  contentEnd: number,\r\n): boolean {\r\n  if (node.kind !== NodeKind.Directive) {\r\n    return false;\r\n  }\r\n\r\n  const replacementRange = getReplacementRange(node);\r\n  if (replacementRange.start < contentStart || replacementRange.end > contentEnd) {\r\n    return false;\r\n  }\r\n\r\n  if (isInsideStyleCommentByLineHeuristic(source, contentStart, replacementRange.start)) {\r\n    return true;\r\n  }\r\n\r\n  if (\r\n    isLikelySlashDelimitedStyleLiteralToken(\r\n      source,\r\n      replacementRange.start,\r\n      replacementRange.end,\r\n      contentStart,\r\n      contentEnd,\r\n    )\r\n  ) {\r\n    return true;\r\n  }\r\n\r\n  return isLikelyInsideStyleLiteralOrComment(source, contentStart, replacementRange.start);\r\n}\r\n\r\nfunction isInsideStyleCommentByLineHeuristic(\r\n  source: string,\r\n  contentStart: number,\r\n  offset: number,\r\n): boolean {\r\n  const lineStart = Math.max(\r\n    contentStart,\r\n    source.lastIndexOf(\"\\n\", Math.max(contentStart, offset) - 1) + 1,\r\n  );\r\n  const prefix = source.slice(lineStart, offset);\r\n\r\n  const blockOpen = prefix.lastIndexOf(\"/*\");\r\n  const blockClose = prefix.lastIndexOf(\"*/\");\r\n  if (blockOpen > blockClose) {\r\n    return true;\r\n  }\r\n\r\n  const lineComment = prefix.lastIndexOf(\"//\");\r\n  if (\r\n    lineComment >= 0 &&\r\n    shouldTreatAsStyleLineComment(source, contentStart, lineStart + lineComment)\r\n  ) {\r\n    return true;\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\nfunction previousNonWhitespaceChar(\r\n  source: string,\r\n  startExclusive: number,\r\n  contentStart: number,\r\n): string | null {\r\n  for (let i = startExclusive - 1; i >= contentStart; i--) {\r\n    const ch = source[i];\r\n    if (ch === \" \" || ch === \"\\t\" || ch === \"\\r\" || ch === \"\\n\") {\r\n      continue;\r\n    }\r\n\r\n    return ch;\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\nfunction isLikelySlashDelimitedStyleLiteralToken(\r\n  source: string,\r\n  tokenStart: number,\r\n  tokenEnd: number,\r\n  contentStart: number,\r\n  contentEnd: number,\r\n): boolean {\r\n  const prev = previousNonWhitespaceChar(source, tokenStart, contentStart);\r\n  if (prev !== \"/\") {\r\n    return false;\r\n  }\r\n\r\n  for (let i = tokenEnd; i < contentEnd; i++) {\r\n    const ch = source[i];\r\n    if (ch === \" \" || ch === \"\\t\" || ch === \"\\r\" || ch === \"\\n\") {\r\n      continue;\r\n    }\r\n\r\n    if (ch === \"\\\\\") {\r\n      i++;\r\n      continue;\r\n    }\r\n\r\n    if (ch === \"/\") {\r\n      return true;\r\n    }\r\n\r\n    if (ch === \";\" || ch === \"{\" || ch === \"}\") {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\nfunction isInlineScriptDirectiveExpression(\r\n  node: LeafConstructNode,\r\n  source: string,\r\n  contentStart: number,\r\n  contentEnd: number,\r\n): boolean {\r\n  if (node.kind !== NodeKind.Directive) {\r\n    return false;\r\n  }\r\n\r\n  if (node.children.length > 0 || isStructuralScriptDirective(node)) {\r\n    return false;\r\n  }\r\n\r\n  if (isDirectiveInsideScriptLiteralOrComment(node, source, contentStart, contentEnd)) {\r\n    return false;\r\n  }\r\n\r\n  const replacementRange = getReplacementRange(node);\r\n  const lineStart = Math.max(\r\n    contentStart,\r\n    source.lastIndexOf(\"\\n\", Math.max(contentStart, replacementRange.start) - 1) + 1,\r\n  );\r\n  let lineEnd = source.indexOf(\"\\n\", replacementRange.end);\r\n  if (lineEnd < 0 || lineEnd > contentEnd) {\r\n    lineEnd = contentEnd;\r\n  }\r\n\r\n  const before = source.slice(lineStart, replacementRange.start);\r\n  const after = source.slice(replacementRange.end, lineEnd);\r\n  return before.trim().length > 0 || after.trim().length > 0;\r\n}\r\n\r\nfunction isInlineStyleDirectiveExpression(\r\n  node: LeafConstructNode,\r\n  source: string,\r\n  contentStart: number,\r\n  contentEnd: number,\r\n): boolean {\r\n  if (node.kind !== NodeKind.Directive) {\r\n    return false;\r\n  }\r\n\r\n  if (node.children.length > 0 || isStructuralScriptDirective(node)) {\r\n    return false;\r\n  }\r\n\r\n  if (isDirectiveInsideStyleLiteralOrComment(node, source, contentStart, contentEnd)) {\r\n    return false;\r\n  }\r\n\r\n  const replacementRange = getReplacementRange(node);\r\n  const lineStart = Math.max(\r\n    contentStart,\r\n    source.lastIndexOf(\"\\n\", Math.max(contentStart, replacementRange.start) - 1) + 1,\r\n  );\r\n  let lineEnd = source.indexOf(\"\\n\", replacementRange.end);\r\n  if (lineEnd < 0 || lineEnd > contentEnd) {\r\n    lineEnd = contentEnd;\r\n  }\r\n\r\n  const before = source.slice(lineStart, replacementRange.start);\r\n  const after = source.slice(replacementRange.end, lineEnd);\r\n  return before.trim().length > 0 || after.trim().length > 0;\r\n}\r\n\r\nfunction isLikelyInsideStyleLiteralOrComment(\r\n  source: string,\r\n  contentStart: number,\r\n  offset: number,\r\n): boolean {\r\n  type ScanState = \"code\" | \"single\" | \"double\" | \"lineComment\" | \"blockComment\";\r\n  let state: ScanState = \"code\";\r\n\r\n  for (let i = contentStart; i < offset; i++) {\r\n    const ch = source[i];\r\n    const next = i + 1 < offset ? source[i + 1] : \"\";\r\n\r\n    if (state === \"lineComment\") {\r\n      if (ch === \"\\n\") {\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"blockComment\") {\r\n      if (ch === \"*\" && next === \"/\") {\r\n        state = \"code\";\r\n        i++;\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"single\") {\r\n      if (ch === \"\\\\\") {\r\n        i++;\r\n        continue;\r\n      }\r\n      if (ch === \"'\") {\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (state === \"double\") {\r\n      if (ch === \"\\\\\") {\r\n        i++;\r\n        continue;\r\n      }\r\n      if (ch === '\"') {\r\n        state = \"code\";\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (ch === \"/\" && next === \"*\") {\r\n      state = \"blockComment\";\r\n      i++;\r\n      continue;\r\n    }\r\n    if (ch === \"/\" && next === \"/\" && shouldTreatAsStyleLineComment(source, contentStart, i)) {\r\n      state = \"lineComment\";\r\n      i++;\r\n      continue;\r\n    }\r\n    if (ch === \"'\") {\r\n      state = \"single\";\r\n      continue;\r\n    }\r\n    if (ch === '\"') {\r\n      state = \"double\";\r\n    }\r\n  }\r\n\r\n  return state !== \"code\";\r\n}\r\n\r\nfunction shouldTreatAsStyleLineComment(\r\n  source: string,\r\n  contentStart: number,\r\n  slashIndex: number,\r\n): boolean {\r\n  for (let i = slashIndex - 1; i >= contentStart; i--) {\r\n    const ch = source[i];\r\n    if (ch === \" \" || ch === \"\\t\" || ch === \"\\r\") {\r\n      continue;\r\n    }\r\n\r\n    return ch === \"\\n\" || ch === \";\" || ch === \"{\" || ch === \"}\";\r\n  }\r\n\r\n  return true;\r\n}\r\n\r\nexport function shouldBypassStyleParserEmbedding(node: WrappedNode, options: Options): boolean {\r\n  if (node.kind !== NodeKind.Element || node.tagName !== \"style\") {\r\n    return false;\r\n  }\r\n\r\n  const parser = inferElementParser(node, options);\r\n  if (!parser || !isStyleParser(parser)) {\r\n    return false;\r\n  }\r\n\r\n  const range = getElementContentRange(node);\r\n  if (range.end <= range.start) {\r\n    return false;\r\n  }\r\n\r\n  const rawValue = node.source.slice(range.start, range.end);\r\n\r\n  if (UNSTABLE_STYLE_ESCAPED_SLASH_LITERAL.test(rawValue)) {\r\n    return true;\r\n  }\r\n\r\n  if (rawValue.length >= LARGE_STYLE_EMBED_CHAR_THRESHOLD) {\r\n    return true;\r\n  }\r\n\r\n  let lineCount = 1;\r\n  for (let i = 0; i < rawValue.length; i++) {\r\n    if (rawValue[i] === \"\\n\") {\r\n      lineCount++;\r\n      if (lineCount > LARGE_STYLE_EMBED_LINE_THRESHOLD) {\r\n        return true;\r\n      }\r\n    }\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\nexport async function embedMixedRawContentElement(\r\n  path: AstPath<WrappedNode>,\r\n  options: Options,\r\n  _textToDoc: (text: string, options: Options) => Promise<Doc>,\r\n  print: EmbedPrint,\r\n): Promise<Doc | null> {\r\n  const node = path.node;\r\n  const parser = inferElementParser(node, options);\r\n  if (!parser) return null;\r\n\r\n  const range = getElementContentRange(node);\r\n  const rawValue = node.source.slice(range.start, range.end);\r\n  const rawConstructs = collectLeafConstructs(node, range.start, range.end);\r\n  const constructs = rawConstructs.filter((child) => {\r\n    if (child.kind !== NodeKind.Directive) {\r\n      return true;\r\n    }\r\n\r\n    if (\r\n      node.tagName === \"script\" &&\r\n      isDirectiveInsideScriptLiteralOrComment(child, node.source, range.start, range.end)\r\n    ) {\r\n      return false;\r\n    }\r\n\r\n    if (\r\n      node.tagName === \"style\" &&\r\n      isDirectiveInsideStyleLiteralOrComment(child, node.source, range.start, range.end)\r\n    ) {\r\n      return false;\r\n    }\r\n\r\n    if (\r\n      node.tagName === \"style\" &&\r\n      !isBladeConstructChild(child, \"style\") &&\r\n      !isStyleDirectiveBoundary(child)\r\n    ) {\r\n      return false;\r\n    }\r\n\r\n    return true;\r\n  });\r\n  const markerSessionKey = createMarkerSessionKey(node.source, range.start, range.end);\r\n\r\n  const replacements = await Promise.all(\r\n    constructs.map((child) => getConstructReplacementText(child, options)),\r\n  );\r\n\r\n  const candidates: PlaceholderCandidate[] = constructs.map((child, index) => {\r\n    const replacementRange = getReplacementRange(child);\r\n    const insideStyleLiteralOrComment =\r\n      node.tagName === \"style\" &&\r\n      isConstructInsideStyleLiteralOrComment(child, node.source, range.start, range.end);\r\n    let kind = getPlaceholderKind(child);\r\n    if (\r\n      node.tagName === \"script\" &&\r\n      kind === \"stmt\" &&\r\n      child.kind === NodeKind.Directive &&\r\n      isInlineScriptDirectiveExpression(child, node.source, range.start, range.end)\r\n    ) {\r\n      kind = \"expr\";\r\n    }\r\n    if (\r\n      node.tagName === \"style\" &&\r\n      kind === \"stmt\" &&\r\n      child.kind === NodeKind.Directive &&\r\n      isInlineStyleDirectiveExpression(child, node.source, range.start, range.end)\r\n    ) {\r\n      kind = \"expr\";\r\n    }\r\n    const inStyleValueContext =\r\n      isStyleParser(parser) &&\r\n      isInCssValueContext(node.source, replacementRange.start, range.start);\r\n    const baseReplacementText = insideStyleLiteralOrComment ? fullText(child) : replacements[index];\r\n    const replacementText =\r\n      isStyleParser(parser) && inStyleValueContext\r\n        ? normalizeStyleValueReplacementText(baseReplacementText)\r\n        : baseReplacementText;\r\n\r\n    return {\r\n      node: child,\r\n      start: replacementRange.start,\r\n      end: replacementRange.end,\r\n      kind,\r\n      inStyleValueContext,\r\n      replacementText,\r\n    };\r\n  });\r\n\r\n  const slots: PlaceholderSlot[] = [];\r\n  for (let i = 0; i < candidates.length; ) {\r\n    const candidate = candidates[i];\r\n\r\n    if (isStyleParser(parser) && candidate.inStyleValueContext) {\r\n      let groupedStart = candidate.start;\r\n      let groupedEnd = candidate.end;\r\n      let groupedReplacement = candidate.replacementText;\r\n      let groupedNode = candidate.node;\r\n      let groupHasStatement = candidate.kind === \"stmt\";\r\n      let j = i + 1;\r\n\r\n      while (j < candidates.length) {\r\n        const nextCandidate = candidates[j];\r\n        if (!nextCandidate.inStyleValueContext) break;\r\n\r\n        const between = node.source.slice(groupedEnd, nextCandidate.start);\r\n        if (between.trim().length > 0) break;\r\n\r\n        groupedReplacement += `\\n${nextCandidate.replacementText}`;\r\n        groupedEnd = nextCandidate.end;\r\n        groupHasStatement = groupHasStatement || nextCandidate.kind === \"stmt\";\r\n        j++;\r\n      }\r\n\r\n      if (groupHasStatement) {\r\n        const lines = groupedReplacement\r\n          .split(/\\r?\\n/u)\r\n          .map((line) => line.trim())\r\n          .filter((line) => line.length > 0);\r\n        groupedReplacement = `\\n${lines.map((line) => `  ${line}`).join(\"\\n\")}\\n  `;\r\n      }\r\n\r\n      slots.push({\r\n        node: groupedNode,\r\n        start: groupedStart,\r\n        end: groupedEnd,\r\n        marker: getPlaceholderMarker(markerSessionKey, \"expr\", slots.length, parser, true),\r\n        replacementText: groupedReplacement,\r\n      });\r\n      i = j;\r\n      continue;\r\n    }\r\n\r\n    slots.push({\r\n      node: candidate.node,\r\n      start: candidate.start,\r\n      end: candidate.end,\r\n      marker: getPlaceholderMarker(\r\n        markerSessionKey,\r\n        candidate.kind,\r\n        slots.length,\r\n        parser,\r\n        candidate.inStyleValueContext,\r\n      ),\r\n      replacementText: candidate.replacementText,\r\n    });\r\n    i++;\r\n  }\r\n\r\n  const maskedRaw = buildMaskedSource(node.source, range.start, range.end, slots);\r\n  const styleCommentMask =\r\n    node.tagName === \"style\" ? maskStyleDirectiveLikeComments(maskedRaw, markerSessionKey) : null;\r\n  const maskedForFormatting = styleCommentMask ? styleCommentMask.text : maskedRaw;\r\n  const normalizedMasked = dedentString(stripBoundaryLineBreaks(maskedForFormatting));\r\n  const maskedValue =\r\n    parser === \"markdown\"\r\n      ? dedentString(normalizedMasked.replace(/^[^\\S\\n]*\\n/, \"\"))\r\n      : normalizedMasked;\r\n\r\n  let formattedMasked: string;\r\n  try {\r\n    formattedMasked = await prettierFormat(\r\n      maskedValue,\r\n      await createSubformatOptions(options, parser, node),\r\n    );\r\n  } catch {\r\n    const fallback = normalizeEmbeddedRawContentFallback(rawValue);\r\n    return buildScriptLikeElementDoc(\r\n      path,\r\n      node,\r\n      options,\r\n      print,\r\n      replaceEndOfLine(fallback, hardline),\r\n      rawValue,\r\n    );\r\n  }\r\n\r\n  const unmasked = applyMarkerReplacements(formattedMasked, slots);\r\n  if (!unmasked.allFound) {\r\n    const fallback = normalizeEmbeddedRawContentFallback(rawValue);\r\n    return buildScriptLikeElementDoc(\r\n      path,\r\n      node,\r\n      options,\r\n      print,\r\n      replaceEndOfLine(fallback, hardline),\r\n      rawValue,\r\n    );\r\n  }\r\n\r\n  let restoredText = unmasked.text;\r\n  if (styleCommentMask && styleCommentMask.slots.length > 0) {\r\n    const restored = applyStyleCommentReplacements(restoredText, styleCommentMask.slots);\r\n    if (!restored.allFound) {\r\n      const fallback = normalizeEmbeddedRawContentFallback(rawValue);\r\n      return buildScriptLikeElementDoc(\r\n        path,\r\n        node,\r\n        options,\r\n        print,\r\n        replaceEndOfLine(fallback, hardline),\r\n        rawValue,\r\n      );\r\n    }\r\n\r\n    restoredText = restored.text;\r\n  }\r\n\r\n  const normalizedOutput = normalizeEmbeddedOutput(restoredText, node.tagName, options);\r\n\r\n  return buildScriptLikeElementDoc(\r\n    path,\r\n    node,\r\n    options,\r\n    print,\r\n    replaceEndOfLine(normalizedOutput, hardline),\r\n    rawValue,\r\n  );\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAAA;AAAA;AAAA;;;ACAA,IAAM,qBAA+B;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAC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","names":["printers","ch","savedState","Directives","skipQuotedString","skipHeredoc","i","Directives","popped","attrIdx","nameIdx","searchEnd","frame","normalizeDirectiveName","options","plugin","line","line","childIdx","options","Directives","import_prettier","options","options","options","isTextLikeNode","preprocess","parseCommentValue","extractDirectiveName","trainedDirectives","isFrontMatterNode","isPreLikeNode","isBladeSlotElement","options","isPreLikeNode","line","indent","isFrontMatterNode","options","languages","plugin","import_prettier","normalizeDirectiveName","options","key","import_prettier","options","options","htmlTrimStart","htmlTrimEnd","options","isPreLikeNode","quote","import_prettier","import_prettier","hardline","softline","line","options","htmlTrimEnd","htmlTrimStart","prevSegment","prevBetweenLine","group","indent","ifBreak","breakParent","softline","line","hardline","options","import_prettier","line","hardline","join","options","import_prettier","options","indent","hardline","isIgnoreRangeNode","options","htmlTrimEnd","htmlTrimStart","getSourceBetweenSegments","printBetweenSegments","printBetweenLine","getSourceBetween","import_prettier","getEchoDelimiters","options","line","hardline","options","getEchoDelimiters","options","options","import_prettier","import_prettier","import_prettier","group","indent","softline","options","line","indent","options","options","plugin","parsers","getPlugins","options","plugin","parsers","getPlugins","options","getDefaultExportCandidate","plugin","normalizePlugin","options","getPlugins","normalizePlugin","import_prettier","options","getLineIndent","line","indent","getIndentUnit","out","prettierFormat","plugin","getEchoDelimiters","getEchoContent","group","join","line","ifBreak","hasBladeValueSyntax","isSyntaxError","options","dedentMultiline","indent","prettierFormat","parseSrcset","import_prettier","group","hardline","indent","extractDirectiveName","options","line","stripBoundaryLineBreaks","getIndentUnit","range","constructs","prettierFormat","breakParent","group","hardline","indent","options","prettierFormat","group","hardline","options","preprocess","printers"]}