draft-ole 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.ja.md +134 -0
- package/README.md +128 -0
- package/dist/chunk-5BNNDTRT.js +95 -0
- package/dist/chunk-5BNNDTRT.js.map +1 -0
- package/dist/chunk-STLTIBMA.js +7658 -0
- package/dist/chunk-STLTIBMA.js.map +1 -0
- package/dist/chunk-YK4Y4ENL.js +389 -0
- package/dist/chunk-YK4Y4ENL.js.map +1 -0
- package/dist/entries/app.cjs +7337 -0
- package/dist/entries/app.cjs.map +1 -0
- package/dist/entries/app.d.cts +115 -0
- package/dist/entries/app.d.ts +115 -0
- package/dist/entries/app.js +10 -0
- package/dist/entries/app.js.map +1 -0
- package/dist/entries/page.cjs +7558 -0
- package/dist/entries/page.cjs.map +1 -0
- package/dist/entries/page.d.cts +2 -0
- package/dist/entries/page.d.ts +2 -0
- package/dist/entries/page.js +30 -0
- package/dist/entries/page.js.map +1 -0
- package/dist/index.cjs +10524 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4700 -0
- package/dist/index.d.ts +4700 -0
- package/dist/index.js +2573 -0
- package/dist/index.js.map +1 -0
- package/dist/page-DylNkWXm.d.ts +366 -0
- package/dist/page-h3DPzs8l.d.cts +366 -0
- package/dist/transformer/call-detector.d.ts +38 -0
- package/dist/transformer/call-detector.d.ts.map +1 -0
- package/dist/transformer/call-detector.js +151 -0
- package/dist/transformer/call-detector.js.map +1 -0
- package/dist/transformer/command-injector.d.ts +27 -0
- package/dist/transformer/command-injector.d.ts.map +1 -0
- package/dist/transformer/command-injector.js +111 -0
- package/dist/transformer/command-injector.js.map +1 -0
- package/dist/transformer/diagnostic-reporter.d.ts +81 -0
- package/dist/transformer/diagnostic-reporter.d.ts.map +1 -0
- package/dist/transformer/diagnostic-reporter.js +330 -0
- package/dist/transformer/diagnostic-reporter.js.map +1 -0
- package/dist/transformer/each-scope-branch.d.ts +28 -0
- package/dist/transformer/each-scope-branch.d.ts.map +1 -0
- package/dist/transformer/each-scope-branch.js +95 -0
- package/dist/transformer/each-scope-branch.js.map +1 -0
- package/dist/transformer/each-state-rewriter.d.ts +117 -0
- package/dist/transformer/each-state-rewriter.d.ts.map +1 -0
- package/dist/transformer/each-state-rewriter.js +393 -0
- package/dist/transformer/each-state-rewriter.js.map +1 -0
- package/dist/transformer/format-diagnostics.d.ts +27 -0
- package/dist/transformer/format-diagnostics.d.ts.map +1 -0
- package/dist/transformer/format-diagnostics.js +50 -0
- package/dist/transformer/format-diagnostics.js.map +1 -0
- package/dist/transformer/handler-ir-extractor.d.ts +71 -0
- package/dist/transformer/handler-ir-extractor.d.ts.map +1 -0
- package/dist/transformer/handler-ir-extractor.js +171 -0
- package/dist/transformer/handler-ir-extractor.js.map +1 -0
- package/dist/transformer/handler-serializer.d.ts +56 -0
- package/dist/transformer/handler-serializer.d.ts.map +1 -0
- package/dist/transformer/handler-serializer.js +315 -0
- package/dist/transformer/handler-serializer.js.map +1 -0
- package/dist/transformer/helper-context-resolver.d.ts +180 -0
- package/dist/transformer/helper-context-resolver.d.ts.map +1 -0
- package/dist/transformer/helper-context-resolver.js +376 -0
- package/dist/transformer/helper-context-resolver.js.map +1 -0
- package/dist/transformer/helper-decl-utils.d.ts +28 -0
- package/dist/transformer/helper-decl-utils.d.ts.map +1 -0
- package/dist/transformer/helper-decl-utils.js +92 -0
- package/dist/transformer/helper-decl-utils.js.map +1 -0
- package/dist/transformer/identifier-collector.d.ts +28 -0
- package/dist/transformer/identifier-collector.d.ts.map +1 -0
- package/dist/transformer/identifier-collector.js +184 -0
- package/dist/transformer/identifier-collector.js.map +1 -0
- package/dist/transformer/index.d.ts +56 -0
- package/dist/transformer/index.d.ts.map +1 -0
- package/dist/transformer/index.js +333 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/inline-recovery.d.ts +109 -0
- package/dist/transformer/inline-recovery.d.ts.map +1 -0
- package/dist/transformer/inline-recovery.js +369 -0
- package/dist/transformer/inline-recovery.js.map +1 -0
- package/dist/transformer/label-injector.d.ts +105 -0
- package/dist/transformer/label-injector.d.ts.map +1 -0
- package/dist/transformer/label-injector.js +221 -0
- package/dist/transformer/label-injector.js.map +1 -0
- package/dist/transformer/package.json +3 -0
- package/dist/transformer/per-call-context.d.ts +95 -0
- package/dist/transformer/per-call-context.d.ts.map +1 -0
- package/dist/transformer/per-call-context.js +3 -0
- package/dist/transformer/per-call-context.js.map +1 -0
- package/dist/transformer/state-id-fallback.d.ts +85 -0
- package/dist/transformer/state-id-fallback.d.ts.map +1 -0
- package/dist/transformer/state-id-fallback.js +132 -0
- package/dist/transformer/state-id-fallback.js.map +1 -0
- package/dist/transformer/state-id-resolver.d.ts +104 -0
- package/dist/transformer/state-id-resolver.d.ts.map +1 -0
- package/dist/transformer/state-id-resolver.js +222 -0
- package/dist/transformer/state-id-resolver.js.map +1 -0
- package/dist/transformer/theme-class-detector.d.ts +47 -0
- package/dist/transformer/theme-class-detector.d.ts.map +1 -0
- package/dist/transformer/theme-class-detector.js +242 -0
- package/dist/transformer/theme-class-detector.js.map +1 -0
- package/dist/transformer/varname-resolver.d.ts +53 -0
- package/dist/transformer/varname-resolver.d.ts.map +1 -0
- package/dist/transformer/varname-resolver.js +231 -0
- package/dist/transformer/varname-resolver.js.map +1 -0
- package/dist/transformer/whitelist-registry.d.ts +68 -0
- package/dist/transformer/whitelist-registry.d.ts.map +1 -0
- package/dist/transformer/whitelist-registry.js +122 -0
- package/dist/transformer/whitelist-registry.js.map +1 -0
- package/dist/transformer/whitelist-validator.d.ts +59 -0
- package/dist/transformer/whitelist-validator.d.ts.map +1 -0
- package/dist/transformer/whitelist-validator.js +493 -0
- package/dist/transformer/whitelist-validator.js.map +1 -0
- package/dist/types-BXV3vhHS.d.cts +4590 -0
- package/dist/types-BXV3vhHS.d.ts +4590 -0
- package/package.json +121 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/entries/page.ts","../../src/css/style/pseudo/pseudo-style-builder.ts","../../src/utils/errors.ts","../../src/html/errors/html-error.ts","../../src/html/elements/id-registry.ts","../../src/css/utils/scoped-css-generator.ts","../../src/css/utils/identifier-resolver.ts","../../src/html/elements/render-context.ts","../../src/js/vanilla/commands.ts","../../src/js/vanilla/state/state-js-accessor.ts","../../src/js/vanilla/state/state.ts","../../src/js/vanilla/state/template-derived-state.ts","../../src/js/vanilla/state/each-template.ts","../../src/html/elements/each-factory-resolver.ts","../../src/html/tags/tag-type.ts","../../src/html/utils/html-formatter.ts","../../src/css/config/resolve-minify-mode.ts","../../src/css/config/css-config.ts","../../src/utils/unit-style.ts","../../src/css/style/style-keys.ts","../../src/css/layout/position-maker/css-position-maker.ts","../../src/css/utils/css-sanitizer.ts","../../src/utils/dev-guard.ts","../../src/css/style/css-property-group.ts","../../src/css/style/animation/css-animation.ts","../../src/css/style/background/css-background.ts","../../src/css/style/border/css-border.ts","../../src/css/style/flex/css-flex.ts","../../src/css/style/font/css-font.ts","../../src/css/style/grid/css-grid.ts","../../src/css/style/list/css-list.ts","../../src/css/style/pseudo/css-pseudo.ts","../../src/css/style/spacing/css-spacing.ts","../../src/css/style/table/css-table.ts","../../src/css/style/text/css-text.ts","../../src/css/style/transform/css-transform.ts","../../src/css/style/visibility/css-visibility.ts","../../src/css/style/visual/css-visual.ts","../../src/css/style/html-style.ts","../../src/css/manager/css-style-manager.ts","../../src/css/manager/css-manager.ts","../../src/js/jquery-manager.ts","../../src/js/jquery-helper.ts","../../src/composition-root.ts","../../src/js/vanilla/internal/literal-encode.ts","../../src/js/vanilla/element-ref.ts","../../src/js/vanilla/expr-factory.ts","../../src/js/vanilla/state/binding-emitter.ts","../../src/js/vanilla/state/script-state-handle.ts","../../src/js/vanilla/state/type-guards.ts","../../src/js/vanilla/element-methods.ts","../../src/html/elements/_internal/frame-options.ts","../../src/css/constants/breakpoints.ts","../../src/html/elements/_internal/breakpoint-applier.ts","../../src/html/attributes/_data/value-types-and-factories.ts","../../src/html/attributes/html-attribute.ts","../../src/html/elements/_internal/proto-render-pipeline.ts","../../src/html/elements/_internal/css-collector.ts","../../src/html/elements/_internal/js-collector.ts","../../src/html/elements/_internal/used-methods-collector.ts","../../src/html/elements/html-tag.ts","../../src/document/document-context.ts","../../src/js/vanilla/vanilla-script-builder.ts","../../src/js/vanilla/script-scope.ts","../../src/js/vanilla/internal/dom-api.ts","../../src/js/vanilla/internal/query-api.ts","../../src/js/vanilla/internal/tree-api.ts","../../src/js/vanilla/selector-ref.ts","../../src/js/vanilla/state/registry.ts","../../src/runtime/runtime-context.ts","../../src/publisher/file-exporter.ts","../../src/publisher/exportable-error.ts","../../src/publisher/reset-css.ts","../../src/publisher/dom-ready.ts","../../src/js/vanilla/internal/runtime-prelude.gen.ts","../../src/js/vanilla/pending-buffer.ts","../../src/html/elements/root.ts","../../src/html/elements/text-type.ts","../../src/html/elements/pair-type.ts","../../src/html/elements/self-closing-type.ts","../../src/js/js-param.ts","../../src/html/tags/factories-utils.ts","../../src/html/tags/factories-structure.ts","../../src/html/tags/factories-semantic.ts","../../src/html/tags/factories-data.ts","../../src/html/tags/factories-form.ts","../../src/html/tags/factories-inline.ts","../../src/html/tags/factories-media.ts","../../src/view/static-page-writer.ts","../../src/view/page.ts","../../src/html/layout/layout-factories.ts","../../src/view/primitives.ts","../../src/view/app-slot.ts"],"sourcesContent":["// Public secondary entry: page DSL.\n// See docs/positioning.md for product positioning.\n\nexport { page, PageDocument } from '../view/index.js';\nexport {\n Button,\n Heading,\n HStack,\n Image,\n Link,\n Section,\n Spacer,\n Text,\n VStack,\n} from '../view/index.js';\nexport { AppSlot } from '../view/index.js';\n\nexport type {\n ButtonOptions,\n HeadingLevel,\n LinkOptions,\n PageOptions,\n StaticView,\n View,\n} from '../view/index.js';\nexport type { StaticExportOptions } from '../view/index.js';\nexport type { AppSlotOptions } from '../view/index.js';\n","/**\n * 疑似クラス(:hover / :focus / :active)用 fluent スタイルビルダー。\n *\n * `Map<string, string>` に直接 CSS プロパティ(kebab-case)を書き込む。\n * `CSSPseudo.applyBuilder()` がこの Map を消費する。\n *\n * エスケープハッチ `.set(property, value)` により、メソッドに未定義の\n * CSS プロパティも任意に設定できる。\n */\nexport class PseudoStyleBuilder {\n private readonly _props = new Map<string, string>();\n\n color(v: string): this { this._props.set('color', v); return this; }\n background(v: string): this { this._props.set('background', v); return this; }\n backgroundColor(v: string): this { this._props.set('background-color', v); return this; }\n opacity(v: string): this { this._props.set('opacity', v); return this; }\n transform(v: string): this { this._props.set('transform', v); return this; }\n boxShadow(v: string): this { this._props.set('box-shadow', v); return this; }\n border(v: string): this { this._props.set('border', v); return this; }\n borderColor(v: string): this { this._props.set('border-color', v); return this; }\n borderRadius(v: string): this { this._props.set('border-radius', v); return this; }\n fontSize(v: string): this { this._props.set('font-size', v); return this; }\n fontWeight(v: string): this { this._props.set('font-weight', v); return this; }\n textDecoration(v: string): this { this._props.set('text-decoration', v); return this; }\n padding(v: string | number): this {\n this._props.set('padding', typeof v === 'number' ? `${v}px` : v);\n return this;\n }\n width(v: string): this { this._props.set('width', v); return this; }\n height(v: string): this { this._props.set('height', v); return this; }\n cursor(v: string): this { this._props.set('cursor', v); return this; }\n transition(v: string): this { this._props.set('transition', v); return this; }\n\n /** 任意の CSS プロパティを kebab-case で直接設定するエスケープハッチ */\n set(property: string, value: string): this {\n this._props.set(property, value);\n return this;\n }\n\n /** @internal CSSPseudo が Map を取得するための内部 API */\n toMap(): ReadonlyMap<string, string> {\n return this._props;\n }\n}\n","/**\n * Error codes specific to the HTML module.\n *\n * @example\n * ```typescript\n * const errorCode: HtmlErrorCode = 'invalidTag';\n * ```\n */\nexport type HtmlErrorCode = 'invalidTag' | 'invalidAttribute' | 'nestingLimit';\n\n/**\n * Error codes specific to the CSS module.\n *\n * - `invalidProperty` - The CSS property name is invalid or unsupported\n * - `invalidValue` - The CSS property value is invalid for the given property\n * - `layoutConflict` - Conflicting layout properties detected\n *\n * @example\n * ```typescript\n * const errorCode: CssErrorCode = 'invalidProperty';\n * ```\n */\nexport type CssErrorCode =\n | 'invalidProperty'\n | 'invalidValue'\n | 'layoutConflict'\n | 'duplicateProperty';\n\n/**\n * Error codes specific to the JavaScript module.\n *\n * - `invalidSelector` - The DOM selector is invalid or malformed\n * - `unsupportedMethod` - The requested method is not supported\n *\n * @example\n * ```typescript\n * const errorCode: JsErrorCode = 'invalidSelector';\n * ```\n */\nexport type JsErrorCode = 'invalidSelector' | 'unsupportedMethod';\n\n/**\n * Error codes specific to the Publisher module (Exportable operations).\n *\n * Used when ExportableError extends DraftOleError.\n *\n * - `invalidPath` - The file path is invalid or inaccessible\n * - `writeFailed` - The file write operation failed\n *\n * @example\n * ```typescript\n * const errorCode: ExportableErrorCode = 'invalidPath';\n * ```\n */\nexport type ExportableErrorCode = 'invalidPath' | 'writeFailed';\n\n/**\n * Union type of all error codes across all DraftOle modules.\n *\n * This type combines error codes from HTML, CSS, JS, and Publisher modules\n * to provide a unified type for error handling throughout the library.\n *\n * @example\n * ```typescript\n * function handleError(code: DraftOleErrorCode, message: string) {\n * // Handle any DraftOle error code\n * }\n * ```\n */\nexport type DraftOleErrorCode =\n | HtmlErrorCode\n | CssErrorCode\n | JsErrorCode\n | ExportableErrorCode;\n\n/**\n * Abstract base class for all DraftOle errors.\n *\n * This class serves as the foundation for all custom errors in the DraftOle library.\n * Module-specific errors (HtmlError, CssError, JsError, ExportableError) extend this class\n * to provide consistent error handling across the library.\n *\n * The class is abstract and cannot be instantiated directly. Subclasses must implement\n * the `code` and `module` properties to specify the error type and origin.\n *\n * @example\n * ```typescript\n * class HtmlError extends DraftOleError {\n * readonly code: HtmlErrorCode;\n * readonly module = 'html' as const;\n *\n * constructor(code: HtmlErrorCode, message: string) {\n * super(message);\n * this.code = code;\n * this.name = 'HtmlError';\n * }\n * }\n *\n * // Usage\n * try {\n * throw new HtmlError('invalidTag', 'Invalid HTML tag: <script>');\n * } catch (error) {\n * if (error instanceof DraftOleError) {\n * console.log(`Error in ${error.module} module: ${error.message}`);\n * console.log(`Error code: ${error.code}`);\n * }\n * }\n * ```\n */\nexport abstract class DraftOleError extends Error {\n /**\n * The error code specific to the module where the error occurred.\n *\n * This property must be implemented by subclasses to identify the specific\n * type of error that occurred.\n */\n abstract readonly code: string | number;\n\n /**\n * The module where the error originated.\n *\n * This property identifies which DraftOle module threw the error,\n * enabling module-specific error handling.\n */\n abstract readonly module: 'html' | 'css' | 'js' | 'publisher';\n\n /**\n * Creates a new DraftOleError instance.\n *\n * This constructor is protected and can only be called from subclasses.\n * Direct instantiation of DraftOleError is prevented.\n *\n * @param message - Human-readable error message describing what went wrong\n *\n * @throws {Error} When attempting to instantiate DraftOleError directly\n *\n * @example\n * ```typescript\n * // In a subclass\n * class MyCustomError extends DraftOleError {\n * readonly code = 'myError' as const;\n * readonly module = 'html' as const;\n *\n * constructor(message: string) {\n * super(message); // Calls DraftOleError constructor\n * this.name = 'MyCustomError';\n * }\n * }\n * ```\n */\n constructor(message: string) {\n super(message);\n\n // 抽象クラスの直接インスタンス化を防止\n if (new.target === DraftOleError) {\n throw new Error(\n 'DraftOleError is an abstract class and cannot be instantiated directly.',\n );\n }\n\n // V8 スタックトレースの修正(Node.js 環境)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\n/**\n * 各モジュール固有エラークラスの共通中間抽象クラス。\n *\n * `CssError`・`HtmlError`・`JsError` の共通コンストラクタロジック\n * (`super(message)` / `this.code` / `this.options` / `Error.captureStackTrace`)を一元管理する。\n *\n * @typeParam TCode - モジュール固有のエラーコード型(`string | number`)\n * @typeParam TOptions - 追加オプション型(`Record<string, unknown>` のサブタイプ)\n *\n * @example\n * ```typescript\n * export class CssError extends ModuleError<CssErrorCode, { property?: string }> {\n * readonly module = 'css' as const;\n * get property(): string | undefined { return this.options?.property; }\n * constructor(code: CssErrorCode, message: string, options?: { property?: string }) {\n * super(code, message, options);\n * }\n * }\n * ```\n */\nexport abstract class ModuleError<\n TCode extends string | number,\n TOptions extends Record<string, unknown> = Record<string, never>,\n> extends DraftOleError {\n /**\n * モジュール固有のエラーコード\n */\n readonly code: TCode;\n\n /**\n * 追加オプション(モジュール固有の補足情報)\n */\n readonly options?: TOptions;\n\n /**\n * ModuleError のコンストラクタ\n *\n * @param code - モジュール固有のエラーコード\n * @param message - エラーメッセージ\n * @param options - 追加オプション(オプショナル)\n */\n constructor(code: TCode, message: string, options?: TOptions) {\n super(message);\n this.code = code;\n this.options = options;\n this.name = this.constructor.name;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * DEVモードで同一CSSプロパティが2回設定された場合にthrowされるエラー。\n *\n * `DRAFT_OLE_DEV=true` 環境変数が設定されている場合のみ発生する。\n * 本番環境では後から設定した値で上書きされる(CSS仕様通り)。\n */\nexport class DuplicateCssPropertyError extends DraftOleError {\n readonly code = 'duplicateProperty' as const;\n readonly module = 'css' as const;\n\n constructor(property: string) {\n super(\n `CSS property \"${property}\" was set twice on the same element. This is likely a bug.`,\n );\n this.name = 'DuplicateCssPropertyError';\n }\n}\n\n/**\n * `unknown` 型のエラー値を文字列に変換するユーティリティ関数。\n *\n * `Error` インスタンスの場合は `.message` プロパティを返し、\n * それ以外の値には `String()` を適用して文字列化する。\n *\n * catch ブロックで受け取った `unknown` 型のエラーを\n * 型エラーなく文字列として扱いたい場合に使用する。\n *\n * @param error - 変換対象のエラー値(`unknown` 型)\n * @returns エラーメッセージ文字列\n *\n * @example\n * ```typescript\n * try {\n * // ...\n * } catch (error) {\n * const message = errorToString(error);\n * console.error(message);\n * }\n * ```\n */\nexport function errorToString(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { type HtmlErrorCode, ModuleError } from '../../utils/errors.js';\n\n/**\n * HTML モジュール固有のエラークラス\n *\n * ModuleError を継承し、HTML モジュールで発生するエラーを表現する。\n * tagType プロパティでエラーが発生した HTML タグの種類を特定できる。\n *\n * @example\n * ```typescript\n * throw new HtmlError('invalidTag', 'Unsupported tag type', { tagType: 'unknown-tag' });\n * ```\n */\nexport class HtmlError extends ModuleError<HtmlErrorCode, { tagType?: string }> {\n /**\n * エラーが発生したモジュール(常に 'html')\n */\n readonly module = 'html' as const;\n\n /**\n * エラーが発生した HTML タグの種類(オプショナル)\n */\n get tagType(): string | undefined {\n return this.options?.tagType;\n }\n}\n","/**\n * IdRegistry — レンダー中に発行された id を集合管理し、重複を検出する。\n *\n * Requirements: 3.4(id 重複検出)\n *\n * 設計メモ:\n * - 状態モデル: `Map<string, string>`(id → 最初に登録された tagPath)\n * - `Root.protoRender()` 開始時に `reset()` を呼び、レンダー中は単一 Registry を共有する\n * - `register` で既存 id と衝突した場合、`HtmlError`(DraftOleError サブクラス)をスローし、\n * 重複 id と新旧両方の tagPath をメッセージに含める\n */\nimport { HtmlError } from '../errors/html-error.js';\n\n/**\n * IdRegistry の公開インターフェイス\n */\nexport interface IdRegistryProtocol {\n /**\n * id を登録する。既に同じ id が登録されている場合は HtmlError をスローする。\n *\n * @param id - 登録対象の id 文字列\n * @param tagPath - 当該 id を持つタグの構造パス(エラー時の特定用)\n * @throws {HtmlError} 既に同じ id が登録済みの場合\n */\n register(id: string, tagPath: string): void;\n\n /**\n * 指定 id が登録済みかを返す。\n */\n has(id: string): boolean;\n\n /**\n * 登録済み id をすべて破棄する。\n */\n reset(): void;\n}\n\n/**\n * 内部 Map で id を管理する IdRegistry の標準実装。\n */\nexport class IdRegistry implements IdRegistryProtocol {\n /** id → 最初に登録された tagPath */\n private readonly entries: Map<string, string> = new Map();\n\n /**\n * id を登録する。重複検出時は HtmlError をスローする。\n */\n register(id: string, tagPath: string): void {\n const existingPath = this.entries.get(id);\n if (existingPath !== undefined) {\n // 重複 id を検出したため、両方の tagPath を含むエラーを投げる\n throw new HtmlError(\n 'invalidAttribute',\n `Duplicate id \"${id}\" detected: already registered at \"${existingPath}\", attempted to register again at \"${tagPath}\".`,\n );\n }\n this.entries.set(id, tagPath);\n }\n\n /**\n * 登録済みかを返す。\n */\n has(id: string): boolean {\n return this.entries.has(id);\n }\n\n /**\n * 登録をすべて破棄する。\n */\n reset(): void {\n this.entries.clear();\n }\n}\n","/**\n * スコープドCSSクラス名生成ユーティリティ\n *\n * タグパスから決定的なハッシュを生成し、デバッグ可能なユニークCSSクラス名を作成する。\n * djb2 アルゴリズムによりタグパス全体の衝突耐性を担保しつつ、\n * タグパスを正規化した人間可読 prefix を組み合わせる。\n *\n * ## 出力フォーマット (新フォーマット)\n *\n * - 非空 prefix: `_<prefix>__<hash>` (例: `_html-body-div-p-span__a1b2c3d4`)\n * - 空 prefix: `_<hash>` (例: `_a1b2c3d4`)\n *\n * prefix は tagPath を lower-case kebab に正規化したもの。最大 32 文字、\n * 末尾要素を優先して残す。連結子は二重アンダースコア `__`。\n *\n * ## 特徴\n *\n * - **決定的**: 同じ入力に対して常に同じ出力\n * - **デバッグ可能**: prefix から元のタグパス末尾を視認できる\n * - **衝突耐性**: djb2 ハッシュは tagPath 全体に対して計算するため、\n * prefix が同一に切り詰まっても全体クラス名は衝突しない\n *\n * @module scoped-css-generator\n */\n\n/**\n * prefix 部の最大長 (文字数)。\n * design.md \"prefix 正規化ルール\" より固定値。外部公開しない。\n */\nconst PREFIX_MAX_LEN = 32;\n\n/**\n * tagPath を CSS クラス prefix 用に正規化する (module-private)。\n *\n * design.md の正規化 6 ステップを厳密に実装する:\n * 1. lower-case 化\n * 2. `[a-z0-9-]` 以外を `-` に置換\n * 3. 連続する `-` を 1 個に畳む\n * 4. 先頭・末尾の `-` を除去\n * 5. 32 文字を超える場合は末尾から 32 文字を残す\n * (トリム後に先頭が `-` で始まる場合は除去)\n * 6. 結果が空ならそのまま空文字を返す\n *\n * @param tagPath - 任意のタグパス文字列\n * @returns 正規化済み prefix (空文字許容)\n */\nfunction sanitizeTagPathForClassPrefix(tagPath: string): string {\n // Step 1: lower-case 化\n let s = tagPath.toLowerCase();\n // Step 2: 無効文字を `-` に置換\n s = s.replace(/[^a-z0-9-]/g, '-');\n // Step 3: 連続する `-` を 1 個に畳む\n s = s.replace(/-+/g, '-');\n // Step 4: 端の `-` を除去\n s = s.replace(/^-+/, '').replace(/-+$/, '');\n // Step 5: 末尾優先で 32 文字に切り詰め\n if (s.length > PREFIX_MAX_LEN) {\n s = s.slice(s.length - PREFIX_MAX_LEN);\n // 切り詰め境界が `-` の途中になった場合、先頭の `-` を除去\n s = s.replace(/^-+/, '');\n }\n // Step 6: 空文字許容 (そのまま返す)\n return s;\n}\n\n/**\n * djb2ハッシュアルゴリズム\n *\n * Dan Bernstein のハッシュ関数。文字列から32ビットの符号なし整数ハッシュを計算し、\n * 8文字の16進数文字列として返す。\n *\n * ## アルゴリズムの詳細\n *\n * 1. 初期値 5381 から開始\n * 2. 各文字に対して: `hash = (hash << 5) + hash + charCode`\n * 3. 符号なし32ビット整数に変換(`>>> 0`)\n * 4. 16進数8桁の文字列に変換\n *\n * @param str - ハッシュ対象の文字列\n * @returns 8文字の16進数文字列\n *\n * @example\n * ```ts\n * djb2Hash('html>body>div');\n * // → \"a1b2c3d4\" (例)\n *\n * djb2Hash('html>body>span');\n * // → \"e5f6a7b8\" (例、異なる値)\n * ```\n */\nexport function djb2Hash(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) >>> 0;\n }\n return hash.toString(16).padStart(8, '0');\n}\n\n/**\n * スコープドCSSクラス名を生成する (新フォーマット)\n *\n * tagPath を正規化した prefix と djb2 ハッシュを組み合わせ、\n * デバッグ可能かつ衝突耐性のあるクラス名を返す。\n *\n * ## 出力仕様\n *\n * - 非空 prefix: `_<prefix>__<hash>` (例: `_html-body-div-p-span__a1b2c3d4`)\n * - 空 prefix: `_<hash>` (例: `_a1b2c3d4`)\n *\n * prefix は最大 32 文字、末尾要素を優先して残す。連結子は二重アンダースコア `__`。\n * 正規化結果が空文字になった場合は `__` ごと省略し従来形式に縮退する。\n *\n * @param tagPath - タグの階層パス(例: 'html>body>div')\n * @returns スコープドCSSクラス名\n *\n * @example\n * ```ts\n * generateScopedClassName('html>body>div>p>span');\n * // → \"_html-body-div-p-span__a1b2c3d4\"\n *\n * generateScopedClassName('');\n * // → \"_a1b2c3d4\" (空 prefix 縮退)\n *\n * generateScopedClassName('>>>');\n * // → \"_xxxxxxxx\" (全文字無効 → 空 prefix 縮退)\n * ```\n */\nexport function generateScopedClassName(\n tagPath: string,\n options?: { minify?: boolean },\n): string {\n const hash = djb2Hash(tagPath);\n if (options?.minify === true) {\n return `_${hash}`;\n }\n const prefix = sanitizeTagPathForClassPrefix(tagPath);\n return prefix.length === 0 ? `_${hash}` : `_${prefix}__${hash}`;\n}\n\n/**\n * varName 部の最大長 (文字数)。\n * requirements.md 1.4 より固定値。外部公開しない。\n */\nconst VARNAME_MAX_LEN = 24;\n\n/**\n * varName を CSS クラスの varName フラグメント用に正規化する (module-private)。\n *\n * `sanitizeTagPathForClassPrefix` と同じ文字クラスルールを適用し、\n * 末尾を 24 文字までに切り詰める。\n *\n * 1. lower-case 化\n * 2. `[a-z0-9-]` 以外を `-` に置換\n * 3. 連続する `-` を 1 個に畳む\n * 4. 先頭・末尾の `-` を除去\n * 5. 24 文字を超える場合は先頭から 24 文字を残す\n * (切り詰め後に末尾が `-` の場合は除去)\n * 6. 結果が空ならそのまま空文字を返す\n *\n * @param varName - 任意の変数名文字列\n * @returns 正規化済み varName フラグメント (空文字許容)\n */\nfunction sanitizeVarNameForClass(varName: string): string {\n let s = varName.toLowerCase();\n s = s.replace(/[^a-z0-9-]/g, '-');\n s = s.replace(/-+/g, '-');\n s = s.replace(/^-+/, '').replace(/-+$/, '');\n if (s.length > VARNAME_MAX_LEN) {\n s = s.slice(0, VARNAME_MAX_LEN);\n s = s.replace(/-+$/, '');\n }\n return s;\n}\n\n/**\n * varName 付きスコープドCSSクラス名を生成する\n *\n * tagPath を正規化した prefix と varName を正規化したフラグメントを組み合わせ、\n * djb2 ハッシュには `tagPath + '|' + varName` を入力することで、\n * 同一 tagPath 上の異なる varName が常に異なるハッシュを得るようにする。\n *\n * ## 出力仕様\n *\n * - 通常: `_<sanitizedTagPath>_<sanitizedVarName>__<hash>`\n * (prefix と varName 間は単一 `_`、hash 前は二重 `__`)\n * - `varName` が空 (または trim 後に空) → `generateScopedClassName(tagPath)` に委譲\n * - `sanitizeVarNameForClass(varName)` が空 → `generateScopedClassName(tagPath)` に委譲\n *\n * varName フラグメントは最大 24 文字。ハッシュ入力にはサニタイズ前の\n * 生の `tagPath` と `varName` をそのまま使用するため、見た目が同じでも\n * 原文字列が異なれば衝突しない。\n *\n * @param tagPath - タグの階層パス(例: 'html>body>div')\n * @param varName - 変数名(例: 'card')\n * @returns varName 付きスコープドCSSクラス名\n *\n * @example\n * ```ts\n * generateScopedClassNameWithVarName('html>body>div', 'card');\n * // → \"_html-body-div_card__a1b2c3d4\"\n *\n * generateScopedClassNameWithVarName('html>body>div', '');\n * // → \"_html-body-div__<hash>\" (generateScopedClassName に委譲)\n *\n * generateScopedClassNameWithVarName('html>body>div', '___');\n * // → \"_html-body-div__<hash>\" (サニタイズ後空のため委譲)\n * ```\n */\nexport function generateScopedClassNameWithVarName(\n tagPath: string,\n varName: string,\n options?: { minify?: boolean },\n): string {\n // 空 varName は委譲\n if (varName.trim().length === 0) {\n return generateScopedClassName(tagPath, options);\n }\n const sanitizedVar = sanitizeVarNameForClass(varName);\n if (sanitizedVar.length === 0) {\n return generateScopedClassName(tagPath, options);\n }\n const hash = djb2Hash(`${tagPath}|${varName}`);\n if (options?.minify === true) {\n return `_${hash}`;\n }\n const prefix = sanitizeTagPathForClassPrefix(tagPath);\n return prefix.length === 0\n ? `_${sanitizedVar}__${hash}`\n : `_${prefix}_${sanitizedVar}__${hash}`;\n}\n\n/**\n * varName + 既知 bodyHash 付きスコープドCSSクラス名を生成する\n *\n * `generateScopedClassNameWithVarName` と同形式の出力を返すが、\n * ハッシュ部にはここで djb2 を再計算せず、呼び出し側が既に保持している\n * `bodyHash` 文字列をそのまま採用する。\n *\n * これは `CssManager.registerTemplate` 経路用の特殊化版で、\n * `StyleTemplate.bodyHash`(既にスタイル本体に対する一意ハッシュ)を\n * 視覚的フラグメントとして varName と組み合わせるために用いる。\n * djb2 を再計算しないことで、同一 bodyHash を持つ別 varName が\n * 同じハッシュ尾を共有し、出力 CSS のグルーピング視認性を保つ。\n *\n * ## 出力仕様\n *\n * - 通常: `_<sanitizedTagPath>_<sanitizedVarName>__<bodyHash>`\n * - prefix 空: `_<sanitizedVarName>__<bodyHash>`\n * - `varName` が空 (または trim/サニタイズ後に空) → bodyHash 経路に縮退:\n * - prefix 非空: `_<prefix>__<bodyHash>`\n * - prefix 空: `_<bodyHash>`\n *\n * @param tagPath - タグの階層パス\n * @param varName - 変数名(空文字許容、空時は縮退)\n * @param bodyHash - スタイル本体ハッシュ(再ハッシュせずそのまま採用)\n * @returns varName + bodyHash 付きスコープドCSSクラス名\n *\n * @example\n * ```ts\n * generateScopedClassNameWithVarNameAndHash('html>body>div', 'card', 'abc12345');\n * // → \"_html-body-div_card__abc12345\"\n *\n * generateScopedClassNameWithVarNameAndHash('html>body>div', '', 'abc12345');\n * // → \"_html-body-div__abc12345\" (bodyHash 経路に縮退)\n * ```\n */\nexport function generateScopedClassNameWithVarNameAndHash(\n tagPath: string,\n varName: string,\n bodyHash: string,\n options?: { minify?: boolean },\n): string {\n if (options?.minify === true) {\n return `_${bodyHash}`;\n }\n const prefix = sanitizeTagPathForClassPrefix(tagPath);\n // varName が空 (または trim 後に空) の場合は bodyHash 経路に縮退\n if (varName.trim().length === 0) {\n return prefix.length === 0 ? `_${bodyHash}` : `_${prefix}__${bodyHash}`;\n }\n const sanitizedVar = sanitizeVarNameForClass(varName);\n if (sanitizedVar.length === 0) {\n return prefix.length === 0 ? `_${bodyHash}` : `_${prefix}__${bodyHash}`;\n }\n return prefix.length === 0\n ? `_${sanitizedVar}__${bodyHash}`\n : `_${prefix}_${sanitizedVar}__${bodyHash}`;\n}\n","/**\n * 識別子リゾルバ(IdentifierResolver)\n *\n * 構造パス(tagPath)から CSS クラス名と HTML id を決定的に生成する純関数群。\n * 同じ入力に対して常に同じ出力を返し、副作用を持たない(ビルド間で安定)。\n *\n * ## 設計方針\n *\n * - **バイト等価(受動追従)**: `resolveClassName(tagPath)` の bodyHash 省略経路は\n * `generateScopedClassName(tagPath)` の出力に **バイト等価** な値を返す。\n * THEMECLASS-3 で `generateScopedClassName` が debuggable prefix 形式\n * (例: `_body-div-header__a1b2c3d4`)に拡張された場合、本関数は委譲によって\n * 受動的に新フォーマットへ追従する(自関数内で prefix 生成ロジックを持たない)。\n * - **bodyHash 付き経路の据え置き**: `bodyHash` 指定時は現フォーマット\n * `_<djb2(tagPath)>_<djb2(bodyHash)>` を維持する。本経路は THEMECLASS-3 の\n * debuggable prefix 適用対象外(本 spec のスコープ外)であり、新 prefix は\n * 付与しない。\n * - **id 生成**: `resolveId(tagPath)` は `_id_<djb2(tagPath)>` 形式を返し、\n * クラス名空間とは `_id_` プレフィックスで名前空間が分離される(要件 3.5)。\n *\n * 要件: 1.2, 1.3, 2.3, 3.1, 3.3, 3.4, 3.5, 3.6, 3.7, 5.1, 5.2\n *\n * @module identifier-resolver\n */\n\nimport {\n djb2Hash,\n generateScopedClassName,\n generateScopedClassNameWithVarName,\n generateScopedClassNameWithVarNameAndHash,\n} from './scoped-css-generator';\n\n/**\n * 識別子リゾルバのインターフェース\n *\n * tagPath からクラス名・ID を決定的に生成する責務を持つ。\n * 純関数の集合体としてふるまい、状態を持たない。\n */\nexport interface IdentifierResolver {\n /**\n * tagPath(と任意の bodyHash, varName)から CSS クラス名を解決する。\n *\n * @param tagPath - 要素の構造パス(例: `'html>body>div'`)\n * @param bodyHash - スタイル本体の djb2 ハッシュ(省略可)\n * @param varName - `theme.class()` 呼び出し由来の変数名(省略可)。\n * `bodyHash === undefined && varName !== undefined && varName !== ''` の場合のみ\n * `generateScopedClassNameWithVarName(tagPath, varName)` 経路に分岐する。\n */\n resolveClassName(\n tagPath: string,\n bodyHash?: string,\n varName?: string,\n ): string;\n\n /**\n * tagPath から HTML id 文字列を解決する。\n *\n * @param tagPath - 要素の構造パス\n */\n resolveId(tagPath: string): string;\n}\n\n/**\n * tagPath が空でないことを保証する内部ガード。\n *\n * 空文字列は意味的に無効(root 要素自身は対象外)であるため、\n * プログラミングエラーとして例外をスローする。\n */\nfunction assertTagPath(tagPath: string): void {\n if (tagPath === '') {\n throw new Error(\n 'IdentifierResolver: tagPath は非空文字列でなければなりません',\n );\n }\n}\n\n/**\n * tagPath と任意の bodyHash から CSS クラス名を生成する純関数。\n *\n * ## 3 つの経路\n *\n * - **varName 経路(class-name-varname-extraction)**: `bodyHash === undefined`\n * かつ `varName !== undefined && varName !== ''` の場合、\n * `generateScopedClassNameWithVarName(tagPath, varName)` に委譲する。\n * `theme.class()` 呼び出しから抽出された変数名をクラス名フラグメントに\n * 埋め込むことで、出力 CSS/HTML 上で意味的識別子を視認可能にする。\n * - **bodyHash 省略経路(debuggable / 受動追従)**: `generateScopedClassName(tagPath)`\n * へ委譲し、その戻り値を **バイト等価** で返す(要件 3.3, 3.6, 3.7)。\n * THEMECLASS-3 によって `generateScopedClassName` が debuggable prefix 形式\n * (タグパス由来の可読 prefix + djb2 ハッシュサフィックス)へ拡張された場合、\n * 本経路は自動的に新フォーマットへ追従する。本関数内で prefix 生成・正規化を\n * 独自に再実装してはならない(単一情報源の維持、要件 5.1)。\n * - **bodyHash 指定経路(legacy / debuggable 非対象)**: `_<djb2(tagPath)>_<djb2(bodyHash)>`\n * 形式を返す(要件 1.2, 1.3, 2.3, 3.4)。本経路は THEMECLASS-3 の debuggable\n * prefix 適用対象外であり(本 spec のスコープ外、要件 5.2)、新 prefix は\n * 付与しない。同一 tagPath でもスタイル本体が異なれば bodyHash 部によって\n * 別クラス名となり、衝突を回避する。\n * なお `bodyHash` が指定された場合、`varName` は無視される(後方互換維持)。\n *\n * @param tagPath - 要素の構造パス\n * @param bodyHash - スタイル本体ハッシュ(省略可)\n * @param varName - `theme.class()` 由来の変数名(省略可)。\n * `bodyHash === undefined && varName !== undefined && varName !== ''` のときのみ\n * varName 経路に分岐する。\n * @returns CSS クラス名\n *\n * @example\n * ```ts\n * // bodyHash 省略経路: generateScopedClassName と常にバイト等価\n * resolveClassName('html>body>div');\n *\n * // varName 経路: generateScopedClassNameWithVarName に委譲\n * resolveClassName('html>body>div', undefined, 'card');\n *\n * // bodyHash 指定経路: legacy 形式を維持(debuggable prefix なし)\n * resolveClassName('html>body>div', 'flex-gap-12');\n * // → '_<djb2(tagPath)>_<djb2(bodyHash)>'\n * ```\n */\nexport function resolveClassName(\n tagPath: string,\n bodyHash?: string,\n varName?: string,\n options?: { minify?: boolean },\n): string {\n assertTagPath(tagPath);\n const minify = options?.minify === true;\n if (bodyHash === undefined) {\n if (varName !== undefined && varName !== '') {\n return generateScopedClassNameWithVarName(tagPath, varName, { minify });\n }\n return generateScopedClassName(tagPath, { minify });\n }\n // bodyHash 指定経路:\n // - minify 有効時は `_<djb2(tagPath + bodyHash)>` の合成ハッシュへ縮退\n // - varName 併用時: `_<prefix>_<sanitizedVarName>__<bodyHash>` 形式\n // (bodyHash をハッシュ尾に流用し、視覚的に varName を埋め込む)\n // - varName なし: legacy `_<djb2(tagPath)>_<djb2(bodyHash)>` 形式を維持\n if (minify) {\n return `_${djb2Hash(`${tagPath}|${bodyHash}`)}`;\n }\n if (varName !== undefined && varName !== '') {\n return generateScopedClassNameWithVarNameAndHash(\n tagPath,\n varName,\n bodyHash,\n );\n }\n return `_${djb2Hash(tagPath)}_${djb2Hash(bodyHash)}`;\n}\n\n/**\n * minify オプション付きで `IdentifierResolver` を生成するファクトリ。\n *\n * `CssConfig.minifyClassNames` を伝搬するために、構築時に minify モードを\n * 固定した IdentifierResolver を返す。`resolveId` は minify モードの影響を\n * 受けないため、デフォルトと同じ実装を共有する。\n *\n * @param options - `{ minify?: boolean }`(省略時は `minify: false`)\n * @returns minify モードを内包した IdentifierResolver\n *\n * @example\n * ```ts\n * const resolver = createIdentifierResolver({ minify: true });\n * resolver.resolveClassName('html>body>div'); // → \"_<8hex>\"\n * ```\n */\nexport function createIdentifierResolver(\n options?: { minify?: boolean },\n): IdentifierResolver {\n const minify = options?.minify === true;\n return {\n resolveClassName(tagPath, bodyHash, varName) {\n return resolveClassName(tagPath, bodyHash, varName, { minify });\n },\n resolveId,\n };\n}\n\n/**\n * tagPath から HTML id 文字列を生成する純関数。\n *\n * `_id_<djb2(tagPath)>` 形式を返す(要件 3.1, 3.6, 3.7)。\n *\n * ## 名前空間分離の契約(要件 3.5)\n *\n * id 文字列は **常に `_id_` プレフィックスで始まる** ことにより、クラス名空間と\n * id 名前空間が文字列レベルで分離される。クラス名側は(debuggable prefix 形式\n * へ拡張された後も)`_id_` プレフィックスを生成しないため、同一 tagPath から\n * 派生したクラス名文字列と id 文字列を相互に誤って解釈することはできない。\n * THEMECLASS-3 によるクラス名フォーマット変更は本契約に影響しない。\n *\n * @param tagPath - 要素の構造パス\n * @returns HTML id 文字列(必ず `_id_` プレフィックスで始まる)\n *\n * @example\n * ```ts\n * resolveId('html>body>div');\n * // → '_id_<djb2(tagPath)>' (例: '_id_a1b2c3d4')\n * ```\n */\nexport function resolveId(tagPath: string): string {\n assertTagPath(tagPath);\n return `_id_${djb2Hash(tagPath)}`;\n}\n\n/**\n * デフォルトの IdentifierResolver 実装。\n *\n * 純関数 `resolveClassName` / `resolveId` をインターフェース経由で\n * 利用したい呼び出し側のためのシングルトンラッパー。\n */\nexport const defaultIdentifierResolver: IdentifierResolver = {\n resolveClassName,\n resolveId,\n};\n","/**\n * RenderContext — protoRender 系メソッドが共有する単一コンテキスト。\n *\n * Requirements: 3.1(id 自動生成)、3.4(id 重複検出)\n *\n * 設計メモ:\n * - `IdRegistry` と `IdentifierResolver` をひとつのオブジェクトに束ねて\n * レンダーツリー全体で同一インスタンスを伝搬させるための器。\n * - 既存の `protoRender` シグネチャに **optional 引数** として追加できる\n * 形にしてあり、ctx 省略時は呼び出し側が `createDefaultRenderContext()`\n * などで自前生成して旧挙動互換を保つ運用を想定する。\n * - サブクラス(Root / PairType / SelfClosingType / TextType)の override は、\n * 受け取った ctx を子要素 `protoRender(ctx)` に **必ず伝搬する責務**を持つ。\n * 伝搬漏れは Req 3.4 の不達につながる(design.md 参照)。\n *\n * このファイルは純粋な型定義 + 軽量ファクトリのみで、副作用や\n * ランタイム依存を持たない。\n */\nimport { IdRegistry } from './id-registry.js';\nimport {\n createIdentifierResolver,\n defaultIdentifierResolver,\n type IdentifierResolver,\n} from '../../css/utils/identifier-resolver.js';\nimport type { CssConfig } from '../../css/config/css-config.js';\n\n/**\n * レンダーフェーズ全体で共有するコンテキスト。\n *\n * - `registry`: ツリー単位で id 重複を検出するためのレジストリ。\n * Root.protoRender() の冒頭で `reset()` され、以降の子要素レンダーで\n * 同一インスタンスを共有する。\n * - `resolver`: tagPath からクラス名・id を決定的に生成する純関数群。\n * ステートレスなので使い回し可能。\n */\nexport interface RenderContext {\n readonly registry: IdRegistry;\n readonly resolver: IdentifierResolver;\n /**\n * ファクトリ抽出モードフラグ。\n *\n * `true` の場合、`each` などの factory 由来コンポーネントの\n * 抽出経路を有効化する(後続タスクで実装)。\n * 未設定または `false` の場合は従来挙動を維持する。\n *\n * Requirements: 1.1, 2.1\n */\n readonly factoryExtraction?: boolean;\n}\n\n/**\n * デフォルトの RenderContext を生成するファクトリ。\n *\n * `protoRender` を ctx 省略形で呼び出した場合に内部で組み立てる用途を想定。\n * IdRegistry は **新規インスタンス**を毎回生成する。\n *\n * `options.cssConfig` が指定された場合、`cssConfig.minifyClassNames` に応じて\n * minify-aware な `IdentifierResolver` を `createIdentifierResolver` で構築する。\n * 省略時は副作用のないシングルトン(`defaultIdentifierResolver`)を共有する\n * (既存挙動とバイト等価)。\n *\n * 設計判断: `RenderContext` interface には `cssConfig` フィールドを追加しない。\n * minify 状態は `resolver` 内に閉じ込められ、下流は `resolver` のみを単一情報源とする\n * (css-config-pipeline-wiring spec、Issue 2 対応)。\n *\n * @param options - `{ cssConfig?: CssConfig }` 省略可\n */\nexport function createDefaultRenderContext(\n options?: { cssConfig?: CssConfig },\n): RenderContext {\n const resolver: IdentifierResolver = options?.cssConfig === undefined\n ? defaultIdentifierResolver\n : createIdentifierResolver({ minify: options.cssConfig.minifyClassNames });\n return {\n registry: new IdRegistry(),\n resolver,\n };\n}\n","/**\n * 内部命令レコード `VanillaCommand` 判別共用体と JS 文字列化関数。\n *\n * 設計書 `design.md` の「commands: VanillaCommand」「renderCommand」「renderCommands」に対応。\n * 本モジュールは全 API が発行する命令の代数的データ型と、それらを JS 文字列へ\n * 変換する純関数を 1 箇所に集約する。`jQuery` / `$` を出力に含めない制約を\n * コードレビュー可能にする責務を負う(Req 1.5, 7.1)。\n */\n\nimport type { JsExpr } from './types.js';\nimport type { ElementTarget } from './element-target.js';\nimport type { HtmlTag } from '../../html/elements/html-tag.js';\n\n// 旧 `ElementTarget`(`'var' | 'sel'`)は `element-target.ts` 由来の\n// 新共用体(`'sel' | 'closure-ref'`)に統一された(task 5.4)。\n// `closure-ref` バリアントは旧 `'var'` バリアントの後継で、\n// `varName` を裸の識別子として埋め込む(factory コード内のローカル変数名)。\nexport type { ElementTarget };\nexport type { SelectorTarget, ClosureRefTarget } from './element-target.js';\n\n/**\n * each テンプレートの捕捉情報。\n * `each-template.ts` との循環 import を避けるためここで独立定義する。\n * (`each-template.ts` が `commands.ts` を import するため循環になる)\n *\n * - `itemStateIdPattern`: \"{parent}.item{i}\" パターン\n * - `templateCommands`: テンプレート HtmlTag の `_pending` から取り出した命令列\n */\nexport interface EachTemplateSnapshot {\n /** スロット ID パターン。ランタイムが \"{i}\" を実際のインデックスに置換する */\n itemStateIdPattern: string;\n /** テンプレート内の VanillaCommand(_pending からスナップショット) */\n templateCommands: VanillaCommand[];\n /**\n * 6.1: closure 形式 factory 関数文字列。\n * `function(arrayId, idx, draftole) { ... return _e0; }` 形式。\n */\n factoryCode?: string;\n /** factory コード生成方式。closure(新形)/ static-placeholder(旧形)。 */\n factoryKind?: 'closure' | 'static-placeholder';\n /**\n * each-closure-fix: closure 経路で build-phase 直後に保持する template HtmlTag。\n * emit-phase で tagPath 注入と factoryCode 生成のために再走査する。\n * factoryCode 確定後は不要となるため optional。\n */\n _templateRoot?: HtmlTag;\n}\n\n/**\n * バニラ JS ビルダーが発行する内部命令の判別共用体。\n * 各バリアントは `type` で識別され、`renderCommand` により JS 文字列に変換される。\n */\nexport type VanillaCommand =\n | { type: 'addEventListener'; target: ElementTarget; event: string; handlerCode: string }\n | { type: 'domReady'; bodyCode: string }\n | { type: 'declareFunction'; name: string; params: readonly string[]; bodyCode: string }\n | { type: 'declareConst'; name: string; expr: string }\n | { type: 'classListToggle'; target: ElementTarget; name: string; force?: string }\n | { type: 'classListAdd'; target: ElementTarget; name: string }\n | { type: 'classListRemove'; target: ElementTarget; name: string }\n | { type: 'setProp'; target: ElementTarget; prop: 'textContent' | 'value'; expr: string }\n | { type: 'setStyle'; target: ElementTarget; key: string; expr: string }\n | { type: 'appendChild'; parent: ElementTarget; child: ElementTarget }\n | { type: 'remove'; target: ElementTarget }\n | { type: 'forEach'; listExpr: string; itemVar: string; bodyCode: string }\n | { type: 'if'; condition: string; thenCode: string; elseCode?: string }\n | { type: 'expr'; code: string }\n | { type: 'raw'; code: string }\n // ── reactive-state 拡張(Req 1.2, 2.2, 4.1–4.7) ──────────────────────\n | { type: 'state-init'; id: string; initial: JsExpr }\n | { type: 'state-set'; id: string; value: JsExpr }\n | { type: 'state-update'; id: string; body: JsExpr }\n | { type: 'bind-text'; target: ElementTarget; stateId: string; transform?: JsExpr }\n | { type: 'bind-value'; target: ElementTarget; stateId: string; transform?: JsExpr }\n | { type: 'bind-checked'; target: ElementTarget; stateId: string; transform?: JsExpr }\n | { type: 'bind-class-all'; target: ElementTarget; stateId: string; transform?: JsExpr }\n | { type: 'bind-class-add'; target: ElementTarget; stateId: string; transform?: JsExpr }\n | { type: 'bind-style'; target: ElementTarget; prop: string; stateId: string; transform?: JsExpr }\n | { type: 'bind-attr'; target: ElementTarget; attr: string; stateId: string; transform?: JsExpr }\n | { type: 'bind-each'; target: ElementTarget; stateId: string; template: EachTemplateSnapshot }\n // ── Computed 派生状態(方針 B: Computed をランタイム状態として初期化) ────\n | { type: 'derive-state'; sourceId: string; derivedId: string; transformBody: JsExpr }\n // ── handler-serialization 拡張(Req 4.1, 4.4) ──────────────────────────\n | { type: 'handler-body'; target: ElementTarget; event: string; code: string; params: readonly string[] };\n\n/**\n * 文字列値を JS 文字列リテラルとして安全にクォート・エスケープする。\n * セレクタ・クラス名・テキスト値・イベント名などすべての静的文字列に適用する。\n */\nfunction quote(value: string): string {\n return JSON.stringify(value);\n}\n\n/**\n * `ElementTarget` を JS 式文字列に変換する内部ユーティリティ。\n * - `{ kind: 'closure-ref', varName }` → `varName`(裸の識別子をそのまま出力)\n * - `{ kind: 'sel', selector }` → `document.querySelector(\"selector\")`\n */\nexport function renderElementTarget(target: ElementTarget): string {\n switch (target.kind) {\n case 'closure-ref':\n return target.varName;\n case 'sel':\n return `document.querySelector(${quote(target.selector)})`;\n case 'deferred-self':\n throw new TypeError(\n 'renderElementTarget: deferred-self target must be resolved before rendering',\n );\n default: {\n const _exhaustive: never = target;\n throw new TypeError(\n `renderElementTarget: unknown ElementTarget variant: ${String(_exhaustive)}`,\n );\n }\n }\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Task 1.4: CommandWithTarget 型・rewriteCommandTarget・hasCommandTarget\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * `target: ElementTarget` プロパティを持つ `VanillaCommand` バリアントの集合型。\n * `Extract` により target を持たない variant(`domReady`, `declareFunction` 等)\n * は集合から除外される。\n *\n * Requirements: 1.4, 4.1, 4.2\n */\nexport type CommandWithTarget = Extract<VanillaCommand, { target: ElementTarget }>;\n\n/**\n * `CommandWithTarget` の target を書き換えた新しいオブジェクトを返すヘルパ。\n * ジェネリック `C` を維持することで呼び出し側の variant 型が保たれる。\n * `as C` キャストはこの関数内のみに局所化する。\n *\n * Requirements: 1.4, 4.1, 4.2\n */\nexport function rewriteCommandTarget<C extends CommandWithTarget>(\n cmd: C,\n target: ElementTarget,\n): C {\n return { ...cmd, target } as C;\n}\n\n/**\n * `VanillaCommand` が `CommandWithTarget` であるかを判定する型ガード。\n * `target` プロパティが存在し、かつ `kind` フィールドを持つオブジェクトであることを検査する。\n *\n * Requirements: 1.4, 4.1\n */\nexport function hasCommandTarget(cmd: VanillaCommand): cmd is CommandWithTarget {\n return (\n 'target' in cmd &&\n (cmd as { target?: unknown }).target !== undefined &&\n typeof (cmd as { target: { kind: string } }).target.kind === 'string'\n );\n}\n\n/**\n * `appendChild` コマンドの parent / child 双方の `ElementTarget` を書き換えた\n * 新しいオブジェクトを返すヘルパ。\n *\n * `rewriteCommandTarget` は `.target` 単一フィールド専用(`CommandWithTarget` 制約)\n * であるため、`parent`/`child` の 2 フィールドを持つ `appendChild` には使えない。\n * 本ヘルパはその専用版として提供する。\n *\n * Requirements: 1.4, 4.3\n */\nexport type AppendChildCommand = Extract<VanillaCommand, { type: 'appendChild' }>;\n\nexport function rewriteAppendChildTargets(\n cmd: AppendChildCommand,\n parentRef: ElementTarget,\n childRef: ElementTarget,\n): AppendChildCommand {\n return { ...cmd, parent: parentRef, child: childRef };\n}\n\n/**\n * 命令レコードを完全な JS 文字列(1 文または複数行ブロック)に変換する純関数。\n * `switch` + `default: never` チェックにより命令追加時のコンパイルエラーで漏れを検知する。\n *\n * - セレクタ・クラス名・テキスト値等の静的文字列は `JSON.stringify` でクォートされる。\n * - 出力に `jQuery` / `$` 識別子を含めない(`raw` 命令で利用者が混入させた場合を除く)。\n */\nexport function renderCommand(cmd: VanillaCommand): string {\n switch (cmd.type) {\n case 'addEventListener': {\n const tgt = renderElementTarget(cmd.target);\n return `${tgt}.addEventListener(${quote(cmd.event)}, ${cmd.handlerCode});`;\n }\n case 'domReady':\n return `document.addEventListener(\"DOMContentLoaded\", () => {\\n${cmd.bodyCode}\\n});`;\n case 'declareFunction': {\n const params = cmd.params.join(', ');\n return `function ${cmd.name}(${params}) {\\n${cmd.bodyCode}\\n}`;\n }\n case 'declareConst':\n return `const ${cmd.name} = ${cmd.expr};`;\n case 'classListToggle': {\n const tgt = renderElementTarget(cmd.target);\n return cmd.force === undefined\n ? `${tgt}.classList.toggle(${quote(cmd.name)});`\n : `${tgt}.classList.toggle(${quote(cmd.name)}, ${cmd.force});`;\n }\n case 'classListAdd': {\n const tgt = renderElementTarget(cmd.target);\n return `${tgt}.classList.add(${quote(cmd.name)});`;\n }\n case 'classListRemove': {\n const tgt = renderElementTarget(cmd.target);\n return `${tgt}.classList.remove(${quote(cmd.name)});`;\n }\n case 'setProp': {\n const tgt = renderElementTarget(cmd.target);\n return `${tgt}.${cmd.prop} = ${cmd.expr};`;\n }\n case 'setStyle': {\n const tgt = renderElementTarget(cmd.target);\n return `${tgt}.style.${cmd.key} = ${cmd.expr};`;\n }\n case 'appendChild': {\n const parentExpr = renderElementTarget(cmd.parent);\n const childExpr = renderElementTarget(cmd.child);\n return `${parentExpr}.appendChild(${childExpr});`;\n }\n case 'remove': {\n const tgt = renderElementTarget(cmd.target);\n return `${tgt}.remove();`;\n }\n case 'forEach':\n return `${cmd.listExpr}.forEach((${cmd.itemVar}) => {\\n${cmd.bodyCode}\\n});`;\n case 'if':\n return cmd.elseCode === undefined\n ? `if (${cmd.condition}) {\\n${cmd.thenCode}\\n}`\n : `if (${cmd.condition}) {\\n${cmd.thenCode}\\n} else {\\n${cmd.elseCode}\\n}`;\n case 'expr':\n return `${cmd.code};`;\n case 'raw':\n return cmd.code;\n // ── reactive-state 拡張種別(Req 1.2, 2.2, 4.1–4.7) ────────────────\n case 'state-init':\n return `__draftole__.initState(${quote(cmd.id)}, ${cmd.initial.code});`;\n case 'state-set':\n return `__draftole__.state(${quote(cmd.id)}).set(${cmd.value.code});`;\n case 'state-update':\n return `__draftole__.state(${quote(cmd.id)}).update(${cmd.body.code});`;\n case 'bind-text': {\n const tgt = renderElementTarget(cmd.target);\n return cmd.transform === undefined\n ? `__draftole__.bindText(${tgt}, ${quote(cmd.stateId)});`\n : `__draftole__.bindText(${tgt}, ${quote(cmd.stateId)}, ${cmd.transform.code});`;\n }\n case 'bind-value': {\n const tgt = renderElementTarget(cmd.target);\n return cmd.transform === undefined\n ? `__draftole__.bindValue(${tgt}, ${quote(cmd.stateId)});`\n : `__draftole__.bindValue(${tgt}, ${quote(cmd.stateId)}, ${cmd.transform.code});`;\n }\n case 'bind-checked': {\n const tgt = renderElementTarget(cmd.target);\n return cmd.transform === undefined\n ? `__draftole__.bindChecked(${tgt}, ${quote(cmd.stateId)});`\n : `__draftole__.bindChecked(${tgt}, ${quote(cmd.stateId)}, ${cmd.transform.code});`;\n }\n case 'bind-class-all': {\n const tgt = renderElementTarget(cmd.target);\n return cmd.transform === undefined\n ? `__draftole__.bindClassAll(${tgt}, ${quote(cmd.stateId)});`\n : `__draftole__.bindClassAll(${tgt}, ${quote(cmd.stateId)}, ${cmd.transform.code});`;\n }\n case 'bind-class-add': {\n const tgt = renderElementTarget(cmd.target);\n return cmd.transform === undefined\n ? `__draftole__.bindClassAdd(${tgt}, ${quote(cmd.stateId)});`\n : `__draftole__.bindClassAdd(${tgt}, ${quote(cmd.stateId)}, ${cmd.transform.code});`;\n }\n case 'bind-style': {\n const tgt = renderElementTarget(cmd.target);\n return cmd.transform === undefined\n ? `__draftole__.bindStyle(${tgt}, ${quote(cmd.prop)}, ${quote(cmd.stateId)});`\n : `__draftole__.bindStyle(${tgt}, ${quote(cmd.prop)}, ${quote(cmd.stateId)}, ${cmd.transform.code});`;\n }\n case 'bind-attr': {\n const tgt = renderElementTarget(cmd.target);\n return cmd.transform === undefined\n ? `__draftole__.bindAttr(${tgt}, ${quote(cmd.attr)}, ${quote(cmd.stateId)});`\n : `__draftole__.bindAttr(${tgt}, ${quote(cmd.attr)}, ${quote(cmd.stateId)}, ${cmd.transform.code});`;\n }\n case 'bind-each': {\n const tgt = renderElementTarget(cmd.target);\n // 6.1: closure 形式 factory(buildFactoryCode 出力)が snapshot に\n // セットされている場合はそれを使用する。\n // 後方互換のため、未セット時は旧プレースホルダを出力する。\n const factory = cmd.template.factoryCode\n ?? `function(itemId, idx) { /* template: ${cmd.template.itemStateIdPattern} */ }`;\n return `__draftole__.bindEach(${tgt}, ${quote(cmd.stateId)}, ${factory});`;\n }\n case 'derive-state':\n return `__draftole__.state(${quote(cmd.sourceId)}).subscribe(function(_v) { __draftole__.state(${quote(cmd.derivedId)}).set((${cmd.transformBody.code})(_v)); });`;\n case 'handler-body': {\n const tgt = renderElementTarget(cmd.target);\n return `${tgt}.addEventListener(${quote(cmd.event)}, function(${cmd.params.join(', ')}) { ${cmd.code} });`;\n }\n default: {\n // 命令種別の追加漏れを TypeScript コンパイル時に検知するための exhaustive check。\n const _exhaustive: never = cmd;\n void _exhaustive;\n throw new Error(\n `renderCommand: unknown command type: ${JSON.stringify(cmd satisfies never)}`,\n );\n }\n }\n}\n\n/**\n * 命令配列を `indent` を各行に付与して直列化する純関数。\n * 各命令の `renderCommand` 出力(複数行含む)を行単位で分割し、先頭に `indent` を付与する。\n * コマンド間は改行で結合する。空配列の場合は空文字を返す。\n */\nexport function renderCommands(cmds: readonly VanillaCommand[], indent: string): string {\n if (cmds.length === 0) return '';\n const lines: string[] = [];\n for (const cmd of cmds) {\n const rendered = renderCommand(cmd);\n for (const line of rendered.split('\\n')) {\n // 空行はそのまま保持する(インデントだけを残さない)。\n lines.push(line.length === 0 ? '' : `${indent}${line}`);\n }\n }\n return lines.join('\\n');\n}\n","/**\n * StateJsAccessor — State 値を読み書きする JS 文字列アクセサ\n *\n * 設計書 `design.md` の「Component: StateJsAccessor (NEW)」に対応。\n *\n * - `get()` → `\"__draftole__.state('<runtimeId>').get()\"`\n * - `set(expr)` → `\"__draftole__.state('<runtimeId>').set(<expr>)\"`\n * - `update(body)` → `\"__draftole__.state('<runtimeId>').set((__v) => { <body> })\"`\n *\n * Requirements: 1.1, 1.2, 1.3, 1.4\n */\n\n// ────────────────────────────────────────────────────────────\n// Interface\n// ────────────────────────────────────────────────────────────\n\nexport interface StateJsAccessor {\n /** `\"__draftole__.state('<runtimeId>').get()\"` を返す */\n get(): string;\n /** `\"__draftole__.state('<runtimeId>').set(<expr>)\"` を返す */\n set(expr: string): string;\n /** `\"__draftole__.state('<runtimeId>').set((__v) => { <body> })\"` を返す */\n update(body: string): string;\n}\n\n// ────────────────────────────────────────────────────────────\n// Implementation\n// ────────────────────────────────────────────────────────────\n\nexport class StateJsAccessorImpl implements StateJsAccessor {\n private readonly _runtimeId: string;\n\n constructor(runtimeId: string) {\n this._runtimeId = runtimeId;\n }\n\n get(): string {\n return `__draftole__.state('${this._runtimeId}').get()`;\n }\n\n set(expr: string): string {\n return `__draftole__.state('${this._runtimeId}').set(${expr})`;\n }\n\n update(body: string): string {\n return `__draftole__.state('${this._runtimeId}').set((__v) => { ${body} })`;\n }\n}\n","/**\n * State<T> / Computed<T> の実装\n *\n * 設計書 `design.md` の「Components and Interfaces: State<T> / Computed<T>」に対応。\n *\n * - `State<T>`: 読み書き可能な観測可能値オブジェクト(ビルド時)\n * - `Computed<T>`: 読み取り専用の派生値オブジェクト(`.set` を持たない)\n * - `createStateExpr`: runtimeId から `__draftole__.state(id).get()` 形式の JsExpr を生成\n *\n * 設計上の決定事項:\n * - `.get()` は JsExpr を返す(ランタイム API 呼び出し式)\n * - `.set(v)` / `.update(body)` は ScriptScope 内で呼ばれることを前提としたコマンド生成 API\n * (このタスクでは no-op / stub として実装)\n * - `.map(fn)` は Computed<U> を返す(fn はビルド時に呼ばれる)\n * - `.field(key)` は State/Computed の派生を返す(_parent / _fieldKey チェーンを保持)\n * - `.each(fn)` は EachBinding<U> を返す(タスク 2.3 で詳細実装)\n *\n * Requirements: 1.4, 2.1, 2.2, 2.3, 3.1, 3.2, 3.4, 6.3\n */\n\nimport type { HtmlTag } from '../../../html/elements/html-tag.js';\nimport type { JsBoolExpr, JsExpr } from '../types.js';\nimport { captureEachTemplate } from './each-template.js';\nimport type { DerivedEntry, StateRegistry } from './registry.js';\nimport { StateJsAccessorImpl, type StateJsAccessor } from './state-js-accessor.js';\n\n// ────────────────────────────────────────────────────────────\n// 構造的マーカー型(D-7)\n// ────────────────────────────────────────────────────────────\n\n/**\n * ReadableState<T> を識別するための構造的マーカーシンボル。\n *\n * `declare const` なのでランタイムには存在しない(型レイヤのみ)。\n * transformer の TypeChecker から 1 回の getTypeAtLocation で\n * State / Computed / ScriptStateHandle を判別可能にする(Design D-7)。\n */\nexport declare const DraftoleStateMarker: unique symbol;\n\n// ────────────────────────────────────────────────────────────\n// ユーティリティ型\n// ────────────────────────────────────────────────────────────\n\n/** 配列要素型の抽出(design.md の ArrayItem<T>)*/\nexport type ArrayItem<T> = T extends readonly (infer U)[] ? U : never;\n\n/** each バインディングの戻り値型(design.md の EachBinding<U>)*/\nexport interface EachBinding<U> {\n readonly _kind: 'each';\n readonly _stateId: string;\n readonly _template: U;\n}\n\n// ────────────────────────────────────────────────────────────\n// 公開インタフェース\n// ────────────────────────────────────────────────────────────\n\n/**\n * 読み取り専用の観測可能値インタフェース。\n * State<T> / Computed<T> 共通。\n *\n * design.md: ReadableState<T>\n */\nexport interface ReadableState<T> {\n /** 構造的マーカー(Design D-7): transformer の TypeChecker が State 型を識別するために使用。\n * `declare const DraftoleStateMarker: unique symbol` なのでランタイムには存在しない。 */\n readonly [DraftoleStateMarker]: 'state';\n\n /**\n * build 時の状態 ID(handler-serialization から参照可、Req 6.3)\n * @deprecated Use state.js.get() / state.js.set() instead\n */\n readonly _runtimeId: string;\n\n /** JS 文字列アクセサ(Req 1.1, 1.2, 1.5)*/\n readonly js: StateJsAccessor;\n\n /**\n * ハンドラ内で呼び出すと現在の状態値(T)を返す(state-handler-typing Req 1.1)。\n *\n * 注意: ハンドラ外(モジュールトップレベル等)で呼び出すと、\n * transformer の whitelist-validator により静的エラーになる。\n * ビルド時に JS コード片が必要な場合は `state.js.get()` を使う。\n */\n get(): T;\n\n /** 派生値 Computed<U>(Req 3.1)*/\n map<U>(fn: (t: T) => U): Computed<U>;\n\n /** オブジェクトフィールドの読み取り専用派生(Computed として返す)*/\n field<K extends keyof T>(key: K): T extends object ? Computed<T[K]> : never;\n}\n\n/**\n * 読み書き可能な観測可能値インタフェース。\n *\n * design.md: State<T>\n */\nexport interface State<T> extends ReadableState<T> {\n /** 書き込み: T の即値 または JsExpr(Req 2.2)*/\n set(value: T): void;\n set(value: JsExpr): void;\n\n /** 更新関数: 本仕様では JsExpr 形式のみ(Req 2.3, R-2)*/\n update(body: JsExpr): void;\n\n /** 書き戻し可能なフィールド派生(State として返す、R-1 決定)*/\n field<K extends keyof T>(key: K): T extends object ? State<T[K]> : never;\n\n /** 配列要素を State<Item> として受け取る要素ビルダテンプレート(Req 3.5)*/\n each<U extends HtmlTag | readonly HtmlTag[]>(\n fn: (item: State<ArrayItem<T>>) => U,\n ): EachBinding<U>;\n}\n\n/**\n * 読み取り専用の派生値インタフェース。\n *\n * design.md: Computed<T>\n * Req 3.2: set を持たない\n */\nexport type Computed<T> = ReadableState<T>;\n\n// ────────────────────────────────────────────────────────────\n// JsExpr ファクトリ\n// ────────────────────────────────────────────────────────────\n\n/**\n * runtimeId から `__draftole__.state(id).get()` 形式の JsExpr を生成するファクトリ。\n *\n * Req 2.1: `.get()` は式位置で呼び出すと JsExpr を返す。\n * design.md: ランタイム API シグネチャ `__draftole__.state('id').get()`\n */\nexport function createStateExpr(runtimeId: string): JsExpr {\n const code = `__draftole__.state('${runtimeId}').get()`;\n return makeJsExpr(code);\n}\n\n/**\n * 任意の code 文字列から JsExpr を生成するファクトリ。\n */\nexport function makeJsExpr(code: string): JsExpr {\n const self: JsExpr = {\n __jsExpr: true as const,\n code,\n eq(other: string | number | JsExpr): JsBoolExpr {\n const otherCode = typeof other === 'object' ? other.code : JSON.stringify(other);\n return makeBoolExpr(`${code} === ${otherCode}`);\n },\n ne(other: string | number | JsExpr): JsBoolExpr {\n const otherCode = typeof other === 'object' ? other.code : JSON.stringify(other);\n return makeBoolExpr(`${code} !== ${otherCode}`);\n },\n or(fallback: string | JsExpr): JsExpr {\n const fbCode = typeof fallback === 'object' ? fallback.code : JSON.stringify(fallback);\n return makeJsExpr(`(${code} || ${fbCode})`);\n },\n trim(): JsExpr {\n return makeJsExpr(`(${code}).trim()`);\n },\n isFalsy(): JsBoolExpr {\n return makeBoolExpr(`!(${code})`);\n },\n isTruthy(): JsBoolExpr {\n return makeBoolExpr(`!!(${code})`);\n },\n };\n return self;\n}\n\n/**\n * 真偽値式 JsBoolExpr を生成する内部ファクトリ。\n */\nfunction makeBoolExpr(code: string): JsBoolExpr {\n return {\n ...makeJsExpr(code),\n __jsBool: true as const,\n __jsExpr: true as const,\n // eq/ne/or/trim/isFalsy/isTruthy は makeJsExpr のものを上書きが必要\n // spread では動作しないため明示的に定義\n eq(other: string | number | JsExpr): JsBoolExpr {\n const otherCode = typeof other === 'object' ? other.code : JSON.stringify(other);\n return makeBoolExpr(`${code} === ${otherCode}`);\n },\n ne(other: string | number | JsExpr): JsBoolExpr {\n const otherCode = typeof other === 'object' ? other.code : JSON.stringify(other);\n return makeBoolExpr(`${code} !== ${otherCode}`);\n },\n or(fallback: string | JsExpr): JsExpr {\n const fbCode = typeof fallback === 'object' ? fallback.code : JSON.stringify(fallback);\n return makeJsExpr(`(${code} || ${fbCode})`);\n },\n trim(): JsExpr {\n return makeJsExpr(`(${code}).trim()`);\n },\n isFalsy(): JsBoolExpr {\n return makeBoolExpr(`!(${code})`);\n },\n isTruthy(): JsBoolExpr {\n return makeBoolExpr(`!!(${code})`);\n },\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// StateImpl(State<T> の実装クラス)\n// ────────────────────────────────────────────────────────────\n\n/**\n * State<T> の実装クラス。\n *\n * package-private なフィールド:\n * - `_runtimeId`: ランタイム状態 ID(handler-serialization から参照可、Req 6.3)\n * - `_registry`: StateRegistry への参照(map/field で派生 ID を採番するため)\n * - `_parent?`: field 派生の親 StateInstance\n * - `_fieldKey?`: field 派生のキー\n */\nexport class StateImpl<T> implements State<T> {\n /** 構造的マーカー(Design D-7): transformer が State 型を識別するために使用。\n * `declare` なのでランタイムには存在しない(型レイヤのみ)。 */\n declare readonly [DraftoleStateMarker]: 'state';\n\n /** @deprecated Use state.js.get() / state.js.set() instead */\n readonly _runtimeId: string;\n readonly _registry: StateRegistry;\n readonly _parent?: StateImpl<unknown>;\n readonly _fieldKey?: string | number;\n readonly js: StateJsAccessor;\n\n constructor(\n runtimeId: string,\n registry: StateRegistry,\n parent?: StateImpl<unknown>,\n fieldKey?: string | number,\n ) {\n this._runtimeId = runtimeId;\n this._registry = registry;\n this._parent = parent;\n this._fieldKey = fieldKey;\n this.js = new StateJsAccessorImpl(runtimeId);\n }\n\n /**\n * 宣言型は `T`(runtime 意味論、state-handler-typing Req 1.1/1.2)。\n *\n * 実装はビルド時に JsExpr を返すが、`.on()` ハンドラ内では transformer が\n * AST を `__draftole__.state(id).get()` に書き換えるため、ランタイムでは `T` 値が返る。\n * ハンドラ外での誤呼び出しは whitelist-validator が静的エラー化するため、\n * 型レベルの \"嘘\" は安全(design.md: StateImpl Implementation Notes)。\n *\n * 内部の意図的キャストはここ 1 箇所に集約する。\n */\n get(): T {\n return createStateExpr(this._runtimeId) as unknown as T;\n }\n\n /**\n * 派生値 Computed<U> を返す。\n * fn はビルド時に一度呼ばれ、変換を表現する JS 式を生成する。\n * Req 3.1\n */\n map<U>(fn: (t: T) => U): Computed<U> {\n const derivedId = this._registry.allocateId();\n // 方針 B: Computed をランタイム状態として登録し、親→派生のサブスクリプションを記録する。\n // transformBody は _v を入力変数とした変換式(ランタイムのサブスクリプション本体に使用)。\n const transformBody = buildTransformCode(fn, '_v');\n this._registry.register({ runtimeId: derivedId, initialExpr: makeJsExpr('null') });\n const derived: DerivedEntry = { derivedId, sourceId: this._runtimeId, transformBody: makeJsExpr(transformBody) };\n this._registry.registerDerived(derived);\n // ComputedImpl.get() は登録済みランタイム状態の参照式を返す。\n return new ComputedImpl<U>(derivedId, this._registry, createStateExpr(derivedId), this, undefined, fn as unknown as (t: unknown) => unknown);\n }\n\n /**\n * 書き戻し可能なフィールド派生 State<T[K]> を返す。\n * R-1 決定: .set(v) 時は親 State に対して {...prev, [key]: v} の再構築を発行。\n * Req 3.4\n */\n field<K extends keyof T>(key: K): T extends object ? State<T[K]> : never {\n const derivedId = this._registry.allocateId();\n const parentCode = createStateExpr(this._runtimeId).code;\n const fieldCode = `(${parentCode})?.${String(key)}`;\n const parent = this as unknown as StateImpl<unknown>;\n // field の get() は専用実装が必要なので FieldStateImpl で上書き\n return new FieldStateImpl<T, K>(derivedId, this._registry, parent, key, fieldCode) as unknown as T extends object ? State<T[K]> : never;\n }\n\n /**\n * 書き込み操作のスタブ実装。\n * ScriptScope 内で .set() が呼ばれた際に state-set コマンドを生成する経路は\n * ScriptStateHandle(タスク 2.4)で実装。\n * このタスクではビルド時オブジェクトとして存在確認のみ(no-op)。\n * Req 2.2\n */\n set(_value: T | JsExpr): void {\n // ビルド時オブジェクトの set は ScriptScope 経由での呼び出しを前提とする。\n // ScriptStateHandle が state-set コマンドを発行する(タスク 2.4 で実装)。\n // 直接呼び出し時は no-op。\n }\n\n /**\n * 更新操作のスタブ実装。\n * Req 2.3, R-2: 本仕様では JsExpr 形式のみ受け付ける。\n */\n update(_body: JsExpr): void {\n // ビルド時オブジェクトの update は ScriptScope 経由での呼び出しを前提とする。\n // ScriptStateHandle が state-update コマンドを発行する(タスク 2.4 で実装)。\n // 直接呼び出し時は no-op。\n }\n\n /**\n * 配列要素テンプレートバインディング。\n * EachBinding<U> を返す(タスク 2.3 で詳細実装)。\n * Req 3.5\n */\n each<U extends HtmlTag | readonly HtmlTag[]>(\n fn: (item: State<ArrayItem<T>>) => U,\n ): EachBinding<U> {\n return captureEachTemplate(this as unknown as StateImpl<ArrayItem<T>[]>, fn as (item: StateImpl<ArrayItem<ArrayItem<T>[]>>) => U);\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// FieldStateImpl(field 派生 State の get() を上書き)\n// ────────────────────────────────────────────────────────────\n\n/**\n * field() 派生専用の State 実装。\n * get() がフィールドアクセス式を返す点のみ StateImpl と異なる。\n */\nclass FieldStateImpl<T, K extends keyof T> extends StateImpl<T[K]> {\n private readonly _fieldCode: string;\n\n constructor(\n runtimeId: string,\n registry: StateRegistry,\n parent: StateImpl<unknown>,\n fieldKey: K,\n fieldCode: string,\n ) {\n super(runtimeId, registry, parent, fieldKey as string | number);\n this._fieldCode = fieldCode;\n }\n\n override get(): T[K] {\n // 宣言型は T[K](state-handler-typing Req 1.1/1.2)。\n // ハンドラ内では transformer が `(parent)?.key` 形式の JS に書き換える。\n // 実装上はビルド時 JsExpr を返すが、whitelist-validator により\n // ハンドラ外での呼び出しは静的エラー化されるため安全。\n return makeJsExpr(this._fieldCode) as unknown as T[K];\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// ComputedImpl(Computed<T> の実装クラス)\n// ────────────────────────────────────────────────────────────\n\n/**\n * Computed<T> の実装クラス。\n *\n * 読み取り専用(.set を持たない)。\n * .map() / .field() チェーンを許容する。\n *\n * Req 3.1, 3.2, 3.7\n */\nexport class ComputedImpl<T> implements Computed<T> {\n /** 構造的マーカー(Design D-7): transformer が State 型を識別するために使用。\n * `declare` なのでランタイムには存在しない(型レイヤのみ)。 */\n declare readonly [DraftoleStateMarker]: 'state';\n\n /** @deprecated Use state.js.get() / state.js.set() instead */\n readonly _runtimeId: string;\n readonly _registry: StateRegistry;\n /** 派生元の JsExpr(get() が返す値)*/\n private readonly _expr: JsExpr;\n /** field 派生の親 */\n readonly _parent?: StateImpl<unknown> | ComputedImpl<unknown>;\n /** field 派生のキー */\n readonly _fieldKey?: string | number;\n /** map 変換関数(デバッグ・後続スペック用)*/\n readonly _mapFn?: (t: unknown) => unknown;\n /** JS 文字列アクセサ(Req 1.1, 1.2, 1.5)*/\n readonly js: StateJsAccessor;\n\n constructor(\n runtimeId: string,\n registry: StateRegistry,\n expr: JsExpr,\n parent: StateImpl<unknown> | ComputedImpl<unknown> | undefined,\n fieldKey: string | number | undefined,\n mapFn: ((t: unknown) => unknown) | undefined,\n ) {\n this._runtimeId = runtimeId;\n this._registry = registry;\n this._expr = expr;\n this._parent = parent;\n this._fieldKey = fieldKey;\n this._mapFn = mapFn ?? undefined;\n this.js = new StateJsAccessorImpl(runtimeId);\n }\n\n /**\n * 宣言型は `T`(runtime 意味論、state-handler-typing Req 1.3)。\n *\n * 実装は構築時に渡された JsExpr を返すが、ハンドラ内では transformer が\n * `__draftole__.state(id).get()` に書き換える。\n * ハンドラ外での誤呼び出しは whitelist-validator が静的エラー化する。\n */\n get(): T {\n return this._expr as unknown as T;\n }\n\n /**\n * 派生値 Computed<U> を返す(多段チェーン許容)。\n * Req 3.7\n */\n map<U>(fn: (t: T) => U): Computed<U> {\n const derivedId = this._registry.allocateId();\n // 方針 B: このComputedの登録済みランタイム状態(this._runtimeId)を直接の購読元とする。\n const transformBody = buildTransformCode(fn, '_v');\n this._registry.register({ runtimeId: derivedId, initialExpr: makeJsExpr('null') });\n const derived: DerivedEntry = { derivedId, sourceId: this._runtimeId, transformBody: makeJsExpr(transformBody) };\n this._registry.registerDerived(derived);\n return new ComputedImpl<U>(\n derivedId,\n this._registry,\n createStateExpr(derivedId),\n this as unknown as ComputedImpl<unknown>,\n undefined,\n fn as unknown as (t: unknown) => unknown,\n );\n }\n\n /**\n * オブジェクトフィールドの読み取り専用派生 Computed<T[K]>。\n * Computed の field() は書き戻し不可(ReadableState.field())。\n * Req 3.4(Computed 版は読み取り専用)\n */\n field<K extends keyof T>(key: K): T extends object ? Computed<T[K]> : never {\n const derivedId = this._registry.allocateId();\n const parentCode = this._expr.code;\n const fieldCode = `(${parentCode})?.${String(key)}`;\n const derivedExpr = makeJsExpr(fieldCode);\n const result = new ComputedImpl<T[K]>(\n derivedId,\n this._registry,\n derivedExpr,\n this as unknown as ComputedImpl<unknown>,\n key as string | number,\n undefined,\n );\n return result as unknown as T extends object ? Computed<T[K]> : never;\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// 内部ユーティリティ\n// ────────────────────────────────────────────────────────────\n\n/**\n * map(fn) の変換関数を JS 式文字列に変換する。\n *\n * ビルド時に fn を一度呼び出し、その戻り値から JS コードを推論する。\n * 本仕様では「ランタイム API が呼ばれる式としての表現」のみを生成する。\n *\n * 注: 実際のランタイムでは fn をクロージャとして保持し、\n * 状態更新時に再評価する。ここでは簡潔な式表現のみ。\n */\nexport function buildTransformCode<T, U>(fn: (t: T) => U, sourceCode: string): string {\n // fn.toString() からアロー関数本体を抽出して inline 化する試み\n // 完全なシリアライズは handler-serialization スペックの責務だが、\n // シンプルなアロー関数(`n => n + 1` 等)については簡易対応する。\n //\n // 返り値は常に自己完結した関数文字列 `function(sourceCode) { return ...; }` とする。\n // 呼び出し側は式コンテキストへの埋め込みを意識せず `.code` をそのまま渡せる。\n try {\n const fnStr = fn.toString().trim();\n // アロー関数パターン: `(param) => expr` または `param => expr`\n const arrowMatch = fnStr.match(/^(?:\\(([^)]*)\\)|(\\w+))\\s*=>\\s*(.+)$/s);\n if (arrowMatch) {\n // 防御的 fallback: 正規表現 /^(?:\\(([^)]*)\\)|(\\w+))\\s*=>\\s*(.+)$/s が\n // group 1 または 2 を必ず捕獲し、(.+) が group 3 を必ず捕獲するため、\n // 以下 2 行の ?? fallback (`'_t'` / `''`) は到達不能。\n /* v8 ignore start */\n const param = (arrowMatch[1] ?? arrowMatch[2] ?? '_t').trim();\n const body = (arrowMatch[3] ?? '').trim();\n /* v8 ignore stop */\n if (param && body && !body.startsWith('{')) {\n // シンプルな式本体のみインライン化(ブロック本体は除外)\n // パラメータ名を sourceCode に置換\n const inlined = body.replace(new RegExp(`\\\\b${escapeRegExp(param)}\\\\b`, 'g'), `(${sourceCode})`);\n return `function(${sourceCode}) { return (${inlined}); }`;\n }\n }\n } catch {\n // fn.toString() が使えない環境では fallback\n }\n // Fallback: identity(変換なし)\n return `function(${sourceCode}) { return (${sourceCode}); }`;\n}\n\n/**\n * 正規表現用の文字列エスケープ。\n */\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","/**\n * テンプレートコンテキスト専用の State 実装\n *\n * - `DerivedTemplateState<T>`: 親テンプレート state の ID と変換関数(JsExpr)を保持する\n * 読み取り専用 State プロキシ。\n * - `isDerivedTemplateState<T>`: DerivedTemplateState かどうかを判別する型ガード。\n *\n * 設計書 `design.md` の「State DSL Layer: DerivedTemplateState」に対応。\n *\n * Requirements: 1.1, 1.2, 1.4, 1.5, 2.1, 2.4, 3.1, 3.2, 3.3, 5.1\n */\n\nimport type { JsExpr } from '../types.js';\nimport type { StateRegistry } from './registry.js';\nimport type { ReadableState, State, Computed } from './state.js';\nimport { DraftoleStateMarker, makeJsExpr, buildTransformCode } from './state.js';\nimport { StateJsAccessorImpl, type StateJsAccessor } from './state-js-accessor.js';\n\n// ────────────────────────────────────────────────────────────\n// DerivedTemplateState<T>\n// ────────────────────────────────────────────────────────────\n\n/**\n * 親テンプレート state の ID と変換関数(JsExpr)を保持する読み取り専用 State プロキシ。\n *\n * - `_runtimeId` は `_parentTemplateId` と同値(`rewriteCommandTarget` の startsWith チェックを\n * 既存のまま通すために親 ID を保持する)。\n * - `.map()` / `.field()` は多段チェーンがスコープ外のため即時 `Error` をスロー。\n * - `.get()` / `.subscribe()` はテンプレート捕捉フェーズ外での誤用を防ぐため即時 `Error` をスロー。\n *\n * design.md: DerivedTemplateState\n */\nexport class DerivedTemplateState<T> implements ReadableState<T> {\n /** 構造的マーカー(Design D-7): transformer が State 型を識別するために使用。\n * `declare` なのでランタイムには存在しない(型レイヤのみ)。 */\n declare readonly [DraftoleStateMarker]: 'state';\n\n /**\n * 親の _runtimeId と同値(例: \"s0.itemTemplate\")。\n * rewriteCommandTarget の startsWith チェックを既存のまま通すために親 ID を保持する。\n * Invariant: `_runtimeId === _parentTemplateId`\n */\n readonly _runtimeId: string;\n\n /** 親テンプレート state の _runtimeId */\n readonly _parentTemplateId: string;\n\n /** 変換関数の JS 式 */\n readonly _transform: JsExpr;\n\n /** JS 文字列アクセサ(Req 1.1, 1.2, 1.5)*/\n readonly js: StateJsAccessor;\n\n constructor(parentTemplateId: string, transform: JsExpr) {\n this._parentTemplateId = parentTemplateId;\n this._runtimeId = parentTemplateId;\n this._transform = transform;\n this.js = new StateJsAccessorImpl(parentTemplateId);\n }\n\n /**\n * 多段チェーンはスコープ外のため即時エラーをスロー。\n * Req 3.1, 3.2, 3.3\n */\n map<U>(_fn: (v: T) => U): Computed<U> {\n throw new Error(\n 'DerivedTemplateState: chained .map() is not supported; use single-level derivation only',\n );\n }\n\n /**\n * 多段チェーンはスコープ外のため即時エラーをスロー。\n * Req 2.4, 3.3\n */\n field<K extends keyof T>(_key: K): T extends object ? Computed<T[K]> : never {\n throw new Error(\n 'DerivedTemplateState: chained .map() is not supported; use single-level derivation only',\n );\n }\n\n /**\n * テンプレート捕捉フェーズ外での誤用を防ぐため即時エラーをスロー。\n */\n get(): never {\n throw new Error('DerivedTemplateState: .get() cannot be called in template context');\n }\n\n /**\n * テンプレート捕捉フェーズ外での誤用を防ぐため即時エラーをスロー。\n */\n subscribe(_fn: (v: T) => void): never {\n throw new Error('DerivedTemplateState: .subscribe() cannot be called in template context');\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// isDerivedTemplateState 型ガード\n// ────────────────────────────────────────────────────────────\n\n/**\n * 型ガード: 値が DerivedTemplateState かどうかを判別する。\n *\n * `_parentTemplateId` プロパティが `undefined` 以外であれば `DerivedTemplateState` とみなす。\n * `any` 型を使用せず `unknown` キャスト経由で実装する。\n *\n * Req 1.1, 5.1\n */\nexport function isDerivedTemplateState<T>(v: unknown): v is DerivedTemplateState<T> {\n if (v === null || v === undefined || typeof v !== 'object') {\n return false;\n }\n return (v as DerivedTemplateState<T>)._parentTemplateId !== undefined;\n}\n\n// ────────────────────────────────────────────────────────────\n// TemplateStateImpl<T>\n// ────────────────────────────────────────────────────────────\n\n/**\n * each テンプレートビルダ関数の引数として渡す、テンプレートコンテキスト専用 State 実装。\n *\n * - `_runtimeId = \"{arrayStateId}.itemTemplate\"` を保持する(`allocateId()` を呼ばない)。\n * - `.map(fn)` は `buildTransformCode(fn, '_v')` で transform を JS 式に変換し、\n * `DerivedTemplateState<U>` を返す(Req 1.1, 1.5)。\n * - `.field(key)` は `(v) => v[key]` 相当の transform を持つ `DerivedTemplateState<T[K]>` を返す\n * (Req 2.1, 2.4)。\n * - `.get()` / `.subscribe()` はテンプレート捕捉フェーズ外での誤用を防ぐため即時 `Error` をスロー。\n * - `State<T>` を実装するが `.set()` / `.update()` も同様にエラーをスロー(テンプレートは read-only)。\n *\n * design.md: TemplateStateImpl\n * Requirements: 1.1, 1.5, 2.1, 2.4, 3.1, 3.2, 3.3\n */\nexport class TemplateStateImpl<T> implements State<T> {\n /** 構造的マーカー(Design D-7): transformer が State 型を識別するために使用。\n * `declare` なのでランタイムには存在しない(型レイヤのみ)。 */\n declare readonly [DraftoleStateMarker]: 'state';\n\n /** \"{arrayStateId}.itemTemplate\"(`allocateId()` を呼ばない) */\n readonly _runtimeId: string;\n\n /** 保持するのみ(allocateId は不要)*/\n readonly _registry: StateRegistry;\n\n /** JS 文字列アクセサ(Req 1.1, 1.2, 1.5)*/\n readonly js: StateJsAccessor;\n\n constructor(arrayStateId: string, registry: StateRegistry) {\n this._runtimeId = `${arrayStateId}.itemTemplate`;\n this._registry = registry;\n this.js = new StateJsAccessorImpl(this._runtimeId);\n }\n\n /**\n * `buildTransformCode(fn, '_v')` で transform 式を生成し、\n * `DerivedTemplateState<U>` を返す(Req 1.1, 1.5)。\n */\n map<U>(fn: (v: T) => U): DerivedTemplateState<U> {\n const transformCode = buildTransformCode(fn, '_v');\n const transformExpr = makeJsExpr(transformCode);\n return new DerivedTemplateState<U>(this._runtimeId, transformExpr);\n }\n\n /**\n * `(v) => v[key]` 相当の transform を持つ `DerivedTemplateState<T[K]>` を返す。\n * `.map(v => v[key])` のシュガー(Req 2.1, 2.4)。\n */\n field<K extends keyof T>(key: K): T extends object ? State<T[K]> : never {\n // buildTransformCode は fn.toString() でアロー式を抽出するため、変数 key のリテラル値を\n // 取り込めない。フィールドアクセスは直接 makeJsExpr で生成する。\n const transformExpr = makeJsExpr(`function(_v) { return ((_v).${String(key)}); }`);\n return new DerivedTemplateState<T[K]>(this._runtimeId, transformExpr) as unknown as T extends object ? State<T[K]> : never;\n }\n\n /**\n * テンプレート捕捉フェーズ外での誤用を防ぐため即時エラーをスロー。\n */\n get(): never {\n throw new Error('TemplateStateImpl: .get() cannot be called in template context');\n }\n\n /**\n * テンプレート捕捉フェーズ外での誤用を防ぐため即時エラーをスロー。\n */\n subscribe(_fn: (v: T) => void): never {\n throw new Error('TemplateStateImpl: .subscribe() cannot be called in template context');\n }\n\n /**\n * テンプレートコンテキストは read-only。誤用を防ぐため即時エラーをスロー。\n */\n set(_value: T | import('../types.js').JsExpr): void {\n throw new Error('TemplateStateImpl: .set() cannot be called in template context');\n }\n\n /**\n * テンプレートコンテキストは read-only。誤用を防ぐため即時エラーをスロー。\n */\n update(_body: import('../types.js').JsExpr): void {\n throw new Error('TemplateStateImpl: .update() cannot be called in template context');\n }\n\n /**\n * each() はテンプレートコンテキストでは使用しない。誤用を防ぐため即時エラーをスロー。\n */\n each(_fn: (item: State<import('./state.js').ArrayItem<T>>) => never): never {\n throw new Error('TemplateStateImpl: .each() cannot be called in template context');\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// createTemplateState ファクトリ\n// ────────────────────────────────────────────────────────────\n\n/**\n * TemplateStateImpl を生成するファクトリ関数。\n * `captureEachTemplate` から呼ばれる(Task 4.1 で切り替え)。\n *\n * - Preconditions: `arrayStateId` は既に登録済みの配列 state ID\n * - Postconditions: `_runtimeId === arrayStateId + \".itemTemplate\"`\n *\n * Requirements: 1.1, 1.5\n */\nexport function createTemplateState<T>(\n arrayStateId: string,\n registry: StateRegistry,\n): TemplateStateImpl<T> {\n return new TemplateStateImpl<T>(arrayStateId, registry);\n}\n","/**\n * each テンプレート捕捉モジュール\n *\n * `State<T[]>.each(fn)` が仮想 `State<Item>` を生成し、`fn` を 1 回評価して\n * `HtmlTag` テンプレートを得る処理を実装する。\n * テンプレート内の `VanillaCommand` を `EachTemplateSnapshot` に格納し、\n * `EachBinding<U>` を返す。\n *\n * Requirements: 3.5, 3.6, 4.7\n * Design: R-5 決定 / each テンプレート捕捉フロー\n */\n\nimport type { HtmlTag } from '../../../html/elements/html-tag.js';\nimport { renderCommand, type VanillaCommand } from '../commands.js';\nimport type { ElementTarget } from '../element-target.js';\nimport type { ArrayItem, EachBinding, StateImpl } from './state.js';\nimport { createTemplateState } from './template-derived-state.js';\n\n// ────────────────────────────────────────────────────────────\n// EachTemplateSnapshot\n// ────────────────────────────────────────────────────────────\n\n/**\n * each テンプレートの捕捉情報。\n *\n * design.md の Data Models セクション:\n * - `itemStateIdPattern`: \"{parent}.item{i}\" パターン\n * - `templateCommands`: テンプレート HtmlTag の `_pending` から取り出した命令列\n */\nexport interface EachTemplateSnapshot {\n /** スロット ID パターン。ランタイムが \"{i}\" を実際のインデックスに置換する */\n itemStateIdPattern: string;\n /** テンプレート内の VanillaCommand(_pending からスナップショット) */\n templateCommands: VanillaCommand[];\n /**\n * 6.1: closure 形式 factory 関数文字列。\n * `function(arrayId, idx, draftole) { ... return _e0; }` 形式。\n * テンプレートが空でも空ボディを持つ有効な factory が出力される。\n */\n factoryCode?: string;\n /** factory コード生成方式。closure(新形)/ static-placeholder(旧形)。 */\n factoryKind?: 'closure' | 'static-placeholder';\n /**\n * each-closure-fix: closure 経路で build-phase 直後に保持する template HtmlTag。\n * emit-phase で tagPath 注入と factoryCode 生成のために再走査する。\n * factoryCode 確定後は不要となるため optional。\n */\n _templateRoot?: HtmlTag;\n}\n\n/**\n * `captureEachTemplate` の戻り値型。\n * design.md の EachBinding<U> を拡張し `_snapshot` フィールドを追加する。\n */\nexport interface EachBindingWithSnapshot<U> extends EachBinding<U> {\n readonly _snapshot: EachTemplateSnapshot;\n}\n\n// ────────────────────────────────────────────────────────────\n// captureEachTemplate\n// ────────────────────────────────────────────────────────────\n\n/**\n * `State<T[]>` の each テンプレートを捕捉して `EachBindingWithSnapshot<U>` を返す。\n *\n * 手順:\n * 1. 仮想スロット State を生成(`_runtimeId = \"{arrayStateId}.itemTemplate\"`)\n * 2. `fn(virtualState)` を 1 回呼び出してテンプレート `HtmlTag` を得る\n * 3. テンプレート HtmlTag の `_pending` をスナップショットとして取り出す\n * 4. `EachTemplateSnapshot` に格納\n * 5. `EachBindingWithSnapshot<U>` を返す\n *\n * @param state - 配列型の State(例: `State<Todo[]>`)\n * @param fn - 要素ごとのビルダ関数(ビルド時に 1 回のみ呼ばれる)\n */\nexport function captureEachTemplate<T, U extends HtmlTag | readonly HtmlTag[]>(\n state: StateImpl<T[]>,\n fn: (item: StateImpl<ArrayItem<T[]>>) => U,\n): EachBindingWithSnapshot<U> {\n const arrayStateId = state._runtimeId;\n\n // 1. 仮想スロット State を生成\n // _runtimeId = \"{arrayStateId}.itemTemplate\"(テンプレートビルド専用)\n const virtualState = createTemplateState<ArrayItem<T[]>>(\n arrayStateId,\n state._registry,\n );\n\n // 2. fn を 1 回だけ呼び出してテンプレート HtmlTag を得る\n const templateTag = fn(virtualState);\n\n // 3. テンプレート HtmlTag の _pending をスナップショット\n // HtmlTag が配列の場合は最初の要素から取り出す\n // (addChild を呼ばずに pending をスナップショット)\n const templateCommands: VanillaCommand[] = extractPendingCommands(templateTag);\n\n // 4. EachTemplateSnapshot を構築\n // 6.1: closure 形式の factoryCode を同時に生成して snapshot に格納する。\n // テンプレートが配列の場合は最初の要素をルートとして扱う(既存仕様準拠)。\n const rootTag: HtmlTag = Array.isArray(templateTag)\n ? ((templateTag as readonly HtmlTag[])[0] as HtmlTag)\n : (templateTag as HtmlTag);\n\n // テンプレートツリー内に reactive バインディング(bind-text/value/class-*/style/attr)\n // があるかを判定する。バインディングを持つ場合は新形 closure factory\n // (`function(arrayId, idx, draftole) { ... }`) を出力し、無い場合は旧形\n // 静的 factory (`function(itemId, idx) { _root_c{i} ... }`) を出力する。\n // 旧 API(mvp-demo1 等)は後者の経路を維持して byte-equality を保つ。\n const hasBindings = templateHasBindings(rootTag);\n const snapshot: EachTemplateSnapshot = hasBindings\n ? {\n itemStateIdPattern: `${arrayStateId}.item{i}`,\n templateCommands,\n // closure 経路: factoryCode は render-phase フック (resolveEachFactories) で確定\n factoryCode: undefined,\n factoryKind: 'closure',\n _templateRoot: rootTag,\n }\n : {\n itemStateIdPattern: `${arrayStateId}.item{i}`,\n templateCommands,\n // static-placeholder 経路: build-time に確定(旧 API・byte-equality 維持)\n factoryCode: buildStaticFactoryCode(rootTag),\n factoryKind: 'static-placeholder',\n };\n\n // 5. EachBindingWithSnapshot を返す\n return {\n _kind: 'each' as const,\n _stateId: arrayStateId,\n _template: templateTag,\n _snapshot: snapshot,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// 内部ユーティリティ\n// ────────────────────────────────────────────────────────────\n\n/**\n * テンプレート結果(HtmlTag または HtmlTag[])から `_pending` コマンドを取り出す。\n * `addChild` を呼ばずにスナップショットのみ取得する。\n */\nfunction extractPendingCommands(template: HtmlTag | readonly HtmlTag[]): VanillaCommand[] {\n if (Array.isArray(template)) {\n // 複数タグの場合は全タグの _pending を結合\n return (template as HtmlTag[]).flatMap((tag) => [...tag._pending]);\n }\n // 単一 HtmlTag\n return [...(template as HtmlTag)._pending];\n}\n\n// ────────────────────────────────────────────────────────────\n// buildFactoryCode(6.1: closure 形式 factory 生成)\n// ────────────────────────────────────────────────────────────\n\n/**\n * `buildFactoryCode` のコンテキスト。\n * - `arrayStateId`: 親 `each` の配列 State ID(runtime 解決の prefix)\n * - `itemStateIdPattern`: スロット ID パターン。`{i}` 含む(例: `todos.item{i}`)\n */\nexport interface BuildFactoryContext {\n readonly arrayStateId: string;\n readonly itemStateIdPattern: string;\n}\n\n/**\n * テンプレート HtmlTag ツリーから closure ベースの factory 関数文字列を生成する。\n *\n * 出力形式:\n * ```js\n * function(itemId, idx, draftole) {\n * const _e0 = document.createElement(\"li\");\n * _e0.setAttribute(\"class\", \"...\");\n * const _e1 = document.createElement(\"span\");\n * _e0.appendChild(_e1);\n * __draftole__.bindText(_e1, itemId);\n * return _e0;\n * }\n * ```\n *\n * - インナー要素は `_e0`, `_e1`, ... と採番(`_e0` が root)\n * - `document.createElement(tagName)` で構築(`querySelector` を一切使わない)\n * - `_pending` バインディングは target を `ClosureRefTarget` に書き換えて\n * `renderCommand` 経由で JS 行を生成\n * - state 解決は `__draftole__.state(${arrayId}.item${idx})` 形式\n * (task 5.1 決定の string-path-based API に従う)\n *\n * Requirements: 3.3, 4.1, 4.2, 4.3, 4.4, 4.5\n */\nexport function buildFactoryCode(\n tag: HtmlTag,\n context: BuildFactoryContext,\n): string {\n const lines: string[] = [];\n const counter = { next: 0 };\n\n // 走査して全要素のローカル変数を確定し、createElement / 属性 / append / pending を出力\n const rootVar = walkAndEmit(tag, null, lines, counter, context);\n\n lines.push(`return ${rootVar};`);\n\n // インデント付き本体\n const body = lines.map((l) => ` ${l}`).join('\\n');\n return `function(itemId, idx, draftole) {\\n${body}\\n}`;\n}\n\n// ────────────────────────────────────────────────────────────\n// Task 2.2: emitAttributesExcludingId\n// ────────────────────────────────────────────────────────────\n\n/**\n * factory コード生成時、各 tag の `id` 属性を出力から除外して属性付与行を返す。\n *\n * - `id` キーの属性は per-iteration HTML id 一意性違反防止のため除外する(Req 2.1, 4.4)\n * - `class` / `data-*` 等の他の属性は維持する\n * - 元 `tag._attributes` 配列は mutate しない(ローカルコピーで対応)\n *\n * @param tag - 処理対象の HtmlTag\n * @param varName - 当該要素のローカル変数名(例: `_e0`)\n * @returns factory コード行の配列(`setAttribute(...)` 形式)\n *\n * Requirements: 2.1, 4.4\n * Design: design.md § walkAndEmit:stripIds / emitAttributesExcludingId\n */\nfunction emitAttributesExcludingId(tag: HtmlTag, varName: string): string[] {\n const attributes = (tag.attributes ?? []) as ReadonlyArray<{\n key: string;\n attributeValue: { type: string; value?: string; name?: string };\n }>;\n const result: string[] = [];\n for (const attr of attributes) {\n // id 属性は factory 出力から除外(per-iteration 重複防止)\n if (attr.key === 'id') continue;\n const av = attr.attributeValue;\n const key = attr.key;\n if (av.type === 'keyValue') {\n result.push(\n `${varName}.setAttribute(${JSON.stringify(key)}, ${JSON.stringify(String(av.value ?? ''))});`,\n );\n } else if (av.type === 'boolean') {\n result.push(`${varName}.setAttribute(${JSON.stringify(key)}, \"\");`);\n } else if (av.type === 'custom') {\n result.push(\n `${varName}.setAttribute(${JSON.stringify(`data-${av.name ?? ''}`)}, ${JSON.stringify(String(av.value ?? ''))});`,\n );\n }\n }\n return result;\n}\n\n/**\n * 再帰的に HtmlTag ツリーを走査し、各要素の createElement / 属性付与 /\n * 親 appendChild / `_pending` バインディング行を `lines` に追記する。\n *\n * @returns 当該要素に割り当てた closure ローカル変数名(例: `_e0`)\n */\nfunction walkAndEmit(\n tag: HtmlTag,\n parentVar: string | null,\n lines: string[],\n counter: { next: number },\n context: BuildFactoryContext,\n): string {\n const varName = `_e${counter.next}`;\n counter.next += 1;\n\n // 1) document.createElement\n // tagType が未指定のモック等は 'div' にフォールバック\n const tagName = String((tag as { tagType?: unknown }).tagType ?? 'div');\n lines.push(`const ${varName} = document.createElement(${JSON.stringify(tagName)});`);\n\n // 2) 静的属性付与(_attributes)— id を除いて emit(Task 2.2: emitAttributesExcludingId)\n // HtmlAttributeValue 判別共用体を unwrap する(task 8.2 Bug A 修正)。\n // `String(attr.attributeValue)` だと `[object Object]` になるため、\n // `.type` で分岐して `value` を取り出す。\n //\n // class 属性は protoRender 後の `_attributes` 経由でこのループが拾う\n // ため、`css:` 由来クラスも含めて `setAttribute(\"class\", \"...\")` として\n // 出力される(render-phase フック前提)。\n //\n // id 属性は per-iteration HTML id 一意性違反防止のため factory 出力から除外する\n // (Req 2.1, 4.4, design.md: walkAndEmit:stripIds)。\n for (const attrLine of emitAttributesExcludingId(tag, varName)) {\n lines.push(attrLine);\n }\n\n // 3) `_pending` バインディングを ClosureRefTarget に書き換えて emit\n // - target の kind(deferred-self / sel)を問わず closure-ref(_eN)に書き換える。\n // factory 内の要素は document.createElement で生成されるため querySelector 不要。\n // - `appendChild` 命令は step 5 の再帰ウォークで重複出力するためスキップ。\n // (Task 2.2: Req 1.4, 2.4, design.md: walkAndEmit:rewriteDeferredSelf)\n for (const cmd of tag._pending) {\n if (cmd.type === 'appendChild') continue;\n const rewritten = rewriteCommandTarget(cmd, varName, context);\n lines.push(renderCommand(rewritten));\n }\n\n // 4) 親へ appendChild(root はスキップ)\n if (parentVar !== null) {\n lines.push(`${parentVar}.appendChild(${varName});`);\n }\n\n // 5) 子要素を再帰(addChild 経路の `children` + appendChild 経路の `_appendedChildren`)\n const children = ((tag as { children?: ReadonlyArray<unknown> }).children ?? []);\n const appended = ((tag as { _appendedChildren?: ReadonlyArray<unknown> })._appendedChildren ?? []);\n for (const child of children) {\n walkAndEmit(child as HtmlTag, varName, lines, counter, context);\n }\n for (const child of appended) {\n walkAndEmit(child as HtmlTag, varName, lines, counter, context);\n }\n\n return varName;\n}\n\n// ────────────────────────────────────────────────────────────\n// templateHasBindings — closure / static factory 切替判定\n// ────────────────────────────────────────────────────────────\n\n/**\n * テンプレート HtmlTag ツリー全体に reactive バインディング(`bind-*` 系)が\n * 含まれているかを判定する純関数。`appendChild` のような構造命令は除外する。\n * `addChild` 経路の `children` と `appendChild` 経路の `_appendedChildren` の\n * 両方を再帰的に走査する。\n */\nfunction templateHasBindings(tag: HtmlTag): boolean {\n for (const cmd of tag._pending) {\n if (\n cmd.type === 'bind-text' ||\n cmd.type === 'bind-value' ||\n cmd.type === 'bind-checked' ||\n cmd.type === 'bind-class-all' ||\n cmd.type === 'bind-class-add' ||\n cmd.type === 'bind-style' ||\n cmd.type === 'bind-attr' ||\n cmd.type === 'bind-each'\n ) {\n return true;\n }\n }\n const children = ((tag as { children?: ReadonlyArray<unknown> }).children ?? []);\n for (const child of children) {\n if (templateHasBindings(child as HtmlTag)) return true;\n }\n const appended = ((tag as { _appendedChildren?: ReadonlyArray<unknown> })._appendedChildren ?? []);\n for (const child of appended) {\n if (templateHasBindings(child as HtmlTag)) return true;\n }\n return false;\n}\n\n// ────────────────────────────────────────────────────────────\n// buildStaticFactoryCode — 旧形プレースホルダ factory(byte-equality 維持用)\n// ────────────────────────────────────────────────────────────\n\n/**\n * バインディングを持たない each テンプレート向けの旧形 factory コードを生成する。\n *\n * 出力形式(mvp-demo1 baseline と byte-equal):\n * ```js\n * function(itemId, idx) {\n * const _root = document.createElement(\"li\");\n * _root.id = \"each-todo-item\";\n * ...\n * return _root;\n * }\n * ```\n *\n * - 変数名は `_root` / `_root_c0` / `_root_c0_c0` 形式\n * - 属性付与は `id` / `class` のみ DOM プロパティ直書き、それ以外は `setAttribute`\n * - 子要素は `addChild` (`children`) と `appendChild` (`_appendedChildren`) 両経路を結合\n *\n * Requirements: 5.1, 5.2, 5.3, 5.4 — 旧 API 経路の出力同等性\n */\nfunction buildStaticFactoryCode(tag: HtmlTag): string {\n const lines: string[] = [];\n appendStaticCreateCode(tag, '_root', lines);\n lines.push('return _root;');\n return `function(itemId, idx) {\\n ${lines.join('\\n ')}\\n }`;\n}\n\nfunction appendStaticCreateCode(tag: HtmlTag, varName: string, lines: string[]): void {\n const tagName = String((tag as { tagType?: unknown }).tagType ?? 'div');\n lines.push(`const ${varName} = document.createElement(${JSON.stringify(tagName)});`);\n\n const attributes = (tag.attributes ?? []) as ReadonlyArray<{\n key: string;\n attributeValue: { type: string; value?: string; name?: string };\n }>;\n for (const attr of attributes) {\n const av = attr.attributeValue;\n const key = attr.key;\n if (av.type === 'keyValue') {\n const v = String(av.value ?? '');\n if (key === 'class') {\n lines.push(`${varName}.className = ${JSON.stringify(v)};`);\n } else if (key === 'id') {\n lines.push(`${varName}.id = ${JSON.stringify(v)};`);\n } else {\n lines.push(`${varName}.setAttribute(${JSON.stringify(key)}, ${JSON.stringify(v)});`);\n }\n } else if (av.type === 'boolean') {\n lines.push(`${varName}.setAttribute(${JSON.stringify(key)}, \"\");`);\n } else if (av.type === 'custom') {\n lines.push(\n `${varName}.setAttribute(${JSON.stringify(`data-${av.name ?? ''}`)}, ${JSON.stringify(String(av.value ?? ''))});`,\n );\n }\n }\n\n // `addChild` 経路の children と `appendChild` 経路の _appendedChildren を結合\n const children = (tag as { children?: ReadonlyArray<unknown> }).children ?? [];\n const appended = (tag as { _appendedChildren?: ReadonlyArray<unknown> })._appendedChildren ?? [];\n const all: HtmlTag[] = [...(children as HtmlTag[]), ...(appended as HtmlTag[])];\n all.forEach((child, i) => {\n const childVar = `${varName}_c${i}`;\n appendStaticCreateCode(child, childVar, lines);\n lines.push(`${varName}.appendChild(${childVar});`);\n });\n}\n\n/**\n * `_pending` 内 VanillaCommand の `target` を `ClosureRefTarget { varName }`\n * に書き換える。`stateId` も itemStateIdPattern の `{i}` を実際のランタイム\n * 値(factory 引数の `itemId`)に置換する必要があるが、`renderCommand`\n * が `stateId` を JSON.stringify でクォートする仕様のため、ここでは\n * `stateId` のリテラル値を「そのまま展開可能なプレースホルダ文字列」として\n * 残し、最終的に runtime の `__draftole__.state(stateId)` がリテラル ID を\n * 解決する設計とする(task 5.1 決定の string-path-based API)。\n *\n * - `stateId` がスロット ID パターン(例: `todos.itemTemplate.text`)の場合、\n * `arrayStateId.itemTemplate` プレフィックスを factory 引数 `itemId`\n * への直参照(rest なしなら `itemId`、rest ありなら `itemId + \"...\"`)に\n * 置き換えるため、`stateId` を文字列リテラルに含めず raw 命令で出力する。\n *\n */\nfunction rewriteCommandTarget(\n cmd: VanillaCommand,\n varName: string,\n context: BuildFactoryContext,\n): VanillaCommand {\n // ElementTarget を持つコマンドのみ書き換え対象\n if (!('target' in cmd) || cmd.target === undefined || cmd.target === null) {\n return cmd;\n }\n\n // factory コード生成では target の kind を問わず closure-ref に書き換える。\n // 要素は document.createElement で生成され _eN に格納されるため、\n // deferred-self / sel いずれの target も closure-ref に統一する(Req 1.4)。\n const newTarget: ElementTarget = { kind: 'closure-ref', varName };\n\n // stateId の動的解決:テンプレートスロット ID プレフィックスを差し替える。\n // captureEachTemplate が `${arrayStateId}.itemTemplate` を仮想 _runtimeId に\n // 設定しているため、これを `${arrayStateId}.item${idx}` プレフィックスに\n // 読み替える(ただしリテラル文字列内では idx を埋め込めないため、\n // バインディング行は raw 命令で動的連結式を出力する)。\n const slotPrefix = `${context.arrayStateId}.itemTemplate`;\n const itemPrefix = `${context.arrayStateId}.item`;\n\n // stateId を持つコマンドの判定\n const hasStateId = 'stateId' in cmd && typeof (cmd as { stateId?: unknown }).stateId === 'string';\n if (hasStateId) {\n const original = (cmd as { stateId: string }).stateId;\n if (original.startsWith(slotPrefix)) {\n // 動的 stateId 行を raw 命令として直接出力する。\n // factory 引数 `itemId` を直接参照する形(rest なしなら `itemId`、\n // rest ありなら `itemId + \".rest\"`)で解決。\n const rest = original.slice(slotPrefix.length); // 例: \".text\" または \"\"\n const dynamicId = rest.length === 0\n ? `itemId`\n : `itemId + ${JSON.stringify(rest)}`;\n // raw コマンドとして個別レンダー\n return buildRawBindCommand(cmd, varName, dynamicId, itemPrefix);\n }\n }\n\n // ElementTarget のみ書き換え(stateId はリテラルのまま)\n return { ...cmd, target: newTarget } as VanillaCommand;\n}\n\n/**\n * 動的 stateId(factory 引数 `itemId` への直参照式、例: `itemId` や\n * `itemId + \".text\"`)を持つバインディング命令を raw 文字列に組み立てる。\n * `renderCommand` は stateId を JSON.stringify する仕様のため、動的式を\n * 埋め込むには raw 命令経由で出力する必要がある。\n *\n * NOTE: `_itemPrefix` パラメータは現状未使用(旧実装との後方互換配慮で\n * シグネチャを温存)。\n */\nfunction buildRawBindCommand(\n cmd: VanillaCommand,\n varName: string,\n dynamicStateId: string,\n _itemPrefix: string,\n): VanillaCommand {\n // 各バインド種別ごとに raw 行を構築\n const tgt = varName; // closure-ref はそのまま識別子\n let line: string;\n switch (cmd.type) {\n case 'bind-text': {\n const transform = cmd.transform === undefined ? '' : `, ${cmd.transform.code}`;\n line = `__draftole__.bindText(${tgt}, ${dynamicStateId}${transform});`;\n break;\n }\n case 'bind-value': {\n const transform = cmd.transform === undefined ? '' : `, ${cmd.transform.code}`;\n line = `__draftole__.bindValue(${tgt}, ${dynamicStateId}${transform});`;\n break;\n }\n case 'bind-checked': {\n const transform = cmd.transform === undefined ? '' : `, ${cmd.transform.code}`;\n line = `__draftole__.bindChecked(${tgt}, ${dynamicStateId}${transform});`;\n break;\n }\n case 'bind-class-all': {\n const transform = cmd.transform === undefined ? '' : `, ${cmd.transform.code}`;\n line = `__draftole__.bindClassAll(${tgt}, ${dynamicStateId}${transform});`;\n break;\n }\n case 'bind-class-add': {\n const transform = cmd.transform === undefined ? '' : `, ${cmd.transform.code}`;\n line = `__draftole__.bindClassAdd(${tgt}, ${dynamicStateId}${transform});`;\n break;\n }\n case 'bind-style': {\n const transform = cmd.transform === undefined ? '' : `, ${cmd.transform.code}`;\n line = `__draftole__.bindStyle(${tgt}, ${JSON.stringify(cmd.prop)}, ${dynamicStateId}${transform});`;\n break;\n }\n case 'bind-attr': {\n const transform = cmd.transform === undefined ? '' : `, ${cmd.transform.code}`;\n line = `__draftole__.bindAttr(${tgt}, ${JSON.stringify(cmd.attr)}, ${dynamicStateId}${transform});`;\n break;\n }\n default:\n // 予期しない型は元コマンドの target だけ書き換えてフォールバック\n return { ...cmd, target: { kind: 'closure-ref', varName } } as VanillaCommand;\n }\n return { type: 'raw', code: line };\n}\n","/**\n * each-factory-resolver — bind-each テンプレートの factoryCode を render-phase で確定させるフック。\n *\n * `HtmlTag.protoRender` 内で呼び出される想定(task 3.2 で配線)。本モジュールは\n * `parent._pending` を走査し、factoryCode 未確定の `bind-each` コマンドに対して以下を行う:\n *\n * 1. 親 tagPath を基に `each${ordinal}` を tagPath として template ルートに注入\n * (`ordinal` は `_pending` 内の bind-each サブセットにおける 0-based index)\n * 2. `factoryExtraction: true` を付与した RenderContext で template の `protoRender`\n * を呼び出し、`_attributes` への class マージなどの side-effect のみを得る\n * 3. `buildFactoryCode` で closure 形式 factory コードを生成して `cmd.template.factoryCode`\n * に格納\n *\n * 既に factoryCode が設定済みの bind-each コマンドはスキップするため、複数回呼んでも\n * idempotent に動作する。\n *\n * Requirements: 1.1, 1.2, 1.3, 2.1\n */\n\nimport type { HtmlTag } from './html-tag.js';\nimport type { RenderContext } from './render-context.js';\nimport {\n buildFactoryCode,\n type EachTemplateSnapshot,\n} from '../../js/vanilla/state/each-template.js';\n\n/**\n * `EachTemplateSnapshot._templateRoot` に tagPath を冪等注入する純粋関数。\n *\n * - target = `${parentTagPath}.each${ordinal}` を計算し、`_templateRoot._css.tagPath`\n * に設定する\n * - 既に同一 target が設定済みなら no-op(render-phase での再注入を許容)\n * - 既設定値が target と異なる場合は実装バグ検出のため throw(fail-loud)\n * - `_templateRoot` が未保持の snapshot(static-placeholder 経路)では no-op\n *\n * Requirements: 1.2\n */\nexport function injectEachTemplateTagPath(\n snapshot: EachTemplateSnapshot,\n parentTagPath: string,\n ordinal: number,\n): void {\n const templateRoot = snapshot._templateRoot;\n if (templateRoot === undefined) {\n return;\n }\n const target = `${parentTagPath}.each${ordinal}`;\n const templateCss = (templateRoot as unknown as {\n _css?: { tagPath: string };\n })._css;\n if (templateCss === undefined) {\n return;\n }\n const current = templateCss.tagPath;\n if (current !== '' && current !== target) {\n throw new Error(\n `injectEachTemplateTagPath: tagPath conflict (current=${current}, target=${target})`,\n );\n }\n templateCss.tagPath = target;\n}\n\n/**\n * `parent._pending` を走査し、未確定 bind-each テンプレートの factoryCode を\n * render-phase で解決する。\n *\n * - `cmd.template.factoryCode === undefined && cmd.template._templateRoot !== undefined`\n * を満たすコマンドのみ処理対象とする。\n * - `_pending` 内の bind-each コマンドのうち何番目かを `ordinal` として算出\n * (0-based)。\n * - template ルートの `_css.tagPath` に `${parent._css.tagPath}.each${ordinal}` を注入。\n * - `factoryExtraction: true` を付与した ctx で template の protoRender を呼び、\n * class マージ等の side-effect を発火させる。\n * - `buildFactoryCode` の結果を `cmd.template.factoryCode` に格納する。\n *\n * 関数自体は副作用のみで戻り値を返さない。同じ parent を 2 回目に呼んだ場合、\n * すべての bind-each cmd が factoryCode を保持しているため何も行わない(idempotent)。\n *\n * @param parent - bind-each コマンドを `_pending` に保持する親 HtmlTag\n * @param ctx - 現行の RenderContext(factoryCtx の base となる)\n */\nexport function resolveEachFactories(parent: HtmlTag, ctx: RenderContext): void {\n // parent._css.tagPath は private フィールド経由でアクセスする必要があるため\n // 構造的に取り出す(HtmlTag 内では `_css.tagPath` が string で公開されている)。\n const parentCss = (parent as unknown as {\n _css: { tagPath: string };\n })._css;\n const parentTagPath = parentCss?.tagPath ?? '';\n\n let ordinal = 0;\n for (const cmd of parent._pending) {\n if (cmd.type !== 'bind-each') {\n continue;\n }\n const currentOrdinal = ordinal;\n ordinal += 1;\n\n const template = cmd.template;\n if (template.factoryCode !== undefined) {\n // 既に確定済み — idempotent path(2 回目以降の呼び出し)\n continue;\n }\n const templateRoot = template._templateRoot;\n if (templateRoot === undefined) {\n // closure 経路でのみ _templateRoot が保持される。未保持なら static 経路の\n // 旧形 factory が build-phase で確定済みのため、本フックの対象外。\n continue;\n }\n\n // 1) tagPath を template ルートへ注入(冪等関数経由)\n injectEachTemplateTagPath(template, parentTagPath, currentOrdinal);\n\n // 2) factoryExtraction: true を付与した ctx で protoRender を呼び side-effect を発火\n const factoryCtx: RenderContext = { ...ctx, factoryExtraction: true };\n templateRoot.protoRender(factoryCtx);\n\n // 3) buildFactoryCode で closure factory コードを生成し snapshot に格納\n const arrayStateId = cmd.stateId;\n const itemStateIdPattern = template.itemStateIdPattern;\n template.factoryCode = buildFactoryCode(templateRoot, {\n arrayStateId,\n itemStateIdPattern,\n });\n }\n}\n","// ---------------------------------------------------------------------------\n// TagType: 97種類のHTMLタグ種別定義と構造判定\n// ---------------------------------------------------------------------------\n\n/**\n * Tag structure classification.\n *\n * - **pair**: Elements with opening and closing tags (e.g., `<div>...</div>`)\n * - **selfClosing**: Self-closing (void) elements (e.g., `<br>`)\n */\nexport type TagStructure = 'pair' | 'selfClosing';\n\n/**\n * Constant object defining all 97 HTML tag types.\n *\n * This object uses HTML standard tag names as keys (unlike Swift version which used\n * enum aliases like `paragraph=\"p\"`, `bold=\"b\"`). As a result, TypeScript version\n * has 97 unique entries vs Swift's 66 cases (including aliases).\n *\n * **Categories:**\n * - **Basic (10):** html, head, body, div, p, span, script, root, text, doctype\n * - **Semantic (9):** header, footer, nav, main, section, article, aside, figure, figcaption\n * - **Table (9):** table, thead, tbody, tfoot, tr, th, td, caption, colgroup\n * - **List (6):** ul, ol, li, dl, dt, dd\n * - **Form (11):** form, label, button, select, option, optgroup, textarea, fieldset, legend, datalist, output\n * - **Text Decoration (20):** strong, em, b, i, u, s, mark, small, sub, sup, code, pre, blockquote, q, cite, abbr, address, time, kbd, samp\n * - **Heading (6):** h1, h2, h3, h4, h5, h6\n * - **Media (5):** video, audio, picture, canvas, svg\n * - **Interactive (5):** details, summary, dialog, iframe, noscript\n * - **Self-Closing (13):** br, hr, img, input, meta, link, source, track, area, col, base, embed, wbr\n * - **Other (3):** a, title, var\n *\n * **Total:** 10 + 9 + 9 + 6 + 11 + 20 + 6 + 5 + 5 + 13 + 3 = 97\n *\n * @example\n * ```typescript\n * import { TAG_TYPES } from './tag-type.js';\n *\n * console.log(TAG_TYPES.div); // 'div'\n * console.log(TAG_TYPES.p); // 'p'\n * console.log(TAG_TYPES.br); // 'br'\n * ```\n */\nexport const TAG_TYPES = {\n // 基本\n html: 'html',\n head: 'head',\n body: 'body',\n div: 'div',\n p: 'p',\n span: 'span',\n script: 'script',\n root: 'root',\n text: 'text',\n doctype: 'doctype',\n\n // セマンティック\n header: 'header',\n footer: 'footer',\n nav: 'nav',\n main: 'main',\n section: 'section',\n article: 'article',\n aside: 'aside',\n figure: 'figure',\n figcaption: 'figcaption',\n\n // テーブル\n table: 'table',\n thead: 'thead',\n tbody: 'tbody',\n tfoot: 'tfoot',\n tr: 'tr',\n th: 'th',\n td: 'td',\n caption: 'caption',\n colgroup: 'colgroup',\n\n // リスト\n ul: 'ul',\n ol: 'ol',\n li: 'li',\n dl: 'dl',\n dt: 'dt',\n dd: 'dd',\n\n // フォーム\n form: 'form',\n label: 'label',\n button: 'button',\n select: 'select',\n option: 'option',\n optgroup: 'optgroup',\n textarea: 'textarea',\n fieldset: 'fieldset',\n legend: 'legend',\n datalist: 'datalist',\n output: 'output',\n\n // テキスト装飾\n strong: 'strong',\n em: 'em',\n b: 'b',\n i: 'i',\n u: 'u',\n s: 's',\n mark: 'mark',\n small: 'small',\n sub: 'sub',\n sup: 'sup',\n code: 'code',\n pre: 'pre',\n blockquote: 'blockquote',\n q: 'q',\n cite: 'cite',\n abbr: 'abbr',\n address: 'address',\n time: 'time',\n kbd: 'kbd',\n samp: 'samp',\n\n // 見出し\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n\n // メディア\n video: 'video',\n audio: 'audio',\n picture: 'picture',\n canvas: 'canvas',\n svg: 'svg',\n\n // インタラクティブ\n details: 'details',\n summary: 'summary',\n dialog: 'dialog',\n iframe: 'iframe',\n noscript: 'noscript',\n\n // 自己終了(HTML void elements)\n br: 'br',\n hr: 'hr',\n img: 'img',\n input: 'input',\n meta: 'meta',\n link: 'link',\n source: 'source',\n track: 'track',\n area: 'area',\n col: 'col',\n base: 'base',\n embed: 'embed',\n wbr: 'wbr',\n\n // その他\n a: 'a',\n title: 'title',\n var: 'var',\n} as const;\n\n/**\n * Union type of all HTML tag types.\n *\n * Derived from the values of {@link TAG_TYPES} as a string literal union.\n *\n * @example\n * ```typescript\n * const tagName: TagType = 'div'; // Valid\n * const invalid: TagType = 'foo'; // Type error\n * ```\n */\nexport type TagType = typeof TAG_TYPES[keyof typeof TAG_TYPES];\n\n/**\n * Set of all 13 standard HTML void (self-closing) elements.\n *\n * **Included Tags:**\n * br, hr, img, input, meta, link, source, track, area, col, base, embed, wbr\n *\n * **Note:** `doctype` is not included (handled as a special case).\n *\n * @example\n * ```typescript\n * import { SELF_CLOSING_TAGS } from './tag-type.js';\n *\n * console.log(SELF_CLOSING_TAGS.has('br')); // true\n * console.log(SELF_CLOSING_TAGS.has('div')); // false\n * ```\n */\nexport const SELF_CLOSING_TAGS: ReadonlySet<TagType> = new Set<TagType>([\n 'br',\n 'hr',\n 'img',\n 'input',\n 'meta',\n 'link',\n 'source',\n 'track',\n 'area',\n 'col',\n 'base',\n 'embed',\n 'wbr',\n]);\n\n/**\n * Determines the structure type of a given HTML tag.\n *\n * @param tag - The tag type to check\n * @returns 'selfClosing' if the tag is a void element, 'pair' otherwise\n *\n * @example\n * ```typescript\n * import { getTagStructure, TAG_TYPES } from './tag-type.js';\n *\n * console.log(getTagStructure(TAG_TYPES.br)); // 'selfClosing'\n * console.log(getTagStructure(TAG_TYPES.div)); // 'pair'\n * console.log(getTagStructure(TAG_TYPES.img)); // 'selfClosing'\n * console.log(getTagStructure(TAG_TYPES.p)); // 'pair'\n * ```\n */\nexport function getTagStructure(tag: TagType): TagStructure {\n return SELF_CLOSING_TAGS.has(tag) ? 'selfClosing' : 'pair';\n}\n","/**\n * HTMLFormatter: minified HTMLを整形済みHTMLに変換するユーティリティ\n *\n * protoRender()が生成したインデントなしHTML文字列を、\n * 4スペースインデント + 改行付きの整形済みHTMLに変換する。\n *\n * Requirements: 6.1\n */\n\nconst INDENT_SPACES = 4;\n\n/**\n * HTML文字列をトークンに分解する\n * トークン: 開始タグ / 終了タグ / 自己終了タグ / テキスト\n */\nfunction tokenize(html: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n while (i < html.length) {\n if (html[i] === '<') {\n const end = html.indexOf('>', i);\n if (end === -1) {\n tokens.push(html.slice(i));\n break;\n }\n tokens.push(html.slice(i, end + 1));\n i = end + 1;\n } else {\n const next = html.indexOf('<', i);\n if (next === -1) {\n tokens.push(html.slice(i));\n break;\n }\n tokens.push(html.slice(i, next));\n i = next;\n }\n }\n return tokens;\n}\n\n/** 自己終了タグの名前セット */\nconst VOID_ELEMENTS = new Set([\n 'br', 'hr', 'img', 'input', 'meta', 'link',\n 'source', 'track', 'area', 'col', 'base', 'embed', 'wbr',\n]);\n\nfunction getTagName(token: string): string | null {\n const match = token.match(/^<\\/?([a-zA-Z][a-zA-Z0-9]*)/);\n return match?.[1]?.toLowerCase() ?? null;\n}\n\nfunction isClosingTag(token: string): boolean {\n return token.startsWith('</');\n}\n\nfunction isVoidElement(token: string): boolean {\n const name = getTagName(token);\n return name !== null && VOID_ELEMENTS.has(name);\n}\n\nfunction isOpeningTag(token: string): boolean {\n return token.startsWith('<') && !isClosingTag(token) && !isVoidElement(token);\n}\n\nexport class HTMLFormatter {\n static format(minifiedHtml: string): string {\n if (minifiedHtml === '') return '';\n\n const tokens = tokenize(minifiedHtml);\n if (tokens.length <= 1) return minifiedHtml;\n\n const lines: string[] = [];\n let level = 0;\n let buffer = '';\n let preDepth = 0; // DF-4: <pre> ネスト深度(0 = pre外)\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (token === undefined) continue;\n\n // DF-4: <pre> 内はインデントせずそのまま出力\n if (preDepth > 0) {\n if (isClosingTag(token) && getTagName(token) === 'pre') {\n preDepth--;\n if (preDepth === 0) {\n // pre終了タグ自体は前のコンテンツに連結\n lines[lines.length - 1] += token;\n level--;\n continue;\n }\n } else if (isOpeningTag(token) && getTagName(token) === 'pre') {\n preDepth++;\n }\n // pre内のコンテンツを最後の行に連結(インデントなし)\n lines[lines.length - 1] += token;\n continue;\n }\n\n // <pre> 開始を検出\n if (isOpeningTag(token) && getTagName(token) === 'pre') {\n lines.push(' '.repeat(INDENT_SPACES * level) + token);\n level++;\n preDepth = 1;\n continue;\n }\n\n if (isClosingTag(token)) {\n // 終了タグ: バッファにある内容を先に出力し、レベルを下げる\n if (buffer !== '') {\n // バッファ内にテキスト+開始タグがペアで完結する場合はインラインで出力\n lines.push(' '.repeat(INDENT_SPACES * level) + buffer + token);\n buffer = '';\n } else {\n level--;\n lines.push(' '.repeat(INDENT_SPACES * level) + token);\n }\n } else if (isOpeningTag(token)) {\n // 開始タグ: 次のトークンを先読みして、テキスト+終了タグのインライン判定\n const next = tokens[i + 1];\n const nextNext = tokens[i + 2];\n\n // テキスト + 終了タグ → インライン化 (例: <p>Hello</p>)\n if (next !== undefined && !next.startsWith('<') &&\n nextNext !== undefined && isClosingTag(nextNext)) {\n lines.push(' '.repeat(INDENT_SPACES * level) + token + next + nextNext);\n i += 2;\n }\n // 直後が終了タグ → 空タグのインライン化 (例: <span></span>)\n else if (next !== undefined && isClosingTag(next) && getTagName(token) === getTagName(next)) {\n lines.push(' '.repeat(INDENT_SPACES * level) + token + next);\n i += 1;\n }\n else {\n lines.push(' '.repeat(INDENT_SPACES * level) + token);\n level++;\n }\n } else if (isVoidElement(token)) {\n lines.push(' '.repeat(INDENT_SPACES * level) + token);\n } else {\n // テキストノード\n if (i === 0 && tokens.length === 1) {\n return minifiedHtml;\n }\n lines.push(' '.repeat(INDENT_SPACES * level) + token);\n }\n }\n\n return lines.join('\\n');\n }\n}\n","/**\n * `minify` オプションの解決ロジック(純関数)\n *\n * CssConfig の `minify` オプションと `NODE_ENV` 環境変数を入力として、\n * 最終的なミニファイ有効/無効値を決定する。\n *\n * ## 解決ルール\n *\n * 1. `option === true` → `true`(明示的に有効化)\n * 2. `option === false` → `false`(明示的に無効化)\n * 3. `option === undefined` かつ `nodeEnv === 'production'` → `true`(本番自動有効化)\n * 4. それ以外 → `false`(既定で無効)\n *\n * 本関数は副作用を持たず、`process.env` を直接参照しない。\n * 呼び出し側が `process.env.NODE_ENV` を読み取って渡すこと。\n *\n * @param option - CssConfig に渡された `minify` オプション値\n * @param nodeEnv - `process.env.NODE_ENV` の値\n * @returns ミニファイを有効化すべきかどうか\n *\n * @example\n * ```ts\n * resolveMinifyMode(true, undefined); // → true\n * resolveMinifyMode(false, 'production'); // → false\n * resolveMinifyMode(undefined, 'production'); // → true\n * resolveMinifyMode(undefined, 'development'); // → false\n * resolveMinifyMode(undefined, undefined); // → false\n * ```\n */\nexport function resolveMinifyMode(\n\toption: boolean | undefined,\n\tnodeEnv: string | undefined,\n): boolean {\n\tif (option === true) return true;\n\tif (option === false) return false;\n\treturn nodeEnv === 'production';\n}\n","import { resolveMinifyMode } from './resolve-minify-mode.js';\n\n/**\n * CSS出力設定クラス\n *\n * CSS出力の振る舞いを制御する設定を管理する。\n * スコープドCSSの有効/無効と出力モードを設定できる。\n *\n * ## 設定項目\n *\n * - **scopedCssEnabled**: スコープドCSSの有効/無効\n * - `true`: タグパスからハッシュクラス名を生成してCSSをラップ\n * - `false`: インラインスタイル形式で出力\n * - **outputMode**: 出力モード\n * - `'inline'`: インラインスタイルとして出力\n * - `'external'`: 外部CSSファイル用の出力\n *\n * @example\n * ```ts\n * // デフォルト設定(スコープドCSS有効、インラインモード)\n * const config1 = new CssConfig();\n * console.log(config1.scopedCssEnabled); // → true\n * console.log(config1.outputMode); // → 'inline'\n *\n * // カスタム設定\n * const config2 = new CssConfig({\n * scopedCssEnabled: false,\n * outputMode: 'external'\n * });\n *\n * const manager = new CssManager('html>body>div', config2);\n * ```\n */\n\n/**\n * CSS出力モード\n *\n * - `'inline'`: インラインスタイルとして出力\n * - `'external'`: 外部CSSファイル用の出力\n */\nexport type CssConfigOutputMode = 'inline' | 'external';\n\n/**\n * CssConfig コンストラクタオプション\n */\nexport interface CssConfigOptions {\n /** スコープドCSSの有効/無効 */\n scopedCssEnabled: boolean;\n\n /** 出力モード */\n outputMode: CssConfigOutputMode;\n\n /**\n * scoped CSS クラス名の minify モード\n *\n * - `true`: `_<8hex>` 形式(コンパクト、production 向け)\n * - `false`: debuggable 形式(既定)\n * - 省略時は `process.env.NODE_ENV === 'production'` を fallback として参照する\n */\n minifyClassNames?: boolean;\n}\n\n/**\n * CSS出力設定\n */\nexport class CssConfig {\n /**\n * スコープドCSSの有効/無効\n *\n * `true` の場合、タグパスからハッシュクラス名を生成してCSSをラップする。\n * `false` の場合、インラインスタイル形式で出力する。\n *\n * @default true\n */\n scopedCssEnabled: boolean;\n\n /**\n * 出力モード\n *\n * - `'inline'`: インラインスタイルとして出力\n * - `'external'`: 外部CSSファイル用の出力\n *\n * @default 'inline'\n */\n outputMode: CssConfigOutputMode;\n\n /**\n * scoped CSS クラス名の minify モード(解決済み)\n *\n * コンストラクタで `options.minifyClassNames` と `process.env.NODE_ENV` から\n * 一度だけ解決され、以後は不変。\n *\n * - `true`: `_<8hex>` 形式(コンパクト)\n * - `false`: debuggable 形式\n *\n * @default false(NODE_ENV !== 'production' のとき)\n */\n readonly minifyClassNames: boolean;\n\n /**\n * CssConfig を構築する\n *\n * @param options - 設定オプション(省略時はデフォルト値を使用)\n */\n constructor(options?: Partial<CssConfigOptions>) {\n this.scopedCssEnabled = options?.scopedCssEnabled ?? true;\n this.outputMode = options?.outputMode ?? 'inline';\n this.minifyClassNames = resolveMinifyMode(\n options?.minifyClassNames,\n process.env.NODE_ENV,\n );\n }\n}\n","/**\n * CSS単位型の定義と変換関数\n *\n * CSS値に使用する単位の型安全な表現と、\n * HlUnit から CSS 文字列への変換を提供する。\n */\n\n/**\n * CSS values unit types.\n *\n * Represents the allowed unit types for CSS dimensional values.\n * The 'none' value is used for unitless numbers (e.g., line-height, opacity).\n *\n * @example\n * ```typescript\n * const pixelUnit: UnitStyle = 'px';\n * const percentUnit: UnitStyle = '%';\n * const unitless: UnitStyle = 'none';\n * ```\n */\nexport type UnitStyle = 'px' | 'em' | 'rem' | '%' | 'vw' | 'vh' | 'fr' | 'none';\n\n/**\n * CSS position property values.\n *\n * Represents the allowed values for the CSS `position` property,\n * defining how an element is positioned in the document.\n *\n * @example\n * ```typescript\n * const position: RelationShip = 'absolute';\n * const stickyHeader: RelationShip = 'sticky';\n * ```\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/position | MDN position}\n */\nexport type RelationShip = 'relative' | 'absolute' | 'static' | 'fixed' | 'sticky';\n\n/**\n * Represents a numeric value with its associated CSS unit.\n *\n * This interface provides type-safe representation of CSS dimensional values\n * by pairing a numeric value with its unit type.\n *\n * @example\n * ```typescript\n * const width: HlUnit = { value: 100, unit: 'px' };\n * const height: HlUnit = { value: 50, unit: '%' };\n * const opacity: HlUnit = { value: 0.5, unit: 'none' };\n * ```\n */\nexport interface HlUnit {\n /**\n * The numeric value.\n */\n value: number;\n\n /**\n * The unit type for the value.\n */\n unit: UnitStyle;\n}\n\n/**\n * Converts an HlUnit to a CSS-compatible string.\n *\n * This function transforms a structured unit value into its string representation\n * for use in CSS. When the unit is 'none', only the numeric value is returned.\n *\n * @param hlUnit - The HlUnit to convert\n * @returns A CSS-compatible string representation\n *\n * @example\n * ```typescript\n * hlUnitToCssString({ value: 16, unit: 'px' }) // '16px'\n * hlUnitToCssString({ value: 50, unit: '%' }) // '50%'\n * hlUnitToCssString({ value: 1.5, unit: 'rem' }) // '1.5rem'\n * hlUnitToCssString({ value: 0, unit: 'none' }) // '0'\n * hlUnitToCssString({ value: 2, unit: 'none' }) // '2' (for unitless values like line-height)\n * ```\n */\nexport function hlUnitToCssString(hlUnit: HlUnit): string {\n if (hlUnit.unit === 'none') {\n return String(hlUnit.value);\n }\n return `${hlUnit.value}${hlUnit.unit}`;\n}\n","/**\n * CSSプロパティキー定数\n *\n * camelCase形式のJavaScriptプロパティ名からハイフネーション付きCSS標準名への\n * マッピングを提供する。Swift版の CSSPropertyKey enum の rawValue と完全一致する。\n *\n * ## プロパティカテゴリと数\n *\n * | カテゴリ | プロパティ数 | 例 |\n * |---------|-------------|-----|\n * | Font | 7 | font-size, color, line-height |\n * | Background | 5 | background-color, background-image |\n * | Spacing | 10 | margin, padding |\n * | Border | 20 | border-width, border-radius |\n * | Flex | 12 | flex-direction, justify-content |\n * | Grid | 14 | grid-template-columns, grid-gap |\n * | Visual | 6 | box-shadow, opacity, cursor |\n * | Text | 13 | text-align, text-decoration |\n * | Transform | 6 | transform, filter |\n * | Animation | 14 | animation, transition |\n * | Table | 5 | border-collapse, table-layout |\n * | List | 4 | list-style-type |\n * | Visibility | 31 | display, width, height, position |\n *\n * **合計: 148プロパティ**\n *\n * ## 使用例\n *\n * @example\n * ```ts\n * // プロパティキーの使用\n * CSSPropertyKey.fontSize // → \"font-size\"\n * CSSPropertyKey.backgroundColor // → \"background-color\"\n * CSSPropertyKey.marginTop // → \"margin-top\"\n *\n * // プロパティクラスでの使用\n * const properties = new Map<string, string>();\n * properties.set(CSSPropertyKey.fontSize, '16px');\n * properties.set(CSSPropertyKey.color, '#333');\n * ```\n *\n * @see {@link CSSPropertyKeyValue}\n */\n\nexport const CSSPropertyKey = {\n // ── Font関連 (7) ──\n fontFamily: 'font-family',\n fontSize: 'font-size',\n fontWeight: 'font-weight',\n fontStyle: 'font-style',\n color: 'color',\n lineHeight: 'line-height',\n letterSpacing: 'letter-spacing',\n\n // ── Background関連 (6) ──\n background: 'background',\n backgroundColor: 'background-color',\n backgroundImage: 'background-image',\n backgroundSize: 'background-size',\n backgroundPosition: 'background-position',\n backgroundRepeat: 'background-repeat',\n\n // ── Spacing関連 (10) ──\n marginTop: 'margin-top',\n marginRight: 'margin-right',\n marginBottom: 'margin-bottom',\n marginLeft: 'margin-left',\n margin: 'margin',\n paddingTop: 'padding-top',\n paddingRight: 'padding-right',\n paddingBottom: 'padding-bottom',\n paddingLeft: 'padding-left',\n padding: 'padding',\n\n // ── Border関連 (20) ──\n borderWidth: 'border-width',\n borderStyle: 'border-style',\n borderColor: 'border-color',\n borderRadius: 'border-radius',\n borderTopWidth: 'border-top-width',\n borderTopStyle: 'border-top-style',\n borderTopColor: 'border-top-color',\n borderRightWidth: 'border-right-width',\n borderRightStyle: 'border-right-style',\n borderRightColor: 'border-right-color',\n borderBottomWidth: 'border-bottom-width',\n borderBottomStyle: 'border-bottom-style',\n borderBottomColor: 'border-bottom-color',\n borderLeftWidth: 'border-left-width',\n borderLeftStyle: 'border-left-style',\n borderLeftColor: 'border-left-color',\n borderTopLeftRadius: 'border-top-left-radius',\n borderTopRightRadius: 'border-top-right-radius',\n borderBottomRightRadius: 'border-bottom-right-radius',\n borderBottomLeftRadius: 'border-bottom-left-radius',\n\n // ── Flex関連 (12) ──\n flex: 'flex',\n flexDirection: 'flex-direction',\n justifyContent: 'justify-content',\n alignItems: 'align-items',\n gap: 'gap',\n flexWrap: 'flex-wrap',\n flexGrow: 'flex-grow',\n flexShrink: 'flex-shrink',\n flexBasis: 'flex-basis',\n alignSelf: 'align-self',\n order: 'order',\n alignContent: 'align-content',\n\n // ── Grid関連 (14) ──\n gridTemplateColumns: 'grid-template-columns',\n gridTemplateRows: 'grid-template-rows',\n gridGap: 'grid-gap',\n gridColumn: 'grid-column',\n gridRow: 'grid-row',\n gridColumnStart: 'grid-column-start',\n gridColumnEnd: 'grid-column-end',\n gridRowStart: 'grid-row-start',\n gridRowEnd: 'grid-row-end',\n gridTemplateAreas: 'grid-template-areas',\n gridArea: 'grid-area',\n gridAutoFlow: 'grid-auto-flow',\n gridAutoColumns: 'grid-auto-columns',\n gridAutoRows: 'grid-auto-rows',\n\n // ── Visual関連 (6) ──\n boxShadow: 'box-shadow',\n opacity: 'opacity',\n cursor: 'cursor',\n overflow: 'overflow',\n overflowX: 'overflow-x',\n overflowY: 'overflow-y',\n\n // ── Text関連 (13) ──\n textAlign: 'text-align',\n textDecoration: 'text-decoration',\n textTransform: 'text-transform',\n textIndent: 'text-indent',\n wordSpacing: 'word-spacing',\n whiteSpace: 'white-space',\n textOverflow: 'text-overflow',\n textDecorationColor: 'text-decoration-color',\n textDecorationStyle: 'text-decoration-style',\n textDecorationLine: 'text-decoration-line',\n wordBreak: 'word-break',\n overflowWrap: 'overflow-wrap',\n textShadow: 'text-shadow',\n\n // ── Transform関連 (6) ──\n transform: 'transform',\n transformOrigin: 'transform-origin',\n filter: 'filter',\n backdropFilter: 'backdrop-filter',\n perspective: 'perspective',\n perspectiveOrigin: 'perspective-origin',\n\n // ── Animation関連 (14) ──\n animationName: 'animation-name',\n animationDuration: 'animation-duration',\n animationTimingFunction: 'animation-timing-function',\n animationDelay: 'animation-delay',\n animationIterationCount: 'animation-iteration-count',\n animationDirection: 'animation-direction',\n animationFillMode: 'animation-fill-mode',\n animationPlayState: 'animation-play-state',\n animation: 'animation',\n transitionProperty: 'transition-property',\n transitionDuration: 'transition-duration',\n transitionTimingFunction: 'transition-timing-function',\n transitionDelay: 'transition-delay',\n transition: 'transition',\n\n // ── Table関連 (5) ──\n borderCollapse: 'border-collapse',\n borderSpacing: 'border-spacing',\n tableLayout: 'table-layout',\n captionSide: 'caption-side',\n emptyCells: 'empty-cells',\n\n // ── List関連 (4) ──\n listStyleType: 'list-style-type',\n listStylePosition: 'list-style-position',\n listStyleImage: 'list-style-image',\n listStyle: 'list-style',\n\n // ── Visibility関連 (31) ──\n display: 'display',\n visibility: 'visibility',\n zIndex: 'z-index',\n cssFloat: 'float',\n clear: 'clear',\n position: 'position',\n top: 'top',\n right: 'right',\n bottom: 'bottom',\n left: 'left',\n width: 'width',\n height: 'height',\n minWidth: 'min-width',\n maxWidth: 'max-width',\n minHeight: 'min-height',\n maxHeight: 'max-height',\n objectFit: 'object-fit',\n objectPosition: 'object-position',\n verticalAlign: 'vertical-align',\n content: 'content',\n pointerEvents: 'pointer-events',\n userSelect: 'user-select',\n resize: 'resize',\n outline: 'outline',\n outlineColor: 'outline-color',\n outlineStyle: 'outline-style',\n outlineWidth: 'outline-width',\n outlineOffset: 'outline-offset',\n boxSizing: 'box-sizing',\n clip: 'clip',\n clipPath: 'clip-path',\n} as const;\n\n/**\n * CSSPropertyKey の値の型(ハイフネーションCSS標準名のユニオン型)\n *\n * 例: 'font-size' | 'background-color' | 'margin-top' | ...\n */\nexport type CSSPropertyKeyValue = typeof CSSPropertyKey[keyof typeof CSSPropertyKey];\n","/**\n * CSS要素配置管理クラス\n *\n * 要素の配置方法(position)と配置プロパティ(top, left, width, height, bottom, right)を管理し、\n * ビルダーパターンによる型安全な配置設定とCSS文字列生成を提供する。\n *\n * ## 配置方法(position)\n *\n * - **static**: 通常のドキュメントフロー(デフォルト)\n * - **relative**: 相対配置(元の位置からのオフセット)\n * - **absolute**: 絶対配置(位置指定された祖先要素を基準)\n * - **fixed**: 固定配置(ビューポートを基準)\n *\n * ## 配置プロパティ\n *\n * - top, left, right, bottom: 配置位置\n * - width, height: サイズ\n *\n * ## ビルダーパターン\n *\n * {@link placeAbsoluteWith}, {@link placeRelativeWith}, {@link placeStaticWith},\n * {@link placeFixedWith} メソッドでクロージャを受け取り、{@link CssLayoutBuilder}\n * を通じて配置プロパティを設定する。\n *\n * @example\n * ```ts\n * const maker = new CssPositionMaker('html>body>div');\n *\n * // 絶対配置: 左上隅に配置、サイズ指定\n * maker.placeAbsoluteWith(b => {\n * b.top(0, 'px')\n * .left(0, 'px')\n * .width(200, 'px')\n * .height(100, 'px');\n * });\n *\n * console.log(maker.render());\n * // → \"height: 100px;\\nleft: 0px;\\nposition: absolute;\\ntop: 0px;\\nwidth: 200px;\"\n *\n * // 相対配置: 元の位置から右下に10pxずらす\n * maker.placeRelativeWith(b => {\n * b.top(10, 'px').left(10, 'px');\n * });\n *\n * console.log(maker.render());\n * // → \"left: 10px;\\nposition: relative;\\ntop: 10px;\"\n * ```\n *\n * @see {@link CssPositionMakerType}\n * @see {@link CssLayoutBuilder}\n * @see {@link LazyLayoutManager}\n */\nimport type { HlUnit, RelationShip, UnitStyle } from '../../../utils/unit-style.js';\nimport { hlUnitToCssString } from '../../../utils/unit-style.js';\nimport { CSSPropertyKey } from '../../style/style-keys.js';\nimport type { CssPlaceDescription } from '../css-place-description.js';\nimport type { CssLayoutBuilder } from '../css-layout-builder.js';\nimport type { CssPositionMakerType } from './css-position-maker-type.js';\nimport type { LazyLayoutRegister } from '../lazy-layout/registered-item.js';\n\n/**\n * CssLayoutBuilder の具象実装\n *\n * ビルダーパターンで配置プロパティを収集する内部クラス。\n *\n * @internal\n */\nclass LayoutBuilder implements CssLayoutBuilder {\n private _top?: HlUnit;\n private _left?: HlUnit;\n private _width?: HlUnit;\n private _height?: HlUnit;\n private _bottom?: HlUnit;\n private _right?: HlUnit;\n\n /**\n * top プロパティを設定する\n * @param value - 数値\n * @param unit - CSS単位\n * @returns this(メソッドチェーン用)\n */\n top(value: number, unit: UnitStyle): CssLayoutBuilder {\n this._top = { value, unit };\n return this;\n }\n\n /**\n * left プロパティを設定する\n * @param value - 数値\n * @param unit - CSS単位\n * @returns this(メソッドチェーン用)\n */\n left(value: number, unit: UnitStyle): CssLayoutBuilder {\n this._left = { value, unit };\n return this;\n }\n\n /**\n * width プロパティを設定する\n * @param value - 数値\n * @param unit - CSS単位\n * @returns this(メソッドチェーン用)\n */\n width(value: number, unit: UnitStyle): CssLayoutBuilder {\n this._width = { value, unit };\n return this;\n }\n\n /**\n * height プロパティを設定する\n * @param value - 数値\n * @param unit - CSS単位\n * @returns this(メソッドチェーン用)\n */\n height(value: number, unit: UnitStyle): CssLayoutBuilder {\n this._height = { value, unit };\n return this;\n }\n\n /**\n * bottom プロパティを設定する\n * @param value - 数値\n * @param unit - CSS単位\n * @returns this(メソッドチェーン用)\n */\n bottom(value: number, unit: UnitStyle): CssLayoutBuilder {\n this._bottom = { value, unit };\n return this;\n }\n\n /**\n * right プロパティを設定する\n * @param value - 数値\n * @param unit - CSS単位\n * @returns this(メソッドチェーン用)\n */\n right(value: number, unit: UnitStyle): CssLayoutBuilder {\n this._right = { value, unit };\n return this;\n }\n\n /** @internal */\n getTop(): HlUnit | undefined { return this._top; }\n /** @internal */\n getLeft(): HlUnit | undefined { return this._left; }\n /** @internal */\n getWidth(): HlUnit | undefined { return this._width; }\n /** @internal */\n getHeight(): HlUnit | undefined { return this._height; }\n /** @internal */\n getBottom(): HlUnit | undefined { return this._bottom; }\n /** @internal */\n getRight(): HlUnit | undefined { return this._right; }\n}\n\nexport class CssPositionMaker implements CssPositionMakerType {\n /** タグの階層パス(例: 'html>body>div') */\n tagPath: string;\n\n private _relationShip?: RelationShip;\n private _top?: HlUnit;\n private _left?: HlUnit;\n private _width?: HlUnit;\n private _height?: HlUnit;\n private _bottom?: HlUnit;\n private _right?: HlUnit;\n private _llRegister?: LazyLayoutRegister;\n\n /**\n * CssPositionMaker を構築する\n * @param tagPath - タグの階層パス\n */\n constructor(tagPath: string) {\n this.tagPath = tagPath;\n }\n\n /**\n * 現在の配置設定の概要を取得する\n *\n * top, left, width, height の値を含むオブジェクトを返す。\n * 遅延レイアウト解決に使用される。\n *\n * @returns 配置設定の概要\n */\n get description(): CssPlaceDescription {\n return {\n top: this._top,\n left: this._left,\n width: this._width,\n height: this._height,\n };\n }\n\n /**\n * 遅延レイアウトレジスタを更新する\n *\n * @param register - 遅延レイアウトレジスタ(undefined で解除)\n */\n updateLLRegister(register: LazyLayoutRegister | undefined): void {\n this._llRegister = register;\n }\n\n /**\n * 遅延レイアウトレジスタを取得する\n *\n * @returns 遅延レイアウトレジスタ、または undefined\n */\n getLLRegister(): LazyLayoutRegister | undefined {\n return this._llRegister;\n }\n\n /**\n * 絶対配置を設定する\n *\n * position: absolute を設定し、ビルダーで配置プロパティを指定する。\n * 絶対配置は位置指定された祖先要素を基準とする。\n *\n * @param closure - 配置プロパティを設定するビルダー関数\n *\n * @example\n * ```ts\n * maker.placeAbsoluteWith(b => {\n * b.top(0, 'px').left(0, 'px').width(100, '%').height(100, '%');\n * });\n * ```\n */\n placeAbsoluteWith(closure: (builder: CssLayoutBuilder) => void): void {\n this.placeWith('absolute', closure);\n }\n\n /**\n * 相対配置を設定する\n *\n * position: relative を設定し、ビルダーで配置プロパティを指定する。\n * 相対配置は元の位置からのオフセットを指定する。\n *\n * @param closure - 配置プロパティを設定するビルダー関数\n *\n * @example\n * ```ts\n * maker.placeRelativeWith(b => {\n * b.top(10, 'px').left(10, 'px');\n * });\n * ```\n */\n placeRelativeWith(closure: (builder: CssLayoutBuilder) => void): void {\n this.placeWith('relative', closure);\n }\n\n /**\n * 通常配置を設定する\n *\n * position: static を設定する(デフォルトのドキュメントフロー)。\n *\n * @param closure - 配置プロパティを設定するビルダー関数\n */\n placeStaticWith(closure: (builder: CssLayoutBuilder) => void): void {\n this.placeWith('static', closure);\n }\n\n /**\n * 固定配置を設定する\n *\n * position: fixed を設定し、ビルダーで配置プロパティを指定する。\n * 固定配置はビューポートを基準とする。\n *\n * @param closure - 配置プロパティを設定するビルダー関数\n *\n * @example\n * ```ts\n * maker.placeFixedWith(b => {\n * b.top(0, 'px').right(0, 'px').width(200, 'px');\n * });\n * ```\n */\n placeFixedWith(closure: (builder: CssLayoutBuilder) => void): void {\n this.placeWith('fixed', closure);\n }\n\n /**\n * 配置プロパティをCSS文字列としてレンダリングする\n *\n * 設定されたプロパティのみをアルファベット順にソートして出力する。\n *\n * @returns CSS文字列(未設定の場合は空文字列)\n */\n render(): string {\n const properties = this.collectProperties();\n if (properties.size === 0) return '';\n return [...properties.entries()]\n .sort((a, b) => a[0].localeCompare(b[0]))\n .map(([key, value]) => `${key}: ${value}`)\n .join(';\\n') + ';';\n }\n\n // ── Private ──\n\n private placeWith(relationShip: RelationShip, closure: (builder: CssLayoutBuilder) => void): void {\n // リセット: 前回の配置値をクリア\n this._top = undefined;\n this._left = undefined;\n this._width = undefined;\n this._height = undefined;\n this._bottom = undefined;\n this._right = undefined;\n\n this._relationShip = relationShip;\n\n const builder = new LayoutBuilder();\n closure(builder);\n\n this._top = builder.getTop();\n this._left = builder.getLeft();\n this._width = builder.getWidth();\n this._height = builder.getHeight();\n this._bottom = builder.getBottom();\n this._right = builder.getRight();\n }\n\n private collectProperties(): Map<string, string> {\n const properties = new Map<string, string>();\n\n if (this._relationShip !== undefined) {\n properties.set(CSSPropertyKey.position, this._relationShip);\n }\n if (this._top !== undefined) {\n properties.set(CSSPropertyKey.top, hlUnitToCssString(this._top));\n }\n if (this._left !== undefined) {\n properties.set(CSSPropertyKey.left, hlUnitToCssString(this._left));\n }\n if (this._width !== undefined) {\n properties.set(CSSPropertyKey.width, hlUnitToCssString(this._width));\n }\n if (this._height !== undefined) {\n properties.set(CSSPropertyKey.height, hlUnitToCssString(this._height));\n }\n if (this._bottom !== undefined) {\n properties.set(CSSPropertyKey.bottom, hlUnitToCssString(this._bottom));\n }\n if (this._right !== undefined) {\n properties.set(CSSPropertyKey.right, hlUnitToCssString(this._right));\n }\n\n return properties;\n }\n}\n","/**\n * SEC-2: CSS値サニタイズ\n *\n * CSS経由のXSS攻撃(url(javascript:), expression() 等)を検出・ブロックする。\n * SEC-1(属性値サニタイズ)のCSS版。\n *\n * ブロック対象:\n * - url(javascript:...) / url(vbscript:...) — CSS URLインジェクション\n * - expression(...) — IE CSS式(レガシーだが防御)\n *\n * 許可:\n * - url(https://...) / url(image.png) — 通常のURL\n * - url(data:image/...) — インライン画像\n * - linear-gradient(), radial-gradient() — グラデーション\n * - var(), calc(), blur() 等 — 標準CSS関数\n */\n\n/** url() 内の危険スキーム検出 */\nconst DANGEROUS_URL_SCHEME = /url\\s*\\(\\s*['\"]?\\s*(javascript|vbscript)\\s*:/i;\n\n/** IE CSS式 検出 */\nconst CSS_EXPRESSION = /expression\\s*\\(/i;\n\n/**\n * CSS値をサニタイズする。\n * 危険なパターンが含まれる場合は空文字列を返す。\n */\nexport function sanitizeCssValue(value: string): string {\n if (DANGEROUS_URL_SCHEME.test(value)) return '';\n if (CSS_EXPRESSION.test(value)) return '';\n return value;\n}\n\n/**\n * CSSプロパティMapをCSS文字列にレンダリングする(サニタイズ内蔵)。\n *\n * 全13 CSSプロパティクラスの render() で共通使用される。\n * - 危険な値は除外される\n * - プロパティはキー名アルファベット順\n * - フォーマット: `key: value;\\nkey: value;`\n */\nexport function renderCssProperties(properties: Map<string, string>): string {\n if (properties.size === 0) return '';\n\n const safe = [...properties.entries()]\n .filter(([, value]) => sanitizeCssValue(value) !== '')\n .sort((a, b) => a[0].localeCompare(b[0]));\n\n if (safe.length === 0) return '';\n\n return safe\n .map(([key, value]) => `${key}: ${value}`)\n .join(';\\n') + ';';\n}\n","import { DuplicateCssPropertyError } from './errors.js';\n\n/**\n * DEVモードでCSSプロパティの重複設定を検知するガード関数。\n *\n * `DRAFT_OLE_DEV=true` 環境変数が設定されている場合のみ動作する。\n * currentValue が undefined でない(= 既に値が設定済み)なら\n * DuplicateCssPropertyError をthrowする。\n *\n * @param currentValue - 現在のプロパティ値(undefined = 未設定)\n * @param propertyName - CSSプロパティ名(エラーメッセージ用)\n */\nexport function guardDuplicateCssProperty(\n currentValue: unknown,\n propertyName: string,\n): void {\n if (\n process.env.DRAFT_OLE_DEV === 'true' &&\n currentValue !== undefined\n ) {\n throw new DuplicateCssPropertyError(propertyName);\n }\n}\n\n/**\n * DEV環境でのみ警告メッセージを出力するヘルパー。\n *\n * `NODE_ENV === 'production'` の場合は no-op。\n * 本番ビルドではコンソール出力を抑止する。\n *\n * @param message - 警告メッセージ\n */\nexport function devWarn(message: string): void {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(message);\n }\n}\n","import type { Renderable } from '../../utils/renderable.js';\nimport { renderCssProperties } from '../utils/css-sanitizer.js';\nimport { guardDuplicateCssProperty } from '../../utils/dev-guard.js';\nimport { hlUnitToCssString, type HlUnit } from '../../utils/unit-style.js';\n\n/**\n * CSS スタイルクラスの共通基底クラス。\n *\n * プロパティ保存・重複検知ガード・レンダリングを提供する。\n * 全 CSS スタイルクラス(CSSFont, CSSText 等)はこのクラスを継承する。\n *\n * @remarks\n * - `_props` は `private readonly` のため、サブクラスは `setProp` / `getProp` 経由でのみアクセスする\n * - `setProp` は `guardDuplicateCssProperty` を必ず呼んでから Map に書き込む\n * - `render()` は `renderCssProperties` に委譲し、サニタイズ・ソートを引き継ぐ\n */\nexport abstract class CSSPropertyGroup implements Renderable {\n private readonly _props: Map<string, string> = new Map();\n\n /**\n * CSS プロパティを保存する。重複設定は DEV モードで検知される。\n *\n * @param cssKey - CSS プロパティキー(例: 'font-size')\n * @param value - プロパティ値\n */\n protected setProp(cssKey: string, value: string): this {\n guardDuplicateCssProperty(this._props.get(cssKey), cssKey);\n this._props.set(cssKey, value);\n return this;\n }\n\n /**\n * 保存済み CSS プロパティ値を取得する。\n * 公開 getter が必要なサブクラス(例: CSSFont.getFontSize())で使用する。\n *\n * @param cssKey - CSS プロパティキー\n * @returns 設定済みの値、または未設定の場合は undefined\n */\n protected getProp(cssKey: string): string | undefined {\n return this._props.get(cssKey);\n }\n\n /**\n * string | HlUnit を CSS 文字列に変換するヘルパー。\n *\n * @param value - CSS 値文字列または HlUnit\n * @returns CSS 値文字列\n */\n protected resolveUnit(value: string | HlUnit): string {\n return typeof value === 'string' ? value : hlUnitToCssString(value);\n }\n\n /**\n * string | HlUnit を受け取り、resolveUnit で変換した後に setProp で保存するヘルパー。\n *\n * @param cssKey - CSS プロパティキー(例: 'margin-top')\n * @param value - CSS 値文字列または HlUnit\n * @returns this(メソッドチェーン用)\n */\n protected setUnitProp(cssKey: string, value: string | HlUnit): this {\n return this.setProp(cssKey, this.resolveUnit(value));\n }\n\n /**\n * 設定済みプロパティを CSS 文字列としてレンダリングする。\n * renderCssProperties に委譲: アルファベットソート・サニタイズ・フォーマット。\n *\n * @returns CSS プロパティ文字列(例: `color: red;\\nfont-size: 16px;`)、未設定の場合は空文字列\n */\n render(): string {\n return renderCssProperties(this._props);\n }\n}\n","/**\n * Task 4.1: CSSAnimation -- アニメーション・トランジションプロパティ\n *\n * CSSPropertyGroup を継承し、共通の setProp/render パターンを利用する。\n * 14のAnimation/Transition関連CSSプロパティを型安全に管理し、\n * 設定済みプロパティのみをアルファベット順でCSS文字列として出力する。\n *\n * Requirements: 6.2, 6.3, 6.5\n */\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\n\n/**\n * アニメーション・トランジションプロパティを管理するクラス\n *\n * アニメーション系: animation-name, animation-duration, animation-timing-function,\n * animation-delay, animation-iteration-count, animation-direction,\n * animation-fill-mode, animation-play-state, animation\n * トランジション系: transition-property, transition-duration,\n * transition-timing-function, transition-delay, transition\n */\nexport class CSSAnimation extends CSSPropertyGroup {\n // ── Fluent Setters: アニメーション系 ──\n\n /** animation-name を設定する */\n setAnimationName(value: string): this {\n return this.setProp(CSSPropertyKey.animationName, value);\n }\n\n /** animation-duration を設定する */\n setAnimationDuration(value: string): this {\n return this.setProp(CSSPropertyKey.animationDuration, value);\n }\n\n /** animation-timing-function を設定する */\n setAnimationTimingFunction(value: string): this {\n return this.setProp(CSSPropertyKey.animationTimingFunction, value);\n }\n\n /** animation-delay を設定する */\n setAnimationDelay(value: string): this {\n return this.setProp(CSSPropertyKey.animationDelay, value);\n }\n\n /** animation-iteration-count を設定する */\n setAnimationIterationCount(value: string): this {\n return this.setProp(CSSPropertyKey.animationIterationCount, value);\n }\n\n /** animation-direction を設定する */\n setAnimationDirection(value: string): this {\n return this.setProp(CSSPropertyKey.animationDirection, value);\n }\n\n /** animation-fill-mode を設定する */\n setAnimationFillMode(value: string): this {\n return this.setProp(CSSPropertyKey.animationFillMode, value);\n }\n\n /** animation-play-state を設定する */\n setAnimationPlayState(value: string): this {\n return this.setProp(CSSPropertyKey.animationPlayState, value);\n }\n\n /** animation ショートハンドを設定する */\n setAnimation(value: string): this {\n return this.setProp(CSSPropertyKey.animation, value);\n }\n\n // ── Fluent Setters: トランジション系 ──\n\n /** transition-property を設定する */\n setTransitionProperty(value: string): this {\n return this.setProp(CSSPropertyKey.transitionProperty, value);\n }\n\n /** transition-duration を設定する */\n setTransitionDuration(value: string): this {\n return this.setProp(CSSPropertyKey.transitionDuration, value);\n }\n\n /** transition-timing-function を設定する */\n setTransitionTimingFunction(value: string): this {\n return this.setProp(CSSPropertyKey.transitionTimingFunction, value);\n }\n\n /** transition-delay を設定する */\n setTransitionDelay(value: string): this {\n return this.setProp(CSSPropertyKey.transitionDelay, value);\n }\n\n /** transition ショートハンドを設定する */\n setTransition(value: string): this {\n return this.setProp(CSSPropertyKey.transition, value);\n }\n}\n","/**\n * CSSBackground -- 背景プロパティクラス\n *\n * background-color, background-image, background-size,\n * background-position, background-repeat を管理する。\n * 線形グラデーション(linear-gradient)のヘルパーメソッドを提供する。\n * CSSColor 連携による型安全な色指定をサポートする。\n *\n * CSSPropertyGroup を継承し、共通の setProp/render パターンを利用する。\n * Fluent setter(メソッドチェーン)対応。\n * 設定プロパティのみ出力し、未設定は出力しない。\n *\n * Requirements: 5.4, 5.5, 5.7\n */\nimport type { CSSColor } from '../color/css-color.js';\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\n\n/** Options for setBackground() shorthand. */\nexport interface BackgroundOptions {\n color?: string;\n image?: string;\n size?: string;\n position?: string;\n repeat?: string;\n}\n\nexport class CSSBackground extends CSSPropertyGroup {\n // ── Fluent setters ──\n\n setBackgroundColor(value: string): this {\n return this.setProp(CSSPropertyKey.backgroundColor, value);\n }\n\n setBackgroundImage(value: string): this {\n return this.setProp(CSSPropertyKey.backgroundImage, value);\n }\n\n setBackgroundSize(value: string): this {\n return this.setProp(CSSPropertyKey.backgroundSize, value);\n }\n\n setBackgroundPosition(value: string): this {\n return this.setProp(CSSPropertyKey.backgroundPosition, value);\n }\n\n setBackgroundRepeat(value: string): this {\n return this.setProp(CSSPropertyKey.backgroundRepeat, value);\n }\n\n /**\n * background ショートハンド設定。\n * - 文字列: CSS `background:` ショートハンドとして出力(例: `'#fff url(...) no-repeat center/cover'`, `'radial-gradient(...), #000'`)\n * - オブジェクト: 個別の background-* プロパティを一括設定\n */\n setBackground(value: string | BackgroundOptions): this {\n if (typeof value === 'string') {\n return this.setProp(CSSPropertyKey.background, value);\n } else {\n if (value.color !== undefined) this.setBackgroundColor(value.color);\n if (value.image !== undefined) this.setBackgroundImage(value.image);\n if (value.size !== undefined) this.setBackgroundSize(value.size);\n if (value.position !== undefined) this.setBackgroundPosition(value.position);\n if (value.repeat !== undefined) this.setBackgroundRepeat(value.repeat);\n }\n return this;\n }\n\n // ── CSSColor 連携 ──\n\n setBackgroundColorValue(color: CSSColor): this {\n return this.setProp(CSSPropertyKey.backgroundColor, color.toString());\n }\n\n // ── gradient ヘルパー ──\n\n setLinearGradient(direction: string, ...stops: string[]): this {\n return this.setProp(CSSPropertyKey.backgroundImage, `linear-gradient(${direction}, ${stops.join(', ')})`);\n }\n\n setRadialGradient(shape: string, ...stops: string[]): this {\n return this.setProp(CSSPropertyKey.backgroundImage, `radial-gradient(${shape}, ${stops.join(', ')})`);\n }\n}\n","/**\n * CSSBorder -- 枠線プロパティクラス\n *\n * border-width, border-style, border-color(各方向個別対応)、\n * border-radius(各角個別対応)を管理する。\n *\n * CSSPropertyGroup を継承し、共通の setProp/render パターンを利用する。\n * Fluent setter(メソッドチェーン)対応。\n * 設定プロパティのみ出力し、未設定は出力しない。\n * CSSColor連携による型安全な色指定をサポート。\n *\n * Requirements: 5.6, 5.7\n */\nimport type { CSSColor } from '../color/css-color.js';\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\n\n/** Options for setBorder() shorthand. */\nexport interface BorderOptions {\n width?: string;\n style?: string;\n color?: string;\n radius?: string;\n}\n\nexport class CSSBorder extends CSSPropertyGroup {\n // ── 一括 Fluent setters ──\n\n /** 主要 border プロパティ(width/style/color/radius)を一括設定するショートハンド */\n setBorder(options?: BorderOptions): this {\n if (options?.width !== undefined) this.setProp(CSSPropertyKey.borderWidth, options.width);\n if (options?.style !== undefined) this.setProp(CSSPropertyKey.borderStyle, options.style);\n if (options?.color !== undefined) this.setProp(CSSPropertyKey.borderColor, options.color);\n if (options?.radius !== undefined) this.setProp(CSSPropertyKey.borderRadius, options.radius);\n return this;\n }\n\n /** border-width を一括設定する */\n setBorderWidth(value: string): this {\n return this.setProp(CSSPropertyKey.borderWidth, value);\n }\n\n /** border-style を一括設定する */\n setBorderStyle(value: string): this {\n return this.setProp(CSSPropertyKey.borderStyle, value);\n }\n\n /** border-color を文字列で一括設定する */\n setBorderColor(value: string): this {\n return this.setProp(CSSPropertyKey.borderColor, value);\n }\n\n /** border-radius を一括設定する */\n setBorderRadius(value: string): this {\n return this.setProp(CSSPropertyKey.borderRadius, value);\n }\n\n // ── 各方向 width Fluent setters ──\n\n /** border-top-width を設定する */\n setBorderTopWidth(value: string): this {\n return this.setProp(CSSPropertyKey.borderTopWidth, value);\n }\n\n /** border-right-width を設定する */\n setBorderRightWidth(value: string): this {\n return this.setProp(CSSPropertyKey.borderRightWidth, value);\n }\n\n /** border-bottom-width を設定する */\n setBorderBottomWidth(value: string): this {\n return this.setProp(CSSPropertyKey.borderBottomWidth, value);\n }\n\n /** border-left-width を設定する */\n setBorderLeftWidth(value: string): this {\n return this.setProp(CSSPropertyKey.borderLeftWidth, value);\n }\n\n // ── 各方向 style Fluent setters ──\n\n /** border-top-style を設定する */\n setBorderTopStyle(value: string): this {\n return this.setProp(CSSPropertyKey.borderTopStyle, value);\n }\n\n /** border-right-style を設定する */\n setBorderRightStyle(value: string): this {\n return this.setProp(CSSPropertyKey.borderRightStyle, value);\n }\n\n /** border-bottom-style を設定する */\n setBorderBottomStyle(value: string): this {\n return this.setProp(CSSPropertyKey.borderBottomStyle, value);\n }\n\n /** border-left-style を設定する */\n setBorderLeftStyle(value: string): this {\n return this.setProp(CSSPropertyKey.borderLeftStyle, value);\n }\n\n // ── 各方向 color Fluent setters(文字列) ──\n\n /** border-top-color を文字列で設定する */\n setBorderTopColor(value: string): this {\n return this.setProp(CSSPropertyKey.borderTopColor, value);\n }\n\n /** border-right-color を文字列で設定する */\n setBorderRightColor(value: string): this {\n return this.setProp(CSSPropertyKey.borderRightColor, value);\n }\n\n /** border-bottom-color を文字列で設定する */\n setBorderBottomColor(value: string): this {\n return this.setProp(CSSPropertyKey.borderBottomColor, value);\n }\n\n /** border-left-color を文字列で設定する */\n setBorderLeftColor(value: string): this {\n return this.setProp(CSSPropertyKey.borderLeftColor, value);\n }\n\n // ── 各角 radius Fluent setters ──\n\n /** border-top-left-radius を設定する */\n setBorderTopLeftRadius(value: string): this {\n return this.setProp(CSSPropertyKey.borderTopLeftRadius, value);\n }\n\n /** border-top-right-radius を設定する */\n setBorderTopRightRadius(value: string): this {\n return this.setProp(CSSPropertyKey.borderTopRightRadius, value);\n }\n\n /** border-bottom-right-radius を設定する */\n setBorderBottomRightRadius(value: string): this {\n return this.setProp(CSSPropertyKey.borderBottomRightRadius, value);\n }\n\n /** border-bottom-left-radius を設定する */\n setBorderBottomLeftRadius(value: string): this {\n return this.setProp(CSSPropertyKey.borderBottomLeftRadius, value);\n }\n\n // ── CSSColor 連携 Fluent setters ──\n\n /** border-color を CSSColor で一括設定する */\n setBorderColorValue(color: CSSColor): this {\n return this.setProp(CSSPropertyKey.borderColor, color.toString());\n }\n\n /** border-top-color を CSSColor で設定する */\n setBorderTopColorValue(color: CSSColor): this {\n return this.setProp(CSSPropertyKey.borderTopColor, color.toString());\n }\n\n /** border-right-color を CSSColor で設定する */\n setBorderRightColorValue(color: CSSColor): this {\n return this.setProp(CSSPropertyKey.borderRightColor, color.toString());\n }\n\n /** border-bottom-color を CSSColor で設定する */\n setBorderBottomColorValue(color: CSSColor): this {\n return this.setProp(CSSPropertyKey.borderBottomColor, color.toString());\n }\n\n /** border-left-color を CSSColor で設定する */\n setBorderLeftColorValue(color: CSSColor): this {\n return this.setProp(CSSPropertyKey.borderLeftColor, color.toString());\n }\n}\n","/**\n * CSSFlex -- Flexboxレイアウトプロパティ\n *\n * CSSPropertyGroup を継承し、setProp/getProp 経由でプロパティを管理する。\n * Fluent setter(メソッドチェーン)対応。\n * 設定プロパティのみ出力し、未設定は出力しない。\n *\n * Requirements: 4.1, 4.2, 4.3, 4.4, 4.5\n */\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\n\n/**\n * Flexboxレイアウトプロパティを管理するクラス\n *\n * コンテナプロパティ: flex-direction, justify-content, align-items,\n * align-content, flex-wrap, gap\n * アイテムプロパティ: flex-grow, flex-shrink, flex-basis, align-self, order\n */\n/** Options for setFlex() shorthand. */\nexport interface FlexOptions {\n direction?: string;\n justify?: string;\n align?: string;\n wrap?: string;\n gap?: string;\n}\n\nexport class CSSFlex extends CSSPropertyGroup {\n // ── Fluent Setters ──\n\n /** CSS flex ショートハンドプロパティを設定する(アイテム用: e.g. '1 1 auto') */\n setFlexValue(value: string): this {\n return this.setProp(CSSPropertyKey.flex, value);\n }\n\n /** display:flex + 主要プロパティを一括設定するショートハンド */\n setFlex(options?: FlexOptions): this {\n this.setProp(CSSPropertyKey.display, 'flex');\n if (options?.direction) this.setProp(CSSPropertyKey.flexDirection, options.direction);\n if (options?.justify) this.setProp(CSSPropertyKey.justifyContent, options.justify);\n if (options?.align) this.setProp(CSSPropertyKey.alignItems, options.align);\n if (options?.wrap) this.setProp(CSSPropertyKey.flexWrap, options.wrap);\n if (options?.gap) this.setProp(CSSPropertyKey.gap, options.gap);\n return this;\n }\n\n /** flex-direction を設定する */\n setFlexDirection(value: string): this {\n return this.setProp(CSSPropertyKey.flexDirection, value);\n }\n\n /** justify-content を設定する */\n setJustifyContent(value: string): this {\n return this.setProp(CSSPropertyKey.justifyContent, value);\n }\n\n /** align-items を設定する */\n setAlignItems(value: string): this {\n return this.setProp(CSSPropertyKey.alignItems, value);\n }\n\n /** align-content を設定する */\n setAlignContent(value: string): this {\n return this.setProp(CSSPropertyKey.alignContent, value);\n }\n\n /** flex-wrap を設定する */\n setFlexWrap(value: string): this {\n return this.setProp(CSSPropertyKey.flexWrap, value);\n }\n\n /** gap を設定する */\n setGap(value: string): this {\n return this.setProp(CSSPropertyKey.gap, value);\n }\n\n /** flex-grow を設定する */\n setFlexGrow(value: string): this {\n return this.setProp(CSSPropertyKey.flexGrow, value);\n }\n\n /** flex-shrink を設定する */\n setFlexShrink(value: string): this {\n return this.setProp(CSSPropertyKey.flexShrink, value);\n }\n\n /** flex-basis を設定する */\n setFlexBasis(value: string): this {\n return this.setProp(CSSPropertyKey.flexBasis, value);\n }\n\n /** align-self を設定する */\n setAlignSelf(value: string): this {\n return this.setProp(CSSPropertyKey.alignSelf, value);\n }\n\n /** order を設定する */\n setOrder(value: string): this {\n return this.setProp(CSSPropertyKey.order, value);\n }\n}\n","/**\n * CSSFont -- フォント・文字色プロパティクラス\n *\n * font-family, font-size, font-weight, font-style,\n * color, line-height, letter-spacing を管理する。\n *\n * CSSPropertyGroup を継承し、setProp/getProp 経由でプロパティを管理する。\n * Fluent setter(メソッドチェーン)対応。\n * 設定プロパティのみ出力し、未設定は出力しない。\n *\n * Requirements: 5.1, 5.2, 5.7\n */\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\nimport type { CSSColor } from '../color/css-color.js';\n\n/** Options for setFont() shorthand. */\nexport interface FontOptions {\n size?: string;\n weight?: string;\n family?: string;\n lineHeight?: string;\n color?: string;\n}\n\nexport class CSSFont extends CSSPropertyGroup {\n // ── Fluent setters ──\n\n /** 主要フォント・文字色プロパティを一括設定するショートハンド */\n setFont(options?: FontOptions): this {\n if (options?.size !== undefined) this.setProp(CSSPropertyKey.fontSize, options.size);\n if (options?.weight !== undefined) this.setProp(CSSPropertyKey.fontWeight, options.weight);\n if (options?.family !== undefined) this.setProp(CSSPropertyKey.fontFamily, options.family);\n if (options?.lineHeight !== undefined) this.setProp(CSSPropertyKey.lineHeight, options.lineHeight);\n if (options?.color !== undefined) this.setProp(CSSPropertyKey.color, options.color);\n return this;\n }\n\n setFontFamily(value: string): this {\n return this.setProp(CSSPropertyKey.fontFamily, value);\n }\n\n setFontSize(value: string): this {\n return this.setProp(CSSPropertyKey.fontSize, value);\n }\n\n setFontWeight(value: string): this {\n return this.setProp(CSSPropertyKey.fontWeight, value);\n }\n\n setFontStyle(value: string): this {\n return this.setProp(CSSPropertyKey.fontStyle, value);\n }\n\n setColor(value: string): this {\n return this.setProp(CSSPropertyKey.color, value);\n }\n\n setLineHeight(value: string): this {\n return this.setProp(CSSPropertyKey.lineHeight, value);\n }\n\n setLetterSpacing(value: string): this {\n return this.setProp(CSSPropertyKey.letterSpacing, value);\n }\n\n // ── Getter(CssStyleManager からのアクセス用) ──\n\n getFontSize(): string | undefined {\n return this.getProp(CSSPropertyKey.fontSize);\n }\n\n // ── CSSColor連携メソッド ──\n\n setColorValue(color: CSSColor): this {\n return this.setProp(CSSPropertyKey.color, color.toString());\n }\n}\n","/**\n * CSSGrid -- グリッドレイアウトプロパティ\n *\n * CSSPropertyGroup を継承し、setProp/getProp 経由でプロパティを管理する。\n * Fluent setter(メソッドチェーン)対応。\n * 設定プロパティのみ出力し、未設定は出力しない。\n *\n * Requirements: 6.1, 6.5\n */\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\n\n/** Options for setGrid() shorthand. */\nexport interface GridOptions {\n columns?: number | string;\n rows?: number | string;\n gap?: string;\n areas?: string;\n autoFlow?: string;\n}\n\n/**\n * グリッドレイアウトプロパティを管理するクラス\n *\n * コンテナプロパティ: grid-template-columns, grid-template-rows, grid-gap,\n * grid-template-areas, grid-auto-flow, grid-auto-columns, grid-auto-rows\n * アイテムプロパティ: grid-column, grid-row, grid-column-start, grid-column-end,\n * grid-row-start, grid-row-end, grid-area\n */\nexport class CSSGrid extends CSSPropertyGroup {\n // ── Fluent Setters ──\n\n /** display:grid + 主要プロパティを一括設定するショートハンド */\n setGrid(options?: GridOptions): this {\n this.setProp(CSSPropertyKey.display, 'grid');\n if (options?.columns !== undefined) {\n this.setProp(\n CSSPropertyKey.gridTemplateColumns,\n typeof options.columns === 'number'\n ? `repeat(${options.columns}, 1fr)`\n : options.columns,\n );\n }\n if (options?.rows !== undefined) {\n this.setProp(\n CSSPropertyKey.gridTemplateRows,\n typeof options.rows === 'number'\n ? `repeat(${options.rows}, 1fr)`\n : options.rows,\n );\n }\n if (options?.gap !== undefined) this.setProp(CSSPropertyKey.gridGap, options.gap);\n if (options?.areas !== undefined) this.setProp(CSSPropertyKey.gridTemplateAreas, options.areas);\n if (options?.autoFlow !== undefined) this.setProp(CSSPropertyKey.gridAutoFlow, options.autoFlow);\n return this;\n }\n\n /** grid-template-columns を設定する */\n setGridTemplateColumns(value: string): this {\n return this.setProp(CSSPropertyKey.gridTemplateColumns, value);\n }\n\n /** grid-template-rows を設定する */\n setGridTemplateRows(value: string): this {\n return this.setProp(CSSPropertyKey.gridTemplateRows, value);\n }\n\n /** grid-gap を設定する */\n setGridGap(value: string): this {\n return this.setProp(CSSPropertyKey.gridGap, value);\n }\n\n /** grid-column を設定する */\n setGridColumn(value: string): this {\n return this.setProp(CSSPropertyKey.gridColumn, value);\n }\n\n /** grid-row を設定する */\n setGridRow(value: string): this {\n return this.setProp(CSSPropertyKey.gridRow, value);\n }\n\n /** grid-column-start を設定する */\n setGridColumnStart(value: string): this {\n return this.setProp(CSSPropertyKey.gridColumnStart, value);\n }\n\n /** grid-column-end を設定する */\n setGridColumnEnd(value: string): this {\n return this.setProp(CSSPropertyKey.gridColumnEnd, value);\n }\n\n /** grid-row-start を設定する */\n setGridRowStart(value: string): this {\n return this.setProp(CSSPropertyKey.gridRowStart, value);\n }\n\n /** grid-row-end を設定する */\n setGridRowEnd(value: string): this {\n return this.setProp(CSSPropertyKey.gridRowEnd, value);\n }\n\n /** grid-template-areas を設定する */\n setGridTemplateAreas(value: string): this {\n return this.setProp(CSSPropertyKey.gridTemplateAreas, value);\n }\n\n /** grid-area を設定する */\n setGridArea(value: string): this {\n return this.setProp(CSSPropertyKey.gridArea, value);\n }\n\n /** grid-auto-flow を設定する */\n setGridAutoFlow(value: string): this {\n return this.setProp(CSSPropertyKey.gridAutoFlow, value);\n }\n\n /** grid-auto-columns を設定する */\n setGridAutoColumns(value: string): this {\n return this.setProp(CSSPropertyKey.gridAutoColumns, value);\n }\n\n /** grid-auto-rows を設定する */\n setGridAutoRows(value: string): this {\n return this.setProp(CSSPropertyKey.gridAutoRows, value);\n }\n}\n","/**\n * CSSList -- リストスタイルプロパティ\n *\n * CSSPropertyGroup を継承し、setProp/getProp 経由でプロパティを管理する。\n * Fluent setter(メソッドチェーン)対応。\n * 設定プロパティのみ出力し、未設定は出力しない。\n *\n * Requirements: 7.5, 7.7\n */\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\n\n/**\n * リストスタイルプロパティを管理するクラス\n *\n * プロパティ: list-style-type, list-style-position,\n * list-style-image, list-style (shorthand)\n */\nexport class CSSList extends CSSPropertyGroup {\n // ── Fluent Setters ──\n\n /** list-style-type を設定する */\n setListStyleType(value: string): this {\n return this.setProp(CSSPropertyKey.listStyleType, value);\n }\n\n /** list-style-position を設定する */\n setListStylePosition(value: string): this {\n return this.setProp(CSSPropertyKey.listStylePosition, value);\n }\n\n /** list-style-image を設定する */\n setListStyleImage(value: string): this {\n return this.setProp(CSSPropertyKey.listStyleImage, value);\n }\n\n /** list-style (shorthand) を設定する */\n setListStyle(value: string): this {\n return this.setProp(CSSPropertyKey.listStyle, value);\n }\n}\n","/**\n * CSSPseudo — 疑似クラス(:hover / :focus / :active)スタイルを管理するクラス。\n *\n * `PseudoStyleBuilder` を受け取り、内部 Map にプロパティを格納する。\n * `renderForScope(scope)` でスコープクラス付き CSS ブロック配列を返す。\n *\n * Anti-Invariant:\n * CSSPseudo は意図的に `Renderable` を実装しない。\n * 疑似クラスはプロパティ集合ではなく CSS ルールブロック(セレクタ付き)であり、\n * HtmlStyle.render() の body-level 集約対象にしてはならない。\n * CssManager.renderCss() から renderForScope(scopeClass) を直接呼び出すこと。\n */\nimport { renderCssProperties } from '../../utils/css-sanitizer.js';\nimport { guardDuplicateCssProperty } from '../../../utils/dev-guard.js';\nimport { PseudoStyleBuilder } from './pseudo-style-builder.js';\n\ntype PseudoName = 'hover' | 'focus' | 'active';\n\nconst PSEUDO_RENDER_ORDER: ReadonlyArray<PseudoName> = ['hover', 'focus', 'active'];\n\nexport class CSSPseudo {\n private _states: Partial<Record<PseudoName, Map<string, string>>> = {};\n\n setHover(builder: PseudoStyleBuilder): this {\n return this.applyBuilder('hover', builder);\n }\n\n setFocus(builder: PseudoStyleBuilder): this {\n return this.applyBuilder('focus', builder);\n }\n\n setActive(builder: PseudoStyleBuilder): this {\n return this.applyBuilder('active', builder);\n }\n\n hasAny(): boolean {\n return PSEUDO_RENDER_ORDER.some((name) => {\n const map = this._states[name];\n return map !== undefined && map.size > 0;\n });\n }\n\n renderForScope(scopeClass: string): string[] {\n const blocks: string[] = [];\n for (const name of PSEUDO_RENDER_ORDER) {\n const map = this._states[name];\n if (map === undefined || map.size === 0) continue;\n const body = renderCssProperties(map);\n if (body === '') continue;\n const indented = body\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n blocks.push(`.${scopeClass}:${name} {\\n${indented}\\n}`);\n }\n return blocks;\n }\n\n private applyBuilder(pseudo: PseudoName, builder: PseudoStyleBuilder): this {\n const map = (this._states[pseudo] ??= new Map<string, string>());\n for (const [key, value] of builder.toMap()) {\n guardDuplicateCssProperty(map.get(key), key);\n map.set(key, value);\n }\n return this;\n }\n}\n","/**\n * Task 3: CSSSpacing - HlUnit 統合と CSSPropertyGroup 移行\n *\n * CSSPropertyGroup を継承し、string | HlUnit の union 型セッターを提供する。\n * setXxxUnit メソッドは後方互換エイリアスとして維持する。\n *\n * Requirements: 1.1, 1.2, 1.3, 2.1, 2.4, 3.1, 5.1, 5.2, 5.3, 5.4, 6.1\n */\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\nimport type { HlUnit } from '../../../utils/unit-style.js';\n\n/**\n * CSS 余白プロパティ(margin / padding)を管理するクラス。\n *\n * CSSPropertyGroup を継承し、プロパティ保存・重複検知・レンダリングを委譲する。\n * setXxx(value: string | HlUnit) の union 型セッターと、\n * 後方互換のための setXxxUnit(hlUnit: HlUnit) エイリアスを提供する。\n *\n * @example\n * ```ts\n * const spacing = new CSSSpacing();\n * spacing.setMarginTop('10px').setPaddingBottom('20px');\n * spacing.render();\n * // → 'margin-top: 10px;\\npadding-bottom: 20px;'\n * ```\n */\nexport class CSSSpacing extends CSSPropertyGroup {\n // ── margin 個別方向セッター(string | HlUnit) ──\n\n /** margin-top を設定する */\n setMarginTop(value: string | HlUnit): this {\n return this.setUnitProp(CSSPropertyKey.marginTop, value);\n }\n\n /** margin-right を設定する */\n setMarginRight(value: string | HlUnit): this {\n return this.setUnitProp(CSSPropertyKey.marginRight, value);\n }\n\n /** margin-bottom を設定する */\n setMarginBottom(value: string | HlUnit): this {\n return this.setUnitProp(CSSPropertyKey.marginBottom, value);\n }\n\n /** margin-left を設定する */\n setMarginLeft(value: string | HlUnit): this {\n return this.setUnitProp(CSSPropertyKey.marginLeft, value);\n }\n\n /** margin 一括指定を設定する */\n setMargin(value: string): this {\n return this.setProp(CSSPropertyKey.margin, value);\n }\n\n // ── padding 個別方向セッター(string | HlUnit) ──\n\n /** padding-top を設定する */\n setPaddingTop(value: string | HlUnit): this {\n return this.setUnitProp(CSSPropertyKey.paddingTop, value);\n }\n\n /** padding-right を設定する */\n setPaddingRight(value: string | HlUnit): this {\n return this.setUnitProp(CSSPropertyKey.paddingRight, value);\n }\n\n /** padding-bottom を設定する */\n setPaddingBottom(value: string | HlUnit): this {\n return this.setUnitProp(CSSPropertyKey.paddingBottom, value);\n }\n\n /** padding-left を設定する */\n setPaddingLeft(value: string | HlUnit): this {\n return this.setUnitProp(CSSPropertyKey.paddingLeft, value);\n }\n\n /** padding 一括指定を設定する */\n setPadding(value: string): this {\n return this.setProp(CSSPropertyKey.padding, value);\n }\n\n // ── 後方互換エイリアス(setXxxUnit → setXxx) ──\n\n /** margin-top を HlUnit で設定する(後方互換エイリアス) */\n setMarginTopUnit(hlUnit: HlUnit): this {\n return this.setMarginTop(hlUnit);\n }\n\n /** margin-right を HlUnit で設定する(後方互換エイリアス) */\n setMarginRightUnit(hlUnit: HlUnit): this {\n return this.setMarginRight(hlUnit);\n }\n\n /** margin-bottom を HlUnit で設定する(後方互換エイリアス) */\n setMarginBottomUnit(hlUnit: HlUnit): this {\n return this.setMarginBottom(hlUnit);\n }\n\n /** margin-left を HlUnit で設定する(後方互換エイリアス) */\n setMarginLeftUnit(hlUnit: HlUnit): this {\n return this.setMarginLeft(hlUnit);\n }\n\n /** padding-top を HlUnit で設定する(後方互換エイリアス) */\n setPaddingTopUnit(hlUnit: HlUnit): this {\n return this.setPaddingTop(hlUnit);\n }\n\n /** padding-right を HlUnit で設定する(後方互換エイリアス) */\n setPaddingRightUnit(hlUnit: HlUnit): this {\n return this.setPaddingRight(hlUnit);\n }\n\n /** padding-bottom を HlUnit で設定する(後方互換エイリアス) */\n setPaddingBottomUnit(hlUnit: HlUnit): this {\n return this.setPaddingBottom(hlUnit);\n }\n\n /** padding-left を HlUnit で設定する(後方互換エイリアス) */\n setPaddingLeftUnit(hlUnit: HlUnit): this {\n return this.setPaddingLeft(hlUnit);\n }\n}\n","/**\n * Task 5.3: CSSTable -- テーブルレイアウトプロパティ\n *\n * CSSPropertyGroup を継承することで、collectProperties() と render() の\n * 重複実装を排除したリファクタリング済みクラス。\n * 5つのTable関連CSSプロパティを型安全に管理し、\n * 設定済みプロパティのみをアルファベット順でCSS文字列として出力する。\n *\n * Requirements: 7.4, 7.7\n */\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\n\n/**\n * テーブルレイアウトプロパティを管理するクラス\n *\n * プロパティ: border-collapse, border-spacing, table-layout,\n * caption-side, empty-cells\n */\nexport class CSSTable extends CSSPropertyGroup {\n // ── Fluent Setters ──\n\n /** border-collapse を設定する */\n setBorderCollapse(value: string): this {\n return this.setProp(CSSPropertyKey.borderCollapse, value);\n }\n\n /** border-spacing を設定する */\n setBorderSpacing(value: string): this {\n return this.setProp(CSSPropertyKey.borderSpacing, value);\n }\n\n /** table-layout を設定する */\n setTableLayout(value: string): this {\n return this.setProp(CSSPropertyKey.tableLayout, value);\n }\n\n /** caption-side を設定する */\n setCaptionSide(value: string): this {\n return this.setProp(CSSPropertyKey.captionSide, value);\n }\n\n /** empty-cells を設定する */\n setEmptyCells(value: string): this {\n return this.setProp(CSSPropertyKey.emptyCells, value);\n }\n}\n","/**\n * Task 4.3: CSSText -- テキスト装飾プロパティ\n *\n * CSSPropertyGroup を継承することで、collectProperties() と render() の\n * 重複実装を排除したリファクタリング済みクラス。\n * 13のText関連CSSプロパティを型安全に管理し、\n * 設定済みプロパティのみをアルファベット順でCSS文字列として出力する。\n *\n * Requirements: 6.4, 6.5\n */\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\n\n/**\n * テキスト装飾プロパティを管理するクラス\n *\n * 基本プロパティ: text-align, text-decoration, text-transform, text-indent,\n * word-spacing, white-space, text-overflow\n * 拡張プロパティ: text-decoration-color, text-decoration-style,\n * text-decoration-line, word-break, overflow-wrap, text-shadow\n */\nexport class CSSText extends CSSPropertyGroup {\n // ── Fluent Setters ──\n\n /** text-align を設定する */\n setTextAlign(value: string): this {\n return this.setProp(CSSPropertyKey.textAlign, value);\n }\n\n /** text-decoration を設定する */\n setTextDecoration(value: string): this {\n return this.setProp(CSSPropertyKey.textDecoration, value);\n }\n\n /** text-transform を設定する */\n setTextTransform(value: string): this {\n return this.setProp(CSSPropertyKey.textTransform, value);\n }\n\n /** text-indent を設定する */\n setTextIndent(value: string): this {\n return this.setProp(CSSPropertyKey.textIndent, value);\n }\n\n /** word-spacing を設定する */\n setWordSpacing(value: string): this {\n return this.setProp(CSSPropertyKey.wordSpacing, value);\n }\n\n /** white-space を設定する */\n setWhiteSpace(value: string): this {\n return this.setProp(CSSPropertyKey.whiteSpace, value);\n }\n\n /** text-overflow を設定する */\n setTextOverflow(value: string): this {\n return this.setProp(CSSPropertyKey.textOverflow, value);\n }\n\n /** text-decoration-color を設定する */\n setTextDecorationColor(value: string): this {\n return this.setProp(CSSPropertyKey.textDecorationColor, value);\n }\n\n /** text-decoration-style を設定する */\n setTextDecorationStyle(value: string): this {\n return this.setProp(CSSPropertyKey.textDecorationStyle, value);\n }\n\n /** text-decoration-line を設定する */\n setTextDecorationLine(value: string): this {\n return this.setProp(CSSPropertyKey.textDecorationLine, value);\n }\n\n /** word-break を設定する */\n setWordBreak(value: string): this {\n return this.setProp(CSSPropertyKey.wordBreak, value);\n }\n\n /** overflow-wrap を設定する */\n setOverflowWrap(value: string): this {\n return this.setProp(CSSPropertyKey.overflowWrap, value);\n }\n\n /** text-shadow を設定する */\n setTextShadow(value: string): this {\n return this.setProp(CSSPropertyKey.textShadow, value);\n }\n}\n","/**\n * Task 5.1: CSSTransform -- 変形・フィルタプロパティ\n *\n * CSSPropertyGroup を継承することで、collectProperties() と render() の\n * 重複実装を排除したリファクタリング済みクラス。\n * 6つのTransform関連CSSプロパティを型安全に管理し、\n * 設定済みプロパティのみをアルファベット順でCSS文字列として出力する。\n *\n * Requirements: 7.1, 7.2, 7.7\n */\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\n\n/**\n * 変形・フィルタプロパティを管理するクラス\n *\n * 変形プロパティ: transform, transform-origin\n * フィルタプロパティ: filter, backdrop-filter\n * パースペクティブプロパティ: perspective, perspective-origin\n */\nexport class CSSTransform extends CSSPropertyGroup {\n // ── Fluent Setters ──\n\n /** transform を設定する */\n setTransform(value: string): this {\n return this.setProp(CSSPropertyKey.transform, value);\n }\n\n /** transform-origin を設定する */\n setTransformOrigin(value: string): this {\n return this.setProp(CSSPropertyKey.transformOrigin, value);\n }\n\n /** filter を設定する */\n setFilter(value: string): this {\n return this.setProp(CSSPropertyKey.filter, value);\n }\n\n /** backdrop-filter を設定する */\n setBackdropFilter(value: string): this {\n return this.setProp(CSSPropertyKey.backdropFilter, value);\n }\n\n /** perspective を設定する */\n setPerspective(value: string): this {\n return this.setProp(CSSPropertyKey.perspective, value);\n }\n\n /** perspective-origin を設定する */\n setPerspectiveOrigin(value: string): this {\n return this.setProp(CSSPropertyKey.perspectiveOrigin, value);\n }\n}\n","/**\n * CSSVisibility -- 表示制御・サイズ・可視性プロパティクラス\n *\n * display, width/height/min/max, visibility, z-index,\n * overflow/overflowX/overflowY, float, clear を管理する。\n *\n * CSSPropertyGroup を継承し、setProp/getProp 経由でプロパティを管理する。\n * Fluent setter(メソッドチェーン)対応。\n * 設定プロパティのみ出力し、未設定は出力しない。\n *\n * Requirements: 3.1, 3.2, 3.5, 3.6, 7.6\n */\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\n\nexport class CSSVisibility extends CSSPropertyGroup {\n // ── Fluent setters ──\n\n setDisplay(value: string): this {\n return this.setProp(CSSPropertyKey.display, value);\n }\n\n setWidth(value: string): this {\n return this.setProp(CSSPropertyKey.width, value);\n }\n\n setHeight(value: string): this {\n return this.setProp(CSSPropertyKey.height, value);\n }\n\n setMinWidth(value: string): this {\n return this.setProp(CSSPropertyKey.minWidth, value);\n }\n\n setMaxWidth(value: string): this {\n return this.setProp(CSSPropertyKey.maxWidth, value);\n }\n\n setMinHeight(value: string): this {\n return this.setProp(CSSPropertyKey.minHeight, value);\n }\n\n setMaxHeight(value: string): this {\n return this.setProp(CSSPropertyKey.maxHeight, value);\n }\n\n setVisibility(value: string): this {\n return this.setProp(CSSPropertyKey.visibility, value);\n }\n\n setZIndex(value: string): this {\n return this.setProp(CSSPropertyKey.zIndex, value);\n }\n\n setFloat(value: string): this {\n return this.setProp(CSSPropertyKey.cssFloat, value);\n }\n\n setClear(value: string): this {\n return this.setProp(CSSPropertyKey.clear, value);\n }\n}\n","/**\n * CSSVisual -- 視覚効果プロパティ\n *\n * CSSPropertyGroup を継承し、setProp/getProp 経由でプロパティを管理する。\n * 6のVisual関連CSSプロパティを型安全に管理し、\n * 設定済みプロパティのみをアルファベット順でCSS文字列として出力する。\n *\n * Requirements: 7.3, 7.7\n */\nimport { CSSPropertyGroup } from '../css-property-group.js';\nimport { CSSPropertyKey } from '../style-keys.js';\n\n/**\n * 視覚効果プロパティを管理するクラス\n *\n * プロパティ: box-shadow, opacity, cursor, overflow, overflow-x, overflow-y\n */\nexport class CSSVisual extends CSSPropertyGroup {\n // ── Fluent Setters ──\n\n /** box-shadow を設定する */\n setBoxShadow(value: string): this {\n return this.setProp(CSSPropertyKey.boxShadow, value);\n }\n\n /** opacity を設定する */\n setOpacity(value: string): this {\n return this.setProp(CSSPropertyKey.opacity, value);\n }\n\n /** cursor を設定する */\n setCursor(value: string): this {\n return this.setProp(CSSPropertyKey.cursor, value);\n }\n\n /** overflow を設定する */\n setOverflow(value: string): this {\n return this.setProp(CSSPropertyKey.overflow, value);\n }\n\n /** overflow-x を設定する */\n setOverflowX(value: string): this {\n return this.setProp(CSSPropertyKey.overflowX, value);\n }\n\n /** overflow-y を設定する */\n setOverflowY(value: string): this {\n return this.setProp(CSSPropertyKey.overflowY, value);\n }\n}\n","/**\n * HTML要素のスタイル統合管理クラス\n *\n * 13種類のCSSプロパティクラスを統合的に保持し、一元的なCSS文字列出力を提供する。\n * 各プロパティクラスは独立してメソッドチェーン可能で、設定されたプロパティのみが出力される。\n *\n * ## プロパティクラス一覧\n *\n * | カテゴリ | クラス | 管理プロパティ数 |\n * |---------|--------|-----------------|\n * | フォント | {@link CSSFont} | 7 |\n * | 背景 | {@link CSSBackground} | 5 |\n * | テキスト | {@link CSSText} | 13 |\n * | 余白 | {@link CSSSpacing} | 10 |\n * | 枠線 | {@link CSSBorder} | 20 |\n * | 表示制御 | {@link CSSVisibility} | 31 |\n * | Flexbox | {@link CSSFlex} | 11 |\n * | Grid | {@link CSSGrid} | 14 |\n * | 視覚効果 | {@link CSSVisual} | 6 |\n * | 変形 | {@link CSSTransform} | 6 |\n * | アニメーション | {@link CSSAnimation} | 14 |\n * | テーブル | {@link CSSTable} | 5 |\n * | リスト | {@link CSSList} | 4 |\n *\n * ## 出力順序\n *\n * レンダリング時のプロパティ出力順序(Swift版と同一):\n *\n * 1. font → 2. backgroundColor → 3. text → 4. spacing → 5. border →\n * 6. position → 7. flex → 8. grid → 9. visual → 10. transform →\n * 11. animation → 12. table → 13. list\n *\n * @example\n * ```ts\n * const style = new HtmlStyle();\n *\n * // メソッドチェーンで複数プロパティを設定\n * style.font\n * .setFontSize('16px')\n * .setFontWeight('bold')\n * .setColor('#333');\n *\n * style.spacing\n * .setMarginTop('10px')\n * .setPaddingLeft('20px');\n *\n * style.flex\n * .setFlexDirection('column')\n * .setJustifyContent('center');\n *\n * // 設定されたプロパティのみを出力\n * console.log(style.render());\n * // → \"color: #333;\n * // font-size: 16px;\n * // font-weight: bold;\n * // margin-top: 10px;\n * // padding-left: 20px;\n * // align-items: center;\n * // flex-direction: column;\"\n * ```\n *\n * @see {@link HtmlStyleType}\n */\nimport type { HtmlStyleType } from './css-style-manager-type.js';\nimport { CSSAnimation } from './animation/css-animation.js';\nimport { CSSBackground } from './background/css-background.js';\nimport { CSSBorder } from './border/css-border.js';\nimport { CSSFlex } from './flex/css-flex.js';\nimport { CSSFont } from './font/css-font.js';\nimport { CSSGrid } from './grid/css-grid.js';\nimport { CSSList } from './list/css-list.js';\nimport { CSSPseudo } from './pseudo/css-pseudo.js';\nimport { CSSSpacing } from './spacing/css-spacing.js';\nimport { CSSTable } from './table/css-table.js';\nimport { CSSText } from './text/css-text.js';\nimport { CSSTransform } from './transform/css-transform.js';\nimport { CSSVisibility } from './visibility/css-visibility.js';\nimport { CSSVisual } from './visual/css-visual.js';\n\nexport class HtmlStyle implements HtmlStyleType {\n /** フォント・文字色プロパティ(7プロパティ) */\n readonly font: CSSFont = new CSSFont();\n\n /** 背景プロパティ(5プロパティ) */\n readonly backgroundColor: CSSBackground = new CSSBackground();\n\n /** テキスト装飾プロパティ(13プロパティ) */\n readonly text: CSSText = new CSSText();\n\n /** 余白プロパティ(10プロパティ) */\n readonly spacing: CSSSpacing = new CSSSpacing();\n\n /** 枠線プロパティ(20プロパティ) */\n readonly border: CSSBorder = new CSSBorder();\n\n /** 表示制御・可視性プロパティ(31プロパティ) */\n readonly position: CSSVisibility = new CSSVisibility();\n\n /** Flexboxレイアウトプロパティ(11プロパティ) */\n readonly flex: CSSFlex = new CSSFlex();\n\n /** Gridレイアウトプロパティ(14プロパティ) */\n readonly grid: CSSGrid = new CSSGrid();\n\n /** 視覚効果プロパティ(6プロパティ) */\n readonly visual: CSSVisual = new CSSVisual();\n\n /** 変形・フィルタプロパティ(6プロパティ) */\n readonly transform: CSSTransform = new CSSTransform();\n\n /** アニメーション・トランジションプロパティ(14プロパティ) */\n readonly animation: CSSAnimation = new CSSAnimation();\n\n /** テーブルレイアウトプロパティ(5プロパティ) */\n readonly table: CSSTable = new CSSTable();\n\n /** リストスタイルプロパティ(4プロパティ) */\n readonly list: CSSList = new CSSList();\n\n /**\n * 擬似クラス(:hover / :focus / :active)スタイル。\n *\n * Anti-Invariant:\n * CSSPseudo は意図的に `Renderable` を実装せず、`render()` の outputs 配列にも\n * 含めない。擬似クラスは body-level プロパティ集約ではなく CSS ルールブロック\n * (セレクタ付き)であり、`CssManager.renderCss()` から `renderForScope(scopeClass)` を\n * 直接呼び出して出力する。\n */\n readonly pseudo: CSSPseudo = new CSSPseudo();\n\n /**\n * すべてのプロパティをCSS文字列としてレンダリングする\n *\n * 各プロパティクラスの出力を順序通りに結合し、空文字列のものは除外する。\n * 未設定のプロパティは出力されない。\n *\n * @returns CSS文字列(全プロパティ未設定の場合は空文字列)\n */\n render(): string {\n const outputs = [\n this.font.render(),\n this.backgroundColor.render(),\n this.text.render(),\n this.spacing.render(),\n this.border.render(),\n this.position.render(),\n this.flex.render(),\n this.grid.render(),\n this.visual.render(),\n this.transform.render(),\n this.animation.render(),\n this.table.render(),\n this.list.render(),\n ].filter((s) => s !== '');\n\n return outputs.join('\\n');\n }\n}\n","/**\n * CSSスタイル管理クラス\n *\n * {@link HtmlStyle} インスタンスを保持し、13種類のCSSプロパティクラスへの\n * アクセスとレンダリング機能を提供する。\n *\n * ## 管理するプロパティカテゴリ\n *\n * - フォント ({@link CSSFont})\n * - 背景 ({@link CSSBackground})\n * - テキスト ({@link CSSText})\n * - 余白 ({@link CSSSpacing})\n * - 枠線 ({@link CSSBorder})\n * - 表示制御 ({@link CSSVisibility})\n * - Flexbox ({@link CSSFlex})\n * - Grid ({@link CSSGrid})\n * - 視覚効果 ({@link CSSVisual})\n * - 変形 ({@link CSSTransform})\n * - アニメーション ({@link CSSAnimation})\n * - テーブル ({@link CSSTable})\n * - リスト ({@link CSSList})\n *\n * @example\n * ```ts\n * const manager = new CssStyleManager();\n * manager.style.font.setFontSize('16px').setColor('#333');\n * manager.style.spacing.setMarginTop('10px');\n *\n * console.log(manager.render());\n * // → \"color: #333;\\nfont-size: 16px;\\nmargin-top: 10px;\"\n * ```\n *\n * @see {@link CssStyleManagerType}\n * @see {@link HtmlStyle}\n */\nimport type { CssStyleManagerType } from '../style/css-style-manager-type.js';\nimport type { HlUnit, UnitStyle } from '../../utils/unit-style.js';\nimport { HtmlStyle } from '../style/html-style.js';\n\n/**\n * CSS値文字列から HlUnit をパースする\n *\n * @param value - CSS値文字列(例: \"16px\", \"1.5em\", \"100%\")\n * @returns パース結果の HlUnit、または undefined(パース失敗時)\n *\n * @internal\n */\nfunction parseCssValueToUnit(value: string): HlUnit | undefined {\n const match = value.match(/^(-?\\d+\\.?\\d*)(px|em|rem|%|vw|vh|fr)?$/);\n if (!match) return undefined;\n const num = parseFloat(match[1]!);\n const unit = (match[2] ?? 'none') as UnitStyle;\n return { value: num, unit };\n}\n\nexport class CssStyleManager implements CssStyleManagerType {\n /** HtmlStyle インスタンス(13種類のプロパティクラスを統合管理) */\n readonly style: HtmlStyle = new HtmlStyle();\n\n /**\n * すべてのスタイルプロパティをCSS文字列としてレンダリングする\n *\n * @returns CSS文字列(設定されたプロパティがない場合は空文字列)\n */\n render(): string {\n return this.style.render();\n }\n\n /**\n * 設定されたフォントサイズを HlUnit として取得する\n *\n * コンテキスト伝播(em単位の計算など)に使用される。\n *\n * @returns フォントサイズの HlUnit、または undefined(未設定時)\n */\n getFontSizeUnit(): HlUnit | undefined {\n const fontSize = this.style.font.getFontSize();\n if (fontSize === undefined) return undefined;\n return parseCssValueToUnit(fontSize);\n }\n}\n","/**\n * CSS中央管理クラス\n *\n * CssStyleManager と CssPositionMaker を統合的に保持し、\n * CSS文字列の統合出力とスコープドCSS出力を提供する。\n *\n * ## 主な機能\n *\n * - **スタイル管理**: {@link CssStyleManager} を通じて13種類のCSSプロパティを管理\n * - **レイアウト管理**: {@link CssPositionMaker} を通じて要素の配置を管理\n * - **スコープドCSS**: タグパスに基づくハッシュクラス名の自動生成\n * - **遅延レイアウト**: {@link LazyLayoutManager} との連携による依存関係の解決\n *\n * ## レンダリング\n *\n * - {@link render}(): スタイルCSS + レイアウトCSS の結合文字列\n * - {@link renderCss}(): スコープドCSS形式(`._{hash}` { ... })またはインラインスタイル\n *\n * @example\n * ```ts\n * const manager = new CssManager('html>body>div');\n * manager.styleManager.style.font.setFontSize('16px');\n * manager.layout.placeAbsoluteWith(b => b.top(0, 'px').left(0, 'px'));\n *\n * // インラインスタイル出力\n * console.log(manager.render());\n * // → \"font-size: 16px;\\nleft: 0px;\\nposition: absolute;\\ntop: 0px;\"\n *\n * // スコープドCSS出力\n * console.log(manager.renderCss());\n * // → \"._a1b2c3d4 {\\nfont-size: 16px;\\nleft: 0px;\\nposition: absolute;\\ntop: 0px;\\n}\"\n * ```\n *\n * @see {@link CssManagerInstance}\n * @see {@link CssStyleManager}\n * @see {@link CssPositionMaker}\n * @see {@link CssConfig}\n */\nimport type { CssManagerInstance } from '../../html/protocols/css-manager-instance-type.js';\nimport type { LazyLayoutRegister } from '../layout/lazy-layout/registered-item.js';\nimport type { IdentifierResolver } from '../utils/identifier-resolver.js';\nimport type { StyleTemplate } from '../variables/style-template.js';\nimport type { StyleSelectors } from '../variables/css-shared-style.js';\n\nimport { CssConfig } from '../config/css-config.js';\nimport { CssPositionMaker } from '../layout/position-maker/css-position-maker.js';\nimport { CssStyleManager } from './css-style-manager.js';\nimport { generateScopedClassName } from '../utils/scoped-css-generator.js';\nimport { sanitizeCssValue } from '../utils/css-sanitizer.js';\nimport { devWarn } from '../../utils/dev-guard.js';\n\n/**\n * 登録済み StyleTemplate と解決済みクラス名のペア。\n *\n * `registerTemplate` で蓄積され、`renderCss()` の出力時に\n * 実際の CSS ルールへ展開される。\n *\n * @internal\n */\ninterface RegisteredTemplateEntry {\n readonly className: string;\n readonly tagPath: string;\n readonly template: StyleTemplate;\n}\n\n/** 既知の擬似セレクタ(`.css-shared-style.ts` と同じ集合) */\nconst PSEUDO_SELECTORS_SET = new Set([\n 'hover', 'focus', 'active', 'visited', 'disabled',\n 'first-child', 'last-child', 'focus-within', 'focus-visible',\n]);\n\nfunction toKebabCase(str: string): string {\n return str.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`);\n}\n\nfunction renderTemplateBody(properties: Readonly<Record<string, string>>): string {\n return Object.entries(properties)\n .filter(([, v]) => sanitizeCssValue(v) !== '')\n .map(([k, v]) => ` ${toKebabCase(k)}: ${v};`)\n .join('\\n');\n}\n\nfunction resolveTemplateSelector(className: string, key: string): string {\n if (PSEUDO_SELECTORS_SET.has(key)) return `.${className}:${key}`;\n if (key.startsWith('&')) return `.${className}${key.slice(1)}`;\n if (key.startsWith(' ')) return `.${className}${key}`;\n return `.${className}:${key}`;\n}\n\nfunction renderRegisteredEntry(entry: RegisteredTemplateEntry): string {\n const { className, template } = entry;\n const parts: string[] = [];\n const propEntries = Object.entries(template.properties);\n if (propEntries.length > 0) {\n parts.push(`.${className} {\\n${renderTemplateBody(template.properties)}\\n}`);\n }\n const selectors: Readonly<StyleSelectors> | undefined = template.selectors;\n if (selectors) {\n for (const [key, props] of Object.entries(selectors)) {\n if (props && Object.keys(props).length > 0) {\n const selector = resolveTemplateSelector(className, key);\n parts.push(`${selector} {\\n${renderTemplateBody(props)}\\n}`);\n }\n }\n }\n return parts.join('\\n');\n}\n\nexport class CssManager implements CssManagerInstance {\n /** レイアウト管理インスタンス */\n readonly layout: CssPositionMaker;\n\n /** スタイル管理インスタンス */\n readonly styleManager: CssStyleManager;\n\n /** CSS出力設定 */\n readonly config: CssConfig;\n\n /** タグの階層パス(例: 'html>body>div') */\n tagPath: string;\n\n /**\n * `scopedCssEnabled=false` モードで擬似クラススタイルを検出した際に、\n * 当該 manager インスタンスで既に警告を発火したかを示すフラグ。\n * 同一要素からの重複警告を抑止するために用いる。\n */\n private _pseudoWarningEmitted = false;\n\n /**\n * `registerTemplate` で蓄積された (className, template) エントリ列。\n *\n * **render-phase only**:`registerTemplate` は `HtmlTag.protoRender` 内\n * (tagPath 確定後)でのみ呼ばれる。属性パース時には呼ばれない。\n * 同一 `(tagPath, template.bodyHash)` 重複登録は冪等で、\n * このバッファに同じエントリを 2 度蓄積しない。\n *\n * 出力順は登録順を保持する(`renderCss()` で順序保持)。\n *\n * @internal\n */\n private readonly _registeredTemplates: RegisteredTemplateEntry[] = [];\n\n /**\n * 同一 `(tagPath, bodyHash)` の冪等性判定用キーセット。\n * @internal\n */\n private readonly _registeredKeys = new Set<string>();\n\n /**\n * @media ルールの内部ストレージ。\n *\n * キー: ブレークポイント(px 値)\n * 値: プロパティ名 → 値 のマップ\n *\n * 同一ブレークポイントへの `addMediaRule` 呼び出しはプロパティをマージする。\n * レンダリングは Task 4.2 で実装する。\n *\n * @internal\n */\n private readonly _mediaRules = new Map<number, Map<string, string>>();\n\n /**\n * CssManager を構築する\n *\n * @param tagPath - タグの階層パス(デフォルト: '')\n * @param config - CSS出力設定(省略時はデフォルト設定)\n */\n constructor(tagPath = '', config?: CssConfig) {\n this.tagPath = tagPath;\n this.config = config ?? new CssConfig();\n this.layout = new CssPositionMaker(tagPath);\n this.styleManager = new CssStyleManager();\n }\n\n /**\n * タグパスを更新し、レイアウトマネージャーにも伝播する\n *\n * @param newPath - 新しいタグパス\n */\n updateTagPath(newPath: string): void {\n this.tagPath = newPath;\n this.layout.tagPath = newPath;\n }\n\n /**\n * 遅延レイアウトレジスタを更新する\n *\n * @param register - 遅延レイアウトレジスタ(undefined で解除)\n */\n updateLazyLayoutRegister(register: LazyLayoutRegister | undefined): void {\n this.layout.updateLLRegister(register);\n }\n\n /**\n * `StyleTemplate` を内部バッファに登録し、解決済みクラス名を返す。\n *\n * **契約(design.md \"registerTemplate の Pre/Post 条件\" を参照)**:\n *\n * - Pre: `tagPath` は非空。`registerTemplate` は **render フェーズでのみ呼ばれる**\n * (属性パース時には呼ばれない)。\n * - Post: 戻り値の `className` は\n * `resolver.resolveClassName(tagPath, template.bodyHash, template.debugVarName)` と同値。\n * `template.debugVarName` が未設定の場合は従来の bodyHash 経路と同一形式となる。\n * 内部バッファに `(className, template)` を登録順で追加する。\n * 同一 `(tagPath, template.bodyHash)` の重複登録は冪等で、\n * 同じ className を返し、バッファに重複追加しない。\n *\n * `renderCss()` 出力には登録された rule が登録順で含まれる。\n *\n * @param template - 登録対象の StyleTemplate\n * @param resolver - クラス名解決に用いる IdentifierResolver\n * @param tagPath - 要素の構造パス(非空)\n * @returns 解決済みクラス名\n *\n * Requirements: 1.1, 1.2, 1.3, 1.4, 1.7\n */\n registerTemplate(\n template: StyleTemplate,\n resolver: IdentifierResolver,\n tagPath: string,\n ): string {\n const className = resolver.resolveClassName(\n tagPath,\n template.bodyHash,\n template.debugVarName,\n );\n const key = `${tagPath}\u0000${template.bodyHash}`;\n if (this._registeredKeys.has(key)) {\n return className;\n }\n this._registeredKeys.add(key);\n this._registeredTemplates.push({ className, tagPath, template });\n return className;\n }\n\n /**\n * スタイルCSSとレイアウトCSSを結合して返す\n *\n * スコープクラスなしのインラインスタイル形式で出力する。\n *\n * @returns CSS文字列(両方とも空の場合は空文字列)\n */\n render(): string {\n const styleCss = this.styleManager.render();\n const layoutCss = this.layout.render();\n\n if (styleCss === '' && layoutCss === '') return '';\n if (styleCss === '') return layoutCss;\n if (layoutCss === '') return styleCss;\n return `${styleCss}\\n${layoutCss}`;\n }\n\n /**\n * スコープドCSSまたはインラインスタイルとして出力する\n *\n * {@link CssConfig.scopedCssEnabled} が true の場合、\n * タグパスから生成したハッシュクラス名で CSS をラップする。\n *\n * `resolver` が指定された場合、wrapper class 名は `resolver.resolveClassName(tagPath)`\n * から取得する(minify モード等が反映される)。省略時は従来通り\n * `generateScopedClassName(tagPath)` を直接呼ぶ(既存挙動とバイト等価)。\n *\n * 設計: minify 状態の単一情報源は `IdentifierResolver`。`this.config.minifyClassNames`\n * は本メソッドからは参照しない(css-config-pipeline-wiring spec)。\n *\n * @param resolver - クラス名解決に用いる IdentifierResolver(省略可)\n * @returns スコープドCSS文字列またはインラインスタイル\n *\n * @example\n * ```ts\n * // scopedCssEnabled = true の場合\n * // \"._a1b2c3d4 {\\nfont-size: 16px;\\n}\"\n *\n * // scopedCssEnabled = false の場合\n * // \"font-size: 16px;\"\n * ```\n */\n renderCss(resolver?: IdentifierResolver): string {\n const cssBody = this.render();\n const pseudoStyle = this.styleManager.style.pseudo;\n const hasPseudo = pseudoStyle.hasAny();\n const hasRegistered = this._registeredTemplates.length > 0;\n\n if (!this.config.scopedCssEnabled) {\n // 擬似クラスはスコープドCSS前提のため、無効モードでは警告を発火して無視する。\n // 警告は manager インスタンスごとに 1 回のみ発火させる。\n if (hasPseudo && !this._pseudoWarningEmitted) {\n this._pseudoWarningEmitted = true;\n devWarn(\n `[DraftOle] pseudo-class styles require scopedCssEnabled=true, ignored on element <${this.tagPath}>`,\n );\n }\n if (cssBody === '' && !hasRegistered) return '';\n // 登録済み StyleTemplate は scopedCss 前提だが、無効モードでも\n // クラス名ベースの rule として出力する(クラス名は呼び出し側で resolver から既に得ている)。\n const registered = this._renderRegisteredBlocks();\n if (cssBody === '') return registered.join('\\n');\n if (registered.length === 0) return cssBody;\n return [cssBody, ...registered].join('\\n');\n }\n\n // scopedCssEnabled=true 分岐\n const hasMediaRules = this._mediaRules.size > 0;\n if (cssBody === '' && !hasPseudo && !hasRegistered && !hasMediaRules) return '';\n\n const className = resolver !== undefined\n ? resolver.resolveClassName(this.tagPath)\n : generateScopedClassName(this.tagPath);\n const blocks: string[] = [];\n if (cssBody !== '') {\n blocks.push(`.${className} {\\n${cssBody}\\n}`);\n }\n if (hasPseudo) {\n blocks.push(...pseudoStyle.renderForScope(className));\n }\n blocks.push(...this._renderRegisteredBlocks());\n blocks.push(...this._renderMediaBlocks(className));\n return blocks.join('\\n');\n }\n\n /**\n * @media ルールを内部マップに追加する。\n *\n * 同一ブレークポイントに対して複数回呼び出した場合、プロパティはマージされる。\n * 同一プロパティ名が既に存在する場合は上書きされる。\n *\n * @param breakpointPx - ブレークポイント(px 値)\n * @param props - 追加するCSSプロパティのマップ\n *\n * Requirements: 9.1, 9.4\n */\n addMediaRule(breakpointPx: number, props: Record<string, string>): void {\n let bpMap = this._mediaRules.get(breakpointPx);\n if (bpMap === undefined) {\n bpMap = new Map<string, string>();\n this._mediaRules.set(breakpointPx, bpMap);\n }\n for (const [key, value] of Object.entries(props)) {\n bpMap.set(key, value);\n }\n }\n\n /**\n * `_mediaRules` を `@media (min-width: {bp}px) { .{className} { ... } }` ブロックの配列に展開する。\n *\n * ブレークポイントの昇順でブロックを生成する。\n * プロパティ名は kebab-case に変換する。\n *\n * @param className - スコープドクラス名(`_` プレフィックス付きハッシュ)\n * @internal\n */\n private _renderMediaBlocks(className: string): string[] {\n if (this._mediaRules.size === 0) return [];\n const blocks: string[] = [];\n const sortedBreakpoints = [...this._mediaRules.keys()].sort((a, b) => a - b);\n for (const bp of sortedBreakpoints) {\n const props = this._mediaRules.get(bp);\n if (props === undefined || props.size === 0) continue;\n const propLines = [...props.entries()]\n .map(([k, v]) => ` ${toKebabCase(k)}: ${v};`)\n .join('\\n');\n blocks.push(`@media (min-width: ${bp}px) {\\n .${className} {\\n${propLines}\\n }\\n}`);\n }\n return blocks;\n }\n\n /**\n * 登録済みテンプレートを登録順に CSS ブロック文字列の配列に展開する。\n * @internal\n */\n private _renderRegisteredBlocks(): string[] {\n const blocks: string[] = [];\n for (const entry of this._registeredTemplates) {\n const rendered = renderRegisteredEntry(entry);\n if (rendered !== '') blocks.push(rendered);\n }\n return blocks;\n }\n}\n","import type { JQueryManagerInstance } from '../html/protocols/jquery-manager-instance-type.js';\nimport type { JQueryMethodType } from '../html/protocols/jquery-method-type.js';\n\n/**\n * 後方互換性のための re-export。\n * 定義は html/protocols/jquery-manager-instance-type.ts に移動。\n */\nexport type { JQueryManagerInstance } from '../html/protocols/jquery-manager-instance-type.js';\n\n/**\n * JQueryManager - 要素ごとのjQuery風JavaScript操作を蓄積・生成\n *\n * DraftOleのHTML要素に対してjQuery風のDOM操作を記録し、\n * JavaScript文字列として出力するマネージャークラスです。\n *\n * @remarks\n * - 各メソッドは操作をキューに追加し、render()で全操作を出力\n * - usedMethodsプロパティで使用されたメソッドを追跡(tree-shaking用)\n * - メソッドチェーンの代わりに、連続呼び出しで操作を蓄積\n * - Swift版JQueryManagerと互換性のある動作を実現\n *\n * @example 基本的な使用方法\n * ```typescript\n * const jqm = new JQueryManager('root-0-html-0-body');\n * jqm.css({ 'font-size': '10px' });\n * jqm.text('Hello World');\n * jqm.addClass('active');\n *\n * const js = jqm.render();\n * // → \"$('.root-0-html-0-body').css({'font-size': '10px'});\\n...\"\n * ```\n *\n * @example tree-shaking用のメソッド追跡\n * ```typescript\n * const jqm = new JQueryManager('element');\n * jqm.css({ color: 'blue' });\n * jqm.text('Text');\n *\n * const methods = jqm.usedMethods;\n * // → Set { 'css', 'text' }\n *\n * // JQueryHelperと組み合わせて最小限の$()関数を生成\n * const helper = JQueryHelper.generateHelper(methods);\n * ```\n *\n * @example イベントハンドリング\n * ```typescript\n * const jqm = new JQueryManager('button-element');\n * jqm.click('handleClick');\n * jqm.keydown('handleKeyDown');\n *\n * console.log(jqm.render());\n * // → \"$('.button-element').on('click', handleClick);\\n$('.button-element').on('keydown', handleKeyDown)\"\n * ```\n *\n * @example パスの動的更新\n * ```typescript\n * const jqm = new JQueryManager('old-path');\n * jqm.css({ color: 'red' });\n *\n * jqm.updatePath('new-path');\n * jqm.text('Updated');\n *\n * // 既存の操作は古いパスを保持し、新しい操作は新しいパスを使用\n * ```\n *\n * @public\n */\nexport class JQueryManager implements JQueryManagerInstance {\n private _path: string;\n private readonly _content: string[] = [];\n private readonly _usedMethods: Set<JQueryMethodType> = new Set();\n\n constructor(path: string = '') {\n this._path = path;\n }\n\n get path(): string {\n return this._path;\n }\n\n get usedMethods(): ReadonlySet<JQueryMethodType> {\n return this._usedMethods;\n }\n\n /**\n * CSSプロパティ操作のJS文を生成\n * @param properties - CSS propertyのキーバリューマップ\n * @returns 生成されたJS文字列\n */\n css(properties: Record<string, string>): string {\n this._usedMethods.add('css');\n\n const propsStr = Object.entries(properties)\n .map(([key, value]) => `'${key}': '${value}'`)\n .join(', ');\n\n const statement = `$('.${this._path}').css({${propsStr}})`;\n this._content.push(statement);\n return statement;\n }\n\n /**\n * 高さ操作のJS文を生成\n * @param value - 高さの値\n * @param unit - 単位('px', 'vh'等、指定しない場合は数値のみ)\n * @returns 生成されたJS文字列\n */\n height(value: number, unit?: string): string {\n this._usedMethods.add('height');\n\n const valueStr = unit ? `'${value}${unit}'` : value.toString();\n const statement = `$('.${this._path}').height(${valueStr})`;\n this._content.push(statement);\n return statement;\n }\n\n /**\n * 汎用イベントバインディングのJS文を生成\n * @param eventType - イベント種別('click', 'keydown'等)\n * @param handler - ハンドラ関数名\n * @returns 生成されたJS文字列(空ハンドラの場合は空文字列)\n */\n on(eventType: string, handler: string): string {\n if (handler.length === 0) {\n return '';\n }\n\n this._usedMethods.add('on');\n const statement = `$('.${this._path}').on('${eventType}', ${handler})`;\n this._content.push(statement);\n return statement;\n }\n\n /**\n * clickイベントハンドラのJS文を生成\n * @param handler - ハンドラ関数名\n * @returns 生成されたJS文字列\n */\n click(handler: string): string {\n return this.on('click', handler);\n }\n\n /**\n * keydownイベントハンドラのJS文を生成\n * @param handler - ハンドラ関数名\n * @returns 生成されたJS文字列\n */\n keydown(handler: string): string {\n return this.on('keydown', handler);\n }\n\n /**\n * keyupイベントハンドラのJS文を生成\n * @param handler - ハンドラ関数名\n * @returns 生成されたJS文字列\n */\n keyup(handler: string): string {\n return this.on('keyup', handler);\n }\n\n /**\n * テキストコンテンツ操作のJS文を生成\n * @param value - テキスト値または変数名\n * @param isVariable - trueの場合、変数名として扱う(クォートなし)\n * @returns 生成されたJS文字列\n */\n text(value: string, isVariable: boolean = false): string {\n this._usedMethods.add('text');\n\n const valueStr = isVariable ? value : `'${value}'`;\n const statement = `$('.${this._path}').text(${valueStr})`;\n this._content.push(statement);\n return statement;\n }\n\n /**\n * innerHTML操作のJS文を生成\n * @param value - HTML文字列\n * @returns 生成されたJS文字列\n */\n html(value: string): string {\n this._usedMethods.add('html');\n\n const statement = `$('.${this._path}').html('${value}')`;\n this._content.push(statement);\n return statement;\n }\n\n /**\n * クラス追加のJS文を生成\n * @param className - 追加するクラス名\n * @returns 生成されたJS文字列\n */\n addClass(className: string): string {\n this._usedMethods.add('addClass');\n\n const statement = `$('.${this._path}').addClass('${className}')`;\n this._content.push(statement);\n return statement;\n }\n\n /**\n * クラス削除のJS文を生成\n * @param className - 削除するクラス名\n * @returns 生成されたJS文字列\n */\n removeClass(className: string): string {\n this._usedMethods.add('removeClass');\n\n const statement = `$('.${this._path}').removeClass('${className}')`;\n this._content.push(statement);\n return statement;\n }\n\n /**\n * クラストグルのJS文を生成\n * @param className - トグルするクラス名\n * @param force - true/falseで強制的に追加/削除\n * @returns 生成されたJS文字列\n */\n toggleClass(className: string, force?: boolean): string {\n this._usedMethods.add('toggleClass');\n\n const forceStr = force !== undefined ? `, ${force}` : '';\n const statement = `$('.${this._path}').toggleClass('${className}'${forceStr})`;\n this._content.push(statement);\n return statement;\n }\n\n /**\n * ヘルパー関数が必要かどうかを判定\n * @returns usedMethodsが空でない場合true\n */\n needsHelper(): boolean {\n return this._usedMethods.size > 0;\n }\n\n /**\n * パスを更新\n * @param newPath - 新しいCSSセレクタパス\n */\n updatePath(newPath: string): void {\n this._path = newPath;\n }\n\n /**\n * 蓄積されたJS文を \";\\n\" で結合して返す\n * @returns 統合されたJavaScript文字列(空の場合は空文字列)\n */\n render(): string {\n if (this._content.length === 0) {\n return '';\n }\n return this._content.join(';\\n');\n }\n}\n","import type { JQueryMethodType } from '../html/protocols/jquery-method-type.js';\n\n/**\n * JQueryHelper - Tree-shaking対応の$()ヘルパー関数生成\n *\n * 使用されたjQueryメソッドのみを含む最小限の$()関数を生成し、\n * バンドルサイズを最適化します。\n *\n * @remarks\n * DraftOleの主要な機能の一つである**tree-shaking**を実現します。\n * JQueryManagerで使用されたメソッドのみを含む軽量な$()関数を動的に生成し、\n * 未使用のメソッドを含まないことでJavaScriptファイルサイズを削減します。\n *\n * ### Tree-shakingの仕組み\n * 1. {@link JQueryManager}が使用されたメソッドを`usedMethods`として追跡\n * 2. `JQueryHelper.generateHelper(usedMethods)`で必要なメソッドのみを含む$()関数を生成\n * 3. 出力されるJavaScriptは使用されたメソッドのみを含む\n *\n * ### jQueryとの違い\n * - フルサイズのjQueryライブラリ(約90KB minified)を避ける\n * - プロジェクトで実際に使用されるメソッドのみを含む(通常1-5KB)\n * - 依存関係なしで動作(Pure JavaScript)\n *\n * @example 基本的な使用方法\n * ```typescript\n * const usedMethods = new Set(['css', 'text', 'addClass']);\n * const helper = JQueryHelper.generateHelper(usedMethods);\n * // → css, text, addClassメソッドのみを持つ$()関数のJS文字列\n * ```\n *\n * @example JQueryManagerと組み合わせたtree-shaking\n * ```typescript\n * // 1. JQueryManagerで操作を記録\n * const jqm = new JQueryManager('my-element');\n * jqm.css({ color: 'red' });\n * jqm.addClass('active');\n *\n * // 2. 使用されたメソッドを取得\n * const usedMethods = jqm.usedMethods;\n * // → Set { 'css', 'addClass' }\n *\n * // 3. 必要最小限の$()関数を生成\n * const helper = JQueryHelper.generateHelper(usedMethods);\n *\n * // 4. 出力されるJavaScriptにはcssとaddClassのみが含まれる\n * // text, html, removeClassなどの未使用メソッドは含まれない\n * ```\n *\n * @example 複数のマネージャーからメソッドを集約\n * ```typescript\n * const managers = [\n * new JQueryManager('element1'),\n * new JQueryManager('element2'),\n * new JQueryManager('element3'),\n * ];\n *\n * managers[0].css({ color: 'red' });\n * managers[1].text('Hello');\n * managers[2].addClass('active');\n *\n * // 全マネージャーの使用メソッドを集約\n * const allMethods = new Set<JQueryMethodType>();\n * managers.forEach(m => {\n * m.usedMethods.forEach(method => allMethods.add(method));\n * });\n *\n * // 全体で使用されたメソッドのみを含む$()関数を生成\n * const helper = JQueryHelper.generateHelper(allMethods);\n * ```\n *\n * @example querySelectorAllサポート($$.all)\n * ```typescript\n * const usedMethods = new Set(['css', 'addClass']);\n * const helper = JQueryHelper.generateHelperWithAll(usedMethods);\n *\n * // 生成されるコードの例:\n * // function $(...) { ... }\n * // const $$ = { all(selector) { return Array.from(document.querySelectorAll(selector)); } };\n * ```\n *\n * @public\n */\nexport class JQueryHelper {\n /**\n * 使用メソッドのみを含む$()ヘルパー関数を生成\n *\n * @param methods - 使用するJQueryMethodTypeのSet\n * @returns 生成されたJavaScript文字列(空Setの場合は空文字列)\n *\n * @remarks\n * 生成される$()関数は以下の特徴を持ちます:\n * - セレクタ文字列またはDOM要素を受け取る\n * - 指定されたメソッドのみを実装(未使用メソッドは含まれない)\n * - null要素に対しても安全に動作(メソッドチェーンを壊さない)\n * - メソッドチェーンをサポート(各メソッドはthisを返す)\n *\n * @example 最小限のバンドル(css, textのみ)\n * ```typescript\n * const methods = new Set(['css', 'text']);\n * const helper = JQueryHelper.generateHelper(methods);\n *\n * // 生成されるコード(簡略版):\n * // function $(selectorOrEl) {\n * // const el = typeof selectorOrEl === \"string\" ? document.querySelector(selectorOrEl) : selectorOrEl;\n * // return {\n * // css(props) { ... },\n * // text(value) { ... }\n * // };\n * // }\n * ```\n *\n * @example 空のSet(メソッド未使用時)\n * ```typescript\n * const methods = new Set<JQueryMethodType>();\n * const helper = JQueryHelper.generateHelper(methods);\n * console.log(helper); // → \"\"(空文字列)\n * ```\n *\n * @public\n */\n static generateHelper(methods: ReadonlySet<JQueryMethodType>): string {\n if (methods.size === 0) {\n return '';\n }\n\n const methodImplementations: string[] = [];\n\n if (methods.has('css')) {\n methodImplementations.push(` css(props) {\n if (!el) return this;\n for (let prop in props) {\n el.style[prop] = props[prop];\n }\n return this;\n }`);\n }\n\n if (methods.has('height')) {\n methodImplementations.push(` height(value) {\n if (!el) return this;\n el.style.height = typeof value === 'number' ? value + 'px' : value;\n return this;\n }`);\n }\n\n if (methods.has('on')) {\n methodImplementations.push(` on(event, handler) {\n if (!el) return this;\n el.addEventListener(event, handler);\n return this;\n }`);\n }\n\n if (methods.has('text')) {\n methodImplementations.push(` text(value) {\n if (!el) return this;\n if (value === undefined) {\n return el.textContent;\n }\n el.textContent = value;\n return this;\n }`);\n }\n\n if (methods.has('html')) {\n methodImplementations.push(` html(value) {\n if (!el) return this;\n if (value === undefined) {\n return el.innerHTML;\n }\n el.innerHTML = value;\n return this;\n }`);\n }\n\n if (methods.has('addClass')) {\n methodImplementations.push(` addClass(className) {\n if (!el) return this;\n el.classList.add(className);\n return this;\n }`);\n }\n\n if (methods.has('removeClass')) {\n methodImplementations.push(` removeClass(className) {\n if (!el) return this;\n el.classList.remove(className);\n return this;\n }`);\n }\n\n if (methods.has('toggleClass')) {\n methodImplementations.push(` toggleClass(className, force) {\n if (!el) return this;\n if (force === undefined) {\n el.classList.toggle(className);\n } else {\n el.classList.toggle(className, force);\n }\n return this;\n }`);\n }\n\n const helperFunction = `function $(selectorOrEl) {\n const el = typeof selectorOrEl === \"string\"\n ? document.querySelector(selectorOrEl)\n : selectorOrEl;\n\n if (!el) {\n return {\n${methodImplementations.map(impl => impl.replace(/if \\(!el\\) return this;\\n {8}/g, '')).join(',\\n')}\n };\n }\n\n return {\n${methodImplementations.join(',\\n')}\n };\n}`;\n\n return helperFunction;\n }\n\n /**\n * $()関数に加えて$$.all()関数も生成\n *\n * @param methods - 使用するJQueryMethodTypeのSet\n * @returns 生成されたJavaScript文字列(空Setの場合は空文字列)\n *\n * @remarks\n * `generateHelper()`に加えて、`$$.all(selector)`ヘルパーを追加します。\n * `$$.all()`は`document.querySelectorAll()`のラッパーで、配列として結果を返します。\n *\n * @example 複数要素の一括操作\n * ```typescript\n * const methods = new Set(['addClass']);\n * const helper = JQueryHelper.generateHelperWithAll(methods);\n *\n * // 生成されるコード(簡略版):\n * // function $(...) { ... }\n * // const $$ = {\n * // all(selector) {\n * // return Array.from(document.querySelectorAll(selector));\n * // }\n * // };\n *\n * // 使用例:\n * // $$.all('.item').forEach(el => $(el).addClass('active'));\n * ```\n *\n * @public\n */\n static generateHelperWithAll(methods: ReadonlySet<JQueryMethodType>): string {\n const helperFunction = this.generateHelper(methods);\n\n if (helperFunction.length === 0) {\n return '';\n }\n\n const allFunction = `\nconst $$ = {\n all(selector) {\n return Array.from(document.querySelectorAll(selector));\n }\n};`;\n\n return helperFunction + '\\n' + allFunction;\n }\n}\n","/**\n * Composition Root\n *\n * 具象 `CssManager` / `JQueryManager` の生成を一元管理するモジュール。\n * `html/` 配下からは抽象型(プロトコル)のみを介してアクセスされ、\n * 本モジュールのみが `src/css/manager/css-manager.ts` および\n * `src/js/jquery-manager.ts` の具象クラスを知る。\n *\n * 設計原則:\n * - 純関数のみを公開する(内部状態・副作用なし、毎呼び出しで必要最小限のインスタンスを生成)。\n * - `HtmlTagOptions` 未指定 / 部分指定 / 完全指定のいずれも許容し、\n * 戻り値の `css` / `jqm` は必ず非 null な `CssManagerInstance` /\n * `JQueryManagerInstance` を返す。\n *\n * Requirements: 3.1, 3.2, 3.4, 4.3\n * Design: design.md §Infrastructure → `composition-root.ts`\n *\n * Note: `HtmlTagOptions` は循環参照を避けるため `import type` で参照する。\n */\nimport { CssManager } from './css/manager/css-manager.js';\nimport { JQueryManager } from './js/jquery-manager.js';\nimport type { CssManagerInstance } from './html/protocols/css-manager-instance-type.js';\nimport type { JQueryManagerInstance } from './html/protocols/jquery-manager-instance-type.js';\nimport type { HtmlTagOptions } from './html/elements/html-tag.js';\n\n/**\n * `JQueryHelper` の再エクスポート。\n *\n * `html/` 配下からは `composition-root.ts` 経由でのみ `JQueryHelper` を参照する\n * (Req 1.4, 3.1-3.3)。具象モジュール `js/jquery-helper.ts` を直接 import することは\n * `no-restricted-imports` で禁止されている。\n */\nexport { JQueryHelper } from './js/jquery-helper.js';\n\n/**\n * 解決済みの HtmlTag 依存。`css` / `jqm` は必ず非 null。\n *\n * Requirements: 3.1, 4.3\n */\nexport interface ResolvedHtmlTagDependencies {\n readonly css: CssManagerInstance;\n readonly jqm: JQueryManagerInstance;\n}\n\n/**\n * デフォルトの `CssManagerInstance` を生成する。\n *\n * 呼び出すたびに新しいインスタンスを返す(現行の「都度生成」セマンティクスを保存)。\n *\n * Requirements: 3.1, 3.4\n */\nexport function createDefaultCssManager(): CssManagerInstance {\n return new CssManager();\n}\n\n/**\n * デフォルトの `JQueryManagerInstance` を生成する。\n *\n * 呼び出すたびに新しいインスタンスを返す。\n *\n * Requirements: 3.1, 3.4\n */\nexport function createDefaultJQueryManager(): JQueryManagerInstance {\n return new JQueryManager();\n}\n\n/**\n * `HtmlTagOptions` から `CssManagerInstance` / `JQueryManagerInstance` を解決する。\n *\n * - options 未指定 / 部分指定 / 完全指定のいずれも許容。\n * - 指定された参照はそのまま返却し、未指定分のみデフォルトを生成する。\n *\n * Requirements: 3.1, 3.2, 3.4, 4.3\n */\nexport function resolveHtmlTagDependencies(\n options?: HtmlTagOptions,\n): ResolvedHtmlTagDependencies {\n return {\n css: options?.css ?? createDefaultCssManager(),\n jqm: options?.jqm ?? createDefaultJQueryManager(),\n };\n}\n\n/**\n * 構造的チェックによる `HtmlTagOptions` 型ガード。\n *\n * `{}`(空オブジェクト)は attribute map と区別できないため HtmlTagOptions とは扱わない。\n *\n * AttributeMap の `css` キー(`StyleTemplate` / `SharedStyle` / 配列)と\n * HtmlTagOptions の `css` キー(`CssManagerInstance`)を区別するため、\n * 値の構造(`updateTagPath` メソッドの存在)も検証する。\n * 同様に `jqm` も `JQueryManagerInstance` 固有の `updatePath` メソッドで検証する。\n *\n * 非オブジェクト、null、undefined は常に false。\n */\nexport function isHtmlTagOptions(value: unknown): value is HtmlTagOptions {\n if (value === null || typeof value !== 'object') return false;\n if ('css' in value) {\n const css = (value as { css?: unknown }).css;\n if (\n css !== null\n && typeof css === 'object'\n && typeof (css as { updateTagPath?: unknown }).updateTagPath === 'function'\n ) {\n return true;\n }\n }\n if ('jqm' in value) {\n const jqm = (value as { jqm?: unknown }).jqm;\n if (\n jqm !== null\n && typeof jqm === 'object'\n && typeof (jqm as { updatePath?: unknown }).updatePath === 'function'\n ) {\n return true;\n }\n }\n return false;\n}\n","/**\n * リテラル値を JS コード文字列にエンコードする共有内部ユーティリティ。\n *\n * 設計書 `design.md` の「3. `encodeLiteral` 共有内部ファイル」に対応する。\n *\n * - `string | number` は `JSON.stringify` でクォートする。\n * - `JsExpr` はすでに JS 式を表すため `.code` をそのまま返す。\n */\n\nimport type { JsExpr } from '../types.js';\n\n/**\n * `string | number | JsExpr` をJS式文字列に変換する。\n *\n * @param value - エンコード対象の値\n * @returns JS コード文字列\n */\nexport function encodeLiteral(value: string | number | JsExpr): string {\n if (typeof value === 'string' || typeof value === 'number') {\n return JSON.stringify(value);\n }\n return value.code;\n}\n","/**\n * `ElementRef` / `ElementListRef` と生成関数 (`ref` / `fromSelector` / `fromExpr`)、\n * および `JsExpr` チェーンヘルパ(`eq` / `ne` / `or` / `trim` / `isFalsy` / `isTruthy`)の実装。\n *\n * 設計書 `design.md` の「element-ref」「types: JsExpr / JsBoolExpr」節に対応。\n * 値オブジェクトとして扱い、メソッドは新しいオブジェクトを返す純関数。\n */\n\nimport type { ElementRef, ElementListRef, JsExpr, JsBoolExpr } from './types.ts';\nimport type { VanillaScope } from './vanilla-script-builder.ts';\nimport { encodeLiteral } from './internal/literal-encode.js';\n\n/**\n * `cache()` 呼び出し時に自動生成する識別子名のカウンタ。\n * 同一プロセス内で一意性を保つための単純なサフィックス。\n */\nlet cacheCounter = 0;\n\n/** 有効な JS 識別子か判定する(予約語チェックは行わない)。 */\nfunction isValidJsIdentifier(name: string): boolean {\n if (name.length === 0) return false;\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name);\n}\n\n/** 要素型情報から `value` アクセス可否を判定するための内部タグ。実体は文字列マーカ。 */\ntype HasValueElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\n/**\n * `JsExpr` 値オブジェクトを生成する内部ファクトリ。\n * チェーンメソッド(`eq` / `ne` / `or` / `trim` / `isFalsy` / `isTruthy`)を純関数として提供する。\n */\nfunction makeJsExpr(code: string): JsExpr {\n const self: JsExpr = {\n __jsExpr: true,\n code,\n eq(other) {\n return makeJsBoolExpr(`${code} === ${encodeLiteral(other)}`);\n },\n ne(other) {\n return makeJsBoolExpr(`${code} !== ${encodeLiteral(other)}`);\n },\n or(fallback) {\n return makeJsExpr(`(${code} || ${encodeLiteral(fallback)})`);\n },\n trim() {\n return makeJsExpr(`${code}.trim()`);\n },\n isFalsy() {\n return makeJsBoolExpr(`!${code}`);\n },\n isTruthy() {\n return makeJsBoolExpr(`!!${code}`);\n },\n };\n return self;\n}\n\n/**\n * `JsBoolExpr` 値オブジェクトを生成する内部ファクトリ。\n * `JsExpr` のサブタイプとして `__jsBool` マーカーを持たせる。\n */\nfunction makeJsBoolExpr(code: string): JsBoolExpr {\n const base = makeJsExpr(code);\n return {\n ...base,\n __jsBool: true,\n } as JsBoolExpr;\n}\n\n/**\n * `ElementRef` 値オブジェクトを生成する内部ファクトリ。\n * `textContent` / `value` プロパティを `JsExpr` として遅延露出する。\n */\nfunction makeElementRef<E extends Element>(\n kind: ElementRef['kind'],\n code: string,\n scope?: VanillaScope,\n): ElementRef<E> {\n const ref = {\n __ref: true as const,\n kind,\n code,\n get textContent(): JsExpr {\n return makeJsExpr(`${code}.textContent`);\n },\n // 型レベルで `value` は E が入力系要素のときのみ利用可能。\n // 実行時はすべての ref で `value` アクセスを試みれば JsExpr を返すが、\n // 型によりコンパイル時点で弾かれる設計(design.md)。\n get value(): E extends HasValueElement ? JsExpr : never {\n return makeJsExpr(`${code}.value`) as E extends HasValueElement ? JsExpr : never;\n },\n /**\n * 現在スコープに `const <name> = <code>;` を append し、新しい `kind: \"var\"` 参照を返す。\n * 同一セレクタを複数回埋め込む副作用を避けたい場合に明示的に使う(Issue 3)。\n *\n * スコープが紐付いていない参照(`ref()` / `fromSelector()` / `fromExpr()` 由来)に対して\n * 呼ばれた場合は例外を投げる — 宣言場所が曖昧になるため。\n */\n cache(name?: string): ElementRef<E> {\n if (scope === undefined) {\n throw new Error(\n 'ElementRef.cache(): this reference is not bound to a scope; ' +\n 'use query(scope, sel) / queryAll(scope, sel) to obtain a cacheable reference.',\n );\n }\n const chosen = name ?? `_cached_${++cacheCounter}`;\n if (!isValidJsIdentifier(chosen)) {\n throw new Error(\n `ElementRef.cache(): invalid JS identifier: ${JSON.stringify(chosen)}`,\n );\n }\n scope._append({ type: 'declareConst', name: chosen, expr: code });\n return makeElementRef<E>('var', chosen, scope);\n },\n /** `classList.contains(name)` を真偽式として返す(Req 3.4)。 */\n containsClass(name: string): JsBoolExpr {\n return makeJsBoolExpr(`${code}.classList.contains(${JSON.stringify(name)})`);\n },\n };\n return ref as ElementRef<E>;\n}\n\n/**\n * `jsName` 由来の変数名(または既に存在する JS 識別子)を指す `ElementRef` を生成する。\n *\n * @param varName - JS 識別子として有効な名前(空文字・無効識別子は `Error`)。\n * @returns `kind: 'var'`、`code === varName` の新しい `ElementRef`。\n * @throws 空文字・無効 JS 識別子のとき `Error`。\n */\nexport function ref<E extends Element = HTMLElement>(varName: string): ElementRef<E> {\n if (!isValidJsIdentifier(varName)) {\n throw new Error(`ref(): invalid JS identifier: ${JSON.stringify(varName)}`);\n }\n return makeElementRef<E>('var', varName);\n}\n\n/**\n * CSS セレクタをインライン展開する `ElementRef` を生成する(`document.querySelector(sel)` 形式)。\n *\n * @param selector - 空文字禁止。セレクタ文字列は `JSON.stringify` でクォートされる。\n * @returns `kind: 'selector'` の新しい `ElementRef`。\n * @throws 空文字の場合 `Error`。\n */\nexport function fromSelector<E extends Element = HTMLElement>(selector: string): ElementRef<E> {\n if (selector.length === 0) {\n throw new Error('fromSelector(): selector must not be empty');\n }\n return makeElementRef<E>('selector', `document.querySelector(${JSON.stringify(selector)})`);\n}\n\n/**\n * 任意の JS 式文字列を内包する `ElementRef` を生成する(内部用のエスケープハッチ)。\n *\n * @param code - JS 式として有効な文字列(空文字禁止)。\n * @returns `kind: 'expr'` の新しい `ElementRef`。\n * @throws 空文字の場合 `Error`。\n */\nexport function fromExpr<E extends Element = HTMLElement>(code: string): ElementRef<E> {\n if (code.length === 0) {\n throw new Error('fromExpr(): code must not be empty');\n }\n return makeElementRef<E>('expr', code);\n}\n\n/**\n * `ElementListRef` 値オブジェクトを生成する内部ファクトリ。\n * `queryAll` 等で利用するが、本タスクでは基本形(`length` のみ)を提供する。\n */\nfunction makeElementListRef<E extends Element>(\n kind: ElementListRef['kind'],\n code: string,\n): ElementListRef<E> {\n return {\n __listRef: true,\n kind,\n code,\n // `kind: \"listSelector\"` の場合は `NodeList.length`、`kind: \"listExpr\"`(`filterNot` 等の\n // 合成結果、`Array.from(...).filter(...)` 形式)の場合は `Array.length` を直接参照する。\n // どちらも `.length` プロパティがネイティブに存在するため、追加の `Array.from` ラップは不要。\n length: makeJsExpr(`${code}.length`),\n } as ElementListRef<E>;\n}\n\n/**\n * CSS セレクタ由来の `ElementListRef` を生成する(`document.querySelectorAll(sel)` 形式)。\n * 後続の `query-api` から利用する想定だが、要素参照層が所有する純粋な生成関数として提供する。\n */\nexport function listFromSelector<E extends Element = HTMLElement>(\n selector: string,\n): ElementListRef<E> {\n if (selector.length === 0) {\n throw new Error('listFromSelector(): selector must not be empty');\n }\n return makeElementListRef<E>(\n 'listSelector',\n `document.querySelectorAll(${JSON.stringify(selector)})`,\n );\n}\n\n/**\n * 任意の JS 式由来の `ElementListRef` を生成する(内部用)。\n */\nexport function listFromExpr<E extends Element = HTMLElement>(code: string): ElementListRef<E> {\n if (code.length === 0) {\n throw new Error('listFromExpr(): code must not be empty');\n }\n return makeElementListRef<E>('listExpr', code);\n}\n\n/**\n * スコープに紐付いた `ElementRef` を生成する内部ファクトリ。\n * `query(scope, sel)` がセレクタ参照を cache 可能にするために使用する。\n */\nexport function _makeScopedElementRef<E extends Element = HTMLElement>(\n kind: ElementRef['kind'],\n code: string,\n scope: VanillaScope,\n): ElementRef<E> {\n return makeElementRef<E>(kind, code, scope);\n}\n\n/**\n * スコープに紐付いた `ElementListRef` を生成する内部ファクトリ。\n * `queryAll(scope, sel)` 由来の参照は将来的な cache/forEach 化に備えて\n * 同じ経路を共有する(本 Phase では単純な参照と等価)。\n */\nexport function _makeScopedElementListRef<E extends Element = HTMLElement>(\n kind: ElementListRef['kind'],\n code: string,\n): ElementListRef<E> {\n return makeElementListRef<E>(kind, code);\n}\n\n/**\n * 内部ファクトリ `makeJsExpr` の再エクスポート(上位層での JS 式構築に利用)。\n * 公開 API ではなく、`src/js/vanilla/*` 内でのみ使用を想定する。\n */\nexport { makeJsExpr as _makeJsExpr, makeJsBoolExpr as _makeJsBoolExpr };\n","/**\n * `ExprFactory` の実装。\n *\n * 設計書 `design.md` の「ExprFactory」節に対応し、以下の API を提供する:\n * - `createExprFactory()`: callable な関数オブジェクトに `.bool` プロパティを\n * 付与して返す。`root.expr(code)` / `root.expr.bool(code)` のエントリポイント。\n * - `encodeLiteral(value)`: 文字列/数値は `JSON.stringify` でリテラル化し、\n * `JsExpr` は `.code` を素通しする共通ヘルパ。要素メソッド側(`setText` 等)\n * からも再利用される想定(Req 4.5)。\n *\n * 対応 requirement:\n * - 4.1: `root.expr(code)` が `.code === code` の `JsExpr` を返す\n * - 4.2: 返された `JsExpr` は `eq`/`ne`/`or`/`trim`/`isFalsy`/`isTruthy` を提供\n * - 4.3: `.bool(code)` が `JsBoolExpr` を返す\n * - 4.5: 文字列リテラルを `JSON.stringify` でエンコードする共通経路を提供\n *\n * 実装方針: 既存の内部ファクトリ `_makeJsExpr` / `_makeJsBoolExpr`(`element-ref.ts`)\n * を再利用し、式オブジェクトの振る舞いを単一化する(R-6 決定)。\n */\n\nimport { encodeLiteral } from './internal/literal-encode.js';\nimport { _makeJsBoolExpr, _makeJsExpr } from './element-ref.js';\nimport type { JsBoolExpr, JsExpr } from './types.ts';\n\nexport { encodeLiteral };\n\n/**\n * `root.expr` の型。callable + `.bool` namespace 構造(design.md §ExprFactory)。\n */\nexport interface ExprFactory {\n /** 任意の JS 式コードを `.code` としてそのまま保持する `JsExpr` を生成する。 */\n (code: string): JsExpr;\n /** 真偽式として扱う生コードを `JsBoolExpr` として生成する。 */\n bool(code: string): JsBoolExpr;\n}\n\n/**\n * `ExprFactory` を生成する。\n *\n * 返り値は関数オブジェクトであり、`f(code)` で `JsExpr` を、`f.bool(code)` で\n * `JsBoolExpr` を得る。`Root` からは単一インスタンスを `root.expr` として公開する。\n */\nexport function createExprFactory(): ExprFactory {\n const factory = ((code: string): JsExpr => _makeJsExpr(code)) as ExprFactory;\n factory.bool = (code: string): JsBoolExpr => _makeJsBoolExpr(code);\n return factory;\n}\n","/**\n * binding-emitter.ts: 要素 × 状態 → `bind-*` コマンド生成\n *\n * 設計書 `design.md` の「binding-emitter(Internal)」セクションに対応。\n *\n * 各エミッタ関数は `ElementTarget` と `ReadableState<T>` を受け取り、\n * 対応する `VanillaCommand` を生成して返す純関数。\n * `bind-text` / `bind-value` / `bind-class-all` / `bind-class-add` /\n * `bind-style` / `bind-checked` / `bind-each` コマンドを生成する。\n *\n * 設計方針:\n * - 副作用なし。コマンドオブジェクトを生成して返すだけ\n * - `stateId` は `value._runtimeId` で埋める\n * (方針 B により Computed も登録済みランタイム状態であるため、直接使用できる)\n * - `EachBinding` の `_snapshot` から `EachTemplateSnapshot` を取り出す\n *\n * Requirements: 4.1–4.7\n * Design: binding-emitter(Internal)\n * Depends: 3.1 (commands.ts), 2.2 (state.ts), 2.3 (each-template.ts)\n */\n\nimport type { VanillaCommand } from '../commands.js';\nimport type { ElementTarget } from '../element-target.js';\nimport type { EachTemplateSnapshot } from './each-template.js';\nimport type { EachBinding, ReadableState } from './state.js';\nimport { isDerivedTemplateState } from './template-derived-state.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 内部型定義\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * `EachBinding<U>` に `_snapshot` を付加した型。\n * `captureEachTemplate` の戻り値(`EachBindingWithSnapshot<U>`)と同構造。\n * 循環 import を避けるため、ここで再定義するのではなく型チェックのみに使用する。\n */\ntype EachBindingWithSnapshot<U> = EachBinding<U> & {\n readonly _snapshot: EachTemplateSnapshot;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// エミッタ関数群\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * `bind-text` コマンドを生成する。\n *\n * 要素の `textContent` を状態値にバインドする購読登録コマンドを返す。\n * Req 4.1: `element.setText(state)` → `bind-text` コマンド\n *\n * @param target - バインド対象の DOM 要素参照\n * @param value - バインドする状態値(`State<string>` または `Computed<string>`)\n * @returns `bind-text` VanillaCommand\n */\nexport function emitBindText(\n target: ElementTarget,\n value: ReadableState<string>,\n): VanillaCommand {\n if (isDerivedTemplateState(value)) {\n return { type: 'bind-text', target, stateId: value._parentTemplateId, transform: value._transform };\n }\n return {\n type: 'bind-text',\n target,\n stateId: value._runtimeId,\n };\n}\n\n/**\n * `bind-value` コマンドを生成する。\n *\n * `<input>` / `<textarea>` / `<select>` の `.value` プロパティを状態値にバインドする。\n * Req 4.2: `element.setValue(state)` → `bind-value` コマンド\n *\n * @param target - バインド対象の DOM 要素参照\n * @param value - バインドする状態値(`State<string>` または `Computed<string>`)\n * @returns `bind-value` VanillaCommand\n */\nexport function emitBindValue(\n target: ElementTarget,\n value: ReadableState<string>,\n): VanillaCommand {\n if (isDerivedTemplateState(value)) {\n return { type: 'bind-value', target, stateId: value._parentTemplateId, transform: value._transform };\n }\n return {\n type: 'bind-value',\n target,\n stateId: value._runtimeId,\n };\n}\n\n/**\n * `bind-class-all` コマンドを生成する。\n *\n * 要素のクラス属性を状態値で全置換する購読登録コマンドを返す。\n * Req 4.5: `element.class(state)` → `bind-class-all` コマンド(全置換)\n *\n * @param target - バインド対象の DOM 要素参照\n * @param value - バインドする状態値(`State<string>` または `Computed<string>`)\n * @returns `bind-class-all` VanillaCommand\n */\nexport function emitBindClassAll(\n target: ElementTarget,\n value: ReadableState<string>,\n): VanillaCommand {\n if (isDerivedTemplateState(value)) {\n return { type: 'bind-class-all', target, stateId: value._parentTemplateId, transform: value._transform };\n }\n return {\n type: 'bind-class-all',\n target,\n stateId: value._runtimeId,\n };\n}\n\n/**\n * `bind-class-add` コマンドを生成する。\n *\n * クラス名更新時に「旧クラス削除 → 新クラス付与」の差分操作を行う購読登録コマンドを返す。\n * Req 4.3: `element.addClass(computed)` → `bind-class-add` コマンド(差分操作)\n *\n * @param target - バインド対象の DOM 要素参照\n * @param value - バインドする状態値(`State<string>` または `Computed<string>`)\n * @returns `bind-class-add` VanillaCommand\n */\nexport function emitBindClassAdd(\n target: ElementTarget,\n value: ReadableState<string>,\n): VanillaCommand {\n if (isDerivedTemplateState(value)) {\n return { type: 'bind-class-add', target, stateId: value._parentTemplateId, transform: value._transform };\n }\n return {\n type: 'bind-class-add',\n target,\n stateId: value._runtimeId,\n };\n}\n\n/**\n * `bind-style` コマンドを生成する。\n *\n * 要素の `style[prop]` を状態値で更新する購読登録コマンドを返す。\n * Req 4.4: `element.setStyle(prop, state)` → `bind-style` コマンド\n *\n * @param target - バインド対象の DOM 要素参照\n * @param prop - CSS プロパティ名(例: `'color'`, `'fontSize'`)\n * @param value - バインドする状態値(`State<string>` または `Computed<string>`)\n * @returns `bind-style` VanillaCommand\n */\nexport function emitBindStyle(\n target: ElementTarget,\n prop: string,\n value: ReadableState<string>,\n): VanillaCommand {\n if (isDerivedTemplateState(value)) {\n return { type: 'bind-style', target, prop, stateId: value._parentTemplateId, transform: value._transform };\n }\n return {\n type: 'bind-style',\n target,\n prop,\n stateId: value._runtimeId,\n };\n}\n\n/**\n * `bind-checked` コマンドを生成する。\n *\n * `<input type=\"checkbox\">` / `<input type=\"radio\">` の `checked` プロパティを\n * 状態値にバインドする。`bind-checked` 専用コマンドを使用する。\n *\n * DerivedTemplateState の場合は `_parentTemplateId` を `stateId` として使用し、\n * `transform` を付加する(Req 2.2, 2.3, 5.1)。\n *\n * Req 4.x: `element.checked(state)` → `bind-checked` バインディング\n *\n * @param target - バインド対象の DOM 要素参照\n * @param value - バインドする状態値(`State<boolean>` または `Computed<boolean>`)\n * @returns `bind-checked` VanillaCommand\n */\nexport function emitBindChecked(\n target: ElementTarget,\n value: ReadableState<boolean>,\n): VanillaCommand {\n if (isDerivedTemplateState(value)) {\n return { type: 'bind-checked', target, stateId: value._parentTemplateId, transform: value._transform };\n }\n return {\n type: 'bind-checked',\n target,\n stateId: value._runtimeId,\n };\n}\n\n/**\n * `bind-each` コマンドを生成する。\n *\n * 配列状態の各要素を子要素として動的に描画する購読登録コマンドを返す。\n * Req 4.7: `appendChild(binding: EachBinding)` → `bind-each` コマンド\n *\n * `EachBinding` は `_snapshot` を持つ `EachBindingWithSnapshot<U>` であること。\n * `_snapshot` から `EachTemplateSnapshot` を取り出してコマンドに埋め込む。\n *\n * @param target - 親要素の DOM 要素参照\n * @param binding - `EachBinding<U>` + `_snapshot` を持つバインディング\n * @returns `bind-each` VanillaCommand\n */\nexport function emitBindEach<U>(\n target: ElementTarget,\n binding: EachBindingWithSnapshot<U>,\n): VanillaCommand {\n return {\n type: 'bind-each',\n target,\n stateId: binding._stateId,\n template: binding._snapshot,\n };\n}\n","/**\n * `ScriptStateHandle<T>` の実装。\n *\n * 設計書 `design.md` の「ScriptScope.state / ScriptStateHandle<T>」に対応。\n * ScriptScope 内でハンドラが `s.state(ref).set(v)` / `.update(body)` / `.get()` / `.field(k)`\n * を呼び出すための軽量ファサード。\n *\n * - `.set(value)` → `state-set` コマンドを `VanillaScope._append` に積む\n * - `.update(body)` → `state-update` コマンドを `VanillaScope._append` に積む\n * - `.get()` → `State.get()` と等価な JsExpr を返す(_append しない)\n * - `.field(key)` → フィールドに対応する派生 ScriptStateHandle を返す\n *\n * R-4 決定: 実体は `{ ref: ReadableState<T>, scope: VanillaScope }` のみ。\n *\n * Requirements: 6.1, 6.2, 6.3\n */\n\nimport type { JsExpr } from '../types.js';\nimport type { VanillaScope } from '../vanilla-script-builder.js';\nimport type { ReadableState } from './state.js';\nimport { createStateExpr } from './state.js';\n\n/**\n * ハンドラ内から状態を更新するための軽量ハンドルインタフェース。\n *\n * design.md: ScriptStateHandle<T>\n */\nexport interface ScriptStateHandle<T> {\n /** 参照のみ(State.get と等価)。_append しない */\n get(): JsExpr;\n\n /** `state-set` コマンドを scope に _append する(Req 6.2)*/\n set(value: T | JsExpr): void;\n\n /** `state-update` コマンドを scope に _append する(Req 6.2)*/\n update(body: JsExpr): void;\n\n /** フィールドに対応する派生 ScriptStateHandle を返す(Req 6.1)*/\n field<K extends keyof T>(key: K): ScriptStateHandle<T[K]>;\n}\n\n/**\n * 任意の JsExpr か生値かを判定するタイプガード。\n * `__jsExpr: true` を持つオブジェクトを JsExpr とみなす。\n */\nfunction isJsExpr(value: unknown): value is JsExpr {\n return typeof value === 'object' && value !== null && (value as Record<string, unknown>).__jsExpr === true;\n}\n\n/**\n * 生値(T)を JS リテラル式文字列に変換する内部ユーティリティ。\n * - 文字列・数値・真偽値・null・配列・オブジェクトは JSON.stringify で安全にエンコード。\n */\nfunction encodeValue(value: unknown): string {\n return JSON.stringify(value);\n}\n\n/**\n * ScriptStateHandle<T> の実装クラス。\n *\n * R-4 決定: 実体は `{ runtimeId: string, scope: VanillaScope }` のみ。\n */\nclass ScriptStateHandleImpl<T> implements ScriptStateHandle<T> {\n private readonly _runtimeId: string;\n private readonly _scope: VanillaScope;\n\n constructor(runtimeId: string, scope: VanillaScope) {\n this._runtimeId = runtimeId;\n this._scope = scope;\n }\n\n /**\n * `__draftole__.state(id).get()` 形式の JsExpr を返す。\n * _append しない(式位置専用)。\n * Req 6.1\n */\n get(): JsExpr {\n return createStateExpr(this._runtimeId);\n }\n\n /**\n * `state-set` コマンドを _append する。\n * value が JsExpr の場合はそのまま、T の即値の場合は JSON エンコードする。\n * Req 6.2\n */\n set(value: T | JsExpr): void {\n const valueExpr: JsExpr = isJsExpr(value)\n ? value\n : {\n __jsExpr: true as const,\n code: encodeValue(value),\n eq: (other) => {\n void other;\n throw new Error('eq not supported on encoded literal');\n },\n ne: (other) => {\n void other;\n throw new Error('ne not supported on encoded literal');\n },\n or: (fallback) => {\n void fallback;\n throw new Error('or not supported on encoded literal');\n },\n trim: () => {\n throw new Error('trim not supported on encoded literal');\n },\n isFalsy: () => {\n throw new Error('isFalsy not supported on encoded literal');\n },\n isTruthy: () => {\n throw new Error('isTruthy not supported on encoded literal');\n },\n };\n\n this._scope._append({\n type: 'state-set',\n id: this._runtimeId,\n value: valueExpr,\n });\n }\n\n /**\n * `state-update` コマンドを _append する。\n * Req 6.2\n */\n update(body: JsExpr): void {\n this._scope._append({\n type: 'state-update',\n id: this._runtimeId,\n body,\n });\n }\n\n /**\n * フィールドに対応する派生 ScriptStateHandle を返す。\n * フィールドの runtimeId は `{parentId}.{key}` 形式とする(ランタイムの慣習に準じる)。\n * Req 6.1\n */\n field<K extends keyof T>(key: K): ScriptStateHandle<T[K]> {\n const derivedId = `${this._runtimeId}.${String(key)}`;\n return new ScriptStateHandleImpl<T[K]>(derivedId, this._scope);\n }\n}\n\n/**\n * ReadableState<T> から ScriptStateHandle<T> を生成するファクトリ。\n *\n * ScriptScope の `.state<T>(ref)` メソッドから呼ばれる。\n *\n * @param ref - `_runtimeId` を持つ ReadableState(State / Computed)\n * @param scope - コマンドを _append する VanillaScope\n */\nexport function createScriptStateHandle<T>(\n ref: ReadableState<T>,\n scope: VanillaScope,\n): ScriptStateHandle<T> {\n return new ScriptStateHandleImpl<T>(ref._runtimeId, scope);\n}\n","/**\n * 共有型ガードモジュール。\n *\n * 本モジュールは `dry-violation-fixes` 仕様の Requirement 8\n * 「isReadableState 型ガードの統合」に対応する。\n *\n * `element-methods.ts` と `selector-ref.ts` に重複していたローカル型ガード関数を\n * このモジュールに統合し、単一の信頼できる実装を提供する。\n */\n\nimport type { ReadableState } from './state.js';\n\n/**\n * `ReadableState<T>` かどうかを判別するタイプガード。\n *\n * `_runtimeId` フィールドの存在で判定する(design.md の判別方法)。\n * `element-methods.ts` の旧 `isReadableState` / `selector-ref.ts` の旧 `isState` を統合。\n *\n * @param v - 判定対象の値\n * @returns `v` が `ReadableState<T>` であれば `true`\n */\nexport function isReadableState<T>(v: unknown): v is ReadableState<T> {\n return typeof v === 'object' && v !== null && '_runtimeId' in v;\n}\n","/**\n * `ElementMethods<Self>` 型と `ElementMixin` の実装。\n *\n * 本モジュールは `unified-element-api` 仕様の Task 3.3 に対応し、\n * `HtmlTag` サブクラスへの DOM 操作メソッドの mixin 差し込みを提供する。\n * Task 4.1 で reactive-state 仕様の状態受容オーバーロードを追加した。\n *\n * 設計方針:\n * - `ElementMethods<Self>` は `.on/.setText/.setValue/.setStyle/.addClass/.toggleClass\n * /.removeClass/.appendChild` を定義するジェネリックインターフェース。\n * - `applyElementMixin(proto)` は `HtmlTag` の prototype 上に各メソッドを直接差し込む\n * (module augmentation ではなく composition-root 側で呼び出す)。\n * - 各メソッドは `_scope === undefined` の間は `_pending` バッファに追加し、\n * `_scope` が設定済みの場合は即時 `_scope._append` を呼び出す(遅延解決モデル)。\n * - 文字列引数は `encodeLiteral`(= JSON.stringify)でリテラル化し、`JsExpr` は `.code` を素通し(Req 4.5)。\n * - `on` ハンドラは `ScriptScope` 型の子スコープを受け取り、本体を即時評価してから\n * 文字列化した `handlerCode` を `addEventListener` 命令に埋め込む。\n * - 状態受容経路: `ReadableState<T>` を受け取った場合は `binding-emitter` 経由で\n * `bind-*` コマンドを生成し、`appendCmd` で PendingBuffer に積む(Req 4.1–4.7)。\n *\n * 対応 requirement: 1.1, 1.2, 1.3, 1.4, 1.5, 4.1–4.7 (reactive-state)\n * 依存: Task 2.2 (PendingBuffer), Task 3.1 (ScriptScope), Task 3.2 (ExprFactory.encodeLiteral),\n * Task 3.3 (binding-emitter), Task 2.3 (each-template)\n */\n\nimport { renderCommands, type VanillaCommand } from './commands.js';\nimport type { ElementTarget } from './element-target.js';\nimport { encodeLiteral } from './expr-factory.js';\nimport type { ScriptScope } from './script-scope.ts';\nimport {\n emitBindChecked,\n emitBindClassAdd,\n emitBindClassAll,\n emitBindEach,\n emitBindStyle,\n emitBindText,\n emitBindValue,\n} from './state/binding-emitter.js';\nimport type { EachTemplateSnapshot } from './state/each-template.js';\nimport { createScriptStateHandle } from './state/script-state-handle.js';\nimport type { EachBinding, ReadableState } from './state/state.js';\nimport { isReadableState } from './state/type-guards.js';\nimport type { JsBoolExpr, JsExpr } from './types.ts';\nimport type { ScopeExpr, VanillaScope } from './vanilla-script-builder.ts';\nimport type { HtmlTag } from '../../html/elements/html-tag.js';\nimport type { HtmlAttributeShape } from '../../html/protocols/html-tag-protocol.js';\n\n// ─── TypeScript 型拡張 ────────────────────────────────────────────────────────\n// HtmlTag への ElementMethods 合流は、`html-tag.ts` 同一モジュール内の宣言マージで行う\n// (`export interface HtmlTag extends ElementMethods<HtmlTag>`)。\n// クロスモジュールの `declare module` はバンドル後の相対パス解決に依存するため使わない。\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 公開型定義\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** `on` ハンドラのコールバック型。ハンドラ内では ScriptScope の制御フロー API を利用できる。 */\nexport type HandlerCallback = (s: ScriptScope) => void;\n\n/**\n * アロー関数形式のイベントハンドラ型(handler-serialization Task 2.1)。\n *\n * イベント引数を受け取る形式(`(e: Ev) => void`)と\n * ゼロ引数形式(`() => void`)の両方を受け付ける。\n * `Ev` は `HTMLElementEventMap` のイベント型(例: `MouseEvent`, `InputEvent`)。\n */\nexport type ArrowHandler<Ev extends Event = Event> =\n | (() => void)\n | ((e: Ev) => void);\n\n/**\n * DOM 操作メソッド群を定義するジェネリックインターフェース。\n *\n * `Self` は戻り値型(メソッドチェーンのため)。HtmlTag サブクラスでは `Self = HtmlTag`、\n * `SelectorRef<E>` では `Self = SelectorRef<E>` を渡す。\n * 未定義メソッドはコンパイル時に型エラーとして検出可能(Req 1.4)。\n * 各メソッドは `Self`(= `this`)を返し、CSS チェーンと連結可能(Req 1.5)。\n */\nexport interface ElementMethods<Self> {\n /**\n * 要素にイベントリスナを追加する JS 文を生成する(既存: HandlerCallback 形式)。\n *\n * @param event - `addEventListener` に渡すイベント名(例: `'click'`)\n * @param handler - ハンドラ本体を構築するコールバック。引数 `s` は `ScriptScope`\n */\n on(event: string, handler: HandlerCallback): Self;\n\n /**\n * 要素にイベントリスナを追加する JS 文を生成する(ArrowHandler: keyof HTMLElementEventMap 形式)。\n *\n * イベント名 `K` が `HTMLElementEventMap` のキーのとき、ハンドラ引数 `e` が\n * `HTMLElementEventMap[K]`(例: `click` → `MouseEvent`)として推論される(Req 1.3)。\n *\n * @param event - `HTMLElementEventMap` のキー(例: `'click'`, `'input'`)\n * @param handler - アロー関数形式のハンドラ。`(e: MouseEvent) => void` または `() => void`\n */\n on<K extends keyof HTMLElementEventMap>(\n event: K,\n handler: ArrowHandler<HTMLElementEventMap[K]>,\n ): Self;\n\n /**\n * 要素にイベントリスナを追加する JS 文を生成する(ArrowHandler: 任意イベント名フォールバック)。\n *\n * `HTMLElementEventMap` に存在しないカスタムイベント名向けのフォールバック。\n * ハンドラ引数型は `Event` になる。\n *\n * @param event - 任意のイベント名文字列\n * @param handler - アロー関数形式のハンドラ\n */\n on(event: string, handler: ArrowHandler<Event>): Self;\n\n /**\n * `element.textContent = value` に対応する JS 文を生成する。\n * `ReadableState<string>` を渡すと bind-text コマンドを発行する(Req 4.1)。\n * 即値(string / JsExpr)の場合は setProp textContent を生成する(Req 4.6)。\n */\n setText(value: string | JsExpr | ReadableState<string>): Self;\n\n /**\n * `setText` の便宜エイリアス(R-3 決定)。\n */\n text(value: string | JsExpr | ReadableState<string>): Self;\n\n /**\n * `element.value = value` に対応する JS 文を生成する。\n * `ReadableState<string>` を渡すと bind-value コマンドを発行する(Req 4.2)。\n * 即値(string / JsExpr)の場合は setProp value を生成する(Req 4.6)。\n */\n setValue(value: string | JsExpr | ReadableState<string>): Self;\n\n /**\n * `setValue` の便宜エイリアス(R-3 決定)。\n */\n value(value: string | JsExpr | ReadableState<string>): Self;\n\n /**\n * `element.style[prop] = value` に対応する JS 文を生成する。\n * `ReadableState<string>` を渡すと bind-style コマンドを発行する(Req 4.4)。\n * 即値(string / JsExpr)の場合は setStyle コマンドを生成する(Req 4.6)。\n */\n setStyle(prop: string, value: string | JsExpr | ReadableState<string>): Self;\n\n /**\n * `element.classList.add(name)` に対応する JS 文を生成する。\n * `ReadableState<string>` を渡すと bind-class-add コマンドを発行する(Req 4.3)。\n * 即値(string)の場合は classListAdd を生成する(Req 4.6)。\n */\n addClass(name: string | ReadableState<string>): Self;\n\n /**\n * クラス名全体を状態値で置換する便宜エイリアス(Req 4.5, R-3 決定)。\n * `ReadableState<string>` は bind-class-all コマンドを発行する。\n */\n class(name: string | JsExpr | ReadableState<string>): Self;\n\n /**\n * `input.checked` を状態値にバインドする(Req 4.x)。\n * `ReadableState<boolean>` を受け取り bind-attr(checked)コマンドを発行する。\n */\n checked(value: ReadableState<boolean>): Self;\n\n /**\n * `element.classList.toggle(name, force?)` に対応する JS 文を生成する。\n *\n * @param name - トグル対象のクラス名\n * @param force - 省略時は無条件トグル。`JsBoolExpr` を渡すと force 引数として埋め込む\n */\n toggleClass(name: string, force?: JsBoolExpr): Self;\n\n /**\n * `element.classList.remove(name)` に対応する JS 文を生成する。\n *\n * @param name - 削除するクラス名\n */\n removeClass(name: string): Self;\n\n /**\n * `parent.appendChild(child)` に対応する JS 文を生成する。\n * `EachBinding<U>` を渡すと bind-each コマンドを発行する(Req 4.7)。\n * `HtmlTag` を渡すと通常の appendChild コマンドを生成する(Req 1.1)。\n *\n * @param child - 子として追加する `HtmlTag`(`id` 属性必須)または `EachBinding<U>`\n */\n appendChild<U extends HtmlTag | readonly HtmlTag[]>(child: HtmlTag | EachBinding<U>): Self;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 内部ヘルパー\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * `ElementMixin` が操作する最小インターフェース。\n * `HtmlTag` が持つ `_pending` / `_scope` / `attributes` に対応する。\n */\nexport interface HasPending {\n _pending: VanillaCommand[];\n _scope: VanillaScope | undefined;\n readonly attributes: ReadonlyArray<HtmlAttributeShape>;\n}\n\n/**\n * 要素の `id` 属性から `ElementTarget` を生成する。\n * `binding-emitter` および `renderElementTarget` 経由の selector 系命令で使用する。\n *\n * - `id` 属性が設定されている場合: `{ kind: 'sel', selector: '#${id}' }` を返す(後方互換)。\n * - `id` 属性が設定されていない場合: `{ kind: 'deferred-self' }` を返す(例外を投げない)。\n * render フェーズで id 自動生成後に target が確定する。\n *\n * Requirements: 1.1, 1.2, 1.3, 2.1\n */\nexport function _getElementTarget(el: HasPending): ElementTarget {\n for (const attr of el.attributes) {\n if (attr.key === 'id') {\n const av = attr.attributeValue;\n if (av.type === 'keyValue') {\n return { kind: 'sel', selector: `#${av.value}` };\n }\n }\n }\n return { kind: 'deferred-self' };\n}\n\n/**\n * `EachBinding<U>` かどうかを判別するタイプガード。\n * `_kind === 'each'` で判定する(design.md の判別方法)。\n */\nfunction isEachBinding(v: unknown): v is EachBinding<unknown> & { readonly _snapshot: EachTemplateSnapshot } {\n return (\n typeof v === 'object' &&\n v !== null &&\n (v as EachBinding<unknown>)._kind === 'each' &&\n '_snapshot' in v\n );\n}\n\n/**\n * `_scope` の状態に応じてコマンドをバッファまたは即時発行する。\n * - `_scope === undefined`: `_pending` へ push(遅延解決モデル: Unbound 状態)\n * - `_scope !== undefined`: `_scope._append` を直接呼ぶ(Bound 状態)\n */\nfunction appendCmd(el: HasPending, cmd: VanillaCommand): void {\n if (el._scope !== undefined) {\n el._scope._append(cmd);\n } else {\n el._pending.push(cmd);\n }\n}\n\n/**\n * `handler.toString()` の先頭に `function` キーワードがあるかを判定する粗いチェック。\n *\n * `function` キーワードがなければアロー関数(または class メソッド等)と見なす。\n * 本体の構文解析はせず、実行時コストを最小化する(design.md D-5)。\n *\n * @returns `true` の場合、アロー関数形式(transformer 未適用の素のアロー)と判定する\n */\nexport function isArrowShape(fn: (...args: unknown[]) => unknown): boolean {\n return !fn.toString().trimStart().startsWith('function');\n}\n\n/**\n * イベントハンドラ本体用の最小 `ScriptScope` を生成する内部ファクトリ。\n *\n * `VanillaScope._childScope` と同等のパターンを inline で実装し、\n * 追加で `ScriptScope` 固有の `.if` / `.fn` / `.onDomReady` を提供する。\n * `fn` と `onDomReady` はハンドラスコープ内では意味をなさないため、\n * 呼ばれた場合はエラーをスローする。\n *\n * この実装は `vanilla-script-builder.ts` 内の `createScope` と同じパターンを用いるが、\n * 内部関数は export されていないため、ここで独立して再実装する。\n *\n * @param queue - コマンドを積むバッファ\n * @param handlerBodyTarget - `_emitHandlerBody` で使う `handler-body` コマンドのターゲット。\n * transformer 経由の dispatcher 経路でのみ指定する。\n * @param handlerBodyEvent - `_emitHandlerBody` で使うイベント名。transformer 経路でのみ指定。\n */\nexport function _makeHandlerScope(\n queue: VanillaCommand[],\n handlerBodyTarget?: ElementTarget,\n handlerBodyEvent?: string,\n): ScriptScope {\n function make(q: VanillaCommand[]): ScriptScope {\n function buildIf(\n condition: ScopeExpr,\n then: (s: ScriptScope) => void,\n orElse: ((s: ScriptScope) => void) | undefined,\n ): void {\n const thenQ: VanillaCommand[] = [];\n then(make(thenQ));\n const thenCode = renderCommands(thenQ, ' ');\n if (orElse !== undefined) {\n const elseQ: VanillaCommand[] = [];\n orElse(make(elseQ));\n q.push({ type: 'if', condition: condition.code, thenCode, elseCode: renderCommands(elseQ, ' ') });\n } else {\n q.push({ type: 'if', condition: condition.code, thenCode });\n }\n }\n\n const scope: ScriptScope = {\n _append(cmd) {\n q.push(cmd);\n },\n _childScope(innerQ) {\n return make(innerQ);\n },\n raw(code): ScopeExpr {\n return { code };\n },\n let(name, value): ScopeExpr {\n q.push({ type: 'declareConst', name, expr: value.code });\n return { code: name };\n },\n call(name, args): ScopeExpr {\n const argList = (args ?? []).map((a) => a.code).join(', ');\n const code = `${name}(${argList})`;\n q.push({ type: 'expr', code });\n return { code };\n },\n return() {\n q.push({ type: 'raw', code: 'return;' });\n },\n ifThen(condition, then, orElse) {\n buildIf(condition, (s) => then(s), orElse === undefined ? undefined : (s) => orElse(s));\n },\n if(condition, then, orElse) {\n buildIf(condition, then, orElse);\n },\n fn() {\n throw new Error(\n 'ElementMixin: fn() is not supported in event handler scope. ' +\n 'Use root.script.fn() to define top-level functions.',\n );\n },\n onDomReady() {\n throw new Error(\n 'ElementMixin: onDomReady() is not supported in event handler scope. ' +\n 'Use root.script.onDomReady() to register DOMContentLoaded handlers.',\n );\n },\n state<T>(ref: ReadableState<T>) {\n return createScriptStateHandle(ref, scope);\n },\n _emitHandlerBody(code: string, params: readonly string[]) {\n if (handlerBodyTarget === undefined || handlerBodyEvent === undefined) {\n throw new Error(\n 'ElementMixin: _emitHandlerBody() called on a scope not configured for handler-body emission. ' +\n 'This method is only available in the transformer-emitted handler scope.',\n );\n }\n q.push({ type: 'handler-body', target: handlerBodyTarget, event: handlerBodyEvent, code, params });\n },\n };\n return scope;\n }\n return make(queue);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Mixin 適用関数\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * `HtmlTag` の prototype に `ElementMethods` の各メソッドを差し込む。\n *\n * `composition-root.ts` から一度だけ呼ばれることを想定する。\n * 二重適用は無害だが不要。\n *\n * 実装上の注意: `proto` のキャストは `HtmlTag` が抽象クラスであり、\n * TypeScript 上は具象サブクラスのプロトタイプを渡すことができないため\n * `unknown` を介したキャストを使用する。\n */\nexport function applyElementMixin(proto: HtmlTag): void {\n const p = proto as unknown as Record<string, unknown>;\n\n p['on'] = function on(this: HasPending, event: string, handler: HandlerCallback): typeof this {\n // dispatcher: transformer 経由(_draftoleEmitted マーカー)\n if ((handler as unknown as { _draftoleEmitted?: boolean })._draftoleEmitted === true) {\n const elementTarget = _getElementTarget(this);\n const bodyQueue: VanillaCommand[] = [];\n const childScope = _makeHandlerScope(bodyQueue, elementTarget, event);\n handler(childScope);\n // _emitHandlerBody が handler-body コマンドを bodyQueue に積んでいるのでそのまま転送\n for (const cmd of bodyQueue) {\n appendCmd(this, cmd);\n }\n return this;\n }\n\n // dispatcher: 未変換アロー関数 safety net\n if (isArrowShape(handler as unknown as (...args: unknown[]) => unknown)) {\n throw new Error(\n 'DraftOle: arrow-function handler requires the draftole TypeScript transformer; see docs/api/handler-serialization.md',\n );\n }\n\n // dispatcher: 従来の HandlerCallback 経路\n const bodyQueue: VanillaCommand[] = [];\n const childScope = _makeHandlerScope(bodyQueue);\n handler(childScope);\n const bodyCode = renderCommands(bodyQueue, ' ');\n const handlerCode = bodyCode.length === 0 ? '(e) => {}' : `(e) => {\\n${bodyCode}\\n}`;\n appendCmd(this, { type: 'addEventListener', target: _getElementTarget(this), event, handlerCode });\n return this;\n };\n\n p['setText'] = function setText(this: HasPending, value: string | JsExpr | ReadableState<string>): typeof this {\n if (isReadableState<string>(value)) {\n appendCmd(this, emitBindText(_getElementTarget(this), value));\n } else {\n appendCmd(this, { type: 'setProp', target: _getElementTarget(this), prop: 'textContent', expr: encodeLiteral(value) });\n }\n return this;\n };\n\n p['text'] = function text(this: HasPending, value: string | JsExpr | ReadableState<string>): typeof this {\n return (p['setText'] as (this: HasPending, v: string | JsExpr | ReadableState<string>) => typeof this).call(this, value);\n };\n\n p['setValue'] = function setValue(this: HasPending, value: string | JsExpr | ReadableState<string>): typeof this {\n if (isReadableState<string>(value)) {\n appendCmd(this, emitBindValue(_getElementTarget(this), value));\n } else {\n appendCmd(this, { type: 'setProp', target: _getElementTarget(this), prop: 'value', expr: encodeLiteral(value) });\n }\n return this;\n };\n\n p['value'] = function value(this: HasPending, v: string | JsExpr | ReadableState<string>): typeof this {\n return (p['setValue'] as (this: HasPending, v: string | JsExpr | ReadableState<string>) => typeof this).call(this, v);\n };\n\n p['setStyle'] = function setStyle(\n this: HasPending,\n prop: string,\n value: string | JsExpr | ReadableState<string>,\n ): typeof this {\n if (isReadableState<string>(value)) {\n appendCmd(this, emitBindStyle(_getElementTarget(this), prop, value));\n } else {\n appendCmd(this, {\n type: 'setStyle',\n target: _getElementTarget(this),\n key: prop,\n expr: encodeLiteral(value),\n });\n }\n return this;\n };\n\n // NOTE: `HtmlTag` に既存の getter `style` がある(`this._css.styleManager.style` を返す)。\n // `style` という名前でメソッドを登録すると既存 getter が隠蔽されて互換性が壊れるため、\n // `style` エイリアスは登録しない。`setStyle` オーバーロードで同等の機能を提供する。\n // design.md の R-3 決定では便宜エイリアスとして挙げられているが、\n // 本プロジェクトの HtmlTag.style getter との競合を優先して未実装とする。\n\n p['addClass'] = function addClass(this: HasPending, name: string | ReadableState<string>): typeof this {\n if (isReadableState<string>(name)) {\n appendCmd(this, emitBindClassAdd(_getElementTarget(this), name));\n } else {\n appendCmd(this, { type: 'classListAdd', target: _getElementTarget(this), name });\n }\n return this;\n };\n\n p['class'] = function cls(this: HasPending, name: string | JsExpr | ReadableState<string>): typeof this {\n if (isReadableState<string>(name)) {\n appendCmd(this, emitBindClassAll(_getElementTarget(this), name));\n } else {\n // 即値経路: classListAdd として扱う(文字列のみ; JsExpr は name.code を使用)\n const nameStr = typeof name === 'string' ? name : name.code;\n appendCmd(this, { type: 'classListAdd', target: _getElementTarget(this), name: nameStr });\n }\n return this;\n };\n\n p['checked'] = function checked(this: HasPending, value: ReadableState<boolean>): typeof this {\n appendCmd(this, emitBindChecked(_getElementTarget(this), value));\n return this;\n };\n\n p['toggleClass'] = function toggleClass(\n this: HasPending,\n name: string,\n force?: JsBoolExpr,\n ): typeof this {\n appendCmd(this, {\n type: 'classListToggle',\n target: _getElementTarget(this),\n name,\n force: force?.code,\n });\n return this;\n };\n\n p['removeClass'] = function removeClass(this: HasPending, name: string): typeof this {\n appendCmd(this, { type: 'classListRemove', target: _getElementTarget(this), name });\n return this;\n };\n\n p['appendChild'] = function appendChild(\n this: HasPending,\n child: HasPending | (EachBinding<unknown> & { readonly _snapshot: EachTemplateSnapshot }),\n ): typeof this {\n if (isEachBinding(child)) {\n appendCmd(this, emitBindEach(_getElementTarget(this), child));\n } else {\n const parentTarget = _getElementTarget(this);\n const childTarget = _getElementTarget(child as HasPending);\n appendCmd(this, { type: 'appendChild', parent: parentTarget, child: childTarget });\n // each テンプレート factory コード生成時に子要素ツリーを再現するため、\n // appendChild 経路で渡された子 HtmlTag を記録する(addChild とは別の経路)。\n const selfTag = this as unknown as { _appendedChildren?: HtmlTag[] };\n if (Array.isArray(selfTag._appendedChildren)) {\n selfTag._appendedChildren.push(child as unknown as HtmlTag);\n }\n }\n return this;\n };\n}\n","/**\n * `FrameOptions` の値変換ロジックを純関数化した helper module。\n *\n * `html-tag.ts` の `.frame()` メソッドからインラインで実装されていた\n * 「数値 → `{n}px` / `Infinity` → `'100%'`(maxWidth / maxHeight のみ)/\n * 文字列素通し」の変換を、`toCssValue` / `applyFrame` の 2 関数として\n * export する。`applyFrame` は副作用として `host` の既存 public method\n * (`width` / `height` / `minWidth` / `maxWidth` / `minHeight` / `maxHeight`)\n * を呼び出すのみで、`host` の internal フィールドには直接触らない。\n *\n * 戻り値は `void`。method chain の `this` 返却は呼び出し元 `html-tag.ts`\n * 側の責務とする。\n *\n * Requirements: 6.1\n * Design: design.md \"Components and Interfaces\" → `_internal/frame-options.ts`\n * (Service Interface) / \"Allowed Dependencies\"\n *\n * @internal\n */\nimport type { HtmlTagHost } from './host-types.js';\nimport type { FrameOptions } from '../html-tag.js';\n\n/**\n * `number` / `string` / `Infinity` を CSS 値文字列へ変換する純関数。\n *\n * 変換ルール:\n * - `number`(`Infinity` 以外)→ `{n}px`\n * - `Infinity` かつ `allowInfinity === true` → `'100%'`\n * (呼び出し元が `maxWidth` / `maxHeight` の場合のみ true を渡す)\n * - `string` → そのまま素通し\n *\n * @param v - 変換対象の値\n * @param allowInfinity - `Infinity` を `'100%'` に変換することを許可するか\n * @returns CSS 値として使用可能な文字列\n *\n * @internal\n */\nexport function toCssValue(v: number | string, allowInfinity: boolean = false): string {\n if (typeof v === 'number') {\n if (allowInfinity && v === Infinity) return '100%';\n return `${v}px`;\n }\n return v;\n}\n\n/**\n * `FrameOptions` を `host` に適用する純関数(副作用付き mutator)。\n *\n * 既存 `.frame()` と同一順序で `host` の 6 種 setter\n * (`width` / `height` / `minWidth` / `maxWidth` / `minHeight` / `maxHeight`)\n * を呼び出す。`maxWidth` と `maxHeight` のみ `Infinity` → `'100%'` 変換を許可する。\n *\n * 戻り値は `void`。method chain の `this` 返却は呼び出し元の責務。\n *\n * @param host - 設定対象の `HtmlTag` インスタンス\n * @param options - 適用する frame オプション\n *\n * @internal\n */\nexport function applyFrame(host: HtmlTagHost, options: FrameOptions): void {\n if (options.width !== undefined) host.width(toCssValue(options.width));\n if (options.height !== undefined) host.height(toCssValue(options.height));\n if (options.minWidth !== undefined) host.minWidth(toCssValue(options.minWidth));\n if (options.maxWidth !== undefined) host.maxWidth(toCssValue(options.maxWidth, true));\n if (options.minHeight !== undefined) host.minHeight(toCssValue(options.minHeight));\n if (options.maxHeight !== undefined) host.maxHeight(toCssValue(options.maxHeight, true));\n}\n","export const Breakpoints = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n} as const;\n\nexport type BreakpointKey = keyof typeof Breakpoints;\n\nexport interface BreakpointStyles {\n sm?: Partial<CSSStyleDeclaration>;\n md?: Partial<CSSStyleDeclaration>;\n lg?: Partial<CSSStyleDeclaration>;\n xl?: Partial<CSSStyleDeclaration>;\n [customPx: number]: Partial<CSSStyleDeclaration> | undefined;\n}\n","/**\n * `BreakpointStyles` の適用ロジックを純関数化した helper module。\n *\n * `html-tag.ts` の `.responsive()` メソッドからインラインで実装されていた\n * 「名前付きキー(sm/md/lg/xl)の `Breakpoints` 定数解決 / 数値キーの直接利用 /\n * 無効値スキップ / `typeof value === 'string'` の props 採用 /\n * `host.css.addMediaRule(bp, props)` 呼び出し」を、`applyResponsive` 関数として\n * export する。`host` の internal フィールドには触らず、公開 getter\n * `host.css` の `addMediaRule` のみを副作用として呼び出す。\n *\n * 戻り値は `void`。method chain の `this` 返却は呼び出し元 `html-tag.ts`\n * 側の責務とする。\n *\n * Requirements: 6.2\n * Design: design.md \"Components and Interfaces\" → `_internal/breakpoint-applier.ts`\n * (Service Interface) / \"Allowed Dependencies\"\n *\n * @internal\n */\nimport { Breakpoints, type BreakpointStyles } from '../../../css/constants/breakpoints.js';\nimport type { HtmlTagHost } from './host-types.js';\n\n/**\n * `BreakpointStyles` を `host` に適用する純関数(副作用付き mutator)。\n *\n * 既存 `.responsive()` と同一順序・同一引数で `host.css.addMediaRule(bp, props)`\n * を呼び出す。挙動詳細:\n *\n * - `styles === undefined` のキーはスキップ\n * - 名前付きキー(`'sm' | 'md' | 'lg' | 'xl'`)は `Breakpoints` 定数で数値に解決\n * - その他のキーは `Number(key)` で数値化(数値キー / 文字列数値の両方を許容)\n * - `!Number.isFinite(bp) || bp <= 0` の breakpoint はスキップ\n * - `Partial<CSSStyleDeclaration>` の各プロパティのうち `typeof value === 'string'`\n * のものだけを props として採用(undefined / number 等は除外)\n * - 採用 props が 1 件以上ある場合にのみ `host.css.addMediaRule(bp, props)` を呼ぶ\n *\n * 戻り値は `void`。method chain の `this` 返却は呼び出し元の責務。\n *\n * @param host - 設定対象の `HtmlTag` インスタンス\n * @param options - 適用するレスポンシブスタイル定義\n *\n * @internal\n */\nexport function applyResponsive(host: HtmlTagHost, options: BreakpointStyles): void {\n for (const [key, styles] of Object.entries(options)) {\n if (styles === undefined) continue;\n const bp = key in Breakpoints\n ? Breakpoints[key as keyof typeof Breakpoints]\n : Number(key);\n if (!Number.isFinite(bp) || bp <= 0) continue;\n const props: Record<string, string> = {};\n for (const [prop, value] of Object.entries(styles as Partial<CSSStyleDeclaration>)) {\n if (typeof value === 'string') {\n props[prop] = value;\n }\n }\n if (Object.keys(props).length > 0) {\n host.css.addMediaRule(bp, props);\n }\n }\n}\n","/**\n * HTML属性値のdiscriminated union型と factory 関数\n *\n * Swift版 HtmlAttributeValue に対応する TypeScript 型定義と、\n * 各 variant の安全な生成を支援する factory 関数群を提供する。\n */\n\n// ============================================================\n// HtmlAttributeValue - discriminated union (3 variants)\n// ============================================================\n\n/**\n * Represents a boolean HTML attribute (e.g., disabled, checked, hidden).\n *\n * @remarks\n * Boolean attributes render as just the attribute name without a value.\n *\n * @example\n * ```typescript\n * const value: BooleanAttributeValue = { type: 'boolean' };\n * // Renders as: 'disabled' (not 'disabled=\"true\"')\n * ```\n */\nexport interface BooleanAttributeValue {\n readonly type: 'boolean';\n}\n\n/**\n * Represents a key-value HTML attribute (e.g., id=\"main\", class=\"container\").\n *\n * @remarks\n * Key-value attributes render as `key=\"value\"` with the value automatically HTML-escaped.\n *\n * @example\n * ```typescript\n * const value: KeyValueAttributeValue = { type: 'keyValue', value: 'main-content' };\n * // Renders as: 'id=\"main-content\"'\n * ```\n */\nexport interface KeyValueAttributeValue {\n readonly type: 'keyValue';\n readonly value: string;\n}\n\n/**\n * Represents a custom data-* HTML attribute (e.g., data-theme=\"dark\").\n *\n * @remarks\n * Custom attributes render as `data-{name}=\"{value}\"` with the value automatically HTML-escaped.\n *\n * @example\n * ```typescript\n * const value: CustomAttributeValue = { type: 'custom', name: 'theme', value: 'dark' };\n * // Renders as: 'data-theme=\"dark\"'\n * ```\n */\nexport interface CustomAttributeValue {\n readonly type: 'custom';\n readonly name: string;\n readonly value: string;\n}\n\n/**\n * Discriminated union type for all HTML attribute value types.\n *\n * @remarks\n * This type enables type-safe handling of different attribute value types\n * using TypeScript's discriminated union pattern.\n *\n * @example\n * ```typescript\n * function renderValue(attrValue: HtmlAttributeValue): string {\n * switch (attrValue.type) {\n * case 'boolean':\n * return 'attribute-name';\n * case 'keyValue':\n * return `attribute-name=\"${attrValue.value}\"`;\n * case 'custom':\n * return `data-${attrValue.name}=\"${attrValue.value}\"`;\n * }\n * }\n * ```\n */\nexport type HtmlAttributeValue =\n | BooleanAttributeValue\n | KeyValueAttributeValue\n | CustomAttributeValue;\n\n// ── Factory Functions ──\n\n/**\n * Creates a boolean attribute value.\n *\n * @returns A BooleanAttributeValue instance\n *\n * @example\n * ```typescript\n * const disabled = createBooleanValue();\n * // Returns: { type: 'boolean' }\n * ```\n */\nexport function createBooleanValue(): BooleanAttributeValue {\n return { type: 'boolean' };\n}\n\n/**\n * Creates a key-value attribute value.\n *\n * @param value - The attribute value\n * @returns A KeyValueAttributeValue instance\n *\n * @example\n * ```typescript\n * const id = createKeyValueValue('main-content');\n * // Returns: { type: 'keyValue', value: 'main-content' }\n * ```\n */\nexport function createKeyValueValue(value: string): KeyValueAttributeValue {\n return { type: 'keyValue', value };\n}\n\n/**\n * Creates a custom data-* attribute value.\n *\n * @param name - The data attribute name (without 'data-' prefix)\n * @param value - The attribute value\n * @returns A CustomAttributeValue instance\n *\n * @example\n * ```typescript\n * const theme = createCustomValue('theme', 'dark');\n * // Returns: { type: 'custom', name: 'theme', value: 'dark' }\n * ```\n */\nexport function createCustomValue(name: string, value: string): CustomAttributeValue {\n return { type: 'custom', name, value };\n}\n","/**\n * Task 2.1 + 2.2: HtmlAttribute クラス\n *\n * Boolean・KeyValue・カスタムdata-*・ARIA属性の生成とHTML文字列レンダリング\n * class名の重複除去・正規化、属性値のHTMLエスケープ\n *\n * Requirements: 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 10.3, 10.4\n */\nimport type { HtmlAttributeShape } from '../protocols/html-tag-protocol.js';\nimport type {\n HtmlAttributeValue,\n BooleanAttributeKey,\n KeyValueAttributeKey,\n AriaAttributeKey,\n InputType,\n ButtonType,\n} from './attribute-keys.js';\nimport {\n createBooleanValue,\n createKeyValueValue,\n createCustomValue,\n} from './attribute-keys.js';\n\n/**\n * Escapes special HTML characters to prevent XSS attacks.\n *\n * Converts the following characters to their HTML entity equivalents:\n * - `&` → `&`\n * - `<` → `<`\n * - `>` → `>`\n * - `\"` → `"`\n * - `'` → `'`\n *\n * @param value - The string to escape\n * @returns The escaped string safe for use in HTML attribute values\n *\n * @remarks\n * This function is automatically called by {@link HtmlAttribute.renderAttribute}\n * to prevent Cross-Site Scripting (XSS) attacks when rendering attribute values.\n *\n * @example\n * ```typescript\n * escapeHtml('<script>alert(\"XSS\")</script>');\n * // Returns: '<script>alert("XSS")</script>'\n *\n * escapeHtml(\"It's a \\\"test\\\"\");\n * // Returns: 'It's a "test"'\n * ```\n *\n * @see {@link HtmlAttribute.renderAttribute} for usage in attribute rendering\n */\n/**\n * URL attributes that should be sanitized against dangerous schemes.\n * @internal\n */\nconst URL_ATTRIBUTES = new Set(['href', 'src', 'action', 'formaction']);\n\n/**\n * Dangerous URI schemes that can execute code.\n * @internal\n */\nconst DANGEROUS_SCHEME_PATTERN = /^\\s*(javascript|vbscript|data)\\s*:/i;\n\n/**\n * Sanitizes a URL attribute value by rejecting dangerous schemes.\n *\n * Replaces `javascript:`, `vbscript:`, and `data:` scheme URLs with\n * an empty string to prevent XSS attacks via attribute injection.\n *\n * @param key - The attribute key\n * @param value - The attribute value\n * @returns The sanitized value (empty string if dangerous scheme detected)\n *\n * @example\n * ```typescript\n * sanitizeUrlAttribute('href', 'javascript:alert(1)'); // Returns: ''\n * sanitizeUrlAttribute('href', 'https://example.com'); // Returns: 'https://example.com'\n * sanitizeUrlAttribute('id', 'javascript:foo'); // Returns: 'javascript:foo' (not a URL attr)\n * ```\n */\nexport function sanitizeUrlAttribute(key: string, value: string): string {\n if (!URL_ATTRIBUTES.has(key)) return value;\n if (DANGEROUS_SCHEME_PATTERN.test(value)) return '';\n return value;\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Normalizes and deduplicates CSS class names.\n *\n * Processes an array of class name strings by:\n * 1. Trimming each entry\n * 2. Splitting on whitespace\n * 3. Removing empty strings\n * 4. Removing duplicates while preserving first occurrence order\n *\n * @param names - Array of class name strings (may contain whitespace-separated classes)\n * @returns A single space-separated string of unique class names\n *\n * @remarks\n * This function is automatically called by {@link HtmlAttribute.className} to ensure\n * class attributes are clean and efficient.\n *\n * @example\n * ```typescript\n * normalizeClassNames(['btn', 'btn-primary']);\n * // Returns: 'btn btn-primary'\n *\n * normalizeClassNames(['btn btn-primary', 'btn-large', 'btn']);\n * // Returns: 'btn btn-primary btn-large' (duplicate 'btn' removed)\n *\n * normalizeClassNames([' container ', '', 'flex gap-4']);\n * // Returns: 'container flex gap-4' (trimmed and empty strings removed)\n * ```\n *\n * @see {@link HtmlAttribute.className} for usage with class attributes\n */\nexport function normalizeClassNames(names: string[]): string {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const entry of names) {\n const parts = entry.trim().split(/\\s+/);\n for (const part of parts) {\n if (part !== '' && !seen.has(part)) {\n seen.add(part);\n result.push(part);\n }\n }\n }\n return result.join(' ');\n}\n\n/**\n * Type-safe representation of an HTML attribute with automatic escaping.\n *\n * Provides factory methods for creating boolean, key-value, custom data-*, and ARIA attributes.\n * All attribute values are automatically HTML-escaped when rendered to prevent XSS attacks.\n *\n * @remarks\n * This class implements {@link HtmlAttributeShape} and uses a discriminated union type\n * ({@link HtmlAttributeValue}) to represent different attribute types safely.\n *\n * @example\n * ```typescript\n * // Boolean attribute\n * const disabled = HtmlAttribute.boolean('disabled');\n * disabled.renderAttribute(); // Returns: 'disabled'\n *\n * // Key-value attribute\n * const id = HtmlAttribute.keyValue('id', 'main-content');\n * id.renderAttribute(); // Returns: 'id=\"main-content\"'\n *\n * // Class attribute (with normalization)\n * const classes = HtmlAttribute.className('btn', 'btn-primary btn', 'btn-large');\n * classes.renderAttribute(); // Returns: 'class=\"btn btn-primary btn-large\"'\n *\n * // Custom data attribute\n * const theme = HtmlAttribute.custom('theme', 'dark');\n * theme.renderAttribute(); // Returns: 'data-theme=\"dark\"'\n * ```\n *\n * @see {@link HtmlAttributeValue} for the discriminated union type\n * @see {@link escapeHtml} for XSS prevention details\n */\nexport class HtmlAttribute implements HtmlAttributeShape {\n /** The attribute key (e.g., 'id', 'class', 'disabled') */\n readonly key: string;\n\n /** The attribute value (discriminated union of boolean, key-value, or custom) */\n readonly attributeValue: HtmlAttributeValue;\n\n private constructor(key: string, attributeValue: HtmlAttributeValue) {\n this.key = key;\n this.attributeValue = attributeValue;\n }\n\n // ── Factory Methods ──\n\n /**\n * Creates a boolean attribute (e.g., disabled, checked, hidden).\n *\n * @param key - A valid boolean attribute key\n * @returns A new HtmlAttribute instance representing a boolean attribute\n *\n * @example\n * ```typescript\n * const disabled = HtmlAttribute.boolean('disabled');\n * disabled.renderAttribute(); // Returns: 'disabled'\n *\n * const checked = HtmlAttribute.boolean('checked');\n * checked.renderAttribute(); // Returns: 'checked'\n * ```\n *\n * @see {@link BooleanAttributeKey} for all valid boolean attribute keys\n */\n static boolean(key: BooleanAttributeKey): HtmlAttribute {\n return new HtmlAttribute(key, createBooleanValue());\n }\n\n /**\n * Creates a key-value attribute (e.g., id=\"main\", title=\"tooltip\").\n *\n * @param key - A valid key-value or ARIA attribute key\n * @param value - The attribute value (will be HTML-escaped when rendered)\n * @returns A new HtmlAttribute instance representing a key-value attribute\n *\n * @example\n * ```typescript\n * const id = HtmlAttribute.keyValue('id', 'main-content');\n * id.renderAttribute(); // Returns: 'id=\"main-content\"'\n *\n * const href = HtmlAttribute.keyValue('href', '/path?q=<script>');\n * href.renderAttribute(); // Returns: 'href=\"/path?q=<script>\"'\n * ```\n *\n * @see {@link KeyValueAttributeKey} for all valid key-value attribute keys\n * @see {@link AriaAttributeKey} for all valid ARIA attribute keys\n */\n static keyValue(key: KeyValueAttributeKey | AriaAttributeKey, value: string): HtmlAttribute {\n return new HtmlAttribute(key, createKeyValueValue(value));\n }\n\n /**\n * Creates a class attribute with automatic normalization and deduplication.\n *\n * @param names - One or more class name strings (may contain whitespace-separated classes)\n * @returns A new HtmlAttribute instance representing a normalized class attribute\n *\n * @remarks\n * Class names are automatically:\n * - Trimmed\n * - Split on whitespace\n * - Deduplicated (first occurrence preserved)\n * - Joined with single spaces\n *\n * @example\n * ```typescript\n * const classes = HtmlAttribute.className('btn', 'btn-primary');\n * classes.renderAttribute(); // Returns: 'class=\"btn btn-primary\"'\n *\n * const normalized = HtmlAttribute.className('btn btn-primary', 'btn-large', 'btn');\n * normalized.renderAttribute(); // Returns: 'class=\"btn btn-primary btn-large\"'\n * ```\n *\n * @see {@link normalizeClassNames} for normalization details\n */\n static className(...names: string[]): HtmlAttribute {\n return new HtmlAttribute('class', createKeyValueValue(normalizeClassNames(names)));\n }\n\n /**\n * Creates a custom data-* attribute.\n *\n * @param name - The data attribute name (without 'data-' prefix)\n * @param value - The attribute value (will be HTML-escaped when rendered)\n * @returns A new HtmlAttribute instance representing a custom data attribute\n *\n * @example\n * ```typescript\n * const theme = HtmlAttribute.custom('theme', 'dark');\n * theme.renderAttribute(); // Returns: 'data-theme=\"dark\"'\n *\n * const userId = HtmlAttribute.custom('user-id', '12345');\n * userId.renderAttribute(); // Returns: 'data-user-id=\"12345\"'\n * ```\n */\n static custom(name: string, value: string): HtmlAttribute {\n return new HtmlAttribute(`data-${name}`, createCustomValue(name, value));\n }\n\n /**\n * Creates an aria-label attribute.\n *\n * @param label - The accessible label text\n * @returns A new HtmlAttribute instance for aria-label\n *\n * @example\n * ```typescript\n * const label = HtmlAttribute.ariaLabel('Close dialog');\n * label.renderAttribute(); // Returns: 'aria-label=\"Close dialog\"'\n * ```\n */\n static ariaLabel(label: string): HtmlAttribute {\n return HtmlAttribute.keyValue('aria-label', label);\n }\n\n /**\n * Creates an aria-hidden attribute.\n *\n * @param hidden - Whether the element should be hidden from assistive technologies\n * @returns A new HtmlAttribute instance for aria-hidden\n *\n * @example\n * ```typescript\n * const hidden = HtmlAttribute.ariaHidden(true);\n * hidden.renderAttribute(); // Returns: 'aria-hidden=\"true\"'\n * ```\n */\n static ariaHidden(hidden: boolean): HtmlAttribute {\n return HtmlAttribute.keyValue('aria-hidden', String(hidden));\n }\n\n /**\n * Creates an aria-expanded attribute.\n *\n * @param expanded - Whether the element is currently expanded\n * @returns A new HtmlAttribute instance for aria-expanded\n *\n * @example\n * ```typescript\n * const expanded = HtmlAttribute.ariaExpanded(false);\n * expanded.renderAttribute(); // Returns: 'aria-expanded=\"false\"'\n * ```\n */\n static ariaExpanded(expanded: boolean): HtmlAttribute {\n return HtmlAttribute.keyValue('aria-expanded', String(expanded));\n }\n\n /**\n * Creates a type attribute for input elements.\n *\n * @param type - A valid HTML input type\n * @returns A new HtmlAttribute instance for input type\n *\n * @example\n * ```typescript\n * const emailInput = HtmlAttribute.inputType('email');\n * emailInput.renderAttribute(); // Returns: 'type=\"email\"'\n *\n * const checkbox = HtmlAttribute.inputType('checkbox');\n * checkbox.renderAttribute(); // Returns: 'type=\"checkbox\"'\n * ```\n *\n * @see {@link InputType} for all valid input types\n */\n static inputType(type: InputType): HtmlAttribute {\n return new HtmlAttribute('type', createKeyValueValue(type));\n }\n\n /**\n * Creates a type attribute for button elements.\n *\n * @param type - A valid HTML button type ('submit', 'reset', or 'button')\n * @returns A new HtmlAttribute instance for button type\n *\n * @example\n * ```typescript\n * const submit = HtmlAttribute.buttonType('submit');\n * submit.renderAttribute(); // Returns: 'type=\"submit\"'\n *\n * const reset = HtmlAttribute.buttonType('reset');\n * reset.renderAttribute(); // Returns: 'type=\"reset\"'\n * ```\n *\n * @see {@link ButtonType} for all valid button types\n */\n static buttonType(type: ButtonType): HtmlAttribute {\n return new HtmlAttribute('type', createKeyValueValue(type));\n }\n\n // ── Rendering ──\n\n /**\n * Renders the attribute as an HTML string.\n *\n * @returns The rendered attribute string\n *\n * @remarks\n * - Boolean attributes render as just the key (e.g., 'disabled')\n * - Key-value attributes render as key=\"value\" with escaped values\n * - Custom attributes render as data-name=\"value\" with escaped values\n *\n * All attribute values are automatically HTML-escaped to prevent XSS attacks.\n *\n * @example\n * ```typescript\n * HtmlAttribute.boolean('disabled').renderAttribute();\n * // Returns: 'disabled'\n *\n * HtmlAttribute.keyValue('id', 'main').renderAttribute();\n * // Returns: 'id=\"main\"'\n *\n * HtmlAttribute.custom('theme', 'dark').renderAttribute();\n * // Returns: 'data-theme=\"dark\"'\n * ```\n *\n * @see {@link escapeHtml} for HTML escaping details\n */\n renderAttribute(): string {\n switch (this.attributeValue.type) {\n case 'boolean':\n return this.key;\n case 'keyValue': {\n const sanitized = sanitizeUrlAttribute(this.key, this.attributeValue.value);\n return `${this.key}=\"${escapeHtml(sanitized)}\"`;\n }\n case 'custom':\n return `data-${this.attributeValue.name}=\"${escapeHtml(this.attributeValue.value)}\"`;\n }\n }\n}\n","/**\n * `protoRender` の補助ロジック 4 段を純関数化した helper module。\n *\n * `html-tag.ts` の `protoRender` メソッドからインラインで実装されていた以下の\n * 4 つの副作用段階を、固定順序で呼び出される export 関数として提供する:\n *\n * 1. `flushPendingStyleTemplates(host, ctx)` —\n * `_pendingStyleTemplates` を `tagPath` 確定後に `CssManager.registerTemplate`\n * へ転送し、解決済み className 群を返す。\n * 2. `decideScopeClasses(host, ctx, templateClassNames)` —\n * scope class 自動付与の必要性を判定し、必要なら `_attributes` の class 属性に\n * 追記する。\n * 3. `rewriteDeferredSelfTargets(host, ctx)` —\n * `_pending` 内の `deferred-self` ターゲットを id / class セレクタに in-place\n * で書き換え、`_scope` 存在時には解決済みコマンドを転送する。\n * `ctx.factoryExtraction === true` の場合は no-op。\n * 4. `flushPostEach(host)` —\n * `resolveEachFactories` 後に `_pending` 内の bind-each(factoryCode 確定済み)\n * を `_eachTemplateSnapshots` に保存し `_scope._append` に転送する。\n *\n * 各関数は `host` の内部状態(`_pending` / `_pendingStyleTemplates` /\n * `_eachTemplateSnapshots` / `_attributes` / `_scope` / `_css`)を直接 mutate する。\n * 呼び出し順を入れ替えると bytewise 等価が崩れる点に注意する。\n *\n * Requirements: 3.1, 3.3, 3.4, 3.5, 6.3, 6.4\n * Design: design.md \"Components and Interfaces\" → `_internal/proto-render-pipeline.ts`\n * (Service Interface) / \"System Flows\" sequence diagram /\n * \"Allowed Dependencies\"\n *\n * @internal\n */\nimport type { HtmlTagHost } from './host-types.js';\nimport type { RenderContext } from '../render-context.js';\nimport { HtmlAttribute } from '../../attributes/html-attribute.js';\nimport { hasCommandTarget, rewriteCommandTarget } from '../../../js/vanilla/commands.js';\nimport type { VanillaCommand } from '../../../js/vanilla/commands.js';\nimport type { ElementTarget } from '../../../js/vanilla/element-target.js';\nimport type { HtmlAttributeShape } from '../../protocols/html-tag-protocol.js';\nimport type { StyleTemplate } from '../../../css/variables/style-template.js';\n\n/**\n * `flushPendingStyleTemplates` + `decideScopeClasses` の結果を表す軽量レコード。\n *\n * - `extraClasses`: scope class(自動付与時)と template 由来 className を結合した\n * class 名列。`decideScopeClasses` で実際に `_attributes` の class 属性に追加された\n * 値と同一順序。\n * - `scopeClassApplied`: scope class(`resolver.resolveClassName(tagPath)` 由来)が\n * 自動付与されたか。template 由来のみのケースでは `false` になる。\n *\n * @internal\n */\nexport interface ProtoRenderPipelineResult {\n /** 既に解決されたスコープ用クラス名(template 由来含む) */\n readonly extraClasses: readonly string[];\n /** scope-class 自動付与が発生したか */\n readonly scopeClassApplied: boolean;\n}\n\n/**\n * `_css` を duck-typing で参照するための部分型。\n *\n * `HtmlTag._css` は `private` フィールドのため helper module からは直接アクセス\n * できないが、`host.css` getter が同一インスタンスを返すため、必要な API\n * (`tagPath` / `render()` / `registerTemplate`)はそちら経由で参照する。\n */\ninterface CssManagerLike {\n readonly tagPath?: string;\n render(): string;\n registerTemplate?: (\n tpl: StyleTemplate,\n resolver: RenderContext['resolver'],\n tagPath: string,\n ) => string;\n}\n\n/**\n * helper が `host` を経由してアクセスする最小内部面の構造型。\n *\n * `_attributes` は `protected`、`_css` は `private` のため外部からは見えない。\n * 本ファイル内のみで使う narrow 型として一括 cast する(`as unknown as`)。\n * `_pending` / `_pendingStyleTemplates` / `_eachTemplateSnapshots` / `_scope`\n * はアクセス修飾子なし(package-internal 慣習)のため、`HtmlTagHost` 経由でも\n * 直接参照可能だが、本構造型に含めることで helper の依存面を 1 箇所に集約する。\n */\ninterface HostInternals {\n _attributes: HtmlAttributeShape[];\n _pending: VanillaCommand[];\n _pendingStyleTemplates: StyleTemplate[];\n _eachTemplateSnapshots: VanillaCommand[];\n _scope?: { _append(cmd: VanillaCommand): void } | undefined;\n readonly css: CssManagerLike;\n}\n\n/** `host` を helper 内部面 (`HostInternals`) に narrow する局所 cast。 */\nfunction asInternals(host: HtmlTagHost): HostInternals {\n return host as unknown as HostInternals;\n}\n\n/**\n * `_pendingStyleTemplates` を tagPath 確定後に `CssManager.registerTemplate` へ\n * 転送し、解決済み className 群を返す。\n *\n * - `_pendingStyleTemplates` が空、または `host.css.tagPath` が未確定の場合は\n * 空配列を返す(既存 `protoRender` 644 行の guard と同一)。\n * - `host.css.registerTemplate` が duck-typing で見つからない場合も空配列を返す。\n * - `_pendingStyleTemplates` 自体は **mutate しない**(append-only 維持)。\n *\n * 副作用: `host.css.registerTemplate` を呼び `CssManager` 側にテンプレートを登録する。\n *\n * Requirements: 3.3, 3.4, 6.3\n *\n * @internal\n */\nexport function flushPendingStyleTemplates(\n host: HtmlTagHost,\n ctx: RenderContext,\n): readonly string[] {\n const internals = asInternals(host);\n const tagPath = internals.css.tagPath;\n if (internals._pendingStyleTemplates.length === 0 || !tagPath) {\n return [];\n }\n const register = internals.css.registerTemplate;\n if (typeof register !== 'function') {\n return [];\n }\n const result: string[] = [];\n for (const tpl of internals._pendingStyleTemplates) {\n const className = register.call(internals.css, tpl, ctx.resolver, tagPath);\n result.push(className);\n }\n return result;\n}\n\n/**\n * scope class 自動付与の必要性を判定し、必要なら `host._attributes` に class を\n * 追加または上書きする。\n *\n * 自動付与トリガ:\n * - `hasCss`(`host.css.render().length > 0`)または `_pending.length > 0` で\n * id 属性が未指定の場合 — `_css.tagPath` が確定していることが前提。\n * - `templateClassNames` が非空の場合は、scope class 自動付与の有無に関わらず\n * class 属性に追加する。\n *\n * 副作用:\n * - 既存の `class` 属性(`keyValue`)があれば `HtmlAttribute.className` で結合し直して\n * 同じインデックスに上書きする。\n * - `class` 属性が存在しない場合は `host.addHtmlAttribute(HtmlAttribute.className(...))` で\n * 末尾に追加する。\n *\n * Requirements: 3.4, 6.3\n *\n * @internal\n */\nexport function decideScopeClasses(\n host: HtmlTagHost,\n ctx: RenderContext,\n templateClassNames: readonly string[],\n): ProtoRenderPipelineResult {\n const internals = asInternals(host);\n const tagPath = internals.css.tagPath;\n const hasExplicitId = internals._attributes.some(a => a.key === 'id');\n const hasCss = internals.css.render().length > 0;\n const needsSelectorClass =\n !hasExplicitId && internals._pending.length > 0 && !!tagPath;\n const wantsScopeClass = (hasCss || needsSelectorClass) && !!tagPath;\n\n if (!wantsScopeClass && templateClassNames.length === 0) {\n return { extraClasses: [], scopeClassApplied: false };\n }\n\n const extraClasses: string[] = [];\n if (wantsScopeClass && tagPath) {\n extraClasses.push(ctx.resolver.resolveClassName(tagPath));\n }\n for (const name of templateClassNames) {\n extraClasses.push(name);\n }\n\n const existingClassIdx = internals._attributes.findIndex(a => a.key === 'class');\n if (existingClassIdx >= 0) {\n const existing = internals._attributes[existingClassIdx]!;\n if (existing.attributeValue.type === 'keyValue') {\n internals._attributes[existingClassIdx] = HtmlAttribute.className(\n existing.attributeValue.value,\n ...extraClasses,\n );\n }\n } else {\n host.addHtmlAttribute(HtmlAttribute.className(...extraClasses));\n }\n\n return {\n extraClasses,\n scopeClassApplied: wantsScopeClass,\n };\n}\n\n/**\n * `_pending` 内の `deferred-self` ターゲットを確定済みセレクタへ書き換える。\n *\n * セレクタ解決の優先順位:\n * 1. ユーザーが明示した id 属性 → `'#<id>'`\n * 2. JS バインディング対象かつ tagPath が確定済み → `'._<classHash>'`\n * (HTML に id 属性を付与せず、クラスセレクタで代替する)\n *\n * - `ctx.factoryExtraction === true` の場合は **no-op**(each 内部要素は\n * `document.createElement` で生成され、querySelector 経路は使わない)。\n * - セレクタが解決できない場合(バインディングなし or tagPath 未確定)は no-op。\n * - 解決後、`_scope` が存在すれば bind-each (closure 未確定) **以外** のコマンドを\n * `_scope._append` に転送し、`_pending` から取り除く。\n *\n * Requirements: 3.1, 3.3, 6.3\n *\n * @internal\n */\nexport function rewriteDeferredSelfTargets(\n host: HtmlTagHost,\n ctx: RenderContext,\n): void {\n if (ctx.factoryExtraction === true) return;\n\n const internals = asInternals(host);\n const tagPath = internals.css.tagPath;\n const hasExplicitId = internals._attributes.some(a => a.key === 'id');\n const idAttr = internals._attributes.find(a => a.key === 'id');\n\n let resolvedSelector: string | undefined;\n if (idAttr !== undefined && idAttr.attributeValue.type === 'keyValue') {\n resolvedSelector = `#${idAttr.attributeValue.value}`;\n } else if (!hasExplicitId && internals._pending.length > 0 && !!tagPath) {\n resolvedSelector = `.${ctx.resolver.resolveClassName(tagPath)}`;\n }\n if (resolvedSelector === undefined) return;\n\n const selTarget: ElementTarget = {\n kind: 'sel',\n selector: resolvedSelector,\n };\n for (let i = 0; i < internals._pending.length; i++) {\n const cmd = internals._pending[i]!;\n if (hasCommandTarget(cmd) && cmd.target.kind === 'deferred-self') {\n internals._pending[i] = rewriteCommandTarget(cmd, selTarget);\n }\n }\n\n // FlushOrchestrator が deferred-self コマンドを _pending に留保していた場合、\n // 解決済みコマンドを _scope(VanillaScriptBuilder)へ遅延転送する。\n // bind-each (closure 未確定) は resolveEachFactories まで残す。\n if (internals._scope !== undefined && internals._pending.length > 0) {\n const scope = internals._scope;\n const remaining: VanillaCommand[] = [];\n for (const cmd of internals._pending) {\n if (\n cmd.type === 'bind-each' &&\n cmd.template.factoryKind === 'closure' &&\n cmd.template.factoryCode === undefined\n ) {\n remaining.push(cmd);\n } else {\n scope._append(cmd);\n }\n }\n internals._pending.length = 0;\n for (const cmd of remaining) {\n internals._pending.push(cmd);\n }\n }\n}\n\n/**\n * `resolveEachFactories` 完了後に `_pending` 内の bind-each(factoryCode 確定済み)\n * を `_eachTemplateSnapshots` に append し、`_scope._append` に転送する。\n *\n * 動作詳細:\n * - `host._scope` が `undefined` の場合は **no-op**(既存 protoRender 753 行)。\n * - `_pending` を走査し:\n * - `bind-each` で `template.factoryCode !== undefined` → `_eachTemplateSnapshots`\n * に append し、`_scope._append` で転送。\n * - `bind-each` で `factoryCode === undefined` → そのまま `_pending` に残置。\n * - それ以外(deferred-self 解決済み非 bind-each 等)→ `_scope._append` に転送。\n * ※ 通常は `rewriteDeferredSelfTargets` で既に flush 済みのため到達しないが、\n * 既存実装の safety net をそのまま維持する。\n *\n * Requirements: 3.5, 6.3\n *\n * @internal\n */\nexport function flushPostEach(host: HtmlTagHost): void {\n const internals = asInternals(host);\n if (internals._scope === undefined || internals._pending.length === 0) return;\n\n const scope = internals._scope;\n const stillPending: VanillaCommand[] = [];\n for (const cmd of internals._pending) {\n if (cmd.type === 'bind-each' && cmd.template.factoryCode !== undefined) {\n // each-modifier-css-extraction: CSS 収集 phase で templateRoot を再走査\n // できるよう、_scope へ転送する前にスナップショットを保持する。\n internals._eachTemplateSnapshots.push(cmd);\n scope._append(cmd);\n } else if (cmd.type !== 'bind-each') {\n // deferred-self 解決済みの非 bind-each コマンドはここには来ないはずだが念のため\n scope._append(cmd);\n } else {\n stillPending.push(cmd);\n }\n }\n internals._pending.length = 0;\n for (const cmd of stillPending) {\n internals._pending.push(cmd);\n }\n}\n","/**\n * Tree 全体 CSS 収集ロジックを純関数化した helper module。\n *\n * `html-tag.ts` の `collectCssStyleString` メソッドからインラインで実装されていた\n * 「own CSS(`host.css.renderCss(resolver)`)→ 子要素の `collectCssStyleString` への\n * 再帰委譲 → bind-each snapshot 走査(`_eachTemplateSnapshots` 非空時は前者、\n * それ以外は `_pending` を走査)」のロジックを `collectCss` 関数として export する。\n *\n * 抽出ポイント:\n *\n * - own CSS は `host.css.renderCss(resolver)` を最初に呼び、空文字以外なら push\n * - 子要素には **public method `collectCssStyleString` 経由で** 委譲する。これにより\n * `Root` の override や将来のサブクラス独自実装にも透過に対応する。`HtmlTag` 値\n * import を避けるため duck-typed guard\n * (`'collectCssStyleString' in child && typeof child.collectCssStyleString === 'function'`)\n * で `HTMLTagProtocol` 配下から呼び出し可能な子に絞る。`HtmlTag` 派生はすべて\n * このシグネチャを持つため、現実装 `instanceof HtmlTag` と同等の集合を選択する。\n * - bind-each 走査は局所クロージャ `collectFrom` を内部に保持し、現実装と同じく\n * `_eachTemplateSnapshots.length > 0` を最優先、それ以外は `_pending` を走査する。\n * `cmd.type !== 'bind-each'` は continue(`eachOrdinal` 据え置き)、bind-each\n * エントリでは現 ordinal を保持してから `eachOrdinal` を 0-based でインクリメント、\n * `cmd.template._templateRoot === undefined` の場合は skip、それ以外は\n * `injectEachTemplateTagPath(cmd.template, host.css.tagPath, currentOrdinal)` を\n * 先行させてから `templateRoot.collectCssStyleString(resolver)` を再帰呼び出しする。\n *\n * 戻り値は `parts.join('\\n')`。区切り文字は現実装維持。\n *\n * `_children` は `protected`、`_css` は `private` のため `host` 直アクセスは\n * 不可。`host.css` getter(同一インスタンスを返す public surface)と、\n * `_children` / `_pending` / `_eachTemplateSnapshots` への narrow cast 経由で\n * 参照する(proto-render-pipeline.ts の `asInternals` パターンに倣う)。\n *\n * Requirements: 2.1, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 4.1, 5.1\n * Design: design.md \"Components and Interfaces\" → `_internal/css-collector.ts`\n * (Service Interface) / \"System Flows\" 委譲フロー / \"Allowed Dependencies\"\n *\n * @internal\n */\nimport type { IdentifierResolver } from '../../../css/utils/identifier-resolver.js';\nimport type { VanillaCommand } from '../../../js/vanilla/commands.js';\nimport type { HTMLTagProtocol } from '../../protocols/html-tag-protocol.js';\nimport { injectEachTemplateTagPath } from '../each-factory-resolver.js';\nimport type { HtmlTagHost } from './host-types.js';\n\n/**\n * helper が `host` を経由してアクセスする最小内部面の構造型。\n *\n * `_children` は `protected`、`_css` は `private` のため、`HtmlTagHost`(=`HtmlTag`)\n * 経由では直接参照できない。`host.css` getter は public のため別途利用可能だが、\n * `_children` / `_pending` / `_eachTemplateSnapshots` は本構造型経由で narrow cast する。\n */\ninterface HostInternals {\n _children: HTMLTagProtocol[];\n _pending: VanillaCommand[];\n _eachTemplateSnapshots: VanillaCommand[];\n}\n\n/** `host` を helper 内部面 (`HostInternals`) に narrow する局所 cast。 */\nfunction asInternals(host: HtmlTagHost): HostInternals {\n return host as unknown as HostInternals;\n}\n\n/**\n * `HtmlTag` の Tree 全体 CSS を収集する純関数。\n * `HtmlTag.collectCssStyleString` から委譲される。\n *\n * own CSS(`host.css.renderCss(resolver)`)→ 子要素 CSS(`child.collectCssStyleString`\n * を public method 経由で呼ぶ)→ bind-each snapshot CSS(`_eachTemplateSnapshots`\n * 非空時はそちら、それ以外は `_pending`)の順で `\\n` 区切り連結する。\n *\n * @param host - 収集起点の `HtmlTag` インスタンス\n * @param resolver - optional minify-aware identifier resolver\n * @returns own CSS + 子孫 CSS + bind-each snapshot CSS を `\\n` 区切りで連結した文字列\n *\n * @internal\n */\nexport function collectCss(host: HtmlTagHost, resolver?: IdentifierResolver): string {\n const internals = asInternals(host);\n const parts: string[] = [];\n\n // DF-2: スコープ付きCSS出力(tagPath が設定されている場合)\n const ownCss = host.css.renderCss(resolver);\n if (ownCss.length > 0) {\n parts.push(ownCss);\n }\n\n for (const child of internals._children) {\n if (\n 'collectCssStyleString' in child &&\n typeof (child as { collectCssStyleString?: unknown }).collectCssStyleString === 'function'\n ) {\n const childCss = (child as { collectCssStyleString: (resolver?: IdentifierResolver) => string })\n .collectCssStyleString(resolver);\n if (childCss.length > 0) {\n parts.push(childCss);\n }\n }\n }\n\n // each-modifier-css-extraction: bind-each snapshot 内 templateRoot 配下の\n // modifier-chain CSS を収集する。tagPath は冪等関数で注入後、再帰的に\n // collectCssStyleString を呼び出す。CSS の重複排除は CssManager.registerTemplate\n // の (tagPath, bodyHash) dedup に委譲する。\n //\n // _pending と _eachTemplateSnapshots の両方を走査する:\n // - _pending: protoRender 前 / closure factoryCode 未確定の bind-each\n // - _eachTemplateSnapshots: protoRender 後に _scope へ転送された bind-each の保持先\n const collectFrom = (cmds: VanillaCommand[]): void => {\n let eachOrdinal = 0;\n for (const cmd of cmds) {\n if (cmd.type !== 'bind-each') {\n continue;\n }\n const currentOrdinal = eachOrdinal;\n eachOrdinal += 1;\n const templateRoot = cmd.template._templateRoot;\n if (templateRoot === undefined) {\n continue;\n }\n injectEachTemplateTagPath(cmd.template, host.css.tagPath, currentOrdinal);\n const eachCss = templateRoot.collectCssStyleString(resolver);\n if (eachCss.length > 0) {\n parts.push(eachCss);\n }\n }\n };\n if (internals._eachTemplateSnapshots.length > 0) {\n collectFrom(internals._eachTemplateSnapshots);\n } else {\n collectFrom(internals._pending);\n }\n\n return parts.join('\\n');\n}\n","/**\n * Tree 全体 JS 収集ロジックを純関数化した helper module。\n *\n * `html-tag.ts` の `collectJsContent` メソッドからインラインで実装されていた\n * 「own JS(`host.jqm.render()` の length > 0 のみ push)→ 子要素の\n * `collectJsContent` への再帰委譲(duck-typed guard 経由)」のロジックを\n * `collectJs` 関数として export する。\n *\n * 抽出ポイント:\n *\n * - own JS は `host.jqm.render()` を最初に呼び、length > 0 のときのみ push\n * - 子要素には **public method `collectJsContent` 経由で** 委譲する。これにより\n * `Root` の override や将来のサブクラス独自実装にも透過に対応する。`HtmlTag` 値\n * import を避けるため duck-typed guard\n * (`'collectJsContent' in child && typeof child.collectJsContent === 'function'`)\n * で `HTMLTagProtocol` 配下から呼び出し可能な子に絞る。\n *\n * 戻り値は `contents.join(';\\n')`。区切り文字は現実装維持。\n *\n * `_children` は `protected`、`_jqm` は `private` のため `host` 直アクセスは\n * 不可。`host.jqm` getter(同一インスタンスを返す public surface)と、\n * `_children` への narrow cast 経由で参照する(css-collector.ts の\n * `asInternals` パターンに倣う)。\n *\n * Requirements: 2.2, 4.1, 5.2\n * Design: design.md \"Components and Interfaces\" → `_internal/js-collector.ts`\n * (Service Interface) / \"System Flows\" 委譲フロー / \"Allowed Dependencies\"\n *\n * @internal\n */\nimport type { HTMLTagProtocol } from '../../protocols/html-tag-protocol.js';\nimport type { HtmlTagHost } from './host-types.js';\n\n/**\n * helper が `host` を経由してアクセスする最小内部面の構造型。\n *\n * `_children` は `protected` のため、`HtmlTagHost`(=`HtmlTag`)経由では\n * 直接参照できない。`host.jqm` getter は public のため別途利用可能だが、\n * `_children` は本構造型経由で narrow cast する。\n */\ninterface HostInternals {\n _children: HTMLTagProtocol[];\n}\n\n/** `host` を helper 内部面 (`HostInternals`) に narrow する局所 cast。 */\nfunction asInternals(host: HtmlTagHost): HostInternals {\n return host as unknown as HostInternals;\n}\n\n/**\n * `HtmlTag` の Tree 全体 JS を収集する純関数。\n * `HtmlTag.collectJsContent` から委譲される。\n *\n * own JS(`host.jqm.render()`)→ 子要素 JS(`child.collectJsContent` を\n * public method 経由で呼ぶ)の順で `;\\n` 区切り連結する。\n *\n * @param host - 収集起点の `HtmlTag` インスタンス\n * @returns own JS + 子孫 JS を `;\\n` 区切りで連結した文字列\n *\n * @internal\n */\nexport function collectJs(host: HtmlTagHost): string {\n const internals = asInternals(host);\n const contents: string[] = [];\n\n // 自身のJQueryManager のJS文を収集\n const ownJs = host.jqm.render();\n if (ownJs.length > 0) {\n contents.push(ownJs);\n }\n\n // 子要素のJSを再帰的に収集\n for (const child of internals._children) {\n if ('collectJsContent' in child && typeof child.collectJsContent === 'function') {\n const childJs = child.collectJsContent();\n if (childJs.length > 0) {\n contents.push(childJs);\n }\n }\n }\n\n return contents.join(';\\n');\n}\n","/**\n * Tree 全体 used-methods 収集ロジックを純関数化した helper module。\n *\n * `html-tag.ts` の `collectUsedMethods` メソッドからインラインで実装されていた\n * 「own usedMethods(`host._jqm.usedMethods`)から `new Set` 初期化 → 子要素の\n * `collectUsedMethods` への再帰委譲(duck-typed guard 経由)」のロジックを\n * `collectUsedMethods` 関数として export する。\n *\n * 抽出ポイント:\n *\n * - own usedMethods は `host.jqm.usedMethods` を読み出し、新しい `Set<JQueryMethodType>`\n * で初期化する。`host.jqm` getter は `_jqm` private field の同一インスタンスを\n * 返す public surface であり、`_jqm` 直アクセス(private)を避ける(css-collector /\n * js-collector と同様の規約)。\n * - 子要素には **public method `collectUsedMethods` 経由で** 委譲する。これにより\n * `Root` の override や将来のサブクラス独自実装にも透過に対応する。`HtmlTag` 値\n * import を避けるため duck-typed guard\n * (`'collectUsedMethods' in child && typeof child.collectUsedMethods === 'function'`)\n * で `HTMLTagProtocol` 配下から呼び出し可能な子に絞る。\n * - 子の `collectUsedMethods()` の戻り `Set` を `for ... of` で走査し、`result.add(method)`\n * で集約する(現実装維持)。\n *\n * 戻り値は集約後の `Set<JQueryMethodType>`。消費側は membership のみを参照する\n * 仕様のため、insertion order は契約に含まれない。\n *\n * `_children` は `protected` のため `host` 直アクセスは不可。`host.jqm` getter\n * (同一インスタンスを返す public surface)と、`_children` への narrow cast 経由で\n * 参照する(css-collector.ts / js-collector.ts の `asInternals` パターンに倣う)。\n *\n * Requirements: 2.3, 4.1, 5.3\n * Design: design.md \"Components and Interfaces\" → `_internal/used-methods-collector.ts`\n * (Service Interface) / \"Boundary Commitments\" / \"Allowed Dependencies\"\n *\n * @internal\n */\nimport type { HTMLTagProtocol } from '../../protocols/html-tag-protocol.js';\nimport type { JQueryMethodType } from '../../protocols/jquery-method-type.js';\nimport type { HtmlTagHost } from './host-types.js';\n\n/**\n * helper が `host` を経由してアクセスする最小内部面の構造型。\n *\n * `_children` は `protected` のため、`HtmlTagHost`(=`HtmlTag`)経由では\n * 直接参照できない。`host.jqm` getter は public のため別途利用可能だが、\n * `_children` は本構造型経由で narrow cast する。\n */\ninterface HostInternals {\n _children: HTMLTagProtocol[];\n}\n\n/** `host` を helper 内部面 (`HostInternals`) に narrow する局所 cast。 */\nfunction asInternals(host: HtmlTagHost): HostInternals {\n return host as unknown as HostInternals;\n}\n\n/**\n * `HtmlTag` の Tree 全体で使用された jQuery メソッド集合を返す純関数。\n * `HtmlTag.collectUsedMethods` から委譲される。\n *\n * own usedMethods(`host.jqm.usedMethods`)で初期化された新しい `Set` に、\n * 子要素の `collectUsedMethods()`(public method 経由)戻り集合を順次マージする。\n *\n * @param host - 収集起点の `HtmlTag` インスタンス\n * @returns own + 子孫の jQuery method 集合\n *\n * @internal\n */\nexport function collectUsedMethods(host: HtmlTagHost): Set<JQueryMethodType> {\n const internals = asInternals(host);\n\n // 自身のJQueryManagerで使用されたメソッドから開始\n const result = new Set<JQueryMethodType>(host.jqm.usedMethods);\n\n // 子要素のメソッドを再帰的に収集\n for (const child of internals._children) {\n if ('collectUsedMethods' in child && typeof child.collectUsedMethods === 'function') {\n for (const method of child.collectUsedMethods()) {\n result.add(method);\n }\n }\n }\n\n return result;\n}\n","/**\n * HtmlTag 抽象基底クラス\n *\n * 全タグ共通のレンダリングロジックと属性管理を集約する。\n * HTMLTagProtocol を実装し、サブクラス(Root, PairType, SelfClosingType, TextType)の\n * 共通動作を提供する。\n *\n * レンダリングフロー:\n * render() → protoRender() → HTMLFormatter.format()\n *\n * Task 0.2: CssManagerInstance をコンポジションで保持。\n * collectCssStyleString() は this._css.render() に委譲する。\n *\n * Requirements: 6.1, 6.2, 6.7\n */\nimport type { HTMLTagProtocol, HtmlAttributeShape } from '../protocols/html-tag-protocol.js';\nimport type { CssManagerType } from '../protocols/css-manager-type.js';\nimport type { JQueryManagerProtocol } from '../protocols/jquery-manager-protocol.js';\nimport type { CssManagerInstance } from '../protocols/css-manager-instance-type.js';\nimport { HtmlStyle } from '../../css/style/html-style.js';\nimport type { FlexOptions } from '../../css/style/flex/css-flex.js';\nimport type { GridOptions } from '../../css/style/grid/css-grid.js';\nimport type { FontOptions } from '../../css/style/font/css-font.js';\nimport type { BorderOptions } from '../../css/style/border/css-border.js';\nimport type { BackgroundOptions } from '../../css/style/background/css-background.js';\nimport { PseudoStyleBuilder } from '../../css/style/pseudo/pseudo-style-builder.js';\nimport type { EdgeSet } from '../../css/constants/edge-set.js';\nimport type { BreakpointStyles } from '../../css/constants/breakpoints.js';\nimport { createDefaultRenderContext, type RenderContext } from './render-context.js';\nimport type { IdentifierResolver } from '../../css/utils/identifier-resolver.js';\nimport { resolveEachFactories } from './each-factory-resolver.js';\nimport type { TagType } from '../tags/tag-type.js';\nimport { SELF_CLOSING_TAGS } from '../tags/tag-type.js';\nimport { HTMLFormatter } from '../utils/html-formatter.js';\nimport type { JQueryMethodType } from '../protocols/jquery-method-type.js';\nimport type { JQueryManagerInstance } from '../protocols/jquery-manager-instance-type.js';\nimport { resolveHtmlTagDependencies } from '../../composition-root.js';\nimport type { VanillaCommand } from '../../js/vanilla/commands.js';\nimport type { VanillaScope } from '../../js/vanilla/vanilla-script-builder.js';\nimport { applyElementMixin } from '../../js/vanilla/element-methods.js';\nimport type { ElementMethods } from '../../js/vanilla/element-methods.js';\nimport type { StyleTemplate } from '../../css/variables/style-template.js';\nimport { applyFrame } from './_internal/frame-options.js';\nimport { applyResponsive } from './_internal/breakpoint-applier.js';\nimport {\n flushPendingStyleTemplates,\n decideScopeClasses,\n rewriteDeferredSelfTargets,\n flushPostEach,\n} from './_internal/proto-render-pipeline.js';\nimport { collectCss } from './_internal/css-collector.js';\nimport { collectJs } from './_internal/js-collector.js';\nimport { collectUsedMethods as collectUsedMethodsHelper } from './_internal/used-methods-collector.js';\n\n/**\n * HtmlTag コンストラクタのオプション引数。\n * テスト時に CssManager / JQueryManager をモック注入するために使用。\n */\nexport interface HtmlTagOptions {\n css?: CssManagerInstance;\n jqm?: JQueryManagerInstance;\n}\n\n/**\n * `.frame()` 修飾子のオプション型。\n *\n * 各プロパティは省略可能。省略されたプロパティは既存の設定値を変更しない。\n *\n * 変換ルール:\n * - `number` → `{n}px`\n * - `Infinity` (maxWidth / maxHeight のみ) → `'100%'`\n * - `string` → そのまま CSS 値として使用\n *\n * Requirements: 6.1, 6.2, 6.3, 6.4, 6.5, 6.6\n */\nexport interface FrameOptions {\n width?: number | string;\n height?: number | string;\n minWidth?: number | string;\n maxWidth?: number | string;\n minHeight?: number | string;\n maxHeight?: number | string;\n}\n\n/**\n * Abstract base class for all HTML elements.\n *\n * This class provides the common rendering logic and attribute/child management\n * for all HTML tag types. It implements {@link HTMLTagProtocol}, {@link CssManagerType},\n * and {@link JQueryManagerProtocol}.\n *\n * **Rendering Flow:**\n * - `render()` → `protoRender()` → `HTMLFormatter.format()`\n *\n * **Composition Pattern:**\n * - CSS management is delegated to {@link CssManagerInstance}\n * - JavaScript/jQuery management is delegated to {@link JQueryManagerInstance}\n *\n * **Subclasses:**\n * - {@link Root} - Document root element\n * - {@link PairType} - Elements with opening and closing tags (e.g., `<div>...</div>`)\n * - {@link SelfClosingType} - Self-closing elements (e.g., `<br>`)\n * - {@link TextType} - Text nodes\n *\n * @example\n * ```typescript\n * // Typically used through factory functions, not instantiated directly\n * const element = div(\n * p('Hello'),\n * span('World')\n * );\n * console.log(element.render());\n * ```\n *\n * @remarks\n * **Preconditions:** tagType must be a valid {@link TagType} value\n *\n * **Postconditions:** `render()`/`protoRender()` return valid HTML strings\n *\n * **Invariants:** Children order is preserved in insertion order\n */\n// applyElementMixin で実体メソッドを動的に注入する mixin パターン。型側は同一モジュール末尾の `interface HtmlTag extends ElementMethods<HtmlTag>` で表現する。\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport abstract class HtmlTag implements HTMLTagProtocol, CssManagerType, JQueryManagerProtocol {\n /**\n * The HTML tag type (e.g., 'div', 'p', 'span').\n */\n readonly tagType: TagType;\n\n /**\n * Child elements managed by this tag.\n * @internal\n */\n protected _children: HTMLTagProtocol[] = [];\n\n /**\n * HTML attributes managed by this tag.\n * @internal\n */\n protected _attributes: HtmlAttributeShape[] = [];\n\n /**\n * CSS manager instance (composition pattern).\n * @internal\n */\n private _css: CssManagerInstance;\n\n /**\n * jQuery manager instance (composition pattern).\n * @internal\n */\n private _jqm: JQueryManagerInstance;\n\n /**\n * 遅延解決モデル用の未フラッシュ DOM 操作コマンドバッファ。\n *\n * `Root.addChild(this)` 以前に要素ビルダメソッド(`on` / `setText` 等)から\n * 積まれた {@link VanillaCommand} を保持する。`FlushOrchestrator.flush()` が\n * 呼ばれた時点で `_scope._append` に転送し、本配列は空になる。\n *\n * Requirements: 1.6, 1.7, 1.8 (unified-element-api)\n * Design: 遅延解決モデル / PendingBuffer\n *\n * @internal\n */\n _pending: VanillaCommand[] = [];\n\n /**\n * each-modifier-css-extraction: bind-each コマンドの永続スナップショット。\n *\n * `_pending` 内 bind-each は protoRender 後に `_scope` へ転送されて `_pending`\n * から消えるため、CSS 収集 phase(`collectCssStyleString`)に到達した時点では\n * 参照不能になる。本配列は bind-each コマンドの参照を append-only で保持し、\n * 後段の CSS 収集が templateRoot を辿れるようにする。\n *\n * @internal\n */\n _eachTemplateSnapshots: VanillaCommand[] = [];\n\n /**\n * element-methods.ts の `appendChild` で追加された子 `HtmlTag` 群。\n *\n * `addChild` を経由しない `.appendChild(child)` 呼び出しは `_children` に\n * 追加されないが、each テンプレート factory コード生成時には子要素ツリーが\n * 必要になる。本配列はその目的(factory コード生成)専用の追跡バッファ。\n *\n * @internal\n */\n _appendedChildren: HtmlTag[] = [];\n\n /**\n * `css` 属性経由で受理した {@link StyleTemplate} 群の未フラッシュバッファ。\n *\n * `applyAttributeMap` 経路(あるいは `addStyleTemplates`)で push 順に保持され、\n * **この時点では `CssManager` には流さない**。tagPath が確定する render 時\n * (Task 3.4)に初めて `_css.registerTemplate(tpl, ...)` へ転送される。\n *\n * Requirements: 1.1, 1.4\n * Design: 遅延解決モデル / `_pendingStyleTemplates`\n *\n * @internal\n */\n _pendingStyleTemplates: StyleTemplate[] = [];\n\n // ── ElementMixin(unified-element-api)──\n // 実装は applyElementMixin(HtmlTag.prototype) で差し込まれる。\n // 型は同一ファイル内の `interface HtmlTag extends ElementMethods<HtmlTag>` 宣言マージで\n // 伝播させる(バンドル後の dist/index.d.ts にも保持される)。\n\n /**\n * フラッシュ済み要素が保持する {@link VanillaScope} 参照。\n *\n * `undefined` の間は未登録(バッファ経路)、`VanillaScope` 値が入った後は\n * 以降の要素ビルダメソッド呼び出しが即時 `_append` される。\n *\n * Requirements: 1.6, 1.7 (unified-element-api)\n * Design: 遅延解決モデル / FlushOrchestrator\n *\n * @internal\n */\n _scope: VanillaScope | undefined = undefined;\n\n /**\n * Creates a new HtmlTag instance.\n *\n * @param tagType - The HTML tag type\n * @param options - Optional DI options for injecting CssManager/JQueryManager (mainly for testing)\n */\n constructor(tagType: TagType, options?: HtmlTagOptions) {\n this.tagType = tagType;\n const resolved = resolveHtmlTagDependencies(options);\n this._css = resolved.css;\n this._jqm = resolved.jqm;\n }\n\n // ── CSS コンポジション ──\n\n /**\n * Gets the CSS manager for this element.\n *\n * @returns The {@link CssManagerInstance} for managing CSS styles\n *\n * @example\n * ```typescript\n * const element = div();\n * element.css.addRule('.my-class', { color: 'red' });\n * ```\n */\n get css(): CssManagerInstance {\n return this._css;\n }\n\n /**\n * Shortcut to HtmlStyle (3-level chain: element.style.font.setFontSize()).\n * Equivalent to element.css.styleManager.style.\n */\n get style(): HtmlStyle {\n return this._css.styleManager.style as HtmlStyle;\n }\n\n // ── Fluent CSS メソッド (D-3.1) ──\n // SwiftUIライクな1段階チェーン: element.padding('24px').background('#fff')\n\n padding(v: string): this;\n padding(v: number): this;\n padding(edge: EdgeSet, v: number): this;\n padding(vOrEdge: string | number, v?: number): this {\n if (typeof vOrEdge === 'number') {\n // 全方向 {n}px\n this.style.spacing.setPadding(`${vOrEdge}px`);\n } else if (typeof vOrEdge === 'string' && v !== undefined) {\n // エッジセット指定\n const px = `${v}px`;\n switch (vOrEdge as EdgeSet) {\n case 'horizontal':\n this.style.spacing.setPaddingLeft(px);\n this.style.spacing.setPaddingRight(px);\n break;\n case 'vertical':\n this.style.spacing.setPaddingTop(px);\n this.style.spacing.setPaddingBottom(px);\n break;\n case 'top':\n this.style.spacing.setPaddingTop(px);\n break;\n case 'right':\n this.style.spacing.setPaddingRight(px);\n break;\n case 'bottom':\n this.style.spacing.setPaddingBottom(px);\n break;\n case 'left':\n this.style.spacing.setPaddingLeft(px);\n break;\n }\n } else {\n // 既存: padding(string) 後方互換\n this.style.spacing.setPadding(vOrEdge as string);\n }\n return this;\n }\n paddingTop(v: string): this { this.style.spacing.setPaddingTop(v); return this; }\n paddingRight(v: string): this { this.style.spacing.setPaddingRight(v); return this; }\n paddingBottom(v: string): this { this.style.spacing.setPaddingBottom(v); return this; }\n paddingLeft(v: string): this { this.style.spacing.setPaddingLeft(v); return this; }\n margin(v: string): this { this.style.spacing.setMargin(v); return this; }\n marginTop(v: string): this { this.style.spacing.setMarginTop(v); return this; }\n marginRight(v: string): this { this.style.spacing.setMarginRight(v); return this; }\n marginBottom(v: string): this { this.style.spacing.setMarginBottom(v); return this; }\n marginLeft(v: string): this { this.style.spacing.setMarginLeft(v); return this; }\n background(v: string | BackgroundOptions): this { this.style.backgroundColor.setBackground(v); return this; }\n backgroundColor(v: string): this { this.style.backgroundColor.setBackgroundColor(v); return this; }\n color(v: string): this { this.style.font.setColor(v); return this; }\n foregroundStyle(v: string): this { this.style.font.setColor(v); return this; }\n fontSize(v: string): this { this.style.font.setFontSize(v); return this; }\n fontWeight(v: string): this { this.style.font.setFontWeight(v); return this; }\n fontFamily(v: string): this { this.style.font.setFontFamily(v); return this; }\n lineHeight(v: string): this { this.style.font.setLineHeight(v); return this; }\n cornerRadius(v: string): this { this.style.border.setBorderRadius(v); return this; }\n display(v: string): this { this.style.position.setDisplay(v); return this; }\n width(v: string): this { this.style.position.setWidth(v); return this; }\n height(v: string): this { this.style.position.setHeight(v); return this; }\n minWidth(v: string): this { this.style.position.setMinWidth(v); return this; }\n minHeight(v: string): this { this.style.position.setMinHeight(v); return this; }\n maxWidth(v: string): this { this.style.position.setMaxWidth(v); return this; }\n maxHeight(v: string): this { this.style.position.setMaxHeight(v); return this; }\n textAlign(v: string): this { this.style.text.setTextAlign(v); return this; }\n textDecoration(v: string): this { this.style.text.setTextDecoration(v); return this; }\n overflow(v: string): this { this.style.visual.setOverflow(v); return this; }\n opacity(v: string): this { this.style.visual.setOpacity(v); return this; }\n boxShadow(v: string): this { this.style.visual.setBoxShadow(v); return this; }\n gap(v: string): this { this.style.flex.setGap(v); return this; }\n flexGrow(v: string): this { this.style.flex.setFlexGrow(v); return this; }\n flex(v: string): this;\n flex(options?: FlexOptions): this;\n flex(v?: string | FlexOptions): this {\n if (typeof v === 'string') { this.style.flex.setFlexValue(v); } else { this.style.flex.setFlex(v); }\n return this;\n }\n grid(options?: GridOptions): this { this.style.grid.setGrid(options); return this; }\n font(options?: FontOptions): this { this.style.font.setFont(options); return this; }\n border(options?: BorderOptions): this { this.style.border.setBorder(options); return this; }\n hover(configure: (s: PseudoStyleBuilder) => void): this {\n const b = new PseudoStyleBuilder(); configure(b); this.style.pseudo.setHover(b); return this;\n }\n focus(configure: (s: PseudoStyleBuilder) => void): this {\n const b = new PseudoStyleBuilder(); configure(b); this.style.pseudo.setFocus(b); return this;\n }\n active(configure: (s: PseudoStyleBuilder) => void): this {\n const b = new PseudoStyleBuilder(); configure(b); this.style.pseudo.setActive(b); return this;\n }\n\n /**\n * ブレークポイントごとのスタイルをメディアクエリとして登録する。\n *\n * - 名前付きキー('sm' / 'md' / 'lg' / 'xl')は `Breakpoints` 定数で数値に解決する\n * - 数値キーはそのままブレークポイント(px 値)として使用する\n * - 各ブレークポイントの CSS プロパティを `this._css.addMediaRule(bp, props)` に渡す\n * - `renderCss()` 出力の末尾に `@media (min-width: {bp}px) { .{scopedClass} { ... } }` ブロックが追加される\n *\n * @example\n * ```typescript\n * div()\n * .responsive({ md: { padding: '16px' }, xl: { fontSize: '18px' } })\n * ```\n *\n * Requirements: 9.1, 9.2, 9.3, 9.4, 9.5\n */\n responsive(options: BreakpointStyles): this {\n applyResponsive(this, options);\n return this;\n }\n\n /**\n * 条件付き修飾子。`condition` が `true` のとき `modifier(this)` を呼び出し、\n * `false` のときは modifier を呼び出さず `this` をそのまま返す。\n *\n * modifier が `null` / `undefined` を返した場合は元の要素(`this`)を返す。\n *\n * @example\n * ```typescript\n * div()\n * .if(isActive, el => el.background('#f00'))\n * .padding('16px')\n * ```\n *\n * Requirements: 10.1, 10.2, 10.3, 10.4, 10.5\n */\n if<T extends HtmlTag>(\n this: T,\n condition: boolean,\n modifier: (el: T) => T | null | undefined,\n ): T {\n if (!condition) return this;\n return modifier(this) ?? this;\n }\n\n /**\n * 幅・高さ・最小/最大サイズを1つのメソッド呼び出しで設定する。\n *\n * - `number` → `{n}px` に変換する\n * - `Infinity` → `'100%'` に変換する(maxWidth / maxHeight のみ)\n * - `string` → そのまま CSS 値として使用する\n * - 省略されたプロパティは既存の設定値を変更しない\n *\n * Requirements: 6.1, 6.2, 6.3, 6.4, 6.5, 6.6\n *\n * @param options - 設定するフレームオプション\n * @returns This instance for method chaining\n *\n * @example\n * ```typescript\n * div().frame({ width: 700, maxWidth: Infinity })\n * // → width:700px; max-width:100%\n * ```\n */\n frame(options: FrameOptions): this {\n applyFrame(this, options);\n return this;\n }\n\n // ── JS コンポジション ──\n\n /**\n * Gets the jQuery manager for this element.\n *\n * @returns The {@link JQueryManagerInstance} for managing JavaScript/jQuery operations\n *\n * @example\n * ```typescript\n * const element = div();\n * element.jqm.on('click', () => console.log('Clicked!'));\n * ```\n */\n get jqm(): JQueryManagerInstance {\n return this._jqm;\n }\n\n // ── 子要素管理 ──\n\n /**\n * Gets the child elements of this tag.\n *\n * @returns Read-only array of child elements\n */\n get children(): ReadonlyArray<HTMLTagProtocol> {\n return this._children;\n }\n\n /**\n * Adds a child element to this tag.\n *\n * @param child - The child element to add\n * @returns This instance for method chaining\n *\n * @example\n * ```typescript\n * const container = div();\n * container.addChild(p('Hello'));\n * container.addChild(span('World'));\n * ```\n */\n addChild(child: HTMLTagProtocol): this {\n this._children.push(child);\n // DF-2: 子要素の tagPath を自動設定(スコープCSS用)\n if (child instanceof HtmlTag) {\n const index = this._children.length - 1;\n const parentPath = this._css.tagPath || this.tagType;\n const childPath = `${parentPath}>${child.tagType}[${index}]`;\n child._css.updateTagPath(childPath);\n // 孫にも再帰的に伝播\n child._propagateTagPaths();\n }\n return this;\n }\n\n /** @internal */\n _propagateTagPaths(): void {\n for (let i = 0; i < this._children.length; i++) {\n const child = this._children[i];\n if (child instanceof HtmlTag) {\n const parentPath = this._css.tagPath || this.tagType;\n const childPath = `${parentPath}>${child.tagType}[${i}]`;\n child._css.updateTagPath(childPath);\n child._propagateTagPaths();\n }\n }\n }\n\n /**\n * Adds multiple child elements to this tag.\n *\n * @param children - Array of child elements to add\n * @returns This instance for method chaining\n *\n * @example\n * ```typescript\n * const container = div();\n * container.addChildren([\n * p('First paragraph'),\n * p('Second paragraph')\n * ]);\n * ```\n */\n addChildren(children: ReadonlyArray<HTMLTagProtocol>): this {\n for (const child of children) {\n this.addChild(child);\n }\n return this;\n }\n\n // ── 属性管理 ──\n\n /**\n * Gets the HTML attributes of this tag.\n *\n * @returns Read-only array of HTML attributes\n */\n get attributes(): ReadonlyArray<HtmlAttributeShape> {\n return this._attributes;\n }\n\n /**\n * Adds an HTML attribute to this tag.\n *\n * @param attribute - The attribute to add\n * @returns This instance for method chaining\n *\n * @example\n * ```typescript\n * const element = div();\n * element.addHtmlAttribute(HtmlAttribute.className('container'));\n * element.addHtmlAttribute(HtmlAttribute.keyValue('id', 'main'));\n * ```\n */\n addHtmlAttribute(attribute: HtmlAttributeShape): this {\n this._attributes.push(attribute);\n return this;\n }\n\n /**\n * `css` 属性由来の {@link StyleTemplate} 群を `_pendingStyleTemplates` に\n * push 順を保持して追加する。\n *\n * **重要**:本メソッドは保持のみを行い、`CssManager` への登録は行わない。\n * tagPath が確定する render フェーズ(Task 3.4)で `_css.registerTemplate`\n * へ転送される。\n *\n * Requirements: 1.1, 1.4\n *\n * @param tpls - 追加する StyleTemplate の配列(順序保持)\n * @returns This instance for method chaining\n */\n addStyleTemplates(tpls: StyleTemplate[]): this {\n for (const tpl of tpls) {\n this._pendingStyleTemplates.push(tpl);\n }\n return this;\n }\n\n /**\n * Renders all attributes as an HTML string.\n *\n * @returns A space-prefixed string of attributes, or empty string if no attributes\n *\n * @example\n * ```typescript\n * // Returns: ' class=\"btn\" id=\"submit\"'\n * const element = div({ class: 'btn', id: 'submit' });\n * console.log(element.renderAttributes());\n * ```\n */\n renderAttributes(): string {\n if (this._attributes.length === 0) return '';\n return ' ' + this._attributes.map(a => a.renderAttribute()).join(' ');\n }\n\n // ── レンダリング ──\n\n /**\n * Renders the element as a minified HTML string (without formatting).\n *\n * This method generates the raw HTML output based on the tag type:\n * - **root**: Concatenates child elements (no tag wrapper)\n * - **text**: Returns content as-is (overridden in {@link TextType})\n * - **selfClosing**: Returns `<tag attrs>` format\n * - **pair**: Returns `<tag attrs>children</tag>` format\n *\n * @returns Minified HTML string\n *\n * @remarks\n * This method is typically called internally by {@link render}.\n * Use {@link render} for formatted output.\n */\n protoRender(ctx?: RenderContext): string {\n // Task 3.1: ctx 省略時はデフォルト RenderContext を内部生成して旧挙動互換とする。\n // Task 3.2: 子要素 protoRender(ctx) に必ず ctx を伝搬する(Task 3.4 で resolver 利用に置き換える)\n const renderCtx: RenderContext = ctx ?? createDefaultRenderContext();\n\n const tagName = this.tagType;\n\n // root: 子要素の protoRender(ctx) を連結(Root自身のタグは出力しない)\n if (tagName === 'root') {\n return this._children.map(c => c.protoRender(renderCtx)).join('');\n }\n\n // text: サブクラス(TextType)で override する\n // デフォルトでは空文字列を返す\n if (tagName === 'text') {\n return '';\n }\n\n // Task 3.3: protoRender 補助 4 段の helper 委譲。\n //\n // 呼び出し順序は design.md \"System Flows\" の固定順序に従う:\n // 1. _pendingStyleTemplates → CssManager.registerTemplate 転送\n // 2. scope-class 自動付与(id 未指定 + bindings / hasCss を判定し _attributes へ class を追記)\n // 3. deferred-self ターゲットを id/class セレクタに in-place 書き換え + _scope 転送\n // 4. each-factory の factoryCode を render-phase で確定(resolveEachFactories)\n // 5. bind-each (factoryCode 確定済み) を _eachTemplateSnapshots に snapshot し _scope へ転送\n //\n // Requirements: 1.1, 2.1, 2.2, 2.3, 2.4, 3.1, 3.3, 3.4, 3.5, 6.3, 6.4\n const templateClassNames = flushPendingStyleTemplates(this, renderCtx);\n const result = decideScopeClasses(this, renderCtx, templateClassNames);\n void result;\n rewriteDeferredSelfTargets(this, renderCtx);\n resolveEachFactories(this, renderCtx);\n flushPostEach(this);\n\n const attrs = this.renderAttributes();\n\n // selfClosing: <tag attrs>\n if (SELF_CLOSING_TAGS.has(tagName)) {\n return `<${tagName}${attrs}>`;\n }\n\n // pair: <tag attrs>children</tag>\n // Task 3.2: 子要素 protoRender に ctx を必ず伝搬する\n const childrenHtml = this._children.map(c => c.protoRender(renderCtx)).join('');\n return `<${tagName}${attrs}>${childrenHtml}</${tagName}>`;\n }\n\n /**\n * Renders the element as a formatted HTML string.\n *\n * This method applies HTML formatting (indentation, line breaks) to the\n * minified output from {@link protoRender}.\n *\n * @returns Formatted HTML string\n *\n * @example\n * ```typescript\n * const element = div(\n * p('Hello'),\n * p('World')\n * );\n * console.log(element.render());\n * // Output:\n * // <div>\n * // <p>Hello</p>\n * // <p>World</p>\n * // </div>\n * ```\n */\n render(): string {\n const minified = this.protoRender();\n return HTMLFormatter.format(minified);\n }\n\n // ── CSS/JS (コンポジションパターン委譲) ──\n\n /**\n * Recursively collects CSS style strings from this element and its descendants.\n *\n * 実装は `_internal/css-collector.ts` の {@link collectCss} 純関数に委譲する。\n *\n * @param resolver - optional minify-aware identifier resolver\n * @returns Concatenated CSS string from this element and all descendants\n */\n collectCssStyleString(resolver?: IdentifierResolver): string {\n return collectCss(this, resolver);\n }\n\n /**\n * Recursively collects JavaScript content from this element and its descendants.\n *\n * 実装は `_internal/js-collector.ts` の {@link collectJs} 純関数に委譲する。\n *\n * @returns Concatenated JavaScript string (separated by `;\\n`)\n *\n * @example\n * ```typescript\n * const element = div();\n * element.jqm.on('click', () => console.log('Clicked'));\n * const js = element.collectJsContent();\n * ```\n */\n collectJsContent(): string {\n return collectJs(this);\n }\n\n /**\n * Recursively collects jQuery method types used by this element and its descendants.\n *\n * This is used for tree-shaking to include only the necessary jQuery helper functions.\n *\n * 実装は `_internal/used-methods-collector.ts` の {@link collectUsedMethodsHelper}\n * (helper export 名 `collectUsedMethods` を本メソッドとの衝突回避のため alias 化)\n * 純関数に委譲する。\n *\n * @returns Set of {@link JQueryMethodType} used in the element tree\n *\n * @example\n * ```typescript\n * const element = div();\n * element.jqm.on('click', handler);\n * const methods = element.collectUsedMethods();\n * // methods includes: Set(['on'])\n * ```\n */\n collectUsedMethods(): Set<JQueryMethodType> {\n return collectUsedMethodsHelper(this);\n }\n}\n\n// ElementMixin(on / setText / setValue / setStyle / addClass / toggleClass /\n// removeClass / appendChild / text / value / class / checked)を HtmlTag.prototype\n// に差し込む(Req 1.1, 1.5)。\n// element-methods.ts は html-tag.js を type-only で参照するため循環値依存なし。\napplyElementMixin(HtmlTag.prototype as HtmlTag);\n\n// 同一モジュール内の宣言マージ:HtmlTag.prototype に差し込まれる ElementMethods 全メソッドを\n// HtmlTag インターフェースに合流させる。サブクラス(PairType / SelfClosingType / TextType)は\n// `extends HtmlTag` 経由で自動的にこれらのメソッドを継承する。\n// バンドル後の dist/index.d.ts でも `class HtmlTag` と隣接した interface 宣言として保持され、\n// クロスモジュール declare module による augmentation とは異なりパス解決に依存しない。\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-unsafe-declaration-merging\nexport interface HtmlTag extends ElementMethods<HtmlTag> {}\n","/**\n * DocumentContext: document-level policy の受け皿\n *\n * doctype フラグ、グローバル CSS リスト、reset baseline policy を保持する。\n * Root 非依存の独立したクラスとして定義し、Root はこれに委譲する(task 5.2)。\n *\n * Dependency rule:\n * - html/*, css/*, utils/* からのインポートは許可\n * - runtime/*, publisher/* からのインポートは禁止\n *\n * Conceptual separation (task 6.1):\n * - `_resetCss`: document baseline policy — set once at construction from `reset` option.\n * Represents a foundational invariant of the document, not a user-supplied rule.\n * - `_globalCss`: consumer-supplied global rules — populated via constructor `globalCss` option.\n * These are additional rules provided by the library consumer, layered on top of the baseline.\n * Both contribute CSS output, but they belong to different responsibilities and must remain\n * structurally separate so that the distinction is visible in code, not just in documentation.\n *\n * Requirements: 1.2, 1.3, 2.1, 4.1, 4.2, 4.3, 5.2\n */\nimport type { HTMLTagProtocol } from '../html/protocols/html-tag-protocol.js';\nimport { HtmlTag } from '../html/elements/html-tag.js';\nimport type { GlobalCss } from '../css/variables/global-css.js';\nimport type { IdentifierResolver } from '../css/utils/identifier-resolver.js';\n\nconst DEFAULT_CSS_RESET =\n '*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }';\n\n/**\n * Constructor options for DocumentContext.\n */\nexport interface DocumentContextOptions {\n /**\n * Whether to inject a CSS reset before all other styles.\n * @defaultValue false\n */\n reset?: boolean;\n /**\n * Global CSS to inject before scoped styles.\n * Must be provided as `GlobalCss` values constructed via the DSL (e.g. `root()`, `rule()`, `tag()`).\n */\n globalCss?: readonly GlobalCss[];\n}\n\n/**\n * Holds document-level policy: doctype flag, global CSS list, and reset baseline.\n *\n * This class is intentionally independent of `Root` so that document policy\n * can be tested and reused without the full rendering pipeline.\n *\n * @example\n * ```typescript\n * import { root, rule } from '../css/variables/global-dsl.js';\n * const docCtx = new DocumentContext({\n * reset: true,\n * globalCss: [root({ '--bg': '#0b1220' }), rule('body', { margin: '0' })],\n * });\n * const css = docCtx.collectCss(rootChildren);\n * ```\n */\nexport class DocumentContext {\n /** Whether to prepend <!DOCTYPE html> to render output. */\n private _doctype = false;\n\n /**\n * Document baseline policy (req 4.1).\n * Set once at construction from the `reset` option; never modified after that.\n * `null` means no reset was requested.\n */\n private _resetCss: string | null = null;\n\n /**\n * Consumer-supplied global rules (req 1.2, 4.2).\n * Populated at construction from the `globalCss` option; kept separate from the baseline policy.\n */\n private _globalCss: string[] = [];\n\n constructor(options?: DocumentContextOptions) {\n const { reset = false, globalCss } = options ?? {};\n if (reset) {\n // Store reset as its own baseline slot, not mixed into consumer rules.\n this._resetCss = DEFAULT_CSS_RESET;\n }\n if (globalCss !== undefined) {\n this._globalCss.push(...(globalCss as unknown as string[]));\n }\n }\n\n /**\n * Enables or disables <!DOCTYPE html> output.\n * Default is false (backward compatible).\n *\n * @param enabled - Whether to enable DOCTYPE output\n * @returns This instance for method chaining\n */\n setDoctype(enabled = true): this {\n this._doctype = enabled;\n return this;\n }\n\n /**\n * Returns the current doctype flag value.\n */\n get doctype(): boolean {\n return this._doctype;\n }\n\n /**\n * Collects all CSS for the document: global CSS first, then child element CSS.\n *\n * Mirrors `Root.collectCssStyleString()` logic so that Root can delegate to this.\n *\n * @param children - Root-level child elements to collect scoped CSS from\n * @returns Concatenated CSS string\n */\n collectCss(children: HTMLTagProtocol[], resolver?: IdentifierResolver): string {\n const parts: string[] = [];\n\n // baseline policy (reset) を最初に出力\n if (this._resetCss !== null) {\n parts.push(this._resetCss);\n }\n\n // consumer-supplied global rules をその後に出力\n if (this._globalCss.length > 0) {\n parts.push(this._globalCss.join('\\n\\n'));\n }\n\n // 子要素のスコープ CSS を収集\n const childCss = children\n .filter((child): child is HtmlTag => child instanceof HtmlTag)\n .map(child => child.collectCssStyleString(resolver))\n .filter(css => css.length > 0);\n if (childCss.length > 0) {\n parts.push(childCss.join(''));\n }\n\n return parts.join('\\n\\n');\n }\n}\n","/**\n * `VanillaScriptBuilder` クラス本体(命令蓄積器 + `render()`)。\n *\n * 設計書 `design.md` の「vanilla-script-builder」「VanillaScope」節に対応する。\n *\n * 責務:\n * - トップレベル命令キュー、`onDomReady` ブロック用の単一キュー、子 Builder を用いた\n * 関数本体 / `onDomReady` / `forEach` / `ifThen` / イベントハンドラ本体の組み立て。\n * - `render()` は冪等で副作用を持たず、`append` 順を保った JS 文字列を返す(Req 7.4)。\n * - `hasDomReady` は `onDomReady` が 1 度でも呼ばれたかを反映する(wrapDOMReady 併用判定に使用)。\n * - 出力に `jQuery` / `$` を含まない(Req 1.5, 7.1、`commands.ts` の語彙集約による担保)。\n *\n * 公開 API は `createVanillaScript()` ファクトリのみ。クラス本体は外部 import しない。\n */\n\nimport { renderCommand, renderCommands, type VanillaCommand } from './commands.js';\n\n/**\n * `ifThen` の条件や `let` の値、`call` の引数に渡す最小インターフェース。\n * `.code` を備えた任意の値オブジェクト(`JsExpr` / `ElementRef` 等)が適合する。\n */\nexport interface ScopeExpr {\n readonly code: string;\n}\n\n/**\n * スコープ内で利用できる制御・値組み立て API。\n *\n * Task 3.1 で提供する最小セット:`raw` / `let` / `call` / `return` / `ifThen`。\n * `query` / `on` / `classList.*` 等は後続タスクで別ファイルから拡張される想定。\n */\nexport interface VanillaScope {\n /**\n * 内部 API:現在スコープのキューに任意の `VanillaCommand` を追加する。\n *\n * このフックは `event-api` / `query-api` / `dom-api` / `tree-api` などの\n * ユーザ向け関数が、Scope インターフェース自体を `on` / `query` / `classList.*`\n * 等で肥大化させずに命令を append できるようにするためのエスケープハッチ。\n * 利用者コードからの直接呼び出しは非推奨(命令種別は内部詳細)。\n */\n _append(cmd: VanillaCommand): void;\n\n /**\n * 内部 API:現在スコープ用に子スコープを構築するためのフック。\n * `event-api` のハンドラ本体組み立てなど、子キューで命令を蓄積して\n * まとめて `renderCommands` に掛ける用途に利用する。\n */\n _childScope(queue: VanillaCommand[]): VanillaScope;\n\n /** 任意 JS 式を式として埋め込む。副作用として命令は発行しない(`JsExpr` 相当を返す)。 */\n raw(code: string): ScopeExpr;\n\n /**\n * `const name = <value.code>;` 命令を現在スコープに append し、`name` を指す値オブジェクトを返す。\n * 設計では `const`/`let` の区別は内部詳細であり、常に `const` を出力する。\n */\n let(name: string, value: ScopeExpr): ScopeExpr;\n\n /**\n * 関数呼び出し式 `name(args...)` を現在スコープに `expr` 命令として append する。\n * 戻り値は式として再利用可能なオブジェクト(呼び出し結果を別文脈で使いたい場合)。\n */\n call(name: string, args?: readonly ScopeExpr[]): ScopeExpr;\n\n /** `return;` を発行する。 */\n return(): void;\n\n /** `if (cond) { then } else? { orElse }` を発行する。 */\n ifThen(\n condition: ScopeExpr,\n then: (s: VanillaScope) => void,\n orElse?: (s: VanillaScope) => void,\n ): void;\n}\n\n/**\n * `render()` で JS 文字列を得るアキュムレータの公開ビュー。\n */\nexport interface VanillaScript {\n /** 生成される JS 文字列。末尾改行は含めない。 */\n render(): string;\n /**\n * `render()` 出力が最外層で `DOMContentLoaded` リスナーを含むか。\n * `wrapDOMReady` 併用の要否判定に利用する。\n */\n readonly hasDomReady: boolean;\n}\n\n/**\n * `VanillaScript` に加えて命令 append と制御フロー API を公開する Builder 型。\n * 公開 API からは `createVanillaScript()` 経由でのみ取得できる。\n */\nexport interface VanillaScriptBuilder extends VanillaScript {\n /** 内部 API:任意の `VanillaCommand` をトップレベルキューに追加する。 */\n append(cmd: VanillaCommand): void;\n\n /** `onDomReady` ブロックを開き、ハンドラ内で append された命令を DOMContentLoaded 内に合流する。 */\n onDomReady(body: (s: VanillaScope) => void): void;\n\n /** トップレベルに関数定義を追加する。 */\n declareFunction(\n name: string,\n params: readonly string[],\n body: (s: VanillaScope) => void,\n ): void;\n\n /** `declareFunction` の省略形。`fn(name, body)` なら params は空配列。 */\n fn(name: string, body: (s: VanillaScope) => void): void;\n fn(name: string, params: readonly string[], body: (s: VanillaScope) => void): void;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 内部実装\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 子スコープのキューに命令を append する `VanillaScope` 実装。\n * 親 Builder からも共通に利用されるため関数として切り出す。\n */\nfunction createScope(queue: VanillaCommand[]): VanillaScope {\n const scope: VanillaScope = {\n _append(cmd) {\n queue.push(cmd);\n },\n _childScope(childQueue) {\n return createScope(childQueue);\n },\n raw(code) {\n return { code };\n },\n let(name, value) {\n queue.push({ type: 'declareConst', name, expr: value.code });\n return { code: name };\n },\n call(name, args) {\n const argList = (args ?? []).map((a) => a.code).join(', ');\n const code = `${name}(${argList})`;\n queue.push({ type: 'expr', code });\n return { code };\n },\n return() {\n queue.push({ type: 'raw', code: 'return;' });\n },\n ifThen(condition, then, orElse) {\n const thenQueue: VanillaCommand[] = [];\n then(createScope(thenQueue));\n const thenCode = renderCommands(thenQueue, ' ');\n if (orElse !== undefined) {\n const elseQueue: VanillaCommand[] = [];\n orElse(createScope(elseQueue));\n const elseCode = renderCommands(elseQueue, ' ');\n queue.push({\n type: 'if',\n condition: condition.code,\n thenCode,\n elseCode,\n });\n } else {\n queue.push({ type: 'if', condition: condition.code, thenCode });\n }\n },\n };\n return scope;\n}\n\n/**\n * `VanillaScriptBuilder` の具象実装。外部には型として露出せず、\n * `createVanillaScript()` 経由でインターフェース型として提供する。\n */\nclass VanillaScriptBuilderImpl implements VanillaScriptBuilder {\n /** トップレベル命令キュー(`append` / `declareFunction` の順序を保つ)。 */\n private readonly topCommands: VanillaCommand[] = [];\n /** 単一の `onDomReady` 合流キュー(複数呼び出しはここに順次追加される)。 */\n private readonly onDomReadyCommands: VanillaCommand[] = [];\n /** `onDomReady` が 1 度でも呼ばれたかを示すフラグ(`hasDomReady` の裏付け)。 */\n private _hasDomReady = false;\n\n get hasDomReady(): boolean {\n return this._hasDomReady;\n }\n\n append(cmd: VanillaCommand): void {\n this.topCommands.push(cmd);\n }\n\n onDomReady(body: (s: VanillaScope) => void): void {\n this._hasDomReady = true;\n body(createScope(this.onDomReadyCommands));\n }\n\n declareFunction(\n name: string,\n params: readonly string[],\n body: (s: VanillaScope) => void,\n ): void {\n const fnQueue: VanillaCommand[] = [];\n body(createScope(fnQueue));\n const bodyCode = renderCommands(fnQueue, ' ');\n this.topCommands.push({ type: 'declareFunction', name, params, bodyCode });\n }\n\n fn(name: string, body: (s: VanillaScope) => void): void;\n fn(name: string, params: readonly string[], body: (s: VanillaScope) => void): void;\n fn(\n name: string,\n paramsOrBody: readonly string[] | ((s: VanillaScope) => void),\n maybeBody?: (s: VanillaScope) => void,\n ): void {\n if (typeof paramsOrBody === 'function') {\n this.declareFunction(name, [], paramsOrBody);\n } else {\n if (maybeBody === undefined) {\n throw new Error('fn(): body function is required when params are provided');\n }\n this.declareFunction(name, paramsOrBody, maybeBody);\n }\n }\n\n render(): string {\n const parts: string[] = [];\n // トップレベル命令(append 順、declareFunction 含む)\n for (const cmd of this.topCommands) {\n parts.push(renderCommand(cmd));\n }\n // 末尾に DOMContentLoaded ブロック(呼ばれていれば)\n if (this._hasDomReady) {\n const bodyCode = renderCommands(this.onDomReadyCommands, ' ');\n parts.push(renderCommand({ type: 'domReady', bodyCode }));\n }\n return parts.join('\\n');\n }\n}\n\n/**\n * `VanillaScriptBuilder` インスタンスを生成する公開ファクトリ。\n *\n * クラス実装は非公開であり、このファクトリ経由でのみ取得できる。\n * `Root` は内部でこのファクトリを使用して単一の builder を遅延生成する。\n * 直接利用する場合は `append` / `fn` / `onDomReady` / `render` を呼ぶ。\n *\n * @returns 新しい `VanillaScriptBuilder` インスタンス\n *\n * @example\n * ```typescript\n * const builder = createVanillaScript();\n * builder.onDomReady(s => s.call('init'));\n * console.log(builder.render());\n * ```\n */\nexport function createVanillaScript(): VanillaScriptBuilder {\n return new VanillaScriptBuilderImpl();\n}\n","/**\n * `ScriptScope`: `root.script` および要素メソッド `on` ハンドラの `s` 引数として\n * 公開されるスクリプトスコープ API。\n *\n * 本ファイルは `unified-element-api` 仕様の Task 3.1 に対応する薄いアダプタであり、\n * 既存 `VanillaScriptBuilder` / `VanillaScope` の実装をパススルーで露出する。\n *\n * 対応 requirement: 3.1, 3.2, 3.3, 3.4, 3.5, 3.6\n * 対応 design.md セクション: 「ScriptScope」\n *\n * 方針:\n * - `ScriptScope` インターフェースは `VanillaScope` を拡張し、さらに\n * `VanillaScriptBuilder` のトップレベル API (`fn` / `onDomReady`) を表面化する。\n * - `.if` は内部 `VanillaScope.ifThen` へのエイリアスである(design の公開語彙に揃える)。\n * - 実装はクラスを作らず、既存オブジェクトに不足メソッドを合成する薄いラッパで与える。\n * - `VanillaCommand` / `VanillaScope` の既存コントラクトは一切変更しない。\n */\n\nimport type {\n ScopeExpr,\n VanillaScope,\n VanillaScriptBuilder,\n} from './vanilla-script-builder.ts';\nimport type { ReadableState } from './state/state.js';\nimport { type ScriptStateHandle, createScriptStateHandle } from './state/script-state-handle.js';\n\n/**\n * `root.script` 相当の API。`VanillaScope` の制御フロー API に、\n * トップレベル関数宣言 `fn` / DOMContentLoaded ブロック `onDomReady` と\n * `.if` エイリアスを加えたもの。\n *\n * design.md のサービスインターフェースが公開する語彙\n * (`fn` / `onDomReady` / `if` / `let` / `return` / `call` / `raw`)は\n * すべて本インターフェース上で型解決可能である。\n */\nexport interface ScriptScope extends VanillaScope {\n /**\n * トップレベルに関数定義を追加する。\n * `VanillaScriptBuilder.fn` のパススルー。\n */\n fn(name: string, body: (s: ScriptScope) => void): void;\n fn(name: string, params: readonly string[], body: (s: ScriptScope) => void): void;\n\n /**\n * `DOMContentLoaded` リスナー本体ブロックを登録する。\n * `VanillaScriptBuilder.onDomReady` のパススルー。\n */\n onDomReady(body: (s: ScriptScope) => void): void;\n\n /**\n * `if (cond) { then } else? { orElse }` を現在スコープに発行する。\n * 内部実装は `VanillaScope.ifThen` と同一(design の公開語彙 `.if` に揃えたエイリアス)。\n */\n if(\n condition: ScopeExpr,\n then: (s: ScriptScope) => void,\n orElse?: (s: ScriptScope) => void,\n ): void;\n\n /**\n * 状態参照から `ScriptStateHandle<T>` を取得する。\n * ハンドラ内で `s.state(ref).set(v)` / `.update(body)` の形で状態を更新する(Req 6.1)。\n */\n state<T>(ref: ReadableState<T>): ScriptStateHandle<T>;\n\n /**\n * transformer が生成したシリアライズ済みハンドラ本体を `handler-body` コマンドとして発行する。\n *\n * transformer は `.on(event, arrowFn)` の第 2 引数を\n * `(s) => s._emitHandlerBody(serialized, params)` の形に書き換える。\n * `.on` 実装側の dispatcher がその関数を呼ぶとき `s` に本メソッドが存在する専用スコープが渡される。\n *\n * @param code - シリアライズ済みハンドラ本体の JS コード文字列\n * @param params - ハンドラ引数名の配列(例: `[\"e\"]` または `[]`)\n */\n _emitHandlerBody(code: string, params: readonly string[]): void;\n}\n\n/**\n * 任意の `VanillaScope` を `ScriptScope` として露出するラッパを合成する。\n *\n * - 既存 `VanillaScope` オブジェクトには触れず、新規オブジェクトにプロパティを積む。\n * - `fn` / `onDomReady` は「ネストされた `if` / `onDomReady` の中から呼ばれた場合でも\n * 常に builder のトップレベルに到達する」ことを担保するため、builder 参照に委譲する。\n * - `_childScope` / `ifThen` / `if` から派生する子スコープも同じ builder を共有して\n * ScriptScope として再公開する(Req 3.5)。\n */\nfunction wrapScope(scope: VanillaScope, builder: VanillaScriptBuilder): ScriptScope {\n const wrapped: ScriptScope = {\n _append(cmd) {\n scope._append(cmd);\n },\n _childScope(queue) {\n return wrapScope(scope._childScope(queue), builder);\n },\n raw(code) {\n return scope.raw(code);\n },\n let(name, value) {\n return scope.let(name, value);\n },\n call(name, args) {\n return scope.call(name, args);\n },\n return() {\n scope.return();\n },\n ifThen(condition, then, orElse) {\n scope.ifThen(\n condition,\n (child) => {\n then(wrapScope(child, builder));\n },\n orElse === undefined\n ? undefined\n : (child) => {\n orElse(wrapScope(child, builder));\n },\n );\n },\n if(condition, then, orElse) {\n scope.ifThen(\n condition,\n (child) => {\n then(wrapScope(child, builder));\n },\n orElse === undefined\n ? undefined\n : (child) => {\n orElse(wrapScope(child, builder));\n },\n );\n },\n fn(\n name: string,\n paramsOrBody: readonly string[] | ((s: ScriptScope) => void),\n maybeBody?: (s: ScriptScope) => void,\n ) {\n if (typeof paramsOrBody === 'function') {\n const body = paramsOrBody;\n builder.fn(name, (child: VanillaScope) => {\n body(wrapScope(child, builder));\n });\n } else {\n if (maybeBody === undefined) {\n throw new Error('fn(): body function is required when params are provided');\n }\n const body = maybeBody;\n builder.fn(name, paramsOrBody, (child: VanillaScope) => {\n body(wrapScope(child, builder));\n });\n }\n },\n onDomReady(body) {\n builder.onDomReady((child) => {\n body(wrapScope(child, builder));\n });\n },\n state<T>(ref: ReadableState<T>): ScriptStateHandle<T> {\n return createScriptStateHandle(ref, scope);\n },\n _emitHandlerBody(_code: string, _params: readonly string[]): void {\n throw new Error(\n 'ScriptScope: _emitHandlerBody() is only available in a handler-body scope created by the .on dispatcher. ' +\n 'Do not call this method directly.',\n );\n },\n } as ScriptScope;\n return wrapped;\n}\n\n/**\n * `VanillaScriptBuilder` から `ScriptScope` を生成する公開ファクトリ。\n *\n * 設計上、Root は単一の `VanillaScriptBuilder` を保持し、\n * 初回アクセス時に本ファクトリで 1 つの `ScriptScope` を合成して保持する\n * (`RootFacade` 側の責務)。本関数自身は builder を改変しない。\n *\n * 内部で使う「トップレベル `VanillaScope`」は builder 自身が保持する専用スコープを\n * 用いず、`builder.append` を直接呼ぶ軽量な VanillaScope を合成する。これにより\n * トップレベル直下でも `raw` / `let` / `call` / `return` / `ifThen` が使える。\n */\nexport function createScriptScope(builder: VanillaScriptBuilder): ScriptScope {\n // builder のトップレベルキューに積むための最小 VanillaScope を合成する。\n // `VanillaScriptBuilder.append` がトップレベル命令キューへの唯一の入口であるため、\n // これに合わせて _append を実装し、制御フロー系は `_childScope` 経由で\n // 内部実装 (createScope) の再利用を期待する設計にはしない\n //(VanillaScope の `_childScope` は子キュー用であり、親キュー自体に対する\n // `let` / `call` / `ifThen` 用スコープは builder から直接取得できないため、\n // ここで同等の挙動をインラインで提供する)。\n //\n // 代替として、`builder.onDomReady` / `builder.fn` 経由で登録される本体は\n // それぞれの body 側で VanillaScope を受け取るので wrapScope でラップできる。\n // トップレベルでの `raw` / `let` / `call` / `return` / `ifThen` は\n // 本ユーティリティ上の軽量実装で満たす(builder.append への直接発行)。\n const topScope: VanillaScope = {\n _append(cmd) {\n builder.append(cmd);\n },\n _childScope(_queue) {\n // 子スコープは別キューを受け取り、その中で `VanillaScope` 相当の\n // 制御フローを実現する必要がある。既存の `createScope` 相当を\n // ここで複製するのは DRY を損なうため、内部 VanillaScope の参照を\n // `onDomReady` / `fn` の body 側から取得するルートに誘導する\n // (本トップレベル経路での `_childScope` 利用は想定しない)。\n throw new Error(\n 'createScriptScope(): top-level VanillaScope does not support _childScope. ' +\n 'Use `onDomReady` / `fn` / `if` to obtain a child scope.',\n );\n },\n raw(code) {\n return { code };\n },\n let(name, value) {\n builder.append({ type: 'declareConst', name, expr: value.code });\n return { code: name };\n },\n call(name, args) {\n const argList = (args ?? []).map((a) => a.code).join(', ');\n const code = `${name}(${argList})`;\n builder.append({ type: 'expr', code });\n return { code };\n },\n return() {\n builder.append({ type: 'raw', code: 'return;' });\n },\n ifThen(_condition, _then, _orElse) {\n // トップレベルでの `ifThen` はレアケースであり、設計上は `onDomReady` / `fn`\n // 内部からのみ期待される。必要になった段階で内部 VanillaScope の\n // `ifThen` 実装を共有化するリファクタを行う。\n throw new Error(\n 'createScriptScope(): top-level `if/ifThen` is not supported in Task 3.1. ' +\n 'Wrap it in `onDomReady` or `fn`.',\n );\n },\n };\n return wrapScope(topScope, builder);\n}\n","/**\n * DOM プロパティ / クラスリスト / スタイル操作 API の実装。\n *\n * 設計書 `design.md` の「dom-api」節と要件 3.1〜3.4, 4.1〜4.4 に対応する。\n *\n * - `toggleClass(scope, el, name, force?)` / `addClass` / `removeClass` は現在スコープに\n * `classListToggle` / `classListAdd` / `classListRemove` 命令を append する。\n * - `containsClass(el, name)` は `JsBoolExpr` を返す純関数(命令を発行しない)。\n * - `setText(scope, el, value)` / `setValue(scope, el, value)` は `setProp` 命令を発行し、\n * 文字列値は `JSON.stringify` でクォート、`JsExpr` は `.code` を未クォートで埋め込む。\n * - `getText(el)` / `getValue(el)` は `JsExpr` を返す純関数(`ElementRef` の直接プロパティを薄くラップ)。\n * - `setValue` / `getValue` は要素型を `HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement`\n * に型制約する(Req 4.2)。\n * - `setStyle<K extends WritableStyleKey>(scope, el, key, value)` は `setStyle` 命令を\n * 発行する。`WritableStyleKey` は `CSSStyleDeclaration` の書き込み可能プロパティのみ抽出(Req 4.4)。\n * - 出力に `jQuery` / `$` は含めない(Req 1.5, 7.1、`commands.ts` の語彙集約による担保)。\n *\n * 本ファイルは `VanillaScope` インターフェースを API で汚染しないため、\n * スコープを引数に取る自由関数として提供する。内部 append は `VanillaScope._append` 経由で行う。\n */\n\nimport type { ElementTarget } from '../commands.js';\nimport { _makeJsBoolExpr, _makeJsExpr } from '../element-ref.js';\nimport type {\n ElementRef,\n InputLikeElement,\n JsBoolExpr,\n JsExpr,\n WritableStyleKey,\n} from '../types.ts';\nimport type { VanillaScope } from '../vanilla-script-builder.ts';\n\nfunction closureRef(code: string): ElementTarget {\n return { kind: 'closure-ref', varName: code };\n}\n\n/**\n * 文字列または `JsExpr` を JS 式文字列にエンコードする。\n * - `string`: `JSON.stringify` でクォート・エスケープ。\n * - `JsExpr`: `.code` をそのまま埋め込む。\n */\nfunction encodeValue(value: string | JsExpr): string {\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n return value.code;\n}\n\n/**\n * 要素のクラスリストを切り替える命令を発行する(Req 3.1, 3.2)。\n *\n * @param scope - 命令を発行する現在スコープ。\n * @param el - 対象要素参照。\n * @param name - クラス名(`JSON.stringify` でクォートされる)。\n * @param force - 省略可の真偽式。`JsBoolExpr` を渡すと第 2 引数として埋め込まれる。\n */\nexport function toggleClass(\n scope: VanillaScope,\n el: ElementRef,\n name: string,\n force?: JsBoolExpr,\n): void {\n scope._append({\n type: 'classListToggle',\n target: closureRef(el.code),\n name,\n force: force === undefined ? undefined : force.code,\n });\n}\n\n/**\n * `element.classList.add(name)` 命令を発行する(Req 3.3)。\n */\nexport function addClass(scope: VanillaScope, el: ElementRef, name: string): void {\n scope._append({ type: 'classListAdd', target: closureRef(el.code), name });\n}\n\n/**\n * `element.classList.remove(name)` 命令を発行する(Req 3.3)。\n */\nexport function removeClass(scope: VanillaScope, el: ElementRef, name: string): void {\n scope._append({ type: 'classListRemove', target: closureRef(el.code), name });\n}\n\n/**\n * `element.classList.contains(name)` を `JsBoolExpr` として返す(Req 3.4)。\n *\n * 命令は発行せず、純関数として式を合成するのみ。`toggleClass` の `force` や\n * `ifThen` の条件として合成できる。`ElementRef.containsClass(name)` と等価。\n */\nexport function containsClass(el: ElementRef, name: string): JsBoolExpr {\n return _makeJsBoolExpr(`${el.code}.classList.contains(${JSON.stringify(name)})`);\n}\n\n/**\n * 要素の `textContent` に値を代入する命令を発行する(Req 4.1)。\n * 文字列値は `JSON.stringify` でクォート、`JsExpr` はそのまま埋め込む。\n */\nexport function setText(scope: VanillaScope, el: ElementRef, value: string | JsExpr): void {\n scope._append({\n type: 'setProp',\n target: closureRef(el.code),\n prop: 'textContent',\n expr: encodeValue(value),\n });\n}\n\n/**\n * 要素の `textContent` 参照を `JsExpr` として返す(Req 4.1)。\n * `ElementRef.textContent` と等価な薄いラッパ。\n */\nexport function getText(el: ElementRef): JsExpr {\n return _makeJsExpr(`${el.code}.textContent`);\n}\n\n/**\n * 入力系要素の `value` に値を代入する命令を発行する(Req 4.2)。\n *\n * 要素型は `HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement` に制約され、\n * `<div>` 等の非入力要素への `.value` 代入は TypeScript の型エラーとなる。\n */\nexport function setValue(\n scope: VanillaScope,\n el: ElementRef<InputLikeElement>,\n value: string | JsExpr,\n): void {\n scope._append({\n type: 'setProp',\n target: closureRef(el.code),\n prop: 'value',\n expr: encodeValue(value),\n });\n}\n\n/**\n * 入力系要素の `value` 参照を `JsExpr` として返す(Req 4.2)。\n * 要素型は入力系に制約される(型安全化)。\n */\nexport function getValue(el: ElementRef<InputLikeElement>): JsExpr {\n return _makeJsExpr(`${el.code}.value`);\n}\n\n/**\n * 要素の `style.<key>` に値を代入する命令を発行する(Req 4.3, 4.4)。\n *\n * 型パラメータ `K` は `WritableStyleKey`(`CSSStyleDeclaration` の書き込み可能プロパティ)\n * に制約され、未定義のプロパティ名は TypeScript の型エラーとなる。\n *\n * 文字列値は `JSON.stringify` でクォート、`JsExpr` は `.code` を未クォートで埋め込む。\n */\nexport function setStyle<K extends WritableStyleKey>(\n scope: VanillaScope,\n el: ElementRef,\n key: K,\n value: string | JsExpr,\n): void {\n scope._append({\n type: 'setStyle',\n target: closureRef(el.code),\n key: key as string,\n expr: encodeValue(value),\n });\n}\n","/**\n * DOM クエリ API (`query` / `queryAll` / `forEach` / `filterNot` / `length` / `cache`) の実装。\n *\n * 設計書 `design.md` の「query-api」節と要件 2.1〜2.4 に対応する。\n *\n * - `query(scope, sel)` / `queryAll(scope, sel)` はセレクタを `JSON.stringify` でクォートし、\n * `kind: \"selector\"` / `\"listSelector\"` の参照を返す(`scope` を内部保持し cache 可能にする)。\n * - `forEach(scope, list, body)` は `forEach` 命令を発行し、子スコープに `item` 変数を\n * 束縛した `ElementRef` を渡す。\n * - `filterNot(list, predicate)` / `length(list)` は合成 `JsExpr` を返し、\n * `Array.from(...).filter(...).length` 形で埋め込まれる。\n * - `ElementRef.cache(name?)` は `element-ref.ts` 側に実装。現在スコープに\n * `declareConst` を append して `kind: \"var\"` の新参照を返す。\n *\n * ファイル責務:ユーザ向け関数を export するのみで状態を持たない。\n */\n\nimport { renderCommands, type VanillaCommand } from '../commands.js';\nimport {\n _makeJsExpr,\n _makeScopedElementRef,\n _makeScopedElementListRef,\n} from '../element-ref.js';\nimport type { ElementRef, ElementListRef, JsExpr, JsBoolExpr } from '../types.ts';\nimport type { VanillaScope } from '../vanilla-script-builder.ts';\n\n/**\n * `document.querySelector(sel)` をインライン展開する `ElementRef` を生成する。\n * セレクタ文字列は `JSON.stringify` でクォート・エスケープされる(Req 2.1)。\n *\n * 返される参照は `scope` に紐付いており、`.cache(name?)` で `const` 畳み込みができる。\n *\n * @throws 空文字セレクタのとき `Error`。\n */\nexport function query<E extends Element = HTMLElement>(\n scope: VanillaScope,\n selector: string,\n): ElementRef<E> {\n if (selector.length === 0) {\n throw new Error('query(): selector must not be empty');\n }\n return _makeScopedElementRef<E>(\n 'selector',\n `document.querySelector(${JSON.stringify(selector)})`,\n scope,\n );\n}\n\n/**\n * `document.querySelectorAll(sel)` をインライン展開する `ElementListRef` を生成する(Req 2.2)。\n *\n * @throws 空文字セレクタのとき `Error`。\n */\nexport function queryAll<E extends Element = HTMLElement>(\n _scope: VanillaScope,\n selector: string,\n): ElementListRef<E> {\n if (selector.length === 0) {\n throw new Error('queryAll(): selector must not be empty');\n }\n return _makeScopedElementListRef<E>(\n 'listSelector',\n `document.querySelectorAll(${JSON.stringify(selector)})`,\n );\n}\n\n/**\n * リストを反復する `forEach` 命令を発行する(Req 2.3 副作用系)。\n *\n * 子スコープで `item` 変数名に `ElementRef` を束縛し、`body` に渡す。\n * リスト式が `NodeList` 形式(`querySelectorAll` 結果)でも `Array.from` に\n * 依存せずそのまま `.forEach` を呼べるため、`listExpr` は `list.code` をそのまま使う。\n */\nexport function forEach<E extends Element>(\n scope: VanillaScope,\n list: ElementListRef<E>,\n body: (innerScope: VanillaScope, item: ElementRef<E>) => void,\n): void {\n const bodyQueue: VanillaCommand[] = [];\n const childScope = scope._childScope(bodyQueue);\n const itemRef = _makeScopedElementRef<E>('var', 'item', childScope);\n body(childScope, itemRef);\n const bodyCode = renderCommands(bodyQueue, ' ');\n scope._append({\n type: 'forEach',\n listExpr: list.code,\n itemVar: 'item',\n bodyCode,\n });\n}\n\n/**\n * 述語に一致しない要素だけを残す合成 `ElementListRef` を返す(Req 2.3 値系)。\n *\n * 出力形式: `Array.from(<list>).filter((x) => !<predicate(x)>)`。\n * 述語は `ElementRef`(`kind: \"var\"`、`code === \"x\"`)を受け取り、`JsBoolExpr` を返す純関数。\n */\nexport function filterNot<E extends Element>(\n list: ElementListRef<E>,\n predicate: (item: ElementRef<E>) => JsBoolExpr,\n): ElementListRef<E> {\n // filter 述語の引数名は \"x\" 固定(forEach の \"item\" と名前を変えて衝突を避ける)。\n const itemRef = _itemRefForFilter<E>('x');\n const predCode = predicate(itemRef).code;\n const code = `Array.from(${list.code}).filter((x) => !(${predCode}))`;\n return _makeScopedElementListRef<E>('listExpr', code);\n}\n\n/**\n * リストの要素数を `JsExpr` として返す(Req 2.3 値系)。\n *\n * - `kind: \"listSelector\"`(`NodeList` 形式): `.length` プロパティを直接参照する\n * (`NodeList` はネイティブで `length` を持つ)。\n * - `kind: \"listExpr\"`(`filterNot` の結果など `Array.from(...).filter(...)` 形式):\n * 既に `Array` なので `.length` を直接参照する。\n *\n * この設計により、`length(filterNot(queryAll(...), pred)).code` は\n * `Array.from(<sel>).filter((x) => !(<pred>)).length` 形になり、重複 `Array.from` を避ける。\n */\nexport function length(list: ElementListRef): JsExpr {\n return _makeJsExpr(`${list.code}.length`);\n}\n\n/**\n * `filterNot` 用の軽量 ElementRef(スコープ非紐付け)。\n * `cache()` を呼ばれても例外になるよう、スコープは渡さない。\n * 純粋に述語内で `x.classList.contains(...)` 等のチェーンを構築するためだけの参照。\n */\nfunction _itemRefForFilter<E extends Element>(name: string): ElementRef<E> {\n // スコープ無し= cache() 不可。述語内で cache は意味を持たない(副作用不可)。\n return _makeScopedElementRef<E>('var', name, _NO_SCOPE_SENTINEL);\n}\n\n/**\n * 述語評価で scope が必要にならないことをランタイムで担保するための番兵スコープ。\n * 述語が誤って `s.let(...)` 等を呼んだ場合は早期に Error を投げる。\n */\nconst _NO_SCOPE_SENTINEL: VanillaScope = {\n _append() {\n throw new Error(\n 'filterNot predicate must not emit commands; use pure ElementRef chain methods only.',\n );\n },\n _childScope() {\n throw new Error('filterNot predicate must not open child scopes.');\n },\n raw(code) {\n return { code };\n },\n let() {\n throw new Error('filterNot predicate must not declare variables.');\n },\n call() {\n throw new Error('filterNot predicate must not emit call expressions.');\n },\n return() {\n throw new Error('filterNot predicate must not emit return statements.');\n },\n ifThen() {\n throw new Error('filterNot predicate must not emit control flow.');\n },\n};\n","/**\n * DOM ツリー操作 API (`appendChild` / `remove` / `removeAll`) の実装。\n *\n * 設計書 `design.md` の「tree-api: appendChild / remove / removeAll」節と\n * 要件 5.1, 5.2, 5.3, 6.2 に対応する。\n *\n * - `appendChild(scope, parent, child)` は `appendChild` 命令を発行する。\n * `child` は `ElementRef` もしくは `JsExpr`(`jsTemplate` 生成関数の呼び出し結果など、\n * `.code` を備えた値オブジェクト)を受け付ける(Req 5.1, 6.2)。\n * - `remove(scope, el)` は単一要素の `remove` 命令を発行する(Req 5.2)。\n * - `removeAll(scope, list)` は `list.forEach((item) => { item.remove(); })` 相当の\n * `forEach` 命令を発行する(Req 5.3)。子スコープ内では `remove(childScope, item)` を\n * 通じて同じ `remove` 命令を発行するため、語彙集約(`commands.ts`)の単一責務を維持する。\n * - 出力に `jQuery` / `$` は含めない(Req 1.5, 7.1、`commands.ts` の語彙集約による担保)。\n *\n * 本ファイルは `VanillaScope` インターフェースを API で汚染しないため、\n * スコープを引数に取る自由関数として提供する。内部 append は `VanillaScope._append` 経由で行う。\n */\n\nimport { renderCommands, type ElementTarget, type VanillaCommand } from '../commands.js';\nimport { _makeScopedElementRef } from '../element-ref.js';\nimport type { ElementListRef, ElementRef, JsExpr } from '../types.ts';\nimport type { VanillaScope } from '../vanilla-script-builder.ts';\n\n/**\n * `.code` を備えた任意の値オブジェクト(`ElementRef` / `JsExpr` / `ScopeExpr`)。\n * `child` 引数の型制約として使用する。\n */\ninterface CodeBearing {\n readonly code: string;\n}\n\n/**\n * `parent.appendChild(child);` を現在スコープに発行する(Req 5.1, 6.2)。\n *\n * `child` は `ElementRef` または任意の `JsExpr`(関数呼び出し結果など `.code` を備えた式)を\n * 受け付ける。後者により `appendChild(scope, parent, call(\"createTodoItem\", [text]))` のような\n * ファクトリ関数結果の直接追加が可能になる。\n */\nexport function appendChild(\n scope: VanillaScope,\n parent: ElementRef,\n child: ElementRef | JsExpr | CodeBearing,\n): void {\n scope._append({\n type: 'appendChild',\n parent: { kind: 'closure-ref', varName: parent.code },\n child: { kind: 'closure-ref', varName: child.code },\n });\n}\n\n/**\n * `el.remove();` を現在スコープに発行する(Req 5.2)。\n */\nexport function remove(scope: VanillaScope, el: ElementRef): void {\n const elTarget: ElementTarget = { kind: 'closure-ref', varName: el.code };\n scope._append({ type: 'remove', target: elTarget });\n}\n\n/**\n * `list.forEach((item) => { item.remove(); });` 相当の命令を現在スコープに発行する(Req 5.3)。\n *\n * 子スコープを開き、`item` 変数を `ElementRef` として束縛したうえで `remove(childScope, item)`\n * を呼び出すことで、`remove` 命令を `forEach` 本体内に 1 件 append する。\n * `listExpr` には `list.code` をそのまま埋め込む(`NodeList` でも `.forEach` が使えるため\n * `Array.from` ラップは不要)。\n */\nexport function removeAll<E extends Element>(\n scope: VanillaScope,\n list: ElementListRef<E>,\n): void {\n const bodyQueue: VanillaCommand[] = [];\n const childScope = scope._childScope(bodyQueue);\n const itemRef = _makeScopedElementRef<E>('var', 'item', childScope);\n remove(childScope, itemRef);\n const bodyCode = renderCommands(bodyQueue, ' ');\n scope._append({\n type: 'forEach',\n listExpr: list.code,\n itemVar: 'item',\n bodyCode,\n });\n}\n","/**\n * `SelectorRef<E>` / `CollectionRef<E>` の実装。\n *\n * 本モジュールは `unified-element-api` 仕様の Task 3.4 に対応し、\n * `root.$` / `root.$$` の戻り値として公開するセレクタ参照ノードを提供する。\n *\n * 設計方針:\n * - `SelectorRef<E>` は `ElementMethods<SelectorRef<E>>` を実装し、内部で\n * `VanillaScope` と `ElementRef<E>` を保持して DOM 操作メソッドを提供する。\n * - `CollectionRef<E>` は `VanillaScope` と `ElementListRef<E>` を保持し、\n * `filterNot` / `length` / `removeAll` / `forEach` を提供する。\n * - 内部実装は `internal/dom-api` / `internal/query-api` / `internal/tree-api` に委譲する。\n * - `on` ハンドラ / `forEach` 本体のスコープは `_makeHandlerScope` を再利用する。\n *\n * 対応 requirement: 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 (unified-element-api)\n * 依存: Task 3.3 (ElementMethods, _makeHandlerScope, renderElementTarget, HasPending)\n * Task 1.2 (internal/query-api, dom-api, tree-api)\n */\n\nimport { renderCommands, type ElementTarget, type VanillaCommand } from './commands.js';\nimport { encodeLiteral } from './expr-factory.js';\nimport { _makeScopedElementRef } from './element-ref.js';\nimport {\n _makeHandlerScope,\n _getElementTarget,\n isArrowShape,\n type ElementMethods,\n type HandlerCallback,\n type HasPending,\n} from './element-methods.js';\nimport { containsClass as _containsClass } from './internal/dom-api.js';\nimport { filterNot as _filterNot } from './internal/query-api.js';\nimport { removeAll as _removeAll } from './internal/tree-api.js';\nimport type { ScriptScope } from './script-scope.ts';\nimport {\n emitBindChecked,\n emitBindClassAdd,\n emitBindClassAll,\n emitBindEach,\n emitBindStyle,\n emitBindText,\n emitBindValue,\n} from './state/binding-emitter.js';\nimport type { EachBinding, ReadableState } from './state/state.js';\nimport type { EachTemplateSnapshot } from './state/each-template.js';\nimport { isReadableState } from './state/type-guards.js';\nimport type { ElementListRef, ElementRef, JsBoolExpr, JsExpr } from './types.ts';\nimport type { VanillaScope } from './vanilla-script-builder.ts';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 公開型定義\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * `root.$<E>(selector)` の戻り値。\n *\n * `ElementMethods<SelectorRef<E>>` を実装し、セレクタ対象要素への\n * DOM 操作メソッドを提供する。加えて `containsClass` / `cache` を追加する。\n *\n * 設計: SelectorRef は常に scope に紐付いており、バッファを持たない\n *(Root への登録が前提のため、即時 scope._append する)。\n */\nexport interface SelectorRef<E extends Element = HTMLElement> extends ElementMethods<SelectorRef<E>> {\n /** `element.classList.contains(name)` を `JsBoolExpr` として返す(Req 2.4)。 */\n containsClass(name: string): JsBoolExpr;\n /**\n * セレクタ結果をローカル変数にキャッシュし、新しい `SelectorRef` を返す(Req 2.5)。\n * 同一セレクタを複数回埋め込む副作用を避けたい場合に使用する。\n */\n cache(name: string): SelectorRef<E>;\n}\n\n/**\n * `root.$$<E>(selector)` の戻り値。\n *\n * `filterNot` / `length` / `removeAll` / `forEach` を提供するコレクション参照。\n */\nexport interface CollectionRef<E extends Element = HTMLElement> {\n /**\n * 述語に一致しない要素だけを残す新しい `CollectionRef` を返す(Req 2.3)。\n * 式の合成のみを行い、scope にコマンドを追加しない。\n */\n filterNot(predicate: (ref: SelectorRef<E>) => JsBoolExpr): CollectionRef<E>;\n /** コレクション内の要素数を `JsExpr` として返す(Req 2.3)。 */\n readonly length: JsExpr;\n /** コレクション内の全要素を削除する命令を scope に追加する(Req 2.3)。 */\n removeAll(): void;\n /**\n * コレクションを反復する `forEach` 命令を scope に追加する(Req 2.3)。\n * コールバックは `SelectorRef<E>` と `ScriptScope` を受け取る。\n */\n forEach(body: (ref: SelectorRef<E>, s: ScriptScope) => void): void;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SelectorRef ファクトリ\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * `SelectorRef<E>` を生成する内部ファクトリ。\n *\n * `root.$<E>(selector)` から呼ばれる。scope は Root の VanillaScope。\n */\nexport function createSelectorRef<E extends Element = HTMLElement>(\n scope: VanillaScope,\n ref: ElementRef<E>,\n): SelectorRef<E> {\n // `ref.code` は既に完全な JS 式(`document.querySelector(...)` または変数名)なので\n // `{ kind: 'closure-ref', varName: ref.code }` として binding-emitter に渡す。\n // closure-ref バリアントは renderElementTarget で裸の識別子としてそのまま埋め込まれる。\n const elTarget: ElementTarget = { kind: 'closure-ref', varName: ref.code };\n\n /** `EachBinding<U>` + `_snapshot` を持つかどうかを判別するタイプガード */\n function isEachBindingWithSnapshot(\n v: unknown,\n ): v is EachBinding<unknown> & { readonly _snapshot: EachTemplateSnapshot } {\n return (\n typeof v === 'object' &&\n v !== null &&\n (v as EachBinding<unknown>)._kind === 'each' &&\n '_snapshot' in v\n );\n }\n\n // `on` の実装シグネチャ(task 2.2 で 3分岐 dispatcher を追加)。\n // インターフェース上は 3 つのオーバーロードを持つが、実装シグネチャは単一。\n // 型アサーションで SelectorRef<E>.on の型をオーバーライドし、型不整合エラーを回避する。\n function onImpl(event: string, handler: HandlerCallback): SelectorRef<E> {\n // dispatcher: transformer 経由(_draftoleEmitted マーカー)\n if ((handler as unknown as { _draftoleEmitted?: boolean })._draftoleEmitted === true) {\n const bodyQueue: VanillaCommand[] = [];\n const childScope = _makeHandlerScope(bodyQueue, elTarget, event);\n handler(childScope);\n for (const cmd of bodyQueue) {\n scope._append(cmd);\n }\n return self;\n }\n\n // dispatcher: 未変換アロー関数 safety net\n if (isArrowShape(handler as unknown as (...args: unknown[]) => unknown)) {\n throw new Error(\n 'DraftOle: arrow-function handler requires the draftole TypeScript transformer; see docs/api/handler-serialization.md',\n );\n }\n\n // dispatcher: 従来の HandlerCallback 経路\n const bodyQueue: VanillaCommand[] = [];\n const childScope = _makeHandlerScope(bodyQueue);\n handler(childScope);\n const bodyCode = renderCommands(bodyQueue, ' ');\n const handlerCode = bodyCode.length === 0 ? '(e) => {}' : `(e) => {\\n${bodyCode}\\n}`;\n scope._append({ type: 'addEventListener', target: elTarget, event, handlerCode });\n return self;\n }\n\n const self: SelectorRef<E> = {\n on: onImpl as SelectorRef<E>['on'],\n\n setText(value: string | JsExpr | ReadableState<string>) {\n if (isReadableState<string>(value)) {\n scope._append(emitBindText(elTarget, value));\n } else {\n scope._append({ type: 'setProp', target: elTarget, prop: 'textContent', expr: encodeLiteral(value) });\n }\n return self;\n },\n\n text(value: string | JsExpr | ReadableState<string>) {\n return self.setText(value);\n },\n\n setValue(value: string | JsExpr | ReadableState<string>) {\n if (isReadableState<string>(value)) {\n scope._append(emitBindValue(elTarget, value));\n } else {\n scope._append({ type: 'setProp', target: elTarget, prop: 'value', expr: encodeLiteral(value) });\n }\n return self;\n },\n\n value(v: string | JsExpr | ReadableState<string>) {\n return self.setValue(v);\n },\n\n setStyle(prop: string, value: string | JsExpr | ReadableState<string>) {\n if (isReadableState<string>(value)) {\n scope._append(emitBindStyle(elTarget, prop, value));\n } else {\n scope._append({ type: 'setStyle', target: elTarget, key: prop, expr: encodeLiteral(value) });\n }\n return self;\n },\n\n addClass(name: string | ReadableState<string>) {\n if (isReadableState<string>(name)) {\n scope._append(emitBindClassAdd(elTarget, name));\n } else {\n scope._append({ type: 'classListAdd', target: elTarget, name });\n }\n return self;\n },\n\n class(name: string | JsExpr | ReadableState<string>) {\n if (isReadableState<string>(name)) {\n scope._append(emitBindClassAll(elTarget, name));\n } else {\n const nameStr = typeof name === 'string' ? name : name.code;\n scope._append({ type: 'classListAdd', target: elTarget, name: nameStr });\n }\n return self;\n },\n\n checked(value: ReadableState<boolean>) {\n scope._append(emitBindChecked(elTarget, value));\n return self;\n },\n\n toggleClass(name, force) {\n scope._append({ type: 'classListToggle', target: elTarget, name, force: force?.code });\n return self;\n },\n\n removeClass(name) {\n scope._append({ type: 'classListRemove', target: elTarget, name });\n return self;\n },\n\n appendChild(child: unknown) {\n if (isEachBindingWithSnapshot(child)) {\n scope._append(emitBindEach(elTarget, child));\n } else {\n const childTarget = _getElementTarget(child as unknown as HasPending);\n scope._append({\n type: 'appendChild',\n parent: elTarget,\n child: childTarget,\n });\n }\n return self;\n },\n\n containsClass(name) {\n return _containsClass(ref as ElementRef, name);\n },\n\n cache(name) {\n const cachedRef = ref.cache(name);\n return createSelectorRef(scope, cachedRef);\n },\n };\n return self;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CollectionRef ファクトリ\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * `CollectionRef<E>` を生成する内部ファクトリ。\n *\n * `root.$$<E>(selector)` から呼ばれる。scope は Root の VanillaScope。\n */\nexport function createCollectionRef<E extends Element = HTMLElement>(\n scope: VanillaScope,\n listRef: ElementListRef<E>,\n): CollectionRef<E> {\n return {\n filterNot(predicate) {\n const filtered = _filterNot<E>(listRef, (item) =>\n predicate(createSelectorRef<E>(_NO_SCOPE_SENTINEL, item)),\n );\n return createCollectionRef(scope, filtered);\n },\n\n get length() {\n return listRef.length;\n },\n\n removeAll() {\n _removeAll(scope, listRef);\n },\n\n forEach(body) {\n const bodyQueue: VanillaCommand[] = [];\n const childScope = _makeHandlerScope(bodyQueue);\n const itemRef = _makeScopedElementRef<E>('var', 'item', childScope);\n const itemSelectorRef = createSelectorRef(childScope, itemRef);\n body(itemSelectorRef, childScope);\n const bodyCode = renderCommands(bodyQueue, ' ');\n scope._append({ type: 'forEach', listExpr: listRef.code, itemVar: 'item', bodyCode });\n },\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 内部: フィルタ述語用の番兵スコープ\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * `filterNot` 述語評価で副作用操作が呼ばれた場合に早期 Error を投げる番兵スコープ。\n * 述語は純粋な式合成のみを想定しており、scope への命令 append は禁止する。\n */\nconst _NO_SCOPE_SENTINEL: VanillaScope = {\n _append() {\n throw new Error('filterNot predicate must not emit commands; use pure SelectorRef chain methods only.');\n },\n // 防御的 fallback: 以下 _childScope メソッドは SelectorRef の全 mutator が\n // scope._append() 経由でのみ命令を発行するため、filterNot 述語経由でも\n // 到達不能。将来の内部リファクタで誤って到達経路が生まれた場合に備えた\n // 静的ガードとして保持する。\n /* v8 ignore start */\n _childScope() {\n throw new Error('filterNot predicate must not open child scopes.');\n },\n /* v8 ignore stop */\n raw(code) {\n return { code };\n },\n // 防御的 fallback: 以下 4 メソッド (let / call / return / ifThen) は\n // SelectorRef の全 mutator が scope._append() 経由でのみ命令を発行するため、\n // filterNot 述語経由でも到達不能。将来の内部リファクタで誤って到達経路が\n // 生まれた場合に備えた静的ガードとして保持する。\n /* v8 ignore start */\n let() {\n throw new Error('filterNot predicate must not declare variables.');\n },\n call() {\n throw new Error('filterNot predicate must not emit call expressions.');\n },\n return() {\n throw new Error('filterNot predicate must not emit return statements.');\n },\n ifThen() {\n throw new Error('filterNot predicate must not emit control flow.');\n },\n /* v8 ignore stop */\n};\n","/**\n * StateRegistry — 状態エントリの管理と状態 ID 採番を担うクラス。\n *\n * 設計書 `design.md` の「Components and Interfaces: StateRegistry」に対応。\n * - 状態 ID → StateEntry のマッピングを管理する\n * - 状態 ID を \"s0\", \"s1\", ... の形式で一意に採番する\n * - state-init コマンド列を生成して FileExporter に提供する(Req 1.2, 1.3, 5.4)\n *\n * Note: StateInitCommand は tasks 3.1 で commands.ts に移動予定のため、\n * 現時点ではこのファイル内にローカル定義する。\n */\n\nimport type { JsExpr } from '../types.js';\n\n/**\n * 状態エントリ(StateRegistry 内部)。\n * design.md の Data Models セクションに対応。\n */\nexport interface StateEntry {\n /** ランタイム状態 ID(例: \"s0\", \"s1\")*/\n runtimeId: string;\n /** JSON.stringify された初期値を表す JS 式 */\n initialExpr: JsExpr;\n /** 型名(デバッグ用、optional)*/\n typeHint?: string;\n}\n\n/**\n * state-init コマンドを表すローカル型。\n * タスク 3.1 で VanillaCommand に統合予定。\n */\nexport interface StateInitCommand {\n type: 'state-init';\n id: string;\n initial: JsExpr;\n}\n\n/**\n * Computed 派生状態のエントリ。\n * 方針 B: .map() で生成された Computed をランタイム状態として管理する。\n * sourceId の変化を購読して derivedId を更新するサブスクリプションを生成する。\n */\nexport interface DerivedEntry {\n /** 派生状態の ID(allocateId() で採番済み)*/\n derivedId: string;\n /** 購読元の状態 ID(直接の親状態)*/\n sourceId: string;\n /** _v を入力変数とした変換式(例: `((_v).filter(...).length)`)*/\n transformBody: JsExpr;\n}\n\n/**\n * derive-state コマンドを表す型。\n * file-exporter が renderCommand に渡すために使用する。\n */\nexport interface DeriveStateCommand {\n type: 'derive-state';\n sourceId: string;\n derivedId: string;\n transformBody: JsExpr;\n}\n\n/**\n * StateRegistry クラス。\n *\n * - `allocateId()`: \"s0\", \"s1\", ... の形式で一意な状態 ID を採番\n * - `register(entry)`: StateEntry を entries マップに登録\n * - `isEmpty()`: 状態が 1 つも宣言されていないか確認(Req 5.4)\n * - `listInitCommands()`: state-init コマンド列を返す(FileExporter が利用)\n */\nexport class StateRegistry {\n private _nextId: number = 0;\n readonly entries: Map<string, StateEntry> = new Map();\n private readonly _derivedEntries: DerivedEntry[] = [];\n\n /**\n * 次の一意な状態 ID を採番して返す(\"s0\", \"s1\", ...)。\n * 採番のみ行い、エントリへの登録は行わない。\n * Req 1.3: 同一 Root から root.state(...) を複数回呼び出すと、呼び出しごとに異なる状態 ID を採番。\n */\n allocateId(): string {\n return `s${this._nextId++}`;\n }\n\n /**\n * StateEntry を entries マップに追加する。\n * runtimeId をキーとして Map に格納する。\n */\n register(entry: StateEntry): void {\n this.entries.set(entry.runtimeId, entry);\n }\n\n /**\n * Computed 派生エントリを登録する。\n * .map() で生成された Computed ごとに呼ばれる(方針 B)。\n */\n registerDerived(entry: DerivedEntry): void {\n this._derivedEntries.push(entry);\n }\n\n /**\n * derive-state コマンド列を返す。\n * file-exporter が state-init の直後に出力して親→派生のサブスクリプションを確立する。\n * 登録順で返すことで依存関係の解決順序を保証する。\n */\n listDeriveCommands(): DeriveStateCommand[] {\n return this._derivedEntries.map((entry) => ({\n type: 'derive-state' as const,\n sourceId: entry.sourceId,\n derivedId: entry.derivedId,\n transformBody: entry.transformBody,\n }));\n }\n\n /**\n * 状態が 1 つも宣言されていないか確認する。\n * Req 5.4: Root に状態が 1 つも宣言されていない場合、FileExporter はプレリュードを出力しない。\n */\n isEmpty(): boolean {\n return this.entries.size === 0;\n }\n\n /**\n * state-init コマンド列を返す。\n * FileExporter が script.js に初期化コードを出力するために利用する(Req 1.2)。\n * エントリの登録順でコマンドを返す。\n */\n listInitCommands(): StateInitCommand[] {\n return Array.from(this.entries.values()).map((entry) => ({\n type: 'state-init' as const,\n id: entry.runtimeId,\n initial: entry.initialExpr,\n }));\n }\n}\n","/**\n * `RuntimeContext` — script scope / expr factory / selectors / state registry /\n * JS aggregation の受け皿となる独立クラス。\n *\n * 設計書 `design.md` の「RuntimeContext」節に対応する。\n *\n * 責務:\n * - VanillaScriptBuilder を遅延初期化して保持する(vanilla builder owner)\n * - ScriptScope を公開する(getScope())\n * - StateRegistry を内部で管理し、state<T>(initial) で State<T> を採番・返却する\n * - renderUserJs() で Vanilla JS 文字列を返す\n * - buildExportRuntimeSnapshot() でエクスポート用スナップショットを生成する\n *\n * 依存方向ルール:\n * - js/vanilla/* からの import は許可\n * - publisher/* または document/* からの import は禁止\n *\n * Requirements: 2.2, 5.2 (root-responsibility-separation)\n * Design: 「RuntimeContext」節\n */\n\nimport { createVanillaScript } from '../js/vanilla/vanilla-script-builder.js';\nimport { createScriptScope } from '../js/vanilla/script-scope.js';\nimport { createExprFactory } from '../js/vanilla/expr-factory.js';\nimport { createSelectorRef, createCollectionRef } from '../js/vanilla/selector-ref.js';\nimport { fromSelector, listFromSelector } from '../js/vanilla/element-ref.js';\nimport { JQueryHelper } from '../js/jquery-helper.js';\nimport { StateRegistry } from '../js/vanilla/state/registry.js';\nimport { StateImpl } from '../js/vanilla/state/state.js';\nimport { makeJsExpr } from '../js/vanilla/state/state.js';\nimport type { ScriptScope } from '../js/vanilla/script-scope.js';\nimport type { ExprFactory } from '../js/vanilla/expr-factory.js';\nimport type { SelectorRef, CollectionRef } from '../js/vanilla/selector-ref.js';\nimport type { VanillaScriptBuilder } from '../js/vanilla/vanilla-script-builder.js';\nimport type { State } from '../js/vanilla/state/state.js';\nimport type { JsExpr, JsBoolExpr } from '../js/vanilla/types.js';\nimport type { JQueryMethodType } from '../html/protocols/jquery-method-type.js';\n\n// ─── 公開型 ──────────────────────────────────────────────────────────────────\n\n/**\n * エクスポート用ランタイムスナップショット。\n *\n * - `userJs`: Vanilla JS Builder が生成したユーザー定義スクリプト文字列\n * - `runtimePrelude`: ランタイムプレリュード(task 4.x で追加予定)\n * - `runtimeInitJs`: 状態初期化コード(task 4.x で追加予定)\n */\nexport interface RuntimeSnapshot {\n userJs: string;\n runtimePrelude?: string;\n runtimeInitJs?: string;\n}\n\n// ─── RuntimeContext クラス ────────────────────────────────────────────────────\n\n/**\n * ランタイムグラフの所有者として script scope / expr factory / selectors /\n * state registry / JS aggregation を管理する独立クラス。\n *\n * Root から参照されるが、Root の存在を前提としない(Root 非依存)。\n * publisher/* / document/* には依存しない。\n *\n * @example\n * ```typescript\n * const ctx = new RuntimeContext();\n * const count = ctx.state(0);\n * ctx.getScope().onDomReady(s => {\n * s.call('init');\n * });\n * const js = ctx.renderUserJs();\n * ```\n */\nexport class RuntimeContext {\n /** Vanilla JS Builder(遅延初期化)。 */\n private _vanillaBuilder: VanillaScriptBuilder | undefined;\n\n /** Script Scope(遅延初期化)。 */\n private _scriptScope: ScriptScope | undefined;\n\n /** State Registry(遅延初期化)。 */\n private _stateRegistry: StateRegistry | undefined;\n\n /** Expr Factory(遅延初期化)。 */\n private _exprFactory: ExprFactory | undefined;\n\n // ─── Scope ──────────────────────────────────────────────────────────────\n\n /**\n * Script Scope を遅延初期化して返す。\n *\n * 初回呼び出し時に VanillaScriptBuilder と ScriptScope を生成してキャッシュする。\n * 以後は同一インスタンスを返す(単一スコープ保証)。\n *\n * @returns キャッシュされた `ScriptScope` インスタンス\n */\n getScope(): ScriptScope {\n if (this._scriptScope !== undefined) {\n return this._scriptScope;\n }\n const builder = createVanillaScript();\n const scope = createScriptScope(builder);\n this._vanillaBuilder = builder;\n this._scriptScope = scope;\n return scope;\n }\n\n // ─── State ──────────────────────────────────────────────────────────────\n\n /**\n * 一意な状態 ID を採番し、State<T> を返す。\n *\n * StateRegistry を遅延初期化し、runtimeId \"s0\" / \"s1\" / ... の形式で採番する。\n * 同一 RuntimeContext インスタンスから複数回呼ぶと異なる ID が採番される。\n *\n * @param initial - 状態の初期値\n * @returns `State<T>` — 一意な `_runtimeId` を持つ観測可能値オブジェクト\n */\n state<T>(initial: T): State<T> {\n if (this._stateRegistry === undefined) {\n this._stateRegistry = new StateRegistry();\n }\n const registry = this._stateRegistry;\n const id = registry.allocateId();\n const code = JSON.stringify(initial);\n\n const makeBool = (c: string): JsBoolExpr =>\n ({ __jsExpr: true as const, __jsBool: true as const, code: c }) as JsBoolExpr;\n\n const initialExpr: JsExpr = {\n __jsExpr: true as const,\n code,\n eq(other: string | number | JsExpr): JsBoolExpr {\n const otherCode = typeof other === 'object' ? other.code : JSON.stringify(other);\n return makeBool(`${code} === ${otherCode}`);\n },\n ne(other: string | number | JsExpr): JsBoolExpr {\n const otherCode = typeof other === 'object' ? other.code : JSON.stringify(other);\n return makeBool(`${code} !== ${otherCode}`);\n },\n or(fallback: string | JsExpr): JsExpr {\n const fbCode = typeof fallback === 'object' ? fallback.code : JSON.stringify(fallback);\n return makeJsExpr(`(${code} || ${fbCode})`);\n },\n trim(): JsExpr {\n return makeJsExpr(`(${code}).trim()`);\n },\n isFalsy(): JsBoolExpr {\n return makeBool(`!(${code})`);\n },\n isTruthy(): JsBoolExpr {\n return makeBool(`!!(${code})`);\n },\n };\n\n registry.register({ runtimeId: id, initialExpr });\n return new StateImpl<T>(id, registry);\n }\n\n // ─── StateRegistry アクセス ──────────────────────────────────────────────\n\n /**\n * StateRegistry への読み取りアクセス。\n *\n * `state()` を一度も呼んでいない場合は `undefined` を返す(遅延初期化と整合)。\n * Root の `_stateRegistry` getter から参照される(task 3.2 委譲)。\n */\n get stateRegistry(): StateRegistry | undefined {\n return this._stateRegistry;\n }\n\n // ─── JS 出力 ─────────────────────────────────────────────────────────────\n\n /**\n * Vanilla JS Builder の出力を文字列として返す。\n *\n * `getScope()` 経由で積まれたすべての JS コマンドを `VanillaScriptBuilder.render()`\n * で文字列化して返す。Builder が未初期化の場合(スクリプトが何も追加されていない場合)は\n * 空文字列を返す。\n *\n * @returns ユーザー定義 Vanilla JS 文字列(スクリプトなしなら `\"\"`)\n */\n renderUserJs(): string {\n return this._vanillaBuilder?.render() ?? '';\n }\n\n // ─── Expr Factory ────────────────────────────────────────────────────────\n\n /**\n * `ExprFactory` を遅延初期化して返す。\n *\n * 同一 RuntimeContext から複数回呼ばれた場合は同一インスタンスを返す(memoize)。\n * `Root.expr` getter からの委譲先。\n */\n getExprFactory(): ExprFactory {\n if (this._exprFactory === undefined) {\n this._exprFactory = createExprFactory();\n }\n return this._exprFactory;\n }\n\n // ─── Selector / Collection ───────────────────────────────────────────────\n\n /**\n * 単一セレクタ用 `SelectorRef` を返す。\n *\n * `Root.$` メソッドからの委譲先。\n * scope は `getScope()` 経由で取得した RuntimeContext の唯一 scope を共有する。\n *\n * @param selector - `document.querySelector` に渡すセレクタ\n * @returns `SelectorRef<E>`\n */\n querySelector<E extends Element = HTMLElement>(selector: string): SelectorRef<E> {\n const scope = this.getScope();\n return createSelectorRef(scope, fromSelector<E>(selector));\n }\n\n /**\n * 複数セレクタ用 `CollectionRef` を返す。\n *\n * `Root.$$` メソッドからの委譲先。\n *\n * @param selector - `document.querySelectorAll` に渡すセレクタ\n * @returns `CollectionRef<E>`\n */\n querySelectorAll<E extends Element = HTMLElement>(selector: string): CollectionRef<E> {\n const scope = this.getScope();\n return createCollectionRef(scope, listFromSelector<E>(selector));\n }\n\n // ─── jQuery helper composition ───────────────────────────────────────────\n\n /**\n * jQuery helper(tree-shaking 済み)+ ユーザー JS を結合した完全な JS 文字列を返す。\n *\n * `Root.renderJs()` の合成ロジックを 1:1 で引き取った。出力は bytewise 等価。\n *\n * 出力分岐:\n * - `usedMethods.size === 0` → `''` を返す(メソッド未使用時はヘルパ不要)\n * - `jsContent.length === 0` → ヘルパのみを返す\n * - それ以外 → `${helper}\\n\\n${jsContent}` を返す\n *\n * @param usedMethods - ツリー全体で使用されたjQueryメソッド集合\n * @param jsContent - ツリー全体のユーザー JS 文字列\n * @returns helper + content を結合した完全な JS 出力\n */\n renderJs(usedMethods: ReadonlySet<JQueryMethodType>, jsContent: string): string {\n if (usedMethods.size === 0) {\n return '';\n }\n const helper = JQueryHelper.generateHelper(usedMethods);\n if (jsContent.length === 0) {\n return helper;\n }\n return `${helper}\\n\\n${jsContent}`;\n }\n\n // ─── スナップショット ─────────────────────────────────────────────────────\n\n /**\n * エクスポート用ランタイムスナップショットを生成して返す。\n *\n * task 4.x で `runtimePrelude` / `runtimeInitJs` が追加される予定。\n * 現時点では `userJs` のみを含む最小スナップショットを返す。\n *\n * @returns `RuntimeSnapshot` オブジェクト\n */\n buildExportRuntimeSnapshot(): RuntimeSnapshot {\n return {\n userJs: this.renderUserJs(),\n };\n }\n}\n","import { mkdirSync, writeFileSync } from 'node:fs';\nimport { join, normalize } from 'node:path';\nimport { ExportableError } from './exportable-error.js';\nimport { errorToString } from '../utils/errors.js';\nimport { RESET_CSS } from './reset-css.js';\nimport { wrapDOMReady } from './dom-ready.js';\nimport type { Root } from '../html/elements/root.js';\nimport type { ExportContext } from './export-context.js';\n\n/**\n * FileExporterのオプション\n *\n * {@link FileExporter}の動作をカスタマイズするためのオプション定義です。\n *\n * @remarks\n * 全てのプロパティはオプションで、デフォルト値が設定されています。\n *\n * @example カスタムファイル名\n * ```typescript\n * const options: FileExporterOptions = {\n * htmlFileName: 'page.html',\n * cssFileName: 'main.css',\n * jsFileName: 'app.js',\n * };\n * ```\n *\n * @example reset.cssを含める\n * ```typescript\n * const options: FileExporterOptions = {\n * includeResetCss: true, // Eric Meyer's Reset CSSを自動挿入\n * };\n * ```\n *\n * @public\n */\nexport interface FileExporterOptions {\n /** HTMLファイル名(デフォルト: 'index.html') */\n readonly htmlFileName?: string;\n /** CSSファイル名(デフォルト: 'style.css') */\n readonly cssFileName?: string;\n /** JSファイル名(デフォルト: 'script.js') */\n readonly jsFileName?: string;\n /** reset.cssを含めるか(デフォルト: false) */\n readonly includeResetCss?: boolean;\n /** JSをDOMContentLoadedでラップするか(デフォルト: false) */\n readonly wrapDOMReady?: boolean;\n}\n\n/**\n * FileExporter\n *\n * HTML、CSS、JavaScriptの3ファイルを統合的に出力するエクスポーターです。\n *\n * @remarks\n * DraftOleで生成されたコンテンツを、実行可能なWebページとして出力します。\n * 以下の機能を提供します:\n *\n * ### 主要機能\n * - **自動リンク挿入**: HTMLに`<link>`と`<script>`タグを自動挿入\n * - **スマートスキップ**: 空のCSS/JSはファイル出力とタグ挿入をスキップ\n * - **reset.cssバンドル**: オプションでEric Meyer's Reset CSSを自動追加\n * - **ディレクトリ自動作成**: 出力先が存在しない場合は再帰的に作成\n * - **エラーハンドリング**: {@link ExportableError}による詳細なエラー報告\n *\n * ### ファイル出力パターン\n *\n * **通常出力** (全ファイル非空時):\n * ```\n * output/\n * ├── index.html (with <link> and <script> tags)\n * ├── style.css\n * └── script.js\n * ```\n *\n * **CSS/JS空の場合**:\n * ```\n * output/\n * └── index.html (タグなし)\n * ```\n *\n * @example 基本的な使用方法\n * ```typescript\n * const exporter = new FileExporter();\n * exporter.export(\n * '<html><head></head><body>Hello</body></html>',\n * 'body { color: red; }',\n * 'console.log(\"Hello\");',\n * './output'\n * );\n * // → output/index.html, output/style.css, output/script.js が生成される\n * ```\n *\n * @example カスタムファイル名\n * ```typescript\n * const exporter = new FileExporter({\n * htmlFileName: 'page.html',\n * cssFileName: 'main.css',\n * jsFileName: 'app.js',\n * });\n * exporter.export(html, css, js, './dist');\n * // → dist/page.html, dist/main.css, dist/app.js\n * ```\n *\n * @example reset.cssを含める\n * ```typescript\n * const exporter = new FileExporter({\n * includeResetCss: true,\n * });\n * exporter.export(html, css, js, './output');\n * // → style.css の先頭にreset.cssが自動追加される\n * ```\n *\n * @example エラーハンドリング\n * ```typescript\n * const exporter = new FileExporter();\n * try {\n * exporter.export(html, css, js, '');\n * } catch (error) {\n * if (error instanceof ExportableError) {\n * console.error(`Error [${error.code}]: ${error.message}`);\n * console.error(`File path: ${error.filePath}`);\n * }\n * }\n * ```\n *\n * @example 空のCSS/JSをスキップ\n * ```typescript\n * const exporter = new FileExporter();\n * exporter.export(\n * '<html><head></head><body>Static page</body></html>',\n * '', // 空のCSS\n * '', // 空のJS\n * './output'\n * );\n * // → output/index.html のみ生成(<link>/<script>タグなし)\n * ```\n *\n * @public\n */\nexport class FileExporter {\n private readonly htmlFileName: string;\n private readonly cssFileName: string;\n private readonly jsFileName: string;\n private readonly includeResetCss: boolean;\n private readonly _wrapDOMReady: boolean;\n\n constructor(options?: FileExporterOptions) {\n this.htmlFileName = options?.htmlFileName ?? 'index.html';\n this.cssFileName = options?.cssFileName ?? 'style.css';\n this.jsFileName = options?.jsFileName ?? 'script.js';\n this.includeResetCss = options?.includeResetCss ?? false;\n this._wrapDOMReady = options?.wrapDOMReady ?? false;\n }\n\n /**\n * HTML、CSS、JSを統合出力する\n *\n * DraftOleで生成されたコンテンツを、実行可能なWebページとして出力します。\n *\n * @param htmlContent - HTML内容(完全なHTML文書)\n * @param cssContent - CSS内容(空文字列の場合はスキップ)\n * @param jsContent - JS内容(空文字列の場合はスキップ)\n * @param outputPath - 出力先ディレクトリパス(存在しない場合は自動作成)\n *\n * @throws {@link ExportableError}\n * - `invalidPath`: outputPathが空文字列または無効\n * - `writeFailed`: ディレクトリ作成またはファイル書き込み失敗\n *\n * @remarks\n * ### 処理フロー\n * 1. 出力パスの検証\n * 2. ディレクトリの作成(存在しない場合)\n * 3. CSS処理(reset.css挿入判定)\n * 4. HTMLにタグ挿入(CSS/JS非空時)\n * 5. ファイル書き込み\n *\n * ### タグ挿入位置\n * - `<link>`: `</head>`タグの直前\n * - `<script>`: `</body>`タグの直前\n *\n * ### ファイル出力条件\n * - **HTML**: 常に出力\n * - **CSS**: `cssContent.trim().length > 0` または `includeResetCss === true`\n * - **JS**: `jsContent.trim().length > 0`\n *\n * @example 完全な出力\n * ```typescript\n * const exporter = new FileExporter();\n * exporter.export(\n * '<!DOCTYPE html><html><head></head><body><h1>Hello</h1></body></html>',\n * 'h1 { color: blue; }',\n * 'console.log(\"Loaded\");',\n * './output'\n * );\n * ```\n *\n * @example HTMLのみ(静的ページ)\n * ```typescript\n * const exporter = new FileExporter();\n * exporter.export(\n * '<!DOCTYPE html><html><head></head><body><h1>Static</h1></body></html>',\n * '', // CSS空\n * '', // JS空\n * './output'\n * );\n * // → index.htmlのみ生成、<link>/<script>タグなし\n * ```\n *\n * @example エラーハンドリング\n * ```typescript\n * const exporter = new FileExporter();\n * try {\n * exporter.export(html, css, js, '/invalid/readonly/path');\n * } catch (error) {\n * if (error instanceof ExportableError) {\n * if (error.code === 'writeFailed') {\n * console.error('Failed to write files:', error.message);\n * console.error('Path:', error.filePath);\n * }\n * }\n * }\n * ```\n *\n * @example ネストされたディレクトリ\n * ```typescript\n * const exporter = new FileExporter();\n * exporter.export(html, css, js, './output/nested/deep/directory');\n * // → ディレクトリが自動的に再帰作成される\n * ```\n *\n * @public\n */\n /**\n * Root オブジェクトから ExportContext を取得し、ファイル出力する。\n *\n * @param root - DraftOle Root インスタンス\n * @param outputPath - 出力先ディレクトリパス\n */\n exportFromRoot(root: Root, outputPath: string): void {\n const ctx = root.buildExportContext();\n this.exportContext(ctx, outputPath);\n }\n\n /**\n * ExportContext からコンテンツを組み立ててファイル出力する。\n *\n * - `runtimePrelude` が存在する場合、JS の先頭にプレリュードと state-init JS を挿入する。\n * - `runtimePrelude` が存在しない場合、`userJs` をそのまま使用する。\n *\n * @param ctx - ExportContext スナップショット\n * @param outputPath - 出力先ディレクトリパス\n */\n exportContext(ctx: ExportContext, outputPath: string): void {\n let jsContent: string;\n if (!ctx.runtimePrelude) {\n jsContent = ctx.userJs;\n } else {\n const initJs = ctx.runtimeInitJs ?? '';\n const prefix = initJs.length > 0\n ? `${ctx.runtimePrelude}\\n${initJs}`\n : ctx.runtimePrelude;\n jsContent = ctx.userJs.length > 0 ? `${prefix}\\n${ctx.userJs}` : prefix;\n }\n this.export(ctx.html, ctx.css, jsContent, outputPath);\n }\n\n export(\n htmlContent: string,\n cssContent: string,\n jsContent: string,\n outputPath: string,\n ): void {\n // 出力パスの検証\n if (!outputPath || outputPath.trim().length === 0) {\n throw new ExportableError(\n 'invalidPath',\n outputPath,\n 'Output path must not be empty',\n );\n }\n\n // パストラバーサル検証: normalize 後に \"..\" セグメントが残る場合は起点より上への逸脱\n if (normalize(outputPath).split(/[/\\\\]/).some(s => s === '..')) {\n throw new ExportableError(\n 'invalidPath',\n outputPath,\n 'Output path must not contain \"..\" path traversal components',\n );\n }\n\n // ディレクトリの作成(存在しない場合は再帰的に作成)\n try {\n mkdirSync(outputPath, { recursive: true });\n } catch (error) {\n throw new ExportableError(\n 'writeFailed',\n outputPath,\n `Failed to create directory: ${errorToString(error)}`,\n );\n }\n\n // CSS処理\n let finalCssContent = cssContent;\n let hasCss = cssContent.trim().length > 0;\n\n // reset.cssのバンドル\n if (this.includeResetCss) {\n finalCssContent = hasCss\n ? RESET_CSS + '\\n\\n' + cssContent\n : RESET_CSS;\n hasCss = true;\n }\n\n // JS処理\n const finalJsContent = this._wrapDOMReady ? wrapDOMReady(jsContent) : jsContent;\n const hasJs = finalJsContent.trim().length > 0;\n\n // HTMLにタグを挿入\n let finalHtmlContent = htmlContent;\n\n // <link>タグの挿入(CSS非空時)\n if (hasCss) {\n const headEndIndex = finalHtmlContent.indexOf('</head>');\n if (headEndIndex !== -1) {\n const linkTag = `<link rel=\"stylesheet\" href=\"${this.cssFileName}\">`;\n finalHtmlContent =\n finalHtmlContent.slice(0, headEndIndex) +\n linkTag +\n '\\n' +\n finalHtmlContent.slice(headEndIndex);\n }\n }\n\n // <script>タグの挿入(JS非空時)\n if (hasJs) {\n const bodyEndIndex = finalHtmlContent.indexOf('</body>');\n if (bodyEndIndex !== -1) {\n const scriptTag = `<script defer src=\"${this.jsFileName}\"></script>`;\n finalHtmlContent =\n finalHtmlContent.slice(0, bodyEndIndex) +\n scriptTag +\n '\\n' +\n finalHtmlContent.slice(bodyEndIndex);\n }\n }\n\n // ファイル書き込み\n try {\n // HTMLファイル出力\n writeFileSync(\n join(outputPath, this.htmlFileName),\n finalHtmlContent,\n 'utf-8',\n );\n\n // CSSファイル出力(非空時のみ)\n if (hasCss) {\n writeFileSync(\n join(outputPath, this.cssFileName),\n finalCssContent,\n 'utf-8',\n );\n }\n\n // JSファイル出力(非空時のみ)\n if (hasJs) {\n writeFileSync(\n join(outputPath, this.jsFileName),\n finalJsContent,\n 'utf-8',\n );\n }\n } catch (error) {\n throw new ExportableError(\n 'writeFailed',\n outputPath,\n `Failed to write files: ${errorToString(error)}`,\n );\n }\n }\n}\n","import { DraftOleError, type ExportableErrorCode } from '../utils/errors.js';\n\n/**\n * ファイルエクスポート時のエラー\n *\n * {@link FileExporter}でのファイル書き込み失敗時にスローされる専用エラークラスです。\n *\n * @remarks\n * {@link DraftOleError}を継承し、DraftOleのエラー型階層に統合されています(タスク3.3)。\n * エラーコードとファイルパスを保持し、デバッグを容易にします。\n *\n * ### エラーコード\n * - `invalidPath`: 出力パスが空または無効\n * - `writeFailed`: ファイル書き込みまたはディレクトリ作成失敗\n *\n * ### プロパティ\n * - `code`: {@link ExportableErrorCode} - エラーの種類を識別\n * - `module`: 常に `'publisher'` - エラーが発生したモジュール\n * - `filePath`: エラーが発生したファイルパス\n * - `message`: エラーメッセージ(カスタマイズ可能)\n *\n * @example 基本的なスロー\n * ```typescript\n * throw new ExportableError('writeFailed', '/output/file.html', 'Disk full');\n * ```\n *\n * @example エラーコードによるハンドリング\n * ```typescript\n * try {\n * exporter.export(html, css, js, '');\n * } catch (error) {\n * if (error instanceof ExportableError) {\n * switch (error.code) {\n * case 'invalidPath':\n * console.error('Please provide a valid output path');\n * break;\n * case 'writeFailed':\n * console.error('Failed to write files:', error.message);\n * console.error('Target path:', error.filePath);\n * break;\n * }\n * }\n * }\n * ```\n *\n * @example デフォルトメッセージ\n * ```typescript\n * // カスタムメッセージを省略した場合\n * throw new ExportableError('invalidPath', '/output');\n * // → message: 'ExportableError [invalidPath]: Failed to process file at \"/output\"'\n * ```\n *\n * @example DraftOleErrorとしてキャッチ\n * ```typescript\n * try {\n * exporter.export(html, css, js, outputPath);\n * } catch (error) {\n * if (error instanceof DraftOleError) {\n * console.error(`Module: ${error.module}`);\n * console.error(`Error: ${error.message}`);\n *\n * // ExportableErrorの場合のみ追加情報を表示\n * if (error instanceof ExportableError) {\n * console.error(`Code: ${error.code}`);\n * console.error(`File: ${error.filePath}`);\n * }\n * }\n * }\n * ```\n *\n * @example ログ記録\n * ```typescript\n * function logExportError(error: ExportableError): void {\n * const logEntry = {\n * timestamp: new Date().toISOString(),\n * module: error.module,\n * code: error.code,\n * filePath: error.filePath,\n * message: error.message,\n * stack: error.stack,\n * };\n * console.error(JSON.stringify(logEntry, null, 2));\n * }\n * ```\n *\n * @public\n */\nexport class ExportableError extends DraftOleError {\n /**\n * Publisher エラーコード\n */\n readonly code: ExportableErrorCode;\n\n /**\n * エラーが発生したモジュール(常に 'publisher')\n */\n readonly module = 'publisher' as const;\n\n /**\n * エラーが発生したファイルパス\n */\n readonly filePath: string;\n\n /**\n * ExportableError のコンストラクタ\n *\n * @param code - エラーコード\n * @param filePath - エラーが発生したファイルパス\n * @param message - カスタムエラーメッセージ(オプション)\n */\n constructor(\n code: ExportableErrorCode,\n filePath: string,\n message?: string,\n ) {\n // カスタムメッセージがない場合はデフォルトメッセージを生成\n const errorMessage =\n message ??\n `ExportableError [${code}]: Failed to process file at \"${filePath}\"`;\n\n super(errorMessage);\n\n this.name = 'ExportableError';\n this.code = code;\n this.filePath = filePath;\n\n // V8スタックトレースの修正(Node.js環境)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ExportableError);\n }\n }\n}\n","/**\n * Reset CSS\n *\n * 基本的なブラウザスタイルをリセットするCSS定数です。\n *\n * Eric Meyer's Reset CSS(簡略版)をベースにしており、\n * {@link FileExporter}の`includeResetCss: true`オプションで自動的に挿入されます。\n *\n * @remarks\n * ### 目的\n * ブラウザ間のデフォルトスタイルの差異を吸収し、\n * 一貫したベースラインからスタイリングを開始できるようにします。\n *\n * ### リセット内容\n * - マージン・パディング・ボーダーを0にリセット\n * - フォントサイズとline-heightをリセット\n * - リスト(ol/ul)のスタイルを削除\n * - テーブルのborder-collapseを設定\n * - HTML5要素のdisplayプロパティを設定\n *\n * @example FileExporterでの使用\n * ```typescript\n * const exporter = new FileExporter({\n * includeResetCss: true,\n * });\n * exporter.export(html, css, js, './output');\n * ```\n *\n * @example 直接使用\n * ```typescript\n * import { RESET_CSS } from 'draftole';\n * const myCustomCss = RESET_CSS + '\\n\\nbody { margin: 20px; }';\n * ```\n *\n * @public\n */\nexport const RESET_CSS = `/* Reset CSS */\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed,\nfigure, figcaption, footer, header, hgroup,\nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure,\nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol, ul {\n list-style: none;\n}\n\nblockquote, q {\n quotes: none;\n}\n\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n`;\n","/**\n * MVP-3.3: DOMContentLoaded ラッパー\n *\n * JS コードを document.addEventListener(\"DOMContentLoaded\", ...) でラップする。\n * 既にラップ済みの場合は二重ラップしない。\n */\n\nconst DOM_READY_PATTERN = /DOMContentLoaded/;\n\n/**\n * JS コードを DOMContentLoaded イベントリスナーでラップする。\n * 空文字列や既にラップ済みのコードはそのまま返す。\n */\nexport function wrapDOMReady(js: string): string {\n const trimmed = js.trim();\n if (trimmed.length === 0) return '';\n if (DOM_READY_PATTERN.test(trimmed)) return trimmed;\n return `document.addEventListener(\"DOMContentLoaded\", () => {\\n${trimmed}\\n});`;\n}\n","// AUTO-GENERATED by scripts/build-runtime.ts — DO NOT EDIT\nexport const RUNTIME_PRELUDE = `\"use strict\";\n(() => {\n (function() {\n const states = /* @__PURE__ */ new Map();\n let pending = /* @__PURE__ */ new Set();\n let isFlushing = false;\n let isInternalPropagation = false;\n function getEntry(id) {\n const entry = states.get(id);\n if (entry === void 0) {\n throw new Error(\"unknown state: \" + id);\n }\n return entry;\n }\n function flush() {\n if (isFlushing) {\n return;\n }\n isFlushing = true;\n try {\n while (pending.size > 0) {\n const ids = pending;\n pending = /* @__PURE__ */ new Set();\n ids.forEach(function(id) {\n const entry = states.get(id);\n if (entry === void 0)\n return;\n const value = entry.value;\n entry.subs.forEach(function(sub) {\n try {\n sub(value);\n } catch (err) {\n console.error(\"[DraftOle] subscriber error for state '\" + id + \"':\", err);\n }\n });\n });\n }\n } finally {\n isFlushing = false;\n }\n }\n function setState(id, v) {\n const entry = getEntry(id);\n if (entry.value === v)\n return;\n entry.value = v;\n pending.add(id);\n if (!isFlushing) {\n queueMicrotask(flush);\n } else if (!isInternalPropagation) {\n console.warn(\"[DraftOle] state '\" + id + \"' was set during flush; will be processed in next batch.\");\n }\n if (entry.parent !== void 0) {\n propagateToParent(entry.parent, v);\n }\n }\n function propagateToParent(meta, newSlotValue) {\n const parentEntry = states.get(meta.id);\n if (parentEntry === void 0) {\n console.warn(\"[DraftOle] propagateToParent: parent state '\" + meta.id + \"' not found; skipping propagation.\");\n return;\n }\n const parentValue = parentEntry.value;\n if (!Array.isArray(parentValue)) {\n console.warn(\"[DraftOle] propagateToParent: parent state '\" + meta.id + \"' is not an array; skipping propagation.\");\n return;\n }\n if (meta.index < 0 || meta.index >= parentValue.length) {\n console.warn(\"[DraftOle] propagateToParent: index \" + String(meta.index) + \" out of range for parent state '\" + meta.id + \"' (length=\" + String(parentValue.length) + \"); skipping propagation.\");\n return;\n }\n const newArr = parentValue.slice();\n newArr[meta.index] = newSlotValue;\n const prev = isInternalPropagation;\n isInternalPropagation = true;\n try {\n setState(meta.id, newArr);\n } finally {\n isInternalPropagation = prev;\n }\n }\n function itemStateId(parentId, idx) {\n return parentId + \".item\" + String(idx);\n }\n function ensureItemState(parentId, idx, value) {\n const id = itemStateId(parentId, idx);\n if (!states.has(id)) {\n states.set(id, {\n value,\n subs: /* @__PURE__ */ new Set(),\n parent: { id: parentId, index: idx }\n });\n } else {\n const entry = states.get(id);\n if (entry.value !== value) {\n entry.value = value;\n pending.add(id);\n if (!isFlushing) {\n queueMicrotask(flush);\n }\n }\n }\n return id;\n }\n const runtime = {\n /**\n * 状態を初期化(state-init コマンドから呼ばれる)(Req 1.2)。\n * 既登録の場合は無視(二重初期化防止)。\n */\n initState(id, initial) {\n if (!states.has(id)) {\n states.set(id, { value: initial, subs: /* @__PURE__ */ new Set() });\n }\n },\n /**\n * 状態ハンドルを取得。\n * 未登録 ID に対しては Error をスロー(Req エラーハンドリング)。\n */\n state(id) {\n getEntry(id);\n return {\n get() {\n return getEntry(id).value;\n },\n set(v) {\n setState(id, v);\n },\n subscribe(fn) {\n const entry = getEntry(id);\n const sub = fn;\n entry.subs.add(sub);\n try {\n fn(entry.value);\n } catch (err) {\n console.error(\"[DraftOle] subscriber error (initial) for state '\" + id + \"':\", err);\n }\n return function() {\n const e = states.get(id);\n if (e !== void 0) {\n e.subs.delete(sub);\n }\n };\n }\n };\n },\n /**\n * textContent バインディング(Req 4.1)。\n * transform が指定された場合は状態値を変換して適用する。\n */\n bindText(el, stateId, transform) {\n runtime.state(stateId).subscribe(function(v) {\n const text = transform !== void 0 ? transform(v) : String(v);\n el.textContent = text;\n });\n },\n /**\n * input.value バインディング(Req 4.2)。\n */\n bindValue(el, stateId, transform) {\n runtime.state(stateId).subscribe(function(v) {\n el.value = transform !== void 0 ? String(transform(v)) : String(v);\n });\n },\n /**\n * className 全置換バインディング(Req 4.5)。\n */\n bindClassAll(el, stateId, transform) {\n runtime.state(stateId).subscribe(function(v) {\n const cls = transform !== void 0 ? transform(v) : String(v);\n el.className = cls;\n });\n },\n /**\n * クラス追加(差分)バインディング(Req 4.3)。\n * 旧クラス削除 → 新クラス付与 の差分操作(Req 4.3 AC 3)。\n */\n bindClassAdd(el, stateId, transform) {\n let prevClass = \"\";\n runtime.state(stateId).subscribe(function(v) {\n const newClass = transform !== void 0 ? transform(v) : String(v);\n if (prevClass !== \"\" && prevClass !== newClass) {\n el.classList.remove(prevClass);\n }\n if (newClass !== \"\" && newClass !== prevClass) {\n el.classList.add(newClass);\n }\n prevClass = newClass;\n });\n },\n /**\n * style プロパティバインディング(Req 4.4)。\n */\n bindStyle(el, prop, stateId, transform) {\n runtime.state(stateId).subscribe(function(v) {\n const val = transform !== void 0 ? transform(v) : String(v);\n el.style.setProperty(prop, val);\n });\n },\n /**\n * checked バインディング(input[type=checkbox] 等)。\n */\n bindChecked(el, stateId, transform) {\n runtime.state(stateId).subscribe(function(v) {\n el.checked = transform !== void 0 ? Boolean(transform(v)) : Boolean(v);\n });\n },\n /**\n * 配列差分描画バインディング(Req 3.6)。\n *\n * アルゴリズム(Req 3.6 AC 6, Design R-5, R-6):\n * 1. 配列長増加 → factory で DOM 要素追加\n * 2. 配列長減少 → lastChild を removeChild\n * 3. 各スロット State を \"{stateId}.item{i}\" で仮想 State として更新\n */\n bindEach(parent, stateId, factory) {\n runtime.state(stateId).subscribe(function(arr) {\n for (let i = 0; i < arr.length; i++) {\n ensureItemState(stateId, i, arr[i]);\n }\n while (parent.children.length < arr.length) {\n const idx = parent.children.length;\n const itemId = ensureItemState(stateId, idx, arr[idx]);\n const childEl = factory(itemId, idx);\n parent.appendChild(childEl);\n }\n while (parent.children.length > arr.length) {\n const last = parent.lastChild;\n if (last !== null) {\n parent.removeChild(last);\n }\n }\n for (let i = 0; i < arr.length; i++) {\n const itemId = itemStateId(stateId, i);\n const entry = states.get(itemId);\n if (entry !== void 0 && entry.value !== arr[i]) {\n entry.value = arr[i];\n pending.add(itemId);\n }\n }\n if (pending.size > 0 && !isFlushing) {\n queueMicrotask(flush);\n }\n });\n }\n };\n window[\"__draftole__\"] = runtime;\n })();\n})();`;\n","/**\n * 遅延解決モデルの実体: `PendingBuffer` + `FlushOrchestrator`。\n *\n * 要素ビルダ(`HtmlTag` サブクラス)が `Root.addChild` で登録される以前に\n * 受け取った DOM 操作コマンドは、各要素の `_pending: VanillaCommand[]`\n * バッファに積まれる。`Root.addChild(el)` の時点で `FlushOrchestrator.flush`\n * が呼ばれ、バッファ内容を Root が保持する `VanillaScope` に転送するとともに、\n * 要素に `_scope` 参照を紐付けて以降の呼び出しを即時 `_append` 経路へ切り替える。\n *\n * - Requirements: 1.6, 1.7, 1.8 (unified-element-api)\n * - Design: 「遅延解決モデル」「PendingBuffer + FlushOrchestrator」\n *\n * 本モジュールは Root.addChild 側(task 4.2)から呼ばれることを想定しており、\n * 本ステップ時点では他モジュールから参照されない(テストのみが直接呼ぶ)。\n */\n\nimport { HtmlTag } from '../../html/elements/html-tag.js';\nimport type { VanillaScope } from './vanilla-script-builder.js';\nimport { hasCommandTarget } from './commands.js';\n\n/**\n * 遅延解決モデルのフラッシュ制御。\n *\n * `flush(el, scope)` は以下を満たす:\n * 1. 既にフラッシュ済み(`el._scope !== undefined`)なら no-op で戻る(二重登録ガード)\n * 2. `el._scope = scope` を設定\n * 3. `el._pending` 内の全 `VanillaCommand` を `scope._append` へ順序保存で転送\n * 4. `el._pending` を空配列にリセット\n * 5. `el` の子要素のうち `HtmlTag` インスタンスに対して深さ優先で `flush` を再帰\n *\n * 子要素が `HtmlTag` でない場合(`TextType` 相当の非タグノードや、\n * `protoRender` のみを実装する外部ノード)はスキップする。\n *\n * 以下のコマンドは protoRender まで _pending に留保する(render-phase 解決が必要):\n * - `deferred-self` target を持つコマンド(id 自動付与後に selector が確定)\n * - `bind-each` で closure factory 未確定のコマンド(resolveEachFactories で確定)\n */\nexport const FlushOrchestrator = {\n flush(el: HtmlTag, scope: VanillaScope): void {\n // (1) 二重登録ガード: 既にフラッシュ済みの要素は再処理しない\n if (el._scope !== undefined) {\n return;\n }\n\n // (2) scope 参照を紐付け、以降の要素メソッドが即時経路を取れるようにする\n el._scope = scope;\n\n // (3)(4) バッファ済みコマンドを scope へ転送し、バッファを空にする。\n // 以下は protoRender まで _pending に留保する:\n // - deferred-self target: protoRender で id が確定してから scope へ転送\n // - bind-each (closure 未確定): resolveEachFactories で factoryCode 確定後に転送\n const pending = el._pending;\n const deferred: typeof pending = [];\n for (const cmd of pending) {\n if (hasCommandTarget(cmd) && cmd.target.kind === 'deferred-self') {\n deferred.push(cmd);\n } else if (\n cmd.type === 'bind-each' &&\n cmd.template.factoryKind === 'closure' &&\n cmd.template.factoryCode === undefined\n ) {\n deferred.push(cmd);\n } else {\n scope._append(cmd);\n }\n }\n pending.length = 0;\n for (const cmd of deferred) {\n pending.push(cmd);\n }\n\n // (5) 子要素(HtmlTag のみ)へ深さ優先で再帰\n for (const child of el.children) {\n if (child instanceof HtmlTag) {\n FlushOrchestrator.flush(child, scope);\n }\n }\n },\n};\n\nexport type FlushOrchestratorType = typeof FlushOrchestrator;\n","/**\n * Task 4.5: Root ドキュメントルート要素\n *\n * HTML文書のトップレベル要素。Root自身のタグは出力せず、\n * 子要素のレンダリング結果を連結して返す。\n *\n * CSS出力モード(default/inline/external)を管理し、\n * ツリー全体のCSS/JSコンテンツ収集スタブ(Phase 3/4接続点)を提供する。\n *\n * レンダリング:\n * protoRender() → 子要素の protoRender() を連結(Root自体のタグは出力しない)\n * render() → protoRender() → HTMLFormatter.format()\n *\n * Requirements: 3.1, 3.7, 3.8, 3.9, 6.6, 6.1, 6.2, 6.3, 6.4\n */\nimport { HtmlTag, type HtmlTagOptions } from './html-tag.js';\nimport { DocumentContext } from '../../document/document-context.js';\nimport { RuntimeContext } from '../../runtime/runtime-context.js';\nimport type { GlobalCss } from '../../css/variables/global-css.js';\nimport { CssConfig } from '../../css/config/css-config.js';\n\n/**\n * Constructor options for Root.\n *\n * Extends {@link HtmlTagOptions} with document-level settings.\n * Note: the `css` property from HtmlTagOptions is omitted and replaced\n * with `css?: readonly GlobalCss[]` for global CSS injection.\n */\nexport interface RootOptions extends Omit<HtmlTagOptions, 'css'> {\n /** Global CSS rules to inject before scoped styles. */\n css?: readonly GlobalCss[];\n /**\n * Whether to inject a CSS reset before all other styles.\n * @defaultValue false\n */\n reset?: boolean;\n /**\n * CSS 出力設定(minify モード等)。\n *\n * 省略時は `new CssConfig()` の default を使用する(`NODE_ENV` fallback 適用)。\n * Root constructor 時点で評価され、以後不変。\n *\n * @see CssConfig\n */\n cssConfig?: CssConfig;\n}\n\nimport { FileExporter, type FileExporterOptions } from '../../publisher/file-exporter.js';\nimport { type ExportContext } from '../../publisher/export-context.js';\nimport { RUNTIME_PRELUDE } from '../../js/vanilla/internal/runtime-prelude.gen.js';\nimport { renderCommand } from '../../js/vanilla/commands.js';\nimport { createDefaultRenderContext, type RenderContext } from './render-context.js';\nimport type { JQueryMethodType } from '../protocols/jquery-method-type.js';\nimport type { HTMLTagProtocol } from '../protocols/html-tag-protocol.js';\nimport { FlushOrchestrator } from '../../js/vanilla/pending-buffer.js';\nimport type { ScriptScope } from '../../js/vanilla/script-scope.js';\nimport type { ExprFactory } from '../../js/vanilla/expr-factory.js';\nimport type { SelectorRef, CollectionRef } from '../../js/vanilla/selector-ref.js';\nimport type { StateRegistry } from '../../js/vanilla/state/registry.js';\nimport type { State } from '../../js/vanilla/state/state.js';\n\n/**\n * CSS output mode for the document.\n *\n * - **default**: Default behavior (defined in Phase 3)\n * - **inline**: Inline CSS output (styles in `<style>` tags)\n * - **external**: External CSS output (separate `.css` file)\n */\nexport type CssOutputMode = 'default' | 'inline' | 'external';\n\n/**\n * Represents the root element of an HTML document.\n *\n * Root is a special element that doesn't render its own tag, but instead\n * concatenates the rendering output of its child elements. It serves as the\n * top-level container for the entire HTML document tree.\n *\n * **Key Features:**\n * - Manages CSS output mode (default/inline/external)\n * - Collects CSS and JavaScript from entire document tree\n * - Provides `renderJs()` for complete JavaScript output with tree-shaking\n *\n * **Rendering Format:**\n * ```html\n * <!-- No root tag is rendered, only children: -->\n * <child1>...</child1>\n * <child2>...</child2>\n * ```\n *\n * @example\n * Basic document structure:\n * ```typescript\n * const doc = new Root();\n * doc.addChild(html(\n * head(title('My Page')),\n * body(\n * h1('Hello World'),\n * p('Welcome to my page')\n * )\n * ));\n *\n * console.log(doc.render());\n * ```\n *\n * @example\n * With JavaScript tree-shaking:\n * ```typescript\n * const doc = new Root();\n * const button = div();\n * button.jqm.on('click', () => console.log('Clicked'));\n * doc.addChild(button);\n *\n * // Only includes helper for 'on' method\n * const js = doc.renderJs();\n * ```\n *\n * @remarks\n * **Preconditions:** None (no constructor arguments required)\n *\n * **Postconditions:** `protoRender()` returns concatenated child output (no root tag)\n *\n * **Invariants:** `cssOutputMode` is one of {@link CssOutputMode} values\n */\nexport class Root extends HtmlTag {\n /**\n * CSS output mode for this document.\n *\n * @defaultValue 'default'\n */\n cssOutputMode: CssOutputMode = 'default';\n\n /** Document-level policy: doctype flag, global CSS, reset baseline. */\n private _documentContext: DocumentContext;\n\n /**\n * Root が保持する単一の JS スクリプトスコープ。\n *\n * 初回アクセス時に遅延生成され、以後は同一インスタンスを返す。\n * 実装は `RuntimeContext.getScope()` への委譲。\n *\n * @example\n * ```typescript\n * const root = new Root();\n * root.script.onDomReady(s => {\n * s.call('init');\n * });\n * ```\n */\n get script(): ScriptScope {\n return this._runtimeContext.getScope();\n }\n\n /**\n * JS 式 / 真偽式を生成するファクトリ。\n *\n * 初回アクセス時に遅延生成され、以後は同一インスタンスを返す。\n * 実装は `RuntimeContext.getExprFactory()` への委譲。\n *\n * @example\n * ```typescript\n * const root = new Root();\n * const isActive = root.expr.bool('el.classList.contains(\"active\")');\n * ```\n */\n get expr(): ExprFactory {\n return this._runtimeContext.getExprFactory();\n }\n\n /**\n * CSS セレクタで単一要素を参照する `SelectorRef` を返す。\n *\n * 実装は `RuntimeContext.querySelector()` への委譲。\n *\n * @param selector - `document.querySelector` に渡すセレクタ文字列\n * @returns `SelectorRef<E>` — セレクタ参照ノード\n *\n * @example\n * ```typescript\n * const root = new Root();\n * root.$('#my-btn').on('click', s => s.call('handleClick'));\n * ```\n */\n $<E extends Element = HTMLElement>(selector: string): SelectorRef<E> {\n return this._runtimeContext.querySelector<E>(selector);\n }\n\n /**\n * CSS セレクタで複数要素を参照する `CollectionRef` を返す。\n *\n * 実装は `RuntimeContext.querySelectorAll()` への委譲。\n *\n * @param selector - `document.querySelectorAll` に渡すセレクタ文字列\n * @returns `CollectionRef<E>` — コレクション参照ノード\n *\n * @example\n * ```typescript\n * const root = new Root();\n * root.$$('.todo-item').removeAll();\n * ```\n */\n $$<E extends Element = HTMLElement>(selector: string): CollectionRef<E> {\n return this._runtimeContext.querySelectorAll<E>(selector);\n }\n\n /**\n * Creates a new Root element.\n *\n * @param options - Optional options including css rules and DI overrides (for testing)\n *\n * @example\n * ```typescript\n * import { rule } from '../../css/variables/global-css.js';\n * const root = new Root({ css: [rule('.foo', { color: 'red' })] });\n * ```\n */\n /**\n * RuntimeContext — state registry / JS aggregation の受け皿(task 3.2 委譲)。\n * @internal\n */\n private _runtimeContext: RuntimeContext = new RuntimeContext();\n\n constructor(options?: RootOptions) {\n const { css, reset = false, cssConfig, ...htmlTagOptions } = options ?? {};\n // css may be readonly GlobalCss[] (new API) or CssManagerInstance (DI injection)\n const isGlobalCssArray = Array.isArray(css);\n const globalCssArray: readonly GlobalCss[] = isGlobalCssArray ? (css as readonly GlobalCss[]) : [];\n const parentOptions = isGlobalCssArray\n ? (htmlTagOptions as HtmlTagOptions)\n : ({ ...htmlTagOptions, css } as unknown as HtmlTagOptions);\n super('root', parentOptions);\n this._documentContext = new DocumentContext({ reset, globalCss: globalCssArray });\n this._cssConfig = cssConfig ?? new CssConfig();\n }\n\n /**\n * CSS 出力設定(解決済み)。Root constructor 時点で fix される。\n * @internal\n */\n private readonly _cssConfig: CssConfig;\n\n /**\n * 子要素を追加し、要素のバッファ済み Vanilla JS コマンドを Root の script スコープへフラッシュする。\n *\n * `HtmlTag.addChild` の CSS tagPath 設定処理を維持しつつ、\n * `FlushOrchestrator.flush(el, scope)` を追加実行する(Req 1.6, 1.7)。\n */\n override addChild(child: HTMLTagProtocol): this {\n super.addChild(child);\n if (child instanceof HtmlTag) {\n const scope = this._runtimeContext.getScope();\n FlushOrchestrator.flush(child, scope);\n }\n return this;\n }\n\n /**\n * Root ツリーに既に追加済みの子要素配下に後から追加された要素のコマンドをフラッシュする。\n * `app()` の `exportTo()` など、Root.addChild 経由でない addChild の後に呼ぶ。\n * @internal\n */\n flushDescendants(child: HTMLTagProtocol): void {\n if (child instanceof HtmlTag) {\n const scope = this._runtimeContext.getScope();\n FlushOrchestrator.flush(child, scope);\n }\n }\n\n /**\n * StateRegistry への package-private アクセス(FileExporter が参照)。\n *\n * `state()` を一度も呼んでいない場合は `undefined` を返す(遅延初期化と整合)。\n * 実態は `_runtimeContext.stateRegistry` へ委譲する(task 3.2)。\n * @internal\n */\n get _stateRegistry(): StateRegistry | undefined {\n return this._runtimeContext.stateRegistry;\n }\n\n /**\n * 一意な状態 ID を採番し、State<T> オブジェクトを返す。\n *\n * Req 1.1: root.state<T>(initial) を呼び出すと一意な状態 ID を採番した State<T> を返す。\n * Req 1.3: 同一 Root から複数回呼び出すと異なる状態 ID を採番。\n *\n * `_runtimeContext.state(initial)` へ委譲する(task 3.2)。\n *\n * @param initial - 状態の初期値\n * @returns State<T> — 一意な `_runtimeId` を持つ観測可能値オブジェクト\n */\n state<T>(initial: T): State<T> {\n return this._runtimeContext.state(initial);\n }\n\n /**\n * Vanilla JS Builder の出力を文字列として返す。\n *\n * 実装は `RuntimeContext.renderUserJs()` への委譲。\n * `script` にアクセスしていない場合(Builder が未初期化)は空文字列を返す。\n */\n renderVanillaScript(): string {\n return this._runtimeContext.renderUserJs();\n }\n\n /**\n * Enables or disables <!DOCTYPE html> output.\n * Default is false (backward compatible).\n */\n setDoctype(enabled = true): this {\n this._documentContext.setDoctype(enabled);\n return this;\n }\n\n /**\n * Task 3.2: Root の protoRender override。\n *\n * 受け取った ctx を子要素の `protoRender(ctx)` に必ず伝搬する。\n * ctx 省略時はツリー全体で共有する RenderContext を 1 つだけ生成し、\n * 全子要素に同一インスタンスとして渡す(registry の共有を保証する)。\n *\n * 出力は子要素 protoRender の連結(Root 自身のタグは出力しない)。\n *\n * @remarks\n * Task 3.3: Root はレンダーツリー境界の所有者であり、`protoRender` 開始時に\n * `ctx.registry.reset()` を呼んで前回レンダーで蓄積された id 集合を破棄する。\n * これにより同一 Root インスタンスを複数回 protoRender しても結果が\n * バイト等価になり(Req 3.7 ビルド間安定性)、外部から渡された ctx に既存 id が\n * 登録されていても Root 配下のレンダーには影響しない(Req 3.4 id 重複検出を\n * Root 境界内に閉じる)。\n */\n override protoRender(ctx?: RenderContext): string {\n const renderCtx: RenderContext = ctx ?? createDefaultRenderContext({ cssConfig: this._cssConfig });\n // Root は境界所有者: 入口で必ず registry を初期化し、ツリー全体で単一の\n // クリーンな id 集合を共有させる。\n renderCtx.registry.reset();\n return this._children.map(c => c.protoRender(renderCtx)).join('');\n }\n\n /**\n * Renders the document tree to formatted HTML.\n * Prepends <!DOCTYPE html> if enabled via setDoctype().\n */\n override render(): string {\n const html = super.render();\n return this._documentContext.doctype ? `<!DOCTYPE html>\\n${html}` : html;\n }\n\n /**\n * Recursively collects CSS styles from the entire document tree.\n *\n * Traverses all child elements and concatenates their CSS output.\n *\n * @returns Concatenated CSS string from all elements\n *\n * @example\n * ```typescript\n * const doc = new Root();\n * const element = div();\n * element.css.addRule('.my-class', { color: 'red' });\n * doc.addChild(element);\n *\n * const css = doc.collectCssStyleString();\n * ```\n */\n override collectCssStyleString(): string {\n // Root の _cssConfig から minify-aware resolver を構築し、子要素の\n // CssManager.renderCss(resolver) 経由で wrapper class 名にも minify を反映する。\n // protoRender 時の RenderContext と同じ resolver を再構築する(state を共有しない純関数なので安全)。\n const resolver = createDefaultRenderContext({ cssConfig: this._cssConfig }).resolver;\n return this._documentContext.collectCss(this._children as HTMLTagProtocol[], resolver);\n }\n\n /**\n * Recursively collects JavaScript content from the entire document tree.\n *\n * Traverses all child elements and concatenates their JavaScript output.\n *\n * @returns Concatenated JavaScript string from all elements\n *\n * @example\n * ```typescript\n * const doc = new Root();\n * const button = div();\n * button.jqm.on('click', () => console.log('Clicked'));\n * doc.addChild(button);\n *\n * const js = doc.collectJsContent();\n * ```\n */\n override collectJsContent(): string {\n const childJs = this._children\n .filter((child): child is HtmlTag => child instanceof HtmlTag)\n .map(child => child.collectJsContent())\n .filter(js => js.length > 0);\n return childJs.join('');\n }\n\n /**\n * Recursively collects jQuery method types used in the entire document tree.\n *\n * Aggregates all jQuery methods used by descendant elements for tree-shaking.\n *\n * @returns Set of {@link JQueryMethodType} used in the document\n */\n override collectUsedMethods(): Set<JQueryMethodType> {\n const result = new Set<JQueryMethodType>();\n for (const child of this._children) {\n if (child instanceof HtmlTag) {\n for (const method of child.collectUsedMethods()) {\n result.add(method);\n }\n }\n }\n return result;\n }\n\n /**\n * Generates complete JavaScript output with tree-shaking.\n *\n * Combines jQuery helper functions (only for used methods) with the actual\n * JavaScript content from the document tree.\n *\n * **Output Format:**\n * - If no methods used: returns empty string\n * - If no content but methods used: returns helper only\n * - Otherwise: returns `helper + \"\\n\\n\" + jsContent`\n *\n * @returns Complete JavaScript string ready for embedding\n *\n * @example\n * ```typescript\n * const doc = new Root();\n * const button = div();\n * button.jqm.on('click', () => console.log('Clicked'));\n * button.jqm.addClass('active');\n * doc.addChild(button);\n *\n * const js = doc.renderJs();\n * // Output includes:\n * // - Helper functions for 'on' and 'addClass' only (tree-shaken)\n * // - Actual event handler and addClass call\n * ```\n *\n * @remarks\n * **Preconditions:** None\n *\n * **Postconditions:**\n * - Empty string if no methods used\n * - `helper + \"\\n\\n\" + jsContent` format if methods used\n *\n * **Invariants:** Helper and jsContent separator is always `\"\\n\\n\"`\n */\n renderJs(): string {\n // helper 合成は `RuntimeContext.renderJs()` に委譲(root-runtime-facade-extraction spec, Req 2.3)。\n // Root 側では tree traversal の起点として `collectUsedMethods()` / `collectJsContent()` を呼び、\n // 合成ロジックは RuntimeContext に集約する。\n return this._runtimeContext.renderJs(this.collectUsedMethods(), this.collectJsContent());\n }\n\n /**\n * Publisher 用の export snapshot を組み立てて返す。\n *\n * runtime registry の内部構造をここで吸収し、FileExporter には漏らさない。\n * FileExporter は `ExportContext` 経由でのみ必要情報を受け取る(Req 3.1, 3.2)。\n *\n * - `html`: `this.render()` の出力\n * - `css`: `this.collectCssStyleString()` の出力\n * - `userJs`: `this.renderVanillaScript()` の出力\n * - `runtimePrelude`: 状態あり時のみ `RUNTIME_PRELUDE` を設定\n * - `runtimeInitJs`: 状態あり時のみ state-init + derive コマンド列を設定\n *\n * @returns ExportContext — publisher が必要とする read-only snapshot\n */\n buildExportContext(): ExportContext {\n const html = this.render();\n const css = this.collectCssStyleString();\n const userJs = this.renderVanillaScript();\n\n const registry = this._stateRegistry;\n if (registry === undefined || registry.isEmpty()) {\n return { html, css, userJs };\n }\n\n const initCommands = registry.listInitCommands();\n const initLines = initCommands\n .map((cmd) => renderCommand({ type: cmd.type, id: cmd.id, initial: cmd.initial }))\n .join('\\n');\n const deriveLines = registry.listDeriveCommands()\n .map((cmd) => renderCommand(cmd))\n .join('\\n');\n const runtimeInitJs = deriveLines.length > 0\n ? `${initLines}\\n${deriveLines}`\n : initLines;\n\n return { html, css, userJs, runtimePrelude: RUNTIME_PRELUDE, runtimeInitJs };\n }\n\n /**\n * ドキュメントツリーを HTML / CSS / JS ファイルとして出力する。\n *\n * `new FileExporter(options).exportFromRoot(this, outputPath)` と等価なショートカットメソッド。\n * `FileExporter` はそのまま残し、高度な制御(カスタムファイル名・reset.css・DOMContentLoaded ラップ等)\n * が必要な場合の entry point として引き続き利用できる。\n *\n * @param outputPath - 出力先ディレクトリパス(存在しない場合は自動作成)\n * @param options - {@link FileExporterOptions} オプション(省略可)\n *\n * @throws {@link ExportableError}\n * - `invalidPath`: outputPath が空文字列または無効\n * - `writeFailed`: ディレクトリ作成またはファイル書き込み失敗\n *\n * @example 基本的な使用方法\n * ```typescript\n * const root = new Root();\n * root.addChild(html(head(title('My Page')), body(h1('Hello'))));\n * root.export('./output/demo');\n * // 上記は以下と等価:\n * // new FileExporter().exportFromRoot(root, './output/demo');\n * ```\n *\n * @example カスタムオプション付き\n * ```typescript\n * const root = new Root();\n * root.export('./output/demo', { htmlFileName: 'page.html', includeResetCss: true });\n * // 上記は以下と等価:\n * // new FileExporter({ htmlFileName: 'page.html', includeResetCss: true }).exportFromRoot(root, './output/demo');\n * ```\n *\n * @remarks\n * **Preconditions:** `outputPath` は出力先ディレクトリパス\n *\n * **Postconditions:** `FileExporter.exportFromRoot` と同一の副作用(HTML/CSS/JS ファイル出力)\n *\n * **Error:** `FileExporter` から伝播するエラーはそのまま再スローされる\n */\n export(outputPath: string, options?: FileExporterOptions): void {\n new FileExporter(options).exportFromRoot(this, outputPath);\n }\n}\n","/**\n * Task 4.4: TextType テキストノード\n *\n * テキスト内容を返すテキストノードクラス。\n * テキストノードは属性を持たず、子要素も持たない。\n *\n * レンダリング:\n * protoRender() → content を返す(デフォルトはエスケープ済み)\n * render() → protoRender() → HTMLFormatter.format()\n * (テキストのみの場合はそのまま返される)\n *\n * Requirements: 3.4, 6.3\n */\nimport { HtmlTag } from './html-tag.js';\nimport type { HTMLTagProtocol, HtmlAttributeShape } from '../protocols/html-tag-protocol.js';\nimport type { RenderContext } from './render-context.js';\nimport { escapeHtml } from '../attributes/html-attribute.js';\n\n/**\n * Represents a text node in the HTML document tree.\n *\n * Text nodes contain plain text content without any HTML tags. They cannot\n * have attributes or child elements.\n *\n * **Rendering Format:**\n * ```\n * content\n * ```\n * (No HTML tags, just the raw text content)\n *\n * **Important:** Text content is HTML-escaped by default to prevent XSS.\n * Use `TextType.raw(content)` for intentional unescaped HTML output.\n *\n * @example\n * Basic usage:\n * ```typescript\n * // Using the Text factory function (escaped by default)\n * const text = Text('Hello <World>'); // renders: Hello <World>\n *\n * // Text nodes are also auto-created from strings in tag factories\n * const paragraph = p('This is automatically wrapped in TextType');\n * ```\n *\n * @example\n * Intentional raw HTML (trusted content only):\n * ```typescript\n * const raw = TextType.raw('<strong>trusted</strong>');\n * // WARNING: Never pass user input to TextType.raw()\n * ```\n *\n * @remarks\n * **Preconditions:** content can be any string (including empty string)\n *\n * **Postconditions:** `protoRender()` returns HTML-escaped content by default\n *\n * **Invariants:** attributes and children are always empty\n */\nexport class TextType extends HtmlTag {\n /**\n * The text content of this node (after escape processing).\n */\n readonly content: string;\n\n /**\n * Creates a new TextType node. Content is HTML-escaped by default.\n *\n * @param content - The text content\n * @param options - Options. `escape: false` disables HTML escaping (default: true)\n *\n * @example\n * ```typescript\n * const text = new TextType('Hello <World>');\n * console.log(text.render()); // \"Hello <World>\"\n *\n * const raw = new TextType('<strong>trusted</strong>', { escape: false });\n * console.log(raw.render()); // \"<strong>trusted</strong>\"\n * ```\n */\n constructor(content: string, options?: { escape?: boolean }) {\n super('text');\n this.content = options?.escape !== false ? escapeHtml(content) : content;\n }\n\n /**\n * Creates an unescaped TextType node for intentional raw HTML output.\n *\n * **WARNING:** Never pass user input to this method — XSS risk.\n *\n * @param content - Raw HTML/text content (NOT escaped)\n * @returns A new TextType instance without HTML escaping\n *\n * @example\n * ```typescript\n * const raw = TextType.raw('<em>trusted</em>');\n * console.log(raw.render()); // \"<em>trusted</em>\"\n * ```\n */\n static raw(content: string): TextType {\n return new TextType(content, { escape: false });\n }\n\n /**\n * Renders the text content (HTML-escaped by default).\n *\n * Text nodes don't have tags, so this simply returns the content.\n *\n * @returns The text content (escaped unless constructed with `escape: false`)\n *\n * @example\n * ```typescript\n * const text = new TextType('Hello <world>');\n * console.log(text.protoRender()); // \"Hello <world>\"\n * ```\n */\n override protoRender(_ctx?: RenderContext): string {\n // Task 3.2: ctx を受理(TextType は子要素を持たないため伝搬先なし)。\n // 出力は content をそのまま返す(既存挙動を維持)。\n return this.content;\n }\n\n /**\n * Silently ignores attribute addition (no-op).\n *\n * Text nodes cannot have attributes, so this method does nothing.\n *\n * @param _attribute - The attribute (ignored)\n * @returns This instance for method chaining\n */\n override addHtmlAttribute(_attribute: HtmlAttributeShape): this {\n // No-op: テキストノードは属性を持てない\n return this;\n }\n\n /**\n * Silently ignores child element addition (no-op).\n *\n * Text nodes cannot have children, so this method does nothing.\n *\n * @param _child - The child element (ignored)\n * @returns This instance for method chaining\n */\n override addChild(_child: HTMLTagProtocol): this {\n // No-op: テキストノードは子要素を持てない\n return this;\n }\n\n /**\n * Silently ignores multiple child elements addition (no-op).\n *\n * Text nodes cannot have children, so this method does nothing.\n *\n * @param _children - The child elements (ignored)\n * @returns This instance for method chaining\n */\n override addChildren(_children: ReadonlyArray<HTMLTagProtocol>): this {\n // No-op: テキストノードは子要素を持てない\n return this;\n }\n}\n","/**\n * Task 4.2: PairType ペアタグ要素\n *\n * 開始タグと終了タグを持つペア要素(div, p, span等)を表現する。\n * HtmlTag 基底クラスを継承し、<tag attrs>children</tag> 形式でレンダリングする。\n *\n * PairType は HtmlTag の全動作をそのまま継承する最も標準的なタグ種別であり、\n * addChild()/addChildren() で子要素を追加順に保持し、\n * protoRender() で <tag attrs>children</tag> を出力する。\n *\n * Requirements: 3.2, 3.5, 3.6, 6.5, 6.8\n */\nimport { HtmlTag } from './html-tag.js';\nimport type { HtmlTagOptions } from './html-tag.js';\nimport type { RenderContext } from './render-context.js';\nimport type { TagType } from '../tags/tag-type.js';\n\n/**\n * Represents HTML elements with opening and closing tags.\n *\n * PairType is the most common HTML element type, used for elements like\n * `<div>`, `<p>`, `<span>`, etc. These elements have both an opening tag\n * and a closing tag, and can contain child elements.\n *\n * **Rendering Format:**\n * ```html\n * <tag attrs>children</tag>\n * ```\n *\n * @example\n * ```typescript\n * // Using factory functions (recommended)\n * const element = div(\n * p('Hello'),\n * span('World')\n * );\n *\n * // Direct instantiation (less common)\n * const custom = new PairType('div');\n * custom.addChild(new TextType('Content'));\n * ```\n *\n * @example\n * With attributes:\n * ```typescript\n * const element = div(\n * { class: 'container', id: 'main' },\n * p('Content')\n * );\n * console.log(element.render());\n * // <div class=\"container\" id=\"main\">\n * // <p>Content</p>\n * // </div>\n * ```\n *\n * @remarks\n * **Preconditions:** tagType must be a valid pair tag (not self-closing)\n *\n * **Postconditions:** `protoRender()` returns `<tag attrs>children</tag>` format\n *\n * **Invariants:** Children order is preserved in insertion order\n */\nexport class PairType extends HtmlTag {\n /**\n * Creates a new PairType element.\n *\n * @param tagType - The HTML tag type (e.g., 'div', 'p', 'span')\n *\n * @remarks\n * It's recommended to use factory functions like {@link div}, {@link p}, {@link span}\n * instead of direct instantiation.\n */\n constructor(tagType: TagType, options?: HtmlTagOptions) {\n super(tagType, options);\n }\n\n /**\n * Task 3.2: PairType の protoRender override。\n *\n * 受け取った ctx を基底クラス実装に伝搬し、基底クラスが内部で\n * 子要素 `protoRender(ctx)` に同一インスタンスを渡せるようにする。\n * 出力フォーマット(`<tag attrs>children</tag>`)は基底クラス挙動を維持する。\n */\n override protoRender(ctx?: RenderContext): string {\n return super.protoRender(ctx);\n }\n}\n","/**\n * Task 4.3: SelfClosingType 自己終了タグ要素\n *\n * 終了タグを持たない自己終了要素(br, hr, img, input, meta, link 等)を表す。\n * HtmlTag を継承し、addChild/addChildren をオーバーライドして\n * 子要素追加を静かに無視する(no-op)。\n *\n * レンダリングは基底クラスの protoRender() が SELF_CLOSING_TAGS を参照して\n * `<tag attrs>` 形式を生成するため、追加のオーバーライドは不要。\n *\n * Requirements: 3.3, 6.4, 10.1\n */\nimport { HtmlTag } from './html-tag.js';\nimport type { HtmlTagOptions } from './html-tag.js';\nimport type { RenderContext } from './render-context.js';\nimport type { HTMLTagProtocol } from '../protocols/html-tag-protocol.js';\nimport type { TagType } from '../tags/tag-type.js';\n\n/**\n * Represents self-closing (void) HTML elements.\n *\n * Self-closing elements don't have closing tags and cannot contain children.\n * Examples include `<br>`, `<hr>`, `<img>`, `<input>`, `<meta>`, `<link>`, etc.\n *\n * **Rendering Format:**\n * ```html\n * <tag attrs>\n * ```\n *\n * **Child Handling:**\n * Attempts to add children are silently ignored (no-op) to maintain API consistency.\n * This design choice prevents runtime errors while maintaining fluent method chaining.\n *\n * @example\n * Basic usage:\n * ```typescript\n * // Using factory functions (recommended)\n * const lineBreak = br();\n * const image = img({ src: 'photo.jpg', alt: 'My photo' });\n * const inputField = input({ type: 'text', placeholder: 'Enter name' });\n * ```\n *\n * @example\n * Child elements are silently ignored:\n * ```typescript\n * const lineBreak = br();\n * lineBreak.addChild(p('This will be ignored'));\n * console.log(lineBreak.render());\n * // Output: <br>\n * // (no error, child is simply not rendered)\n * ```\n *\n * @remarks\n * **Preconditions:** tagType must be in {@link SELF_CLOSING_TAGS}\n *\n * **Postconditions:** `protoRender()` returns `<tag attrs>` format\n *\n * **Invariants:** Children array is always empty (addChild/addChildren are no-ops)\n */\nexport class SelfClosingType extends HtmlTag {\n /**\n * Creates a new SelfClosingType element.\n *\n * @param tagType - The HTML tag type (must be a self-closing tag like 'br', 'img', etc.)\n *\n * @remarks\n * It's recommended to use factory functions like {@link br}, {@link img}, {@link input}\n * instead of direct instantiation.\n */\n constructor(tagType: TagType, options?: HtmlTagOptions) {\n super(tagType, options);\n }\n\n /**\n * Silently ignores child element addition (no-op).\n *\n * Self-closing tags cannot have children, so this method does nothing.\n * This design prevents runtime errors while maintaining method chaining compatibility.\n *\n * @param _child - The child element (ignored)\n * @returns This instance for method chaining\n *\n * @example\n * ```typescript\n * const element = br()\n * .addChild(p('Ignored')) // No error, just ignored\n * .addHtmlAttribute(HtmlAttribute.className('line-break'));\n * ```\n */\n override addChild(_child: HTMLTagProtocol): this {\n // No-op: self-closing tags cannot have children\n return this;\n }\n\n /**\n * Silently ignores multiple child elements addition (no-op).\n *\n * Self-closing tags cannot have children, so this method does nothing.\n *\n * @param _children - The child elements (ignored)\n * @returns This instance for method chaining\n */\n override addChildren(_children: ReadonlyArray<HTMLTagProtocol>): this {\n // No-op: self-closing tags cannot have children\n return this;\n }\n\n /**\n * Task 3.2: SelfClosingType の protoRender override。\n *\n * SelfClosing 要素は子を持たないが、シグネチャを ctx 受理形に widen し、\n * 基底クラス実装に ctx を伝搬する。出力フォーマット(`<tag attrs>`)は\n * 基底クラス挙動を維持する。\n */\n override protoRender(ctx?: RenderContext): string {\n return super.protoRender(ctx);\n }\n}\n","/**\n * JsParam — jsTemplate 用変数参照マーカー型と sentinel エンコーディング\n *\n * factories.ts と js-template.ts の両方が共通して参照する。\n * 循環依存を防ぐため、依存関係のない独立したモジュールとして定義する。\n */\n\n// ============================================================\n// JsParam 型\n// ============================================================\n\n/**\n * jsTemplate で使う変数参照マーカー。\n * param('text') により生成され、属性値として渡された際に\n * 文字列リテラルではなく変数名として JS コードに展開される。\n */\nexport interface JsParam {\n readonly __jsParam: true;\n readonly name: string;\n}\n\n/**\n * JsParam の sentinel エンコード文字列プレフィックス。\n * AttributeMap を経由して HtmlAttribute に JsParam を埋め込む際に使用する。\n * 通常のコンテンツには含まれない null byte ベースのプレフィックス。\n * @internal\n */\nexport const JSPARAM_SENTINEL_PREFIX = '\\x00jsparam\\x00:';\n\n/**\n * 値が JsParam マーカーかどうかを判定する型ガード。\n *\n * @param value - チェックする値\n * @returns value が JsParam の場合 true\n */\nexport function isJsParam(value: unknown): value is JsParam {\n return (\n typeof value === 'object'\n && value !== null\n && (value as Record<string, unknown>)['__jsParam'] === true\n && typeof (value as Record<string, unknown>)['name'] === 'string'\n );\n}\n\n/**\n * JsParam マーカーを sentinel 文字列にエンコードする。\n * @internal\n */\nexport function encodeJsParam(p: JsParam): string {\n return `${JSPARAM_SENTINEL_PREFIX}${p.name}`;\n}\n\n/**\n * sentinel 文字列を JsParam 名にデコードする。\n * sentinel でない場合は null を返す。\n * @internal\n */\nexport function decodeJsParamSentinel(value: string): string | null {\n if (value.startsWith(JSPARAM_SENTINEL_PREFIX)) {\n return value.slice(JSPARAM_SENTINEL_PREFIX.length);\n }\n return null;\n}\n","/**\n * factories-utils.ts\n *\n * 宣言的API共通型と内部ユーティリティ関数。\n * タグファクトリファイル間で共有される。\n *\n * Requirements: 5.2, 5.7, 5.8\n */\nimport { PairType } from '../elements/pair-type.js';\nimport { SelfClosingType } from '../elements/self-closing-type.js';\nimport { TextType } from '../elements/text-type.js';\nimport { HtmlTag } from '../elements/html-tag.js';\nimport type { HtmlTagOptions } from '../elements/html-tag.js';\nimport { HtmlAttribute } from '../attributes/html-attribute.js';\nimport type { HTMLTagProtocol } from '../protocols/html-tag-protocol.js';\nimport type { BooleanAttributeKey, KeyValueAttributeKey, AriaAttributeKey } from '../attributes/attribute-keys.js';\nimport type { TagType } from './tag-type.js';\nimport type { JsParam } from '../../js/js-param.js';\nimport { isJsParam, encodeJsParam } from '../../js/js-param.js';\nimport { isHtmlTagOptions } from '../../composition-root.js';\nimport type { StyleTemplate } from '../../css/variables/style-template.js';\nimport type { SharedStyle } from '../../css/variables/css-shared-style.js';\n\n// ============================================================\n// 宣言的API共通型 (Task 5.2, Req 5.7, 5.8)\n// ============================================================\n\n/**\n * Valid child argument types for tag factory functions.\n *\n * Can be either an {@link HTMLTagProtocol} instance or a string (which will be\n * automatically wrapped in a {@link TextType}).\n *\n * @example\n * ```typescript\n * const element = div(\n * 'Plain text', // string → TextType\n * p('Paragraph'), // HTMLTagProtocol\n * span('Inline text') // HTMLTagProtocol\n * );\n * ```\n */\nexport type ChildArg = HTMLTagProtocol | string;\n\n/**\n * Attribute map for declarative attribute specification.\n *\n * **Value Types:**\n * - `string`: Creates a key-value attribute (e.g., `class=\"value\"`, `id=\"value\"`)\n * - `true`: Creates a boolean attribute (e.g., `checked`, `disabled`)\n * - `false`: Omits the attribute entirely\n *\n * **Special Keys:**\n * - `class`: Normalized through `normalizeClassNames`\n * - `data-*`: Creates custom data attributes\n * - Other keys: Standard HTML attributes\n *\n * @example\n * ```typescript\n * const element = div({\n * class: 'container active',\n * id: 'main',\n * 'data-value': '123',\n * hidden: false // Omitted from output\n * });\n * ```\n *\n * @example\n * Boolean attributes:\n * ```typescript\n * const checkbox = input({\n * type: 'checkbox',\n * checked: true, // Renders as: checked\n * disabled: false // Omitted\n * });\n * ```\n */\n/**\n * `css` 属性に渡せる値の型。\n *\n * - 単一の `StyleTemplate`(無名 `createStyle({...})` の戻り値)\n * - 単一の `SharedStyle`(名前あり `createStyle(\"name\", {...})` の戻り値)\n * - 上記の配列(順序保持で `class` 属性にマージされる)\n *\n * Requirements: 1.1, 1.4\n */\nexport type CssAttributeValue =\n | StyleTemplate\n | SharedStyle\n | ReadonlyArray<StyleTemplate | SharedStyle>;\n\nexport type AttributeMap = Record<\n string,\n string | boolean | JsParam | CssAttributeValue\n>;\n\n// ============================================================\n// 内部ユーティリティ (Task 5.2)\n// ============================================================\n\n/**\n * Runtime type guard to check if an argument is an {@link AttributeMap}.\n *\n * Considers plain objects (not HtmlTag instances or arrays) as AttributeMap.\n *\n * @param arg - The argument to check\n * @returns `true` if arg is an AttributeMap, `false` otherwise\n *\n * @internal\n */\nexport function isAttributeMap(arg: unknown): arg is AttributeMap {\n return typeof arg === 'object'\n && arg !== null\n && !(arg instanceof HtmlTag)\n && !Array.isArray(arg);\n}\n\n/**\n * Converts an {@link AttributeMap} to an array of {@link HtmlAttribute} instances.\n *\n * **Conversion Rules:**\n * - `class` key: Uses `HtmlAttribute.className()` with normalization\n * - `data-*` keys: Uses `HtmlAttribute.custom()` (strips `data-` prefix)\n * - Boolean `true`: Uses `HtmlAttribute.boolean()` (renders as attribute name only)\n * - Boolean `false`: Omits the attribute\n * - String values: Uses `HtmlAttribute.keyValue()`\n *\n * @param map - The attribute map to convert\n * @returns Array of HtmlAttribute instances\n *\n * @example\n * ```typescript\n * const attrs = parseAttributeMap({\n * class: 'btn primary',\n * id: 'submit',\n * 'data-value': '123',\n * disabled: true,\n * hidden: false\n * });\n * // Returns: [className('btn primary'), keyValue('id', 'submit'),\n * // custom('value', '123'), boolean('disabled')]\n * ```\n *\n * @internal\n */\nexport function parseAttributeMap(map: AttributeMap): HtmlAttribute[] {\n const result: HtmlAttribute[] = [];\n for (const [key, value] of Object.entries(map)) {\n // css キーは applyAttributeMap 経由で StyleTemplate に分解されるため、ここでは無視\n // (Requirements 1.1, 1.4:parseAttributeMap の戻り値型は HtmlAttribute[] のまま)\n if (key === 'css') {\n continue;\n }\n // jsName → data-jsname カスタム属性として保存(jsTemplate が検出・利用する)\n if (key === 'jsName') {\n if (typeof value === 'string') {\n result.push(HtmlAttribute.custom('jsname', value));\n }\n continue;\n }\n if (typeof value === 'boolean') {\n if (value) {\n result.push(HtmlAttribute.boolean(key as BooleanAttributeKey));\n }\n // false → omit\n } else if (isJsParam(value)) {\n // JsParam マーカー → sentinel エンコードして keyValue として保存\n // jsTemplate.render() が sentinel をデコードして変数参照に変換する\n const encoded = encodeJsParam(value);\n result.push(HtmlAttribute.keyValue(key as KeyValueAttributeKey | AriaAttributeKey, encoded));\n } else if (key === 'class') {\n // Requirement 1.6: class は文字列専用。styleObject 等の非文字列が\n // 渡された場合はランタイムでも TypeError をスローする\n // (型レベルでも禁止だが、AttributeMap が CssAttributeValue を含むため\n // バックアップとして実装する)\n if (typeof value !== 'string') {\n throw new TypeError(\n 'class attribute must be a string. Pass styleObject via the `css` attribute instead.',\n );\n }\n result.push(HtmlAttribute.className(value));\n } else if (key.startsWith('data-')) {\n if (typeof value !== 'string') {\n throw new TypeError(\n `data-* attribute \"${key}\" must be a string`,\n );\n }\n result.push(HtmlAttribute.custom(key.slice(5), value));\n } else {\n if (typeof value !== 'string') {\n throw new TypeError(\n `attribute \"${key}\" must be a string, boolean, or JsParam`,\n );\n }\n result.push(HtmlAttribute.keyValue(key as KeyValueAttributeKey | AriaAttributeKey, value));\n }\n }\n return result;\n}\n\n// ============================================================\n// css 属性パイプライン (Task 2.2, Req 1.1, 1.4, 1.5, 1.6)\n// ============================================================\n\n/**\n * `value` が `StyleTemplate` であるかを判定する型ガード。\n * @internal\n */\nfunction isStyleTemplate(value: unknown): value is StyleTemplate {\n return (\n typeof value === 'object'\n && value !== null\n && (value as { _kind?: unknown })._kind === 'styleTemplate'\n );\n}\n\n/**\n * `value` が `SharedStyle`(名前あり createStyle 戻り値)であるかを判定する型ガード。\n * `_template: StyleTemplate` を持つことで識別する。\n * @internal\n */\nfunction isSharedStyle(value: unknown): value is SharedStyle {\n return (\n typeof value === 'object'\n && value !== null\n && isStyleTemplate((value as { _template?: unknown })._template)\n );\n}\n\n/**\n * 単一の `css` 値要素から `StyleTemplate` を取り出す。\n *\n * - `StyleTemplate` はそのまま返す\n * - `SharedStyle` は内部 `_template` を取り出す\n * - その他は `TypeError`\n *\n * @internal\n */\nfunction toStyleTemplate(value: unknown): StyleTemplate {\n if (isStyleTemplate(value)) return value;\n if (isSharedStyle(value)) return value._template;\n throw new TypeError(\n 'css attribute value must be a StyleTemplate, SharedStyle, or array thereof',\n );\n}\n\n/**\n * `AttributeMap` の `css` キーから `StyleTemplate[]` を抽出する純関数。\n *\n * **Behavior:**\n * - `css` キーが存在しない場合は空配列を返す\n * - `StyleTemplate` 単体 → 1 件のリスト\n * - `SharedStyle` 単体 → 内部 `_template` を取り出して 1 件のリスト\n * - 配列 → 順序保持でフラット化(`SharedStyle` は `_template` に置換)\n * - `css` 値が上記のいずれでもなければ `TypeError`\n *\n * **Pure function**:入力 `map` を変更しない。\n *\n * Requirements: 1.1, 1.4\n *\n * @example\n * ```typescript\n * const a = createStyle({ display: 'flex' }); // StyleTemplate\n * const b = createStyle('row', { gap: '8px' }); // SharedStyle\n * extractStyleTemplates({ css: [a, b] });\n * // → [a, b._template]\n * ```\n */\nexport function extractStyleTemplates(map: AttributeMap): StyleTemplate[] {\n if (!('css' in map)) return [];\n const value = map.css;\n if (Array.isArray(value)) {\n return value.map(item => toStyleTemplate(item));\n }\n return [toStyleTemplate(value)];\n}\n\n/**\n * `applyAttributeMap` が呼び出し対象に要求する最小インターフェース。\n *\n * 構造的型付けを採用することで、Task 2.4 で `HtmlTag` に\n * `addStyleTemplates(tpls)` が追加される前でも本タスク単独で\n * 型チェックとユニットテストが成立する。\n *\n * @internal\n */\nexport interface AttributeTarget {\n addHtmlAttribute(attribute: HtmlAttribute): unknown;\n addStyleTemplates(templates: StyleTemplate[]): unknown;\n}\n\n/**\n * `tag` に `map` 由来の attributes と pendingStyleTemplates を一括適用する。\n *\n * 内部で `parseAttributeMap` と `extractStyleTemplates` を順に呼び出し、\n * 取得した HtmlAttribute を `tag.addHtmlAttribute(attr)` で 1 件ずつ追加した後、\n * StyleTemplate のリストを `tag.addStyleTemplates(templates)` で一括追加する。\n *\n * **Order**:必ず `addHtmlAttribute` を先、`addStyleTemplates` を後に呼び出す。\n *\n * **Validation**:`class` キーに非文字列(styleObject 等)が渡された場合は\n * `parseAttributeMap` 内で `TypeError` をスローする(Requirement 1.6)。\n *\n * Requirements: 1.1, 1.4, 1.5, 1.6\n *\n * @example\n * ```typescript\n * const btn = createStyle({ display: 'flex' });\n * applyAttributeMap(tag, { css: btn, class: 'primary' });\n * // tag has: class=\"primary\" attribute + pendingStyleTemplates: [btn]\n * ```\n */\nexport function applyAttributeMap(\n tag: AttributeTarget,\n map: AttributeMap,\n): void {\n const attrs = parseAttributeMap(map);\n const templates = extractStyleTemplates(map);\n for (const attr of attrs) {\n tag.addHtmlAttribute(attr);\n }\n tag.addStyleTemplates(templates);\n}\n\n/**\n * Converts a {@link ChildArg} to an {@link HTMLTagProtocol} instance.\n *\n * String arguments are automatically wrapped in {@link TextType}.\n *\n * @param arg - The child argument (string or HTMLTagProtocol)\n * @returns An HTMLTagProtocol instance\n *\n * @example\n * ```typescript\n * toChild('Hello') // → new TextType('Hello')\n * toChild(p('World')) // → p('World') (unchanged)\n * ```\n *\n * @internal\n */\nexport function toChild(arg: ChildArg): HTMLTagProtocol {\n if (typeof arg === 'string') {\n return new TextType(arg, { escape: true });\n }\n return arg;\n}\n\n/**\n * Common implementation for pair tag factory functions.\n *\n * **Argument Patterns:**\n * - No arguments: Returns empty PairType\n * - `ChildArg...`: Returns PairType with children\n * - `AttributeMap, ChildArg...`: Returns PairType with attributes and children\n *\n * @param tagType - The HTML tag type\n * @param args - Factory function arguments (attributes and/or children)\n * @returns A configured PairType instance\n *\n * @example\n * ```typescript\n * makePairTag('div', []) // <div></div>\n * makePairTag('div', ['Hello']) // <div>Hello</div>\n * makePairTag('div', [{ class: 'btn' }, 'Click']) // <div class=\"btn\">Click</div>\n * ```\n *\n * @internal\n */\nexport function makePairTag(\n tagType: TagType,\n args: Array<AttributeMap | ChildArg | HtmlTagOptions>,\n options?: HtmlTagOptions,\n): PairType {\n // args 末尾に HtmlTagOptions が含まれている場合は抽出する(呼び出し側の柔軟性のため)。\n // 明示的な第 3 引数 options が優先される。\n const { options: extracted, rest } = extractOptions(args);\n const resolvedOptions = options ?? extracted;\n\n const tag = new PairType(tagType, resolvedOptions);\n if (rest.length === 0) return tag;\n\n let startIndex = 0;\n if (isAttributeMap(rest[0])) {\n applyAttributeMap(tag, rest[0] as AttributeMap);\n startIndex = 1;\n }\n\n for (let idx = startIndex; idx < rest.length; idx++) {\n tag.addChild(toChild(rest[idx] as ChildArg));\n }\n\n return tag;\n}\n\n/**\n * Common implementation for self-closing tag factory functions.\n *\n * **Argument Patterns:**\n * - No arguments: Returns empty SelfClosingType\n * - `AttributeMap`: Returns SelfClosingType with attributes\n *\n * @param tagType - The HTML tag type\n * @param attrs - Optional attribute map\n * @returns A configured SelfClosingType instance\n *\n * @example\n * ```typescript\n * makeSelfClosingTag('br') // <br>\n * makeSelfClosingTag('img', { src: 'photo.jpg' }) // <img src=\"photo.jpg\">\n * ```\n *\n * @internal\n */\nexport function makeSelfClosingTag(\n tagType: TagType,\n args?: AttributeMap | Array<AttributeMap | ChildArg | HtmlTagOptions>,\n options?: HtmlTagOptions,\n): SelfClosingType {\n // args は以下のいずれかを許容:\n // - undefined → 属性なし\n // - AttributeMap → 旧 API: 単一の属性マップ\n // - Array<...> → 新 API: 可変長引数化した配列(末尾に HtmlTagOptions を含み得る)\n let attrs: AttributeMap | undefined;\n let resolvedOptions: HtmlTagOptions | undefined = options;\n\n if (Array.isArray(args)) {\n const { options: extracted, rest } = extractOptions(args);\n resolvedOptions = options ?? extracted;\n if (rest.length > 0 && isAttributeMap(rest[0])) {\n attrs = rest[0] as AttributeMap;\n }\n } else if (args !== undefined) {\n attrs = args;\n }\n\n const tag = new SelfClosingType(tagType, resolvedOptions);\n if (attrs) {\n applyAttributeMap(tag, attrs);\n }\n return tag;\n}\n\n// ============================================================\n// ファクトリジェネレータ (Task 4.1, Req 4)\n// ============================================================\n\n/**\n * Creates a factory function for pair (opening+closing) tag elements.\n *\n * @param tagType - The HTML tag type\n * @returns A factory function that creates PairType instances\n *\n * @example\n * ```typescript\n * export const div = makePairFactory(TAG_TYPES.div);\n * div({ class: 'container' }, 'Hello') // <div class=\"container\">Hello</div>\n * ```\n */\nexport function makePairFactory(\n tagType: TagType,\n): (...args: Array<AttributeMap | ChildArg | HtmlTagOptions>) => PairType {\n return (...args) => makePairTag(tagType, args);\n}\n\n/**\n * Creates a factory function for self-closing (void) tag elements.\n *\n * @param tagType - The HTML tag type\n * @returns A factory function that creates SelfClosingType instances\n *\n * @example\n * ```typescript\n * export const img = makeSelfClosingFactory(TAG_TYPES.img);\n * img({ src: 'photo.jpg', alt: 'My photo' }) // <img src=\"photo.jpg\" alt=\"My photo\">\n * ```\n */\nexport function makeSelfClosingFactory(\n tagType: TagType,\n): (attrs?: AttributeMap, options?: HtmlTagOptions) => SelfClosingType {\n return (attrs, options) => makeSelfClosingTag(tagType, attrs, options);\n}\n\n/**\n * 配列末尾の要素が `HtmlTagOptions`(`isHtmlTagOptions` を満たす)であれば pop し、\n * 残りの要素と共に返す。該当しない場合は options は undefined。\n *\n * `isAttributeMap` との曖昧さは `isHtmlTagOptions` が `'css' in v || 'jqm' in v` を\n * 要求するため回避される(空オブジェクト `{}` は AttributeMap として扱われる)。\n *\n * @internal\n */\nexport function extractOptions<T>(\n args: ReadonlyArray<T | HtmlTagOptions>,\n): { options: HtmlTagOptions | undefined; rest: T[] } {\n if (args.length === 0) {\n return { options: undefined, rest: [] };\n }\n const last = args[args.length - 1];\n // HtmlTag インスタンスは `css` / `jqm` ゲッタを持ち構造的には\n // `isHtmlTagOptions` を満たしてしまうが、子要素として扱うべきなので除外する。\n // 配列・非オブジェクトも options としては扱わない。\n if (\n last !== null\n && typeof last === 'object'\n && !(last instanceof HtmlTag)\n && !Array.isArray(last)\n && isHtmlTagOptions(last)\n ) {\n return {\n options: last,\n rest: args.slice(0, -1) as T[],\n };\n }\n return { options: undefined, rest: args.slice() as T[] };\n}\n","/**\n * factories-structure.ts\n *\n * 構造タグファクトリ関数: html, head, body, div, p, span, script\n *\n * Requirements: 5.1, 5.2, 4.2, 4.4, 6.1, 6.3\n */\nimport { makePairFactory } from './factories-utils.js';\nimport { TAG_TYPES } from './tag-type.js';\n\n/**\n * Creates an `<html>` element.\n *\n * The root element of an HTML document.\n *\n * @param args - Optional attributes, child elements, and a trailing `HtmlTagOptions`\n * @returns A new PairType instance representing an `<html>` element\n *\n * @example\n * ```typescript\n * const document = html(\n * head(title('My Page')),\n * body(h1('Welcome'))\n * );\n * ```\n */\nexport const html = makePairFactory(TAG_TYPES.html);\n\n/**\n * Creates a `<head>` element.\n *\n * Contains metadata and document-level resources.\n *\n * @param args - Optional attributes, child elements, and a trailing `HtmlTagOptions`\n * @returns A new PairType instance representing a `<head>` element\n *\n * @example\n * ```typescript\n * const pageHead = head(\n * title('My Page'),\n * meta({ charset: 'utf-8' })\n * );\n * ```\n */\nexport const head = makePairFactory(TAG_TYPES.head);\n\n/**\n * Creates a `<body>` element.\n *\n * Contains the visible content of the HTML document.\n *\n * @param args - Optional attributes, child elements, and a trailing `HtmlTagOptions`\n * @returns A new PairType instance representing a `<body>` element\n *\n * @example\n * ```typescript\n * const pageBody = body(\n * { class: 'main-layout' },\n * header(h1('Welcome')),\n * main(p('Content'))\n * );\n * ```\n */\nexport const body = makePairFactory(TAG_TYPES.body);\n\n/**\n * Creates a `<div>` element.\n *\n * A generic container for flow content.\n *\n * @param args - Optional attributes, child elements, and a trailing `HtmlTagOptions`\n * @returns A new PairType instance representing a `<div>` element\n *\n * @example\n * ```typescript\n * const container = div(\n * { class: 'container' },\n * p('First paragraph'),\n * p('Second paragraph')\n * );\n * ```\n */\nexport const div = makePairFactory(TAG_TYPES.div);\n\n/**\n * Creates a `<p>` element.\n *\n * Represents a paragraph of text.\n *\n * @param args - Optional attributes, child elements, and a trailing `HtmlTagOptions`\n * @returns A new PairType instance representing a `<p>` element\n *\n * @example\n * ```typescript\n * const paragraph = p('This is a paragraph.');\n * const styledParagraph = p(\n * { class: 'intro' },\n * 'This is an introduction.'\n * );\n * ```\n */\nexport const p = makePairFactory(TAG_TYPES.p);\n\n/**\n * Creates a `<span>` element.\n *\n * A generic inline container for phrasing content.\n *\n * @param args - Optional attributes, child elements, and a trailing `HtmlTagOptions`\n * @returns A new PairType instance representing a `<span>` element\n *\n * @example\n * ```typescript\n * const highlighted = span({ class: 'highlight' }, 'Important text');\n * ```\n */\nexport const span = makePairFactory(TAG_TYPES.span);\n\n/**\n * Creates a `<script>` element.\n *\n * Used to embed or reference executable JavaScript code.\n *\n * @param args - Optional attributes, child elements, and a trailing `HtmlTagOptions`\n * @returns A new PairType instance representing a `<script>` element\n *\n * @example\n * ```typescript\n * const inlineScript = script('console.log(\"Hello\");');\n * const externalScript = script({ src: 'app.js' });\n * ```\n */\nexport const script = makePairFactory(TAG_TYPES.script);\n","/**\n * factories-semantic.ts\n *\n * セマンティック・見出し・インタラクティブ・その他タグファクトリ関数:\n * header, footer, nav, main, section, article, aside, figure, figcaption,\n * h1-h6, details, summary, dialog, iframe, noscript, a, title, varTag\n *\n * Requirements: 5.1, 5.2\n */\nimport { makePairFactory } from './factories-utils.js';\nimport { TAG_TYPES } from './tag-type.js';\n\n// ── セマンティック ──\n\n/** Creates a `<header>` element (introductory content or navigation aids). */\nexport const header = makePairFactory(TAG_TYPES.header);\n\n/** Creates a `<footer>` element (footer for nearest sectioning content or root). */\nexport const footer = makePairFactory(TAG_TYPES.footer);\n\n/** Creates a `<nav>` element (section with navigation links). */\nexport const nav = makePairFactory(TAG_TYPES.nav);\n\n/** Creates a `<main>` element (dominant content of the document body). */\nexport const main = makePairFactory(TAG_TYPES.main);\n\n/** Creates a `<section>` element (generic section of a document). */\nexport const section = makePairFactory(TAG_TYPES.section);\n\n/** Creates an `<article>` element (self-contained composition). */\nexport const article = makePairFactory(TAG_TYPES.article);\n\n/** Creates an `<aside>` element (content tangentially related to main content). */\nexport const aside = makePairFactory(TAG_TYPES.aside);\n\n/** Creates a `<figure>` element (self-contained content with optional caption). */\nexport const figure = makePairFactory(TAG_TYPES.figure);\n\n/** Creates a `<figcaption>` element (caption or legend for a figure). */\nexport const figcaption = makePairFactory(TAG_TYPES.figcaption);\n\n// ── 見出し ──\n\n/** Creates an `<h1>` element (level 1 heading). */\nexport const h1 = makePairFactory(TAG_TYPES.h1);\n\n/** Creates an `<h2>` element (level 2 heading). */\nexport const h2 = makePairFactory(TAG_TYPES.h2);\n\n/** Creates an `<h3>` element (level 3 heading). */\nexport const h3 = makePairFactory(TAG_TYPES.h3);\n\n/** Creates an `<h4>` element (level 4 heading). */\nexport const h4 = makePairFactory(TAG_TYPES.h4);\n\n/** Creates an `<h5>` element (level 5 heading). */\nexport const h5 = makePairFactory(TAG_TYPES.h5);\n\n/** Creates an `<h6>` element (level 6 heading). */\nexport const h6 = makePairFactory(TAG_TYPES.h6);\n\n// ── インタラクティブ ──\n\n/** Creates a `<details>` element (disclosure widget). */\nexport const details = makePairFactory(TAG_TYPES.details);\n\n/** Creates a `<summary>` element (summary for details element). */\nexport const summary = makePairFactory(TAG_TYPES.summary);\n\n/** Creates a `<dialog>` element (dialog box or modal). */\nexport const dialog = makePairFactory(TAG_TYPES.dialog);\n\n/** Creates an `<iframe>` element (nested browsing context). */\nexport const iframe = makePairFactory(TAG_TYPES.iframe);\n\n/** Creates a `<noscript>` element (fallback for scripts disabled). */\nexport const noscript = makePairFactory(TAG_TYPES.noscript);\n\n// ── その他 ──\n\n/** Creates an `<a>` element (hyperlink). */\nexport const a = makePairFactory(TAG_TYPES.a);\n\n/** Creates a `<title>` element (document title). */\nexport const title = makePairFactory(TAG_TYPES.title);\n\n/**\n * Creates a `<var>` element (variable in mathematical or programming context).\n *\n * **Note:** Named `varTag` instead of `var` to avoid collision with JavaScript's `var` keyword.\n */\nexport const varTag = makePairFactory(TAG_TYPES.var);\n","/**\n * factories-data.ts\n *\n * データ構造タグファクトリ関数:\n * テーブル: table, thead, tbody, tfoot, tr, th, td, caption, colgroup\n * リスト: ul, ol, li, dl, dt, dd\n *\n * Requirements: 5.1, 5.2\n */\nimport { makePairFactory } from './factories-utils.js';\nimport { TAG_TYPES } from './tag-type.js';\n\n// ── テーブル ──\n\n/** Creates a `<table>` element. */\nexport const table = makePairFactory(TAG_TYPES.table);\n\n/** Creates a `<thead>` element (table header group). */\nexport const thead = makePairFactory(TAG_TYPES.thead);\n\n/** Creates a `<tbody>` element (table body group). */\nexport const tbody = makePairFactory(TAG_TYPES.tbody);\n\n/** Creates a `<tfoot>` element (table footer group). */\nexport const tfoot = makePairFactory(TAG_TYPES.tfoot);\n\n/** Creates a `<tr>` element (table row). */\nexport const tr = makePairFactory(TAG_TYPES.tr);\n\n/** Creates a `<th>` element (table header cell). */\nexport const th = makePairFactory(TAG_TYPES.th);\n\n/** Creates a `<td>` element (table data cell). */\nexport const td = makePairFactory(TAG_TYPES.td);\n\n/** Creates a `<caption>` element (table caption). */\nexport const caption = makePairFactory(TAG_TYPES.caption);\n\n/** Creates a `<colgroup>` element (table column group). */\nexport const colgroup = makePairFactory(TAG_TYPES.colgroup);\n\n// ── リスト ──\n\n/** Creates a `<ul>` element (unordered list). */\nexport const ul = makePairFactory(TAG_TYPES.ul);\n\n/** Creates an `<ol>` element (ordered list). */\nexport const ol = makePairFactory(TAG_TYPES.ol);\n\n/** Creates a `<li>` element (list item). */\nexport const li = makePairFactory(TAG_TYPES.li);\n\n/** Creates a `<dl>` element (description list). */\nexport const dl = makePairFactory(TAG_TYPES.dl);\n\n/** Creates a `<dt>` element (description term). */\nexport const dt = makePairFactory(TAG_TYPES.dt);\n\n/** Creates a `<dd>` element (description details). */\nexport const dd = makePairFactory(TAG_TYPES.dd);\n","/**\n * factories-form.ts\n *\n * フォームタグファクトリ関数:\n * form, label, button, select, option, optgroup, textarea,\n * fieldset, legend, datalist, output\n *\n * Requirements: 5.1, 5.2\n */\nimport { makePairFactory } from './factories-utils.js';\nimport { TAG_TYPES } from './tag-type.js';\n\n// ── フォーム ──\n\n/** Creates a `<form>` element. */\nexport const form = makePairFactory(TAG_TYPES.form);\n\n/** Creates a `<label>` element (label for a form control). */\nexport const label = makePairFactory(TAG_TYPES.label);\n\n/** Creates a `<button>` element. */\nexport const button = makePairFactory(TAG_TYPES.button);\n\n/** Creates a `<select>` element (dropdown list). */\nexport const select = makePairFactory(TAG_TYPES.select);\n\n/** Creates an `<option>` element (option in a select list). */\nexport const option = makePairFactory(TAG_TYPES.option);\n\n/** Creates an `<optgroup>` element (group of options). */\nexport const optgroup = makePairFactory(TAG_TYPES.optgroup);\n\n/** Creates a `<textarea>` element (multi-line text input). */\nexport const textarea = makePairFactory(TAG_TYPES.textarea);\n\n/** Creates a `<fieldset>` element (group of form controls). */\nexport const fieldset = makePairFactory(TAG_TYPES.fieldset);\n\n/** Creates a `<legend>` element (caption for a fieldset). */\nexport const legend = makePairFactory(TAG_TYPES.legend);\n\n/** Creates a `<datalist>` element (predefined options for input). */\nexport const datalist = makePairFactory(TAG_TYPES.datalist);\n\n/** Creates an `<output>` element (result of a calculation). */\nexport const output = makePairFactory(TAG_TYPES.output);\n","/**\n * factories-inline.ts\n *\n * インライン/テキスト装飾タグファクトリ関数:\n * strong, em, b, i, u, s, mark, small, sub, sup, code, pre,\n * blockquote, q, cite, abbr, address, time, kbd, samp\n *\n * Requirements: 5.1, 5.2, 4.2, 4.4, 6.1, 6.3\n */\nimport { makePairFactory } from './factories-utils.js';\nimport { TAG_TYPES } from './tag-type.js';\n\n// ── テキスト装飾 ──\n\n/** Creates a `<strong>` element (strong importance, serious urgency). */\nexport const strong = makePairFactory(TAG_TYPES.strong);\n\n/** Creates an `<em>` element (stress emphasis). */\nexport const em = makePairFactory(TAG_TYPES.em);\n\n/** Creates a `<b>` element (bring attention to, stylistically offset). */\nexport const b = makePairFactory(TAG_TYPES.b);\n\n/** Creates an `<i>` element (alternative voice or mood). */\nexport const i = makePairFactory(TAG_TYPES.i);\n\n/** Creates a `<u>` element (unarticulated annotation). */\nexport const u = makePairFactory(TAG_TYPES.u);\n\n/** Creates an `<s>` element (strikethrough, no longer accurate). */\nexport const s = makePairFactory(TAG_TYPES.s);\n\n/** Creates a `<mark>` element (highlighted reference). */\nexport const mark = makePairFactory(TAG_TYPES.mark);\n\n/** Creates a `<small>` element (side comments, small print). */\nexport const small = makePairFactory(TAG_TYPES.small);\n\n/** Creates a `<sub>` element (subscript). */\nexport const sub = makePairFactory(TAG_TYPES.sub);\n\n/** Creates a `<sup>` element (superscript). */\nexport const sup = makePairFactory(TAG_TYPES.sup);\n\n/** Creates a `<code>` element (fragment of computer code). */\nexport const code = makePairFactory(TAG_TYPES.code);\n\n/** Creates a `<pre>` element (preformatted text). */\nexport const pre = makePairFactory(TAG_TYPES.pre);\n\n/** Creates a `<blockquote>` element (block quotation). */\nexport const blockquote = makePairFactory(TAG_TYPES.blockquote);\n\n/** Creates a `<q>` element (inline quotation). */\nexport const q = makePairFactory(TAG_TYPES.q);\n\n/** Creates a `<cite>` element (title of a creative work). */\nexport const cite = makePairFactory(TAG_TYPES.cite);\n\n/** Creates an `<abbr>` element (abbreviation or acronym). */\nexport const abbr = makePairFactory(TAG_TYPES.abbr);\n\n/** Creates an `<address>` element (contact information). */\nexport const address = makePairFactory(TAG_TYPES.address);\n\n/** Creates a `<time>` element (date/time). */\nexport const time = makePairFactory(TAG_TYPES.time);\n\n/** Creates a `<kbd>` element (keyboard input). */\nexport const kbd = makePairFactory(TAG_TYPES.kbd);\n\n/** Creates a `<samp>` element (sample output). */\nexport const samp = makePairFactory(TAG_TYPES.samp);\n","/**\n * factories-media.ts\n *\n * メディア・自己終了タグ・テキストファクトリ関数:\n * ペアタグ: video, audio, picture, canvas, svg\n * 自己終了タグ: br, hr, img, input, meta, link, source, track, area, col, base, embed, wbr\n * テキスト: Text (Text.unsafeRaw を含む)\n *\n * Requirements: 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 4.2, 4.4, 6.1, 6.3\n */\nimport { TextType } from '../elements/text-type.js';\nimport { makePairFactory, makeSelfClosingFactory } from './factories-utils.js';\nimport { TAG_TYPES } from './tag-type.js';\n\n// ── メディア ──\n\n/** Creates a `<video>` element (video player). */\nexport const video = makePairFactory(TAG_TYPES.video);\n\n/** Creates an `<audio>` element (audio player). */\nexport const audio = makePairFactory(TAG_TYPES.audio);\n\n/** Creates a `<picture>` element (responsive image container). */\nexport const picture = makePairFactory(TAG_TYPES.picture);\n\n/** Creates a `<canvas>` element (scriptable graphics). */\nexport const canvas = makePairFactory(TAG_TYPES.canvas);\n\n/** Creates an `<svg>` element (scalable vector graphics). */\nexport const svg = makePairFactory(TAG_TYPES.svg);\n\n// ============================================================\n// 自己終了タグファクトリ関数(13個)\n// ============================================================\n\n/**\n * Creates a `<br>` element (line break).\n *\n * @returns A new SelfClosingType instance representing a `<br>` element\n *\n * @example\n * ```typescript\n * const lineBreak = br();\n * // Renders as: <br>\n * ```\n */\nexport const br = makeSelfClosingFactory(TAG_TYPES.br);\n\n/**\n * Creates an `<hr>` element (thematic break / horizontal rule).\n *\n * @returns A new SelfClosingType instance representing an `<hr>` element\n *\n * @example\n * ```typescript\n * const separator = hr();\n * // Renders as: <hr>\n * ```\n */\nexport const hr = makeSelfClosingFactory(TAG_TYPES.hr);\n\n/**\n * Creates an `<img>` element (image).\n *\n * @param attrs - Optional attributes (typically includes `src` and `alt`)\n * @param options - Optional HtmlTagOptions (for css/jqm injection)\n * @returns A new SelfClosingType instance representing an `<img>` element\n *\n * @example\n * ```typescript\n * const image = img({ src: 'photo.jpg', alt: 'My photo' });\n * // Renders as: <img src=\"photo.jpg\" alt=\"My photo\">\n * ```\n */\nexport const img = makeSelfClosingFactory(TAG_TYPES.img);\n\n/**\n * Creates an `<input>` element (form input control).\n *\n * @param attrs - Optional attributes (e.g., `type`, `name`, `value`, `placeholder`)\n * @param options - Optional HtmlTagOptions (for css/jqm injection)\n * @returns A new SelfClosingType instance representing an `<input>` element\n *\n * @example\n * ```typescript\n * const textInput = input({ type: 'text', placeholder: 'Enter name' });\n * const checkbox = input({ type: 'checkbox', checked: true });\n * ```\n */\nexport const input = makeSelfClosingFactory(TAG_TYPES.input);\n\n/**\n * Creates a `<meta>` element (metadata).\n *\n * @param attrs - Optional attributes (e.g., `charset`, `name`, `content`)\n * @param options - Optional HtmlTagOptions (for css/jqm injection)\n * @returns A new SelfClosingType instance representing a `<meta>` element\n *\n * @example\n * ```typescript\n * const charset = meta({ charset: 'utf-8' });\n * const viewport = meta({ name: 'viewport', content: 'width=device-width' });\n * ```\n */\nexport const meta = makeSelfClosingFactory(TAG_TYPES.meta);\n\n/**\n * Creates a `<link>` element (external resource link, typically CSS).\n *\n * @param attrs - Optional attributes (e.g., `rel`, `href`, `type`)\n * @param options - Optional HtmlTagOptions (for css/jqm injection)\n * @returns A new SelfClosingType instance representing a `<link>` element\n *\n * @example\n * ```typescript\n * const stylesheet = link({ rel: 'stylesheet', href: 'styles.css' });\n * const icon = link({ rel: 'icon', href: 'favicon.ico' });\n * ```\n */\nexport const link = makeSelfClosingFactory(TAG_TYPES.link);\n\n/**\n * Creates a `<source>` element (media source for `<video>`, `<audio>`, or `<picture>`).\n *\n * @param attrs - Optional attributes (e.g., `src`, `type`, `media`)\n * @param options - Optional HtmlTagOptions (for css/jqm injection)\n * @returns A new SelfClosingType instance representing a `<source>` element\n *\n * @example\n * ```typescript\n * const videoSource = source({ src: 'video.mp4', type: 'video/mp4' });\n * ```\n */\nexport const source = makeSelfClosingFactory(TAG_TYPES.source);\n\n/**\n * Creates a `<track>` element (text track for media elements).\n *\n * @param attrs - Optional attributes (e.g., `kind`, `src`, `srclang`, `label`)\n * @param options - Optional HtmlTagOptions (for css/jqm injection)\n * @returns A new SelfClosingType instance representing a `<track>` element\n *\n * @example\n * ```typescript\n * const subtitles = track({ kind: 'subtitles', src: 'subs.vtt', srclang: 'en' });\n * ```\n */\nexport const track = makeSelfClosingFactory(TAG_TYPES.track);\n\n/**\n * Creates an `<area>` element (clickable area in an image map).\n *\n * @param attrs - Optional attributes (e.g., `shape`, `coords`, `href`, `alt`)\n * @param options - Optional HtmlTagOptions (for css/jqm injection)\n * @returns A new SelfClosingType instance representing an `<area>` element\n */\nexport const area = makeSelfClosingFactory(TAG_TYPES.area);\n\n/**\n * Creates a `<col>` element (table column definition).\n *\n * @param attrs - Optional attributes (e.g., `span`)\n * @param options - Optional HtmlTagOptions (for css/jqm injection)\n * @returns A new SelfClosingType instance representing a `<col>` element\n */\nexport const col = makeSelfClosingFactory(TAG_TYPES.col);\n\n/**\n * Creates a `<base>` element (base URL for relative URLs).\n *\n * @param attrs - Optional attributes (e.g., `href`, `target`)\n * @param options - Optional HtmlTagOptions (for css/jqm injection)\n * @returns A new SelfClosingType instance representing a `<base>` element\n *\n * @example\n * ```typescript\n * const baseUrl = base({ href: 'https://example.com/' });\n * ```\n */\nexport const base = makeSelfClosingFactory(TAG_TYPES.base);\n\n/**\n * Creates an `<embed>` element (embedded external content).\n *\n * @param attrs - Optional attributes (e.g., `src`, `type`, `width`, `height`)\n * @param options - Optional HtmlTagOptions (for css/jqm injection)\n * @returns A new SelfClosingType instance representing an `<embed>` element\n */\nexport const embed = makeSelfClosingFactory(TAG_TYPES.embed);\n\n/**\n * Creates a `<wbr>` element (word break opportunity).\n *\n * @returns A new SelfClosingType instance representing a `<wbr>` element\n *\n * @example\n * ```typescript\n * const longUrl = p('https://very', wbr(), 'long', wbr(), 'url.com');\n * ```\n */\nexport const wbr = makeSelfClosingFactory(TAG_TYPES.wbr);\n\n// ============================================================\n// テキストファクトリ関数\n// ============================================================\n\n/**\n * Creates a text node.\n *\n * Text nodes are usually created automatically when passing strings to tag factories,\n * but this function can be used for explicit text node creation.\n *\n * @param content - The text content (HTML-escaped automatically)\n * @returns A new TextType instance\n *\n * @example\n * ```typescript\n * // Explicit text node creation\n * const text = Text('Hello <World>'); // renders: Hello <World>\n *\n * // Usually, strings are auto-converted:\n * const paragraph = p('This is automatically wrapped in TextType');\n * ```\n */\nexport function Text(content: string): TextType {\n return new TextType(content, { escape: true });\n}\n\n/**\n * Creates an **unescaped** text node. HTML content is rendered as-is.\n *\n * **WARNING: This is unsafe for user input.** Only use for trusted content\n * such as code examples or pre-rendered HTML. For user input, use `Text()` instead.\n *\n * @param content - Raw HTML/text content (NOT escaped)\n * @returns A new TextType instance without HTML escaping\n *\n * @example\n * ```typescript\n * // Code example in <pre><code> — needs raw HTML\n * pre(code(Text.unsafeRaw('<div class=\"card\">Hello</div>')))\n *\n * // NEVER do this with user input:\n * // Text.unsafeRaw(userInput) ← XSS vulnerability!\n * ```\n */\nText.unsafeRaw = function unsafeRaw(content: string): TextType {\n return new TextType(content, { escape: false });\n};\n","import { mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Root } from '../html/elements/root.js';\nimport { ExportableError } from '../publisher/exportable-error.js';\nimport { errorToString } from '../utils/errors.js';\n\n/**\n * 静的ページ書き出しのオプション。\n *\n * design.md §6.3 で定義された `StaticExportOptions` インターフェース。\n *\n * - `htmlFileName`: 出力 HTML ファイル名(デフォルト: `'index.html'`)\n * - `cssFileName`: 出力 CSS ファイル名(デフォルト: `'style.css'`)。`inlineCss=false` のときのみ使用\n * - `inlineCss`: CSS を `<style>` タグとして HTML 内に埋め込むか(デフォルト: `true`)\n *\n * @public\n */\nexport interface StaticExportOptions {\n readonly htmlFileName?: string;\n readonly cssFileName?: string;\n readonly inlineCss?: boolean;\n}\n\n/**\n * 静的ページ書き出し専用の Writer。\n *\n * `Root.render()` と `Root.collectCssStyleString()` のみを使用し、\n * runtime prelude / `Root.renderJs()` / `Root.renderVanillaScript()` /\n * `FileExporter` のいずれにも依存しない。JS ファイル(`runtime.js`,\n * `app.js`, `script.js` など)は一切生成しない。\n *\n * design.md §6.4 のサービス契約に対応する。\n *\n * @public\n */\nexport class StaticPageWriter {\n /**\n * `root` を `outputPath` 配下に静的ファイルとして書き出す。\n *\n * - デフォルト(`inlineCss=true`)では `index.html` のみ出力し、\n * CSS を `<style>` タグとして `</head>` 直前に埋め込む。\n * - `inlineCss=false` のときは `index.html` と `style.css` を出力し、\n * `<link rel=\"stylesheet\">` を `</head>` 直前に挿入する。\n * - CSS が空文字列の場合は CSS 関連の出力・挿入を完全にスキップする。\n *\n * @param root - 静的検証済みの {@link Root}\n * @param outputPath - 出力先ディレクトリパス\n * @param options - 書き出しオプション\n *\n * @throws {@link ExportableError}\n * - `invalidPath`: `outputPath` が空文字列\n * - `writeFailed`: ディレクトリ作成またはファイル書き込みに失敗\n */\n write(root: Root, outputPath: string, options?: StaticExportOptions): void {\n if (outputPath.length === 0) {\n throw new ExportableError(\n 'invalidPath',\n outputPath,\n 'Output path must not be empty',\n );\n }\n\n const htmlFileName = options?.htmlFileName ?? 'index.html';\n const cssFileName = options?.cssFileName ?? 'style.css';\n const inlineCss = options?.inlineCss ?? true;\n\n // Root からは render() / collectCssStyleString() のみを呼ぶ。\n // renderJs() / renderVanillaScript() / collectJsContent() / export() には依存しない。\n const htmlContent = root.render();\n const cssContent = root.collectCssStyleString();\n const hasCss = cssContent.trim().length > 0;\n\n // ディレクトリを作成(存在しない場合は再帰的に)\n try {\n mkdirSync(outputPath, { recursive: true });\n } catch (error) {\n throw new ExportableError(\n 'writeFailed',\n outputPath,\n `Failed to create directory: ${errorToString(error)}`,\n );\n }\n\n // HTML へ CSS を埋め込む / link を挿入する\n let finalHtml = htmlContent;\n if (hasCss) {\n const headEndIndex = finalHtml.indexOf('</head>');\n if (headEndIndex !== -1) {\n const insertion = inlineCss\n ? `<style>\\n${cssContent}\\n</style>\\n`\n : `<link rel=\"stylesheet\" href=\"${cssFileName}\">\\n`;\n finalHtml =\n finalHtml.slice(0, headEndIndex) +\n insertion +\n finalHtml.slice(headEndIndex);\n }\n }\n\n try {\n writeFileSync(join(outputPath, htmlFileName), finalHtml, 'utf-8');\n if (hasCss && !inlineCss) {\n writeFileSync(join(outputPath, cssFileName), cssContent, 'utf-8');\n }\n } catch (error) {\n throw new ExportableError(\n 'writeFailed',\n outputPath,\n `Failed to write files: ${errorToString(error)}`,\n );\n }\n }\n}\n","import { Root } from '../html/elements/root.js';\nimport { HtmlTag } from '../html/elements/html-tag.js';\nimport { TextType } from '../html/elements/text-type.js';\nimport { body, head, html, main, meta, title } from '../html/tags/index.js';\nimport { StaticPageWriter, type StaticExportOptions } from './static-page-writer.js';\nimport type { PageOptions, StaticView } from './types.js';\n\nexport type { StaticExportOptions } from './static-page-writer.js';\n\n/**\n * 静的ページの境界オブジェクト。\n *\n * 内部で {@link Root} を保持するが外部 API では露出しない。\n * `render()` は HTML + inline CSS を返し、`export()` は {@link StaticPageWriter} に委譲する。\n *\n * design.md §6.3 / requirements.md 4.2, 5.1, 5.2 に対応。\n *\n * 構築時 pure validation を {@link page} ファクトリで 1 度だけ実施するため、\n * `render()` / `export()` 側では再検証しない(冪等性)。\n */\nexport class PageDocument {\n private readonly _root: Root;\n\n /**\n * @internal `page()` ファクトリからのみ呼び出されることを想定する。\n * 外部から直接構築すると静的性検証を素通りするため非推奨。\n */\n constructor(root: Root) {\n this._root = root;\n }\n\n render(): string {\n const htmlStr = this._root.render();\n const css = this._root.collectCssStyleString();\n if (css.length === 0) return htmlStr;\n const styleTag = `<style>\\n${css}\\n</style>`;\n const insertPoint = htmlStr.indexOf('</head>');\n if (insertPoint === -1) return htmlStr;\n return `${htmlStr.slice(0, insertPoint)}${styleTag}\\n${htmlStr.slice(insertPoint)}`;\n }\n\n export(outputPath: string, options?: StaticExportOptions): void {\n new StaticPageWriter().write(this._root, outputPath, options);\n }\n}\n\n/**\n * `arg` が `PageOptions` かどうかを判別する内部型ガード。\n *\n * `StaticView` は `protoRender` プロパティを持つ(design.md §6.1)ため、\n * `protoRender` が存在しないオブジェクトを `PageOptions` として扱う。\n */\nfunction isPageOptions(arg: unknown): arg is PageOptions {\n return typeof arg === 'object' && arg !== null && !('protoRender' in arg);\n}\n\n/**\n * 静的ページのファクトリ。\n *\n * design.md §6.2 に準拠し `StaticView` を受け取り {@link PageDocument} を返す。\n *\n * **レイアウト契約**: 渡した StaticView は `<main>` の直接の子として縦方向に積まれる(ブロックフロー)。\n * ページルート自体のレイアウト変更は不可。横並び等が必要な場合は View 側でコンテナを組むこと。\n *\n * 構築時 pure validation:\n * - 新規 `Root` 構築直後に `_root.collectUsedMethods()` / `_root.collectJsContent()`\n * を 1 回だけ読み取り専用 walk として実行する。\n * - いずれかが非空なら `Error('page surface does not allow runtime content: <hint>')`\n * を throw し、`PageDocument` は生成されない(requirements.md 3.2)。\n * - `protoRender()` は呼ばないため `RenderContext.registry.reset()` 等の\n * レンダー副作用は発生しない(design.md §6.3 冪等性)。\n */\n// View のみ(options なし)\nexport function page(...views: StaticView[]): PageDocument;\n// Views + options(末尾)\nexport function page(...args: [...StaticView[], PageOptions]): PageDocument;\nexport function page(...args: (StaticView | PageOptions)[]): PageDocument {\n const lastArg = args[args.length - 1];\n const options = args.length > 0 && isPageOptions(lastArg) ? (lastArg as PageOptions) : undefined;\n const views = options !== undefined ? (args.slice(0, -1) as StaticView[]) : (args as StaticView[]);\n const root = new Root();\n root.setDoctype(true);\n\n const charsetMeta = meta({ charset: options?.charset ?? 'UTF-8' });\n\n const viewportMeta = options?.viewport !== undefined\n ? meta({ name: 'viewport', content: options.viewport })\n : undefined;\n\n const descriptionMeta = options?.description !== undefined\n ? meta({ name: 'description', content: options.description })\n : undefined;\n\n const titleEl = title(options?.title ?? '');\n\n const metaList = [charsetMeta, viewportMeta, descriptionMeta, titleEl]\n .filter((el): el is NonNullable<typeof el> => el !== undefined);\n\n const headEl = head(...metaList);\n // `StaticView` は narrow interface(design.md §6.1)であり、`HtmlTag`\n // が構造的にこれを満たす。`main(...)` / `body(...)` はタグ構築側の `ChildArg` 型を\n // 期待するため、ここで `unknown` 経由のキャストでブリッジする(design.md §6.2)。\n // `HtmlTag` インスタンスでない純粋な `StaticView`(AppSlot 等)は\n // `TextType.raw(protoRender())` でラップしてから渡す。\n const resolvedViews = views.map((v) =>\n v instanceof HtmlTag ? v : TextType.raw(v.protoRender()),\n );\n const mainEl = main(...(resolvedViews as unknown as Parameters<typeof main>));\n const bodyEl = body(mainEl as unknown as Parameters<typeof body>[0]);\n const htmlEl = options?.lang !== undefined\n ? html({ lang: options.lang }, headEl, bodyEl)\n : html(headEl, bodyEl);\n\n root.addChild(htmlEl);\n\n // 構築時 pure validation: runtime 担持を 1 回だけ検査(読み取り専用 walk)。\n const usedMethods = root.collectUsedMethods();\n const jsContent = root.collectJsContent();\n if (usedMethods.size > 0 || jsContent.length > 0) {\n const hints: string[] = [];\n if (usedMethods.size > 0) {\n hints.push(`jQuery methods=[${Array.from(usedMethods).join(',')}]`);\n }\n if (jsContent.length > 0) {\n hints.push('inline js content');\n }\n throw new Error(\n `page surface does not allow runtime content: ${hints.join('; ')}`,\n );\n }\n\n return new PageDocument(root);\n}\n","/**\n * layout-factories.ts\n *\n * SwiftUI ライクなレイアウトコンテナファクトリ関数。\n * hstack / vstack / zstack / spacer / divider を提供する。\n *\n * Requirements: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.1, 2.2, 2.3, 2.4, 3.1, 3.2, 3.3, 3.4,\n * 4.1, 4.2, 4.3, 4.4, 5.1, 5.2, 5.3, 5.4\n */\nimport { PairType } from '../elements/pair-type.js';\nimport { TextType } from '../elements/text-type.js';\nimport type { StackOptions, ZStackOptions, SpacerOptions, LayoutChild } from './layout-types.js';\nimport { ZStackAlignment } from '../../css/constants/alignment.js';\n\n// ---------------------------------------------------------------------------\n// 内部ヘルパー\n// ---------------------------------------------------------------------------\n\n/**\n * `LayoutChild` が `StackOptions` かどうかを判定するランタイム型ガード。\n *\n * `StackOptions` はプレーンオブジェクトで、`PairType`(HtmlTag サブクラス)\n * でも string でもないものを StackOptions とみなす。\n *\n * @internal\n */\nfunction isStackOptions(\n value: StackOptions | LayoutChild | undefined,\n): value is StackOptions {\n if (value === undefined) return false;\n if (typeof value === 'string') return false;\n // LayoutChild の HtmlTag サブクラスかどうかは constructor.name や instanceof で判定する。\n // PairType は HtmlTag → Object の継承チェーンを持つため、\n // 'tagType' プロパティの有無でタグ要素と判別する。\n if (typeof value === 'object' && 'tagType' in value) return false;\n return true;\n}\n\n/**\n * 子要素リストを PairType に追加するユーティリティ。\n *\n * - string → TextType (escape: true) に変換して追加\n * - HtmlTag → そのまま追加\n *\n * @internal\n */\nfunction addChildren(tag: PairType, children: LayoutChild[]): void {\n for (const child of children) {\n if (typeof child === 'string') {\n tag.addChild(new TextType(child, { escape: true }));\n } else {\n tag.addChild(child);\n }\n }\n}\n\n/**\n * flex スタックコンテナの基礎 PairType を作成し、\n * オプションに基づいて flex CSS プロパティを設定する。\n *\n * @param direction - 'row' (hstack) または 'column' (vstack)\n * @param options - StackOptions\n * @returns 設定済み PairType\n *\n * @internal\n */\nfunction makeStack(direction: 'row' | 'column', options: StackOptions): PairType {\n const tag = new PairType('div');\n\n // display: flex + flex-direction\n tag.style.flex.setFlex({ direction });\n\n // spacing → gap\n if (options.spacing !== undefined) {\n tag.style.flex.setGap(`${options.spacing}px`);\n }\n\n // alignment → align-items\n if (options.alignment !== undefined) {\n tag.style.flex.setAlignItems(options.alignment);\n }\n\n // wrap → flex-wrap: wrap\n if (options.wrap === true) {\n tag.style.flex.setFlexWrap('wrap');\n }\n\n return tag;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * 水平スタックコンテナ(display: flex; flex-direction: row)を生成するファクトリ。\n *\n * **呼び出しパターン:**\n * ```typescript\n * hstack() // 空コンテナ\n * hstack(child1, child2) // 子要素のみ\n * hstack({ spacing: 12 }) // オプションのみ\n * hstack({ spacing: 8, alignment: 'center' }, child1, child2) // オプション + 子要素\n * ```\n *\n * **生成 CSS:**\n * - `display: flex; flex-direction: row`\n * - `spacing` → `gap: {n}px`\n * - `alignment` → `align-items: {value}`\n * - `wrap: true` → `flex-wrap: wrap`\n *\n * Requirements: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6\n *\n * @param optionsOrChild - StackOptions または最初の子要素(省略可)\n * @param children - 追加の子要素\n * @returns display:flex; flex-direction:row が設定された PairType\n */\nexport function hstack(\n optionsOrChild?: StackOptions | LayoutChild,\n ...children: LayoutChild[]\n): PairType {\n if (isStackOptions(optionsOrChild)) {\n const tag = makeStack('row', optionsOrChild);\n addChildren(tag, children);\n return tag;\n }\n\n // optionsOrChild は LayoutChild または undefined\n const tag = makeStack('row', {});\n if (optionsOrChild !== undefined) {\n addChildren(tag, [optionsOrChild, ...children]);\n } else {\n addChildren(tag, children);\n }\n return tag;\n}\n\n/**\n * 垂直スタックコンテナ(display: flex; flex-direction: column)を生成するファクトリ。\n *\n * **呼び出しパターン:**\n * ```typescript\n * vstack() // 空コンテナ\n * vstack(child1, child2) // 子要素のみ\n * vstack({ spacing: 14 }) // オプションのみ\n * vstack({ spacing: 8, alignment: 'center' }, child1, child2) // オプション + 子要素\n * ```\n *\n * **生成 CSS:**\n * - `display: flex; flex-direction: column`\n * - `spacing` → `gap: {n}px`\n * - `alignment` → `align-items: {value}`\n * - `wrap: true` → `flex-wrap: wrap`\n *\n * Requirements: 2.1, 2.2, 2.3, 2.4\n *\n * @param optionsOrChild - StackOptions または最初の子要素(省略可)\n * @param children - 追加の子要素\n * @returns display:flex; flex-direction:column が設定された PairType\n */\nexport function vstack(\n optionsOrChild?: StackOptions | LayoutChild,\n ...children: LayoutChild[]\n): PairType {\n if (isStackOptions(optionsOrChild)) {\n const tag = makeStack('column', optionsOrChild);\n addChildren(tag, children);\n return tag;\n }\n\n // optionsOrChild は LayoutChild または undefined\n const tag = makeStack('column', {});\n if (optionsOrChild !== undefined) {\n addChildren(tag, [optionsOrChild, ...children]);\n } else {\n addChildren(tag, children);\n }\n return tag;\n}\n\n// ---------------------------------------------------------------------------\n// ZStack 内部ヘルパー\n// ---------------------------------------------------------------------------\n\n/**\n * `ZStackOptions | LayoutChild | undefined` が `ZStackOptions` かどうかを判定するランタイム型ガード。\n *\n * @internal\n */\nfunction isZStackOptions(\n value: ZStackOptions | LayoutChild | undefined,\n): value is ZStackOptions {\n if (value === undefined) return false;\n if (typeof value === 'string') return false;\n // HtmlTag サブクラスは 'tagType' プロパティを持つ\n if (typeof value === 'object' && 'tagType' in value) return false;\n return true;\n}\n\n/**\n * ZStack グリッドコンテナの PairType を作成し、\n * CSS Grid overlap 方式のプロパティを設定する。\n *\n * CSS: `display:grid; grid-template-areas:\"stack\"; grid-template-rows:1fr; grid-template-columns:1fr`\n * デフォルト alignment: ZStackAlignment.center(align-items:center; justify-content:center)\n *\n * @param options - ZStackOptions\n * @returns 設定済み PairType\n *\n * @internal\n */\nfunction makeZStack(options: ZStackOptions): PairType {\n const tag = new PairType('div');\n\n // display:grid + grid-template-areas + rows/columns(CSS Grid overlap 方式)\n tag.style.grid.setGrid({ areas: '\"stack\"', rows: '1fr', columns: '1fr' });\n\n // alignment → align-items / justify-content\n // ZStackOptions.alignment が未指定の場合はデフォルト 'center' を使用する\n const alignKey = options.alignment ?? 'center';\n const { alignItems, justifyContent } = ZStackAlignment[alignKey];\n tag.style.flex.setAlignItems(alignItems);\n tag.style.flex.setJustifyContent(justifyContent);\n\n return tag;\n}\n\n// ---------------------------------------------------------------------------\n// Public API: zstack\n// ---------------------------------------------------------------------------\n\n/**\n * 重ね合わせスタックコンテナ(CSS Grid overlap 方式)を生成するファクトリ。\n *\n * **呼び出しパターン:**\n * ```typescript\n * zstack() // 空コンテナ(デフォルト: center/center)\n * zstack(child1, child2) // 子要素のみ\n * zstack({ alignment: 'topLeading' }) // オプションのみ\n * zstack({ alignment: 'center' }, child1) // オプション + 子要素\n * ```\n *\n * **生成 CSS:**\n * - `display: grid`\n * - `grid-template-areas: \"stack\"`\n * - `grid-template-rows: 1fr`\n * - `grid-template-columns: 1fr`\n * - `align-items: center`(デフォルト)\n * - `justify-content: center`(デフォルト)\n *\n * **注意:** 子要素への `grid-area: stack` の自動適用は行わない。\n *\n * Requirements: 3.1, 3.2, 3.3, 3.4\n *\n * @param optionsOrChild - ZStackOptions または最初の子要素(省略可)\n * @param children - 追加の子要素\n * @returns CSS Grid overlap が設定された PairType\n */\nexport function zstack(\n optionsOrChild?: ZStackOptions | LayoutChild,\n ...children: LayoutChild[]\n): PairType {\n if (isZStackOptions(optionsOrChild)) {\n const tag = makeZStack(optionsOrChild);\n addChildren(tag, children);\n return tag;\n }\n\n // optionsOrChild は LayoutChild または undefined\n const tag = makeZStack({});\n if (optionsOrChild !== undefined) {\n addChildren(tag, [optionsOrChild, ...children]);\n }\n return tag;\n}\n\n// ---------------------------------------------------------------------------\n// Public API: spacer\n// ---------------------------------------------------------------------------\n\n/**\n * フレキシブルスペーサー(flex:1 1 auto)を生成するファクトリ。\n *\n * **呼び出しパターン:**\n * ```typescript\n * spacer() // flex:1 1 auto のみ\n * spacer({ minLength: 8 }) // flex:1 1 auto; min-width:8px\n * ```\n *\n * **生成 CSS:**\n * - `flex: 1 1 auto`\n * - `minLength` → `min-width: {n}px`\n *\n * Requirements: 4.1, 4.2, 4.3, 4.4\n *\n * @param options - SpacerOptions(省略可)\n * @returns flex:1 1 auto が設定された PairType\n */\nexport function spacer(options?: SpacerOptions): PairType {\n const tag = new PairType('div');\n\n // flex: 1 1 auto(スペーサーの基本動作)\n tag.style.flex.setFlexValue('1 1 auto');\n\n // minLength → min-width:{n}px\n if (options?.minLength !== undefined) {\n tag.minWidth(`${options.minLength}px`);\n }\n\n return tag;\n}\n\n// ---------------------------------------------------------------------------\n// Public API: divider\n// ---------------------------------------------------------------------------\n\n/**\n * 区切り線(水平または垂直)を生成するファクトリ。\n *\n * **呼び出しパターン:**\n * ```typescript\n * divider() // 水平区切り線(デフォルト)\n * divider('horizontal') // 水平区切り線\n * divider('vertical') // 垂直区切り線\n * ```\n *\n * **生成 CSS:**\n * - 水平: `height:1px; background:currentColor; opacity:0.15; width:100%`\n * - 垂直: `width:1px; background:currentColor; opacity:0.15; align-self:stretch`\n *\n * Requirements: 5.1, 5.2, 5.3, 5.4\n *\n * @param direction - 'horizontal'(デフォルト)または 'vertical'\n * @returns 区切り線 CSS が設定された PairType\n */\nexport function divider(direction: 'horizontal' | 'vertical' = 'horizontal'): PairType {\n const tag = new PairType('div');\n\n // 共通スタイル\n tag.background('currentColor');\n tag.opacity('0.15');\n\n if (direction === 'vertical') {\n // 垂直区切り線\n tag.width('1px');\n tag.style.flex.setAlignSelf('stretch');\n } else {\n // 水平区切り線(デフォルト)\n tag.height('1px');\n tag.width('100%');\n }\n\n return tag;\n}\n","import { a, button, h1, h2, h3, h4, h5, h6, img, p, section } from '../html/tags/index.js';\nimport { hstack, spacer, vstack } from '../html/layout/layout-factories.js';\nimport type { ButtonOptions, HeadingLevel, LinkOptions, View } from './types.js';\nimport type { StackOptions, SpacerOptions } from '../html/layout/layout-types.js';\nimport type { PairType } from '../html/elements/pair-type.js';\nimport type { SelfClosingType } from '../html/elements/self-closing-type.js';\nimport type { LayoutChild } from '../html/layout/layout-types.js';\n\nexport function VStack(options?: StackOptions, ...children: View[]): PairType {\n if (options !== undefined) {\n return vstack(options, ...(children as LayoutChild[]));\n }\n const [first, ...rest] = children as LayoutChild[];\n return first !== undefined ? vstack(first, ...rest) : vstack();\n}\n\nexport function HStack(options?: StackOptions, ...children: View[]): PairType {\n if (options !== undefined) {\n return hstack(options, ...(children as LayoutChild[]));\n }\n const [first, ...rest] = children as LayoutChild[];\n return first !== undefined ? hstack(first, ...rest) : hstack();\n}\n\nexport function Text(content: string): PairType {\n return p(content);\n}\n\nexport function Image(src: string, alt: string): SelfClosingType {\n return img({ src, alt });\n}\n\nexport function Section(...children: View[]): PairType {\n return section(...children);\n}\n\nexport function Spacer(options?: SpacerOptions): PairType {\n return spacer(options);\n}\n\nexport function Heading(level: HeadingLevel, content: string): PairType {\n switch (level) {\n case 1: return h1(content);\n case 2: return h2(content);\n case 3: return h3(content);\n case 4: return h4(content);\n case 5: return h5(content);\n case 6: return h6(content);\n default: throw new Error(`invalid heading level: ${level}`);\n }\n}\n\nexport function Link(options: LinkOptions, ...children: View[]): PairType {\n const attrs: Record<string, string> = { href: options.href };\n if (options.target !== undefined) {\n attrs.target = options.target;\n }\n if (options.rel !== undefined) {\n attrs.rel = options.rel;\n } else if (options.target === '_blank') {\n attrs.rel = 'noopener noreferrer';\n }\n return a(attrs, ...children);\n}\n\nexport function Button(options: ButtonOptions | undefined, ...children: View[]): PairType {\n const type = options?.type ?? 'button';\n return button({ type }, ...children);\n}\n","import type { RenderContext } from '../html/elements/render-context.js';\nimport type { StaticView } from './types.js';\n\n/**\n * AppSlot — マウントポイントを表す StaticView プリミティブ。\n *\n * `data-draftole-mount` 属性を持つ `<div>` を生成し、\n * ランタイム系の App コンポーネントをマウントする際の\n * プレースホルダとして機能する。\n *\n * - `protoRender()` は `<div data-draftole-mount=\"${id}\"></div>` を返す。\n * - `collectCssStyleString()` は空文字列を返す(CSS なし)。\n * - runtime メソッド(jqm / state / script 等)は持たない。\n * - `app/` モジュールへの依存を持たない。\n */\nexport interface AppSlotOptions {\n readonly id: string;\n}\n\nexport function AppSlot(options: AppSlotOptions): StaticView;\nexport function AppSlot(id: string): StaticView;\nexport function AppSlot(optionsOrId: AppSlotOptions | string): StaticView {\n const id = typeof optionsOrId === 'string' ? optionsOrId : optionsOrId.id;\n\n if (id === '') {\n throw new Error('AppSlot id must be a non-empty string');\n }\n\n return {\n protoRender(_ctx?: RenderContext): string {\n return `<div data-draftole-mount=\"${id}\"></div>`;\n },\n collectCssStyleString(): string {\n return '';\n },\n };\n}\n"],"mappings":"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","names":["Text","code","s","i","body","code","body","s","body","rewriteCommandTarget","i","html","i","option","a","b","a","b","body","s","a","b","makeJsExpr","code","base","code","makeJsExpr","code","code","makeJsExpr","body","q","code","a","s","p","bodyQueue","childScope","label","a","i","asInternals","asInternals","asInternals","b","i","a","code","a","body","code","body","a","code","code","bodyQueue","childScope","_NO_SCOPE_SENTINEL","body","code","code","code","s","html","p","import_node_fs","import_node_path","tag","Text"]}
|