easy-forms-core 1.3.2 → 1.3.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/marked/src/defaults.ts","../node_modules/marked/src/rules.ts","../node_modules/marked/src/helpers.ts","../node_modules/marked/src/Tokenizer.ts","../node_modules/marked/src/Lexer.ts","../node_modules/marked/src/Renderer.ts","../node_modules/marked/src/TextRenderer.ts","../node_modules/marked/src/Parser.ts","../node_modules/marked/src/Hooks.ts","../node_modules/marked/src/Instance.ts","../node_modules/marked/src/marked.ts","../src/core/schema-parser.ts","../src/utils/themes/base.ts","../src/utils/themes/plano.ts","../src/utils/themes/tradicional.ts","../src/utils/themes/material.ts","../src/utils/themes/rounded-shadow.ts","../src/utils/themes/lines.ts","../src/utils/themes/shadcn.ts","../src/utils/themes/chakra.ts","../src/utils/themes/mantine.ts","../src/utils/themes/glass.ts","../src/utils/themes/bordered.ts","../src/utils/themes/minimal.ts","../src/utils/themes/efc.ts","../src/utils/themes/index.ts","../src/utils/masks.ts","../src/utils/injection-validation.ts","../src/utils/attempts-lock.ts","../src/utils/index.ts","../src/core/condition-engine.ts","../src/core/validation-engine.ts","../src/core/state-manager.ts","../src/components/inputs/base-input.ts","../src/utils/mask-helpers.ts","../src/core/mask-engine.ts","../src/components/inputs/text-input.ts","../src/components/inputs/number-input.ts","../src/components/inputs/textarea-input.ts","../src/components/inputs/select-input.ts","../src/components/inputs/checkbox-input.ts","../src/components/inputs/radio-input.ts","../src/components/inputs/switch-input.ts","../src/components/inputs/date-input.ts","../src/components/inputs/file-input.ts","../src/components/inputs/quantity-input.ts","../src/components/inputs/accordion-select-input.ts","../src/components/inputs/image-grid-select-input.ts","../src/components/inputs/otp-input.ts","../src/components/inputs/password-input.ts","../src/components/inputs/file-drop-input.ts","../src/components/inputs/map-input.ts","../src/components/inputs/rating-input.ts","../src/components/inputs/slider-input.ts","../src/components/inputs/color-input.ts","../src/components/inputs/markdown-input.ts","../src/components/inputs/index.ts","../src/templates/index.ts","../src/components/easy-form.ts"],"sourcesContent":["import type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Gets the original marked default options.\n */\nexport function _getDefaults<ParserOutput = string, RendererOutput = string>(): MarkedOptions<ParserOutput, RendererOutput> {\n return {\n async: false,\n breaks: false,\n extensions: null,\n gfm: true,\n hooks: null,\n pedantic: false,\n renderer: null,\n silent: false,\n tokenizer: null,\n walkTokens: null,\n };\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport let _defaults: MarkedOptions<any, any> = _getDefaults();\n\nexport function changeDefaults<ParserOutput = string, RendererOutput = string>(newDefaults: MarkedOptions<ParserOutput, RendererOutput>) {\n _defaults = newDefaults;\n}\n","const noopTest = { exec: () => null } as unknown as RegExp;\n\nfunction edit(regex: string | RegExp, opt = '') {\n let source = typeof regex === 'string' ? regex : regex.source;\n const obj = {\n replace: (name: string | RegExp, val: string | RegExp) => {\n let valSource = typeof val === 'string' ? val : val.source;\n valSource = valSource.replace(other.caret, '$1');\n source = source.replace(name, valSource);\n return obj;\n },\n getRegex: () => {\n return new RegExp(source, opt);\n },\n };\n return obj;\n}\n\nconst supportsLookbehind = (() => {\ntry {\n // eslint-disable-next-line prefer-regex-literals\n return !!new RegExp('(?<=1)(?<!1)');\n} catch {\n // See browser support here:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Lookbehind_assertion\n return false;\n}\n})();\n\nexport const other = {\n codeRemoveIndent: /^(?: {1,4}| {0,3}\\t)/gm,\n outputLinkReplace: /\\\\([\\[\\]])/g,\n indentCodeCompensation: /^(\\s+)(?:```)/,\n beginningSpace: /^\\s+/,\n endingHash: /#$/,\n startingSpaceChar: /^ /,\n endingSpaceChar: / $/,\n nonSpaceChar: /[^ ]/,\n newLineCharGlobal: /\\n/g,\n tabCharGlobal: /\\t/g,\n multipleSpaceGlobal: /\\s+/g,\n blankLine: /^[ \\t]*$/,\n doubleBlankLine: /\\n[ \\t]*\\n[ \\t]*$/,\n blockquoteStart: /^ {0,3}>/,\n blockquoteSetextReplace: /\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,\n blockquoteSetextReplace2: /^ {0,3}>[ \\t]?/gm,\n listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,\n listIsTask: /^\\[[ xX]\\] +\\S/,\n listReplaceTask: /^\\[[ xX]\\] +/,\n listTaskCheckbox: /\\[[ xX]\\]/,\n anyLine: /\\n.*\\n/,\n hrefBrackets: /^<(.*)>$/,\n tableDelimiter: /[:|]/,\n tableAlignChars: /^\\||\\| *$/g,\n tableRowBlankLine: /\\n[ \\t]*$/,\n tableAlignRight: /^ *-+: *$/,\n tableAlignCenter: /^ *:-+: *$/,\n tableAlignLeft: /^ *:-+ *$/,\n startATag: /^<a /i,\n endATag: /^<\\/a>/i,\n startPreScriptTag: /^<(pre|code|kbd|script)(\\s|>)/i,\n endPreScriptTag: /^<\\/(pre|code|kbd|script)(\\s|>)/i,\n startAngleBracket: /^</,\n endAngleBracket: />$/,\n pedanticHrefTitle: /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,\n unicodeAlphaNumeric: /[\\p{L}\\p{N}]/u,\n escapeTest: /[&<>\"']/,\n escapeReplace: /[&<>\"']/g,\n escapeTestNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,\n escapeReplaceNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n unescapeTest: /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig,\n caret: /(^|[^\\[])\\^/g,\n percentDecode: /%25/g,\n findPipe: /\\|/g,\n splitPipe: / \\|/,\n slashPipe: /\\\\\\|/g,\n carriageReturn: /\\r\\n|\\r/g,\n spaceLine: /^ +$/gm,\n notSpaceStart: /^\\S*/,\n endingNewline: /\\n$/,\n listItemRegex: (bull: string) => new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`),\n nextBulletRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`),\n hrRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),\n fencesBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`),\n headingBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`),\n htmlBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, 'i'),\n blockquoteBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}>`),\n};\n\n/**\n * Block-Level Grammar\n */\n\nconst newline = /^(?:[ \\t]*(?:\\n|$))+/;\nconst blockCode = /^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = / {0,3}(?:[*+-]|\\d{1,9}[.)])/;\nconst lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/;\nconst lheading = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/\\|table/g, '') // table not in commonmark\n .getRegex();\nconst lheadingGfm = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/table/g, / {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/) // table can interrupt\n .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/)\n .replace('label', _blockLabel)\n .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n .getRegex();\n\nconst list = edit(/^(bull)([ \\t][^\\n]+?)?(?:\\n|$)/)\n .replace(/bull/g, bullet)\n .getRegex();\n\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit(\n '^ {0,3}(?:' // optional indentation\n+ '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n+ '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n+ '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n+ '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n+ '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n+ '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (6)\n+ '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) open tag\n+ '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) closing tag\n+ ')', 'i')\n .replace('comment', _comment)\n .replace('tag', _tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nconst paragraph = edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n .replace('paragraph', paragraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nconst blockNormal = {\n blockquote,\n code: blockCode,\n def,\n fences,\n heading,\n hr,\n html,\n lheading,\n list,\n newline,\n paragraph,\n table: noopTest,\n text: blockText,\n};\n\ntype BlockKeys = keyof typeof blockNormal;\n\n/**\n * GFM Block Grammar\n */\n\nconst gfmTable = edit(\n '^ *([^\\\\n ].*)\\\\n' // Header\n+ ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n+ '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('blockquote', ' {0,3}>')\n .replace('code', '(?: {4}| {0,3}\\t)[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // tables can be interrupted by type (6) html blocks\n .getRegex();\n\nconst blockGfm: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n lheading: lheadingGfm,\n table: gfmTable,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('table', gfmTable) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex(),\n};\n\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nconst blockPedantic: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n html: edit(\n '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', _comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', lheading)\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .replace('|tag', '')\n .getRegex(),\n};\n\n/**\n * Inline-Level Grammar\n */\n\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = /[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpace = /[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpace = /[^\\s\\p{P}\\p{S}]/u;\nconst punctuation = edit(/^((?![*_])punctSpace)/, 'u')\n .replace(/punctSpace/g, _punctuationOrSpace).getRegex();\n\n// GFM allows ~ inside strong and em for strikethrough\nconst _punctuationGfmStrongEm = /(?!~)[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmStrongEm = /(?!~)[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmStrongEm = /(?:[^\\s\\p{P}\\p{S}]|~)/u;\n\n// GFM allows * and _ inside strikethrough\nconst _punctuationGfmDel = /(?![*_])[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmDel = /(?![*_])[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmDel = /(?:[^\\s\\p{P}\\p{S}]|[*_])/u;\n\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = edit(/link|precode-code|html/, 'g')\n .replace('link', /\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/)\n .replace('precode-', supportsLookbehind ? '(?<!`)()' : '(^^|[^`])')\n .replace('code', /(?<b>`+)[^`]+\\k<b>(?!`)/)\n .replace('html', /<(?! )[^<>]*?>/)\n .getRegex();\n\nconst emStrongLDelimCore = /^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/;\n\nconst emStrongLDelim = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongLDelimGfm = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\nconst emStrongRDelimAstCore =\n '^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n+ '|[^*]+(?=[^*])' // Consume to delim\n+ '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n+ '|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)' // (3) #***a, ***a can only be Left Delimiter\n+ '|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)' // (4) ***# can only be Left Delimiter\n+ '|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)' // (5) #***# can be either Left or Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?=notPunctSpace)'; // (6) a***a can be either Left or Right Delimiter\n\nconst emStrongRDelimAst = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm)\n .replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm)\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\n// (6) Not allowed for _\nconst emStrongRDelimUnd = edit(\n '^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n+ '|[^_]+(?=[^_])' // Consume to delim\n+ '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n+ '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n+ '|(?!_)punctSpace(_+)(?=notPunctSpace)' // (3) #___a, ___a can only be Left Delimiter\n+ '|[\\\\s](_+)(?!_)(?=punct)' // (4) ___# can only be Left Delimiter\n+ '|(?!_)punct(_+)(?!_)(?=punct)', 'gu') // (5) #___# can be either Left or Right Delimiter\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Tilde left delimiter for strikethrough (similar to emStrongLDelim for asterisk)\nconst delLDelim = edit(/^~~?(?:((?!~)punct)|[^\\s~])/, 'u')\n .replace(/punct/g, _punctuationGfmDel)\n .getRegex();\n\n// Tilde delimiter patterns for strikethrough (similar to asterisk)\nconst delRDelimCore =\n '^[^~]+(?=[^~])' // Consume to delim\n+ '|(?!~)punct(~~?)(?=[\\\\s]|$)' // (1) #~~ can only be a Right Delimiter\n+ '|notPunctSpace(~~?)(?!~)(?=punctSpace|$)' // (2) a~~#, a~~ can only be a Right Delimiter\n+ '|(?!~)punctSpace(~~?)(?=notPunctSpace)' // (3) #~~a, ~~a can only be Left Delimiter\n+ '|[\\\\s](~~?)(?!~)(?=punct)' // (4) ~~# can only be Left Delimiter\n+ '|(?!~)punct(~~?)(?!~)(?=punct)' // (5) #~~# can be either Left or Right Delimiter\n+ '|notPunctSpace(~~?)(?=notPunctSpace)'; // (6) a~~a can be either Left or Right Delimiter\n\nconst delRDelim = edit(delRDelimCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmDel)\n .replace(/punctSpace/g, _punctuationOrSpaceGfmDel)\n .replace(/punct/g, _punctuationGfmDel)\n .getRegex();\n\nconst anyPunctuation = edit(/\\\\(punct)/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n .getRegex();\n\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit(\n '^comment'\n + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n .replace('comment', _inlineComment)\n .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nconst _inlineLabel = /(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+[^`]*?`+(?!`)|[^\\[\\]\\\\`])*?/;\n\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]*(?:\\n[ \\t]*)?)(title))?\\s*\\)/)\n .replace('label', _inlineLabel)\n .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/)\n .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n .getRegex();\n\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _inlineLabel)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n .replace('reflink', reflink)\n .replace('nolink', nolink)\n .getRegex();\n\nconst _caseInsensitiveProtocol = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/;\n\n/**\n * Normal Inline Grammar\n */\n\nconst inlineNormal = {\n _backpedal: noopTest, // only used for GFM url\n anyPunctuation,\n autolink,\n blockSkip,\n br,\n code: inlineCode,\n del: noopTest,\n delLDelim: noopTest,\n delRDelim: noopTest,\n emStrongLDelim,\n emStrongRDelimAst,\n emStrongRDelimUnd,\n escape,\n link,\n nolink,\n punctuation,\n reflink,\n reflinkSearch,\n tag,\n text: inlineText,\n url: noopTest,\n};\n\ntype InlineKeys = keyof typeof inlineNormal;\n\n/**\n * Pedantic Inline Grammar\n */\n\nconst inlinePedantic: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', _inlineLabel)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', _inlineLabel)\n .getRegex(),\n};\n\n/**\n * GFM Inline Grammar\n */\n\nconst inlineGfm: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n emStrongRDelimAst: emStrongRDelimAstGfm,\n emStrongLDelim: emStrongLDelimGfm,\n delLDelim,\n delRDelim,\n url: edit(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/)\n .replace('protocol', _caseInsensitiveProtocol)\n .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)\n .getRegex(),\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,\n text: edit(/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/)\n .replace('protocol', _caseInsensitiveProtocol)\n .getRegex(),\n};\n\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\nconst inlineBreaks: Record<InlineKeys, RegExp> = {\n ...inlineGfm,\n br: edit(br).replace('{2,}', '*').getRegex(),\n text: edit(inlineGfm.text)\n .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n .replace(/\\{2,\\}/g, '*')\n .getRegex(),\n};\n\n/**\n * exports\n */\n\nexport const block = {\n normal: blockNormal,\n gfm: blockGfm,\n pedantic: blockPedantic,\n};\n\nexport const inline = {\n normal: inlineNormal,\n gfm: inlineGfm,\n breaks: inlineBreaks,\n pedantic: inlinePedantic,\n};\n\nexport interface Rules {\n other: typeof other\n block: Record<BlockKeys, RegExp>\n inline: Record<InlineKeys, RegExp>\n}\n","import { other } from './rules.ts';\n\n/**\n * Helpers\n */\nconst escapeReplacements: { [index: string]: string } = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\nconst getEscapeReplacement = (ch: string) => escapeReplacements[ch];\n\nexport function escape(html: string, encode?: boolean) {\n if (encode) {\n if (other.escapeTest.test(html)) {\n return html.replace(other.escapeReplace, getEscapeReplacement);\n }\n } else {\n if (other.escapeTestNoEncode.test(html)) {\n return html.replace(other.escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n}\n\nexport function unescape(html: string) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(other.unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon') return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\n\nexport function cleanUrl(href: string) {\n try {\n href = encodeURI(href).replace(other.percentDecode, '%');\n } catch {\n return null;\n }\n return href;\n}\n\nexport function splitCells(tableRow: string, count?: number) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(other.findPipe, (match, offset, str) => {\n let escaped = false;\n let curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(other.splitPipe);\n let i = 0;\n\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) {\n cells.shift();\n }\n if (cells.length > 0 && !cells.at(-1)?.trim()) {\n cells.pop();\n }\n\n if (count) {\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\n }\n\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(other.slashPipe, '|');\n }\n return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nexport function rtrim(str: string, c: string, invert?: boolean) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.slice(0, l - suffLen);\n}\n\nexport function findClosingBracket(str: string, b: string) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n\n let level = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n if (level > 0) {\n return -2;\n }\n\n return -1;\n}\n\nexport function expandTabs(line: string, indent = 0) {\n let col = indent;\n let expanded = '';\n for (const char of line) {\n if (char === '\\t') {\n const added = 4 - (col % 4);\n expanded += ' '.repeat(added);\n col += added;\n } else {\n expanded += char;\n col++;\n }\n }\n\n return expanded;\n}\n","import { _defaults } from './defaults.ts';\nimport {\n rtrim,\n splitCells,\n findClosingBracket,\n expandTabs,\n} from './helpers.ts';\nimport type { Rules } from './rules.ts';\nimport type { _Lexer } from './Lexer.ts';\nimport type { Links, Tokens, Token } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\nfunction outputLink(cap: string[], link: Pick<Tokens.Link, 'href' | 'title'>, raw: string, lexer: _Lexer, rules: Rules): Tokens.Link | Tokens.Image {\n const href = link.href;\n const title = link.title || null;\n const text = cap[1].replace(rules.other.outputLinkReplace, '$1');\n\n lexer.state.inLink = true;\n const token: Tokens.Link | Tokens.Image = {\n type: cap[0].charAt(0) === '!' ? 'image' : 'link',\n raw,\n href,\n title,\n text,\n tokens: lexer.inlineTokens(text),\n };\n lexer.state.inLink = false;\n return token;\n}\n\nfunction indentCodeCompensation(raw: string, text: string, rules: Rules) {\n const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);\n\n if (matchIndentToCode === null) {\n return text;\n }\n\n const indentToCode = matchIndentToCode[1];\n\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(rules.other.beginningSpace);\n if (matchIndentInNode === null) {\n return node;\n }\n\n const [indentInNode] = matchIndentInNode;\n\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n\n return node;\n })\n .join('\\n');\n}\n\n/**\n * Tokenizer\n */\nexport class _Tokenizer<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n rules!: Rules; // set by the lexer\n lexer!: _Lexer<ParserOutput, RendererOutput>; // set by the lexer\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n space(src: string): Tokens.Space | undefined {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0],\n };\n }\n }\n\n code(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const text = cap[0].replace(this.rules.other.codeRemoveIndent, '');\n return {\n type: 'code',\n raw: cap[0],\n codeBlockStyle: 'indented',\n text: !this.options.pedantic\n ? rtrim(text, '\\n')\n : text,\n };\n }\n }\n\n fences(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '', this.rules);\n\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n text,\n };\n }\n }\n\n heading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n\n // remove trailing #s\n if (this.rules.other.endingHash.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n } else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[1].length,\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n hr(src: string): Tokens.Hr | undefined {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: rtrim(cap[0], '\\n'),\n };\n }\n }\n\n blockquote(src: string): Tokens.Blockquote | undefined {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n let lines = rtrim(cap[0], '\\n').split('\\n');\n let raw = '';\n let text = '';\n const tokens: Token[] = [];\n\n while (lines.length > 0) {\n let inBlockquote = false;\n const currentLines = [];\n\n let i;\n for (i = 0; i < lines.length; i++) {\n // get lines up to a continuation\n if (this.rules.other.blockquoteStart.test(lines[i])) {\n currentLines.push(lines[i]);\n inBlockquote = true;\n } else if (!inBlockquote) {\n currentLines.push(lines[i]);\n } else {\n break;\n }\n }\n lines = lines.slice(i);\n\n const currentRaw = currentLines.join('\\n');\n const currentText = currentRaw\n // precede setext continuation with 4 spaces so it isn't a setext\n .replace(this.rules.other.blockquoteSetextReplace, '\\n $1')\n .replace(this.rules.other.blockquoteSetextReplace2, '');\n raw = raw ? `${raw}\\n${currentRaw}` : currentRaw;\n text = text ? `${text}\\n${currentText}` : currentText;\n\n // parse blockquote lines as top level tokens\n // merge paragraphs if this is a continuation\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n this.lexer.blockTokens(currentText, tokens, true);\n this.lexer.state.top = top;\n\n // if there is no continuation then we are done\n if (lines.length === 0) {\n break;\n }\n\n const lastToken = tokens.at(-1);\n\n if (lastToken?.type === 'code') {\n // blockquote continuation cannot be preceded by a code block\n break;\n } else if (lastToken?.type === 'blockquote') {\n // include continuation in nested blockquote\n const oldToken = lastToken as Tokens.Blockquote;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.blockquote(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n break;\n } else if (lastToken?.type === 'list') {\n // include continuation in nested list\n const oldToken = lastToken as Tokens.List;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.list(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n lines = newText.substring(tokens.at(-1)!.raw.length).split('\\n');\n continue;\n }\n }\n\n return {\n type: 'blockquote',\n raw,\n tokens,\n text,\n };\n }\n }\n\n list(src: string): Tokens.List | undefined {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n\n const list: Tokens.List = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: [],\n };\n\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n\n // Get next list item\n const itemRegex = this.rules.other.listItemRegex(bull);\n let endsWithBlankLine = false;\n // Check if current bullet point can start a new List Item\n while (src) {\n let endEarly = false;\n let raw = '';\n let itemContents = '';\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n\n raw = cap[0];\n src = src.substring(raw.length);\n\n let line = expandTabs(cap[2].split('\\n', 1)[0], cap[1].length);\n let nextLine = src.split('\\n', 1)[0];\n let blankLine = !line.trim();\n\n let indent = 0;\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimStart();\n } else if (blankLine) {\n indent = cap[1].length + 1;\n } else {\n indent = line.search(this.rules.other.nonSpaceChar); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += cap[1].length;\n }\n\n if (blankLine && this.rules.other.blankLine.test(nextLine)) { // Items begin with at most one blank line\n raw += nextLine + '\\n';\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n\n if (!endEarly) {\n const nextBulletRegex = this.rules.other.nextBulletRegex(indent);\n const hrRegex = this.rules.other.hrRegex(indent);\n const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);\n const headingBeginRegex = this.rules.other.headingBeginRegex(indent);\n const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);\n const blockquoteBeginRegex = this.rules.other.blockquoteBeginRegex(indent);\n\n // Check if following lines should be included in List Item\n while (src) {\n const rawLine = src.split('\\n', 1)[0];\n let nextLineWithoutTabs;\n nextLine = rawLine;\n\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(this.rules.other.listReplaceNesting, ' ');\n nextLineWithoutTabs = nextLine;\n } else {\n nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, ' ');\n }\n\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of html block\n if (htmlBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of blockquote\n if (blockquoteBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n\n // Horizontal rule found\n if (hrRegex.test(nextLine)) {\n break;\n }\n\n if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLineWithoutTabs.slice(indent);\n } else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n\n // paragraph continuation unless last line was a different block level element\n if (line.replace(this.rules.other.tabCharGlobal, ' ').search(this.rules.other.nonSpaceChar) >= 4) { // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n\n itemContents += '\\n' + nextLine;\n }\n\n blankLine = !nextLine.trim();\n\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n line = nextLineWithoutTabs.slice(indent);\n }\n }\n\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n } else if (this.rules.other.doubleBlankLine.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n\n list.items.push({\n type: 'list_item',\n raw,\n task: !!this.options.gfm && this.rules.other.listIsTask.test(itemContents),\n loose: false,\n text: itemContents,\n tokens: [],\n });\n\n list.raw += raw;\n }\n\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n const lastItem = list.items.at(-1);\n if (lastItem) {\n lastItem.raw = lastItem.raw.trimEnd();\n lastItem.text = lastItem.text.trimEnd();\n } else {\n // not a list since there were no items\n return;\n }\n list.raw = list.raw.trimEnd();\n\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n for (const item of list.items) {\n this.lexer.state.top = false;\n item.tokens = this.lexer.blockTokens(item.text, []);\n if (item.task) {\n // Remove checkbox markdown from item tokens\n item.text = item.text.replace(this.rules.other.listReplaceTask, '');\n if (item.tokens[0]?.type === 'text' || item.tokens[0]?.type === 'paragraph') {\n item.tokens[0].raw = item.tokens[0].raw.replace(this.rules.other.listReplaceTask, '');\n item.tokens[0].text = item.tokens[0].text.replace(this.rules.other.listReplaceTask, '');\n for (let i = this.lexer.inlineQueue.length - 1; i >= 0; i--) {\n if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[i].src)) {\n this.lexer.inlineQueue[i].src = this.lexer.inlineQueue[i].src.replace(this.rules.other.listReplaceTask, '');\n break;\n }\n }\n }\n\n const taskRaw = this.rules.other.listTaskCheckbox.exec(item.raw);\n if (taskRaw) {\n const checkboxToken: Tokens.Checkbox = {\n type: 'checkbox',\n raw: taskRaw[0] + ' ',\n checked: taskRaw[0] !== '[ ]',\n };\n item.checked = checkboxToken.checked;\n if (list.loose) {\n if (item.tokens[0] && ['paragraph', 'text'].includes(item.tokens[0].type) && 'tokens' in item.tokens[0] && item.tokens[0].tokens) {\n item.tokens[0].raw = checkboxToken.raw + item.tokens[0].raw;\n item.tokens[0].text = checkboxToken.raw + item.tokens[0].text;\n item.tokens[0].tokens.unshift(checkboxToken);\n } else {\n item.tokens.unshift({\n type: 'paragraph',\n raw: checkboxToken.raw,\n text: checkboxToken.raw,\n tokens: [checkboxToken],\n });\n }\n } else {\n item.tokens.unshift(checkboxToken);\n }\n }\n }\n\n if (!list.loose) {\n // Check if list should be loose\n const spacers = item.tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => this.rules.other.anyLine.test(t.raw));\n\n list.loose = hasMultipleLineBreaks;\n }\n }\n\n // Set all items to loose if list is loose\n if (list.loose) {\n for (const item of list.items) {\n item.loose = true;\n for (const token of item.tokens) {\n if (token.type === 'text') {\n token.type = 'paragraph';\n }\n }\n }\n }\n\n return list;\n }\n }\n\n html(src: string): Tokens.HTML | undefined {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const token: Tokens.HTML = {\n type: 'html',\n block: true,\n raw: cap[0],\n pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n text: cap[0],\n };\n return token;\n }\n }\n\n def(src: string): Tokens.Def | undefined {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n const tag = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, ' ');\n const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n return {\n type: 'def',\n tag,\n raw: cap[0],\n href,\n title,\n };\n }\n }\n\n table(src: string): Tokens.Table | undefined {\n const cap = this.rules.block.table.exec(src);\n if (!cap) {\n return;\n }\n\n if (!this.rules.other.tableDelimiter.test(cap[2])) {\n // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n return;\n }\n\n const headers = splitCells(cap[1]);\n const aligns = cap[2].replace(this.rules.other.tableAlignChars, '').split('|');\n const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, '').split('\\n') : [];\n\n const item: Tokens.Table = {\n type: 'table',\n raw: cap[0],\n header: [],\n align: [],\n rows: [],\n };\n\n if (headers.length !== aligns.length) {\n // header and align columns must be equal, rows can be different.\n return;\n }\n\n for (const align of aligns) {\n if (this.rules.other.tableAlignRight.test(align)) {\n item.align.push('right');\n } else if (this.rules.other.tableAlignCenter.test(align)) {\n item.align.push('center');\n } else if (this.rules.other.tableAlignLeft.test(align)) {\n item.align.push('left');\n } else {\n item.align.push(null);\n }\n }\n\n for (let i = 0; i < headers.length; i++) {\n item.header.push({\n text: headers[i],\n tokens: this.lexer.inline(headers[i]),\n header: true,\n align: item.align[i],\n });\n }\n\n for (const row of rows) {\n item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n return {\n text: cell,\n tokens: this.lexer.inline(cell),\n header: false,\n align: item.align[i],\n };\n }));\n }\n\n return item;\n }\n\n lheading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1],\n tokens: this.lexer.inline(cap[1]),\n };\n }\n }\n\n paragraph(src: string): Tokens.Paragraph | undefined {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n text(src: string): Tokens.Text | undefined {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0]),\n };\n }\n }\n\n escape(src: string): Tokens.Escape | undefined {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: cap[1],\n };\n }\n }\n\n tag(src: string): Tokens.Tag | undefined {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {\n this.lexer.state.inLink = true;\n } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n\n return {\n type: 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n block: false,\n text: cap[0],\n };\n }\n }\n\n link(src: string): Tokens.Link | Tokens.Image | undefined {\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n return;\n }\n\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n } else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex === -2) {\n // more open parens than closed\n return;\n }\n\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = this.rules.other.pedanticHrefTitle.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n\n href = href.trim();\n if (this.rules.other.startAngleBracket.test(href)) {\n if (this.options.pedantic && !(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n } else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title,\n }, cap[0], this.lexer, this.rules);\n }\n }\n\n reflink(src: string, links: Links): Tokens.Link | Tokens.Image | Tokens.Text | undefined {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, ' ');\n const link = links[linkString.toLowerCase()];\n if (!link) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text,\n };\n }\n return outputLink(cap, link, cap[0], this.lexer, this.rules);\n }\n }\n\n emStrong(src: string, maskedSrc: string, prevChar = ''): Tokens.Em | Tokens.Strong | undefined {\n let match = this.rules.inline.emStrongLDelim.exec(src);\n if (!match) return;\n\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;\n\n const nextChar = match[1] || match[2] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue; // skip single * in __abc*abc__\n\n rLength = [...rDelim].length;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n } else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n // char length can be >1 for unicode characters;\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = raw.slice(1, -1);\n return {\n type: 'em',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n codespan(src: string): Tokens.Codespan | undefined {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(this.rules.other.newLineCharGlobal, ' ');\n const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);\n const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n return {\n type: 'codespan',\n raw: cap[0],\n text,\n };\n }\n }\n\n br(src: string): Tokens.Br | undefined {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0],\n };\n }\n }\n\n del(src: string, maskedSrc: string, prevChar = ''): Tokens.Del | undefined {\n let match = this.rules.inline.delLDelim.exec(src);\n if (!match) return;\n\n const nextChar = match[1] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength;\n\n const endReg = this.rules.inline.delRDelim;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue;\n\n rLength = [...rDelim].length;\n\n if (rLength !== lLength) continue;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters\n rLength = Math.min(rLength, rLength + delimTotal);\n // char length can be >1 for unicode characters\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create del token - only single ~ or double ~~ supported\n const text = raw.slice(lLength, -lLength);\n return {\n type: 'del',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n autolink(src: string): Tokens.Link | undefined {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[1];\n href = 'mailto:' + text;\n } else {\n text = cap[1];\n href = text;\n }\n\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n url(src: string): Tokens.Link | undefined {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[0];\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n } while (prevCapZero !== cap[0]);\n text = cap[0];\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n } else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n inlineText(src: string): Tokens.Text | undefined {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n const escaped = this.lexer.state.inRawBlock;\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n escaped,\n };\n }\n }\n}\n","import { _Tokenizer } from './Tokenizer.ts';\nimport { _defaults } from './defaults.ts';\nimport { other, block, inline } from './rules.ts';\nimport type { Token, TokensList, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Block Lexer\n */\nexport class _Lexer<ParserOutput = string, RendererOutput = string> {\n tokens: TokensList;\n options: MarkedOptions<ParserOutput, RendererOutput>;\n state: {\n inLink: boolean;\n inRawBlock: boolean;\n top: boolean;\n };\n\n public inlineQueue: { src: string, tokens: Token[] }[];\n\n private tokenizer: _Tokenizer<ParserOutput, RendererOutput>;\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n // TokenList cannot be created in one go\n this.tokens = [] as unknown as TokensList;\n this.tokens.links = Object.create(null);\n this.options = options || _defaults;\n this.options.tokenizer = this.options.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n top: true,\n };\n\n const rules = {\n other,\n block: block.normal,\n inline: inline.normal,\n };\n\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n } else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n } else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline,\n };\n }\n\n /**\n * Static Lex Method\n */\n static lex<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n return lexer.lex(src);\n }\n\n /**\n * Static Lex Inline Method\n */\n static lexInline<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n return lexer.inlineTokens(src);\n }\n\n /**\n * Preprocessing\n */\n lex(src: string) {\n src = src.replace(other.carriageReturn, '\\n');\n\n this.blockTokens(src, this.tokens);\n\n for (let i = 0; i < this.inlineQueue.length; i++) {\n const next = this.inlineQueue[i];\n this.inlineTokens(next.src, next.tokens);\n }\n this.inlineQueue = [];\n\n return this.tokens;\n }\n\n /**\n * Lexing\n */\n blockTokens(src: string, tokens?: Token[], lastParagraphClipped?: boolean): Token[];\n blockTokens(src: string, tokens?: TokensList, lastParagraphClipped?: boolean): TokensList;\n blockTokens(src: string, tokens: Token[] = [], lastParagraphClipped = false) {\n if (this.options.pedantic) {\n src = src.replace(other.tabCharGlobal, ' ').replace(other.spaceLine, '');\n }\n\n while (src) {\n let token: Tokens.Generic | undefined;\n\n if (this.options.extensions?.block?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.raw.length === 1 && lastToken !== undefined) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unnecessary paragraph tags\n lastToken.raw += '\\n';\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n // An indented code block cannot interrupt a paragraph.\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title,\n };\n tokens.push(token);\n }\n continue;\n }\n\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n const lastToken = tokens.at(-1);\n if (lastParagraphClipped && lastToken?.type === 'paragraph') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n lastParagraphClipped = cutSrc.length !== src.length;\n src = src.substring(token.raw.length);\n continue;\n }\n\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n this.state.top = true;\n return tokens;\n }\n\n inline(src: string, tokens: Token[] = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n\n /**\n * Lexing/Compiling\n */\n inlineTokens(src: string, tokens: Token[] = []): Token[] {\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n let match: RegExpExecArray | null = null;\n\n // Mask out reflinks\n if (this.tokens.links) {\n const links = Object.keys(this.tokens.links);\n if (links.length > 0) {\n while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n maskedSrc = maskedSrc.slice(0, match.index)\n + '[' + 'a'.repeat(match[0].length - 2) + ']'\n + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n }\n\n // Mask out escaped characters\n while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n }\n\n // Mask out other blocks\n let offset;\n while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n offset = match[2] ? match[2].length : 0;\n maskedSrc = maskedSrc.slice(0, match.index + offset) + '[' + 'a'.repeat(match[0].length - offset - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n }\n\n // Mask out blocks from extensions\n maskedSrc = this.options.hooks?.emStrongMask?.call({ lexer: this }, maskedSrc) ?? maskedSrc;\n\n let keepPrevChar = false;\n let prevChar = '';\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n\n let token: Tokens.Generic | undefined;\n\n // extensions\n if (this.options.extensions?.inline?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.type === 'text' && lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // del (gfm)\n if (token = this.tokenizer.del(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // autolink\n if (token = this.tokenizer.autolink(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n return tokens;\n }\n}\n","import { _defaults } from './defaults.ts';\nimport {\n cleanUrl,\n escape,\n} from './helpers.ts';\nimport { other } from './rules.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Tokens } from './Tokens.ts';\nimport type { _Parser } from './Parser.ts';\n\n/**\n * Renderer\n */\nexport class _Renderer<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n parser!: _Parser<ParserOutput, RendererOutput>; // set by the parser\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n space(token: Tokens.Space): RendererOutput {\n return '' as RendererOutput;\n }\n\n code({ text, lang, escaped }: Tokens.Code): RendererOutput {\n const langString = (lang || '').match(other.notSpaceStart)?.[0];\n\n const code = text.replace(other.endingNewline, '') + '\\n';\n\n if (!langString) {\n return '<pre><code>'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n' as RendererOutput;\n }\n\n return '<pre><code class=\"language-'\n + escape(langString)\n + '\">'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n' as RendererOutput;\n }\n\n blockquote({ tokens }: Tokens.Blockquote): RendererOutput {\n const body = this.parser.parse(tokens);\n return `<blockquote>\\n${body}</blockquote>\\n` as RendererOutput;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n def(token: Tokens.Def): RendererOutput {\n return '' as RendererOutput;\n }\n\n heading({ tokens, depth }: Tokens.Heading): RendererOutput {\n return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\\n` as RendererOutput;\n }\n\n hr(token: Tokens.Hr): RendererOutput {\n return '<hr>\\n' as RendererOutput;\n }\n\n list(token: Tokens.List): RendererOutput {\n const ordered = token.ordered;\n const start = token.start;\n\n let body = '';\n for (let j = 0; j < token.items.length; j++) {\n const item = token.items[j];\n body += this.listitem(item);\n }\n\n const type = ordered ? 'ol' : 'ul';\n const startAttr = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startAttr + '>\\n' + body + '</' + type + '>\\n' as RendererOutput;\n }\n\n listitem(item: Tokens.ListItem): RendererOutput {\n return `<li>${this.parser.parse(item.tokens)}</li>\\n` as RendererOutput;\n }\n\n checkbox({ checked }: Tokens.Checkbox): RendererOutput {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\"> ' as RendererOutput;\n }\n\n paragraph({ tokens }: Tokens.Paragraph): RendererOutput {\n return `<p>${this.parser.parseInline(tokens)}</p>\\n` as RendererOutput;\n }\n\n table(token: Tokens.Table): RendererOutput {\n let header = '';\n\n // header\n let cell = '';\n for (let j = 0; j < token.header.length; j++) {\n cell += this.tablecell(token.header[j]);\n }\n header += this.tablerow({ text: cell as ParserOutput });\n\n let body = '';\n for (let j = 0; j < token.rows.length; j++) {\n const row = token.rows[j];\n\n cell = '';\n for (let k = 0; k < row.length; k++) {\n cell += this.tablecell(row[k]);\n }\n\n body += this.tablerow({ text: cell as ParserOutput });\n }\n if (body) body = `<tbody>${body}</tbody>`;\n\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n' as RendererOutput;\n }\n\n tablerow({ text }: Tokens.TableRow<ParserOutput>): RendererOutput {\n return `<tr>\\n${text}</tr>\\n` as RendererOutput;\n }\n\n tablecell(token: Tokens.TableCell): RendererOutput {\n const content = this.parser.parseInline(token.tokens);\n const type = token.header ? 'th' : 'td';\n const tag = token.align\n ? `<${type} align=\"${token.align}\">`\n : `<${type}>`;\n return tag + content + `</${type}>\\n` as RendererOutput;\n }\n\n /**\n * span level renderer\n */\n strong({ tokens }: Tokens.Strong): RendererOutput {\n return `<strong>${this.parser.parseInline(tokens)}</strong>` as RendererOutput;\n }\n\n em({ tokens }: Tokens.Em): RendererOutput {\n return `<em>${this.parser.parseInline(tokens)}</em>` as RendererOutput;\n }\n\n codespan({ text }: Tokens.Codespan): RendererOutput {\n return `<code>${escape(text, true)}</code>` as RendererOutput;\n }\n\n br(token: Tokens.Br): RendererOutput {\n return '<br>' as RendererOutput;\n }\n\n del({ tokens }: Tokens.Del): RendererOutput {\n return `<del>${this.parser.parseInline(tokens)}</del>` as RendererOutput;\n }\n\n link({ href, title, tokens }: Tokens.Link): RendererOutput {\n const text = this.parser.parseInline(tokens) as string;\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text as RendererOutput;\n }\n href = cleanHref;\n let out = '<a href=\"' + href + '\"';\n if (title) {\n out += ' title=\"' + (escape(title)) + '\"';\n }\n out += '>' + text + '</a>';\n return out as RendererOutput;\n }\n\n image({ href, title, text, tokens }: Tokens.Image): RendererOutput {\n if (tokens) {\n text = this.parser.parseInline(tokens, this.parser.textRenderer) as string;\n }\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return escape(text) as RendererOutput;\n }\n href = cleanHref;\n\n let out = `<img src=\"${href}\" alt=\"${escape(text)}\"`;\n if (title) {\n out += ` title=\"${escape(title)}\"`;\n }\n out += '>';\n return out as RendererOutput;\n }\n\n text(token: Tokens.Text | Tokens.Escape): RendererOutput {\n return 'tokens' in token && token.tokens\n ? this.parser.parseInline(token.tokens) as unknown as RendererOutput\n : ('escaped' in token && token.escaped ? token.text as RendererOutput : escape(token.text) as RendererOutput);\n }\n}\n","import type { Tokens } from './Tokens.ts';\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nexport class _TextRenderer<RendererOutput = string> {\n // no need for block level renderers\n strong({ text }: Tokens.Strong): RendererOutput {\n return text as RendererOutput;\n }\n\n em({ text }: Tokens.Em): RendererOutput {\n return text as RendererOutput;\n }\n\n codespan({ text }: Tokens.Codespan): RendererOutput {\n return text as RendererOutput;\n }\n\n del({ text }: Tokens.Del): RendererOutput {\n return text as RendererOutput;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n text({ text }: Tokens.Text | Tokens.Escape | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n link({ text }: Tokens.Link): RendererOutput {\n return '' + text as RendererOutput;\n }\n\n image({ text }: Tokens.Image): RendererOutput {\n return '' + text as RendererOutput;\n }\n\n br(): RendererOutput {\n return '' as RendererOutput;\n }\n\n checkbox({ raw }: Tokens.Checkbox): RendererOutput {\n return raw as RendererOutput;\n }\n}\n","import { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _defaults } from './defaults.ts';\nimport type { MarkedToken, Token, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Parsing & Compiling\n */\nexport class _Parser<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n renderer: _Renderer<ParserOutput, RendererOutput>;\n textRenderer: _TextRenderer<RendererOutput>;\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n this.options.renderer = this.options.renderer || new _Renderer<ParserOutput, RendererOutput>();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.renderer.parser = this;\n this.textRenderer = new _TextRenderer<RendererOutput>();\n }\n\n /**\n * Static Parse Method\n */\n static parse<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const parser = new _Parser<ParserOutput, RendererOutput>(options);\n return parser.parse(tokens);\n }\n\n /**\n * Static Parse Inline Method\n */\n static parseInline<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const parser = new _Parser<ParserOutput, RendererOutput>(options);\n return parser.parseInline(tokens);\n }\n\n /**\n * Parse Loop\n */\n parse(tokens: Token[]): ParserOutput {\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const genericToken = anyToken as Tokens.Generic;\n const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'def', 'paragraph', 'text'].includes(genericToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'space': {\n out += this.renderer.space(token);\n break;\n }\n case 'hr': {\n out += this.renderer.hr(token);\n break;\n }\n case 'heading': {\n out += this.renderer.heading(token);\n break;\n }\n case 'code': {\n out += this.renderer.code(token);\n break;\n }\n case 'table': {\n out += this.renderer.table(token);\n break;\n }\n case 'blockquote': {\n out += this.renderer.blockquote(token);\n break;\n }\n case 'list': {\n out += this.renderer.list(token);\n break;\n }\n case 'checkbox': {\n out += this.renderer.checkbox(token);\n break;\n }\n case 'html': {\n out += this.renderer.html(token);\n break;\n }\n case 'def': {\n out += this.renderer.def(token);\n break;\n }\n case 'paragraph': {\n out += this.renderer.paragraph(token);\n break;\n }\n case 'text': {\n out += this.renderer.text(token);\n break;\n }\n\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '' as ParserOutput;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n\n return out as ParserOutput;\n }\n\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens: Token[], renderer: _Renderer<ParserOutput, RendererOutput> | _TextRenderer<RendererOutput> = this.renderer): ParserOutput {\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'escape': {\n out += renderer.text(token);\n break;\n }\n case 'html': {\n out += renderer.html(token);\n break;\n }\n case 'link': {\n out += renderer.link(token);\n break;\n }\n case 'image': {\n out += renderer.image(token);\n break;\n }\n case 'checkbox': {\n out += renderer.checkbox(token);\n break;\n }\n case 'strong': {\n out += renderer.strong(token);\n break;\n }\n case 'em': {\n out += renderer.em(token);\n break;\n }\n case 'codespan': {\n out += renderer.codespan(token);\n break;\n }\n case 'br': {\n out += renderer.br(token);\n break;\n }\n case 'del': {\n out += renderer.del(token);\n break;\n }\n case 'text': {\n out += renderer.text(token);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '' as ParserOutput;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out as ParserOutput;\n }\n}\n","import { _defaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\n\nexport class _Hooks<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n block?: boolean;\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n 'emStrongMask',\n ]);\n\n static passThroughHooksRespectAsync = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n ]);\n\n /**\n * Process markdown before marked\n */\n preprocess(markdown: string) {\n return markdown;\n }\n\n /**\n * Process HTML after marked is finished\n */\n postprocess(html: ParserOutput) {\n return html;\n }\n\n /**\n * Process all tokens before walk tokens\n */\n processAllTokens(tokens: Token[] | TokensList) {\n return tokens;\n }\n\n /**\n * Mask contents that should not be interpreted as em/strong delimiters\n */\n emStrongMask(src: string) {\n return src;\n }\n\n /**\n * Provide function to tokenize markdown\n */\n provideLexer() {\n return this.block ? _Lexer.lex : _Lexer.lexInline;\n }\n\n /**\n * Provide function to parse tokens\n */\n provideParser() {\n return this.block ? _Parser.parse<ParserOutput, RendererOutput> : _Parser.parseInline<ParserOutput, RendererOutput>;\n }\n}\n","import { _getDefaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { escape } from './helpers.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, Tokens, TokensList } from './Tokens.ts';\n\nexport type MaybePromise = void | Promise<void>;\n\ntype UnknownFunction = (...args: unknown[]) => unknown;\ntype GenericRendererFunction = (...args: unknown[]) => string | false;\n\nexport class Marked<ParserOutput = string, RendererOutput = string> {\n defaults = _getDefaults<ParserOutput, RendererOutput>();\n options = this.setOptions;\n\n parse = this.parseMarkdown(true);\n parseInline = this.parseMarkdown(false);\n\n Parser = _Parser<ParserOutput, RendererOutput>;\n Renderer = _Renderer<ParserOutput, RendererOutput>;\n TextRenderer = _TextRenderer<RendererOutput>;\n Lexer = _Lexer;\n Tokenizer = _Tokenizer<ParserOutput, RendererOutput>;\n Hooks = _Hooks<ParserOutput, RendererOutput>;\n\n constructor(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n this.use(...args);\n }\n\n /**\n * Run callback for every token\n */\n walkTokens(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n let values: MaybePromise[] = [];\n for (const token of tokens) {\n values = values.concat(callback.call(this, token));\n switch (token.type) {\n case 'table': {\n const tableToken = token as Tokens.Table;\n for (const cell of tableToken.header) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n for (const row of tableToken.rows) {\n for (const cell of row) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n }\n break;\n }\n case 'list': {\n const listToken = token as Tokens.List;\n values = values.concat(this.walkTokens(listToken.items, callback));\n break;\n }\n default: {\n const genericToken = token as Tokens.Generic;\n if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n const tokens = genericToken[childTokens].flat(Infinity) as Token[] | TokensList;\n values = values.concat(this.walkTokens(tokens, callback));\n });\n } else if (genericToken.tokens) {\n values = values.concat(this.walkTokens(genericToken.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n\n use(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n const extensions: MarkedOptions<ParserOutput, RendererOutput>['extensions'] = this.defaults.extensions || { renderers: {}, childTokens: {} };\n\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack } as MarkedOptions<ParserOutput, RendererOutput>;\n\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if ('renderer' in ext) { // Renderer extensions\n const prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function(...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n } else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if ('tokenizer' in ext) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n const extLevel = extensions[ext.level];\n if (extLevel) {\n extLevel.unshift(ext.tokenizer);\n } else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n } else {\n extensions.startBlock = [ext.start];\n }\n } else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n } else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = this.defaults.renderer || new _Renderer<ParserOutput, RendererOutput>(this.defaults);\n for (const prop in pack.renderer) {\n if (!(prop in renderer)) {\n throw new Error(`renderer '${prop}' does not exist`);\n }\n if (['options', 'parser'].includes(prop)) {\n // ignore options property\n continue;\n }\n const rendererProp = prop as Exclude<keyof _Renderer<ParserOutput, RendererOutput>, 'options' | 'parser'>;\n const rendererFunc = pack.renderer[rendererProp] as GenericRendererFunction;\n const prevRenderer = renderer[rendererProp] as GenericRendererFunction;\n // Replace renderer with func to run extension, but fall back if false\n renderer[rendererProp] = (...args: unknown[]) => {\n let ret = rendererFunc.apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return (ret || '') as RendererOutput;\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = this.defaults.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>(this.defaults);\n for (const prop in pack.tokenizer) {\n if (!(prop in tokenizer)) {\n throw new Error(`tokenizer '${prop}' does not exist`);\n }\n if (['options', 'rules', 'lexer'].includes(prop)) {\n // ignore options, rules, and lexer properties\n continue;\n }\n const tokenizerProp = prop as Exclude<keyof _Tokenizer<ParserOutput, RendererOutput>, 'options' | 'rules' | 'lexer'>;\n const tokenizerFunc = pack.tokenizer[tokenizerProp] as UnknownFunction;\n const prevTokenizer = tokenizer[tokenizerProp] as UnknownFunction;\n // Replace tokenizer with func to run extension, but fall back if false\n // @ts-expect-error cannot type tokenizer function dynamically\n tokenizer[tokenizerProp] = (...args: unknown[]) => {\n let ret = tokenizerFunc.apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n const hooks = this.defaults.hooks || new _Hooks<ParserOutput, RendererOutput>();\n for (const prop in pack.hooks) {\n if (!(prop in hooks)) {\n throw new Error(`hook '${prop}' does not exist`);\n }\n if (['options', 'block'].includes(prop)) {\n // ignore options and block properties\n continue;\n }\n const hooksProp = prop as Exclude<keyof _Hooks<ParserOutput, RendererOutput>, 'options' | 'block'>;\n const hooksFunc = pack.hooks[hooksProp] as UnknownFunction;\n const prevHook = hooks[hooksProp] as UnknownFunction;\n if (_Hooks.passThroughHooks.has(prop)) {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (arg: unknown) => {\n if (this.defaults.async && _Hooks.passThroughHooksRespectAsync.has(prop)) {\n return (async() => {\n const ret = await hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n })();\n }\n\n const ret = hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n } else {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (...args: unknown[]) => {\n if (this.defaults.async) {\n return (async() => {\n let ret = await hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = await prevHook.apply(hooks, args);\n }\n return ret;\n })();\n }\n\n let ret = hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n }\n opts.hooks = hooks;\n }\n\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = this.defaults.walkTokens;\n const packWalktokens = pack.walkTokens;\n opts.walkTokens = function(token) {\n let values: MaybePromise[] = [];\n values.push(packWalktokens.call(this, token));\n if (walkTokens) {\n values = values.concat(walkTokens.call(this, token));\n }\n return values;\n };\n }\n\n this.defaults = { ...this.defaults, ...opts };\n });\n\n return this;\n }\n\n setOptions(opt: MarkedOptions<ParserOutput, RendererOutput>) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n\n lexer(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n return _Lexer.lex(src, options ?? this.defaults);\n }\n\n parser(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n return _Parser.parse<ParserOutput, RendererOutput>(tokens, options ?? this.defaults);\n }\n\n private parseMarkdown(blockType: boolean) {\n type overloadedParse = {\n (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: true }): Promise<ParserOutput>;\n (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: false }): ParserOutput;\n (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): ParserOutput | Promise<ParserOutput>;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parse: overloadedParse = (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): any => {\n const origOpt = { ...options };\n const opt = { ...this.defaults, ...origOpt };\n\n const throwError = this.onError(!!opt.silent, !!opt.async);\n\n // throw error if an extension set async to true but parse was called with async: false\n if (this.defaults.async === true && origOpt.async === false) {\n return throwError(new Error('marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.'));\n }\n\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected'));\n }\n\n if (opt.hooks) {\n opt.hooks.options = opt;\n opt.hooks.block = blockType;\n }\n\n if (opt.async) {\n return (async() => {\n const processedSrc = opt.hooks ? await opt.hooks.preprocess(src) : src;\n const lexer = opt.hooks ? await opt.hooks.provideLexer() : (blockType ? _Lexer.lex : _Lexer.lexInline);\n const tokens = await lexer(processedSrc, opt);\n const processedTokens = opt.hooks ? await opt.hooks.processAllTokens(tokens) : tokens;\n if (opt.walkTokens) {\n await Promise.all(this.walkTokens(processedTokens, opt.walkTokens));\n }\n const parser = opt.hooks ? await opt.hooks.provideParser() : (blockType ? _Parser.parse : _Parser.parseInline);\n const html = await parser(processedTokens, opt);\n return opt.hooks ? await opt.hooks.postprocess(html) : html;\n })().catch(throwError);\n }\n\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src) as string;\n }\n const lexer = opt.hooks ? opt.hooks.provideLexer() : (blockType ? _Lexer.lex : _Lexer.lexInline);\n let tokens = lexer(src, opt);\n if (opt.hooks) {\n tokens = opt.hooks.processAllTokens(tokens);\n }\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n const parser = opt.hooks ? opt.hooks.provideParser() : (blockType ? _Parser.parse : _Parser.parseInline);\n let html = parser(tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html);\n }\n return html;\n } catch(e) {\n return throwError(e as Error);\n }\n };\n\n return parse;\n }\n\n private onError(silent: boolean, async: boolean) {\n return (e: Error): string | Promise<string> => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n if (silent) {\n const msg = '<p>An error occurred:</p><pre>'\n + escape(e.message + '', true)\n + '</pre>';\n if (async) {\n return Promise.resolve(msg);\n }\n return msg;\n }\n\n if (async) {\n return Promise.reject(e);\n }\n throw e;\n };\n }\n}\n","import { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { Marked } from './Instance.ts';\nimport {\n _getDefaults,\n changeDefaults,\n _defaults,\n} from './defaults.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\nimport type { MaybePromise } from './Instance.ts';\n\nconst markedInstance = new Marked();\n\n/**\n * Compiles markdown to HTML asynchronously.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options, having async: true\n * @return Promise of string of compiled HTML\n */\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\n\n/**\n * Compiles markdown to HTML.\n *\n * @param src String of markdown source to be compiled\n * @param options Optional hash of options\n * @return String of compiled HTML. Will be a Promise of string if async is set to true by any extensions.\n */\nexport function marked(src: string, options: MarkedOptions & { async: false }): string;\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\nexport function marked(src: string, options?: MarkedOptions | null): string | Promise<string>;\nexport function marked(src: string, opt?: MarkedOptions | null): string | Promise<string> {\n return markedInstance.parse(src, opt);\n}\n\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n marked.setOptions = function(options: MarkedOptions) {\n markedInstance.setOptions(options);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n };\n\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\n\nmarked.defaults = _defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function(...args: MarkedExtension[]) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n return markedInstance.walkTokens(tokens, callback);\n};\n\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\n\nexport const options = marked.options;\nexport const setOptions = marked.setOptions;\nexport const use = marked.use;\nexport const walkTokens = marked.walkTokens;\nexport const parseInline = marked.parseInline;\nexport const parse = marked;\nexport const parser = _Parser.parse;\nexport const lexer = _Lexer.lex;\nexport { _defaults as defaults, _getDefaults as getDefaults } from './defaults.ts';\nexport { _Lexer as Lexer } from './Lexer.ts';\nexport { _Parser as Parser } from './Parser.ts';\nexport { _Tokenizer as Tokenizer } from './Tokenizer.ts';\nexport { _Renderer as Renderer } from './Renderer.ts';\nexport { _TextRenderer as TextRenderer } from './TextRenderer.ts';\nexport { _Hooks as Hooks } from './Hooks.ts';\nexport { Marked } from './Instance.ts';\nexport type * from './MarkedOptions.ts';\nexport type * from './Tokens.ts';\n","import type { FormSchema, Field, Step, SlotContent } from '../types'\n\n/**\n * Parser del schema JSON\n */\nexport class SchemaParser {\n /**\n * Parsea y valida un schema\n */\n parse(schema: FormSchema): ParsedSchema {\n if (!schema) {\n throw new Error('Schema es requerido')\n }\n\n // Validar que tenga fields o steps\n if (!schema.fields && !schema.steps) {\n throw new Error('Schema debe tener fields o steps')\n }\n\n // Si tiene steps, validar que todos los steps tengan fields\n if (schema.steps) {\n for (const step of schema.steps) {\n if (!step.fields || step.fields.length === 0) {\n throw new Error('Cada step debe tener al menos un field')\n }\n }\n }\n\n // Normalizar campos\n const normalizedFields = schema.fields\n ? this.normalizeFields(schema.fields)\n : []\n\n const normalizedSteps = schema.steps\n ? schema.steps.map((step) => ({\n ...step,\n fields: this.normalizeFields(step.fields),\n }))\n : undefined\n\n return {\n fields: normalizedFields,\n steps: normalizedSteps,\n isWizard: Boolean(schema.steps && schema.steps.length > 0),\n }\n }\n\n /**\n * Normaliza y valida campos\n */\n private normalizeFields(fields: Field[]): Field[] {\n return fields.map((field, index) => {\n // Validar que tenga type y name\n if (!field.type) {\n throw new Error(`Field en índice ${index} debe tener un type`)\n }\n if (!field.name) {\n throw new Error(`Field en índice ${index} debe tener un name`)\n }\n\n // Validar tipos específicos\n this.validateFieldType(field, index)\n\n // Aplicar valores por defecto\n return this.applyDefaults(field)\n })\n }\n\n /**\n * Valida el tipo de campo\n */\n private validateFieldType(field: Field, index: number): void {\n const validTypes = [\n 'text',\n 'email',\n 'number',\n 'password',\n 'textarea',\n 'select',\n 'checkbox',\n 'radio',\n 'switch',\n 'date',\n 'file',\n 'file-drop',\n 'map',\n 'rating',\n 'slider',\n 'colorpicker',\n 'array',\n 'group',\n 'row',\n 'custom',\n 'quantity',\n 'accordion-select',\n 'image-grid-select',\n 'otp',\n 'markdown',\n ]\n\n if (!validTypes.includes(field.type)) {\n throw new Error(\n `Field en índice ${index} tiene un type inválido: ${field.type}`\n )\n }\n\n // Validaciones específicas por tipo\n switch (field.type) {\n case 'select':\n case 'radio':\n case 'accordion-select':\n case 'image-grid-select':\n if (!('options' in field) || !field.options || field.options.length === 0) {\n throw new Error(\n `Field \"${field.name}\" de tipo ${field.type} debe tener options`\n )\n }\n break\n case 'array':\n if (!('itemSchema' in field) || !field.itemSchema) {\n throw new Error(\n `Field \"${field.name}\" de tipo array debe tener itemSchema`\n )\n }\n if ('minItems' in field) {\n const min = (field as any).minItems\n if (min < 0) {\n throw new Error(\n `Field \"${field.name}\" de tipo array: minItems debe ser >= 0`\n )\n }\n if ('maxItems' in field) {\n const max = (field as any).maxItems\n if (min > max) {\n throw new Error(\n `Field \"${field.name}\" de tipo array: minItems (${min}) no puede ser mayor que maxItems (${max})`\n )\n }\n }\n }\n break\n case 'group':\n if (!('fields' in field) || !field.fields || field.fields.length === 0) {\n throw new Error(\n `Field \"${field.name}\" de tipo group debe tener fields`\n )\n }\n break\n case 'row':\n if (!('fields' in field) || !field.fields || field.fields.length === 0) {\n throw new Error(\n `Field \"${field.name}\" de tipo row debe tener fields`\n )\n }\n break\n case 'colorpicker':\n if ('defaultValue' in field && field.defaultValue != null) {\n const hex = /^#[0-9A-Fa-f]{6}$/\n if (!hex.test(String(field.defaultValue))) {\n throw new Error(\n `Field \"${field.name}\" de tipo colorpicker debe tener defaultValue en formato hex (#RRGGBB)`\n )\n }\n }\n break\n }\n\n // Validar leadingIcon y trailingIcon si existen\n if ('leadingIcon' in field && field.leadingIcon) {\n this.validateSlotContent(field.leadingIcon, field.name, 'leadingIcon')\n }\n if ('trailingIcon' in field && field.trailingIcon) {\n this.validateSlotContent(field.trailingIcon, field.name, 'trailingIcon')\n }\n }\n\n /**\n * Valida que SlotContent tenga las propiedades requeridas según type\n */\n private validateSlotContent(\n slot: SlotContent,\n fieldName: string,\n slotName: string\n ): void {\n if (!slot.type || !['image', 'html'].includes(slot.type)) {\n throw new Error(\n `Field \"${fieldName}\" ${slotName} debe tener type 'image' o 'html'`\n )\n }\n if (slot.type === 'image') {\n if (!slot.src || typeof slot.src !== 'string') {\n throw new Error(\n `Field \"${fieldName}\" ${slotName} con type 'image' debe tener src`\n )\n }\n }\n if (slot.type === 'html') {\n if (!slot.html || typeof slot.html !== 'string') {\n throw new Error(\n `Field \"${fieldName}\" ${slotName} con type 'html' debe tener html`\n )\n }\n }\n }\n\n /**\n * Aplica valores por defecto a un campo\n */\n private applyDefaults(field: Field): Field {\n const defaults: any = {\n disabled: false,\n hidden: false,\n }\n\n // Aplicar defaults específicos por tipo\n switch (field.type) {\n case 'checkbox':\n case 'switch':\n if (!('checked' in field)) {\n defaults.checked = false\n }\n break\n case 'select':\n case 'accordion-select':\n case 'image-grid-select':\n if (!('multiple' in field)) {\n defaults.multiple = false\n }\n if (field.type === 'image-grid-select') {\n if (!('columns' in field)) {\n defaults.columns = 3\n }\n if (!('imageSize' in field)) {\n defaults.imageSize = 'medium'\n }\n }\n break\n case 'file':\n if (!('multiple' in field)) {\n defaults.multiple = false\n }\n break\n case 'quantity':\n if (!('min' in field)) {\n defaults.min = 0\n }\n if (!('step' in field)) {\n defaults.step = 1\n }\n break\n case 'otp':\n if (!('length' in field)) {\n defaults.length = 6\n }\n if (!('numeric' in field)) {\n defaults.numeric = true\n }\n break\n case 'slider':\n if (!('min' in field)) {\n defaults.min = 0\n }\n if (!('max' in field)) {\n defaults.max = 100\n }\n if (!('step' in field)) {\n defaults.step = 1\n }\n break\n case 'rating':\n if (!('max' in field)) {\n defaults.max = 5\n }\n break\n case 'colorpicker':\n if (!('defaultValue' in field) || field.defaultValue == null) {\n defaults.defaultValue = '#000000'\n }\n break\n }\n\n return { ...defaults, ...field } as Field\n }\n\n /**\n * Obtiene todos los campos de un schema (incluyendo nested)\n */\n getAllFields(schema: FormSchema): Field[] {\n const parsed = this.parse(schema)\n const allFields: Field[] = []\n\n const extractFields = (fields: Field[]) => {\n for (const field of fields) {\n allFields.push(field)\n if (field.type === 'group' && 'fields' in field) {\n extractFields(field.fields)\n }\n if (field.type === 'row' && 'fields' in field) {\n extractFields(field.fields)\n }\n if (field.type === 'array' && 'itemSchema' in field && field.itemSchema.fields) {\n extractFields(field.itemSchema.fields)\n }\n }\n }\n\n if (parsed.fields) {\n extractFields(parsed.fields)\n }\n\n if (parsed.steps) {\n for (const step of parsed.steps) {\n extractFields(step.fields)\n }\n }\n\n return allFields\n }\n}\n\n/**\n * Schema parseado\n */\nexport interface ParsedSchema {\n fields: Field[]\n steps?: Step[]\n isWizard: boolean\n}\n","import type { FormTheme, FormColors } from '../../types'\n\nexport function hexToRgb(hex: string): string {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n if (!result) {\n const short = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i.exec(hex)\n if (!short) return '0, 123, 255'\n return [\n parseInt(short[1] + short[1], 16),\n parseInt(short[2] + short[2], 16),\n parseInt(short[3] + short[3], 16),\n ].join(', ')\n }\n return [\n parseInt(result[1], 16),\n parseInt(result[2], 16),\n parseInt(result[3], 16),\n ].join(', ')\n}\n\nconst defaultColors: Required<FormColors> = {\n primary: '#007bff',\n secondary: '#6c757d',\n error: '#dc3545',\n success: '#28a745',\n text: '#212529',\n labelColor: '#212529',\n border: '#ddd',\n background: '#ffffff',\n groupBackground: 'var(--easy-form-group-background)',\n groupTitle: '#212529',\n groupBorder: '#ddd',\n}\n\nexport function getColors(colors?: FormColors): Required<FormColors> {\n return { ...defaultColors, ...colors }\n}\n\nexport function getBaseStyles(colors: Required<FormColors>): string {\n return `\n :host {\n display: block;\n --easy-form-primary: ${colors.primary};\n --easy-form-primary-rgb: ${hexToRgb(colors.primary)};\n --easy-form-secondary: ${colors.secondary};\n --easy-form-error: ${colors.error};\n --easy-form-success: ${colors.success};\n --easy-form-text: ${colors.text};\n --easy-form-label-color: ${colors.labelColor};\n --easy-form-border: ${colors.border};\n --easy-form-background: ${colors.background};\n --easy-form-group-background: ${colors.groupBackground};\n --easy-form-group-title: ${colors.groupTitle};\n --easy-form-group-border: ${colors.groupBorder};\n --easy-form-on-primary: #ffffff;\n --easy-form-hover-overlay: rgba(0, 0, 0, 0.03);\n }\n .easy-form-field {\n margin-bottom: 1rem;\n }\n .easy-form-label {\n display: block;\n margin-bottom: 0.5rem;\n font-weight: 500;\n color: var(--easy-form-label-color);\n }\n .easy-form-label-down .easy-form-label {\n margin-bottom: 0;\n margin-top: 0.5rem;\n }\n .easy-form-field-inner-horizontal {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.75rem;\n }\n .easy-form-field-inner-horizontal .easy-form-label {\n display: inline-block;\n margin-bottom: 0;\n margin-top: 0;\n flex-shrink: 0;\n white-space: nowrap;\n }\n .easy-form-field-inner-horizontal > *:not(.easy-form-label) {\n flex: 1;\n min-width: 0;\n }\n .easy-form-direction-vertical {\n display: block;\n }\n .easy-form-direction-horizontal {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 1rem;\n }\n .easy-form-direction-horizontal > * {\n flex: 1 1 auto;\n }\n .easy-form-completed-indicator {\n margin-bottom: 1rem;\n }\n .easy-form-completed-track {\n height: 6px;\n background: var(--easy-form-border);\n border-radius: 3px;\n overflow: hidden;\n }\n .easy-form-completed-fill {\n height: 100%;\n background: var(--easy-form-primary);\n border-radius: 3px;\n transition: width 0.2s ease;\n }\n .easy-form-slider-wrapper {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n .easy-form-slider-value {\n min-width: 2rem;\n font-weight: 500;\n }\n .easy-form-input-wrapper {\n display: flex;\n align-items: center;\n flex-wrap: nowrap;\n width: 100%;\n border: 1px solid var(--easy-form-border);\n border-radius: 4px;\n background: var(--easy-form-background);\n padding: 0 0.75rem;\n box-sizing: border-box;\n }\n .easy-form-input-wrapper:focus-within {\n border-color: var(--easy-form-primary);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.1);\n }\n .easy-form-input-wrapper .easy-form-input-core {\n flex: 1;\n min-width: 0;\n }\n .easy-form-input-wrapper .easy-form-input-core input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"color\"]),\n .easy-form-input-wrapper .easy-form-input-core textarea,\n .easy-form-input-wrapper .easy-form-input-core select {\n width: 100%;\n border: none !important;\n background: transparent !important;\n box-shadow: none !important;\n padding: 0.5rem 0 !important;\n }\n .easy-form-input-wrapper .easy-form-input-core input:focus,\n .easy-form-input-wrapper .easy-form-input-core textarea:focus,\n .easy-form-input-wrapper .easy-form-input-core select:focus {\n outline: none;\n }\n .easy-form-input-slot {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 0;\n min-width: 1.5rem;\n }\n .easy-form-input-slot-content {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .easy-form-input-slot-content img {\n width: 20px;\n height: 20px;\n min-width: 20px;\n min-height: 20px;\n object-fit: contain;\n display: block;\n }\n .easy-form-input-slot-leading {\n padding-right: 0.5rem;\n }\n .easy-form-input-slot-trailing {\n padding-left: 0.5rem;\n }\n .easy-form-color-wrapper {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n .easy-form-color-wrapper input[type=\"color\"] {\n width: 2.2rem;\n height: 2.2rem;\n min-width: 2.2rem;\n min-height: 2.2rem;\n padding: 0 !important;\n margin: 0;\n cursor: pointer;\n border: 1px solid var(--easy-form-border);\n border-radius: 2px;\n background: transparent;\n flex-shrink: 0;\n }\n .easy-form-color-wrapper input[type=\"color\"]::-webkit-color-swatch-wrapper {\n padding: 0;\n }\n .easy-form-color-wrapper input[type=\"color\"]::-webkit-color-swatch {\n border: none;\n border-radius: 1px;\n }\n .easy-form-color-wrapper input[type=\"color\"]::-moz-color-swatch {\n border: none;\n border-radius: 1px;\n }\n .easy-form-color-text {\n flex: 1;\n min-width: 0;\n color: var(--easy-form-text);\n background: var(--easy-form-background);\n border: 1px solid var(--easy-form-border);\n border-radius: 4px;\n padding: 0.5rem 0.75rem;\n font-family: ui-monospace, 'Cascadia Code', 'Fira Code', 'Courier New', monospace;\n font-size: 0.875rem;\n }\n .easy-form-rating {\n display: inline-flex;\n gap: 0.25rem;\n }\n .easy-form-rating-stars {\n display: flex;\n gap: 0.25rem;\n }\n .easy-form-rating-star {\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n color: var(--easy-form-border);\n }\n .easy-form-rating-star svg {\n display: block;\n }\n .easy-form-rating-star-filled {\n color: var(--easy-form-primary);\n }\n .easy-form-rating-star:hover,\n .easy-form-rating-star:focus {\n color: var(--easy-form-primary);\n }\n .easy-form-file-drop {\n border: 2px dashed var(--easy-form-border);\n border-radius: 8px;\n padding: 2rem;\n text-align: center;\n cursor: pointer;\n transition: border-color 0.2s, background 0.2s;\n }\n .easy-form-file-drop:hover,\n .easy-form-file-drop-over {\n border-color: var(--easy-form-primary);\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n }\n .easy-form-file-drop-list {\n margin-top: 0.75rem;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n .easy-form-file-drop-item {\n font-size: 0.875rem;\n color: var(--easy-form-text);\n padding: 0.25rem 0;\n border-bottom: 1px solid var(--easy-form-border);\n }\n .easy-form-map-inputs {\n display: flex;\n gap: 1rem;\n margin-bottom: 0.5rem;\n }\n .easy-form-map-inputs input {\n flex: 1;\n }\n .easy-form-map-placeholder,\n .easy-form-map-container {\n min-height: 300px;\n height: 300px;\n border-radius: 4px;\n position: relative;\n overflow: hidden;\n width: 100%;\n display: block;\n box-sizing: border-box;\n }\n .easy-form-map-container {\n background: var(--easy-form-group-background);\n }\n .easy-form-map-container .leaflet-container {\n height: 100% !important;\n width: 100% !important;\n position: relative !important;\n }\n .easy-form-map-container .leaflet-tile-container {\n position: absolute;\n left: 0;\n top: 0;\n }\n .easy-form-markdown {\n width: 100%;\n }\n .easy-form-markdown-toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n padding: 0.5rem;\n background: var(--easy-form-group-background);\n border: 1px solid var(--easy-form-border);\n border-bottom: none;\n border-radius: 4px 4px 0 0;\n }\n .easy-form-markdown-toolbar-btn {\n padding: 0.25rem 0.5rem;\n background: transparent;\n border: 1px solid var(--easy-form-border);\n border-radius: 3px;\n cursor: pointer;\n font-size: 0.875rem;\n color: var(--easy-form-text);\n transition: background 0.15s, border-color 0.15s;\n }\n .easy-form-markdown-toolbar-btn:hover {\n background: var(--easy-form-group-background);\n border-color: var(--easy-form-primary);\n }\n .easy-form-markdown-editor-wrapper {\n display: flex;\n gap: 0;\n border: 1px solid var(--easy-form-border);\n border-radius: 0 0 4px 4px;\n overflow: hidden;\n }\n .easy-form-markdown-textarea {\n flex: 1;\n min-width: 50%;\n padding: 0.75rem;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', monospace;\n font-size: 0.875rem;\n line-height: 1.5;\n border: none;\n resize: vertical;\n outline: none;\n background: var(--easy-form-background);\n color: var(--easy-form-text);\n box-sizing: border-box;\n }\n .easy-form-markdown-textarea:focus {\n background: var(--easy-form-background);\n }\n .easy-form-markdown-preview {\n flex: 1;\n min-width: 50%;\n padding: 0.75rem;\n overflow-y: auto;\n background: var(--easy-form-group-background);\n border-left: 1px solid var(--easy-form-border);\n font-size: 0.875rem;\n line-height: 1.6;\n color: var(--easy-form-text);\n box-sizing: border-box;\n }\n .easy-form-markdown-preview h1,\n .easy-form-markdown-preview h2,\n .easy-form-markdown-preview h3,\n .easy-form-markdown-preview h4,\n .easy-form-markdown-preview h5,\n .easy-form-markdown-preview h6 {\n margin-top: 1rem;\n margin-bottom: 0.5rem;\n font-weight: 600;\n line-height: 1.3;\n }\n .easy-form-markdown-preview h1 { font-size: 1.5rem; }\n .easy-form-markdown-preview h2 { font-size: 1.25rem; }\n .easy-form-markdown-preview h3 { font-size: 1.125rem; }\n .easy-form-markdown-preview p {\n margin: 0.5rem 0;\n }\n .easy-form-markdown-preview code {\n background: rgba(0,0,0,0.06);\n padding: 0.125rem 0.25rem;\n border-radius: 3px;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', monospace;\n font-size: 0.8125rem;\n }\n .easy-form-markdown-preview pre {\n background: rgba(0,0,0,0.04);\n padding: 0.75rem;\n border-radius: 4px;\n overflow-x: auto;\n }\n .easy-form-markdown-preview pre code {\n background: none;\n padding: 0;\n }\n .easy-form-markdown-preview ul,\n .easy-form-markdown-preview ol {\n padding-left: 1.5rem;\n margin: 0.5rem 0;\n }\n .easy-form-markdown-preview blockquote {\n border-left: 3px solid var(--easy-form-primary);\n margin: 0.5rem 0;\n padding-left: 0.75rem;\n color: var(--easy-form-secondary);\n }\n .easy-form-markdown-preview a {\n color: var(--easy-form-primary);\n }\n .easy-form-markdown-preview img {\n max-width: 100%;\n height: auto;\n }\n .easy-form-markdown-preview-placeholder {\n color: var(--easy-form-secondary);\n font-style: italic;\n }\n .easy-form-markdown-error {\n color: var(--easy-form-error);\n font-size: 0.8125rem;\n line-height: 1.5;\n }\n .easy-form-markdown-preview-loading {\n color: var(--easy-form-secondary);\n font-size: 0.875rem;\n }\n .easy-form-required {\n color: var(--easy-form-error);\n }\n .easy-form-input-error {\n border-color: var(--easy-form-error) !important;\n }\n .easy-form-error {\n color: var(--easy-form-error);\n font-size: 0.875rem;\n margin-top: 0.25rem;\n }\n .easy-form-description {\n font-size: 0.875rem;\n color: var(--easy-form-secondary);\n margin-top: 0.25rem;\n }\n .easy-form-submit {\n padding: 0.5rem 1rem;\n background: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n border: none;\n cursor: pointer;\n font-size: 1rem;\n transition: all 0.2s ease;\n }\n .easy-form-submit:hover {\n opacity: 0.9;\n }\n .easy-form-submit:active {\n transform: scale(0.98);\n }\n .easy-form-submit-wrapper {\n margin-top: 1rem;\n margin-bottom: 0.5rem;\n }\n .easy-form-submit-wrapper .easy-form-submit {\n min-width: 100px;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"color\"]), textarea, select {\n width: 100%;\n padding: 0.5rem;\n font-size: 1rem;\n color: var(--easy-form-text);\n transition: all 0.2s ease;\n box-sizing: border-box;\n }\n input[type=\"checkbox\"],\n input[type=\"radio\"] {\n width: 18px !important;\n height: 18px !important;\n min-width: 18px !important;\n min-height: 18px !important;\n max-width: 18px !important;\n margin: 0;\n padding: 0;\n cursor: pointer;\n accent-color: var(--easy-form-primary);\n flex-shrink: 0;\n }\n input:focus, textarea:focus, select:focus {\n outline: none;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"color\"])::placeholder,\n textarea::placeholder {\n color: color-mix(in srgb, var(--easy-form-text) 55%, transparent);\n opacity: 1;\n }\n .easy-form-group {\n padding: 1rem;\n margin-bottom: 1rem;\n background: var(--easy-form-group-background);\n border: 1px solid var(--easy-form-group-border);\n border-radius: 4px;\n }\n .easy-form-group-label {\n color: var(--easy-form-group-title);\n font-weight: 600;\n font-size: 1rem;\n margin-bottom: 0.75rem;\n margin-top: 0;\n }\n .easy-form-group-collapsible {\n border: 1px solid var(--easy-form-group-border);\n border-radius: 4px;\n overflow: hidden;\n }\n .easy-form-group-collapsible .easy-form-group-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n cursor: pointer;\n background: var(--easy-form-group-background);\n color: var(--easy-form-group-title);\n font-weight: 600;\n font-size: 1rem;\n user-select: none;\n transition: background-color 0.2s ease;\n width: 100%;\n border: none;\n }\n .easy-form-group-collapsible .easy-form-group-header:hover {\n background: var(--easy-form-hover-overlay);\n }\n .easy-form-group-collapsible .easy-form-group-header:focus {\n outline: none;\n box-shadow: inset 0 0 0 2px var(--easy-form-primary);\n }\n .easy-form-group-collapsible .easy-form-group-chevron {\n flex-shrink: 0;\n margin-left: 0.5rem;\n transition: transform 0.2s ease;\n color: var(--easy-form-secondary);\n }\n .easy-form-group-collapsible.easy-form-group-collapsed .easy-form-group-chevron {\n transform: rotate(-90deg);\n }\n .easy-form-group-collapsible .easy-form-group-content {\n overflow: hidden;\n transition: max-height 0.3s ease;\n padding: 0 1rem 1rem 1rem;\n }\n .easy-form-group-collapsible.easy-form-group-collapsed .easy-form-group-content {\n max-height: 0 !important;\n padding-top: 0;\n padding-bottom: 0;\n }\n .easy-form-row {\n display: flex;\n flex-wrap: wrap;\n gap: 1rem;\n margin-bottom: 1rem;\n align-items: stretch;\n }\n .easy-form-row > div {\n flex: 1;\n min-width: 0;\n }\n @media (max-width: 768px) {\n .easy-form-row {\n flex-direction: column;\n }\n .easy-form-row > div {\n flex: none;\n width: 100%;\n }\n }\n .easy-form-radio-group {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-top: 0.5rem;\n }\n .easy-form-radio-option {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n }\n .easy-form-radio-option:hover {\n background-color: var(--easy-form-hover-overlay);\n }\n .easy-form-radio-option input[type=\"radio\"] {\n margin: 0;\n flex-shrink: 0;\n }\n .easy-form-radio-label {\n cursor: pointer;\n user-select: none;\n color: var(--easy-form-label-color);\n font-weight: 400;\n }\n .easy-form-label-checkbox,\n .easy-form-label-switch {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n cursor: pointer;\n user-select: none;\n padding: 0.5rem;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n color: var(--easy-form-label-color);\n }\n .easy-form-label-checkbox input[type=\"checkbox\"],\n .easy-form-label-switch input[type=\"checkbox\"] {\n margin: 0;\n flex-shrink: 0;\n }\n .easy-form-label-checkbox:hover,\n .easy-form-label-switch:hover {\n background-color: var(--easy-form-hover-overlay);\n }\n .easy-form-wizard-steps {\n display: flex;\n gap: 1rem;\n margin-bottom: 2rem;\n }\n .easy-form-wizard-step {\n padding: 0.5rem 1rem;\n transition: all 0.2s ease;\n }\n\n /* CSS Custom Properties para stepper styles */\n .easy-form-wizard-steps {\n --ef-stepper-tabs-active-color: var(--easy-form-primary);\n --ef-stepper-tabs-hover-color: var(--easy-form-primary);\n --ef-stepper-tabs-text-color: var(--easy-form-text);\n --ef-stepper-buttons-bg: var(--easy-form-background);\n --ef-stepper-buttons-border: var(--easy-form-border);\n --ef-stepper-buttons-active-bg: var(--easy-form-primary);\n --ef-stepper-buttons-active-color: var(--easy-form-on-primary);\n --ef-stepper-buttons-completed-bg: var(--easy-form-success);\n --ef-stepper-timeline-line-color: var(--easy-form-border);\n --ef-stepper-timeline-node-size: 32px;\n --ef-stepper-timeline-active-color: var(--easy-form-primary);\n --ef-stepper-timeline-completed-color: var(--easy-form-success);\n }\n\n /* Tabs Style */\n .easy-form-wizard-steps.ef-stepper-tabs {\n gap: 0;\n border-bottom: 1px solid var(--easy-form-border);\n }\n .easy-form-wizard-steps.ef-stepper-tabs .easy-form-wizard-step {\n padding: 0.75rem 1.5rem;\n border: none;\n border-bottom: 3px solid transparent;\n background: transparent;\n color: var(--ef-stepper-tabs-text-color);\n cursor: pointer;\n transition: all 0.2s ease;\n }\n .easy-form-wizard-steps.ef-stepper-tabs .easy-form-wizard-step:hover {\n color: var(--ef-stepper-tabs-hover-color);\n background: rgba(0, 0, 0, 0.02);\n }\n .easy-form-wizard-steps.ef-stepper-tabs .easy-form-wizard-step.active {\n background: transparent;\n color: var(--ef-stepper-tabs-active-color);\n border-bottom-color: var(--ef-stepper-tabs-active-color);\n font-weight: 600;\n }\n .easy-form-wizard-steps.ef-stepper-tabs .easy-form-wizard-step.completed {\n background: transparent;\n color: var(--ef-stepper-tabs-text-color);\n border-bottom-color: var(--easy-form-success);\n }\n .easy-form-wizard-steps.ef-stepper-tabs .easy-form-wizard-step.completed::after {\n content: \"✓\";\n margin-left: 0.5rem;\n color: var(--easy-form-success);\n }\n\n /* Buttons Style */\n .easy-form-wizard-steps.ef-stepper-buttons {\n gap: 0.5rem;\n }\n .easy-form-wizard-steps.ef-stepper-buttons .easy-form-wizard-step {\n padding: 0.625rem 1.25rem;\n border: 2px solid var(--ef-stepper-buttons-border);\n border-radius: 6px;\n background: var(--ef-stepper-buttons-bg);\n color: var(--easy-form-text);\n cursor: pointer;\n transition: all 0.2s ease;\n font-weight: 500;\n }\n .easy-form-wizard-steps.ef-stepper-buttons .easy-form-wizard-step:hover:not(.active) {\n border-color: var(--ef-stepper-tabs-hover-color);\n color: var(--ef-stepper-tabs-hover-color);\n }\n .easy-form-wizard-steps.ef-stepper-buttons .easy-form-wizard-step.active {\n background: var(--ef-stepper-buttons-active-bg);\n color: var(--ef-stepper-buttons-active-color);\n border-color: var(--ef-stepper-buttons-active-bg);\n }\n .easy-form-wizard-steps.ef-stepper-buttons .easy-form-wizard-step.completed {\n background: var(--ef-stepper-buttons-completed-bg);\n color: var(--easy-form-on-primary);\n border-color: var(--ef-stepper-buttons-completed-bg);\n }\n\n /* Timeline Style - Horizontal */\n .easy-form-wizard-steps.ef-stepper-timeline {\n display: flex;\n position: relative;\n padding: 16px 0;\n }\n .easy-form-wizard-steps.ef-stepper-timeline::before {\n content: \"\";\n position: absolute;\n top: 37px;\n left: 15%;\n right: 15%;\n height: 2px;\n background: var(--easy-form-text);\n opacity: 0.2;\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n background: transparent !important;\n color: var(--easy-form-text) !important;\n border: none !important;\n position: relative;\n z-index: 1;\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step::before {\n content: \"\";\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--easy-form-background);\n border: 2px solid var(--easy-form-text);\n margin-bottom: 8px;\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step.completed::before {\n background: var(--easy-form-success);\n border-color: var(--easy-form-success);\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step.active::before {\n background: var(--easy-form-primary);\n border-color: var(--easy-form-primary);\n width: 28px;\n height: 28px;\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step.active {\n color: var(--easy-form-primary) !important;\n font-weight: 600;\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step.completed {\n color: var(--easy-form-success) !important;\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step .step-number {\n display: none;\n }\n\n /* Default Stepper Style (when no stepStyle is applied) */\n .easy-form-wizard-steps:not(.ef-stepper-tabs):not(.ef-stepper-buttons):not(.ef-stepper-timeline):not(.ef-stepper-none) .easy-form-wizard-step.active {\n background: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n }\n .easy-form-wizard-steps:not(.ef-stepper-tabs):not(.ef-stepper-buttons):not(.ef-stepper-timeline):not(.ef-stepper-none) .easy-form-wizard-step.completed {\n background: var(--easy-form-success);\n color: var(--easy-form-on-primary);\n }\n\n /* None Style */\n .easy-form-wizard-steps.ef-stepper-none {\n display: none;\n }\n\n .easy-form-wizard-nav {\n display: flex;\n gap: 1rem;\n margin-top: 2rem;\n justify-content: flex-end;\n align-items: center;\n }\n .easy-form-wizard-prev,\n .easy-form-wizard-next {\n padding: 0.75rem 1.5rem;\n background: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n border: none;\n border-radius: 4px;\n font-size: 1rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n font-family: inherit;\n min-width: 120px;\n }\n .easy-form-wizard-prev:hover:not(:disabled),\n .easy-form-wizard-next:hover:not(:disabled) {\n opacity: 0.9;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n .easy-form-wizard-prev:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .easy-form-wizard-prev {\n background: var(--easy-form-secondary);\n order: 1;\n }\n .easy-form-wizard-next {\n background: var(--easy-form-primary);\n order: 2;\n }\n .easy-form-array-item {\n padding: 1rem;\n margin-bottom: 1rem;\n }\n .easy-form-array-add,\n .easy-form-array-remove {\n padding: 0.25rem 0.5rem;\n background: var(--easy-form-secondary);\n color: var(--easy-form-on-primary);\n border: none;\n cursor: pointer;\n font-size: 0.875rem;\n transition: all 0.2s ease;\n }\n .easy-form-array-remove {\n background: var(--easy-form-error);\n }\n .easy-form-array-add:hover,\n .easy-form-array-remove:hover {\n opacity: 0.9;\n }\n .easy-form-quantity-container {\n display: flex;\n flex-direction: column;\n }\n .easy-form-quantity-wrapper {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n .easy-form-quantity-btn {\n width: 2.5rem;\n height: 2.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n border: none;\n border-radius: 4px;\n font-size: 1.25rem;\n font-weight: bold;\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n }\n .easy-form-quantity-btn:hover:not(.disabled) {\n opacity: 0.9;\n transform: scale(1.05);\n }\n .easy-form-quantity-btn.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .easy-form-quantity-input {\n flex: 1;\n text-align: center;\n max-width: 100px;\n }\n .easy-form-accordion-select-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n .easy-form-accordion-item {\n border: 1px solid var(--easy-form-border);\n border-radius: 4px;\n overflow: hidden;\n transition: all 0.2s ease;\n }\n .easy-form-accordion-item.selected {\n border-color: var(--easy-form-primary);\n box-shadow: 0 0 0 2px rgba(var(--easy-form-primary-rgb), 0.1);\n }\n .easy-form-accordion-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n cursor: pointer;\n background: var(--easy-form-background);\n transition: background 0.2s ease;\n }\n .easy-form-accordion-header:hover {\n background: color-mix(in srgb, var(--easy-form-border) 95%, transparent);\n }\n .easy-form-accordion-header-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n flex: 1;\n }\n .easy-form-accordion-indicator {\n width: 20px;\n height: 20px;\n border: 2px solid var(--easy-form-border);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n }\n .easy-form-accordion-indicator.radio {\n border-radius: 50%;\n }\n .easy-form-accordion-indicator.checkbox {\n border-radius: 4px;\n }\n .easy-form-accordion-indicator.checked {\n background: var(--easy-form-primary);\n border-color: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n }\n .easy-form-accordion-indicator.checked.radio::after {\n content: '';\n width: 8px;\n height: 8px;\n background: var(--easy-form-on-primary);\n border-radius: 50%;\n }\n .easy-form-accordion-indicator.checked.checkbox::after {\n content: '✓';\n font-size: 12px;\n color: var(--easy-form-on-primary);\n }\n .easy-form-accordion-label {\n font-weight: 500;\n color: var(--easy-form-text);\n }\n .easy-form-accordion-arrow {\n transition: transform 0.2s ease;\n color: var(--easy-form-secondary);\n }\n .easy-form-accordion-content {\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.3s ease;\n padding: 0 1rem;\n }\n .easy-form-accordion-item.open .easy-form-accordion-content {\n padding: 1rem;\n }\n .easy-form-accordion-description {\n color: var(--easy-form-secondary);\n font-size: 0.875rem;\n margin: 0;\n }\n .easy-form-image-grid-container {\n display: grid;\n gap: 1rem;\n }\n .easy-form-image-grid-item {\n position: relative;\n border: 2px solid var(--easy-form-border);\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--easy-form-background);\n }\n .easy-form-image-grid-item:hover {\n border-color: var(--easy-form-primary);\n transform: translateY(-2px);\n box-shadow: 0 4px 8px color-mix(in srgb, var(--easy-form-border) 30%, transparent);\n }\n .easy-form-image-grid-item.selected {\n border-color: var(--easy-form-primary);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.2);\n }\n .easy-form-image-grid-image-container {\n position: relative;\n width: 100%;\n aspect-ratio: 1;\n overflow: hidden;\n background: var(--easy-form-group-background);\n }\n .easy-form-image-grid-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n .easy-form-image-grid-placeholder {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--easy-form-secondary);\n color: var(--easy-form-on-primary);\n font-size: 2rem;\n font-weight: bold;\n }\n .easy-form-image-grid-indicator {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n width: 24px;\n height: 24px;\n border: 2px solid var(--easy-form-on-primary);\n background: var(--easy-form-primary);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--easy-form-on-primary);\n font-size: 12px;\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n .easy-form-image-grid-item.selected .easy-form-image-grid-indicator {\n opacity: 1;\n }\n .easy-form-image-grid-indicator.checkbox {\n border-radius: 4px;\n }\n .easy-form-image-grid-label {\n padding: 0.75rem;\n text-align: center;\n font-weight: 500;\n color: var(--easy-form-text);\n }\n .easy-form-image-grid-description {\n padding: 0 0.75rem 0.75rem;\n font-size: 0.875rem;\n color: var(--easy-form-secondary);\n text-align: center;\n }\n .easy-form-image-grid-small {\n grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));\n }\n .easy-form-image-grid-medium {\n grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));\n }\n .easy-form-image-grid-large {\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n }\n .easy-form-otp-container {\n display: flex;\n gap: 0.5rem;\n justify-content: center;\n align-items: center;\n }\n .easy-form-otp-input {\n width: 3rem;\n height: 3rem;\n text-align: center;\n font-size: 1.5rem;\n font-weight: bold;\n border: 2px solid var(--easy-form-border);\n border-radius: 4px;\n transition: all 0.2s ease;\n }\n .easy-form-otp-input:focus {\n border-color: var(--easy-form-primary);\n outline: none;\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.1);\n }\n .easy-form-otp-input:invalid {\n border-color: var(--easy-form-error);\n }\n .easy-form-password-inner {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n .easy-form-password-inner .easy-form-password-input {\n flex: 1;\n min-width: 0;\n }\n .easy-form-password-toggle {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.35rem;\n background: transparent;\n border: 1px solid var(--easy-form-border);\n border-radius: 4px;\n cursor: pointer;\n color: var(--easy-form-text);\n }\n .easy-form-password-toggle:hover {\n border-color: var(--easy-form-primary);\n color: var(--easy-form-primary);\n }\n .easy-form-password-toggle:focus {\n outline: none;\n box-shadow: 0 0 0 2px var(--easy-form-primary);\n }\n .easy-form-password-separated {\n display: flex;\n flex-wrap: nowrap;\n gap: 0.5rem;\n align-items: center;\n }\n .easy-form-password-separated-input {\n width: 2.5rem;\n height: 2.5rem;\n text-align: center;\n font-size: 1.25rem;\n border: 2px solid var(--easy-form-border);\n border-radius: 4px;\n transition: border-color 0.2s ease;\n }\n .easy-form-password-separated-input:focus {\n border-color: var(--easy-form-primary);\n outline: none;\n }\n .easy-form-password-separated-toggle {\n flex-shrink: 0;\n }\n .easy-form-password-separated-toggle .easy-form-password-toggle {\n padding: 0.35rem;\n }\n .easy-form-loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n backdrop-filter: blur(2px);\n border-radius: inherit;\n }\n .easy-form-loading-spinner {\n width: 40px;\n height: 40px;\n border: 4px solid rgba(0, 0, 0, 0.1);\n border-top-color: var(--easy-form-primary);\n border-radius: 50%;\n animation: easy-form-spin 0.8s linear infinite;\n }\n @keyframes easy-form-spin {\n to {\n transform: rotate(360deg);\n }\n }\n .easy-form-lock-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.9);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1001;\n backdrop-filter: blur(4px);\n border-radius: inherit;\n text-align: center;\n padding: 1.5rem;\n }\n .easy-form-lock-message {\n font-size: 1rem;\n color: var(--easy-form-text);\n max-width: 280px;\n }\n .easy-form-disabled,\n .easy-form-disabled *,\n .easy-form-slot-disabled,\n .easy-form-slot-disabled * {\n pointer-events: none;\n opacity: 0.6;\n }\n .easy-form-disabled input,\n .easy-form-disabled textarea,\n .easy-form-disabled select,\n .easy-form-disabled button,\n .easy-form-slot-disabled input,\n .easy-form-slot-disabled textarea,\n .easy-form-slot-disabled select,\n .easy-form-slot-disabled button {\n cursor: not-allowed;\n }\n .easy-form-input-disabled {\n opacity: 0.6;\n cursor: not-allowed !important;\n }\n .easy-form-timer {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n background: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n border-radius: 4px;\n font-size: 1.25rem;\n font-weight: 600;\n font-family: ui-monospace, 'Cascadia Code', 'Fira Code', 'Courier New', monospace;\n }\n .easy-form-timer-warning {\n background: #f59e0b;\n color: #fff;\n }\n .easy-form-timer-danger {\n background: var(--easy-form-error);\n color: #fff;\n animation: easy-form-timer-pulse 1s ease-in-out infinite;\n }\n .easy-form-timer-expired {\n background: var(--easy-form-error) !important;\n color: #fff !important;\n }\n .easy-form-timer-expired ~ .easy-form-submit-wrapper {\n display: none;\n }\n @keyframes easy-form-timer-pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.7;\n }\n }\n form {\n position: relative;\n }\n `\n}\n\nexport type { FormTheme, FormColors }\n","import type { FormColors } from '../../types'\n\nexport function getPlanoStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: none;\n border-bottom: 2px solid var(--easy-form-border);\n border-radius: 0;\n padding: 0.75rem 0;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n border-bottom-color: var(--easy-form-primary);\n }\n .easy-form-submit {\n border-radius: 0;\n font-weight: 600;\n }\n .easy-form-group {\n border: none;\n border-bottom: 1px solid var(--easy-form-group-border);\n border-radius: 0;\n background: transparent;\n }\n .easy-form-wizard-step {\n border: none;\n border-bottom: 2px solid var(--easy-form-border);\n border-radius: 0;\n }\n .easy-form-array-item {\n border: none;\n border-bottom: 1px solid var(--easy-form-group-border);\n border-radius: 0;\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getTradicionalStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 2px solid var(--easy-form-border);\n border-radius: 4px;\n padding: 0.625rem;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n border-color: var(--easy-form-primary);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.1);\n }\n .easy-form-submit {\n border-radius: 4px;\n font-weight: 500;\n }\n .easy-form-group {\n border: 2px solid var(--easy-form-group-border);\n border-radius: 4px;\n background: var(--easy-form-group-background);\n }\n .easy-form-wizard-step {\n border: 2px solid var(--easy-form-border);\n border-radius: 4px;\n background: var(--easy-form-group-background);\n }\n .easy-form-wizard-step.active {\n border-color: var(--easy-form-primary);\n }\n .easy-form-array-item {\n border: 2px solid var(--easy-form-group-border);\n border-radius: 4px;\n background: var(--easy-form-group-background);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getMaterialStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n font-size: 0.875rem;\n font-weight: 500;\n margin-bottom: 0.25rem;\n color: var(--easy-form-label-color);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: none;\n border-bottom: 1px solid color-mix(in srgb, var(--easy-form-text) 42%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 0.75rem 0.75rem 0.5rem 0.75rem;\n background: transparent;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n border-bottom-color: var(--easy-form-primary);\n border-bottom-width: 2px;\n padding-bottom: calc(0.5rem - 1px);\n }\n .easy-form-submit {\n border-radius: 4px;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n .easy-form-submit:hover {\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);\n }\n .easy-form-group {\n border: none;\n border-radius: 4px;\n background: var(--easy-form-group-background);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n }\n .easy-form-wizard-step {\n border: none;\n border-radius: 4px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n }\n .easy-form-array-item {\n border: none;\n border-radius: 4px;\n background: var(--easy-form-group-background);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n }\n .easy-form-array-add,\n .easy-form-quantity-btn {\n border-radius: 4px;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n .easy-form-array-add:hover,\n .easy-form-quantity-btn:hover:not(.disabled) {\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);\n }\n .easy-form-array-remove {\n border-radius: 4px;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n .easy-form-array-remove:hover {\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);\n }\n .easy-form-wizard-prev,\n .easy-form-wizard-next {\n border-radius: 4px;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n .easy-form-wizard-prev:hover:not(:disabled),\n .easy-form-wizard-next:hover {\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);\n }\n .easy-form-error,\n .easy-form-description {\n background: transparent;\n border: none;\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getRoundedShadowStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n }\n .easy-form-input-wrapper {\n border-radius: 12px;\n padding: 0 1rem;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n }\n .easy-form-input-wrapper:focus-within {\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.15);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 1px solid var(--easy-form-border);\n border-radius: 12px;\n padding: 0.75rem 1rem;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n border-color: var(--easy-form-primary);\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.15);\n transform: translateY(-1px);\n }\n .easy-form-submit {\n border-radius: 12px;\n font-weight: 600;\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.3);\n }\n .easy-form-submit:hover {\n box-shadow: 0 6px 16px rgba(var(--easy-form-primary-rgb), 0.4);\n transform: translateY(-2px);\n }\n .easy-form-group {\n border: 1px solid var(--easy-form-group-border);\n border-radius: 16px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n background: var(--easy-form-group-background);\n }\n .easy-form-wizard-step {\n border: 1px solid var(--easy-form-border);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n .easy-form-wizard-step.active {\n box-shadow: 0 4px 16px rgba(var(--easy-form-primary-rgb), 0.3);\n }\n .easy-form-array-item {\n border: 1px solid var(--easy-form-group-border);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n background: var(--easy-form-group-background);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getLinesStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-field {\n border-bottom: 1px solid var(--easy-form-border);\n padding-bottom: 1rem;\n margin-bottom: 1.5rem;\n }\n .easy-form-field:last-child {\n border-bottom: none;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: none;\n border-radius: 0;\n padding: 0.5rem 0;\n background: transparent;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n border-bottom: 2px solid var(--easy-form-primary);\n padding-bottom: calc(0.5rem - 1px);\n }\n .easy-form-submit {\n border-radius: 0;\n border-bottom: 3px solid var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n font-weight: 600;\n padding: 0.75rem 0;\n }\n .easy-form-submit:hover {\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n }\n .easy-form-group {\n border: none;\n border-bottom: 2px solid var(--easy-form-group-border);\n border-radius: 0;\n padding-bottom: 1rem;\n background: transparent;\n }\n .easy-form-wizard-step {\n border: none;\n border-bottom: 3px solid var(--easy-form-border);\n border-radius: 0;\n background: transparent;\n }\n .easy-form-wizard-step.active {\n border-bottom-color: var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n }\n .easy-form-wizard-step.completed {\n border-bottom-color: var(--easy-form-success);\n background: transparent;\n color: var(--easy-form-success);\n }\n .easy-form-array-item {\n border: none;\n border-bottom: 1px solid var(--easy-form-group-border);\n border-radius: 0;\n }\n .easy-form-array-add,\n .easy-form-quantity-btn {\n border-radius: 0;\n border: none;\n border-bottom: 3px solid var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n font-weight: 600;\n padding: 0.5rem 0.75rem;\n }\n .easy-form-array-add:hover,\n .easy-form-quantity-btn:hover:not(.disabled) {\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n }\n .easy-form-array-remove {\n border-radius: 0;\n border: none;\n border-bottom: 3px solid var(--easy-form-error);\n background: transparent;\n color: var(--easy-form-error);\n font-weight: 600;\n padding: 0.5rem 0.75rem;\n }\n .easy-form-array-remove:hover {\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n }\n .easy-form-wizard-prev {\n border-radius: 0;\n border: none;\n border-bottom: 3px solid var(--easy-form-secondary);\n background: transparent;\n color: var(--easy-form-secondary);\n font-weight: 600;\n padding: 0.5rem 0.75rem;\n }\n .easy-form-wizard-next {\n border-radius: 0;\n border: none;\n border-bottom: 3px solid var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n font-weight: 600;\n padding: 0.5rem 0.75rem;\n }\n .easy-form-wizard-prev:hover:not(:disabled),\n .easy-form-wizard-next:hover {\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n }\n .easy-form-error,\n .easy-form-description {\n background: none;\n border: none;\n padding: 0;\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getShadcnStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 0.75rem;\n letter-spacing: -0.01em;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 1.5px solid var(--easy-form-border);\n border-radius: 8px;\n padding: 0.75rem 1rem;\n background: linear-gradient(to bottom, var(--easy-form-background), var(--easy-form-group-background));\n color: var(--easy-form-text);\n font-size: 0.875rem;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), inset 0 1px 1px rgba(255, 255, 255, 0.8);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-color: color-mix(in srgb, var(--easy-form-border) 80%, black);\n background: linear-gradient(to bottom, var(--easy-form-background), var(--easy-form-group-background));\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08), inset 0 1px 1px rgba(255, 255, 255, 0.9);\n transform: translateY(-1px);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-color: var(--easy-form-primary);\n background: var(--easy-form-background);\n box-shadow: 0 0 0 4px rgba(var(--easy-form-primary-rgb), 0.12), 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.15);\n transform: translateY(-2px);\n }\n .easy-form-submit {\n border-radius: 8px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, color-mix(in srgb, var(--easy-form-primary) 75%, black) 100%);\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.3), 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n letter-spacing: 0.01em;\n }\n .easy-form-submit:hover {\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.4), 0 4px 8px rgba(0, 0, 0, 0.15);\n transform: translateY(-2px);\n background: linear-gradient(135deg, color-mix(in srgb, var(--easy-form-primary) 75%, black) 0%, var(--easy-form-primary) 100%);\n }\n .easy-form-submit:active {\n transform: translateY(0);\n box-shadow: 0 2px 8px rgba(var(--easy-form-primary-rgb), 0.3);\n }\n .easy-form-group {\n border: 1.5px solid var(--easy-form-group-border);\n border-radius: 12px;\n background: var(--easy-form-group-background);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n padding: 1.5rem;\n }\n .easy-form-wizard-step {\n border: 1.5px solid var(--easy-form-border);\n border-radius: 8px;\n background: linear-gradient(to bottom, var(--easy-form-background), var(--easy-form-group-background));\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-step:hover {\n border-color: color-mix(in srgb, var(--easy-form-border) 80%, black);\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n }\n .easy-form-wizard-step.active {\n border-color: var(--easy-form-primary);\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, color-mix(in srgb, var(--easy-form-primary) 75%, black) 100%);\n color: white;\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.4);\n transform: translateY(-2px);\n }\n .easy-form-array-item {\n border: 1.5px solid var(--easy-form-border);\n border-radius: 8px;\n background: var(--easy-form-group-background);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n }\n .easy-form-array-add,\n .easy-form-quantity-btn {\n border-radius: 8px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, color-mix(in srgb, var(--easy-form-primary) 75%, black) 100%);\n border: 1.5px solid color-mix(in srgb, var(--easy-form-primary) 85%, black);\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.3), 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-array-add:hover,\n .easy-form-quantity-btn:hover:not(.disabled) {\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.4), 0 4px 8px rgba(0, 0, 0, 0.15);\n transform: translateY(-2px);\n background: linear-gradient(135deg, color-mix(in srgb, var(--easy-form-primary) 75%, black) 0%, var(--easy-form-primary) 100%);\n }\n .easy-form-array-remove {\n border-radius: 8px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-error) 0%, color-mix(in srgb, var(--easy-form-error) 75%, black) 100%);\n border: 1.5px solid color-mix(in srgb, var(--easy-form-error) 85%, black);\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.2), 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-array-remove:hover {\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.3), 0 4px 8px rgba(0, 0, 0, 0.15);\n transform: translateY(-2px);\n }\n .easy-form-wizard-prev {\n border-radius: 8px;\n font-weight: 600;\n background: linear-gradient(to bottom, var(--easy-form-background), var(--easy-form-group-background));\n border: 1.5px solid var(--easy-form-border);\n color: var(--easy-form-text);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-next {\n border-radius: 8px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, color-mix(in srgb, var(--easy-form-primary) 75%, black) 100%);\n border: 1.5px solid color-mix(in srgb, var(--easy-form-primary) 85%, black);\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.3), 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-prev:hover:not(:disabled) {\n border-color: color-mix(in srgb, var(--easy-form-border) 80%, black);\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n }\n .easy-form-wizard-next:hover {\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.4), 0 4px 8px rgba(0, 0, 0, 0.15);\n transform: translateY(-2px);\n background: linear-gradient(135deg, color-mix(in srgb, var(--easy-form-primary) 75%, black) 0%, var(--easy-form-primary) 100%);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getChakraStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 0.5rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-size: 0.75rem;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 2px solid var(--easy-form-border);\n border-radius: 6px;\n padding: 0.625rem 0.875rem;\n background: var(--easy-form-background);\n color: var(--easy-form-text);\n font-size: 0.875rem;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n font-weight: 500;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-color: var(--easy-form-primary);\n background: var(--easy-form-group-background);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.1);\n transform: scale(1.02);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-color: var(--easy-form-primary);\n border-width: 2px;\n background: var(--easy-form-background);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.2), 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.15);\n transform: scale(1.02);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):disabled, textarea:disabled, select:disabled {\n background: var(--easy-form-group-background);\n border-color: var(--easy-form-border);\n cursor: not-allowed;\n opacity: 0.6;\n }\n .easy-form-submit {\n border-radius: 6px;\n font-weight: 600;\n background: var(--easy-form-primary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-size: 0.875rem;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 4px 6px rgba(var(--easy-form-primary-rgb), 0.25);\n }\n .easy-form-submit:hover {\n background: color-mix(in srgb, var(--easy-form-primary) 75%, black);\n box-shadow: 0 6px 12px rgba(var(--easy-form-primary-rgb), 0.35);\n transform: translateY(-2px) scale(1.02);\n }\n .easy-form-submit:active {\n transform: translateY(0) scale(0.98);\n }\n .easy-form-submit:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n transform: none;\n }\n .easy-form-group {\n border: 2px solid var(--easy-form-group-border);\n border-radius: 8px;\n background: var(--easy-form-group-background);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n .easy-form-wizard-step {\n border: 2px solid var(--easy-form-border);\n border-radius: 6px;\n background: var(--easy-form-background);\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-step:hover {\n border-color: var(--easy-form-primary);\n transform: scale(1.05);\n }\n .easy-form-wizard-step.active {\n border-color: var(--easy-form-primary);\n background: var(--easy-form-primary);\n color: white;\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.3);\n transform: scale(1.05);\n }\n .easy-form-array-item {\n border: 2px solid var(--easy-form-border);\n border-radius: 6px;\n background: var(--easy-form-background);\n transition: all 0.25s ease;\n }\n .easy-form-array-item:hover {\n border-color: var(--easy-form-group-border);\n box-shadow: 0 2px 8px rgba(var(--easy-form-primary-rgb), 0.15);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getMantineStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 0.625rem;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 1px solid var(--easy-form-border);\n border-radius: 12px;\n padding: 0.875rem 1.25rem;\n background: var(--easy-form-background);\n color: var(--easy-form-text);\n font-size: 0.875rem;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.8);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-color: color-mix(in srgb, var(--easy-form-border) 70%, black);\n background: linear-gradient(to bottom, var(--easy-form-background), var(--easy-form-group-background));\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.9);\n transform: translateY(-2px);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-color: var(--easy-form-primary);\n background: var(--easy-form-background);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.15), 0 6px 16px rgba(var(--easy-form-primary-rgb), 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.9);\n transform: translateY(-3px);\n }\n .easy-form-submit {\n border-radius: 12px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, color-mix(in srgb, var(--easy-form-primary) 75%, black) 100%);\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.3), 0 2px 4px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-submit:hover {\n box-shadow: 0 8px 20px rgba(var(--easy-form-primary-rgb), 0.4), 0 4px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.3);\n transform: translateY(-3px) scale(1.02);\n }\n .easy-form-submit:active {\n transform: translateY(-1px) scale(0.98);\n box-shadow: 0 2px 8px rgba(var(--easy-form-primary-rgb), 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.2);\n }\n .easy-form-group {\n border: 1px solid var(--easy-form-group-border);\n border-radius: 16px;\n background: var(--easy-form-group-background);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.8);\n padding: 1.5rem;\n }\n .easy-form-wizard-step {\n border: 1px solid var(--easy-form-border);\n border-radius: 12px;\n background: var(--easy-form-background);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n }\n .easy-form-wizard-step:hover {\n background: linear-gradient(to bottom, var(--easy-form-background), var(--easy-form-group-background));\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n transform: translateY(-2px);\n }\n .easy-form-wizard-step.active {\n border-color: var(--easy-form-primary);\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, color-mix(in srgb, var(--easy-form-primary) 75%, black) 100%);\n color: white;\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.2);\n transform: translateY(-3px) scale(1.05);\n }\n .easy-form-array-item {\n border: 1px solid var(--easy-form-group-border);\n border-radius: 12px;\n background: var(--easy-form-group-background);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06), inset 0 1px 0 rgba(255, 255, 255, 0.8);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getGlassStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 0.75rem;\n text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 2px solid rgba(255, 255, 255, 0.4);\n border-radius: 16px;\n padding: 0.875rem 1.25rem;\n background: rgba(255, 255, 255, 0.15);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n font-size: 0.875rem;\n color: var(--easy-form-text);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.1);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"])::placeholder, textarea::placeholder, select::placeholder {\n color: rgba(255, 255, 255, 0.6);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-color: rgba(255, 255, 255, 0.6);\n background: rgba(255, 255, 255, 0.25);\n box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 20px rgba(255, 255, 255, 0.1);\n transform: translateY(-2px);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-color: rgba(255, 255, 255, 0.8);\n background: rgba(255, 255, 255, 0.3);\n box-shadow: 0 0 0 4px rgba(var(--easy-form-primary-rgb), 0.3), 0 16px 32px rgba(var(--easy-form-primary-rgb), 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 0 30px rgba(var(--easy-form-primary-rgb), 0.2);\n transform: translateY(-3px) scale(1.02);\n }\n .easy-form-submit {\n border-radius: 16px;\n font-weight: 600;\n background: rgba(255, 255, 255, 0.2);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n border: 2px solid rgba(255, 255, 255, 0.4);\n color: var(--easy-form-text);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3), 0 0 20px rgba(255, 255, 255, 0.1);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-submit:hover {\n background: rgba(255, 255, 255, 0.3);\n border-color: rgba(255, 255, 255, 0.6);\n box-shadow: 0 12px 32px rgba(var(--easy-form-primary-rgb), 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 0 40px rgba(var(--easy-form-primary-rgb), 0.3);\n transform: translateY(-3px) scale(1.05);\n }\n .easy-form-submit:active {\n transform: translateY(-1px) scale(0.98);\n }\n .easy-form-group {\n border: 2px solid var(--easy-form-group-border);\n border-radius: 20px;\n background: var(--easy-form-group-background);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n box-shadow: 0 16px 32px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3);\n padding: 2rem;\n }\n .easy-form-wizard-step {\n border: 2px solid rgba(255, 255, 255, 0.4);\n border-radius: 16px;\n background: rgba(255, 255, 255, 0.15);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--easy-form-text);\n }\n .easy-form-wizard-step:hover {\n background: rgba(255, 255, 255, 0.25);\n box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3), 0 0 20px rgba(255, 255, 255, 0.1);\n transform: translateY(-2px);\n }\n .easy-form-wizard-step.active {\n border-color: rgba(255, 255, 255, 0.8);\n background: rgba(var(--easy-form-primary-rgb), 0.3);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.4), 0 16px 32px rgba(var(--easy-form-primary-rgb), 0.3), 0 0 40px rgba(var(--easy-form-primary-rgb), 0.2);\n transform: translateY(-3px) scale(1.05);\n }\n .easy-form-array-item {\n border: 2px solid rgba(255, 255, 255, 0.4);\n border-radius: 16px;\n background: rgba(255, 255, 255, 0.15);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.3);\n }\n .easy-form-array-add,\n .easy-form-quantity-btn {\n border-radius: 16px;\n font-weight: 600;\n background: rgba(255, 255, 255, 0.2);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n border: 2px solid rgba(255, 255, 255, 0.4);\n color: var(--easy-form-text);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3), 0 0 20px rgba(255, 255, 255, 0.1);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-array-add:hover,\n .easy-form-quantity-btn:hover:not(.disabled) {\n background: rgba(255, 255, 255, 0.3);\n border-color: rgba(255, 255, 255, 0.6);\n box-shadow: 0 12px 32px rgba(var(--easy-form-primary-rgb), 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 0 40px rgba(var(--easy-form-primary-rgb), 0.3);\n transform: translateY(-3px) scale(1.05);\n }\n .easy-form-array-remove {\n border-radius: 16px;\n font-weight: 600;\n background: rgba(255, 255, 255, 0.2);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n border: 2px solid rgba(255, 255, 255, 0.4);\n color: var(--easy-form-error);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-array-remove:hover {\n background: rgba(255, 255, 255, 0.3);\n border-color: rgba(255, 255, 255, 0.6);\n box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3), 0 0 20px rgba(255, 255, 255, 0.1);\n transform: translateY(-2px);\n }\n .easy-form-wizard-prev,\n .easy-form-wizard-next {\n border-radius: 16px;\n font-weight: 600;\n background: rgba(255, 255, 255, 0.2);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n border: 2px solid rgba(255, 255, 255, 0.4);\n color: var(--easy-form-text);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3), 0 0 20px rgba(255, 255, 255, 0.1);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-prev:hover:not(:disabled),\n .easy-form-wizard-next:hover {\n background: rgba(255, 255, 255, 0.3);\n border-color: rgba(255, 255, 255, 0.6);\n box-shadow: 0 12px 32px rgba(var(--easy-form-primary-rgb), 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 0 40px rgba(var(--easy-form-primary-rgb), 0.3);\n transform: translateY(-3px) scale(1.05);\n }\n .easy-form-wizard-next {\n background: rgba(var(--easy-form-primary-rgb), 0.25);\n }\n .easy-form-wizard-next:hover {\n background: rgba(var(--easy-form-primary-rgb), 0.35);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getBorderedStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.875rem;\n font-weight: 700;\n margin-bottom: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 3px solid var(--easy-form-text);\n border-radius: 0;\n padding: 0.875rem 1.25rem;\n background: var(--easy-form-background);\n color: var(--easy-form-text);\n font-size: 0.875rem;\n font-weight: 600;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1), inset 0 2px 4px rgba(0, 0, 0, 0.05);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-color: var(--easy-form-primary);\n box-shadow: 6px 6px 0 rgba(var(--easy-form-primary-rgb), 0.2), inset 0 2px 4px rgba(0, 0, 0, 0.05);\n transform: translate(-2px, -2px);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-color: var(--easy-form-primary);\n border-width: 4px;\n box-shadow: 8px 8px 0 rgba(var(--easy-form-primary-rgb), 0.3), inset 0 2px 4px rgba(0, 0, 0, 0.05), 0 0 0 4px rgba(var(--easy-form-primary-rgb), 0.1);\n transform: translate(-4px, -4px);\n }\n .easy-form-submit {\n border-radius: 0;\n font-weight: 700;\n border: 4px solid var(--easy-form-text);\n background: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n text-transform: uppercase;\n letter-spacing: 0.1em;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 6px 6px 0 rgba(0, 0, 0, 0.2);\n }\n .easy-form-submit:hover {\n background: color-mix(in srgb, var(--easy-form-primary) 75%, black);\n box-shadow: 8px 8px 0 rgba(0, 0, 0, 0.3);\n transform: translate(-2px, -2px);\n }\n .easy-form-submit:active {\n transform: translate(0, 0);\n box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.2);\n }\n .easy-form-group {\n border: 4px solid var(--easy-form-group-border);\n border-radius: 0;\n background: var(--easy-form-group-background);\n box-shadow: 8px 8px 0 rgba(0, 0, 0, 0.1);\n padding: 2rem;\n }\n .easy-form-wizard-step {\n border: 3px solid var(--easy-form-text);\n border-radius: 0;\n background: var(--easy-form-background);\n font-weight: 600;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);\n }\n .easy-form-wizard-step:hover {\n box-shadow: 6px 6px 0 rgba(0, 0, 0, 0.15);\n transform: translate(-2px, -2px);\n }\n .easy-form-wizard-step.active {\n border-color: var(--easy-form-primary);\n border-width: 4px;\n background: var(--easy-form-primary);\n color: white;\n box-shadow: 8px 8px 0 rgba(var(--easy-form-primary-rgb), 0.3);\n transform: translate(-4px, -4px);\n }\n .easy-form-array-item {\n border: 3px solid var(--easy-form-group-border);\n border-radius: 0;\n background: var(--easy-form-group-background);\n box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getMinimalStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.75rem;\n font-weight: 500;\n margin-bottom: 0.5rem;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: none;\n border-bottom: 1px solid var(--easy-form-border);\n border-radius: 0;\n padding: 0.625rem 0;\n background: transparent;\n color: var(--easy-form-text);\n font-size: 0.9375rem;\n font-weight: 300;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"])::after, textarea::after, select::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n width: 0;\n height: 2px;\n background: var(--easy-form-primary);\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-bottom-color: color-mix(in srgb, var(--easy-form-border) 75%, black);\n padding-left: 0.5rem;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-bottom-color: var(--easy-form-primary);\n border-bottom-width: 2px;\n padding-bottom: calc(0.625rem - 1px);\n padding-left: 0;\n background: linear-gradient(to bottom, transparent 98%, rgba(var(--easy-form-primary-rgb), 0.05) 100%);\n }\n .easy-form-submit {\n border-radius: 0;\n font-weight: 300;\n border: none;\n border-bottom: 2px solid var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n padding: 0.75rem 0;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n text-transform: uppercase;\n letter-spacing: 0.2em;\n font-size: 0.75rem;\n position: relative;\n overflow: hidden;\n }\n .easy-form-submit::before {\n content: '';\n position: absolute;\n bottom: 0;\n left: -100%;\n width: 100%;\n height: 2px;\n background: var(--easy-form-primary);\n transition: left 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-submit:hover {\n background: linear-gradient(to bottom, rgba(var(--easy-form-primary-rgb), 0.03), transparent);\n padding-left: 1rem;\n }\n .easy-form-submit:hover::before {\n left: 0;\n }\n .easy-form-group {\n border: none;\n border-bottom: 1px solid var(--easy-form-group-border);\n border-radius: 0;\n background: transparent;\n padding-bottom: 2rem;\n margin-bottom: 2rem;\n }\n .easy-form-wizard-step {\n border: none;\n border-bottom: 2px solid var(--easy-form-border);\n border-radius: 0;\n background: transparent;\n font-weight: 300;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n font-size: 0.75rem;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n }\n .easy-form-wizard-step::after {\n content: '';\n position: absolute;\n bottom: -2px;\n left: 0;\n width: 0;\n height: 2px;\n background: var(--easy-form-primary);\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-step:hover {\n color: var(--easy-form-primary);\n padding-left: 0.5rem;\n }\n .easy-form-wizard-step:hover::after {\n width: 100%;\n }\n .easy-form-wizard-step.active {\n border-bottom-color: var(--easy-form-primary);\n color: var(--easy-form-primary);\n font-weight: 500;\n }\n .easy-form-wizard-step.active::after {\n width: 100%;\n }\n .easy-form-array-item {\n border: none;\n border-bottom: 1px solid var(--easy-form-group-border);\n border-radius: 0;\n background: transparent;\n padding-bottom: 1.5rem;\n margin-bottom: 1.5rem;\n }\n .easy-form-array-add,\n .easy-form-quantity-btn {\n border-radius: 0;\n font-weight: 300;\n border: none;\n border-bottom: 2px solid var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n padding: 0.5rem 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n font-size: 0.75rem;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-array-add:hover,\n .easy-form-quantity-btn:hover:not(.disabled) {\n background: linear-gradient(to bottom, rgba(var(--easy-form-primary-rgb), 0.03), transparent);\n padding-left: 1rem;\n }\n .easy-form-array-remove {\n border-radius: 0;\n font-weight: 300;\n border: none;\n border-bottom: 2px solid var(--easy-form-error);\n background: transparent;\n color: var(--easy-form-error);\n padding: 0.5rem 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n font-size: 0.75rem;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-array-remove:hover {\n background: linear-gradient(to bottom, rgba(var(--easy-form-primary-rgb), 0.03), transparent);\n padding-left: 1rem;\n }\n .easy-form-wizard-prev {\n border-radius: 0;\n font-weight: 300;\n border: none;\n border-bottom: 2px solid var(--easy-form-secondary);\n background: transparent;\n color: var(--easy-form-secondary);\n padding: 0.5rem 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n font-size:rem;\n transition 0.75: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-next {\n border-radius: 0;\n font-weight: 300;\n border: none;\n border-bottom: 2px solid var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n padding: 0.5rem 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n font-size: 0.75rem;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-prev:hover:not(:disabled),\n .easy-form-wizard-next:hover {\n background: linear-gradient(to bottom, rgba(var(--easy-form-primary-rgb), 0.03), transparent);\n padding-left: 1rem;\n }\n .easy-form-error,\n .easy-form-description {\n background: none;\n border: none;\n padding: 0;\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getEfcStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 0.75rem;\n letter-spacing: 0.025em;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 1px solid rgba(var(--easy-form-primary-rgb), 0.2);\n border-radius: 12px;\n padding: 0.875rem 1rem;\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n font-size: 0.9rem;\n color: var(--easy-form-text);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"])::placeholder, textarea::placeholder, select::placeholder {\n color: var(--easy-form-label-color);\n opacity: 0.5;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-color: rgba(var(--easy-form-primary-rgb), 0.4);\n background: rgba(var(--easy-form-primary-rgb), 0.08);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-color: rgba(var(--easy-form-primary-rgb), 0.5);\n background: rgba(var(--easy-form-primary-rgb), 0.1);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.15);\n }\n .easy-form-submit {\n border-radius: 12px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, var(--easy-form-primary) 100%);\n border: none;\n color: white;\n padding: 0.875rem 1.5rem;\n box-shadow: 0 4px 14px rgba(var(--easy-form-primary-rgb), 0.35);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: pointer;\n }\n .easy-form-submit:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.45);\n }\n .easy-form-submit:active {\n transform: translateY(0);\n box-shadow: 0 2px 8px rgba(var(--easy-form-primary-rgb), 0.3);\n }\n .easy-form-group {\n border: 1px solid rgba(var(--easy-form-primary-rgb), 0.2);\n border-radius: 16px;\n background: rgba(var(--easy-form-primary-rgb), 0.03);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n padding: 1.5rem;\n transition: all 0.3s ease;\n }\n .easy-form-group:hover {\n border-color: rgba(var(--easy-form-primary-rgb), 0.3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n }\n .easy-form-group-label {\n color: var(--easy-form-group-title);\n font-weight: 700;\n font-size: 1.1rem;\n }\n .easy-form-wizard-step {\n border: 1px solid rgba(var(--easy-form-primary-rgb), 0.2);\n border-radius: 10px;\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--easy-form-text);\n padding: 0.75rem 1.25rem;\n }\n .easy-form-wizard-step:hover {\n background: rgba(var(--easy-form-primary-rgb), 0.1);\n border-color: rgba(var(--easy-form-primary-rgb), 0.4);\n transform: translateY(-2px);\n }\n .easy-form-wizard-step.active {\n border-color: var(--easy-form-primary);\n background: linear-gradient(135deg, rgba(var(--easy-form-primary-rgb), 0.2) 0%, rgba(var(--easy-form-primary-rgb), 0.1) 100%);\n font-weight: 600;\n }\n .easy-form-array-item {\n border: 1px solid rgba(var(--easy-form-primary-rgb), 0.15);\n border-radius: 12px;\n background: rgba(var(--easy-form-primary-rgb), 0.03);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n padding: 1rem;\n transition: all 0.3s ease;\n }\n .easy-form-array-item:hover {\n border-color: rgba(var(--easy-form-primary-rgb), 0.25);\n }\n .easy-form-array-add,\n .easy-form-quantity-btn {\n border-radius: 10px;\n font-weight: 600;\n border: 1px solid rgba(var(--easy-form-primary-rgb), 0.2);\n background: rgba(var(--easy-form-primary-rgb), 0.1);\n color: var(--easy-form-primary);\n padding: 0.5rem 1rem;\n font-size: 0.85rem;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: pointer;\n }\n .easy-form-array-add:hover,\n .easy-form-quantity-btn:hover:not(.disabled) {\n background: rgba(var(--easy-form-primary-rgb), 0.2);\n border-color: rgba(var(--easy-form-primary-rgb), 0.4);\n transform: translateY(-1px);\n }\n .easy-form-array-remove {\n border-radius: 10px;\n font-weight: 600;\n border: 1px solid rgba(var(--easy-form-error-rgb), 0.2);\n background: rgba(var(--easy-form-error-rgb), 0.1);\n color: var(--easy-form-error);\n padding: 0.5rem 1rem;\n font-size: 0.85rem;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: pointer;\n }\n .easy-form-array-remove:hover {\n background: rgba(var(--easy-form-error-rgb), 0.2);\n border-color: rgba(var(--easy-form-error-rgb), 0.4);\n transform: translateY(-1px);\n }\n .easy-form-wizard-prev {\n border-radius: 10px;\n font-weight: 600;\n border: 1px solid rgba(var(--easy-form-primary-rgb), 0.2);\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n color: var(--easy-form-primary);\n padding: 0.75rem 1.25rem;\n font-size: 0.9rem;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: pointer;\n }\n .easy-form-wizard-next {\n border-radius: 10px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, var(--easy-form-primary) 100%);\n border: none;\n color: white;\n padding: 0.75rem 1.25rem;\n font-size: 0.9rem;\n box-shadow: 0 4px 14px rgba(var(--easy-form-primary-rgb), 0.35);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: pointer;\n }\n .easy-form-wizard-prev:hover:not(:disabled) {\n background: rgba(var(--easy-form-primary-rgb), 0.1);\n border-color: rgba(var(--easy-form-primary-rgb), 0.4);\n }\n .easy-form-wizard-next:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.45);\n }\n .easy-form-error {\n background: rgba(var(--easy-form-error-rgb), 0.1);\n border: 1px solid rgba(var(--easy-form-error-rgb), 0.2);\n border-radius: 8px;\n padding: 0.5rem 0.75rem;\n color: var(--easy-form-error);\n font-size: 0.85rem;\n }\n .easy-form-description {\n color: var(--easy-form-label-color);\n opacity: 0.7;\n font-size: 0.85rem;\n }\n .easy-form-checkbox-wrapper,\n .easy-form-radio-wrapper {\n gap: 0.75rem;\n }\n input[type=\"checkbox\"],\n input[type=\"radio\"] {\n accent-color: var(--easy-form-primary);\n width: 1.1rem;\n height: 1.1rem;\n }\n select {\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236366f1' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 1rem center;\n padding-right: 2.5rem;\n }\n `\n}\n","import type { FormTheme, FormColors } from '../../types'\nimport { getColors, getBaseStyles } from './base'\nimport { getPlanoStyles } from './plano'\nimport { getTradicionalStyles } from './tradicional'\nimport { getMaterialStyles } from './material'\nimport { getRoundedShadowStyles } from './rounded-shadow'\nimport { getLinesStyles } from './lines'\nimport { getShadcnStyles } from './shadcn'\nimport { getChakraStyles } from './chakra'\nimport { getMantineStyles } from './mantine'\nimport { getGlassStyles } from './glass'\nimport { getBorderedStyles } from './bordered'\nimport { getMinimalStyles } from './minimal'\nimport { getEfcStyles } from './efc'\n\nexport function getThemeStyles(theme: FormTheme, colors: Required<FormColors>): string {\n const baseStyles = getBaseStyles(colors)\n const themeStyles = getThemeSpecificStyles(theme, colors)\n return baseStyles + themeStyles\n}\n\nexport function getThemeSpecificStyles(theme: FormTheme, colors: Required<FormColors>): string {\n switch (theme) {\n case 'plano':\n return getPlanoStyles(colors)\n case 'tradicional':\n return getTradicionalStyles(colors)\n case 'material':\n return getMaterialStyles(colors)\n case 'rounded-shadow':\n return getRoundedShadowStyles(colors)\n case 'lines':\n return getLinesStyles(colors)\n case 'shadcn':\n return getShadcnStyles(colors)\n case 'chakra':\n return getChakraStyles(colors)\n case 'mantine':\n return getMantineStyles(colors)\n case 'glass':\n return getGlassStyles(colors)\n case 'bordered':\n return getBorderedStyles(colors)\n case 'minimal':\n return getMinimalStyles(colors)\n case 'efc':\n return getEfcStyles(colors)\n default:\n return getPlanoStyles(colors)\n }\n}\n\nexport { getColors, getBaseStyles }\nexport type { FormTheme, FormColors }\n","import type { PredefinedMask, CustomMask } from '../types'\n\n/**\n * Máscaras predefinidas\n */\nexport const PREDEFINED_MASKS: Record<PredefinedMask, CustomMask> = {\n 'phone': {\n pattern: '(999) 999-9999',\n placeholder: '_',\n },\n 'phone-us': {\n pattern: '(999) 999-9999',\n placeholder: '_',\n },\n 'phone-international': {\n pattern: '+99 999 999 9999',\n placeholder: '_',\n },\n 'date': {\n pattern: '99/99/9999',\n placeholder: '_',\n },\n 'date-us': {\n pattern: '99/99/9999',\n placeholder: '_',\n },\n 'date-eu': {\n pattern: '99-99-9999',\n placeholder: '_',\n },\n 'credit-card': {\n pattern: '9999 9999 9999 9999',\n placeholder: '_',\n },\n 'ssn': {\n pattern: '999-99-9999',\n placeholder: '_',\n },\n 'zip-code': {\n pattern: '99999',\n placeholder: '_',\n },\n 'currency': {\n pattern: '$999,999.99',\n placeholder: '_',\n transform: (value: string) => {\n // Remover caracteres no numéricos excepto punto decimal\n const cleaned = value.replace(/[^\\d.]/g, '')\n const num = parseFloat(cleaned) || 0\n return num.toFixed(2)\n },\n },\n 'percentage': {\n pattern: '999%',\n placeholder: '_',\n transform: (value: string) => {\n const cleaned = value.replace(/[^\\d]/g, '')\n return cleaned\n },\n },\n 'time': {\n pattern: '99:99',\n placeholder: '_',\n },\n 'datetime': {\n pattern: '99/99/9999 99:99',\n placeholder: '_',\n },\n}\n\n/**\n * Obtiene una máscara predefinida\n */\nexport function getPredefinedMask(type: PredefinedMask): CustomMask {\n return PREDEFINED_MASKS[type]\n}\n","/**\n * Validación contra patrones de inyección (SQL, XSS, command injection, etc.)\n */\n\n/** Mensaje de error por defecto para validación de inyección */\nexport const INJECTION_VALIDATION_MESSAGE =\n 'El valor contiene caracteres o patrones no permitidos'\n\n/** Patrones de inyección (regex, case-insensitive) */\nconst INJECTION_PATTERNS: RegExp[] = [\n // SQL Injection\n /\\b(union|select|insert|update|delete|drop|exec|execute|declare)\\s+(all\\s+)?(select|from|into|table)/i,\n /\\b(or|and)\\s+['\"]?\\d+['\"]?\\s*=\\s*['\"]?\\d+/i,\n /;\\s*(drop|delete|truncate|alter)\\s+/i,\n /--\\s*$/, // SQL comment\n /\\/\\*[\\s\\S]*\\*\\//, // Block comment\n /'\\s*or\\s+'1'\\s*=\\s*'1/i,\n /\"\\s*or\\s+\"1\"\\s*=\\s*\"1/i,\n /\\bexec\\s*\\(/i,\n /\\bxp_\\w+/i, // SQL Server extended procedures\n\n // XSS / Scripting\n /<script\\b[\\s\\S]*?>[\\s\\S]*?<\\/script>/i,\n /<script\\b/i,\n /javascript\\s*:/i,\n /vbscript\\s*:/i,\n /on\\w+\\s*=\\s*[\"'][^\"']*[\"']/i, // onclick=, onerror=, onload=, etc.\n /on\\w+\\s*=\\s*[^\\s>]+/i,\n /<iframe\\b/i,\n /<object\\b/i,\n /<embed\\b/i,\n /\\beval\\s*\\(/i,\n /document\\.(cookie|write|location)/i,\n /window\\.(location|open|eval)/i,\n\n // Command injection (shell)\n /[;&|]\\s*(ls|cat|rm|wget|curl|nc|bash|sh|python|perl)\\s/i,\n /\\$\\s*\\([^)]+\\)/, // $(...)\n /`[^`]+`/, // Backtick command substitution\n /\\|\\s*\\w+/, // Pipe to command (with word after)\n\n // NoSQL / Template injection\n /\\$\\s*where\\b/i,\n /\\$\\s*gt\\b|\\$\\s*ne\\b|\\$\\s*regex\\b/i,\n /\\{\\{[^}]*\\}\\}/, // Template literals\n /\\$\\{[^}]*\\}/, // JS template literals\n]\n\n/**\n * Verifica si un valor string contiene patrones de inyección\n */\nexport function containsInjection(value: string): boolean {\n if (typeof value !== 'string' || value.length === 0) {\n return false\n }\n const normalized = value.trim()\n if (normalized.length === 0) return false\n\n for (const pattern of INJECTION_PATTERNS) {\n if (pattern.test(value)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Valida recursivamente un valor (string, array de strings, objetos con strings)\n * Retorna true si NO contiene inyección (válido), false si contiene (inválido)\n */\nexport function isSafeFromInjection(value: unknown): boolean {\n if (value === null || value === undefined) {\n return true\n }\n if (typeof value === 'string') {\n return !containsInjection(value)\n }\n if (Array.isArray(value)) {\n return value.every((item) => isSafeFromInjection(item))\n }\n if (typeof value === 'object') {\n return Object.values(value as Record<string, unknown>).every((v) =>\n isSafeFromInjection(v)\n )\n }\n // number, boolean, etc. - no aplica validación\n return true\n}\n","/**\n * Utilidad para bloquear formularios después de N intentos fallidos\n */\n\nexport interface AttemptsLockOptions {\n maxAttempts: number\n blockDurationMinutes?: number\n storageKey?: string\n onLocked?: (remainingMs: number) => void\n onUnlocked?: () => void\n}\n\ninterface StoredLockState {\n attempts: number\n lockedUntil?: number\n}\n\nexport class AttemptsLock {\n private maxAttempts: number\n private blockDurationMs: number\n private storageKey?: string\n private attempts: number = 0\n private lockedUntil: number | null = null\n private onLocked?: (remainingMs: number) => void\n private onUnlocked?: () => void\n private unlockCheckInterval: ReturnType<typeof setInterval> | null = null\n\n constructor(options: AttemptsLockOptions) {\n this.maxAttempts = Math.max(1, options.maxAttempts)\n this.blockDurationMs =\n (options.blockDurationMinutes ?? 5) * 60 * 1000\n this.storageKey = options.storageKey\n this.onLocked = options.onLocked\n this.onUnlocked = options.onUnlocked\n\n if (this.storageKey && typeof sessionStorage !== 'undefined') {\n this.loadFromStorage()\n }\n }\n\n private loadFromStorage(): void {\n if (!this.storageKey || typeof sessionStorage === 'undefined') return\n try {\n const stored = sessionStorage.getItem(this.storageKey)\n if (stored) {\n const data: StoredLockState = JSON.parse(stored)\n this.attempts = data.attempts ?? 0\n this.lockedUntil = data.lockedUntil ?? null\n this.checkExpiration()\n }\n } catch {\n // Ignorar errores de parsing\n }\n }\n\n private saveToStorage(): void {\n if (!this.storageKey || typeof sessionStorage === 'undefined') return\n try {\n const data: StoredLockState = {\n attempts: this.attempts,\n lockedUntil: this.lockedUntil ?? undefined,\n }\n sessionStorage.setItem(this.storageKey, JSON.stringify(data))\n } catch {\n // Ignorar errores\n }\n }\n\n private checkExpiration(): boolean {\n if (this.lockedUntil === null) return false\n if (Date.now() >= this.lockedUntil) {\n this.reset()\n this.onUnlocked?.()\n return true\n }\n return false\n }\n\n private startUnlockCheck(): void {\n if (this.unlockCheckInterval) return\n this.unlockCheckInterval = setInterval(() => {\n if (this.checkExpiration()) {\n this.stopUnlockCheck()\n }\n }, 1000)\n }\n\n private stopUnlockCheck(): void {\n if (this.unlockCheckInterval) {\n clearInterval(this.unlockCheckInterval)\n this.unlockCheckInterval = null\n }\n }\n\n /**\n * Incrementa el contador de intentos. Si alcanza maxAttempts, bloquea.\n */\n incrementAttempts(): void {\n this.attempts++\n if (this.attempts >= this.maxAttempts) {\n this.lockedUntil = Date.now() + this.blockDurationMs\n this.saveToStorage()\n this.onLocked?.(this.blockDurationMs)\n this.startUnlockCheck()\n } else {\n this.saveToStorage()\n }\n }\n\n /**\n * Retorna true si el lock está activo (aún dentro del período de bloqueo)\n */\n isLocked(): boolean {\n if (this.checkExpiration()) return false\n return this.lockedUntil !== null && Date.now() < this.lockedUntil\n }\n\n /**\n * Retorna los milisegundos restantes del bloqueo, o 0 si no está bloqueado\n */\n getRemainingBlockTimeMs(): number {\n if (this.checkExpiration()) return 0\n if (this.lockedUntil === null) return 0\n return Math.max(0, this.lockedUntil - Date.now())\n }\n\n /**\n * Resetea el contador de intentos y el bloqueo\n */\n reset(): void {\n this.attempts = 0\n this.lockedUntil = null\n this.stopUnlockCheck()\n this.saveToStorage()\n }\n\n /**\n * Retorna el número actual de intentos\n */\n getAttempts(): number {\n return this.attempts\n }\n}\n","/**\n * Utilidades generales\n */\n\n/**\n * Convierte un valor a string para atributos HTML\n */\nexport function attributeValue(value: any): string {\n if (value === null || value === undefined) {\n return ''\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false'\n }\n if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n return String(value)\n}\n\n/**\n * Parsea un valor desde un atributo HTML\n */\nexport function parseAttributeValue(value: string | null): any {\n if (!value) {\n return null\n }\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\n/**\n * Genera un ID único\n */\nexport function generateId(prefix = 'ef'): string {\n return `${prefix}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/**\n * Obtiene el valor anidado de un objeto usando notación de punto\n */\nexport function getNestedValue(obj: Record<string, any>, path: string): any {\n return path.split('.').reduce((current, key) => current?.[key], obj)\n}\n\n/**\n * Establece un valor anidado en un objeto usando notación de punto\n */\nexport function setNestedValue(\n obj: Record<string, any>,\n path: string,\n value: any\n): void {\n const keys = path.split('.')\n const lastKey = keys.pop()!\n const target = keys.reduce((current, key) => {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {}\n }\n return current[key]\n }, obj)\n target[lastKey] = value\n}\n\n/**\n * Valida si un email es válido\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n/**\n * Sanitiza un string para usar como ID de HTML\n */\nexport function sanitizeId(str: string): string {\n return str.replace(/[^a-zA-Z0-9-_]/g, '-')\n}\n\n// Exportar funciones de estilos\nexport { getThemeStyles, getColors } from './styles'\n\n// Exportar máscaras\nexport { PREDEFINED_MASKS, getPredefinedMask } from './masks'\n\n// Exportar validación anti-inyección\nexport {\n containsInjection,\n isSafeFromInjection,\n INJECTION_VALIDATION_MESSAGE,\n} from './injection-validation'\n\n// Exportar AttemptsLock\nexport { AttemptsLock } from './attempts-lock'\nexport type { AttemptsLockOptions } from './attempts-lock'\n","import type {\n FieldCondition,\n FieldDependencies,\n ConditionOperator,\n} from '../types'\n\n/**\n * Motor de evaluación de condiciones\n */\nexport class ConditionEngine {\n /**\n * Evalúa una condición individual\n */\n evaluateCondition(\n condition: FieldCondition,\n formValues: Record<string, any>\n ): boolean {\n const fieldValue = this.getFieldValue(condition.field, formValues)\n return this.compareValues(fieldValue, condition.operator, condition.value)\n }\n\n /**\n * Evalúa múltiples condiciones (AND por defecto, soportar OR)\n */\n evaluateConditions(\n conditions: FieldCondition | FieldCondition[],\n formValues: Record<string, any>,\n logic: 'and' | 'or' = 'and'\n ): boolean {\n const conditionsArray = Array.isArray(conditions) ? conditions : [conditions]\n\n if (conditionsArray.length === 0) {\n return true\n }\n\n if (logic === 'and') {\n return conditionsArray.every((condition) =>\n this.evaluateCondition(condition, formValues)\n )\n } else {\n return conditionsArray.some((condition) =>\n this.evaluateCondition(condition, formValues)\n )\n }\n }\n\n /**\n * Evalúa dependencias de un campo\n */\n evaluateDependencies(\n dependencies: FieldDependencies,\n formValues: Record<string, any>\n ): {\n visible: boolean\n enabled: boolean\n required: boolean\n } {\n let visible = true\n let enabled = true\n let required = false\n\n // Evaluar show/hide\n if (dependencies.show) {\n visible = this.evaluateConditions(dependencies.show, formValues)\n }\n if (dependencies.hide) {\n const shouldHide = this.evaluateConditions(dependencies.hide, formValues)\n visible = visible && !shouldHide\n }\n\n // Evaluar enable/disable\n if (dependencies.enable) {\n enabled = this.evaluateConditions(dependencies.enable, formValues)\n }\n if (dependencies.disable) {\n const shouldDisable = this.evaluateConditions(\n dependencies.disable,\n formValues\n )\n enabled = enabled && !shouldDisable\n }\n\n // Evaluar required/optional\n if (dependencies.required) {\n required = this.evaluateConditions(dependencies.required, formValues)\n }\n if (dependencies.optional) {\n const shouldBeOptional = this.evaluateConditions(\n dependencies.optional,\n formValues\n )\n required = required && !shouldBeOptional\n }\n\n return { visible, enabled, required }\n }\n\n /**\n * Obtiene el valor de un campo (soporta nested paths y claves con puntos)\n */\n private getFieldValue(\n fieldName: string,\n formValues: Record<string, any>\n ): any {\n // Primero intentar buscar por la clave exacta (incluyendo puntos)\n // Esto maneja el caso de campos con nombres como 'profile.type' que coexisten\n // con objetos anidados como { profile: { type: '...' } }\n if (fieldName in formValues) {\n return formValues[fieldName]\n }\n \n // Luego intentar navegación de objetos anidados\n const parts = fieldName.split('.')\n let value = formValues\n\n for (const part of parts) {\n if (value === null || value === undefined) {\n return null\n }\n value = value[part]\n }\n\n return value\n }\n\n /**\n * Compara valores según el operador\n */\n private compareValues(\n fieldValue: any,\n operator: ConditionOperator,\n compareValue: any\n ): boolean {\n switch (operator) {\n case 'equals':\n return this.deepEqual(fieldValue, compareValue)\n\n case 'notEquals':\n return !this.deepEqual(fieldValue, compareValue)\n\n case 'contains':\n if (Array.isArray(fieldValue)) {\n return fieldValue.includes(compareValue)\n }\n if (typeof fieldValue === 'string') {\n return fieldValue.includes(String(compareValue))\n }\n return false\n\n case 'notContains':\n return !this.compareValues(fieldValue, 'contains', compareValue)\n\n case 'greaterThan':\n return this.toNumber(fieldValue) > this.toNumber(compareValue)\n\n case 'lessThan':\n return this.toNumber(fieldValue) < this.toNumber(compareValue)\n\n case 'greaterThanOrEqual':\n return this.toNumber(fieldValue) >= this.toNumber(compareValue)\n\n case 'lessThanOrEqual':\n return this.toNumber(fieldValue) <= this.toNumber(compareValue)\n\n case 'in':\n if (Array.isArray(compareValue)) {\n return compareValue.includes(fieldValue)\n }\n return false\n\n case 'notIn':\n return !this.compareValues(fieldValue, 'in', compareValue)\n\n case 'isEmpty':\n return (\n fieldValue === null ||\n fieldValue === undefined ||\n fieldValue === '' ||\n (Array.isArray(fieldValue) && fieldValue.length === 0)\n )\n\n case 'isNotEmpty':\n return !this.compareValues(fieldValue, 'isEmpty', compareValue)\n\n case 'regex':\n try {\n const regex =\n typeof compareValue === 'string'\n ? new RegExp(compareValue)\n : compareValue\n return regex.test(String(fieldValue || ''))\n } catch {\n return false\n }\n\n default:\n return false\n }\n }\n\n /**\n * Comparación profunda de valores\n */\n private deepEqual(a: any, b: any): boolean {\n if (a === b) {\n return true\n }\n\n if (a === null || b === null || a === undefined || b === undefined) {\n return a === b\n }\n\n if (typeof a !== typeof b) {\n return false\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false\n }\n return a.every((val, index) => this.deepEqual(val, b[index]))\n }\n\n if (typeof a === 'object') {\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) {\n return false\n }\n\n return keysA.every((key) => this.deepEqual(a[key], b[key]))\n }\n\n return false\n }\n\n /**\n * Convierte un valor a número\n */\n private toNumber(value: any): number {\n if (typeof value === 'number') {\n return value\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value)\n return isNaN(parsed) ? 0 : parsed\n }\n return 0\n }\n}\n","import type {\n Validation,\n Field,\n MinLengthValidation,\n MaxLengthValidation,\n MinValidation,\n MaxValidation,\n CustomValidation,\n NoInjectionValidation,\n ArrayField,\n} from '../types'\nimport { isValidEmail } from '../utils'\nimport { isSafeFromInjection, INJECTION_VALIDATION_MESSAGE } from '../utils/injection-validation'\nimport { ConditionEngine } from './condition-engine'\n\n/**\n * Resultado de una validación\n */\nexport interface ValidationResult {\n isValid: boolean\n message?: string\n}\n\n/**\n * Motor de validaciones\n */\nexport class ValidationEngine {\n private conditionEngine: ConditionEngine\n\n constructor() {\n this.conditionEngine = new ConditionEngine()\n }\n /**\n * Valida un campo con todas sus validaciones\n */\n async validateField(\n field: Field,\n value: any\n ): Promise<string[]> {\n return this.validateFieldWithValidations(field, value, field.validations || [])\n }\n\n /**\n * Valida un campo con validaciones específicas\n */\n async validateFieldWithValidations(\n _field: Field,\n value: any,\n validations: Validation[]\n ): Promise<string[]> {\n const errors: string[] = []\n\n if (!validations || validations.length === 0) {\n return errors\n }\n\n for (const validation of validations) {\n const result = await this.validateValue(validation, value)\n if (!result.isValid) {\n errors.push(result.message || this.getDefaultMessage(validation))\n }\n }\n\n return errors\n }\n\n /**\n * Valida un valor con una validación específica\n */\n private async validateValue(\n validation: Validation,\n value: any\n ): Promise<ValidationResult> {\n switch (validation.type) {\n case 'required':\n return this.validateRequired(value)\n case 'email':\n return this.validateEmail(value)\n case 'minLength':\n return this.validateMinLength(value, validation.value)\n case 'maxLength':\n return this.validateMaxLength(value, validation.value)\n case 'min':\n return this.validateMin(value, validation.value)\n case 'max':\n return this.validateMax(value, validation.value)\n case 'pattern':\n return this.validatePattern(value, validation.value)\n case 'custom':\n return await this.validateCustom(value, validation)\n case 'noInjection':\n return this.validateNoInjection(value, validation)\n default:\n return { isValid: true }\n }\n }\n\n /**\n * Valida campo requerido\n */\n private validateRequired(value: any): ValidationResult {\n const isValid =\n value !== null &&\n value !== undefined &&\n value !== '' &&\n !(Array.isArray(value) && value.length === 0)\n return {\n isValid,\n message: isValid ? undefined : 'Este campo es requerido',\n }\n }\n\n /**\n * Valida email\n */\n private validateEmail(value: any): ValidationResult {\n if (!value) {\n return { isValid: true } // Si está vacío, required debe manejarlo\n }\n const isValid = typeof value === 'string' && isValidEmail(value)\n return {\n isValid,\n message: isValid ? undefined : 'Debe ser un email válido',\n }\n }\n\n /**\n * Valida longitud mínima\n */\n private validateMinLength(\n value: any,\n minLength: number\n ): ValidationResult {\n if (!value) {\n return { isValid: true }\n }\n const str = String(value)\n const isValid = str.length >= minLength\n return {\n isValid,\n message: isValid\n ? undefined\n : `Debe tener al menos ${minLength} caracteres`,\n }\n }\n\n /**\n * Valida longitud máxima\n */\n private validateMaxLength(\n value: any,\n maxLength: number\n ): ValidationResult {\n if (!value) {\n return { isValid: true }\n }\n const str = String(value)\n const isValid = str.length <= maxLength\n return {\n isValid,\n message: isValid\n ? undefined\n : `Debe tener máximo ${maxLength} caracteres`,\n }\n }\n\n /**\n * Valida valor mínimo\n */\n private validateMin(value: any, min: number): ValidationResult {\n if (value === null || value === undefined || value === '') {\n return { isValid: true }\n }\n const num = Number(value)\n const isValid = !isNaN(num) && num >= min\n return {\n isValid,\n message: isValid ? undefined : `Debe ser mayor o igual a ${min}`,\n }\n }\n\n /**\n * Valida valor máximo\n */\n private validateMax(value: any, max: number): ValidationResult {\n if (value === null || value === undefined || value === '') {\n return { isValid: true }\n }\n const num = Number(value)\n const isValid = !isNaN(num) && num <= max\n return {\n isValid,\n message: isValid ? undefined : `Debe ser menor o igual a ${max}`,\n }\n }\n\n /**\n * Valida patrón regex\n */\n private validatePattern(value: any, pattern: string | RegExp): ValidationResult {\n if (!value) {\n return { isValid: true }\n }\n \n // Convertir pattern a RegExp si es necesario\n let regex: RegExp\n if (pattern instanceof RegExp) {\n regex = pattern\n } else if (typeof pattern === 'string') {\n try {\n regex = new RegExp(pattern)\n } catch (e) {\n // Si el patrón no es válido, considerar como válido para no bloquear\n console.warn('Invalid regex pattern:', pattern)\n return { isValid: true }\n }\n } else {\n // Si pattern no es string ni RegExp, intentar convertirlo\n console.warn('Pattern validation expects string or RegExp, got:', typeof pattern, pattern)\n return { isValid: true }\n }\n \n const isValid = regex.test(String(value))\n return {\n isValid,\n message: isValid ? undefined : 'El formato no es válido',\n }\n }\n\n /**\n * Valida que el valor no contenga patrones de inyección (SQL, XSS, etc.)\n */\n private validateNoInjection(\n value: any,\n validation: NoInjectionValidation\n ): ValidationResult {\n if (value === null || value === undefined || value === '') {\n return { isValid: true }\n }\n const isValid = isSafeFromInjection(value)\n return {\n isValid,\n message: isValid ? undefined : validation.message || INJECTION_VALIDATION_MESSAGE,\n }\n }\n\n /**\n * Valida con función personalizada\n */\n private async validateCustom(\n value: any,\n validation: CustomValidation\n ): Promise<ValidationResult> {\n try {\n const result = await validation.validator(value)\n return {\n isValid: Boolean(result),\n message: result ? undefined : validation.message || 'Validación fallida',\n }\n } catch (error) {\n return {\n isValid: false,\n message: validation.message || 'Error en la validación',\n }\n }\n }\n\n /**\n * Obtiene mensaje por defecto para una validación\n */\n private getDefaultMessage(validation: Validation): string {\n switch (validation.type) {\n case 'required':\n return 'Este campo es requerido'\n case 'email':\n return 'Debe ser un email válido'\n case 'minLength':\n return `Debe tener al menos ${(validation as MinLengthValidation).value} caracteres`\n case 'maxLength':\n return `Debe tener máximo ${(validation as MaxLengthValidation).value} caracteres`\n case 'min':\n return `Debe ser mayor o igual a ${(validation as MinValidation).value}`\n case 'max':\n return `Debe ser menor o igual a ${(validation as MaxValidation).value}`\n case 'pattern':\n return 'El formato no es válido'\n case 'custom':\n return 'Validación fallida'\n case 'noInjection':\n return INJECTION_VALIDATION_MESSAGE\n default:\n return 'Campo inválido'\n }\n }\n\n /**\n * Evalúa si un campo debe ser validado basándose en sus dependencias\n * Un campo no debe validarse si está oculto por una condición\n */\n private shouldValidateField(field: Field, values: Record<string, any>): boolean {\n // Skip if explicitly hidden or disabled\n if (field.hidden || field.disabled) {\n return false\n }\n\n // Check dependencies to see if field should be validated\n if (field.dependencies) {\n // Use ConditionEngine to evaluate dependencies\n const result = this.conditionEngine.evaluateDependencies(field.dependencies, values)\n \n // If field is not visible, skip validation\n if (!result.visible) {\n return false\n }\n \n // If field is not enabled, skip validation \n if (!result.enabled) {\n return false\n }\n }\n \n return true\n }\n\n /**\n * Valida todos los campos de un formulario\n */\n async validateForm(\n fields: Field[],\n values: Record<string, any>\n ): Promise<Record<string, string[]>> {\n const errors: Record<string, string[]> = {}\n\n for (const field of fields) {\n if (!this.shouldValidateField(field, values)) {\n continue\n }\n \n // Handle array fields with itemSchema\n if (field.type === 'array' && 'itemSchema' in field) {\n const arrayField = field as ArrayField\n const itemSchema = arrayField.itemSchema\n const itemFields = itemSchema?.fields || []\n const arrayValue = values[field.name]\n \n if (Array.isArray(arrayValue)) {\n for (let i = 0; i < arrayValue.length; i++) {\n const itemValue = arrayValue[i]\n for (const itemField of itemFields) {\n const itemFieldName = `${field.name}.${i}.${itemField.name}`\n const itemFieldValue = itemValue?.[itemField.name]\n \n if (!this.shouldValidateField(itemField, values)) {\n continue\n }\n \n const fieldErrors = await this.validateField(itemField, itemFieldValue)\n if (fieldErrors.length > 0) {\n errors[itemFieldName] = fieldErrors\n }\n }\n }\n }\n \n // Validate array-level validations (minItems, maxItems)\n const arrayErrors = await this.validateArrayField(field, arrayValue)\n if (arrayErrors.length > 0) {\n errors[field.name] = arrayErrors\n }\n } else {\n const value = values[field.name]\n const fieldErrors = await this.validateField(field, value)\n if (fieldErrors.length > 0) {\n errors[field.name] = fieldErrors\n }\n }\n }\n\n return errors\n }\n\n /**\n * Valida un campo array a nivel de array (minItems, maxItems)\n */\n private async validateArrayField(field: Field, value: any): Promise<string[]> {\n const errors: string[] = []\n const arrayField = field as ArrayField\n \n if (arrayField.minItems !== undefined) {\n const isValid = Array.isArray(value) && value.length >= arrayField.minItems\n if (!isValid) {\n errors.push(`Debe tener al menos ${arrayField.minItems} elementos`)\n }\n }\n \n if (arrayField.maxItems !== undefined) {\n const isValid = Array.isArray(value) && value.length <= arrayField.maxItems\n if (!isValid) {\n errors.push(`Debe tener máximo ${arrayField.maxItems} elementos`)\n }\n }\n \n return errors\n }\n}\n","import type {\n FormState,\n WizardState,\n Field,\n FormSchema,\n} from '../types'\nimport { SchemaParser, type ParsedSchema } from './schema-parser'\nimport { ValidationEngine } from './validation-engine'\nimport { ConditionEngine } from './condition-engine'\nimport { getNestedValue, setNestedValue } from '../utils'\n\n/**\n * Gestor de estado del formulario\n */\nexport class StateManager {\n private state: FormState\n private wizardState: WizardState | null = null\n private schema: ParsedSchema | null = null\n private parser: SchemaParser\n private validator: ValidationEngine\n private conditionEngine: ConditionEngine\n private dependencyCache: Map<string, { visible: boolean; enabled: boolean; required: boolean }> = new Map()\n private fieldDependencies: Map<string, Set<string>> = new Map() // campo observado -> campos dependientes\n\n constructor() {\n this.parser = new SchemaParser()\n this.validator = new ValidationEngine()\n this.conditionEngine = new ConditionEngine()\n this.state = this.createInitialState()\n }\n\n /**\n * Crea el estado inicial\n */\n private createInitialState(): FormState {\n return {\n values: {},\n errors: {},\n touched: {},\n isValid: true,\n isSubmitting: false,\n }\n }\n\n /**\n * Inicializa el schema\n */\n initializeSchema(schema: FormSchema, initialData?: Record<string, any>): void {\n this.schema = this.parser.parse(schema)\n this.initializeValues(initialData)\n this.initializeWizard()\n this.buildDependencyMap()\n }\n\n /**\n * Extrae todos los campos recursivamente (incluyendo groups, rows).\n * Los campos de array.itemSchema NO se incluyen como top-level: viven dentro de cada ítem.\n */\n private extractAllFields(fields: Field[]): Field[] {\n const allFields: Field[] = []\n \n for (const field of fields) {\n allFields.push(field)\n \n if (field.type === 'group' && 'fields' in field) {\n allFields.push(...this.extractAllFields(field.fields))\n }\n if (field.type === 'row' && 'fields' in field) {\n allFields.push(...this.extractAllFields(field.fields))\n }\n // Array: no extraer itemSchema.fields como top-level; se inicializan dentro de cada ítem\n }\n \n return allFields\n }\n\n /**\n * Devuelve los nombres de campos que solo existen dentro de itemSchema de arrays\n * y NO como campos top-level. Estos NO deben aparecer como claves en la raíz de values.\n */\n private getArrayItemOnlyFieldNames(fields: Field[]): Set<string> {\n const topLevelNames = new Set(fields.map((f) => f.name))\n const arrayItemNames = new Set<string>()\n for (const field of fields) {\n if (field.type === 'array' && 'itemSchema' in field && field.itemSchema?.fields) {\n for (const sub of field.itemSchema.fields) {\n if (!topLevelNames.has(sub.name)) {\n arrayItemNames.add(sub.name)\n }\n }\n }\n }\n return arrayItemNames\n }\n\n /**\n * Extrae todos los campos incluyendo arrays (para mapa de dependencias)\n * Retorna campos con su información de container\n */\n private extractAllFieldsWithArrays(\n fields: Field[], \n parentPath: string = '',\n containerType: 'root' | 'group' | 'row' | 'array' = 'root'\n ): Array<{ field: Field; fullPath: string; containerType: 'root' | 'group' | 'row' | 'array'; containerPath: string }> {\n const result: Array<{ field: Field; fullPath: string; containerType: 'root' | 'group' | 'row' | 'array'; containerPath: string }> = []\n \n for (const field of fields) {\n const fullPath = parentPath ? `${parentPath}.${field.name}` : field.name\n const containerPath = parentPath || ''\n \n result.push({\n field,\n fullPath,\n containerType,\n containerPath\n })\n \n if (field.type === 'group' && 'fields' in field) {\n result.push(...this.extractAllFieldsWithArrays(field.fields, fullPath, 'group'))\n }\n if (field.type === 'row' && 'fields' in field) {\n result.push(...this.extractAllFieldsWithArrays(field.fields, fullPath, 'row'))\n }\n if (field.type === 'array' && 'itemSchema' in field && field.itemSchema?.fields) {\n // Para arrays, los campos del itemSchema tienen el array como contenedor\n result.push(...this.extractAllFieldsWithArrays(field.itemSchema.fields, field.name, 'array'))\n }\n }\n \n return result\n }\n\n /**\n * Construye el mapa de dependencias para optimizar re-evaluaciones\n */\n private buildDependencyMap(): void {\n this.fieldDependencies.clear()\n this.dependencyCache.clear()\n\n if (!this.schema) return\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n // Usar extractAllFieldsWithArrays para incluir campos de arrays\n const allFieldsWithArrays = this.extractAllFieldsWithArrays(topLevelFields)\n\n for (const { field, fullPath, containerType, containerPath } of allFieldsWithArrays) {\n if (!field.dependencies) continue\n\n // Extraer todos los campos observados\n const observedFields = this.extractObservedFields(field.dependencies)\n \n for (const observedField of observedFields) {\n if (!this.fieldDependencies.has(observedField)) {\n this.fieldDependencies.set(observedField, new Set())\n }\n // Agregar con nombre relativo\n this.fieldDependencies.get(observedField)!.add(field.name)\n // Agregar con path completo si es diferente\n // Agregar con path completo si es diferente\n if (fullPath !== field.name) {\n this.fieldDependencies.get(observedField)!.add(fullPath)\n }\n // Para arrays, también registrar la dependencia contra el campo del array\n if (containerType === 'array' && containerPath) {\n if (!this.fieldDependencies.has(containerPath)) {\n this.fieldDependencies.set(containerPath, new Set())\n }\n this.fieldDependencies.get(containerPath)!.add(fullPath)\n }\n }\n }\n }\n\n /**\n * Extrae los nombres de campos observados de las dependencias\n */\n private extractObservedFields(dependencies: any): Set<string> {\n const fields = new Set<string>()\n\n const extractFromCondition = (condition: any) => {\n if (condition && condition.field) {\n fields.add(condition.field)\n }\n }\n\n const extractFromConditions = (conditions: any) => {\n if (Array.isArray(conditions)) {\n conditions.forEach(extractFromCondition)\n } else if (conditions) {\n extractFromCondition(conditions)\n }\n }\n\n if (dependencies.show) extractFromConditions(dependencies.show)\n if (dependencies.hide) extractFromConditions(dependencies.hide)\n if (dependencies.enable) extractFromConditions(dependencies.enable)\n if (dependencies.disable) extractFromConditions(dependencies.disable)\n if (dependencies.required) extractFromConditions(dependencies.required)\n if (dependencies.optional) extractFromConditions(dependencies.optional)\n\n return fields\n }\n\n /**\n * Inicializa los valores por defecto\n */\n private initializeValues(initialData?: Record<string, any>): void {\n if (!this.schema) return\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n const allFields = this.extractAllFields(topLevelFields)\n\n // Preservar valores existentes\n const existingValues = { ...this.state.values }\n const values: Record<string, any> = {}\n\n // Primero, cargar valores desde initialData si está disponible\n if (initialData) {\n for (const key in initialData) {\n const value = initialData[key]\n if (value !== undefined && value !== null) {\n setNestedValue(values, key, value)\n }\n }\n }\n\n // Luego, inicializar campos desde defaultValue o valores por defecto\n for (const field of allFields) {\n // Verificar si ya hay un valor desde initialData\n const existingValue = getNestedValue(values, field.name)\n \n // Si el campo ya tiene un valor desde initialData o existingValues, preservarlo\n if (existingValue !== undefined && existingValue !== null) {\n // Ya está inicializado desde initialData\n continue\n }\n \n // Verificar si hay un valor previo en existingValues\n const prevValue = getNestedValue(existingValues, field.name)\n if (prevValue !== undefined && prevValue !== null) {\n setNestedValue(values, field.name, prevValue)\n } else {\n // Solo inicializar si no existe valor previo\n this.initializeFieldValue(field, values)\n }\n }\n\n // Preservar valores de campos que no están en el schema actual (por si acaso)\n // Excluir nombres que son solo de itemSchema de arrays (street, city, etc.) — no deben estar en raíz\n const arrayItemOnlyNames = this.getArrayItemOnlyFieldNames(topLevelFields)\n for (const key in existingValues) {\n if (arrayItemOnlyNames.has(key)) continue\n if (!(key in values)) {\n values[key] = existingValues[key]\n }\n }\n\n // Rellenar arrays con initialData cuando length < minItems\n for (const field of topLevelFields) {\n if (field.type === 'array' && 'minItems' in field && 'itemSchema' in field) {\n const arrayField = field as { minItems?: number; itemSchema?: { fields?: Field[] } }\n const minItems = arrayField.minItems ?? 0\n if (minItems >= 1 && arrayField.itemSchema?.fields?.length) {\n const arr = getNestedValue(values, field.name)\n if (Array.isArray(arr) && arr.length < minItems) {\n const padded = [...arr]\n for (let i = arr.length; i < minItems; i++) {\n const item: Record<string, any> = {}\n for (const subField of arrayField.itemSchema!.fields!) {\n this.initializeFieldValue(subField, item)\n }\n padded.push(item)\n }\n setNestedValue(values, field.name, padded)\n }\n }\n }\n }\n\n // Eliminar claves que solo pertenecen a itemSchema de arrays (nunca deben estar en raíz)\n for (const name of arrayItemOnlyNames) {\n if (name in values) {\n delete values[name]\n }\n }\n\n this.state.values = values\n }\n\n /**\n * Inicializa el valor de un campo\n */\n private initializeFieldValue(\n field: Field,\n values: Record<string, any>\n ): void {\n if (field.defaultValue !== undefined) {\n values[field.name] = field.defaultValue\n } else {\n switch (field.type) {\n case 'checkbox':\n case 'switch':\n values[field.name] = field.checked || false\n break\n case 'select':\n if ('multiple' in field && field.multiple) {\n values[field.name] = []\n } else {\n values[field.name] = null\n }\n break\n case 'array': {\n const arrayField = field as { itemSchema?: { fields?: Field[] }; minItems?: number }\n const minItems = arrayField.minItems ?? 0\n const itemFields = arrayField.itemSchema?.fields\n if (minItems >= 1 && itemFields?.length) {\n const arr: Record<string, any>[] = []\n for (let i = 0; i < minItems; i++) {\n const item: Record<string, any> = {}\n for (const subField of itemFields) {\n this.initializeFieldValue(subField, item)\n }\n arr.push(item)\n }\n values[field.name] = arr\n } else {\n values[field.name] = []\n }\n break\n }\n case 'group':\n values[field.name] = {}\n if ('fields' in field) {\n for (const subField of field.fields) {\n this.initializeFieldValue(subField, values[field.name] as Record<string, any>)\n }\n }\n break\n case 'colorpicker':\n values[field.name] =\n (field as { defaultValue?: string }).defaultValue ?? '#000000'\n break\n default:\n values[field.name] = null\n }\n }\n }\n\n /**\n * Inicializa el estado del wizard\n */\n private initializeWizard(): void {\n if (!this.schema || !this.schema.isWizard) {\n this.wizardState = null\n return\n }\n\n this.wizardState = {\n currentStep: 0,\n totalSteps: this.schema.steps!.length,\n completedSteps: [],\n }\n }\n\n /**\n * Obtiene el estado actual\n */\n getState(): FormState {\n return { ...this.state }\n }\n\n /**\n * Obtiene el estado del wizard\n */\n getWizardState(): WizardState | null {\n return this.wizardState ? { ...this.wizardState } : null\n }\n\n /**\n * Obtiene un valor del formulario\n */\n getValue(fieldName: string): any {\n return getNestedValue(this.state.values, fieldName)\n }\n\n /**\n * Crea un ítem nuevo con valores por defecto para un campo array\n */\n createDefaultArrayItem(arrayField: Field): Record<string, any> {\n const itemSchema = (arrayField as { itemSchema?: { fields?: Field[] } }).itemSchema\n const itemFields = itemSchema?.fields\n if (!itemFields?.length) return {}\n const item: Record<string, any> = {}\n for (const subField of itemFields) {\n this.initializeFieldValue(subField, item)\n }\n return item\n }\n\n /**\n * Establece un valor\n */\n async setValue(fieldName: string, value: any): Promise<void> {\n setNestedValue(this.state.values, fieldName, value)\n this.state.touched[fieldName] = true\n\n // Invalidar cache de dependencias para campos que dependen de este\n this.invalidateDependencyCache(fieldName)\n\n // Validar el campo si está touched\n if (this.state.touched[fieldName] && this.schema) {\n await this.validateField(fieldName)\n }\n\n // Validar campos dependientes que ahora pueden tener diferentes validaciones\n const dependentFields = this.fieldDependencies.get(fieldName)\n if (dependentFields) {\n for (const dependentField of dependentFields) {\n await this.validateField(dependentField)\n }\n }\n\n this.updateValidity()\n }\n\n /**\n * Invalida el cache de dependencias para campos dependientes\n */\n private invalidateDependencyCache(fieldName: string): void {\n // Buscar por el nombre exacto\n let dependentFields = this.fieldDependencies.get(fieldName)\n \n if (dependentFields) {\n for (const dependentField of dependentFields) {\n this.dependencyCache.delete(dependentField)\n // También eliminar versiones con corchetes del dependent field\n const dependentFieldWithIndex = this.addArrayIndexToPath(fieldName, dependentField)\n if (dependentFieldWithIndex) {\n this.dependencyCache.delete(dependentFieldWithIndex)\n }\n }\n }\n \n // Para campos con notación de corchetes (arrays), también buscar por el nombre sin índice\n // addresses[0].type -> addresses.type -> type\n const fieldNameWithoutIndex = fieldName.replace(/\\[\\d+\\]/g, '')\n if (fieldNameWithoutIndex !== fieldName) {\n dependentFields = this.fieldDependencies.get(fieldNameWithoutIndex)\n if (dependentFields) {\n for (const dependentField of dependentFields) {\n this.dependencyCache.delete(dependentField)\n // Agregar índice si el campo dependiente no lo tiene\n const indexMatch = fieldName.match(/\\[(\\d+)\\]/)\n if (indexMatch) {\n const dependentWithIndex = dependentField.includes('[') \n ? dependentField \n : `${dependentField.split('.').slice(0, -1).join('.')}[${indexMatch[1]}].${dependentField.split('.').pop()}`\n this.dependencyCache.delete(dependentWithIndex)\n }\n }\n }\n \n // También buscar solo por el nombre del campo (sin prefijo de array)\n const baseFieldName = fieldNameWithoutIndex.split('.').pop()\n if (baseFieldName && baseFieldName !== fieldNameWithoutIndex) {\n dependentFields = this.fieldDependencies.get(baseFieldName)\n if (dependentFields) {\n for (const dependentField of dependentFields) {\n this.dependencyCache.delete(dependentField)\n // Agregar índice\n const indexMatch = fieldName.match(/\\[(\\d+)\\]/)\n if (indexMatch) {\n const arrayName = fieldName.split('.')[0].replace(/\\[\\d+\\]/, '')\n const dependentWithIndex = `${arrayName}[${indexMatch[1]}].${dependentField}`\n this.dependencyCache.delete(dependentWithIndex)\n }\n }\n }\n }\n }\n \n // También buscar por partes del path para manejar grupos\n const parts = fieldName.split('.')\n for (let i = 1; i < parts.length; i++) {\n if (parts[i].includes('[')) continue\n \n const partialPath = parts.slice(i).join('.')\n dependentFields = this.fieldDependencies.get(partialPath)\n if (dependentFields) {\n for (const dependentField of dependentFields) {\n this.dependencyCache.delete(dependentField)\n this.dependencyCache.delete(`${parts[0]}.${partialPath}`)\n }\n }\n }\n \n // También limpiar el cache del campo que cambió (por si acaso)\n this.dependencyCache.delete(fieldName)\n }\n\n /**\n * Agrega el índice de array al path del campo\n */\n private addArrayIndexToPath(sourcePath: string, targetPath: string): string | null {\n const indexMatch = sourcePath.match(/\\[(\\d+)\\]/)\n if (!indexMatch) return null\n \n const index = indexMatch[1]\n const sourceArray = sourcePath.split('.')[0]\n \n // Si el targetPath empieza con el mismo array, agregar índice\n if (targetPath.startsWith(sourceArray)) {\n // addresses.city -> addresses[0].city\n const parts = targetPath.split('.')\n if (parts.length > 1) {\n return `${parts[0]}[${index}].${parts.slice(1).join('.')}`\n }\n }\n return null\n }\n\n /**\n * Establece un valor sin validar (útil para preservar valores durante re-renderizado)\n */\n setValueWithoutValidation(fieldName: string, value: any): void {\n setNestedValue(this.state.values, fieldName, value)\n // Invalidar cache de dependencias para campos que dependen de este\n this.invalidateDependencyCache(fieldName)\n // No marcar como touched ni validar\n }\n\n /**\n * Valida un campo específico\n */\n async validateField(fieldName: string): Promise<void> {\n if (!this.schema) return\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n const allFields = this.extractAllFields(topLevelFields)\n const field = allFields.find((f) => f.name === fieldName)\n if (!field) return\n\n // Si el campo no es visible, no validar\n if (!this.getFieldVisibility(fieldName)) {\n delete this.state.errors[fieldName]\n return\n }\n\n const value = this.getValue(fieldName)\n \n // Obtener validaciones activas (incluyendo condicionales)\n const activeValidations = this.getActiveValidations(field)\n \n const errors = await this.validator.validateFieldWithValidations(\n field,\n value,\n activeValidations\n )\n\n if (errors.length > 0) {\n this.state.errors[fieldName] = errors\n } else {\n delete this.state.errors[fieldName]\n }\n }\n\n /**\n * Obtiene las validaciones activas para un campo (incluyendo condicionales)\n */\n private getActiveValidations(field: Field): any[] {\n let validations = [...(field.validations || [])]\n\n // Agregar validación anti-inyección automática para campos de texto\n const textFieldTypes = ['text', 'email', 'password', 'textarea']\n const skipInjection = field.skipInjectionValidation ?? (field.props as any)?.skipInjectionValidation\n if (\n textFieldTypes.includes(field.type) &&\n !skipInjection &&\n !validations.some((v) => v.type === 'noInjection')\n ) {\n validations = [{ type: 'noInjection' }, ...validations]\n }\n\n // Verificar si el campo es requerido dinámicamente a través de dependencias\n const isRequired = this.getFieldRequired(field.name)\n const hasRequiredValidation = validations.some(v => v.type === 'required')\n \n if (isRequired && !hasRequiredValidation) {\n // Agregar validación required si no existe\n validations = [{ type: 'required' }, ...validations]\n } else if (!isRequired && hasRequiredValidation) {\n // Remover validación required si el campo no es requerido dinámicamente\n validations = validations.filter(v => v.type !== 'required')\n }\n\n // Agregar validaciones condicionales si se cumplen las condiciones\n if (field.conditionalValidations) {\n for (const conditional of field.conditionalValidations) {\n const conditionMet = this.conditionEngine.evaluateConditions(\n conditional.condition,\n this.state.values\n )\n if (conditionMet) {\n validations = [...validations, ...conditional.validations]\n }\n }\n }\n\n return validations\n }\n\n /**\n * Valida todo el formulario\n */\n async validateForm(): Promise<Record<string, string[]>> {\n if (!this.schema) {\n return {}\n }\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n const allFields = this.extractAllFields(topLevelFields)\n const errors = await this.validator.validateForm(\n allFields,\n this.state.values\n )\n\n this.state.errors = errors\n this.updateValidity()\n\n return errors\n }\n\n /**\n * Actualiza la validez del formulario\n */\n private updateValidity(): void {\n this.state.isValid = Object.keys(this.state.errors).length === 0\n }\n\n /**\n * Marca un campo como touched\n */\n setTouched(fieldName: string): void {\n this.state.touched[fieldName] = true\n }\n\n /**\n * Obtiene los errores de un campo\n */\n getErrors(fieldName: string): string[] {\n return this.state.errors[fieldName] || []\n }\n\n /**\n * Obtiene todos los errores\n */\n getAllErrors(): Record<string, string[]> {\n return { ...this.state.errors }\n }\n\n /**\n * Resetea el formulario\n */\n reset(): void {\n this.state = this.createInitialState()\n if (this.schema) {\n this.initializeValues()\n this.initializeWizard()\n }\n }\n\n /**\n * Avanza al siguiente step del wizard\n */\n nextStep(): boolean {\n if (!this.wizardState) return false\n if (this.wizardState.currentStep < this.wizardState.totalSteps - 1) {\n this.wizardState.currentStep++\n return true\n }\n return false\n }\n\n /**\n * Retrocede al step anterior del wizard\n */\n previousStep(): boolean {\n if (!this.wizardState) return false\n if (this.wizardState.currentStep > 0) {\n this.wizardState.currentStep--\n return true\n }\n return false\n }\n\n /**\n * Va a un step específico\n */\n goToStep(stepIndex: number): boolean {\n if (!this.wizardState) return false\n if (stepIndex >= 0 && stepIndex < this.wizardState.totalSteps) {\n this.wizardState.currentStep = stepIndex\n return true\n }\n return false\n }\n\n /**\n * Marca un step como completado\n */\n completeStep(stepIndex: number): void {\n if (!this.wizardState) return\n if (!this.wizardState.completedSteps.includes(stepIndex)) {\n this.wizardState.completedSteps.push(stepIndex)\n }\n }\n\n /**\n * Establece el estado de submitting\n */\n setSubmitting(isSubmitting: boolean): void {\n this.state.isSubmitting = isSubmitting\n }\n\n /**\n * Obtiene los campos del step actual\n */\n getCurrentStepFields(): Field[] {\n if (!this.schema || !this.schema.isWizard || !this.wizardState) {\n return this.schema?.fields || []\n }\n return this.schema.steps![this.wizardState.currentStep].fields\n }\n\n /**\n * Obtiene la visibilidad de un campo basándose en dependencias\n */\n getFieldVisibility(fieldName: string): boolean {\n // Verificar cache primero\n const cached = this.dependencyCache.get(fieldName)\n if (cached !== undefined) {\n return cached.visible\n }\n\n if (!this.schema) return true\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n // Usar extractAllFieldsWithArrays para incluir campos de arrays\n const allFieldsWithArrays = this.extractAllFieldsWithArrays(topLevelFields)\n\n // Buscar el campo por nombre completo primero\n let fieldInfo = allFieldsWithArrays.find((f) => f.fullPath === fieldName || f.field.name === fieldName)\n \n // Si no se encuentra, buscar por nombre relativo (sin índice para arrays)\n if (!fieldInfo) {\n // Extraer el nombre sin índice: phones[0].extension -> phones.extension\n const fieldNameWithoutIndex = fieldName.replace(/\\[\\d+\\]/g, '')\n fieldInfo = allFieldsWithArrays.find((f) => f.field.name === fieldNameWithoutIndex || f.fullPath === fieldNameWithoutIndex)\n }\n \n // Si aún no se encuentra, buscar solo por nombre de campo\n if (!fieldInfo) {\n const baseFieldName = fieldName.split('.').pop()\n fieldInfo = allFieldsWithArrays.find((f) => f.field.name === baseFieldName)\n }\n \n if (!fieldInfo || !fieldInfo.field.dependencies) {\n return !fieldInfo?.field.hidden\n }\n\n const { field, containerType, containerPath } = fieldInfo\n const dependencies = fieldInfo.field.dependencies!\n\n // Crear el contexto de valores según el tipo de contenedor\n let valuesContext: Record<string, any> = { ...this.state.values }\n\n if (containerType === 'array' && containerPath) {\n // Para arrays, verificar el valor del campo observador\n // Los valores pueden estar en el array real O en claves con notación de corchetes (phones[0].type)\n \n // Extraer el nombre del campo observador de las dependencias\n let observerField: string | undefined\n const getObserverField = (deps: any): string | undefined => {\n if (!deps) return undefined\n if (Array.isArray(deps)) {\n return deps[0]?.field\n }\n return deps.field\n }\n \n observerField = getObserverField(dependencies.show) || \n getObserverField(dependencies.hide) || \n getObserverField(dependencies.enable) ||\n getObserverField(dependencies.disable) ||\n getObserverField(dependencies.required) ||\n getObserverField(dependencies.optional)\n\n if (observerField && observerField) {\n // Extraer el índice del path del campo (si lo hay)\n // phones[0].extension -> index 0\n const indexMatch = fieldName.match(/\\[(\\d+)\\]/)\n const itemIndex = indexMatch ? parseInt(indexMatch[1], 10) : null\n \n // Buscar el valor del campo observador\n let observerValue: any = null\n \n if (itemIndex !== null) {\n // 1. Buscar en el array real en el índice específico\n const arrayValue = getNestedValue(this.state.values, containerPath)\n if (Array.isArray(arrayValue) && arrayValue[itemIndex]) {\n observerValue = arrayValue[itemIndex][observerField]\n }\n \n // 2. Si no se encuentra, buscar con notación de corchetes\n if (observerValue === null || observerValue === undefined) {\n const bracketKey = `${containerPath}[${itemIndex}]`\n const bracketObj = this.state.values[bracketKey]\n if (bracketObj && typeof bracketObj === 'object') {\n observerValue = bracketObj[observerField]\n }\n }\n } else {\n // Sin índice específico, buscar en cualquier ítem\n const arrayValue = getNestedValue(this.state.values, containerPath)\n if (Array.isArray(arrayValue)) {\n for (const item of arrayValue) {\n if (item && item[observerField!] !== undefined) {\n observerValue = item[observerField!]\n break\n }\n }\n }\n }\n\n // Evaluar la dependencia con el valor encontrado\n if (observerValue !== null && observerValue !== undefined) {\n const itemContext: Record<string, any> = { ...this.state.values }\n itemContext[observerField!] = observerValue\n \n const result = this.conditionEngine.evaluateDependencies(dependencies, itemContext)\n this.dependencyCache.set(fieldName, result)\n return result.visible && !field.hidden\n }\n }\n \n // Si no se puede determinar el valor, retornar visible por defecto\n const result = { visible: true, enabled: true, required: false }\n this.dependencyCache.set(fieldName, result)\n return result.visible && !field.hidden\n } else if (containerPath) {\n // Para grupos/rows, usar la lógica existente\n const containerValues = getNestedValue(this.state.values, containerPath)\n if (containerValues && typeof containerValues === 'object') {\n const createRelativeContext = (obj: any, prefix: string = ''): Record<string, any> => {\n const result: Record<string, any> = {}\n const entries = Object.entries(obj)\n \n for (const [key, value] of entries) {\n const relativeKey = prefix ? `${prefix}.${key}` : key\n if (value && typeof value === 'object' && !Array.isArray(value) && value !== null) {\n Object.assign(result, createRelativeContext(value, relativeKey))\n }\n }\n \n for (const [key, value] of entries) {\n const relativeKey = prefix ? `${prefix}.${key}` : key\n if (!(value && typeof value === 'object' && !Array.isArray(value) && value !== null)) {\n if (!(relativeKey in result)) {\n result[relativeKey] = value\n }\n }\n }\n \n return result\n }\n const relativeContext = createRelativeContext(containerValues)\n valuesContext = { ...this.state.values, ...relativeContext }\n }\n }\n\n const result = this.conditionEngine.evaluateDependencies(\n dependencies,\n valuesContext\n )\n\n // Cachear resultado\n this.dependencyCache.set(fieldName, result)\n\n return result.visible && !field.hidden\n }\n\n /**\n * Obtiene si un campo está habilitado basándose en dependencias\n */\n getFieldEnabled(fieldName: string): boolean {\n // Verificar cache primero\n const cached = this.dependencyCache.get(fieldName)\n if (cached !== undefined) {\n return cached.enabled\n }\n\n if (!this.schema) return true\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n const allFields = this.extractAllFields(topLevelFields)\n const field = allFields.find((f) => f.name === fieldName)\n if (!field) return true\n\n if (field.disabled) return false\n\n if (!field.dependencies) {\n return true\n }\n\n const result = this.conditionEngine.evaluateDependencies(\n field.dependencies,\n this.state.values\n )\n\n // Cachear resultado\n this.dependencyCache.set(fieldName, result)\n\n return result.enabled\n }\n\n /**\n * Obtiene si un campo es requerido basándose en dependencias\n */\n getFieldRequired(fieldName: string): boolean {\n // Verificar cache primero\n const cached = this.dependencyCache.get(fieldName)\n if (cached !== undefined) {\n return cached.required\n }\n\n if (!this.schema) return false\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n const allFields = this.extractAllFields(topLevelFields)\n\n const field = allFields.find((f) => f.name === fieldName)\n if (!field) return false\n\n // Verificar si tiene validación required estándar\n const hasRequired = field.validations?.some((v) => v.type === 'required') || false\n\n if (!field.dependencies) {\n return hasRequired\n }\n\n const result = this.conditionEngine.evaluateDependencies(\n field.dependencies,\n this.state.values\n )\n\n // Cachear resultado\n this.dependencyCache.set(fieldName, result)\n\n return result.required || hasRequired\n }\n\n /**\n * Obtiene los campos que dependen de un campo específico\n */\n getDependentFields(fieldName: string): string[] {\n return Array.from(this.fieldDependencies.get(fieldName) || [])\n }\n}\n","import type { Field, SlotContent } from '../../types'\n\n/**\n * Clase base para inputs\n */\nexport abstract class BaseInput {\n protected field: Field\n protected value: any\n protected error?: string\n protected onChange: (value: any) => void\n protected onBlur: () => void\n\n constructor(\n field: Field,\n value: any,\n error: string | undefined,\n onChange: (value: any) => void,\n onBlur: () => void\n ) {\n this.field = field\n this.value = value\n this.error = error\n this.onChange = onChange\n this.onBlur = onBlur\n }\n\n /**\n * Renderiza el input\n */\n abstract render(): HTMLElement\n\n /**\n * Crea wrapper con slots leading/trailing si el campo tiene leadingIcon o trailingIcon.\n * Si no hay slots, devuelve el input sin wrapper (retrocompatibilidad).\n */\n protected createInputWithSlots(rawInput: HTMLElement): HTMLElement {\n const leading = this.field.leadingIcon\n const trailing = this.field.trailingIcon\n if (!leading && !trailing) {\n return rawInput\n }\n\n const wrapper = document.createElement('div')\n wrapper.className = 'easy-form-input-wrapper'\n\n if (leading && this.isSlotContentValid(leading)) {\n const slotEl = this.renderSlotContent(leading)\n slotEl.className = 'easy-form-input-slot easy-form-input-slot-leading'\n wrapper.appendChild(slotEl)\n }\n\n const inputWrap = document.createElement('div')\n inputWrap.className = 'easy-form-input-core'\n inputWrap.appendChild(rawInput)\n wrapper.appendChild(inputWrap)\n\n if (trailing && this.isSlotContentValid(trailing)) {\n const slotEl = this.renderSlotContent(trailing)\n slotEl.className = 'easy-form-input-slot easy-form-input-slot-trailing'\n wrapper.appendChild(slotEl)\n }\n\n return wrapper\n }\n\n private isSlotContentValid(slot: SlotContent): boolean {\n if (!slot.type) return false\n if (slot.type === 'image') return Boolean(slot.src)\n if (slot.type === 'html') return Boolean(slot.html)\n return false\n }\n\n private renderSlotContent(slot: SlotContent): HTMLElement {\n const container = document.createElement('span')\n container.className = 'easy-form-input-slot-content'\n if (slot.type === 'image' && slot.src) {\n const img = document.createElement('img')\n img.src = slot.src\n img.alt = slot.alt ?? ''\n img.setAttribute('aria-hidden', 'true')\n container.appendChild(img)\n } else if (slot.type === 'html' && slot.html) {\n container.innerHTML = slot.html\n }\n return container\n }\n\n /**\n * Crea un contenedor con label y error\n */\n protected createFieldContainer(input: HTMLElement): HTMLElement {\n const container = document.createElement('div')\n \n // Si el input es un contenedor con clases específicas de componentes, preservarlas\n const inputClasses = Array.from(input.classList)\n const componentContainerClasses = inputClasses.filter(\n (cls) => cls.startsWith('easy-form-') && \n cls !== 'easy-form-field' &&\n (cls.includes('-container') || cls.includes('-wrapper'))\n )\n \n const labelPosition = (this.field as { labelPosition?: 'up' | 'down' | 'left' | 'right' | 'none' }).labelPosition ?? 'up'\n\n const inputToAppend = this.createInputWithSlots(input)\n\n if (componentContainerClasses.length > 0) {\n container.className = `easy-form-field easy-form-label-${labelPosition} ${componentContainerClasses.join(' ')}`\n } else {\n container.className = `easy-form-field easy-form-label-${labelPosition}`\n }\n\n // Aplicar aria-label si labelPosition es 'none' y hay label\n if (labelPosition === 'none' && this.field.label) {\n const el = inputToAppend.querySelector('input, textarea, select') || inputToAppend\n if (el instanceof HTMLElement) {\n el.setAttribute('aria-label', this.field.label)\n }\n }\n\n const createLabel = (): HTMLLabelElement | null => {\n if (!this.field.label || labelPosition === 'none') return null\n const label = document.createElement('label')\n label.className = 'easy-form-label'\n label.setAttribute('for', this.getFieldId())\n label.textContent = this.field.label\n if (this.field.validations?.some((v) => v.type === 'required')) {\n const required = document.createElement('span')\n required.className = 'easy-form-required'\n required.textContent = ' *'\n label.appendChild(required)\n }\n return label\n }\n\n const label = createLabel()\n\n // Orden según labelPosition\n if (labelPosition === 'up') {\n if (label) container.appendChild(label)\n container.appendChild(inputToAppend)\n } else if (labelPosition === 'down') {\n container.appendChild(inputToAppend)\n if (label) container.appendChild(label)\n } else if (labelPosition === 'left') {\n const inner = document.createElement('div')\n inner.className = 'easy-form-field-inner easy-form-field-inner-horizontal'\n if (label) inner.appendChild(label)\n inner.appendChild(inputToAppend)\n container.appendChild(inner)\n } else if (labelPosition === 'right') {\n const inner = document.createElement('div')\n inner.className = 'easy-form-field-inner easy-form-field-inner-horizontal'\n inner.appendChild(inputToAppend)\n if (label) inner.appendChild(label)\n container.appendChild(inner)\n } else {\n container.appendChild(inputToAppend)\n }\n\n // Description\n if (this.field.description) {\n const description = document.createElement('p')\n description.className = 'easy-form-description'\n description.textContent = this.field.description\n container.appendChild(description)\n }\n\n // Error\n if (this.error) {\n const errorEl = document.createElement('p')\n errorEl.className = 'easy-form-error'\n errorEl.textContent = this.error\n container.appendChild(errorEl)\n }\n\n return container\n }\n\n /**\n * Obtiene el ID del campo\n */\n protected getFieldId(): string {\n return `easy-form-${this.field.name}`\n }\n\n /**\n * Aplica props comunes a un elemento\n */\n protected applyCommonProps(element: HTMLElement): void {\n element.id = this.getFieldId()\n element.setAttribute('name', this.field.name)\n\n if (this.field.disabled) {\n element.setAttribute('disabled', 'true')\n element.classList.add('easy-form-input-disabled')\n }\n\n if (this.field.hidden) {\n element.style.display = 'none'\n element.classList.add('easy-form-field-hidden')\n }\n\n if (this.error) {\n element.classList.add('easy-form-input-error')\n }\n\n if (this.field.props) {\n for (const [key, value] of Object.entries(this.field.props)) {\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n element.setAttribute(key, String(value))\n }\n }\n }\n }\n}\n","/**\n * Token de máscara\n */\nexport interface MaskToken {\n type: 'digit' | 'letter' | 'any' | 'literal'\n char: string\n editable: boolean\n}\n\n/**\n * Parsea un patrón de máscara en tokens\n */\nexport function parseMaskPattern(pattern: string): MaskToken[] {\n const tokens: MaskToken[] = []\n\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]\n\n switch (char) {\n case '9':\n tokens.push({ type: 'digit', char: '9', editable: true })\n break\n case 'a':\n case 'A':\n tokens.push({ type: 'letter', char: char, editable: true })\n break\n case '*':\n tokens.push({ type: 'any', char: '*', editable: true })\n break\n default:\n tokens.push({ type: 'literal', char: char, editable: false })\n break\n }\n }\n\n return tokens\n}\n\n/**\n * Formatea un valor según los tokens de máscara\n */\nexport function formatValue(value: string, tokens: MaskToken[]): string {\n let result = ''\n let valueIndex = 0\n\n for (const token of tokens) {\n if (!token.editable) {\n result += token.char\n continue\n }\n\n if (valueIndex >= value.length) {\n break\n }\n\n const char = value[valueIndex]\n\n // Validar según el tipo de token\n if (token.type === 'digit' && !/\\d/.test(char)) {\n continue // Saltar caracteres no numéricos\n } else if (token.type === 'letter' && !/[a-zA-Z]/.test(char)) {\n continue // Saltar caracteres no alfabéticos\n } else if (token.type === 'any') {\n // Aceptar cualquier carácter\n } else if (token.type !== 'any' && token.type !== 'digit' && token.type !== 'letter') {\n continue\n }\n\n result += char\n valueIndex++\n }\n\n return result\n}\n\n/**\n * Remueve el formato de un valor (obtiene solo los caracteres editables)\n */\nexport function unformatValue(value: string, tokens: MaskToken[]): string {\n if (!value) return ''\n\n let result = ''\n let tokenIndex = 0\n\n for (let i = 0; i < value.length && tokenIndex < tokens.length; i++) {\n const char = value[i]\n const token = tokens[tokenIndex]\n\n if (token.editable) {\n // Verificar si el carácter coincide con el tipo de token\n if (token.type === 'digit' && /\\d/.test(char)) {\n result += char\n tokenIndex++\n } else if (token.type === 'letter' && /[a-zA-Z]/.test(char)) {\n result += char\n tokenIndex++\n } else if (token.type === 'any') {\n result += char\n tokenIndex++\n } else {\n // Carácter no válido para este token, avanzar al siguiente token editable\n tokenIndex++\n i-- // Revisar el mismo carácter con el siguiente token\n }\n } else {\n // Token literal, verificar si coincide\n if (char === token.char) {\n tokenIndex++\n } else {\n // El carácter no coincide con el literal esperado, puede ser un carácter editable extra\n // Intentar extraerlo si es válido\n if (tokenIndex < tokens.length - 1) {\n const nextToken = tokens[tokenIndex + 1]\n if (nextToken && nextToken.editable) {\n if (nextToken.type === 'digit' && /\\d/.test(char)) {\n result += char\n tokenIndex += 2\n } else if (nextToken.type === 'letter' && /[a-zA-Z]/.test(char)) {\n result += char\n tokenIndex += 2\n } else if (nextToken.type === 'any') {\n result += char\n tokenIndex += 2\n } else {\n tokenIndex++\n }\n } else {\n tokenIndex++\n }\n } else {\n break\n }\n }\n }\n }\n\n return result\n}\n\n/**\n * Obtiene la siguiente posición editable\n */\nexport function getNextEditablePosition(\n position: number,\n tokens: MaskToken[],\n direction: 'forward' | 'backward' = 'forward'\n): number {\n if (direction === 'forward') {\n for (let i = position + 1; i < tokens.length; i++) {\n if (tokens[i].editable) {\n return i\n }\n }\n return tokens.length\n } else {\n for (let i = position - 1; i >= 0; i--) {\n if (tokens[i].editable) {\n return i\n }\n }\n return 0\n }\n}\n\n/**\n * Obtiene el placeholder completo para una máscara\n */\nexport function getMaskPlaceholder(tokens: MaskToken[], placeholder: string = '_'): string {\n return tokens\n .map((token) => (token.editable ? placeholder : token.char))\n .join('')\n}\n\n/**\n * Calcula la posición del cursor después de aplicar máscara\n */\nexport function calculateCursorPosition(\n oldValue: string,\n newValue: string,\n oldCursorPosition: number,\n tokens: MaskToken[]\n): number {\n // Contar caracteres editables antes de la posición anterior\n let editableBeforeOld = 0\n for (let i = 0; i < Math.min(oldCursorPosition, oldValue.length); i++) {\n const tokenIndex = i\n if (tokenIndex < tokens.length && tokens[tokenIndex].editable) {\n editableBeforeOld++\n }\n }\n\n // Encontrar la posición correspondiente en el nuevo valor\n let editableCount = 0\n for (let i = 0; i < newValue.length && i < tokens.length; i++) {\n if (tokens[i].editable) {\n editableCount++\n if (editableCount > editableBeforeOld) {\n return i + 1\n }\n }\n }\n\n // Si no encontramos, buscar la siguiente posición editable\n return getNextEditablePosition(\n Math.min(oldCursorPosition, newValue.length - 1),\n tokens,\n 'forward'\n )\n}\n","import type { MaskConfig, CustomMask } from '../types'\nimport { getPredefinedMask } from '../utils/masks'\nimport {\n parseMaskPattern,\n formatValue,\n unformatValue,\n getNextEditablePosition,\n getMaskPlaceholder,\n calculateCursorPosition,\n type MaskToken,\n} from '../utils/mask-helpers'\n\n/**\n * Motor de máscaras\n */\nexport class MaskEngine {\n private tokenCache: Map<string, MaskToken[]> = new Map()\n\n /**\n * Obtiene la configuración de máscara personalizada\n */\n private getCustomMask(mask: MaskConfig): CustomMask | null {\n if (mask.custom) {\n return mask.custom\n }\n if (mask.type) {\n return getPredefinedMask(mask.type)\n }\n return null\n }\n\n /**\n * Obtiene los tokens parseados de una máscara (con cache)\n */\n private getTokens(mask: MaskConfig): MaskToken[] | null {\n const customMask = this.getCustomMask(mask)\n if (!customMask) {\n return null\n }\n\n const cacheKey = customMask.pattern\n if (this.tokenCache.has(cacheKey)) {\n return this.tokenCache.get(cacheKey)!\n }\n\n const tokens = parseMaskPattern(customMask.pattern)\n this.tokenCache.set(cacheKey, tokens)\n return tokens\n }\n\n /**\n * Aplica máscara a un valor\n */\n applyMask(value: string, mask: MaskConfig): string {\n const tokens = this.getTokens(mask)\n if (!tokens) {\n return value\n }\n\n const customMask = this.getCustomMask(mask)!\n // Extraer solo caracteres editables del valor\n const editableTokens = tokens.filter(t => t.editable)\n const acceptedTypes = new Set(editableTokens.map(t => t.type))\n let unformatted = ''\n for (const char of value) {\n if (acceptedTypes.has('any')) {\n unformatted += char\n } else if (acceptedTypes.has('digit') && /\\d/.test(char)) {\n unformatted += char\n } else if (acceptedTypes.has('letter') && /[a-zA-Z]/.test(char)) {\n unformatted += char\n }\n }\n let formatted = formatValue(unformatted, tokens)\n\n // Aplicar transformación si existe\n if (customMask.transform) {\n formatted = customMask.transform(formatted)\n // Re-formatear después de la transformación\n formatted = formatValue(formatted, tokens)\n }\n\n return formatted\n }\n\n /**\n * Remueve máscara de un valor (obtiene valor raw)\n */\n removeMask(value: string, mask: MaskConfig): string {\n const tokens = this.getTokens(mask)\n if (!tokens) {\n return value\n }\n\n return unformatValue(value, tokens)\n }\n\n /**\n * Obtiene el placeholder para una máscara\n */\n getMaskPlaceholder(mask: MaskConfig): string {\n const tokens = this.getTokens(mask)\n if (!tokens) {\n return ''\n }\n\n const customMask = this.getCustomMask(mask)!\n return getMaskPlaceholder(tokens, customMask.placeholder || '_')\n }\n\n /**\n * Valida si un carácter puede ser insertado en una posición\n */\n canInsertChar(char: string, position: number, mask: MaskConfig): boolean {\n const tokens = this.getTokens(mask)\n if (!tokens || position >= tokens.length) {\n return false\n }\n\n const token = tokens[position]\n if (!token.editable) {\n return false\n }\n\n switch (token.type) {\n case 'digit':\n return /\\d/.test(char)\n case 'letter':\n return /[a-zA-Z]/.test(char)\n case 'any':\n return true\n default:\n return false\n }\n }\n\n /**\n * Procesa entrada del usuario aplicando máscara en tiempo real\n */\n processInput(\n input: string,\n previousValue: string,\n mask: MaskConfig,\n cursorPosition: number\n ): { value: string; cursorPosition: number } {\n const tokens = this.getTokens(mask)\n if (!tokens) {\n return { value: input, cursorPosition: input.length }\n }\n\n // Obtener el valor sin formato del input actual\n const unformattedInput = unformatValue(input, tokens)\n\n // Aplicar máscara al nuevo valor\n let formatted = formatValue(unformattedInput, tokens)\n\n // Aplicar transformación si existe\n const customMask = this.getCustomMask(mask)!\n if (customMask.transform) {\n formatted = customMask.transform(formatted)\n formatted = formatValue(formatted, tokens)\n }\n\n // Calcular nueva posición del cursor\n const newCursorPosition = calculateCursorPosition(\n previousValue,\n formatted,\n cursorPosition,\n tokens\n )\n\n return {\n value: formatted,\n cursorPosition: Math.min(newCursorPosition, formatted.length),\n }\n }\n\n /**\n * Procesa entrada con manejo de backspace/delete\n */\n processKeyInput(\n key: string,\n currentValue: string,\n cursorPosition: number,\n mask: MaskConfig,\n isBackspace: boolean = false\n ): { value: string; cursorPosition: number } {\n const tokens = this.getTokens(mask)\n if (!tokens) {\n return { value: currentValue, cursorPosition: cursorPosition }\n }\n\n if (isBackspace) {\n // Manejar backspace\n if (cursorPosition === 0) {\n return { value: currentValue, cursorPosition: 0 }\n }\n\n // Encontrar la posición editable anterior\n const prevEditable = getNextEditablePosition(cursorPosition - 1, tokens, 'backward')\n \n // Remover el carácter en esa posición\n const before = currentValue.substring(0, prevEditable)\n const after = currentValue.substring(cursorPosition)\n const newValue = before + after\n\n // Re-aplicar máscara\n const unformatted = this.removeMask(newValue, mask)\n const formatted = this.applyMask(unformatted, mask)\n\n // Calcular nueva posición\n const newPos = Math.max(0, prevEditable - 1)\n const nextEditable = getNextEditablePosition(newPos, tokens, 'forward')\n\n return {\n value: formatted,\n cursorPosition: nextEditable,\n }\n }\n\n // Manejar entrada normal\n if (key.length === 1 && this.canInsertChar(key, cursorPosition, mask)) {\n // Insertar carácter en la posición actual\n const before = currentValue.substring(0, cursorPosition)\n const after = currentValue.substring(cursorPosition)\n const newValue = before + key + after\n\n return this.processInput(newValue, currentValue, mask, cursorPosition)\n }\n\n return { value: currentValue, cursorPosition: cursorPosition }\n }\n}\n","import { BaseInput } from './base-input'\nimport type { Field } from '../../types'\nimport { MaskEngine } from '../../core/mask-engine'\n\nexport class TextInput extends BaseInput {\n private maskEngine: MaskEngine | null = null\n private previousValue: string = ''\n\n constructor(\n field: Field,\n value: any,\n error: string | undefined,\n onChange: (value: any) => void,\n onBlur: () => void\n ) {\n super(field, value, error, onChange, onBlur)\n \n if (field.mask) {\n this.maskEngine = new MaskEngine()\n }\n }\n\n render(): HTMLElement {\n const input = document.createElement('input')\n input.type = this.field.type === 'email' ? 'email' : this.field.type === 'password' ? 'password' : 'text'\n \n // Aplicar máscara si existe\n let displayValue = this.value ?? ''\n if (this.maskEngine && this.field.mask) {\n if (displayValue) {\n displayValue = this.maskEngine.applyMask(String(displayValue), this.field.mask)\n }\n this.previousValue = displayValue\n }\n \n input.value = displayValue\n\n this.applyCommonProps(input)\n\n // Aplicar placeholder del field si está definido (después de applyCommonProps)\n if (this.field.placeholder) {\n input.placeholder = this.field.placeholder\n } else if (this.maskEngine && this.field.mask) {\n // Aplicar placeholder de máscara si no hay placeholder del field\n const maskPlaceholder = this.maskEngine.getMaskPlaceholder(this.field.mask)\n if (maskPlaceholder) {\n input.placeholder = maskPlaceholder\n }\n }\n\n // Manejar eventos de entrada con máscara\n if (this.maskEngine && this.field.mask) {\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n const cursorPosition = target.selectionStart || 0\n const inputValue = target.value\n\n const result = this.maskEngine!.processInput(\n inputValue,\n this.previousValue,\n this.field.mask!,\n cursorPosition\n )\n\n // Actualizar valor y cursor\n target.value = result.value\n this.previousValue = result.value\n\n // Restaurar posición del cursor\n setTimeout(() => {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition)\n }, 0)\n\n // Emitir valor según configuración (con o sin formato)\n const valueToEmit = this.field.mask!.keepFormat\n ? result.value\n : this.maskEngine!.removeMask(result.value, this.field.mask!)\n\n this.onChange(valueToEmit)\n })\n\n input.addEventListener('keydown', (e) => {\n const target = e.target as HTMLInputElement\n const cursorPosition = target.selectionStart || 0\n\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault()\n \n const isBackspace = e.key === 'Backspace'\n const result = this.maskEngine!.processKeyInput(\n '',\n target.value,\n cursorPosition,\n this.field.mask!,\n isBackspace\n )\n\n target.value = result.value\n this.previousValue = result.value\n\n setTimeout(() => {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition)\n }, 0)\n\n const valueToEmit = this.field.mask!.keepFormat\n ? result.value\n : this.maskEngine!.removeMask(result.value, this.field.mask!)\n\n this.onChange(valueToEmit)\n }\n })\n\n input.addEventListener('paste', (e) => {\n e.preventDefault()\n const pastedText = (e.clipboardData || (window as any).clipboardData).getData('text')\n \n if (pastedText) {\n const target = e.target as HTMLInputElement\n const cursorPosition = target.selectionStart || 0\n \n // Insertar texto pegado\n const before = target.value.substring(0, cursorPosition)\n const after = target.value.substring(cursorPosition)\n const newValue = before + pastedText + after\n\n const result = this.maskEngine!.processInput(\n newValue,\n this.previousValue,\n this.field.mask!,\n cursorPosition\n )\n\n target.value = result.value\n this.previousValue = result.value\n\n setTimeout(() => {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition)\n }, 0)\n\n const valueToEmit = this.field.mask!.keepFormat\n ? result.value\n : this.maskEngine!.removeMask(result.value, this.field.mask!)\n\n this.onChange(valueToEmit)\n }\n })\n } else {\n // Sin máscara, comportamiento normal\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n this.onChange(target.value)\n })\n }\n\n input.addEventListener('blur', () => {\n this.onBlur()\n })\n\n return this.createFieldContainer(input)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { NumberField } from '../../types'\nimport { MaskEngine } from '../../core/mask-engine'\n\nexport class NumberInput extends BaseInput {\n private maskEngine: MaskEngine | null = null\n private previousValue: string = ''\n\n constructor(\n field: NumberField,\n value: any,\n error: string | undefined,\n onChange: (value: any) => void,\n onBlur: () => void\n ) {\n super(field, value, error, onChange, onBlur)\n \n if (field.mask) {\n this.maskEngine = new MaskEngine()\n }\n }\n\n render(): HTMLElement {\n const input = document.createElement('input')\n \n // Si tiene máscara, usar tipo text para mejor control\n if (this.maskEngine && this.field.mask) {\n input.type = 'text'\n \n // Aplicar máscara al valor inicial\n let displayValue = this.value ?? ''\n if (displayValue !== null && displayValue !== '') {\n if (this.field.mask.type === 'currency') {\n displayValue = this.maskEngine.applyMask(String(displayValue), this.field.mask)\n } else if (this.field.mask.type === 'percentage') {\n displayValue = this.maskEngine.applyMask(String(displayValue), this.field.mask)\n }\n }\n this.previousValue = displayValue\n input.value = displayValue\n } else {\n input.type = 'number'\n input.value = this.value ?? ''\n }\n\n const numberField = this.field as NumberField\n if (!this.maskEngine && input.type === 'number') {\n if (numberField.min !== undefined) {\n input.min = String(numberField.min)\n }\n if (numberField.max !== undefined) {\n input.max = String(numberField.max)\n }\n if (numberField.step !== undefined) {\n input.step = String(numberField.step)\n }\n }\n\n this.applyCommonProps(input)\n\n // Aplicar placeholder del field si está definido\n if (this.field.placeholder) {\n input.placeholder = this.field.placeholder\n } else if (this.maskEngine && this.field.mask) {\n // Aplicar placeholder de máscara si no hay placeholder del field\n const maskPlaceholder = this.maskEngine.getMaskPlaceholder(this.field.mask)\n if (maskPlaceholder) {\n input.placeholder = maskPlaceholder\n }\n }\n\n // Manejar eventos con máscara\n if (this.maskEngine && this.field.mask) {\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n const cursorPosition = target.selectionStart || 0\n const inputValue = target.value\n\n const result = this.maskEngine!.processInput(\n inputValue,\n this.previousValue,\n this.field.mask!,\n cursorPosition\n )\n\n target.value = result.value\n this.previousValue = result.value\n\n setTimeout(() => {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition)\n }, 0)\n\n // Convertir a número según el tipo de máscara\n let numValue: number | null = null\n if (this.field.mask!.type === 'currency') {\n const unformatted = this.maskEngine!.removeMask(result.value, this.field.mask!)\n numValue = unformatted ? parseFloat(unformatted.replace(/[^\\d.]/g, '')) : null\n } else if (this.field.mask!.type === 'percentage') {\n const unformatted = this.maskEngine!.removeMask(result.value, this.field.mask!)\n numValue = unformatted ? parseFloat(unformatted) : null\n }\n\n this.onChange(numValue)\n })\n\n input.addEventListener('keydown', (e) => {\n const target = e.target as HTMLInputElement\n const cursorPosition = target.selectionStart || 0\n\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault()\n \n const isBackspace = e.key === 'Backspace'\n const result = this.maskEngine!.processKeyInput(\n '',\n target.value,\n cursorPosition,\n this.field.mask!,\n isBackspace\n )\n\n target.value = result.value\n this.previousValue = result.value\n\n setTimeout(() => {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition)\n }, 0)\n\n let numValue: number | null = null\n if (this.field.mask!.type === 'currency') {\n const unformatted = this.maskEngine!.removeMask(result.value, this.field.mask!)\n numValue = unformatted ? parseFloat(unformatted.replace(/[^\\d.]/g, '')) : null\n } else if (this.field.mask!.type === 'percentage') {\n const unformatted = this.maskEngine!.removeMask(result.value, this.field.mask!)\n numValue = unformatted ? parseFloat(unformatted) : null\n }\n\n this.onChange(numValue)\n }\n })\n\n input.addEventListener('paste', (e) => {\n e.preventDefault()\n const pastedText = (e.clipboardData || (window as any).clipboardData).getData('text')\n \n if (pastedText) {\n const target = e.target as HTMLInputElement\n const cursorPosition = target.selectionStart || 0\n \n const before = target.value.substring(0, cursorPosition)\n const after = target.value.substring(cursorPosition)\n const newValue = before + pastedText + after\n\n const result = this.maskEngine!.processInput(\n newValue,\n this.previousValue,\n this.field.mask!,\n cursorPosition\n )\n\n target.value = result.value\n this.previousValue = result.value\n\n setTimeout(() => {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition)\n }, 0)\n\n let numValue: number | null = null\n if (this.field.mask!.type === 'currency') {\n const unformatted = this.maskEngine!.removeMask(result.value, this.field.mask!)\n numValue = unformatted ? parseFloat(unformatted.replace(/[^\\d.]/g, '')) : null\n } else if (this.field.mask!.type === 'percentage') {\n const unformatted = this.maskEngine!.removeMask(result.value, this.field.mask!)\n numValue = unformatted ? parseFloat(unformatted) : null\n }\n\n this.onChange(numValue)\n }\n })\n } else {\n // Sin máscara, comportamiento normal\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n const numValue = target.value === '' ? null : Number(target.value)\n this.onChange(numValue)\n })\n }\n\n input.addEventListener('blur', () => {\n this.onBlur()\n })\n\n return this.createFieldContainer(input)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { TextareaField } from '../../types'\n\nexport class TextareaInput extends BaseInput {\n render(): HTMLElement {\n const textarea = document.createElement('textarea')\n textarea.value = this.value ?? ''\n textarea.placeholder = this.field.placeholder || ''\n\n const textareaField = this.field as TextareaField\n if (textareaField.rows) {\n textarea.rows = textareaField.rows\n }\n if (textareaField.cols) {\n textarea.cols = textareaField.cols\n }\n\n this.applyCommonProps(textarea)\n\n textarea.addEventListener('input', (e) => {\n const target = e.target as HTMLTextAreaElement\n this.onChange(target.value)\n })\n\n textarea.addEventListener('blur', () => {\n this.onBlur()\n })\n\n return this.createFieldContainer(textarea)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { SelectField } from '../../types'\n\nexport class SelectInput extends BaseInput {\n render(): HTMLElement {\n const select = document.createElement('select')\n const selectField = this.field as SelectField\n\n if (selectField.multiple) {\n select.multiple = true\n }\n\n // Opción placeholder cuando no hay selección (solo para select simple)\n if (!selectField.multiple) {\n const placeholderOption = document.createElement('option')\n placeholderOption.value = ''\n placeholderOption.textContent = selectField.placeholder || 'Selecciona una opción'\n placeholderOption.setAttribute('data-placeholder', '')\n placeholderOption.disabled = true\n select.appendChild(placeholderOption)\n }\n\n // Crear opciones\n for (const option of selectField.options) {\n const optionEl = document.createElement('option')\n if (typeof option === 'string') {\n optionEl.value = option\n optionEl.textContent = option\n } else {\n optionEl.value = String(option.value)\n optionEl.textContent = option.label\n }\n select.appendChild(optionEl)\n }\n\n // Establecer valor\n if (selectField.multiple && Array.isArray(this.value)) {\n for (const option of select.options) {\n option.selected = this.value.includes(option.value)\n }\n } else {\n select.value = this.value ?? ''\n }\n\n this.applyCommonProps(select)\n\n const updatePlaceholderClass = () => {\n const isEmpty = !select.value\n if (isEmpty) {\n select.classList.add('easy-form-select-placeholder')\n } else {\n select.classList.remove('easy-form-select-placeholder')\n }\n }\n updatePlaceholderClass()\n\n select.addEventListener('change', (e) => {\n const target = e.target as HTMLSelectElement\n updatePlaceholderClass()\n if (selectField.multiple) {\n const selectedValues = Array.from(target.selectedOptions).map(\n (opt) => opt.value\n )\n this.onChange(selectedValues)\n } else {\n this.onChange(target.value || null)\n }\n })\n\n select.addEventListener('blur', () => {\n this.onBlur()\n })\n\n return this.createFieldContainer(select)\n }\n}\n","import { BaseInput } from './base-input'\n\nexport class CheckboxInput extends BaseInput {\n render(): HTMLElement {\n const checkbox = document.createElement('input')\n checkbox.type = 'checkbox'\n checkbox.checked = Boolean(this.value)\n\n this.applyCommonProps(checkbox)\n\n checkbox.addEventListener('change', (e) => {\n const target = e.target as HTMLInputElement\n this.onChange(target.checked)\n })\n\n checkbox.addEventListener('blur', () => {\n this.onBlur()\n })\n\n const container = document.createElement('div')\n container.className = 'easy-form-field'\n\n // Label (checkbox primero, luego label)\n const label = document.createElement('label')\n label.className = 'easy-form-label-checkbox'\n label.setAttribute('for', this.getFieldId())\n label.appendChild(checkbox)\n if (this.field.label) {\n const labelText = document.createTextNode(this.field.label)\n label.appendChild(labelText)\n }\n container.appendChild(label)\n\n // Description\n if (this.field.description) {\n const description = document.createElement('p')\n description.className = 'easy-form-description'\n description.textContent = this.field.description\n container.appendChild(description)\n }\n\n // Error\n if (this.error) {\n const errorEl = document.createElement('p')\n errorEl.className = 'easy-form-error'\n errorEl.textContent = this.error\n container.appendChild(errorEl)\n }\n\n return container\n }\n}\n","import { BaseInput } from './base-input'\nimport type { RadioField } from '../../types'\n\nexport class RadioInput extends BaseInput {\n render(): HTMLElement {\n const container = document.createElement('div')\n container.className = 'easy-form-field'\n\n // Label\n if (this.field.label) {\n const label = document.createElement('label')\n label.className = 'easy-form-label'\n label.textContent = this.field.label\n if (this.field.validations?.some((v) => v.type === 'required')) {\n const required = document.createElement('span')\n required.className = 'easy-form-required'\n required.textContent = ' *'\n label.appendChild(required)\n }\n container.appendChild(label)\n }\n\n // Radio buttons\n const radioGroup = document.createElement('div')\n radioGroup.className = 'easy-form-radio-group'\n\n const radioField = this.field as RadioField\n for (const option of radioField.options) {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n\n const radioContainer = document.createElement('div')\n radioContainer.className = 'easy-form-radio-option'\n\n const radio = document.createElement('input')\n radio.type = 'radio'\n radio.name = this.field.name\n radio.id = `${this.getFieldId()}-${optionValue}`\n radio.value = String(optionValue)\n radio.checked = String(this.value) === String(optionValue)\n\n if (this.field.disabled) {\n radio.disabled = true\n }\n\n const label = document.createElement('label')\n label.setAttribute('for', radio.id)\n label.textContent = optionLabel\n label.className = 'easy-form-radio-label'\n\n radio.addEventListener('change', () => {\n this.onChange(optionValue)\n })\n\n radio.addEventListener('blur', () => {\n this.onBlur()\n })\n\n radioContainer.appendChild(radio)\n radioContainer.appendChild(label)\n radioGroup.appendChild(radioContainer)\n }\n\n container.appendChild(radioGroup)\n\n // Description\n if (this.field.description) {\n const description = document.createElement('p')\n description.className = 'easy-form-description'\n description.textContent = this.field.description\n container.appendChild(description)\n }\n\n // Error\n if (this.error) {\n const errorEl = document.createElement('p')\n errorEl.className = 'easy-form-error'\n errorEl.textContent = this.error\n container.appendChild(errorEl)\n }\n\n return container\n }\n}\n","import { BaseInput } from './base-input'\n\nexport class SwitchInput extends BaseInput {\n render(): HTMLElement {\n const switchEl = document.createElement('input')\n switchEl.type = 'checkbox'\n switchEl.className = 'easy-form-switch'\n switchEl.checked = Boolean(this.value)\n\n this.applyCommonProps(switchEl)\n\n switchEl.addEventListener('change', (e) => {\n const target = e.target as HTMLInputElement\n this.onChange(target.checked)\n })\n\n switchEl.addEventListener('blur', () => {\n this.onBlur()\n })\n\n const container = document.createElement('div')\n container.className = 'easy-form-field'\n\n // Label con switch\n const label = document.createElement('label')\n label.className = 'easy-form-label-switch'\n label.setAttribute('for', this.getFieldId())\n if (this.field.label) {\n const labelText = document.createTextNode(this.field.label)\n label.appendChild(labelText)\n }\n label.appendChild(switchEl)\n container.appendChild(label)\n\n // Description\n if (this.field.description) {\n const description = document.createElement('p')\n description.className = 'easy-form-description'\n description.textContent = this.field.description\n container.appendChild(description)\n }\n\n // Error\n if (this.error) {\n const errorEl = document.createElement('p')\n errorEl.className = 'easy-form-error'\n errorEl.textContent = this.error\n container.appendChild(errorEl)\n }\n\n return container\n }\n}\n","import { BaseInput } from './base-input'\nimport type { DateField } from '../../types'\n\nexport class DateInput extends BaseInput {\n render(): HTMLElement {\n const input = document.createElement('input')\n input.type = 'date'\n \n const dateField = this.field as DateField\n if (dateField.min) {\n input.min = dateField.min\n }\n if (dateField.max) {\n input.max = dateField.max\n }\n\n if (this.value) {\n const date = this.value instanceof Date \n ? this.value.toISOString().split('T')[0]\n : String(this.value)\n input.value = date\n }\n\n this.applyCommonProps(input)\n\n input.addEventListener('change', (e) => {\n const target = e.target as HTMLInputElement\n this.onChange(target.value || null)\n })\n\n input.addEventListener('blur', () => {\n this.onBlur()\n })\n\n return this.createFieldContainer(input)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { FileField } from '../../types'\n\nexport class FileInput extends BaseInput {\n render(): HTMLElement {\n const input = document.createElement('input')\n input.type = 'file'\n \n const fileField = this.field as FileField\n if (fileField.accept) {\n input.accept = fileField.accept\n }\n if (fileField.multiple) {\n input.multiple = true\n }\n\n this.applyCommonProps(input)\n\n input.addEventListener('change', (e) => {\n const target = e.target as HTMLInputElement\n if (target.files) {\n if (fileField.multiple) {\n this.onChange(Array.from(target.files))\n } else {\n this.onChange(target.files[0] || null)\n }\n }\n })\n\n input.addEventListener('blur', () => {\n this.onBlur()\n })\n\n return this.createFieldContainer(input)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { QuantityField } from '../../types'\n\nexport class QuantityInput extends BaseInput {\n render(): HTMLElement {\n const container = document.createElement('div')\n container.className = 'easy-form-quantity-container'\n\n const quantityField = this.field as QuantityField\n const min = quantityField.min ?? 0\n const max = quantityField.max ?? undefined\n const step = quantityField.step ?? 1\n const currentValue = this.value ?? min\n\n // Contenedor del input con botones\n const inputWrapper = document.createElement('div')\n inputWrapper.className = 'easy-form-quantity-wrapper'\n\n // Botón de decremento\n const decrementBtn = document.createElement('button')\n decrementBtn.type = 'button'\n decrementBtn.className = 'easy-form-quantity-btn easy-form-quantity-decrement'\n decrementBtn.textContent = '−'\n decrementBtn.setAttribute('aria-label', 'Decrementar')\n \n if (currentValue <= min) {\n decrementBtn.disabled = true\n decrementBtn.classList.add('disabled')\n }\n\n // Input numérico\n const input = document.createElement('input')\n input.type = 'number'\n input.value = String(currentValue)\n input.min = String(min)\n if (max !== undefined) {\n input.max = String(max)\n }\n input.step = String(step)\n input.className = 'easy-form-quantity-input'\n this.applyCommonProps(input)\n\n // Botón de incremento\n const incrementBtn = document.createElement('button')\n incrementBtn.type = 'button'\n incrementBtn.className = 'easy-form-quantity-btn easy-form-quantity-increment'\n incrementBtn.textContent = '+'\n incrementBtn.setAttribute('aria-label', 'Incrementar')\n \n if (max !== undefined && currentValue >= max) {\n incrementBtn.disabled = true\n incrementBtn.classList.add('disabled')\n }\n\n // Event listeners para botones\n decrementBtn.addEventListener('click', () => {\n const newValue = Math.max(min, Number(input.value) - step)\n input.value = String(newValue)\n this.onChange(newValue)\n updateButtons()\n })\n\n incrementBtn.addEventListener('click', () => {\n const newValue = max !== undefined \n ? Math.min(max, Number(input.value) + step)\n : Number(input.value) + step\n input.value = String(newValue)\n this.onChange(newValue)\n updateButtons()\n })\n\n // Event listener para input directo\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n let numValue = Number(target.value)\n \n if (isNaN(numValue)) {\n numValue = min\n }\n \n if (numValue < min) {\n numValue = min\n }\n \n if (max !== undefined && numValue > max) {\n numValue = max\n }\n \n target.value = String(numValue)\n this.onChange(numValue)\n updateButtons()\n })\n\n input.addEventListener('blur', () => {\n this.onBlur()\n })\n\n // Función para actualizar estado de botones\n const updateButtons = () => {\n const value = Number(input.value)\n decrementBtn.disabled = value <= min\n decrementBtn.classList.toggle('disabled', value <= min)\n \n if (max !== undefined) {\n incrementBtn.disabled = value >= max\n incrementBtn.classList.toggle('disabled', value >= max)\n } else {\n incrementBtn.disabled = false\n incrementBtn.classList.remove('disabled')\n }\n }\n\n // Agregar elementos al wrapper\n inputWrapper.appendChild(decrementBtn)\n inputWrapper.appendChild(input)\n inputWrapper.appendChild(incrementBtn)\n\n container.appendChild(inputWrapper)\n\n return this.createFieldContainer(container)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { AccordionSelectField } from '../../types'\n\nexport class AccordionSelectInput extends BaseInput {\n private openAccordion: string | null = null\n\n render(): HTMLElement {\n const container = document.createElement('div')\n container.className = 'easy-form-accordion-select-container'\n\n const accordionField = this.field as AccordionSelectField\n const selectedValue = this.value ?? null\n\n // Crear acordeón\n accordionField.options.forEach((option, index) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const optionDescription = typeof option === 'object' && 'description' in option && option.description\n ? option.description\n : undefined\n\n const accordionItem = document.createElement('div')\n accordionItem.className = 'easy-form-accordion-item'\n accordionItem.setAttribute('data-value', String(optionValue))\n\n if (selectedValue === optionValue || (Array.isArray(selectedValue) && selectedValue.includes(optionValue))) {\n accordionItem.classList.add('selected')\n if (!accordionField.multiple) {\n this.openAccordion = String(optionValue)\n }\n }\n\n // Header del acordeón\n const header = document.createElement('div')\n header.className = 'easy-form-accordion-header'\n header.setAttribute('role', 'button')\n header.setAttribute('tabindex', '0')\n header.setAttribute('aria-expanded', 'false')\n\n const headerContent = document.createElement('div')\n headerContent.className = 'easy-form-accordion-header-content'\n\n // Radio/Checkbox visual\n const indicator = document.createElement('div')\n indicator.className = 'easy-form-accordion-indicator'\n if (accordionField.multiple) {\n indicator.classList.add('checkbox')\n if (Array.isArray(selectedValue) && selectedValue.includes(optionValue)) {\n indicator.classList.add('checked')\n }\n } else {\n indicator.classList.add('radio')\n if (selectedValue === optionValue) {\n indicator.classList.add('checked')\n }\n }\n\n const label = document.createElement('span')\n label.className = 'easy-form-accordion-label'\n label.textContent = optionLabel\n\n const arrow = document.createElement('span')\n arrow.className = 'easy-form-accordion-arrow'\n arrow.textContent = '▼'\n\n headerContent.appendChild(indicator)\n headerContent.appendChild(label)\n header.appendChild(headerContent)\n header.appendChild(arrow)\n\n // Contenido del acordeón\n const content = document.createElement('div')\n content.className = 'easy-form-accordion-content'\n \n if (optionDescription) {\n const description = document.createElement('p')\n description.className = 'easy-form-accordion-description'\n description.textContent = optionDescription\n content.appendChild(description)\n }\n\n // Si hay campos anidados o contenido adicional\n if (typeof option === 'object' && 'content' in option && option.content) {\n const customContent = document.createElement('div')\n customContent.className = 'easy-form-accordion-custom-content'\n if (typeof option.content === 'string') {\n customContent.innerHTML = option.content\n } else if (option.content instanceof HTMLElement) {\n customContent.appendChild(option.content)\n }\n content.appendChild(customContent)\n }\n\n accordionItem.appendChild(header)\n accordionItem.appendChild(content)\n\n // Toggle acordeón\n const toggleAccordion = () => {\n const isOpen = accordionItem.classList.contains('open')\n \n if (!accordionField.multiple) {\n // Cerrar otros acordeones\n container.querySelectorAll('.easy-form-accordion-item').forEach((item) => {\n if (item !== accordionItem) {\n item.classList.remove('open')\n const otherHeader = item.querySelector('.easy-form-accordion-header')\n const otherContent = item.querySelector('.easy-form-accordion-content')\n const otherArrow = item.querySelector('.easy-form-accordion-arrow')\n if (otherHeader) otherHeader.setAttribute('aria-expanded', 'false')\n if (otherContent) otherContent.style.maxHeight = null\n if (otherArrow) otherArrow.style.transform = 'rotate(0deg)'\n }\n })\n }\n\n if (isOpen) {\n accordionItem.classList.remove('open')\n header.setAttribute('aria-expanded', 'false')\n content.style.maxHeight = null\n arrow.style.transform = 'rotate(0deg)'\n this.openAccordion = null\n } else {\n accordionItem.classList.add('open')\n header.setAttribute('aria-expanded', 'true')\n content.style.maxHeight = content.scrollHeight + 'px'\n arrow.style.transform = 'rotate(180deg)'\n this.openAccordion = String(optionValue)\n }\n }\n\n // Seleccionar opción\n const selectOption = () => {\n if (accordionField.multiple) {\n const currentValues = Array.isArray(selectedValue) ? [...selectedValue] : []\n const index = currentValues.indexOf(optionValue)\n \n if (index > -1) {\n currentValues.splice(index, 1)\n accordionItem.classList.remove('selected')\n indicator.classList.remove('checked')\n } else {\n currentValues.push(optionValue)\n accordionItem.classList.add('selected')\n indicator.classList.add('checked')\n }\n \n this.onChange(currentValues.length > 0 ? currentValues : null)\n } else {\n // Deseleccionar otros\n container.querySelectorAll('.easy-form-accordion-item').forEach((item) => {\n item.classList.remove('selected')\n const itemIndicator = item.querySelector('.easy-form-accordion-indicator')\n if (itemIndicator) itemIndicator.classList.remove('checked')\n })\n \n accordionItem.classList.add('selected')\n indicator.classList.add('checked')\n this.onChange(optionValue)\n }\n }\n\n header.addEventListener('click', (e) => {\n e.stopPropagation()\n selectOption()\n toggleAccordion()\n })\n\n header.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectOption()\n toggleAccordion()\n }\n })\n\n // Abrir acordeón si está seleccionado inicialmente\n if (selectedValue === optionValue || (Array.isArray(selectedValue) && selectedValue.includes(optionValue))) {\n if (!accordionField.multiple || accordionField.autoExpand) {\n setTimeout(() => {\n accordionItem.classList.add('open')\n header.setAttribute('aria-expanded', 'true')\n content.style.maxHeight = content.scrollHeight + 'px'\n arrow.style.transform = 'rotate(180deg)'\n }, 0)\n }\n }\n\n container.appendChild(accordionItem)\n })\n\n return this.createFieldContainer(container)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { ImageGridSelectField } from '../../types'\n\nexport class ImageGridSelectInput extends BaseInput {\n render(): HTMLElement {\n const container = document.createElement('div')\n container.className = 'easy-form-image-grid-container'\n\n const imageGridField = this.field as ImageGridSelectField\n const selectedValue = this.value ?? null\n const columns = imageGridField.columns ?? 3\n const imageSize = imageGridField.imageSize ?? 'medium'\n\n // Establecer grid columns\n container.style.gridTemplateColumns = `repeat(${columns}, 1fr)`\n container.style.gap = imageGridField.gap ?? '1rem'\n\n // Crear items de imagen\n imageGridField.options.forEach((option) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const optionImage = typeof option === 'object' && 'image' in option && option.image\n ? option.image\n : undefined\n const optionDescription = typeof option === 'object' && 'description' in option && option.description\n ? option.description\n : undefined\n\n const gridItem = document.createElement('div')\n gridItem.className = `easy-form-image-grid-item easy-form-image-grid-${imageSize}`\n gridItem.setAttribute('data-value', String(optionValue))\n gridItem.setAttribute('role', 'button')\n gridItem.setAttribute('tabindex', '0')\n gridItem.setAttribute('aria-label', optionLabel)\n\n if (selectedValue === optionValue || (Array.isArray(selectedValue) && selectedValue.includes(optionValue))) {\n gridItem.classList.add('selected')\n }\n\n // Contenedor de imagen\n const imageContainer = document.createElement('div')\n imageContainer.className = 'easy-form-image-grid-image-container'\n\n if (optionImage) {\n const img = document.createElement('img')\n img.src = optionImage\n img.alt = optionLabel\n img.className = 'easy-form-image-grid-image'\n imageContainer.appendChild(img)\n } else {\n // Placeholder si no hay imagen\n const placeholder = document.createElement('div')\n placeholder.className = 'easy-form-image-grid-placeholder'\n placeholder.textContent = optionLabel.charAt(0).toUpperCase()\n imageContainer.appendChild(placeholder)\n }\n\n // Indicador de selección\n const indicator = document.createElement('div')\n indicator.className = 'easy-form-image-grid-indicator'\n if (imageGridField.multiple) {\n indicator.classList.add('checkbox')\n if (Array.isArray(selectedValue) && selectedValue.includes(optionValue)) {\n indicator.classList.add('checked')\n indicator.innerHTML = '✓'\n }\n } else {\n indicator.classList.add('radio')\n if (selectedValue === optionValue) {\n indicator.classList.add('checked')\n indicator.innerHTML = '●'\n }\n }\n imageContainer.appendChild(indicator)\n\n // Label\n const label = document.createElement('div')\n label.className = 'easy-form-image-grid-label'\n label.textContent = optionLabel\n\n // Description (opcional)\n if (optionDescription) {\n const description = document.createElement('div')\n description.className = 'easy-form-image-grid-description'\n description.textContent = optionDescription\n gridItem.appendChild(description)\n }\n\n gridItem.appendChild(imageContainer)\n gridItem.appendChild(label)\n\n // Seleccionar opción\n const selectOption = () => {\n if (imageGridField.multiple) {\n const currentValues = Array.isArray(selectedValue) ? [...selectedValue] : []\n const index = currentValues.indexOf(optionValue)\n \n if (index > -1) {\n currentValues.splice(index, 1)\n gridItem.classList.remove('selected')\n indicator.classList.remove('checked')\n indicator.innerHTML = ''\n } else {\n currentValues.push(optionValue)\n gridItem.classList.add('selected')\n indicator.classList.add('checked')\n indicator.innerHTML = '✓'\n }\n \n this.onChange(currentValues.length > 0 ? currentValues : null)\n } else {\n // Deseleccionar otros\n container.querySelectorAll('.easy-form-image-grid-item').forEach((item) => {\n item.classList.remove('selected')\n const itemIndicator = item.querySelector('.easy-form-image-grid-indicator')\n if (itemIndicator) {\n itemIndicator.classList.remove('checked')\n itemIndicator.innerHTML = ''\n }\n })\n \n gridItem.classList.add('selected')\n indicator.classList.add('checked')\n indicator.innerHTML = '●'\n this.onChange(optionValue)\n }\n }\n\n gridItem.addEventListener('click', selectOption)\n gridItem.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectOption()\n }\n })\n\n gridItem.addEventListener('blur', () => {\n this.onBlur()\n })\n\n container.appendChild(gridItem)\n })\n\n return this.createFieldContainer(container)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { OTPField } from '../../types'\n\nexport class OTPInput extends BaseInput {\n private inputs: HTMLInputElement[] = []\n\n render(): HTMLElement {\n const container = document.createElement('div')\n container.className = 'easy-form-otp-container'\n\n const otpField = this.field as OTPField\n const length = otpField.length ?? 6\n const value = this.value ?? ''\n const valueString = String(value).padStart(length, '').slice(0, length)\n\n // Crear inputs individuales\n for (let i = 0; i < length; i++) {\n const input = document.createElement('input')\n input.type = 'text'\n input.inputMode = 'numeric'\n input.maxLength = 1\n input.className = 'easy-form-otp-input'\n input.setAttribute('aria-label', `Código dígito ${i + 1}`)\n \n if (valueString[i]) {\n input.value = valueString[i]\n }\n\n this.applyCommonProps(input)\n input.id = `${this.getFieldId()}-${i}`\n\n // Capturar el índice actual para usar en los callbacks\n const currentIndex = i\n\n // Event listeners\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n const inputValue = target.value.replace(/[^0-9]/g, '')\n target.value = inputValue\n\n // Mover al siguiente input si hay valor\n if (inputValue && currentIndex < length - 1) {\n this.inputs[currentIndex + 1].focus()\n }\n\n this.updateOTPValue()\n })\n\n input.addEventListener('keydown', (e) => {\n const target = e.target as HTMLInputElement\n\n // Backspace: borrar y mover al anterior\n if (e.key === 'Backspace' && !target.value && currentIndex > 0) {\n this.inputs[currentIndex - 1].focus()\n this.inputs[currentIndex - 1].value = ''\n this.updateOTPValue()\n }\n\n // Arrow keys: navegar entre inputs\n if (e.key === 'ArrowLeft' && currentIndex > 0) {\n e.preventDefault()\n this.inputs[currentIndex - 1].focus()\n }\n if (e.key === 'ArrowRight' && currentIndex < length - 1) {\n e.preventDefault()\n this.inputs[currentIndex + 1].focus()\n }\n })\n\n input.addEventListener('paste', (e) => {\n e.preventDefault()\n const pastedData = (e.clipboardData || (window as any).clipboardData).getData('text')\n const digits = pastedData.replace(/[^0-9]/g, '').slice(0, length)\n\n // Llenar inputs con los dígitos pegados\n for (let j = 0; j < digits.length && (currentIndex + j) < length; j++) {\n this.inputs[currentIndex + j].value = digits[j]\n }\n\n // Mover foco al último input llenado o al siguiente vacío\n const nextEmptyIndex = Math.min(currentIndex + digits.length, length - 1)\n this.inputs[nextEmptyIndex].focus()\n this.updateOTPValue()\n })\n\n input.addEventListener('focus', (e) => {\n const target = e.target as HTMLInputElement\n target.select()\n })\n\n input.addEventListener('blur', () => {\n this.onBlur()\n })\n\n this.inputs.push(input)\n container.appendChild(input)\n }\n\n return this.createFieldContainer(container)\n }\n\n private updateOTPValue(): void {\n const otpValue = this.inputs.map(input => input.value).join('')\n const otpField = this.field as OTPField\n \n // Si está vacío, enviar null, de lo contrario el string completo\n const finalValue = otpValue.length === this.inputs.length ? otpValue : null\n \n // Si el campo tiene formato numérico, convertir a número\n if (otpField.numeric && finalValue) {\n this.onChange(Number(finalValue))\n } else {\n this.onChange(finalValue)\n }\n }\n}\n","import { BaseInput } from './base-input'\nimport type { PasswordField } from '../../types'\n\nconst DEFAULT_SEPARATED_LENGTH = 6\n\nfunction eyeSvg(visible: boolean): string {\n if (visible) {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/></svg>`\n }\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>`\n}\n\nexport class PasswordInput extends BaseInput {\n private inputs: HTMLInputElement[] = []\n private visible = false\n\n get passwordField(): PasswordField {\n return this.field as PasswordField\n }\n\n render(): HTMLElement {\n const pf = this.passwordField\n const useSeparated = !!pf.characterSeparated\n const length = useSeparated\n ? typeof pf.characterSeparated === 'number'\n ? pf.characterSeparated\n : DEFAULT_SEPARATED_LENGTH\n : 0\n\n if (useSeparated) {\n return this.createFieldContainer(this.renderSeparated(length))\n }\n return this.createFieldContainer(this.renderSingle())\n }\n\n private renderSingle(): HTMLElement {\n const pf = this.passwordField\n const showToggle = !!pf.showToggle\n\n const input = document.createElement('input')\n input.type = 'password'\n input.value = this.value ?? ''\n input.id = this.getFieldId()\n this.applyCommonProps(input)\n if (this.field.placeholder) input.placeholder = this.field.placeholder\n\n input.addEventListener('input', (e) => {\n this.onChange((e.target as HTMLInputElement).value)\n })\n input.addEventListener('blur', () => this.onBlur())\n\n if (!showToggle) {\n return input\n }\n\n const wrapper = document.createElement('div')\n wrapper.className = 'easy-form-password-inner'\n input.classList.add('easy-form-password-input')\n wrapper.appendChild(input)\n\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.className = 'easy-form-password-toggle'\n btn.setAttribute('aria-label', 'Mostrar contraseña')\n btn.innerHTML = eyeSvg(false)\n btn.addEventListener('click', () => {\n this.visible = !this.visible\n input.type = this.visible ? 'text' : 'password'\n btn.setAttribute('aria-label', this.visible ? 'Ocultar contraseña' : 'Mostrar contraseña')\n btn.innerHTML = eyeSvg(this.visible)\n })\n wrapper.appendChild(btn)\n return wrapper\n }\n\n private renderSeparated(length: number): HTMLElement {\n const pf = this.passwordField\n const showToggle = !!pf.showToggle\n const value = this.value ?? ''\n const valueString = String(value).slice(0, length)\n\n const container = document.createElement('div')\n container.className = 'easy-form-password-separated'\n\n for (let i = 0; i < length; i++) {\n const input = document.createElement('input')\n input.type = 'password'\n input.maxLength = 1\n input.className = 'easy-form-password-separated-input'\n input.setAttribute('aria-label', `Carácter ${i + 1} de ${length}`)\n if (valueString[i]) input.value = valueString[i]\n this.applyCommonProps(input)\n input.id = i === 0 ? this.getFieldId() : `${this.getFieldId()}-${i}`\n if (i > 0) input.removeAttribute('name') // solo el primero conserva name para que el form encuentre el campo\n const currentIndex = i\n\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n const val = target.value\n if (val && currentIndex < length - 1) {\n this.inputs[currentIndex + 1].focus()\n }\n this.updateSeparatedValue()\n })\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Backspace' && !(e.target as HTMLInputElement).value && currentIndex > 0) {\n this.inputs[currentIndex - 1].focus()\n this.inputs[currentIndex - 1].value = ''\n this.updateSeparatedValue()\n }\n if (e.key === 'ArrowLeft' && currentIndex > 0) {\n e.preventDefault()\n this.inputs[currentIndex - 1].focus()\n }\n if (e.key === 'ArrowRight' && currentIndex < length - 1) {\n e.preventDefault()\n this.inputs[currentIndex + 1].focus()\n }\n })\n\n input.addEventListener('paste', (e) => {\n e.preventDefault()\n const text = (e.clipboardData || (window as any).clipboardData)?.getData('text') || ''\n const chars = text.slice(0, length - currentIndex).split('')\n for (let j = 0; j < chars.length && currentIndex + j < length; j++) {\n this.inputs[currentIndex + j].value = chars[j]\n }\n const nextIdx = Math.min(currentIndex + chars.length, length - 1)\n this.inputs[nextIdx].focus()\n this.updateSeparatedValue()\n })\n\n input.addEventListener('focus', (e) => (e.target as HTMLInputElement).select())\n input.addEventListener('blur', () => this.onBlur())\n\n this.inputs.push(input)\n container.appendChild(input)\n }\n\n if (showToggle) {\n const toggleWrap = document.createElement('div')\n toggleWrap.className = 'easy-form-password-separated-toggle'\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.className = 'easy-form-password-toggle'\n btn.setAttribute('aria-label', 'Mostrar contraseña')\n btn.innerHTML = eyeSvg(false)\n btn.addEventListener('click', () => {\n this.visible = !this.visible\n const type = this.visible ? 'text' : 'password'\n this.inputs.forEach((inp) => { inp.type = type })\n btn.setAttribute('aria-label', this.visible ? 'Ocultar contraseña' : 'Mostrar contraseña')\n btn.innerHTML = eyeSvg(this.visible)\n })\n toggleWrap.appendChild(btn)\n container.appendChild(toggleWrap)\n }\n\n return container\n }\n\n private updateSeparatedValue(): void {\n const value = this.inputs.map((inp) => inp.value).join('')\n this.onChange(value || null)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { FileDropField } from '../../types'\n\nexport class FileDropInput extends BaseInput {\n render(): HTMLElement {\n const fileDropField = this.field as FileDropField\n const accept = fileDropField.accept ?? ''\n const multiple = fileDropField.multiple ?? false\n\n const dropZone = document.createElement('div')\n dropZone.className = 'easy-form-file-drop'\n dropZone.setAttribute('tabindex', '0')\n\n const hiddenInput = document.createElement('input')\n hiddenInput.type = 'file'\n hiddenInput.className = 'easy-form-file-drop-input'\n hiddenInput.style.display = 'none'\n if (accept) hiddenInput.accept = accept\n if (multiple) hiddenInput.multiple = true\n\n const label = document.createElement('span')\n label.className = 'easy-form-file-drop-label'\n label.textContent = 'Arrastra archivos aquí o haz clic para seleccionar'\n dropZone.appendChild(label)\n dropZone.appendChild(hiddenInput)\n\n const fileList = document.createElement('div')\n fileList.className = 'easy-form-file-drop-list'\n\n const renderFileList = (files: File | File[] | null) => {\n const names = !files\n ? []\n : Array.isArray(files)\n ? files.map((f) => f.name)\n : [files.name]\n fileList.innerHTML = ''\n if (names.length === 0) {\n fileList.style.display = 'none'\n return\n }\n fileList.style.display = 'block'\n names.forEach((name) => {\n const item = document.createElement('div')\n item.className = 'easy-form-file-drop-item'\n item.textContent = name\n fileList.appendChild(item)\n })\n }\n renderFileList(this.value as File | File[] | null)\n\n const handleFiles = (files: FileList | null) => {\n if (!files || files.length === 0) return\n const arr = multiple ? Array.from(files) : files[0]\n this.onChange(arr)\n this.onBlur()\n renderFileList(arr)\n }\n\n dropZone.addEventListener('click', () => {\n hiddenInput.click()\n })\n\n hiddenInput.addEventListener('change', (e) => {\n const target = e.target as HTMLInputElement\n handleFiles(target.files)\n target.value = ''\n })\n\n dropZone.addEventListener('dragover', (e) => {\n e.preventDefault()\n e.stopPropagation()\n dropZone.classList.add('easy-form-file-drop-over')\n })\n\n dropZone.addEventListener('dragleave', (e) => {\n e.preventDefault()\n e.stopPropagation()\n dropZone.classList.remove('easy-form-file-drop-over')\n })\n\n dropZone.addEventListener('drop', (e) => {\n e.preventDefault()\n e.stopPropagation()\n dropZone.classList.remove('easy-form-file-drop-over')\n handleFiles(e.dataTransfer?.files ?? null)\n })\n\n dropZone.appendChild(fileList)\n return this.createFieldContainer(dropZone)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { MapField } from '../../types'\n\nconst LEAFLET_CSS = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css'\n\nexport class MapInput extends BaseInput {\n private mapInstance: L.Map | null = null\n private markerInstance: L.Marker | null = null\n\n render(): HTMLElement {\n const mapField = this.field as MapField\n const center = mapField.center ?? { lat: 0, lng: 0 }\n const zoom = mapField.zoom ?? 13\n const value = this.value as { lat?: number; lng?: number } | string | null | undefined\n const lat = typeof value === 'object' && value?.lat != null ? value.lat : center.lat\n const lng = typeof value === 'object' && value?.lng != null ? value.lng : center.lng\n\n const container = document.createElement('div')\n container.className = 'easy-form-map'\n\n const inputsWrapper = document.createElement('div')\n inputsWrapper.className = 'easy-form-map-inputs'\n\n const latInput = document.createElement('input')\n latInput.type = 'number'\n latInput.step = 'any'\n latInput.placeholder = 'Latitud'\n latInput.value = String(lat)\n latInput.className = 'easy-form-map-lat'\n\n const lngInput = document.createElement('input')\n lngInput.type = 'number'\n lngInput.step = 'any'\n lngInput.placeholder = 'Longitud'\n lngInput.value = String(lng)\n lngInput.className = 'easy-form-map-lng'\n\n const updateFromInputs = () => {\n const latVal = parseFloat(latInput.value)\n const lngVal = parseFloat(lngInput.value)\n if (!isNaN(latVal) && !isNaN(lngVal)) {\n this.onChange({ lat: latVal, lng: lngVal })\n this.syncMarkerPosition(latVal, lngVal)\n }\n this.onBlur()\n }\n\n latInput.addEventListener('change', updateFromInputs)\n lngInput.addEventListener('change', updateFromInputs)\n\n inputsWrapper.appendChild(latInput)\n inputsWrapper.appendChild(lngInput)\n container.appendChild(inputsWrapper)\n\n const mapContainer = document.createElement('div')\n mapContainer.className = 'easy-form-map-container'\n container.appendChild(mapContainer)\n\n // Inyectar CSS de Leaflet DENTRO del contenedor para que quede en el Shadow DOM\n // (document.head no aplica estilos al Shadow DOM de easy-form)\n const linkId = 'easy-form-leaflet-css'\n let cssLoaded = false\n const link = document.createElement('link')\n link.id = linkId\n link.rel = 'stylesheet'\n link.href = LEAFLET_CSS\n link.onload = () => { cssLoaded = true }\n container.insertBefore(link, container.firstChild)\n\n const initMap = async () => {\n if (typeof window === 'undefined') return\n \n // Asegurar que el contenedor tenga dimensiones antes de inicializar\n mapContainer.style.height = '300px'\n mapContainer.style.width = '100%'\n mapContainer.style.position = 'relative'\n mapContainer.style.overflow = 'hidden'\n mapContainer.style.display = 'block'\n\n // Esperar a que el CSS se cargue y el contenedor esté en el DOM con dimensiones\n await new Promise((resolve) => {\n const checkReady = () => {\n if (cssLoaded && mapContainer.offsetWidth > 0 && mapContainer.offsetHeight > 0) {\n resolve(undefined)\n } else {\n requestAnimationFrame(checkReady)\n }\n }\n checkReady()\n })\n \n // Esperar un poco más para asegurar que el layout esté completamente calculado\n await new Promise((resolve) => setTimeout(resolve, 50))\n\n let L: typeof import('leaflet')\n try {\n L = await import('leaflet')\n } catch {\n mapContainer.innerHTML = `\n <div style=\"padding:2rem;text-align:center;color:#666;font-size:0.875rem;background:#f9f9f9;border-radius:4px;\">\n <strong>Campo map requiere Leaflet</strong><br><br>\n Instala e importa Leaflet para usar el mapa interactivo:<br>\n <code>npm install leaflet</code><br><br>\n En tu app: <code>import 'leaflet'</code> y <code>import 'leaflet/dist/leaflet.css'</code><br>\n <a href=\"https://easyforms.dev/docs/tipos-campos#map\" target=\"_blank\" rel=\"noopener\" style=\"color:var(--easy-form-primary,#007bff);\">Ver documentación</a>\n </div>\n `\n return\n }\n\n // Fix icon paths when bundled (Leaflet default icons break with bundlers)\n delete (L.Icon.Default.prototype as { _getIconUrl?: unknown })._getIconUrl\n L.Icon.Default.mergeOptions({\n iconRetinaUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon-2x.png',\n iconUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png',\n shadowUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png',\n })\n\n this.mapInstance = L.map(mapContainer, {\n preferCanvas: false,\n zoomControl: true\n }).setView([lat, lng], zoom)\n\n const tileLayer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a>',\n maxZoom: 19\n }).addTo(this.mapInstance)\n\n // Invalidar tamaño inmediatamente después de crear el mapa\n this.mapInstance.invalidateSize()\n \n // Invalidar tamaño después de que los tiles se hayan cargado\n tileLayer.on('load', () => {\n if (this.mapInstance) {\n this.mapInstance.invalidateSize()\n }\n })\n \n // Invalidar tamaño con múltiples intentos para asegurar que todo esté renderizado\n const invalidateSize = () => {\n if (this.mapInstance) {\n this.mapInstance.invalidateSize()\n }\n }\n setTimeout(invalidateSize, 100)\n setTimeout(invalidateSize, 300)\n setTimeout(invalidateSize, 500)\n \n // Invalidar tamaño cuando el contenedor sea visible (por si estaba oculto inicialmente)\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && this.mapInstance) {\n setTimeout(() => {\n this.mapInstance?.invalidateSize()\n }, 100)\n }\n })\n })\n observer.observe(mapContainer)\n\n this.markerInstance = L.marker([lat, lng], { draggable: true })\n .addTo(this.mapInstance)\n .on('dragend', () => {\n const pos = this.markerInstance!.getLatLng()\n latInput.value = String(Number(pos.lat.toFixed(6)))\n lngInput.value = String(Number(pos.lng.toFixed(6)))\n this.onChange({ lat: pos.lat, lng: pos.lng })\n this.onBlur()\n })\n\n this.mapInstance.on('click', (e: L.LeafletMouseEvent) => {\n const { lat: newLat, lng: newLng } = e.latlng\n this.markerInstance!.setLatLng([newLat, newLng])\n latInput.value = String(Number(newLat.toFixed(6)))\n lngInput.value = String(Number(newLng.toFixed(6)))\n this.onChange({ lat: newLat, lng: newLng })\n this.onBlur()\n })\n }\n\n initMap()\n\n return this.createFieldContainer(container)\n }\n\n private syncMarkerPosition(newLat: number, newLng: number): void {\n if (this.mapInstance && this.markerInstance) {\n this.markerInstance.setLatLng([newLat, newLng])\n this.mapInstance.setView([newLat, newLng])\n // Invalidar tamaño por si el contenedor cambió\n setTimeout(() => {\n this.mapInstance?.invalidateSize()\n }, 50)\n }\n }\n}\n","import { BaseInput } from './base-input'\nimport type { RatingField } from '../../types'\n\nconst STAR_SVG = (filled: boolean) =>\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"${filled ? 'currentColor' : 'none'}\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" role=\"img\" aria-hidden=\"true\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/></svg>`\n\nexport class RatingInput extends BaseInput {\n render(): HTMLElement {\n const ratingField = this.field as RatingField\n const max = ratingField.max ?? 5\n const half = ratingField.half ?? false\n const currentValue = this.value != null ? Number(this.value) : 0\n\n const container = document.createElement('div')\n container.className = 'easy-form-rating'\n container.setAttribute('role', 'slider')\n container.setAttribute('aria-valuemin', '0')\n container.setAttribute('aria-valuemax', String(max))\n container.setAttribute('aria-valuenow', String(currentValue))\n container.setAttribute('aria-label', this.field.label || 'Rating')\n container.setAttribute('tabindex', '0')\n\n const starsContainer = document.createElement('div')\n starsContainer.className = 'easy-form-rating-stars'\n\n for (let i = 1; i <= max; i++) {\n const starWrapper = document.createElement('button')\n starWrapper.type = 'button'\n const filled = currentValue >= i || (half && currentValue >= i - 0.5)\n starWrapper.className = filled\n ? 'easy-form-rating-star easy-form-rating-star-filled'\n : 'easy-form-rating-star'\n starWrapper.innerHTML = STAR_SVG(filled)\n starWrapper.setAttribute('aria-label', `${i} de ${max}`)\n starWrapper.addEventListener('click', (e) => {\n e.preventDefault()\n const rect = (e.target as HTMLElement).closest('button')?.getBoundingClientRect()\n let val = i\n if (half && rect) {\n const mid = rect.left + rect.width / 2\n val = (e as MouseEvent).clientX < mid ? i - 0.5 : i\n }\n this.onChange(val)\n this.onBlur()\n this.rerenderStars(container, max, val, half)\n container.setAttribute('aria-valuenow', String(val))\n })\n starsContainer.appendChild(starWrapper)\n }\n\n container.appendChild(starsContainer)\n\n container.addEventListener('keydown', (e) => {\n const cur = Number(container.getAttribute('aria-valuenow')) || 0\n let newVal = cur\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault()\n newVal = Math.min(max, half ? cur + 0.5 : cur + 1)\n this.onChange(newVal)\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault()\n newVal = Math.max(0, half ? cur - 0.5 : cur - 1)\n this.onChange(newVal)\n }\n if (newVal !== cur) {\n this.rerenderStars(container, max, newVal, half)\n container.setAttribute('aria-valuenow', String(newVal))\n }\n })\n\n return this.createFieldContainer(container)\n }\n\n private rerenderStars(\n container: HTMLElement,\n max: number,\n value: number,\n half: boolean\n ): void {\n const stars = container.querySelectorAll('.easy-form-rating-star')\n stars.forEach((star, i) => {\n const idx = i + 1\n const filled = value >= idx || (half && value >= idx - 0.5)\n star.className = filled\n ? 'easy-form-rating-star easy-form-rating-star-filled'\n : 'easy-form-rating-star'\n star.innerHTML = STAR_SVG(filled)\n })\n }\n}\n","import { BaseInput } from './base-input'\nimport type { SliderField } from '../../types'\n\nexport class SliderInput extends BaseInput {\n render(): HTMLElement {\n const sliderField = this.field as SliderField\n const min = sliderField.min ?? 0\n const max = sliderField.max ?? 100\n const step = sliderField.step ?? 1\n const showValue = sliderField.showValue ?? false\n\n const input = document.createElement('input')\n input.type = 'range'\n input.min = String(min)\n input.max = String(max)\n input.step = String(step)\n input.value = this.value != null ? String(this.value) : String(min)\n\n input.setAttribute('aria-valuemin', String(min))\n input.setAttribute('aria-valuemax', String(max))\n input.setAttribute('aria-valuenow', input.value)\n\n this.applyCommonProps(input)\n\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n const val = step >= 1 ? parseInt(target.value, 10) : parseFloat(target.value)\n this.onChange(isNaN(val) ? min : val)\n if (valueSpan) {\n valueSpan.textContent = target.value\n }\n input.setAttribute('aria-valuenow', target.value)\n })\n\n input.addEventListener('change', () => {\n this.onBlur()\n })\n\n let valueSpan: HTMLSpanElement | null = null\n if (showValue) {\n valueSpan = document.createElement('span')\n valueSpan.className = 'easy-form-slider-value'\n valueSpan.textContent = input.value\n const wrapper = document.createElement('div')\n wrapper.className = 'easy-form-slider-wrapper'\n wrapper.appendChild(input)\n wrapper.appendChild(valueSpan)\n return this.createFieldContainer(wrapper)\n }\n\n return this.createFieldContainer(input)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { ColorpickerField } from '../../types'\n\nconst HEX_REGEX = /^#?([0-9A-Fa-f]{6})$/\n\nfunction toHex(value: string): string {\n const m = value.match(HEX_REGEX)\n if (m) return `#${m[1].toLowerCase()}`\n if (/^[0-9A-Fa-f]{6}$/.test(value)) return `#${value.toLowerCase()}`\n return '#000000'\n}\n\nexport class ColorInput extends BaseInput {\n render(): HTMLElement {\n const colorField = this.field as ColorpickerField\n const defaultValue = colorField.defaultValue ?? '#000000'\n const currentValue =\n this.value != null && typeof this.value === 'string'\n ? toHex(this.value)\n : defaultValue\n\n const wrapper = document.createElement('div')\n wrapper.className = 'easy-form-color-wrapper'\n\n const colorPicker = document.createElement('input')\n colorPicker.type = 'color'\n colorPicker.value = currentValue\n colorPicker.setAttribute('value', currentValue)\n colorPicker.setAttribute('aria-label', this.field.label || 'Color')\n colorPicker.id = `${this.getFieldId()}-picker`\n if (this.field.disabled) colorPicker.setAttribute('disabled', 'true')\n\n const textInput = document.createElement('input')\n textInput.type = 'text'\n textInput.value = currentValue\n textInput.setAttribute('aria-label', `${this.field.label || 'Color'} (hex)`)\n textInput.placeholder = '#000000'\n textInput.className = 'easy-form-color-text'\n this.applyCommonProps(textInput)\n\n const syncFromPicker = () => {\n const value = colorPicker.value || '#000000'\n const hex = toHex(value)\n textInput.value = hex\n this.onChange(hex)\n }\n\n const syncFromText = () => {\n const raw = textInput.value.trim()\n const value = raw.startsWith('#') ? raw : `#${raw}`\n if (/^#[0-9A-Fa-f]{6}$/.test(value)) {\n const hex = toHex(value)\n colorPicker.value = hex\n this.onChange(hex)\n }\n }\n\n colorPicker.addEventListener('input', syncFromPicker)\n colorPicker.addEventListener('change', () => {\n syncFromPicker()\n this.onBlur()\n })\n textInput.addEventListener('input', syncFromText)\n textInput.addEventListener('blur', () => {\n syncFromText()\n this.onBlur()\n })\n\n wrapper.appendChild(colorPicker)\n wrapper.appendChild(textInput)\n return this.createFieldContainer(wrapper)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { MarkdownField } from '../../types'\n\nexport class MarkdownInput extends BaseInput {\n private textareaEl: HTMLTextAreaElement | null = null\n private previewEl: HTMLElement | null = null\n\n render(): HTMLElement {\n const field = this.field as MarkdownField\n const showPreview = field.preview ?? true\n const showToolbar = field.toolbar ?? true\n const height = field.height ?? '300px'\n\n const container = document.createElement('div')\n container.className = 'easy-form-markdown'\n\n if (showToolbar) {\n const toolbar = this.createToolbar()\n container.appendChild(toolbar)\n }\n\n const editorWrapper = document.createElement('div')\n editorWrapper.className = 'easy-form-markdown-editor-wrapper'\n\n const textarea = document.createElement('textarea')\n textarea.className = 'easy-form-markdown-textarea'\n textarea.value = (this.value as string) || ''\n textarea.placeholder = field.placeholder || 'Escribe en Markdown...'\n textarea.style.height = height\n this.textareaEl = textarea\n\n textarea.addEventListener('input', () => {\n this.onChange(textarea.value)\n this.updatePreview()\n })\n\n textarea.addEventListener('blur', () => {\n this.onBlur()\n })\n\n editorWrapper.appendChild(textarea)\n container.appendChild(editorWrapper)\n\n if (showPreview) {\n const preview = document.createElement('div')\n preview.className = 'easy-form-markdown-preview'\n preview.style.height = height\n this.previewEl = preview\n\n if (this.value) {\n this.renderPreview(this.value as string, preview)\n } else {\n preview.innerHTML = '<div class=\"easy-form-markdown-preview-placeholder\">Vista previa</div>'\n }\n\n editorWrapper.appendChild(preview)\n }\n\n this.checkAndShowDependenciesMessage()\n\n return this.createFieldContainer(container)\n }\n\n private createToolbar(): HTMLElement {\n const toolbar = document.createElement('div')\n toolbar.className = 'easy-form-markdown-toolbar'\n\n const buttons: Array<{ icon: string; title: string; prefix: string; suffix: string; placeholder: string }> = [\n { icon: '<strong>B</strong>', title: 'Negrita', prefix: '**', suffix: '**', placeholder: 'texto en negrita' },\n { icon: '<em>I</em>', title: 'Cursiva', prefix: '_', suffix: '_', placeholder: 'texto en cursiva' },\n { icon: 'H1', title: 'Encabezado 1', prefix: '# ', suffix: '', placeholder: 'título' },\n { icon: 'H2', title: 'Encabezado 2', prefix: '## ', suffix: '', placeholder: 'título' },\n { icon: '🔗', title: 'Enlace', prefix: '[', suffix: '](url)', placeholder: 'texto del enlace' },\n { icon: '<code>&lt;/&gt;</code>', title: 'Código', prefix: '`', suffix: '`', placeholder: 'código' },\n { icon: '📷', title: 'Imagen', prefix: '![', suffix: '](url)', placeholder: 'texto alternativo' },\n { icon: '•', title: 'Lista', prefix: '- ', suffix: '', placeholder: 'elemento' },\n { icon: '1.', title: 'Lista numerada', prefix: '1. ', suffix: '', placeholder: 'elemento' },\n { icon: '\"', title: 'Cita', prefix: '> ', suffix: '', placeholder: 'cita' },\n ]\n\n buttons.forEach(btn => {\n const button = document.createElement('button')\n button.type = 'button'\n button.className = 'easy-form-markdown-toolbar-btn'\n button.title = btn.title\n button.innerHTML = btn.icon\n button.addEventListener('click', () => this.insertMarkdown(btn.prefix, btn.suffix, btn.placeholder))\n toolbar.appendChild(button)\n })\n\n return toolbar\n }\n\n private insertMarkdown(prefix: string, suffix: string, placeholder: string): void {\n const textarea = this.textareaEl\n if (!textarea) return\n\n const start = textarea.selectionStart\n const end = textarea.selectionEnd\n const text = textarea.value\n const selectedText = text.substring(start, end) || (placeholder ?? '')\n\n const newText = text.substring(0, start) + prefix + selectedText + suffix + text.substring(end)\n textarea.value = newText\n\n const newCursorPos = start + prefix.length + selectedText.length\n textarea.setSelectionRange(newCursorPos, newCursorPos)\n textarea.focus()\n\n this.onChange(newText)\n this.updatePreview()\n }\n\n private updatePreview(): void {\n if (!this.previewEl) return\n const value = this.textareaEl?.value || ''\n if (!value) {\n this.previewEl.innerHTML = '<div class=\"easy-form-markdown-preview-placeholder\">Vista previa</div>'\n return\n }\n this.renderPreview(value, this.previewEl)\n }\n\n private async renderPreview(markdown: string, container: HTMLElement): Promise<void> {\n container.innerHTML = '<div class=\"easy-form-markdown-preview-loading\">Cargando...</div>'\n\n try {\n const marked = await import('marked')\n const markedModule = marked.default || marked\n const html = await markedModule.parse(markdown)\n container.innerHTML = html\n } catch {\n container.innerHTML = `\n <div class=\"easy-form-markdown-error\">\n <strong>Vista previa no disponible</strong><br><br>\n Instala <code>marked</code> para usar la vista previa:<br>\n <code>npm install marked</code><br><br>\n En tu app: <code>import 'marked'</code>\n </div>\n `\n }\n }\n\n private checkAndShowDependenciesMessage(): void {\n setTimeout(async () => {\n if (!this.previewEl) return\n try {\n await import('marked')\n } catch {\n const previewPlaceholder = this.previewEl.querySelector('.easy-form-markdown-preview-placeholder') as HTMLElement\n if (previewPlaceholder) {\n previewPlaceholder.innerHTML += '<br><small style=\"color:#888\">Instala <code>marked</code> para renderizar</small>'\n }\n }\n }, 100)\n }\n}\n","import { TextInput } from './text-input'\nimport { NumberInput } from './number-input'\nimport { TextareaInput } from './textarea-input'\nimport { SelectInput } from './select-input'\nimport { CheckboxInput } from './checkbox-input'\nimport { RadioInput } from './radio-input'\nimport { SwitchInput } from './switch-input'\nimport { DateInput } from './date-input'\nimport { FileInput } from './file-input'\nimport { QuantityInput } from './quantity-input'\nimport { AccordionSelectInput } from './accordion-select-input'\nimport { ImageGridSelectInput } from './image-grid-select-input'\nimport { OTPInput } from './otp-input'\nimport { PasswordInput } from './password-input'\nimport { FileDropInput } from './file-drop-input'\nimport { MapInput } from './map-input'\nimport { RatingInput } from './rating-input'\nimport { SliderInput } from './slider-input'\nimport { ColorInput } from './color-input'\nimport { MarkdownInput } from './markdown-input'\nimport type { Field, CustomComponent } from '../../types'\n\n/**\n * Factory para crear inputs\n */\nexport function createInput(\n field: Field,\n value: any,\n error: string | undefined,\n onChange: (value: any) => void,\n onBlur: () => void\n): HTMLElement {\n switch (field.type) {\n case 'text':\n case 'email':\n return new TextInput(field, value, error, onChange, onBlur).render()\n case 'password':\n return new PasswordInput(field, value, error, onChange, onBlur).render()\n case 'number':\n return new NumberInput(field, value, error, onChange, onBlur).render()\n case 'textarea':\n return new TextareaInput(field, value, error, onChange, onBlur).render()\n case 'select':\n return new SelectInput(field, value, error, onChange, onBlur).render()\n case 'checkbox':\n return new CheckboxInput(field, value, error, onChange, onBlur).render()\n case 'radio':\n return new RadioInput(field, value, error, onChange, onBlur).render()\n case 'switch':\n return new SwitchInput(field, value, error, onChange, onBlur).render()\n case 'date':\n return new DateInput(field, value, error, onChange, onBlur).render()\n case 'file':\n return new FileInput(field, value, error, onChange, onBlur).render()\n case 'file-drop':\n return new FileDropInput(field, value, error, onChange, onBlur).render()\n case 'map':\n return new MapInput(field, value, error, onChange, onBlur).render()\n case 'rating':\n return new RatingInput(field, value, error, onChange, onBlur).render()\n case 'slider':\n return new SliderInput(field, value, error, onChange, onBlur).render()\n case 'colorpicker':\n return new ColorInput(field, value, error, onChange, onBlur).render()\n case 'quantity':\n return new QuantityInput(field, value, error, onChange, onBlur).render()\n case 'accordion-select':\n return new AccordionSelectInput(field, value, error, onChange, onBlur).render()\n case 'image-grid-select':\n return new ImageGridSelectInput(field, value, error, onChange, onBlur).render()\n case 'otp':\n return new OTPInput(field, value, error, onChange, onBlur).render()\n case 'markdown':\n return new MarkdownInput(field, value, error, onChange, onBlur).render()\n default:\n const div = document.createElement('div')\n div.textContent = `Tipo de campo no soportado: ${field.type}`\n return div\n }\n}\n\n/**\n * Registro de componentes personalizados\n */\nlet customComponents: Map<string, CustomComponent> = new Map()\n\n/**\n * Registra un componente personalizado\n */\nexport function registerComponent(\n type: string,\n component: CustomComponent\n): void {\n customComponents.set(type, component)\n}\n\n/**\n * Registra múltiples componentes\n */\nexport function registerComponents(\n components: Record<string, CustomComponent>\n): void {\n for (const [type, component] of Object.entries(components)) {\n registerComponent(type, component)\n }\n}\n\n/**\n * Obtiene un componente personalizado\n */\nexport function getCustomComponent(type: string): CustomComponent | undefined {\n return customComponents.get(type)\n}\n","import type { FormSchema, Field, TemplateName } from '../types'\n\n/**\n * Login form template\n */\nconst loginTemplate: FormSchema = {\n fields: [\n {\n type: 'email',\n name: 'email',\n label: 'Email',\n placeholder: 'Enter your email',\n validations: [\n { type: 'required', message: 'Email is required' },\n { type: 'email', message: 'Please enter a valid email' },\n ],\n },\n {\n type: 'password',\n name: 'password',\n label: 'Password',\n placeholder: 'Enter your password',\n validations: [\n { type: 'required', message: 'Password is required' },\n { type: 'minLength', value: 6, message: 'Password must be at least 6 characters' },\n ],\n },\n {\n type: 'checkbox',\n name: 'rememberMe',\n label: 'Remember me',\n defaultValue: false,\n },\n ],\n}\n\n/**\n * Registration form template\n */\nconst registerTemplate: FormSchema = {\n fields: [\n {\n type: 'text',\n name: 'name',\n label: 'Full Name',\n placeholder: 'Enter your full name',\n validations: [\n { type: 'required', message: 'Name is required' },\n { type: 'minLength', value: 2, message: 'Name must be at least 2 characters' },\n ],\n },\n {\n type: 'email',\n name: 'email',\n label: 'Email',\n placeholder: 'Enter your email',\n validations: [\n { type: 'required', message: 'Email is required' },\n { type: 'email', message: 'Please enter a valid email' },\n ],\n },\n {\n type: 'password',\n name: 'password',\n label: 'Password',\n placeholder: 'Create a password',\n validations: [\n { type: 'required', message: 'Password is required' },\n { type: 'minLength', value: 8, message: 'Password must be at least 8 characters' },\n ],\n },\n {\n type: 'password',\n name: 'confirmPassword',\n label: 'Confirm Password',\n placeholder: 'Confirm your password',\n validations: [\n { type: 'required', message: 'Please confirm your password' },\n {\n type: 'custom',\n validator: (value) => {\n // Note: For password matching validation, you may need to implement\n // a custom validation that accesses the form's state manager\n // or use a form-level validation on submit\n return typeof value === 'string' && value.length >= 8\n },\n message: 'Password must be at least 8 characters',\n },\n ],\n },\n ],\n}\n\n/**\n * OTP verification template\n */\nconst otpTemplate: FormSchema = {\n fields: [\n {\n type: 'otp',\n name: 'code',\n label: 'Verification Code',\n validations: [\n { type: 'required', message: 'Verification code is required' },\n ],\n },\n ],\n}\n\n/**\n * Contact form template\n */\nconst contactTemplate: FormSchema = {\n fields: [\n {\n type: 'text',\n name: 'name',\n label: 'Name',\n placeholder: 'Enter your name',\n validations: [\n { type: 'required', message: 'Name is required' },\n ],\n },\n {\n type: 'email',\n name: 'email',\n label: 'Email',\n placeholder: 'Enter your email',\n validations: [\n { type: 'required', message: 'Email is required' },\n { type: 'email', message: 'Please enter a valid email' },\n ],\n },\n {\n type: 'text',\n name: 'subject',\n label: 'Subject',\n placeholder: 'Enter the subject',\n validations: [\n { type: 'required', message: 'Subject is required' },\n ],\n },\n {\n type: 'textarea',\n name: 'message',\n label: 'Message',\n placeholder: 'Enter your message',\n rows: 5,\n validations: [\n { type: 'required', message: 'Message is required' },\n { type: 'minLength', value: 10, message: 'Message must be at least 10 characters' },\n ],\n },\n ],\n}\n\n/**\n * Password reset request template\n */\nconst passwordResetTemplate: FormSchema = {\n fields: [\n {\n type: 'email',\n name: 'email',\n label: 'Email',\n placeholder: 'Enter your email address',\n validations: [\n { type: 'required', message: 'Email is required' },\n { type: 'email', message: 'Please enter a valid email' },\n ],\n },\n ],\n}\n\n/**\n * Password change template\n */\nconst passwordChangeTemplate: FormSchema = {\n fields: [\n {\n type: 'password',\n name: 'currentPassword',\n label: 'Current Password',\n placeholder: 'Enter your current password',\n validations: [\n { type: 'required', message: 'Current password is required' },\n ],\n },\n {\n type: 'password',\n name: 'newPassword',\n label: 'New Password',\n placeholder: 'Enter your new password',\n validations: [\n { type: 'required', message: 'New password is required' },\n { type: 'minLength', value: 8, message: 'Password must be at least 8 characters' },\n ],\n },\n {\n type: 'password',\n name: 'confirmPassword',\n label: 'Confirm New Password',\n placeholder: 'Confirm your new password',\n validations: [\n { type: 'required', message: 'Please confirm your new password' },\n {\n type: 'custom',\n validator: (value) => {\n // Note: For password matching validation, you may need to implement\n // a custom validation that accesses the form's state manager\n // or use a form-level validation on submit\n return typeof value === 'string' && value.length >= 8\n },\n message: 'Password must be at least 8 characters',\n },\n ],\n },\n ],\n}\n\n/**\n * User profile edit template\n */\nconst profileTemplate: FormSchema = {\n fields: [\n {\n type: 'text',\n name: 'name',\n label: 'Full Name',\n placeholder: 'Enter your full name',\n validations: [\n { type: 'required', message: 'Name is required' },\n ],\n },\n {\n type: 'email',\n name: 'email',\n label: 'Email',\n placeholder: 'Enter your email',\n validations: [\n { type: 'required', message: 'Email is required' },\n { type: 'email', message: 'Please enter a valid email' },\n ],\n },\n {\n type: 'text',\n name: 'phone',\n label: 'Phone',\n placeholder: 'Enter your phone number',\n mask: {\n type: 'phone',\n },\n },\n {\n type: 'textarea',\n name: 'bio',\n label: 'Bio',\n placeholder: 'Tell us about yourself',\n rows: 4,\n },\n {\n type: 'file',\n name: 'avatar',\n label: 'Profile Picture',\n accept: 'image/*',\n },\n ],\n}\n\n/**\n * Checkout form template\n */\nconst checkoutTemplate: FormSchema = {\n fields: [\n {\n type: 'group',\n name: 'billingAddress',\n label: 'Billing Address',\n fields: [\n {\n type: 'text',\n name: 'street',\n label: 'Street Address',\n placeholder: 'Enter street address',\n validations: [\n { type: 'required', message: 'Street address is required' },\n ],\n },\n {\n type: 'row',\n name: 'cityState',\n fields: [\n {\n type: 'text',\n name: 'city',\n label: 'City',\n placeholder: 'City',\n validations: [\n { type: 'required', message: 'City is required' },\n ],\n },\n {\n type: 'text',\n name: 'state',\n label: 'State',\n placeholder: 'State',\n validations: [\n { type: 'required', message: 'State is required' },\n ],\n },\n ],\n },\n {\n type: 'text',\n name: 'zipCode',\n label: 'ZIP Code',\n placeholder: 'ZIP Code',\n validations: [\n { type: 'required', message: 'ZIP code is required' },\n ],\n },\n ],\n },\n {\n type: 'select',\n name: 'paymentMethod',\n label: 'Payment Method',\n options: [\n { label: 'Credit Card', value: 'credit-card' },\n { label: 'Debit Card', value: 'debit-card' },\n { label: 'PayPal', value: 'paypal' },\n { label: 'Bank Transfer', value: 'bank-transfer' },\n ],\n validations: [\n { type: 'required', message: 'Payment method is required' },\n ],\n },\n {\n type: 'select',\n name: 'shipping',\n label: 'Shipping Method',\n options: [\n { label: 'Standard (5-7 days)', value: 'standard' },\n { label: 'Express (2-3 days)', value: 'express' },\n { label: 'Overnight', value: 'overnight' },\n ],\n validations: [\n { type: 'required', message: 'Shipping method is required' },\n ],\n },\n ],\n}\n\n/**\n * Feedback form template\n */\nconst feedbackTemplate: FormSchema = {\n fields: [\n {\n type: 'select',\n name: 'rating',\n label: 'Rating',\n options: [\n { label: '1 - Poor', value: 1 },\n { label: '2 - Fair', value: 2 },\n { label: '3 - Good', value: 3 },\n { label: '4 - Very Good', value: 4 },\n { label: '5 - Excellent', value: 5 },\n ],\n validations: [\n { type: 'required', message: 'Rating is required' },\n ],\n },\n {\n type: 'textarea',\n name: 'comment',\n label: 'Comment',\n placeholder: 'Share your feedback',\n rows: 5,\n validations: [\n { type: 'required', message: 'Comment is required' },\n ],\n },\n {\n type: 'email',\n name: 'email',\n label: 'Email (optional)',\n placeholder: 'Enter your email if you want a response',\n },\n ],\n}\n\n/**\n * Newsletter subscription template\n */\nconst subscriptionTemplate: FormSchema = {\n fields: [\n {\n type: 'email',\n name: 'email',\n label: 'Email',\n placeholder: 'Enter your email',\n validations: [\n { type: 'required', message: 'Email is required' },\n { type: 'email', message: 'Please enter a valid email' },\n ],\n },\n {\n type: 'checkbox',\n name: 'weeklyNewsletter',\n label: 'Weekly Newsletter',\n defaultValue: true,\n },\n {\n type: 'checkbox',\n name: 'productUpdates',\n label: 'Product Updates',\n defaultValue: false,\n },\n {\n type: 'checkbox',\n name: 'promotions',\n label: 'Promotions and Special Offers',\n defaultValue: false,\n },\n ],\n}\n\n/**\n * Booking/reservation template\n */\nconst bookingTemplate: FormSchema = {\n fields: [\n {\n type: 'date',\n name: 'date',\n label: 'Date',\n validations: [\n { type: 'required', message: 'Date is required' },\n ],\n },\n {\n type: 'text',\n name: 'time',\n label: 'Time',\n placeholder: 'HH:MM',\n mask: {\n type: 'time',\n },\n validations: [\n { type: 'required', message: 'Time is required' },\n ],\n },\n {\n type: 'number',\n name: 'guests',\n label: 'Number of Guests',\n placeholder: 'Enter number of guests',\n min: 1,\n max: 20,\n validations: [\n { type: 'required', message: 'Number of guests is required' },\n { type: 'min', value: 1, message: 'At least 1 guest is required' },\n ],\n },\n {\n type: 'textarea',\n name: 'specialRequests',\n label: 'Special Requests',\n placeholder: 'Any special requests or dietary restrictions?',\n rows: 4,\n },\n ],\n}\n\n/**\n * Review/rating form template\n */\nconst reviewTemplate: FormSchema = {\n fields: [\n {\n type: 'select',\n name: 'rating',\n label: 'Rating',\n options: [\n { label: '1 Star', value: 1 },\n { label: '2 Stars', value: 2 },\n { label: '3 Stars', value: 3 },\n { label: '4 Stars', value: 4 },\n { label: '5 Stars', value: 5 },\n ],\n validations: [\n { type: 'required', message: 'Rating is required' },\n ],\n },\n {\n type: 'text',\n name: 'title',\n label: 'Review Title',\n placeholder: 'Give your review a title',\n validations: [\n { type: 'required', message: 'Review title is required' },\n { type: 'minLength', value: 5, message: 'Title must be at least 5 characters' },\n ],\n },\n {\n type: 'textarea',\n name: 'comment',\n label: 'Your Review',\n placeholder: 'Share your experience',\n rows: 6,\n validations: [\n { type: 'required', message: 'Review comment is required' },\n { type: 'minLength', value: 20, message: 'Review must be at least 20 characters' },\n ],\n },\n ],\n}\n\n/**\n * Registry of all available templates\n */\nexport const templates: Record<TemplateName, FormSchema> = {\n login: loginTemplate,\n register: registerTemplate,\n otp: otpTemplate,\n contact: contactTemplate,\n 'password-reset': passwordResetTemplate,\n 'password-change': passwordChangeTemplate,\n profile: profileTemplate,\n checkout: checkoutTemplate,\n feedback: feedbackTemplate,\n subscription: subscriptionTemplate,\n booking: bookingTemplate,\n review: reviewTemplate,\n}\n\n/**\n * Get a template by name\n * @param templateName - Name of the template to retrieve\n * @returns The template schema or null if not found\n */\nexport function getTemplate(templateName: string): FormSchema | null {\n if (templateName in templates) {\n return templates[templateName as TemplateName]\n }\n return null\n}\n\n/**\n * Get list of all available template names\n * @returns Array of template names\n */\nexport function getAvailableTemplates(): TemplateName[] {\n return Object.keys(templates) as TemplateName[]\n}\n\n/**\n * Extend a template with additional fields\n * @param templateName - Name of the template to extend\n * @param additionalFields - Additional fields to add to the template\n * @returns Extended schema with template fields + additional fields\n */\nexport function extendTemplate(\n templateName: string,\n additionalFields: Field[]\n): FormSchema {\n const baseTemplate = getTemplate(templateName)\n if (!baseTemplate) {\n throw new Error(`Template \"${templateName}\" not found`)\n }\n\n const existingFields = baseTemplate.fields || []\n const existingSteps = baseTemplate.steps\n\n // If template has steps, extend the last step\n if (existingSteps && existingSteps.length > 0) {\n const lastStep = existingSteps[existingSteps.length - 1]\n return {\n ...baseTemplate,\n steps: [\n ...existingSteps.slice(0, -1),\n {\n ...lastStep,\n fields: [...lastStep.fields, ...additionalFields],\n },\n ],\n }\n }\n\n // Otherwise, extend fields array\n return {\n ...baseTemplate,\n fields: [...existingFields, ...additionalFields],\n }\n}\n","import { StateManager } from '../core/state-manager'\nimport { AttemptsLock } from '../utils/attempts-lock'\nimport { createInput, getCustomComponent, registerComponents } from './inputs'\nimport type {\n FormSchema,\n Field,\n ComponentRegistry,\n SubmitEventDetail,\n ChangeEventDetail,\n ErrorEventDetail,\n StepChangeEventDetail,\n FormTheme,\n FormColors,\n TemplateName,\n SubmitButtonConfig,\n PersistenceConfig,\n TimeoutEventDetail,\n} from '../types'\nimport { attributeValue, parseAttributeValue } from '../utils'\nimport { getThemeStyles, getColors } from '../utils/styles'\nimport { getTemplate, extendTemplate } from '../templates'\n\n// Verificar si estamos en un entorno del navegador\nconst BrowserHTMLElement = typeof HTMLElement !== 'undefined' ? HTMLElement : class {} as typeof HTMLElement\n\n/**\n * Web Component principal EasyForm\n */\nexport class EasyForm extends BrowserHTMLElement {\n private stateManager: StateManager\n protected shadow: ShadowRoot\n private customComponents: ComponentRegistry = {}\n private isRendering: boolean = false\n private attemptsLock: AttemptsLock | null = null\n private lockCountdownInterval: ReturnType<typeof setInterval> | null = null\n /**\n * Plantillas de slots basados en atributo `row` en el light DOM.\n * Se inicializan una sola vez y se clonan en cada render.\n */\n private slotTemplates: { template: HTMLElement; row: number | null }[] | null = null\n private skipPreserveValuesOnNextRender = false\n private persistenceConfig: PersistenceConfig | null = null\n private persistenceDebounceTimer: ReturnType<typeof setTimeout> | null = null\n private pendingRestoreValues: Record<string, any> | null = null\n private isRestoringValues = false\n private completeTimeInterval: ReturnType<typeof setInterval> | null = null\n private timeRemaining: number = 0\n private timerStarted: boolean = false\n private timerExpired: boolean = false\n\n static get observedAttributes() {\n return [\n 'schema',\n 'template',\n 'template-extend',\n 'theme',\n 'colors',\n 'initialData',\n 'loading',\n 'disabled',\n 'max-attempts',\n 'block-duration-minutes',\n 'attempts-storage-key',\n 'submit-button',\n 'label-position',\n 'show-completed-indicator',\n 'form-direction',\n 'complete-time',\n ]\n }\n\n constructor() {\n if (typeof HTMLElement === 'undefined') {\n throw new Error('EasyForm can only be used in a browser environment')\n }\n super()\n this.stateManager = new StateManager()\n this.shadow = this.attachShadow({ mode: 'open' })\n // Los estilos se aplicarán en connectedCallback cuando los atributos estén disponibles\n }\n\n /**\n * Obtiene el schema\n */\n get schema(): FormSchema | null {\n const schemaAttr = this.getAttribute('schema')\n if (!schemaAttr) return null\n \n // Validar mutua exclusividad con template\n if (this.getAttribute('template')) {\n console.warn('EasyForm: Cannot use both \"schema\" and \"template\" attributes. \"template\" will be ignored.')\n return parseAttributeValue(schemaAttr)\n }\n \n return parseAttributeValue(schemaAttr)\n }\n\n /**\n * Establece el schema\n */\n set schema(value: FormSchema | null) {\n // Si se establece schema, remover template\n if (value && this.getAttribute('template')) {\n console.warn('EasyForm: Setting \"schema\" will remove \"template\" attribute.')\n this.removeAttribute('template')\n this.removeAttribute('template-extend')\n }\n \n console.log('EasyForm: Setting schema via JS', value?.fields?.map(f => ({ name: f.name, type: f.type, deps: !!f.dependencies })))\n \n if (value) {\n this.setAttribute('schema', attributeValue(value))\n // Llamar a handleSchemaChange para renderizar cuando se asigna por JS\n this.handleSchemaChange()\n } else {\n this.removeAttribute('schema')\n }\n }\n\n /**\n * Obtiene el template\n */\n get template(): TemplateName | null {\n const templateAttr = this.getAttribute('template')\n if (!templateAttr) return null\n \n // Validar mutua exclusividad con schema\n if (this.getAttribute('schema')) {\n console.warn('EasyForm: Cannot use both \"template\" and \"schema\" attributes. \"schema\" will be ignored.')\n return templateAttr as TemplateName\n }\n \n return templateAttr as TemplateName\n }\n\n /**\n * Establece el template\n */\n set template(value: TemplateName | null) {\n // Si se establece template, remover schema\n if (value && this.getAttribute('schema')) {\n console.warn('EasyForm: Setting \"template\" will remove \"schema\" attribute.')\n this.removeAttribute('schema')\n }\n \n if (value) {\n this.setAttribute('template', value)\n } else {\n this.removeAttribute('template')\n this.removeAttribute('template-extend')\n }\n }\n\n /**\n * Obtiene los campos adicionales para extender el template\n */\n get templateExtend(): Field[] | null {\n const extendAttr = this.getAttribute('template-extend')\n if (!extendAttr) return null\n return parseAttributeValue(extendAttr)\n }\n\n /**\n * Establece los campos adicionales para extender el template\n */\n set templateExtend(value: Field[] | null) {\n if (value) {\n this.setAttribute('template-extend', attributeValue(value))\n } else {\n this.removeAttribute('template-extend')\n }\n }\n\n /**\n * Máximo de intentos antes de bloquear (para AttemptsLock)\n */\n get maxAttempts(): number | null {\n const attr = this.getAttribute('max-attempts')\n if (!attr) return null\n const n = parseInt(attr, 10)\n return isNaN(n) ? null : n\n }\n\n set maxAttempts(value: number | null) {\n if (value != null && value >= 1) {\n this.setAttribute('max-attempts', String(value))\n } else {\n this.removeAttribute('max-attempts')\n }\n }\n\n /**\n * Duración del bloqueo en minutos (default: 5)\n */\n get blockDurationMinutes(): number | null {\n const attr = this.getAttribute('block-duration-minutes')\n if (!attr) return null\n const n = parseInt(attr, 10)\n return isNaN(n) ? null : n\n }\n\n set blockDurationMinutes(value: number | null) {\n if (value != null && value >= 1) {\n this.setAttribute('block-duration-minutes', String(value))\n } else {\n this.removeAttribute('block-duration-minutes')\n }\n }\n\n /**\n * Clave para persistir intentos en sessionStorage\n */\n get attemptsStorageKey(): string | null {\n return this.getAttribute('attempts-storage-key')\n }\n\n set attemptsStorageKey(value: string | null) {\n if (value) {\n this.setAttribute('attempts-storage-key', value)\n } else {\n this.removeAttribute('attempts-storage-key')\n }\n }\n\n /**\n * Configuración del botón de submit (desde atributo o schema)\n */\n get submitButton(): SubmitButtonConfig | null {\n const attr = this.getAttribute('submit-button')\n if (attr) {\n try {\n return parseAttributeValue(attr) as SubmitButtonConfig\n } catch {\n return null\n }\n }\n return null\n }\n\n set submitButton(value: SubmitButtonConfig | null) {\n if (value && typeof value === 'object') {\n this.setAttribute('submit-button', attributeValue(value))\n } else {\n this.removeAttribute('submit-button')\n }\n }\n\n /**\n * Obtiene la configuración efectiva del botón submit (atributo > schema > defaults)\n */\n private getSubmitButtonConfig(schema: FormSchema | null): Required<SubmitButtonConfig> {\n const fromAttr = this.submitButton\n const fromSchema = schema?.submitButton\n const merged = { ...fromSchema, ...fromAttr } as SubmitButtonConfig\n return {\n visible: merged.visible ?? true,\n text: merged.text ?? 'Enviar',\n width: merged.width ?? 'auto',\n align: merged.align ?? 'left',\n }\n }\n\n /**\n * Se llama cuando el componente se conecta al DOM\n */\n connectedCallback() {\n this.setupAttemptsLock()\n // Asegurar que los estilos estén aplicados con los atributos actuales\n this.setupStyles()\n // Solo renderizar si ya hay un schema definido (como atributo HTML)\n // Si el schema se asigna por JS, se renderizará desde el setter\n if (this.hasAttribute('schema') || this.schema) {\n this.render()\n }\n }\n\n /**\n * Se llama cuando un atributo cambia\n */\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\n // Validar mutua exclusividad\n if (name === 'schema' && newValue !== oldValue) {\n if (this.getAttribute('template')) {\n console.warn('EasyForm: \"schema\" and \"template\" cannot be used together. Removing \"template\".')\n this.removeAttribute('template')\n this.removeAttribute('template-extend')\n }\n this.handleSchemaChange()\n }\n if (name === 'template' && newValue !== oldValue) {\n if (this.getAttribute('schema')) {\n console.warn('EasyForm: \"template\" and \"schema\" cannot be used together. Removing \"schema\".')\n this.removeAttribute('schema')\n }\n this.handleSchemaChange()\n }\n if (name === 'template-extend' && newValue !== oldValue) {\n this.handleSchemaChange()\n }\n if (name === 'initialData' && newValue !== oldValue) {\n this.handleSchemaChange()\n }\n if ((name === 'theme' || name === 'colors') && newValue !== oldValue) {\n this.setupStyles()\n }\n if (name === 'loading' && newValue !== oldValue) {\n // Actualizar solo el overlay de loading sin re-renderizar todo\n const form = this.shadow.querySelector('form')\n this.updateLoadingOverlay(form || undefined)\n // También necesitamos actualizar el estado disabled de los campos\n if (form) {\n const inputs = form.querySelectorAll('input, textarea, select, button')\n inputs.forEach((input) => {\n if (input instanceof HTMLElement && 'disabled' in input) {\n (input as any).disabled = this.loading\n }\n })\n }\n }\n if (name === 'disabled' && newValue !== oldValue) {\n this.render()\n }\n if ((name === 'label-position' || name === 'form-direction' || name === 'show-completed-indicator') && newValue !== oldValue) {\n this.render()\n }\n if (\n (name === 'max-attempts' ||\n name === 'block-duration-minutes' ||\n name === 'attempts-storage-key') &&\n newValue !== oldValue\n ) {\n this.setupAttemptsLock()\n this.updateLockOverlay()\n }\n if (name === 'submit-button' && newValue !== oldValue) {\n this.render()\n }\n if (name === 'complete-time' && newValue !== oldValue) {\n this.resetTimer()\n if (this.completeTime) {\n this.timeRemaining = this.completeTime\n this.render()\n }\n }\n }\n\n /**\n * Configura el AttemptsLock según los atributos actuales\n */\n private setupAttemptsLock(): void {\n const maxAttempts = this.maxAttempts\n if (maxAttempts == null || maxAttempts < 1) {\n this.attemptsLock = null\n return\n }\n this.attemptsLock = new AttemptsLock({\n maxAttempts,\n blockDurationMinutes: this.blockDurationMinutes ?? 5,\n storageKey: this.attemptsStorageKey ?? undefined,\n onLocked: () => {\n this.updateLockOverlay()\n },\n onUnlocked: () => {\n this.stopLockCountdown()\n this.updateLockOverlay()\n this.render()\n },\n })\n }\n\n /**\n * Maneja el cambio de schema\n */\n private handleSchemaChange() {\n let schema: FormSchema | null = null\n \n // Priorizar template sobre schema\n const templateName = this.template\n if (templateName) {\n schema = this.getSchemaFromTemplate(templateName)\n } else {\n schema = this.schema\n }\n \n if (schema) {\n const initialData = this.initialData\n this.stateManager.initializeSchema(schema, initialData || undefined)\n this.initPersistence(schema)\n this.render()\n }\n }\n\n /**\n * Obtiene el schema desde un template\n */\n private getSchemaFromTemplate(templateName: TemplateName): FormSchema | null {\n const baseTemplate = getTemplate(templateName)\n if (!baseTemplate) {\n console.error(`EasyForm: Template \"${templateName}\" not found`)\n return null\n }\n\n // Si hay campos adicionales, extender el template\n const additionalFields = this.templateExtend\n if (additionalFields && additionalFields.length > 0) {\n return extendTemplate(templateName, additionalFields)\n }\n\n return baseTemplate\n }\n\n /**\n * Renderiza el formulario\n */\n private async render() {\n // Evitar renderizados simultáneos\n if (this.isRendering) {\n return\n }\n \n this.isRendering = true\n \n try {\n // Obtener schema desde template o atributo schema\n let schema: FormSchema | null = null\n const templateName = this.template\n if (templateName) {\n schema = this.getSchemaFromTemplate(templateName)\n } else {\n schema = this.schema\n }\n \n if (!schema) {\n // Eliminar solo el formulario, mantener los estilos\n const form = this.shadow.querySelector('form')\n if (form && form.parentNode === this.shadow) {\n form.remove()\n }\n return\n }\n\n // Preservar valores actuales del DOM antes de re-renderizar (omitir si viene de add/remove en array)\n const isArrayRefresh = this.skipPreserveValuesOnNextRender\n const preservedValues = isArrayRefresh ? {} : this.preserveCurrentValues()\n this.skipPreserveValuesOnNextRender = false\n\n // Preservar el estado del wizard ANTES de reinicializar (pero después de cualquier cambio)\n const previousWizardState = this.stateManager.getWizardState()\n\n // Guardar los valores preservados en el estado sin validar\n // Esto evita disparar validaciones de todos los campos\n if (preservedValues && Object.keys(preservedValues).length > 0) {\n for (const [key, value] of Object.entries(preservedValues)) {\n this.stateManager.setValueWithoutValidation(key, value)\n }\n }\n\n const initialData = this.initialData\n \n // Verificar si el schema ha cambiado comparando si es wizard o no\n const wasWizard = previousWizardState !== null\n const isWizard = schema.steps && schema.steps.length > 0\n \n // Solo reinicializar el schema si es necesario (si cambió de wizard a normal o viceversa)\n // O si el número de steps cambió, o si no hay estado previo.\n // No re-inicializar cuando es refresh por add/remove en array (preservar estado actual).\n const shouldReinitialize = !isArrayRefresh && (\n !previousWizardState || !wasWizard || !isWizard || \n (previousWizardState && schema.steps && previousWizardState.totalSteps !== schema.steps.length)\n )\n \n if (shouldReinitialize) {\n this.stateManager.initializeSchema(schema, initialData || undefined)\n \n // Si había un wizard state previo y el schema sigue siendo wizard, restaurarlo\n if (wasWizard && isWizard && previousWizardState) {\n const wizardState = this.stateManager.getWizardState()\n if (wizardState && previousWizardState.totalSteps === wizardState.totalSteps) {\n // Restaurar el paso actual primero\n if (previousWizardState.currentStep >= 0 && previousWizardState.currentStep < wizardState.totalSteps) {\n this.stateManager.goToStep(previousWizardState.currentStep)\n }\n // Restaurar pasos completados\n for (const completedStep of previousWizardState.completedSteps) {\n if (completedStep >= 0 && completedStep < wizardState.totalSteps) {\n this.stateManager.completeStep(completedStep)\n }\n }\n }\n }\n }\n // Si no se reinicializa, el estado del wizard ya está actualizado (por nextStep/previousStep)\n // y los valores ya fueron preservados arriba\n \n // Obtener el estado actualizado\n const finalWizardState = this.stateManager.getWizardState()\n\n // Crear formulario\n const newFormElement = document.createElement('form')\n newFormElement.addEventListener('submit', (e) => this.handleSubmit(e))\n \n // Aplicar disabled al formulario si está disabled o loading\n if (this.disabled || this.loading) {\n newFormElement.classList.add('easy-form-disabled')\n }\n\n // Dirección del layout (vertical | horizontal)\n const directionAttr = this.getAttribute('form-direction') as 'vertical' | 'horizontal' | null\n const direction = schema.direction ?? (directionAttr === 'vertical' || directionAttr === 'horizontal' ? directionAttr : 'vertical')\n newFormElement.classList.add(`easy-form-direction-${direction}`)\n\n // Indicador de progreso (campos obligatorios completados)\n const showCompletedAttr = this.getAttribute('show-completed-indicator')\n const completedIndicator = schema.completedIndicator ?? (showCompletedAttr !== null && showCompletedAttr !== 'false')\n const completedPosition = typeof completedIndicator === 'object' && completedIndicator?.position ? completedIndicator.position : 'top'\n\n // Renderizar campos o steps\n if (finalWizardState) {\n this.renderWizard(newFormElement, schema)\n // No agregar botón submit normal para wizard, ya tiene sus propios botones\n } else {\n this.renderFields(newFormElement, schema.fields || [])\n\n // Botón submit solo para formularios normales (no wizard)\n const submitConfig = this.getSubmitButtonConfig(schema)\n if (submitConfig.visible) {\n const submitWrapper = document.createElement('div')\n submitWrapper.className = 'easy-form-submit-wrapper'\n submitWrapper.style.textAlign = submitConfig.align\n\n const submitButton = document.createElement('button')\n submitButton.type = 'submit'\n submitButton.textContent = submitConfig.text\n submitButton.className = 'easy-form-submit'\n submitButton.style.width = submitConfig.width\n if (this.disabled || this.loading) {\n submitButton.disabled = true\n }\n submitWrapper.appendChild(submitButton)\n newFormElement.appendChild(submitWrapper)\n }\n }\n\n // Indicador de progreso (antes o después del formulario)\n let formWrapper: HTMLElement | null = null\n if (completedIndicator) {\n const { completed, total } = this.getCompletedRequiredProgress(schema)\n const progressBar = document.createElement('div')\n progressBar.className = 'easy-form-completed-indicator'\n progressBar.setAttribute('role', 'progressbar')\n progressBar.setAttribute('aria-valuenow', String(completed))\n progressBar.setAttribute('aria-valuemin', '0')\n progressBar.setAttribute('aria-valuemax', String(total))\n progressBar.setAttribute('aria-label', `Campos obligatorios completados: ${completed} de ${total}`)\n const track = document.createElement('div')\n track.className = 'easy-form-completed-track'\n const fill = document.createElement('div')\n fill.className = 'easy-form-completed-fill'\n fill.style.width = total > 0 ? `${(completed / total) * 100}%` : '0%'\n track.appendChild(fill)\n progressBar.appendChild(track)\n formWrapper = document.createElement('div')\n formWrapper.className = 'easy-form-wrapper'\n if (completedPosition === 'top') {\n formWrapper.appendChild(progressBar)\n formWrapper.appendChild(newFormElement)\n } else {\n formWrapper.appendChild(newFormElement)\n formWrapper.appendChild(progressBar)\n }\n }\n\n // Eliminar solo el formulario anterior si existe y está en el DOM, mantener los estilos\n const oldForm = this.shadow.querySelector('form')\n if (oldForm && oldForm.parentNode === this.shadow && oldForm !== newFormElement) {\n try {\n oldForm.remove()\n } catch (e) {\n // Ignorar errores si el elemento ya fue eliminado\n console.warn('Error al eliminar formulario anterior:', e)\n }\n }\n const oldWrapper = this.shadow.querySelector('.easy-form-wrapper')\n if (oldWrapper) oldWrapper.remove()\n\n // Agregar el nuevo formulario (o wrapper con indicador)\n this.shadow.appendChild(formWrapper || newFormElement)\n \n // Agregar timer display si complete-time está configurado\n if (this.completeTime && !this.timerExpired) {\n this.renderTimerDisplay()\n this.setupTimerInputListener()\n }\n \n // Agregar overlay de loading sobre el formulario si está activo\n if (this.loading) {\n this.updateLoadingOverlay(newFormElement)\n }\n // Agregar overlay de bloqueo si está activo\n this.updateLockOverlay(newFormElement)\n } finally {\n this.isRendering = false\n // Aplicar valores restaurados de localStorage después del render\n if (this.pendingRestoreValues) {\n this.applyPendingRestoreValues()\n }\n }\n }\n\n /**\n * Actualiza el overlay de bloqueo por intentos\n */\n private updateLockOverlay(formElement?: HTMLElement): void {\n const existingOverlay = this.shadow.querySelector('.easy-form-lock-overlay')\n if (existingOverlay) {\n existingOverlay.remove()\n }\n this.stopLockCountdown()\n\n if (!this.attemptsLock?.isLocked()) return\n\n const form = formElement || this.shadow.querySelector('form')\n if (!form) return\n\n const overlay = document.createElement('div')\n overlay.className = 'easy-form-lock-overlay'\n\n const message = document.createElement('div')\n message.className = 'easy-form-lock-message'\n message.setAttribute('role', 'alert')\n\n const updateCountdown = (): void => {\n const remainingMs = this.attemptsLock!.getRemainingBlockTimeMs()\n if (remainingMs <= 0) {\n this.stopLockCountdown()\n return\n }\n const minutes = Math.floor(remainingMs / 60000)\n const seconds = Math.floor((remainingMs % 60000) / 1000)\n const timeStr =\n minutes > 0\n ? `${minutes} min ${seconds} s`\n : `${seconds} segundos`\n message.textContent = `Demasiados intentos. Intenta de nuevo en ${timeStr}.`\n }\n\n updateCountdown()\n overlay.appendChild(message)\n form.appendChild(overlay)\n\n this.lockCountdownInterval = setInterval(updateCountdown, 1000)\n }\n\n private stopLockCountdown(): void {\n if (this.lockCountdownInterval) {\n clearInterval(this.lockCountdownInterval)\n this.lockCountdownInterval = null\n }\n }\n\n /**\n * Actualiza el overlay de loading sobre el formulario\n */\n private updateLoadingOverlay(formElement?: HTMLElement) {\n // Eliminar overlay anterior si existe\n const existingOverlay = this.shadow.querySelector('.easy-form-loading-overlay')\n if (existingOverlay) {\n existingOverlay.remove()\n }\n\n // Si loading está activo, agregar overlay sobre el formulario\n if (this.loading) {\n const form = formElement || this.shadow.querySelector('form')\n if (form) {\n const overlay = document.createElement('div')\n overlay.className = 'easy-form-loading-overlay'\n \n const spinner = document.createElement('div')\n spinner.className = 'easy-form-loading-spinner'\n overlay.appendChild(spinner)\n \n // Agregar el overlay como hijo del formulario\n form.appendChild(overlay)\n }\n }\n }\n\n /**\n * Preserva los valores actuales del DOM antes de re-renderizar\n * Retorna un objeto con los valores preservados\n */\n private preserveCurrentValues(): Record<string, any> {\n // Necesitamos el schema actual para poder filtrar inputs que no pertenecen al formulario\n // y asegurar que valores dentro de slots u otros elementos no definidos en el schema\n // no se mezclen con el estado interno del formulario.\n let currentSchema: FormSchema | null = null\n const templateName = this.template\n if (templateName) {\n currentSchema = this.getSchemaFromTemplate(templateName)\n } else {\n currentSchema = this.schema\n }\n\n if (!currentSchema) {\n return {}\n }\n\n const form = this.shadow.querySelector('form')\n const preservedValues: Record<string, any> = {}\n \n if (!form) return preservedValues\n\n // Obtener todos los inputs, textareas y selects del formulario\n const inputs = form.querySelectorAll('input, textarea, select')\n \n for (const input of inputs) {\n const name = input.getAttribute('name')\n if (!name) continue\n\n // Ignorar inputs que no están definidos en el schema (por ejemplo, dentro de slots)\n const belongsToSchema = this.findFieldInSchema(currentSchema, name) !== null\n if (!belongsToSchema) continue\n\n let value: any\n \n if (input instanceof HTMLInputElement) {\n if (input.type === 'checkbox') {\n value = input.checked\n } else if (input.type === 'radio') {\n if (input.checked) {\n value = input.value\n } else {\n continue // Solo guardar el radio seleccionado\n }\n } else if (input.type === 'number') {\n value = input.value === '' ? null : Number(input.value)\n } else {\n value = input.value\n }\n } else if (input instanceof HTMLTextAreaElement) {\n value = input.value\n } else if (input instanceof HTMLSelectElement) {\n if (input.multiple) {\n value = Array.from(input.selectedOptions).map(opt => opt.value)\n } else {\n value = input.value || null\n }\n }\n\n // Guardar el valor (incluso strings vacíos para preservar el estado)\n if (value !== undefined) {\n preservedValues[name] = value === '' ? null : value\n }\n }\n \n return preservedValues\n }\n\n /**\n * Inicializa las plantillas de slots a partir del light DOM.\n * Cualquier hijo directo que sea HTMLElement se considera slot; si tiene atributo `row` se usa para la posición, si no se inserta al final (-1).\n */\n private initializeSlotTemplates(): void {\n if (this.slotTemplates !== null) return\n\n const elements: HTMLElement[] = []\n for (const child of Array.from(this.children)) {\n if (child instanceof HTMLElement) {\n elements.push(child)\n }\n }\n\n if (elements.length === 0) {\n this.slotTemplates = []\n return\n }\n\n this.slotTemplates = elements.map((el) => {\n const raw = el.hasAttribute('row') ? el.getAttribute('row') : null\n const parsed = raw != null && raw !== '' ? Number(raw) : NaN\n const row = Number.isFinite(parsed) ? parsed : null\n return {\n template: el.cloneNode(true) as HTMLElement,\n row,\n }\n })\n }\n\n /**\n * Obtiene clones de slots agrupados por índice de fila efectivo.\n * Cualquier valor inválido o fuera de rango se normaliza a -1 (final del formulario).\n */\n private getSlotClonesByRow(totalRows: number): Map<number, HTMLElement[]> {\n this.initializeSlotTemplates()\n\n const result = new Map<number, HTMLElement[]>()\n\n if (!this.slotTemplates || this.slotTemplates.length === 0) {\n return result\n }\n\n for (const { template, row } of this.slotTemplates) {\n let effectiveRow: number = typeof row === 'number' ? row : -1\n\n if (!Number.isFinite(effectiveRow)) {\n effectiveRow = -1\n }\n\n // Normalizar índices fuera de rango al final\n if (effectiveRow < 0 || effectiveRow >= totalRows) {\n effectiveRow = -1\n }\n\n const clone = template.cloneNode(true) as HTMLElement\n const existing = result.get(effectiveRow) ?? []\n existing.push(clone)\n result.set(effectiveRow, existing)\n }\n\n return result\n }\n\n /**\n * Aplica estado disabled/loading a un clone de slot: deshabilita elementos\n * interactivos y añade clase para estilos. Respeta el estado del formulario.\n */\n private applySlotDisabledState(slotElement: HTMLElement): void {\n if (!this.disabled && !this.loading) return\n slotElement.classList.add('easy-form-slot-disabled')\n const interactives = slotElement.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement>(\n 'input, textarea, select, button'\n )\n interactives.forEach((el) => {\n if ('disabled' in el) el.disabled = true\n })\n }\n\n /**\n * Renderiza campos normales\n */\n private renderFields(container: HTMLElement, fields: Field[]) {\n // Si no hay campos, aún debemos soportar posibles slots al final\n if (fields.length === 0) {\n const slotClones = this.getSlotClonesByRow(0)\n const endSlots = slotClones.get(-1)\n if (endSlots && endSlots.length > 0) {\n for (const slotElement of endSlots) {\n this.applySlotDisabledState(slotElement)\n container.appendChild(slotElement)\n }\n }\n return\n }\n\n const totalRows = fields.length\n const slotClonesByRow = this.getSlotClonesByRow(totalRows)\n\n for (let rowIndex = 0; rowIndex < fields.length; rowIndex++) {\n // Insertar primero los slots asociados a este índice de fila\n const slotsForRow = slotClonesByRow.get(rowIndex)\n if (slotsForRow && slotsForRow.length > 0) {\n for (const slotElement of slotsForRow) {\n this.applySlotDisabledState(slotElement)\n container.appendChild(slotElement)\n }\n slotClonesByRow.delete(rowIndex)\n }\n\n const field = fields[rowIndex]\n const fieldElement = this.renderField(field)\n if (fieldElement) {\n container.appendChild(fieldElement)\n }\n }\n\n // Insertar cualquier slot restante (índice efectivo -1) al final del formulario\n const endSlots = slotClonesByRow.get(-1)\n if (endSlots && endSlots.length > 0) {\n for (const slotElement of endSlots) {\n this.applySlotDisabledState(slotElement)\n container.appendChild(slotElement)\n }\n }\n }\n\n /**\n * Renderiza un campo\n */\n private renderField(field: Field): HTMLElement | null {\n // Verificar visibilidad basada en dependencias\n const isVisible = this.stateManager.getFieldVisibility(field.name)\n const isEnabled = this.stateManager.getFieldEnabled(field.name)\n\n // Debug\n console.log(`Rendering field: ${field.name} (${field.type}), visible: ${isVisible}, enabled: ${isEnabled}, hasDeps: ${!!field.dependencies}`)\n\n // Campos especiales\n if (field.type === 'group') {\n const groupElement = this.renderGroup(field)\n if (!isVisible) {\n groupElement.style.display = 'none'\n groupElement.classList.add('easy-form-field-hidden')\n }\n if (!isEnabled) {\n groupElement.classList.add('easy-form-field-disabled')\n }\n return groupElement\n }\n if (field.type === 'row') {\n const rowElement = this.renderRow(field)\n if (!isVisible) {\n rowElement.style.display = 'none'\n rowElement.classList.add('easy-form-field-hidden')\n }\n if (!isEnabled) {\n rowElement.classList.add('easy-form-field-disabled')\n }\n return rowElement\n }\n if (field.type === 'array') {\n const arrayElement = this.renderArray(field)\n if (!isVisible) {\n arrayElement.style.display = 'none'\n arrayElement.classList.add('easy-form-field-hidden')\n }\n if (!isEnabled) {\n arrayElement.classList.add('easy-form-field-disabled')\n }\n return arrayElement\n }\n if (field.type === 'custom') {\n const customElement = this.renderCustom(field)\n if (customElement) {\n if (!isVisible) {\n customElement.style.display = 'none'\n customElement.classList.add('easy-form-field-hidden')\n }\n if (!isEnabled) {\n customElement.classList.add('easy-form-field-disabled')\n }\n }\n return customElement\n }\n\n // Campos normales\n const value = this.stateManager.getValue(field.name)\n const errors = this.stateManager.getErrors(field.name)\n const error = errors.length > 0 ? errors[0] : undefined\n\n // Aplicar disabled basado en dependencias, disabled general o loading\n const isFormDisabled = this.disabled || this.loading\n const labelPositionAttr = this.getAttribute('label-position') as\n | 'up'\n | 'down'\n | 'left'\n | 'right'\n | 'none'\n | null\n const validLabelPositions = ['up', 'down', 'left', 'right', 'none']\n const effectiveLabelPosition =\n field.labelPosition ??\n (labelPositionAttr && validLabelPositions.includes(labelPositionAttr)\n ? labelPositionAttr\n : 'up')\n const fieldWithDependencies = {\n ...field,\n disabled: isFormDisabled || !isEnabled || field.disabled,\n labelPosition: effectiveLabelPosition,\n }\n\n const customComponent = getCustomComponent(field.type)\n if (customComponent) {\n const element = customComponent({\n field: fieldWithDependencies,\n value,\n error,\n onChange: (val) => this.handleFieldChange(field.name, val),\n onBlur: () => this.handleFieldBlur(field.name),\n })\n if (element && !isVisible) {\n element.style.display = 'none'\n element.classList.add('easy-form-field-hidden')\n }\n return element\n }\n\n const inputElement = createInput(\n fieldWithDependencies,\n value,\n error,\n (val) => this.handleFieldChange(field.name, val),\n () => this.handleFieldBlur(field.name)\n )\n\n // Agregar atributo para identificar el campo\n const fieldContainer = inputElement.querySelector('.easy-form-field') || inputElement\n if (fieldContainer instanceof HTMLElement) {\n fieldContainer.setAttribute('data-field-name', field.name)\n }\n\n // Aplicar clases para visibilidad\n if (!isVisible) {\n inputElement.style.display = 'none'\n inputElement.classList.add('easy-form-field-hidden')\n }\n\n return inputElement\n }\n\n /**\n * Renderiza un grupo de campos\n */\n private renderGroup(field: Field): HTMLElement {\n const groupField = field as {\n direction?: 'vertical' | 'horizontal'\n collapsible?: boolean\n defaultOpen?: boolean\n }\n const dir = groupField.direction ?? 'vertical'\n const collapsible = groupField.collapsible === true\n const defaultOpen = groupField.defaultOpen !== false\n\n const groupContainer = document.createElement('div')\n groupContainer.className = `easy-form-group easy-form-direction-${dir}`\n if (field.name) {\n groupContainer.setAttribute('data-field-name', field.name)\n }\n\n if (collapsible) {\n groupContainer.classList.add('easy-form-group-collapsible')\n if (!defaultOpen) {\n groupContainer.classList.add('easy-form-group-collapsed')\n }\n\n const header = document.createElement('button')\n header.type = 'button'\n header.className = 'easy-form-group-header'\n header.setAttribute('aria-expanded', String(defaultOpen))\n const groupContentId = `easy-form-group-${(field.name || 'group').replace(/[^a-z0-9]/gi, '-')}-content`\n header.setAttribute('aria-controls', groupContentId)\n\n const labelSpan = document.createElement('span')\n labelSpan.textContent = field.label || 'Grupo'\n\n const chevron = document.createElement('span')\n chevron.className = 'easy-form-group-chevron'\n chevron.setAttribute('aria-hidden', 'true')\n chevron.textContent = '▼'\n\n header.appendChild(labelSpan)\n header.appendChild(chevron)\n groupContainer.appendChild(header)\n\n const content = document.createElement('div')\n content.id = groupContentId\n content.className = 'easy-form-group-content'\n\n if ('fields' in field && field.fields) {\n for (const subField of field.fields) {\n const fullName = subField.name.startsWith(field.name + '.')\n ? subField.name\n : `${field.name}.${subField.name}`\n const subFieldWithPath = { ...subField, name: fullName }\n const fieldElement = this.renderField(subFieldWithPath)\n if (fieldElement) {\n content.appendChild(fieldElement)\n }\n }\n }\n\n groupContainer.appendChild(content)\n\n const setContentHeight = (open: boolean) => {\n if (open) {\n content.style.maxHeight = content.scrollHeight + 'px'\n } else {\n content.style.maxHeight = '0'\n }\n }\n\n if (defaultOpen) {\n requestAnimationFrame(() => setContentHeight(true))\n } else {\n content.style.maxHeight = '0'\n }\n\n header.addEventListener('click', () => {\n const isCollapsed = groupContainer.classList.contains('easy-form-group-collapsed')\n if (isCollapsed) {\n groupContainer.classList.remove('easy-form-group-collapsed')\n header.setAttribute('aria-expanded', 'true')\n setContentHeight(true)\n } else {\n content.style.maxHeight = content.scrollHeight + 'px'\n requestAnimationFrame(() => {\n groupContainer.classList.add('easy-form-group-collapsed')\n header.setAttribute('aria-expanded', 'false')\n setContentHeight(false)\n })\n }\n })\n } else {\n if (field.label) {\n const label = document.createElement('h3')\n label.className = 'easy-form-group-label'\n label.textContent = field.label\n groupContainer.appendChild(label)\n }\n\n if ('fields' in field && field.fields) {\n for (const subField of field.fields) {\n const fullName = subField.name.startsWith(field.name + '.')\n ? subField.name\n : `${field.name}.${subField.name}`\n const subFieldWithPath = { ...subField, name: fullName }\n const fieldElement = this.renderField(subFieldWithPath)\n if (fieldElement) {\n groupContainer.appendChild(fieldElement)\n }\n }\n }\n }\n\n return groupContainer\n }\n\n /**\n * Renderiza una fila de campos\n */\n private renderRow(field: Field): HTMLElement {\n const rowContainer = document.createElement('div')\n rowContainer.className = 'easy-form-row'\n\n const rowField = field as any\n\n // Aplicar estilos flexbox\n rowContainer.style.display = 'flex'\n rowContainer.style.flexWrap = 'wrap'\n rowContainer.style.alignItems = rowField.align || 'stretch'\n\n // Aplicar gap\n if (rowField.gap !== undefined) {\n const gapValue = typeof rowField.gap === 'number' ? `${rowField.gap}px` : rowField.gap\n rowContainer.style.gap = gapValue\n } else {\n rowContainer.style.gap = '1rem'\n }\n\n // Renderizar campos dentro de la fila\n if ('fields' in field && field.fields) {\n for (const subField of field.fields) {\n const fieldElement = this.renderField(subField)\n if (fieldElement) {\n // Hacer que cada campo en la fila tenga flex: 1 para distribuirse equitativamente\n const fieldWrapper = document.createElement('div')\n fieldWrapper.style.flex = '1'\n fieldWrapper.style.minWidth = '0' // Permite que los campos se reduzcan\n fieldWrapper.appendChild(fieldElement)\n rowContainer.appendChild(fieldWrapper)\n }\n }\n }\n\n return rowContainer\n }\n\n /**\n * Renderiza un array dinámico\n */\n private renderArray(field: Field): HTMLElement {\n const arrayContainer = document.createElement('div')\n arrayContainer.className = 'easy-form-array'\n arrayContainer.setAttribute('data-field-name', field.name)\n\n if (field.label) {\n const label = document.createElement('label')\n label.className = 'easy-form-label'\n label.textContent = field.label\n arrayContainer.appendChild(label)\n }\n\n const values = this.stateManager.getValue(field.name) || []\n const arrayField = field as { itemSchema?: { fields?: Field[] }; minItems?: number; maxItems?: number }\n const minItems = arrayField.minItems ?? 0\n const maxItems = arrayField.maxItems ?? Infinity\n\n // Renderizar items existentes\n const itemsContainer = document.createElement('div')\n itemsContainer.className = 'easy-form-array-items'\n\n for (let i = 0; i < values.length; i++) {\n const itemContainer = document.createElement('div')\n itemContainer.className = 'easy-form-array-item'\n\n if (arrayField.itemSchema?.fields) {\n for (const itemField of arrayField.itemSchema.fields) {\n const itemFieldWithName = {\n ...itemField,\n name: `${field.name}.${i}.${itemField.name}`,\n }\n const fieldElement = this.renderField(itemFieldWithName)\n if (fieldElement) {\n itemContainer.appendChild(fieldElement)\n }\n }\n }\n\n // Botón eliminar\n const removeButton = document.createElement('button')\n removeButton.type = 'button'\n removeButton.textContent = 'Eliminar'\n removeButton.className = 'easy-form-array-remove'\n const atMinItems = values.length <= minItems\n if (this.disabled || this.loading || atMinItems) {\n removeButton.disabled = true\n } else {\n removeButton.addEventListener('click', () => {\n const newValues = [...values]\n newValues.splice(i, 1)\n this.handleFieldChange(field.name, newValues)\n })\n }\n itemContainer.appendChild(removeButton)\n\n itemsContainer.appendChild(itemContainer)\n }\n\n arrayContainer.appendChild(itemsContainer)\n\n // Botón agregar\n const addButton = document.createElement('button')\n addButton.type = 'button'\n addButton.textContent = 'Agregar'\n addButton.className = 'easy-form-array-add'\n const atMaxItems = values.length >= maxItems\n if (this.disabled || this.loading || atMaxItems) {\n addButton.disabled = true\n } else {\n addButton.addEventListener('click', () => {\n const newItem = this.stateManager.createDefaultArrayItem(field)\n const newValues = [...values, newItem]\n this.handleFieldChange(field.name, newValues)\n })\n }\n arrayContainer.appendChild(addButton)\n\n return arrayContainer\n }\n\n /**\n * Renderiza un campo custom\n */\n private renderCustom(field: Field): HTMLElement | null {\n const customComponent = getCustomComponent('custom')\n if (!customComponent) {\n const div = document.createElement('div')\n div.textContent = `Componente custom no registrado para: ${field.name}`\n return div\n }\n\n const value = this.stateManager.getValue(field.name)\n const errors = this.stateManager.getErrors(field.name)\n const error = errors.length > 0 ? errors[0] : undefined\n\n return customComponent({\n field,\n value,\n error,\n onChange: (val) => this.handleFieldChange(field.name, val),\n onBlur: () => this.handleFieldBlur(field.name),\n })\n }\n\n /**\n * Obtiene el progreso de campos obligatorios completados\n */\n private getCompletedRequiredProgress(schema: FormSchema): { completed: number; total: number } {\n const extractFields = (fields: Field[]): Field[] => {\n const result: Field[] = []\n for (const f of fields) {\n if (f.type === 'array' && 'itemSchema' in f && f.itemSchema?.fields) {\n const items = this.stateManager.getValue(f.name) as any[]\n const count = Array.isArray(items) ? items.length : 0\n for (let i = 0; i < count; i++) {\n for (const sf of f.itemSchema.fields) {\n result.push({ ...sf, name: `${f.name}.${i}.${sf.name}` } as Field)\n }\n }\n } else if ((f.type === 'group' || f.type === 'row') && 'fields' in f && f.fields) {\n result.push(...extractFields(f.fields))\n } else {\n result.push(f)\n }\n }\n return result\n }\n\n const fields = schema.steps\n ? (this.stateManager.getCurrentStepFields() || [])\n : schema.fields || []\n const allFields = extractFields(fields)\n const requiredFields = allFields.filter(\n (f) => f.validations?.some((v) => v.type === 'required')\n )\n const visibleRequired = requiredFields.filter((f) =>\n this.stateManager.getFieldVisibility(f.name)\n )\n const total = visibleRequired.length\n const completed = visibleRequired.filter((f) => {\n const errors = this.stateManager.getErrors(f.name)\n if (errors.length > 0) return false\n const val = this.stateManager.getValue(f.name)\n if (val === null || val === undefined) return false\n if (typeof val === 'string' && val.trim() === '') return false\n if (Array.isArray(val) && val.length === 0 && f.type === 'array') return false\n return true\n }).length\n return { completed, total }\n }\n\n /**\n * Renderiza wizard\n */\n private renderWizard(container: HTMLElement, schema: FormSchema) {\n // Obtener el estado actualizado del wizard\n const wizardState = this.stateManager.getWizardState()\n if (!wizardState) return\n\n const wizardContainer = document.createElement('div')\n wizardContainer.className = 'easy-form-wizard'\n\n // Indicador de steps\n const stepsIndicator = document.createElement('div')\n stepsIndicator.className = 'easy-form-wizard-steps'\n const schemaStepStyle = schema?.stepStyle\n if (schemaStepStyle && schemaStepStyle !== 'default') {\n stepsIndicator.classList.add(`ef-stepper-${schemaStepStyle}`)\n }\n if (schema?.steps) {\n for (let i = 0; i < schema.steps.length; i++) {\n const stepEl = document.createElement('div')\n stepEl.className = 'easy-form-wizard-step'\n if (i === wizardState.currentStep) {\n stepEl.classList.add('active')\n }\n if (wizardState.completedSteps.includes(i)) {\n stepEl.classList.add('completed')\n }\n stepEl.textContent = schema.steps[i].title\n stepsIndicator.appendChild(stepEl)\n }\n }\n wizardContainer.appendChild(stepsIndicator)\n\n // Campos del step actual (con soporte de slots por row, scoped al step actual)\n const fieldsContainer = document.createElement('div')\n fieldsContainer.className = 'easy-form-wizard-fields'\n const currentFields = this.stateManager.getCurrentStepFields()\n this.renderFields(fieldsContainer, currentFields)\n wizardContainer.appendChild(fieldsContainer)\n\n // Botones de navegación\n const navContainer = document.createElement('div')\n navContainer.className = 'easy-form-wizard-nav'\n\n // Botón Anterior (solo si no es el primer paso)\n if (wizardState.currentStep > 0) {\n const prevButton = document.createElement('button')\n prevButton.type = 'button'\n prevButton.textContent = 'Anterior'\n prevButton.className = 'easy-form-wizard-prev'\n if (this.disabled || this.loading) {\n prevButton.disabled = true\n } else {\n prevButton.addEventListener('click', () => {\n const currentState = this.stateManager.getWizardState()\n if (currentState && this.stateManager.previousStep()) {\n this.render()\n this.emitStepChange()\n }\n })\n }\n navContainer.appendChild(prevButton)\n }\n\n // Botón Siguiente (solo si NO es el último paso)\n if (wizardState.currentStep < wizardState.totalSteps - 1) {\n const nextButton = document.createElement('button')\n nextButton.type = 'button'\n nextButton.textContent = 'Siguiente'\n nextButton.className = 'easy-form-wizard-next'\n if (this.disabled || this.loading) {\n nextButton.disabled = true\n } else {\n nextButton.addEventListener('click', async () => {\n // Obtener el estado actual del wizard\n const currentState = this.stateManager.getWizardState()\n if (!currentState) return\n\n // Validar solo los campos del step actual antes de avanzar\n const currentFields = this.stateManager.getCurrentStepFields()\n \n // Validar cada campo del paso actual\n for (const field of currentFields) {\n // Solo validar campos visibles\n if (this.stateManager.getFieldVisibility(field.name)) {\n await this.stateManager.validateField(field.name)\n }\n }\n \n // Obtener errores después de validar\n const allErrors = this.stateManager.getAllErrors()\n const stepErrors: Record<string, string[]> = {}\n \n // Filtrar solo errores de campos del paso actual\n for (const field of currentFields) {\n if (allErrors[field.name] && allErrors[field.name].length > 0) {\n stepErrors[field.name] = allErrors[field.name]\n }\n }\n\n const hasErrors = Object.keys(stepErrors).length > 0\n\n if (!hasErrors) {\n // Marcar el paso actual como completado\n this.stateManager.completeStep(currentState.currentStep)\n \n // Avanzar al siguiente paso\n const moved = this.stateManager.nextStep()\n if (moved) {\n // Renderizar después de actualizar el estado\n // El render preservará el estado actualizado (con el nuevo paso)\n this.render()\n this.emitStepChange()\n }\n } else {\n this.emitError(stepErrors)\n }\n })\n }\n navContainer.appendChild(nextButton)\n }\n\n // Botón Enviar (solo en el último paso)\n const submitConfig = this.getSubmitButtonConfig(schema)\n if (\n wizardState.currentStep === wizardState.totalSteps - 1 &&\n submitConfig.visible\n ) {\n const submitButton = document.createElement('button')\n submitButton.type = 'button'\n submitButton.textContent = submitConfig.text\n submitButton.className = 'easy-form-wizard-next'\n submitButton.style.width = submitConfig.width\n if (this.disabled || this.loading) {\n submitButton.disabled = true\n } else {\n submitButton.addEventListener('click', async () => {\n // Validar todos los campos del último paso antes de enviar\n const currentFields = this.stateManager.getCurrentStepFields()\n \n // Validar cada campo del paso actual\n for (const field of currentFields) {\n // Solo validar campos visibles\n if (this.stateManager.getFieldVisibility(field.name)) {\n await this.stateManager.validateField(field.name)\n }\n }\n \n // Obtener errores después de validar\n const allErrors = this.stateManager.getAllErrors()\n const stepErrors: Record<string, string[]> = {}\n \n // Filtrar solo errores de campos del paso actual\n for (const field of currentFields) {\n if (allErrors[field.name] && allErrors[field.name].length > 0) {\n stepErrors[field.name] = allErrors[field.name]\n }\n }\n\n const hasErrors = Object.keys(stepErrors).length > 0\n\n if (!hasErrors) {\n await this.handleSubmit(new Event('submit') as SubmitEvent)\n } else {\n this.emitError(stepErrors)\n }\n })\n }\n navContainer.appendChild(submitButton)\n }\n\n wizardContainer.appendChild(navContainer)\n container.appendChild(wizardContainer)\n }\n\n /**\n * Maneja el cambio de un campo\n */\n private async handleFieldChange(fieldName: string, value: any) {\n await this.stateManager.setValue(fieldName, value)\n this.scheduleSave()\n \n // Si es un array, re-renderizar para reflejar add/remove\n const schema = this.schema\n if (schema) {\n const field = this.findFieldInSchema(schema, fieldName)\n if (field?.type === 'array') {\n const replaced = this.rerenderArrayField(field)\n // Si no se encontró el contenedor, hacer render completo (ej. array dentro de row/group)\n if (!replaced) {\n this.skipPreserveValuesOnNextRender = true\n requestAnimationFrame(() => this.render())\n }\n }\n }\n \n // Obtener campos dependientes que necesitan re-renderizarse\n const dependentFields = this.stateManager.getDependentFields(fieldName)\n \n // Re-renderizar campos dependientes si hay cambios en dependencias\n if (dependentFields.length > 0) {\n // Usar un pequeño delay para agrupar múltiples cambios\n if (this.dependencyRenderTimeout) {\n clearTimeout(this.dependencyRenderTimeout)\n }\n \n this.dependencyRenderTimeout = setTimeout(() => {\n this.renderDependentFields(dependentFields)\n this.emitDependencyChange(fieldName, dependentFields)\n }, 10)\n }\n\n // Emitir evento change\n const changeEvent = new CustomEvent<ChangeEventDetail>('change', {\n detail: {\n field: fieldName,\n value,\n values: this.stateManager.getState().values,\n },\n bubbles: true,\n composed: true,\n })\n this.dispatchEvent(changeEvent)\n }\n\n private dependencyRenderTimeout: ReturnType<typeof setTimeout> | null = null\n\n /**\n * Re-renderiza un campo array cuando se añaden o eliminan ítems.\n * Retorna true si se reemplazó, false si no se encontró el contenedor.\n */\n private rerenderArrayField(field: Field): boolean {\n const arrayContainer = this.shadow.querySelector(\n `[data-field-name=\"${field.name}\"].easy-form-array`\n )\n if (!arrayContainer?.parentNode) return false\n\n const newArrayElement = this.renderArray(field)\n arrayContainer.parentNode.replaceChild(newArrayElement, arrayContainer)\n return true\n }\n\n /**\n * Re-renderiza campos dependientes\n */\n private renderDependentFields(fieldNames: string[]): void {\n const schema = this.schema\n if (!schema) return\n\n // Obtener TODOS los campos que podrían verse afectados\n // Incluir todos los campos del schema que tengan dependencias\n const allFieldsWithDeps = this.getAllFieldsWithDependencies(schema)\n \n const hasAnyFieldsWithDeps = allFieldsWithDeps.length > 0\n\n console.log('renderDependentFields:', { fieldNames, hasAnyFieldsWithDeps, allFieldsWithDeps: allFieldsWithDeps.map(f => f.name) })\n\n // Siempre re-renderizar individualmente los campos afectados\n // Esto evita re-renders completos que causan pérdida de foco\n const form = this.shadow.querySelector('form')\n if (!form) return\n\n // Obtener todos los nombres de campos a re-renderizar\n const fieldsToRerender = new Set<string>()\n \n // Agregar los campos directamente afectados\n for (const fn of fieldNames) {\n fieldsToRerender.add(fn)\n }\n \n // Agregar campos que dependen de los campos afectados\n for (const fn of fieldNames) {\n const deps = this.stateManager.getDependentFields(fn)\n deps.forEach(d => fieldsToRerender.add(d))\n }\n\n // Re-renderizar cada campo individualmente\n for (const fieldName of fieldsToRerender) {\n // Buscar el campo en el DOM\n let fieldContainer = form.querySelector(`[data-field-name=\"${fieldName}\"]`)\n \n // Si no se encuentra por data-field-name, buscar por nombre en campos\n if (!fieldContainer) {\n fieldContainer = form.querySelector(`.easy-form-field[name=\"${fieldName}\"]`)\n }\n \n // Para grupos, buscar el contenedor del grupo\n if (!fieldContainer) {\n fieldContainer = form.querySelector(`[data-field-name=\"${fieldName}\"], [data-group-name=\"${fieldName}\"]`)\n }\n\n if (fieldContainer) {\n const field = this.findFieldInSchema(schema, fieldName)\n if (!field) continue\n\n // Siempre re-renderizar para recalcular visibilidad\n const parent = fieldContainer.parentElement\n if (parent) {\n const newFieldElement = this.renderField(field)\n if (newFieldElement) {\n parent.replaceChild(newFieldElement, fieldContainer)\n }\n }\n }\n }\n }\n\n /**\n * Obtiene todos los campos que tienen dependencias\n */\n private getAllFieldsWithDependencies(schema: FormSchema): Field[] {\n const result: Field[] = []\n \n const extractFields = (fields: Field[]) => {\n for (const field of fields) {\n if (field.dependencies) {\n result.push(field)\n }\n if (field.type === 'group' && 'fields' in field) {\n extractFields(field.fields)\n }\n if (field.type === 'row' && 'fields' in field) {\n extractFields(field.fields)\n }\n if (field.type === 'array' && 'itemSchema' in field && field.itemSchema?.fields) {\n extractFields(field.itemSchema.fields)\n }\n }\n }\n \n const topLevelFields = (schema as any).isWizard\n ? (schema as any).steps!.flatMap((step: any) => step.fields)\n : schema.fields || []\n \n extractFields(topLevelFields)\n return result\n }\n\n /**\n * Emite evento de cambio de dependencia\n */\n private emitDependencyChange(\n changedField: string,\n affectedFields: string[]\n ): void {\n const dependencyEvent = new CustomEvent('dependencyChange', {\n detail: {\n changedField,\n affectedFields,\n },\n bubbles: true,\n composed: true,\n })\n this.dispatchEvent(dependencyEvent)\n }\n\n /**\n * Maneja el blur de un campo\n */\n private async handleFieldBlur(fieldName: string) {\n this.stateManager.setTouched(fieldName)\n // Validar solo el campo que perdió el foco\n await this.stateManager.validateField(fieldName)\n // Actualizar solo el campo específico sin re-renderizar todo el formulario\n this.updateSingleField(fieldName)\n }\n\n /**\n * Actualiza solo un campo específico sin re-renderizar todo el formulario\n */\n private updateSingleField(fieldName: string) {\n const schema = this.schema\n if (!schema) return\n\n const field = this.findFieldInSchema(schema, fieldName)\n if (!field) return\n\n const errors = this.stateManager.getErrors(fieldName)\n const error = errors.length > 0 ? errors[0] : undefined\n\n // Buscar el contenedor del campo en el DOM\n const fieldContainer = this.shadow.querySelector(`[name=\"${fieldName}\"]`)?.closest('.easy-form-field')\n if (!fieldContainer) return\n\n // Actualizar el error\n const errorElement = fieldContainer.querySelector('.easy-form-error')\n if (error) {\n if (!errorElement) {\n const errorEl = document.createElement('p')\n errorEl.className = 'easy-form-error'\n errorEl.textContent = error\n fieldContainer.appendChild(errorEl)\n } else {\n errorElement.textContent = error\n }\n // Agregar clase de error al input\n const input = fieldContainer.querySelector('input, textarea, select') as HTMLElement\n input?.classList.add('easy-form-input-error')\n } else {\n errorElement?.remove()\n const input = fieldContainer.querySelector('input, textarea, select') as HTMLElement\n input?.classList.remove('easy-form-input-error')\n }\n }\n\n /**\n * Busca un campo por nombre en el schema (soporta rutas como 'group.subfield')\n */\n private findFieldInSchema(schema: FormSchema, name: string): Field | null {\n const fields = schema.fields || []\n const dot = name.indexOf('.')\n if (dot > 0) {\n const parentName = name.slice(0, dot)\n const childName = name.slice(dot + 1)\n const parent = fields.find((f) => f.name === parentName)\n if (!parent) return null\n if ((parent.type === 'group' || parent.type === 'row') && 'fields' in parent && parent.fields) {\n const found = this.findFieldInSchema({ fields: parent.fields }, childName)\n return found ? { ...found, name } : null\n }\n return null\n }\n for (const field of fields) {\n if (field.name === name) {\n return field\n }\n if (field.type === 'group' && 'fields' in field) {\n const found = this.findFieldInSchema({ fields: field.fields }, name)\n if (found) return found\n }\n if (field.type === 'row' && 'fields' in field) {\n const found = this.findFieldInSchema({ fields: field.fields }, name)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Maneja el submit del formulario\n */\n private async handleSubmit(event: Event) {\n event.preventDefault()\n\n if (this.attemptsLock?.isLocked()) {\n return\n }\n\n if (this.timerExpired) {\n this.emitError({ form: ['El tiempo ha expirado. No puedes enviar el formulario.'] })\n return\n }\n\n const errors = await this.stateManager.validateForm()\n const state = this.stateManager.getState()\n\n if (Object.keys(errors).length > 0) {\n // Update error display without full re-render\n for (const fieldName of Object.keys(errors)) {\n this.updateSingleField(fieldName)\n }\n this.emitError(errors)\n return\n }\n\n // Emitir evento submit\n const submitDetail: SubmitEventDetail = {\n values: state.values,\n isValid: true,\n errors: {},\n }\n\n if (this.completeTime && this.timerStarted) {\n submitDetail.timeRemaining = this.timeRemaining\n }\n\n const submitEvent = new CustomEvent<SubmitEventDetail>('submit', {\n detail: submitDetail,\n bubbles: true,\n composed: true,\n })\n this.dispatchEvent(submitEvent)\n\n // Limpiar datos de persistencia después de submit exitoso\n this.clearPersistence()\n }\n\n /**\n * Emite evento de error\n */\n private emitError(errors: Record<string, string[]>) {\n const errorEvent = new CustomEvent<ErrorEventDetail>('error', {\n detail: {\n errors,\n },\n bubbles: true,\n composed: true,\n })\n this.dispatchEvent(errorEvent)\n }\n\n /**\n * Emite evento de cambio de step\n */\n private emitStepChange() {\n const wizardState = this.stateManager.getWizardState()\n if (!wizardState) return\n\n const stepChangeEvent = new CustomEvent<StepChangeEventDetail>(\n 'stepChange',\n {\n detail: {\n currentStep: wizardState.currentStep,\n previousStep:\n wizardState.currentStep > 0\n ? wizardState.currentStep - 1\n : wizardState.currentStep,\n totalSteps: wizardState.totalSteps,\n },\n bubbles: true,\n composed: true,\n }\n )\n this.dispatchEvent(stepChangeEvent)\n }\n\n /**\n * Registra componentes personalizados\n */\n public registerComponents(components: ComponentRegistry): void {\n this.customComponents = { ...this.customComponents, ...components }\n registerComponents(components)\n }\n\n /**\n * Resetea el formulario a sus valores iniciales\n */\n public reset(): void {\n this.stateManager.reset()\n this.render()\n }\n\n /**\n * Incrementa el contador de intentos (para bloqueo por intentos fallidos).\n * El consumidor debe llamar esto cuando la API/login falle.\n */\n public incrementAttempts(): void {\n this.attemptsLock?.incrementAttempts()\n if (this.attemptsLock?.isLocked()) {\n this.updateLockOverlay()\n }\n }\n\n /**\n * Resetea el contador de intentos y desbloquea el formulario.\n */\n public resetAttempts(): void {\n this.attemptsLock?.reset()\n this.stopLockCountdown()\n this.updateLockOverlay()\n this.render()\n }\n\n /**\n * Retorna true si el formulario está bloqueado por intentos.\n */\n public isLocked(): boolean {\n return this.attemptsLock?.isLocked() ?? false\n }\n\n /**\n * Retorna los milisegundos restantes del bloqueo, o 0 si no está bloqueado.\n */\n public getRemainingBlockTimeMs(): number {\n return this.attemptsLock?.getRemainingBlockTimeMs() ?? 0\n }\n\n /**\n * Dispara el submit del formulario programáticamente.\n * Útil cuando el botón submit está oculto (visible: false).\n */\n public requestSubmit(): void {\n const form = this.shadow.querySelector('form')\n if (form && typeof (form as HTMLFormElement).requestSubmit === 'function') {\n ;(form as HTMLFormElement).requestSubmit()\n }\n }\n\n /**\n * Limpia todos los valores del formulario\n */\n public clear(): void {\n const schema = this.schema\n const templateName = this.template\n let currentSchema: FormSchema | null = null\n \n if (templateName) {\n currentSchema = this.getSchemaFromTemplate(templateName)\n } else {\n currentSchema = schema\n }\n \n if (currentSchema) {\n this.stateManager.initializeSchema(currentSchema, {})\n this.render()\n }\n }\n\n /**\n * Obtiene todos los valores del formulario\n */\n public getValues(): Record<string, any> {\n return this.stateManager.getState().values\n }\n\n /**\n * Obtiene el valor de un campo específico\n */\n public getValue(fieldName: string): any {\n return this.stateManager.getValue(fieldName)\n }\n\n /**\n * Establece el valor de un campo específico\n */\n public async setValue(fieldName: string, value: any): Promise<void> {\n await this.stateManager.setValue(fieldName, value)\n this.render()\n }\n\n /**\n * Establece múltiples valores a la vez\n */\n public async setValues(values: Record<string, any>): Promise<void> {\n for (const [fieldName, value] of Object.entries(values)) {\n await this.stateManager.setValue(fieldName, value)\n }\n this.render()\n }\n\n /**\n * Valida el formulario completo\n */\n public async validate(): Promise<Record<string, string[]>> {\n const errors = await this.stateManager.validateForm()\n // Update error display without full re-render\n if (Object.keys(errors).length > 0) {\n // Update error messages for each field with errors\n for (const fieldName of Object.keys(errors)) {\n this.updateSingleField(fieldName)\n }\n this.emitError(errors)\n } else {\n // Clear all error displays\n const errorElements = this.shadow.querySelectorAll('.easy-form-error')\n errorElements.forEach(el => el.remove())\n const inputErrors = this.shadow.querySelectorAll('.easy-form-input-error')\n inputErrors.forEach(el => el.classList.remove('easy-form-input-error'))\n }\n return errors\n }\n\n /**\n * Valida un campo específico\n */\n public async validateField(fieldName: string): Promise<string[]> {\n await this.stateManager.validateField(fieldName)\n this.updateSingleField(fieldName)\n return this.stateManager.getErrors(fieldName)\n }\n\n /**\n * Obtiene todos los errores del formulario\n */\n public getErrors(): Record<string, string[]> {\n return this.stateManager.getAllErrors()\n }\n\n /**\n * Obtiene los errores de un campo específico\n */\n public getFieldErrors(fieldName: string): string[] {\n return this.stateManager.getErrors(fieldName)\n }\n\n /**\n * Verifica si el formulario es válido\n */\n public isValid(): boolean {\n return this.stateManager.getState().isValid\n }\n\n /**\n * Obtiene el tema del formulario\n */\n get theme(): FormTheme {\n const themeAttr = this.getAttribute('theme')\n const validThemes: FormTheme[] = [\n 'plano',\n 'tradicional',\n 'material',\n 'rounded-shadow',\n 'lines',\n 'shadcn',\n 'chakra',\n 'mantine',\n 'glass',\n 'bordered',\n 'minimal',\n 'efc'\n ]\n if (themeAttr && validThemes.includes(themeAttr as FormTheme)) {\n return themeAttr as FormTheme\n }\n return 'plano' // Tema por defecto\n }\n\n /**\n * Establece el tema del formulario\n */\n set theme(value: FormTheme) {\n if (value) {\n this.setAttribute('theme', value)\n } else {\n this.removeAttribute('theme')\n }\n }\n\n /**\n * Obtiene los colores personalizados\n */\n get colors(): FormColors | null {\n const colorsAttr = this.getAttribute('colors')\n if (!colorsAttr) return null\n return parseAttributeValue(colorsAttr)\n }\n\n /**\n * Establece los colores personalizados\n */\n set colors(value: FormColors | null) {\n if (value) {\n this.setAttribute('colors', attributeValue(value))\n } else {\n this.removeAttribute('colors')\n }\n }\n\n /**\n * Obtiene los datos iniciales\n */\n get initialData(): Record<string, any> | null {\n const initialDataAttr = this.getAttribute('initialData')\n if (!initialDataAttr) return null\n return parseAttributeValue(initialDataAttr)\n }\n\n /**\n * Establece los datos iniciales\n */\n set initialData(value: Record<string, any> | null) {\n if (value) {\n this.setAttribute('initialData', attributeValue(value))\n } else {\n this.removeAttribute('initialData')\n }\n }\n\n /**\n * Obtiene el estado de loading\n */\n get loading(): boolean {\n return this.hasAttribute('loading')\n }\n\n /**\n * Establece el estado de loading\n */\n set loading(value: boolean) {\n if (value) {\n this.setAttribute('loading', '')\n } else {\n this.removeAttribute('loading')\n }\n }\n\n/**\n * Obtiene el estado de disabled\n */\n get disabled(): boolean {\n return this.hasAttribute('disabled')\n }\n\n /**\n * Establece el estado de disabled\n */\n set disabled(value: boolean) {\n if (value) {\n this.setAttribute('disabled', '')\n } else {\n this.removeAttribute('disabled')\n }\n }\n\n /**\n * Obtiene el tiempo límite en segundos\n */\n get completeTime(): number | null {\n const attr = this.getAttribute('complete-time')\n if (!attr) return null\n const n = parseInt(attr, 10)\n return isNaN(n) || n <= 0 ? null : n\n }\n\n /**\n * Establece el tiempo límite en segundos\n */\n set completeTime(value: number | null) {\n if (value != null && value > 0) {\n this.setAttribute('complete-time', String(value))\n } else {\n this.removeAttribute('complete-time')\n }\n }\n\n /**\n * Configura estilos básicos\n */\n private setupStyles() {\n // Eliminar estilos anteriores si existen\n const existingStyle = this.shadow.querySelector('style')\n if (existingStyle) {\n existingStyle.remove()\n }\n\n const theme = this.theme\n const colors = getColors(this.colors || undefined)\n const styles = getThemeStyles(theme, colors)\n\n const style = document.createElement('style')\n style.textContent = styles\n \n // Insertar estilos ANTES de cualquier otro contenido para asegurar que se apliquen\n if (this.shadow.firstChild) {\n this.shadow.insertBefore(style, this.shadow.firstChild)\n } else {\n this.shadow.appendChild(style)\n }\n }\n\n /**\n * Inicializa la persistencia del formulario\n */\n private initPersistence(schema: FormSchema) {\n if (!schema.persistence || !schema.persistence.enabled) {\n this.persistenceConfig = null\n return\n }\n\n this.persistenceConfig = {\n enabled: true,\n key: schema.persistence.key,\n autoSave: schema.persistence.autoSave ?? true,\n debounce: schema.persistence.debounce ?? 500,\n onRestore: schema.persistence.onRestore,\n }\n\n // Intentar restaurar datos guardados\n this.restoreFromStorage()\n }\n\n /**\n * Restaura los valores desde localStorage\n */\n private restoreFromStorage() {\n if (!this.persistenceConfig || !this.persistenceConfig.enabled) return\n if (!this.persistenceConfig.key) return\n\n try {\n const stored = localStorage.getItem(this.persistenceConfig.key)\n if (stored) {\n const values = JSON.parse(stored)\n if (values && typeof values === 'object') {\n // Guardar valores temporalmente para aplicar después del render\n this.pendingRestoreValues = values\n \n // Llamar al callback onRestore si existe\n if (this.persistenceConfig.onRestore) {\n this.persistenceConfig.onRestore(values)\n }\n }\n }\n } catch (e) {\n console.warn('EasyForm: Error restoring from localStorage:', e)\n }\n }\n\n /**\n * Aplica los valores pendientes de restauración después del render\n */\n private applyPendingRestoreValues() {\n if (!this.pendingRestoreValues || this.isRestoringValues) return\n \n this.isRestoringValues = true\n const valuesToRestore = { ...this.pendingRestoreValues }\n this.pendingRestoreValues = null\n \n for (const [key, value] of Object.entries(valuesToRestore)) {\n this.stateManager.setValueWithoutValidation(key, value)\n }\n \n // Actualizar los inputs del DOM directamente\n this.updateInputsWithValues(valuesToRestore)\n \n this.isRestoringValues = false\n }\n\n /**\n * Actualiza los valores de los inputs del DOM\n */\n private updateInputsWithValues(values: Record<string, any>) {\n for (const fieldName of Object.keys(values)) {\n const input = this.shadow.querySelector(`[name=\"${fieldName}\"]`) as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n if (input) {\n input.value = values[fieldName] ?? ''\n }\n }\n }\n\n /**\n * Guarda los valores en localStorage\n */\n private saveToStorage() {\n if (!this.persistenceConfig || !this.persistenceConfig.enabled) return\n if (!this.persistenceConfig.key) return\n\n try {\n const values = this.stateManager.getState().values\n localStorage.setItem(this.persistenceConfig.key, JSON.stringify(values))\n } catch (e) {\n console.warn('EasyForm: Error saving to localStorage:', e)\n }\n }\n\n /**\n * Programa un guardado debounced\n */\n private scheduleSave() {\n if (!this.persistenceConfig || !this.persistenceConfig.enabled) return\n if (!this.persistenceConfig.autoSave) return\n\n // Limpiar timer anterior\n if (this.persistenceDebounceTimer) {\n clearTimeout(this.persistenceDebounceTimer)\n }\n\n // Programar nuevo guardado\n this.persistenceDebounceTimer = setTimeout(() => {\n this.saveToStorage()\n }, this.persistenceConfig.debounce)\n }\n\n /**\n * Limpia los datos de persistencia\n */\n private clearPersistence() {\n if (!this.persistenceConfig || !this.persistenceConfig.key) return\n\n try {\n localStorage.removeItem(this.persistenceConfig.key)\n } catch (e) {\n console.warn('EasyForm: Error clearing localStorage:', e)\n }\n }\n\n /**\n * Resetea el timer de complete-time\n */\n private resetTimer(): void {\n if (this.completeTimeInterval) {\n clearInterval(this.completeTimeInterval)\n this.completeTimeInterval = null\n }\n this.timerStarted = false\n this.timerExpired = false\n if (this.completeTime) {\n this.timeRemaining = this.completeTime\n }\n }\n\n /**\n * Inicia el timer de complete-time\n */\n private startTimer(): void {\n if (this.timerStarted || this.timerExpired || !this.completeTime) return\n\n this.timerStarted = true\n this.timeRemaining = this.completeTime\n\n this.updateTimerDisplay()\n\n this.completeTimeInterval = setInterval(() => {\n this.timeRemaining--\n this.updateTimerDisplay()\n\n if (this.timeRemaining <= 0) {\n this.handleTimerExpired()\n }\n }, 1000)\n }\n\n /**\n * Actualiza la visualización del timer\n */\n private updateTimerDisplay(): void {\n const existingTimer = this.shadow.querySelector('.easy-form-timer')\n if (!existingTimer) return\n\n const minutes = Math.floor(this.timeRemaining / 60)\n const seconds = this.timeRemaining % 60\n const timeStr = `${minutes}:${seconds.toString().padStart(2, '0')}`\n existingTimer.textContent = timeStr\n\n if (this.timeRemaining <= 30) {\n existingTimer.classList.add('easy-form-timer-warning')\n }\n if (this.timeRemaining <= 10) {\n existingTimer.classList.add('easy-form-timer-danger')\n }\n }\n\n /**\n * Maneja cuando el timer expira\n */\n private handleTimerExpired(): void {\n if (this.completeTimeInterval) {\n clearInterval(this.completeTimeInterval)\n this.completeTimeInterval = null\n }\n\n this.timerExpired = true\n\n const timeoutEvent = new CustomEvent<TimeoutEventDetail>('timeout', {\n detail: {\n originalTime: this.completeTime || 0,\n expiredAt: new Date(),\n },\n bubbles: true,\n composed: true,\n })\n this.dispatchEvent(timeoutEvent)\n\n this.disableAllFields()\n }\n\n /**\n * Deshabilita todos los campos del formulario\n */\n private disableAllFields(): void {\n const form = this.shadow.querySelector('form')\n if (!form) return\n\n const inputs = form.querySelectorAll('input, textarea, select, button')\n inputs.forEach((input) => {\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement || input instanceof HTMLSelectElement) {\n (input as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).disabled = true\n } else if (input instanceof HTMLButtonElement && input.type !== 'submit') {\n input.disabled = true\n }\n })\n\n form.classList.add('easy-form-timer-expired')\n\n const timerDisplay = this.shadow.querySelector('.easy-form-timer')\n if (timerDisplay) {\n timerDisplay.classList.add('easy-form-timer-expired')\n timerDisplay.textContent = 'Tiempo agotado'\n }\n }\n\n /**\n * Configura el event listener para iniciar el timer en el primer input\n */\n private setupTimerInputListener(): void {\n if (!this.completeTime || this.timerStarted) return\n\n const form = this.shadow.querySelector('form')\n if (!form) return\n\n const handleFirstInput = () => {\n if (!this.timerStarted && !this.timerExpired) {\n this.startTimer()\n }\n }\n\n form.addEventListener('input', handleFirstInput, { once: true })\n }\n\n /**\n * Renderiza el display del timer\n */\n private renderTimerDisplay(): void {\n const existingTimer = this.shadow.querySelector('.easy-form-timer')\n if (existingTimer) existingTimer.remove()\n\n const form = this.shadow.querySelector('form')\n if (!form) return\n\n const timerContainer = document.createElement('div')\n timerContainer.className = 'easy-form-timer'\n\n const initialTime = this.completeTime || 0\n const minutes = Math.floor(initialTime / 60)\n const seconds = initialTime % 60\n timerContainer.textContent = `${minutes}:${seconds.toString().padStart(2, '0')}`\n\n form.insertBefore(timerContainer, form.firstChild)\n }\n}\n\n// Registrar el Web Component solo en el navegador\nif (typeof window !== 'undefined' && typeof customElements !== 'undefined' && !customElements.get('easy-form')) {\n customElements.define('easy-form', EasyForm)\n}\n"],"mappings":"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AAM;AAAA,gCACTA,EAAO,UAAU;AAAA,sCACXA,EAAO,eAAe;AAAA,iCAC3BA,EAAO,UAAU;AAAA,kCAChBA,EAAO,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA6JT,CC9JO,SAASC,GAAkBC,EAAuC,CACvE,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["_getDefaults","changeDefaults","newDefaults","_defaults","edit","regex","opt","source","obj","name","val","valSource","other","escape","html","encode","getEscapeReplacement","cleanUrl","href","splitCells","tableRow","count","row","match","offset","str","escaped","curr","cells","i","rtrim","c","invert","l","suffLen","currChar","findClosingBracket","b","level","expandTabs","line","indent","col","expanded","char","added","outputLink","cap","link","raw","lexer","rules","title","text","token","indentCodeCompensation","matchIndentToCode","indentToCode","node","matchIndentInNode","indentInNode","marked","src","markedInstance","noopTest","supportsLookbehind","newline","blockCode","fences","hr","heading","bullet","lheadingCore","lheading","lheadingGfm","_paragraph","blockText","_blockLabel","def","list","_tag","_comment","paragraph","blockquote","blockNormal","gfmTable","blockGfm","blockPedantic","inlineCode","br","inlineText","_punctuation","_punctuationOrSpace","_notPunctuationOrSpace","punctuation","_punctuationGfmStrongEm","_punctuationOrSpaceGfmStrongEm","_notPunctuationOrSpaceGfmStrongEm","_punctuationGfmDel","_punctuationOrSpaceGfmDel","_notPunctuationOrSpaceGfmDel","blockSkip","emStrongLDelimCore","emStrongLDelim","emStrongLDelimGfm","emStrongRDelimAstCore","emStrongRDelimAst","emStrongRDelimAstGfm","emStrongRDelimUnd","delLDelim","delRDelimCore","delRDelim","anyPunctuation","autolink","_inlineComment","tag","_inlineLabel","reflink","nolink","reflinkSearch","_caseInsensitiveProtocol","inlineNormal","inlinePedantic","inlineGfm","inlineBreaks","block","inline","escapeReplacements","_Tokenizer","_Lexer","_Renderer","_TextRenderer","_Parser","_Hooks","Marked","options","setOptions","use","walkTokens","parseInline","parse","parser","bull","ch","__publicField","trimmed","lines","tokens","inBlockquote","currentLines","currentRaw","currentText","top","lastToken","oldToken","newText","newToken","isordered","itemRegex","endsWithBlankLine","endEarly","itemContents","nextLine","blankLine","nextBulletRegex","hrRegex","fencesBeginRegex","headingBeginRegex","htmlBeginRegex","blockquoteBeginRegex","rawLine","nextLineWithoutTabs","lastItem","item","taskRaw","checkboxToken","spacers","t","hasMultipleLineBreaks","headers","aligns","rows","align","cell","trimmedUrl","rtrimSlash","lastParenIndex","linkLen","links","linkString","maskedSrc","prevChar","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","lastCharLength","hasNonSpaceChars","hasSpaceCharsOnBothEnds","prevCapZero","__Lexer","next","lastParagraphClipped","extTokenizer","cutSrc","startIndex","tempSrc","tempStart","getStartIndex","errMsg","keepPrevChar","lang","langString","code","depth","ordered","start","body","j","type","startAttr","checked","header","k","content","cleanHref","out","__Parser","anyToken","genericToken","ret","renderer","_a","markdown","args","callback","values","tableToken","listToken","childTokens","extensions","pack","opts","ext","prevRenderer","extLevel","prop","rendererProp","rendererFunc","tokenizer","tokenizerProp","tokenizerFunc","prevTokenizer","hooks","hooksProp","hooksFunc","prevHook","arg","packWalktokens","blockType","origOpt","throwError","processedSrc","processedTokens","e","silent","async","msg","SchemaParser","schema","step","normalizedFields","normalizedSteps","fields","field","index","min","max","slot","fieldName","slotName","defaults","parsed","allFields","extractFields","hexToRgb","hex","result","short","defaultColors","getColors","colors","getBaseStyles","getPlanoStyles","_colors","getTradicionalStyles","_colors","getMaterialStyles","_colors","getRoundedShadowStyles","_colors","getLinesStyles","_colors","getShadcnStyles","_colors","getChakraStyles","_colors","getMantineStyles","_colors","getGlassStyles","_colors","getBorderedStyles","_colors","getMinimalStyles","_colors","getEfcStyles","_colors","getThemeStyles","theme","colors","baseStyles","getBaseStyles","themeStyles","getThemeSpecificStyles","getPlanoStyles","getTradicionalStyles","getMaterialStyles","getRoundedShadowStyles","getLinesStyles","getShadcnStyles","getChakraStyles","getMantineStyles","getGlassStyles","getBorderedStyles","getMinimalStyles","getEfcStyles","PREDEFINED_MASKS","value","cleaned","getPredefinedMask","type","INJECTION_VALIDATION_MESSAGE","INJECTION_PATTERNS","containsInjection","value","pattern","isSafeFromInjection","item","v","AttemptsLock","options","stored","data","attributeValue","value","parseAttributeValue","getNestedValue","obj","path","current","key","setNestedValue","value","keys","lastKey","target","isValidEmail","email","ConditionEngine","condition","formValues","fieldValue","conditions","logic","conditionsArray","dependencies","visible","enabled","required","shouldHide","shouldDisable","shouldBeOptional","fieldName","parts","value","part","operator","compareValue","a","b","val","index","keysA","keysB","key","parsed","ValidationEngine","ConditionEngine","field","value","_field","validations","errors","validation","result","isValid","isValidEmail","minLength","maxLength","min","num","max","pattern","regex","isSafeFromInjection","INJECTION_VALIDATION_MESSAGE","values","fields","itemFields","arrayValue","i","itemValue","itemField","itemFieldName","itemFieldValue","fieldErrors","arrayErrors","arrayField","StateManager","SchemaParser","ValidationEngine","ConditionEngine","schema","initialData","fields","allFields","field","topLevelNames","f","arrayItemNames","sub","parentPath","containerType","result","fullPath","containerPath","topLevelFields","step","allFieldsWithArrays","observedFields","observedField","dependencies","extractFromCondition","condition","extractFromConditions","conditions","existingValues","values","key","value","setNestedValue","existingValue","getNestedValue","prevValue","arrayItemOnlyNames","arrayField","minItems","arr","padded","i","item","subField","name","itemFields","fieldName","dependentFields","dependentField","dependentFieldWithIndex","fieldNameWithoutIndex","indexMatch","dependentWithIndex","baseFieldName","parts","partialPath","sourcePath","targetPath","index","sourceArray","activeValidations","errors","validations","textFieldTypes","skipInjection","v","isRequired","hasRequiredValidation","conditional","stepIndex","isSubmitting","cached","fieldInfo","valuesContext","observerField","getObserverField","deps","itemIndex","observerValue","arrayValue","bracketKey","bracketObj","itemContext","containerValues","createRelativeContext","obj","prefix","entries","relativeKey","relativeContext","hasRequired","BaseInput","field","value","error","onChange","onBlur","rawInput","leading","trailing","wrapper","slotEl","inputWrap","slot","container","img","input","componentContainerClasses","cls","labelPosition","inputToAppend","el","label","v","required","inner","description","errorEl","element","key","parseMaskPattern","pattern","tokens","i","char","formatValue","value","result","valueIndex","token","unformatValue","tokenIndex","nextToken","getNextEditablePosition","position","direction","getMaskPlaceholder","placeholder","calculateCursorPosition","oldValue","newValue","oldCursorPosition","editableBeforeOld","editableCount","MaskEngine","mask","getPredefinedMask","customMask","cacheKey","tokens","parseMaskPattern","value","editableTokens","t","acceptedTypes","unformatted","char","formatted","formatValue","unformatValue","getMaskPlaceholder","position","token","input","previousValue","cursorPosition","unformattedInput","newCursorPosition","calculateCursorPosition","key","currentValue","isBackspace","prevEditable","getNextEditablePosition","before","after","newValue","newPos","nextEditable","TextInput","BaseInput","field","value","error","onChange","onBlur","MaskEngine","input","displayValue","maskPlaceholder","e","target","cursorPosition","inputValue","result","valueToEmit","isBackspace","pastedText","before","after","newValue","NumberInput","BaseInput","field","value","error","onChange","onBlur","MaskEngine","input","displayValue","numberField","maskPlaceholder","e","target","cursorPosition","inputValue","result","numValue","unformatted","isBackspace","pastedText","before","after","newValue","TextareaInput","BaseInput","textarea","textareaField","e","target","SelectInput","BaseInput","select","selectField","placeholderOption","option","optionEl","updatePlaceholderClass","e","target","selectedValues","opt","CheckboxInput","BaseInput","checkbox","e","target","container","label","labelText","description","errorEl","RadioInput","BaseInput","container","label","v","required","radioGroup","radioField","option","optionValue","optionLabel","radioContainer","radio","description","errorEl","SwitchInput","BaseInput","switchEl","e","target","container","label","labelText","description","errorEl","DateInput","BaseInput","input","dateField","date","e","target","FileInput","BaseInput","input","fileField","e","target","QuantityInput","BaseInput","container","quantityField","min","max","step","currentValue","inputWrapper","decrementBtn","input","incrementBtn","newValue","updateButtons","e","target","numValue","value","AccordionSelectInput","BaseInput","container","accordionField","selectedValue","option","index","optionValue","optionLabel","optionDescription","accordionItem","header","headerContent","indicator","label","arrow","content","description","customContent","toggleAccordion","isOpen","item","otherHeader","otherContent","otherArrow","selectOption","currentValues","itemIndicator","e","ImageGridSelectInput","BaseInput","container","imageGridField","selectedValue","columns","imageSize","option","optionValue","optionLabel","optionImage","optionDescription","gridItem","imageContainer","img","placeholder","indicator","label","description","selectOption","currentValues","index","item","itemIndicator","e","OTPInput","BaseInput","container","length","value","valueString","i","input","currentIndex","e","target","inputValue","digits","j","nextEmptyIndex","otpValue","otpField","finalValue","DEFAULT_SEPARATED_LENGTH","eyeSvg","visible","PasswordInput","BaseInput","pf","useSeparated","length","showToggle","input","e","wrapper","btn","value","valueString","container","i","currentIndex","chars","j","nextIdx","toggleWrap","type","inp","FileDropInput","BaseInput","fileDropField","accept","multiple","dropZone","hiddenInput","label","fileList","renderFileList","files","names","f","name","item","handleFiles","arr","e","target","LEAFLET_CSS","MapInput","BaseInput","mapField","center","zoom","value","lat","lng","container","inputsWrapper","latInput","lngInput","updateFromInputs","latVal","lngVal","mapContainer","linkId","cssLoaded","link","resolve","checkReady","L","tileLayer","invalidateSize","entries","entry","pos","e","newLat","newLng","STAR_SVG","filled","RatingInput","BaseInput","ratingField","max","half","currentValue","container","starsContainer","i","starWrapper","e","rect","val","mid","cur","newVal","value","star","idx","SliderInput","BaseInput","sliderField","min","max","step","showValue","input","e","target","val","valueSpan","wrapper","HEX_REGEX","toHex","value","m","ColorInput","BaseInput","defaultValue","currentValue","wrapper","colorPicker","textInput","syncFromPicker","hex","syncFromText","raw","MarkdownInput","BaseInput","field","showPreview","showToolbar","height","container","toolbar","editorWrapper","textarea","preview","btn","button","prefix","suffix","placeholder","start","end","text","selectedText","newText","newCursorPos","value","markdown","marked","html","previewPlaceholder","createInput","field","value","error","onChange","onBlur","TextInput","PasswordInput","NumberInput","TextareaInput","SelectInput","CheckboxInput","RadioInput","SwitchInput","DateInput","FileInput","FileDropInput","MapInput","RatingInput","SliderInput","ColorInput","QuantityInput","AccordionSelectInput","ImageGridSelectInput","OTPInput","MarkdownInput","div","customComponents","registerComponent","type","component","registerComponents","components","getCustomComponent","loginTemplate","registerTemplate","value","otpTemplate","contactTemplate","passwordResetTemplate","passwordChangeTemplate","profileTemplate","checkoutTemplate","feedbackTemplate","subscriptionTemplate","bookingTemplate","reviewTemplate","templates","getTemplate","templateName","extendTemplate","templateName","additionalFields","baseTemplate","getTemplate","existingFields","existingSteps","lastStep","BrowserHTMLElement","EasyForm","StateManager","schemaAttr","parseAttributeValue","value","f","attributeValue","templateAttr","extendAttr","attr","n","schema","fromAttr","merged","name","oldValue","newValue","form","input","maxAttempts","AttemptsLock","templateName","initialData","baseTemplate","getTemplate","additionalFields","extendTemplate","isArrayRefresh","preservedValues","previousWizardState","key","wasWizard","isWizard","wizardState","completedStep","finalWizardState","newFormElement","e","directionAttr","direction","showCompletedAttr","completedIndicator","completedPosition","submitConfig","submitWrapper","submitButton","formWrapper","completed","total","progressBar","track","fill","oldForm","oldWrapper","formElement","existingOverlay","overlay","message","updateCountdown","remainingMs","minutes","seconds","timeStr","spinner","currentSchema","inputs","opt","elements","child","el","raw","parsed","row","totalRows","result","template","effectiveRow","clone","existing","slotElement","container","fields","endSlots","slotClonesByRow","rowIndex","slotsForRow","field","fieldElement","isVisible","isEnabled","groupElement","rowElement","arrayElement","customElement","errors","error","isFormDisabled","labelPositionAttr","validLabelPositions","effectiveLabelPosition","fieldWithDependencies","customComponent","getCustomComponent","element","val","inputElement","createInput","fieldContainer","groupField","dir","collapsible","defaultOpen","groupContainer","header","groupContentId","labelSpan","chevron","content","subField","fullName","subFieldWithPath","setContentHeight","open","label","rowContainer","rowField","gapValue","fieldWrapper","arrayContainer","values","arrayField","minItems","maxItems","itemsContainer","i","itemContainer","itemField","itemFieldWithName","removeButton","atMinItems","newValues","addButton","atMaxItems","newItem","div","extractFields","items","count","sf","visibleRequired","v","wizardContainer","stepsIndicator","schemaStepStyle","stepEl","fieldsContainer","currentFields","navContainer","prevButton","nextButton","currentState","allErrors","stepErrors","fieldName","dependentFields","changeEvent","newArrayElement","fieldNames","allFieldsWithDeps","hasAnyFieldsWithDeps","fieldsToRerender","fn","d","parent","newFieldElement","topLevelFields","step","changedField","affectedFields","dependencyEvent","errorElement","errorEl","dot","parentName","childName","found","event","state","submitDetail","submitEvent","errorEvent","stepChangeEvent","components","registerComponents","themeAttr","colorsAttr","initialDataAttr","existingStyle","theme","colors","getColors","styles","getThemeStyles","style","stored","valuesToRestore","existingTimer","timeoutEvent","timerDisplay","handleFirstInput","timerContainer","initialTime"]}
1
+ {"version":3,"sources":["../node_modules/marked/src/defaults.ts","../node_modules/marked/src/rules.ts","../node_modules/marked/src/helpers.ts","../node_modules/marked/src/Tokenizer.ts","../node_modules/marked/src/Lexer.ts","../node_modules/marked/src/Renderer.ts","../node_modules/marked/src/TextRenderer.ts","../node_modules/marked/src/Parser.ts","../node_modules/marked/src/Hooks.ts","../node_modules/marked/src/Instance.ts","../node_modules/marked/src/marked.ts","../src/core/schema-parser.ts","../src/utils/themes/base.ts","../src/utils/themes/plano.ts","../src/utils/themes/tradicional.ts","../src/utils/themes/material.ts","../src/utils/themes/rounded-shadow.ts","../src/utils/themes/lines.ts","../src/utils/themes/shadcn.ts","../src/utils/themes/chakra.ts","../src/utils/themes/mantine.ts","../src/utils/themes/glass.ts","../src/utils/themes/bordered.ts","../src/utils/themes/minimal.ts","../src/utils/themes/efc.ts","../src/utils/themes/index.ts","../src/utils/masks.ts","../src/utils/injection-validation.ts","../src/utils/attempts-lock.ts","../src/utils/index.ts","../src/core/condition-engine.ts","../src/core/validation-engine.ts","../src/core/state-manager.ts","../src/components/inputs/base-input.ts","../src/utils/mask-helpers.ts","../src/core/mask-engine.ts","../src/components/inputs/text-input.ts","../src/components/inputs/number-input.ts","../src/components/inputs/textarea-input.ts","../src/components/inputs/select-input.ts","../src/components/inputs/checkbox-input.ts","../src/components/inputs/radio-input.ts","../src/components/inputs/switch-input.ts","../src/components/inputs/date-input.ts","../src/components/inputs/file-input.ts","../src/components/inputs/quantity-input.ts","../src/components/inputs/accordion-select-input.ts","../src/components/inputs/image-grid-select-input.ts","../src/components/inputs/otp-input.ts","../src/components/inputs/password-input.ts","../src/components/inputs/file-drop-input.ts","../src/components/inputs/map-input.ts","../src/components/inputs/rating-input.ts","../src/components/inputs/slider-input.ts","../src/components/inputs/color-input.ts","../src/components/inputs/markdown-input.ts","../src/components/inputs/index.ts","../src/templates/index.ts","../src/components/easy-form.ts"],"sourcesContent":["import type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Gets the original marked default options.\n */\nexport function _getDefaults<ParserOutput = string, RendererOutput = string>(): MarkedOptions<ParserOutput, RendererOutput> {\n return {\n async: false,\n breaks: false,\n extensions: null,\n gfm: true,\n hooks: null,\n pedantic: false,\n renderer: null,\n silent: false,\n tokenizer: null,\n walkTokens: null,\n };\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport let _defaults: MarkedOptions<any, any> = _getDefaults();\n\nexport function changeDefaults<ParserOutput = string, RendererOutput = string>(newDefaults: MarkedOptions<ParserOutput, RendererOutput>) {\n _defaults = newDefaults;\n}\n","const noopTest = { exec: () => null } as unknown as RegExp;\n\nfunction edit(regex: string | RegExp, opt = '') {\n let source = typeof regex === 'string' ? regex : regex.source;\n const obj = {\n replace: (name: string | RegExp, val: string | RegExp) => {\n let valSource = typeof val === 'string' ? val : val.source;\n valSource = valSource.replace(other.caret, '$1');\n source = source.replace(name, valSource);\n return obj;\n },\n getRegex: () => {\n return new RegExp(source, opt);\n },\n };\n return obj;\n}\n\nconst supportsLookbehind = (() => {\ntry {\n // eslint-disable-next-line prefer-regex-literals\n return !!new RegExp('(?<=1)(?<!1)');\n} catch {\n // See browser support here:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Lookbehind_assertion\n return false;\n}\n})();\n\nexport const other = {\n codeRemoveIndent: /^(?: {1,4}| {0,3}\\t)/gm,\n outputLinkReplace: /\\\\([\\[\\]])/g,\n indentCodeCompensation: /^(\\s+)(?:```)/,\n beginningSpace: /^\\s+/,\n endingHash: /#$/,\n startingSpaceChar: /^ /,\n endingSpaceChar: / $/,\n nonSpaceChar: /[^ ]/,\n newLineCharGlobal: /\\n/g,\n tabCharGlobal: /\\t/g,\n multipleSpaceGlobal: /\\s+/g,\n blankLine: /^[ \\t]*$/,\n doubleBlankLine: /\\n[ \\t]*\\n[ \\t]*$/,\n blockquoteStart: /^ {0,3}>/,\n blockquoteSetextReplace: /\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,\n blockquoteSetextReplace2: /^ {0,3}>[ \\t]?/gm,\n listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,\n listIsTask: /^\\[[ xX]\\] +\\S/,\n listReplaceTask: /^\\[[ xX]\\] +/,\n listTaskCheckbox: /\\[[ xX]\\]/,\n anyLine: /\\n.*\\n/,\n hrefBrackets: /^<(.*)>$/,\n tableDelimiter: /[:|]/,\n tableAlignChars: /^\\||\\| *$/g,\n tableRowBlankLine: /\\n[ \\t]*$/,\n tableAlignRight: /^ *-+: *$/,\n tableAlignCenter: /^ *:-+: *$/,\n tableAlignLeft: /^ *:-+ *$/,\n startATag: /^<a /i,\n endATag: /^<\\/a>/i,\n startPreScriptTag: /^<(pre|code|kbd|script)(\\s|>)/i,\n endPreScriptTag: /^<\\/(pre|code|kbd|script)(\\s|>)/i,\n startAngleBracket: /^</,\n endAngleBracket: />$/,\n pedanticHrefTitle: /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,\n unicodeAlphaNumeric: /[\\p{L}\\p{N}]/u,\n escapeTest: /[&<>\"']/,\n escapeReplace: /[&<>\"']/g,\n escapeTestNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,\n escapeReplaceNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n unescapeTest: /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig,\n caret: /(^|[^\\[])\\^/g,\n percentDecode: /%25/g,\n findPipe: /\\|/g,\n splitPipe: / \\|/,\n slashPipe: /\\\\\\|/g,\n carriageReturn: /\\r\\n|\\r/g,\n spaceLine: /^ +$/gm,\n notSpaceStart: /^\\S*/,\n endingNewline: /\\n$/,\n listItemRegex: (bull: string) => new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`),\n nextBulletRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`),\n hrRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),\n fencesBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`),\n headingBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`),\n htmlBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, 'i'),\n blockquoteBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}>`),\n};\n\n/**\n * Block-Level Grammar\n */\n\nconst newline = /^(?:[ \\t]*(?:\\n|$))+/;\nconst blockCode = /^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = / {0,3}(?:[*+-]|\\d{1,9}[.)])/;\nconst lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/;\nconst lheading = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/\\|table/g, '') // table not in commonmark\n .getRegex();\nconst lheadingGfm = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/table/g, / {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/) // table can interrupt\n .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/)\n .replace('label', _blockLabel)\n .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n .getRegex();\n\nconst list = edit(/^(bull)([ \\t][^\\n]+?)?(?:\\n|$)/)\n .replace(/bull/g, bullet)\n .getRegex();\n\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit(\n '^ {0,3}(?:' // optional indentation\n+ '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n+ '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n+ '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n+ '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n+ '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n+ '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (6)\n+ '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) open tag\n+ '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) closing tag\n+ ')', 'i')\n .replace('comment', _comment)\n .replace('tag', _tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nconst paragraph = edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n .replace('paragraph', paragraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nconst blockNormal = {\n blockquote,\n code: blockCode,\n def,\n fences,\n heading,\n hr,\n html,\n lheading,\n list,\n newline,\n paragraph,\n table: noopTest,\n text: blockText,\n};\n\ntype BlockKeys = keyof typeof blockNormal;\n\n/**\n * GFM Block Grammar\n */\n\nconst gfmTable = edit(\n '^ *([^\\\\n ].*)\\\\n' // Header\n+ ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n+ '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('blockquote', ' {0,3}>')\n .replace('code', '(?: {4}| {0,3}\\t)[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // tables can be interrupted by type (6) html blocks\n .getRegex();\n\nconst blockGfm: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n lheading: lheadingGfm,\n table: gfmTable,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('table', gfmTable) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex(),\n};\n\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nconst blockPedantic: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n html: edit(\n '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', _comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', lheading)\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .replace('|tag', '')\n .getRegex(),\n};\n\n/**\n * Inline-Level Grammar\n */\n\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = /[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpace = /[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpace = /[^\\s\\p{P}\\p{S}]/u;\nconst punctuation = edit(/^((?![*_])punctSpace)/, 'u')\n .replace(/punctSpace/g, _punctuationOrSpace).getRegex();\n\n// GFM allows ~ inside strong and em for strikethrough\nconst _punctuationGfmStrongEm = /(?!~)[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmStrongEm = /(?!~)[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmStrongEm = /(?:[^\\s\\p{P}\\p{S}]|~)/u;\n\n// GFM allows * and _ inside strikethrough\nconst _punctuationGfmDel = /(?![*_])[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmDel = /(?![*_])[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmDel = /(?:[^\\s\\p{P}\\p{S}]|[*_])/u;\n\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = edit(/link|precode-code|html/, 'g')\n .replace('link', /\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/)\n .replace('precode-', supportsLookbehind ? '(?<!`)()' : '(^^|[^`])')\n .replace('code', /(?<b>`+)[^`]+\\k<b>(?!`)/)\n .replace('html', /<(?! )[^<>]*?>/)\n .getRegex();\n\nconst emStrongLDelimCore = /^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/;\n\nconst emStrongLDelim = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongLDelimGfm = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\nconst emStrongRDelimAstCore =\n '^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n+ '|[^*]+(?=[^*])' // Consume to delim\n+ '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n+ '|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)' // (3) #***a, ***a can only be Left Delimiter\n+ '|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)' // (4) ***# can only be Left Delimiter\n+ '|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)' // (5) #***# can be either Left or Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?=notPunctSpace)'; // (6) a***a can be either Left or Right Delimiter\n\nconst emStrongRDelimAst = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm)\n .replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm)\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\n// (6) Not allowed for _\nconst emStrongRDelimUnd = edit(\n '^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n+ '|[^_]+(?=[^_])' // Consume to delim\n+ '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n+ '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n+ '|(?!_)punctSpace(_+)(?=notPunctSpace)' // (3) #___a, ___a can only be Left Delimiter\n+ '|[\\\\s](_+)(?!_)(?=punct)' // (4) ___# can only be Left Delimiter\n+ '|(?!_)punct(_+)(?!_)(?=punct)', 'gu') // (5) #___# can be either Left or Right Delimiter\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Tilde left delimiter for strikethrough (similar to emStrongLDelim for asterisk)\nconst delLDelim = edit(/^~~?(?:((?!~)punct)|[^\\s~])/, 'u')\n .replace(/punct/g, _punctuationGfmDel)\n .getRegex();\n\n// Tilde delimiter patterns for strikethrough (similar to asterisk)\nconst delRDelimCore =\n '^[^~]+(?=[^~])' // Consume to delim\n+ '|(?!~)punct(~~?)(?=[\\\\s]|$)' // (1) #~~ can only be a Right Delimiter\n+ '|notPunctSpace(~~?)(?!~)(?=punctSpace|$)' // (2) a~~#, a~~ can only be a Right Delimiter\n+ '|(?!~)punctSpace(~~?)(?=notPunctSpace)' // (3) #~~a, ~~a can only be Left Delimiter\n+ '|[\\\\s](~~?)(?!~)(?=punct)' // (4) ~~# can only be Left Delimiter\n+ '|(?!~)punct(~~?)(?!~)(?=punct)' // (5) #~~# can be either Left or Right Delimiter\n+ '|notPunctSpace(~~?)(?=notPunctSpace)'; // (6) a~~a can be either Left or Right Delimiter\n\nconst delRDelim = edit(delRDelimCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmDel)\n .replace(/punctSpace/g, _punctuationOrSpaceGfmDel)\n .replace(/punct/g, _punctuationGfmDel)\n .getRegex();\n\nconst anyPunctuation = edit(/\\\\(punct)/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n .getRegex();\n\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit(\n '^comment'\n + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n .replace('comment', _inlineComment)\n .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nconst _inlineLabel = /(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+[^`]*?`+(?!`)|[^\\[\\]\\\\`])*?/;\n\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]*(?:\\n[ \\t]*)?)(title))?\\s*\\)/)\n .replace('label', _inlineLabel)\n .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/)\n .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n .getRegex();\n\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _inlineLabel)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n .replace('reflink', reflink)\n .replace('nolink', nolink)\n .getRegex();\n\nconst _caseInsensitiveProtocol = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/;\n\n/**\n * Normal Inline Grammar\n */\n\nconst inlineNormal = {\n _backpedal: noopTest, // only used for GFM url\n anyPunctuation,\n autolink,\n blockSkip,\n br,\n code: inlineCode,\n del: noopTest,\n delLDelim: noopTest,\n delRDelim: noopTest,\n emStrongLDelim,\n emStrongRDelimAst,\n emStrongRDelimUnd,\n escape,\n link,\n nolink,\n punctuation,\n reflink,\n reflinkSearch,\n tag,\n text: inlineText,\n url: noopTest,\n};\n\ntype InlineKeys = keyof typeof inlineNormal;\n\n/**\n * Pedantic Inline Grammar\n */\n\nconst inlinePedantic: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', _inlineLabel)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', _inlineLabel)\n .getRegex(),\n};\n\n/**\n * GFM Inline Grammar\n */\n\nconst inlineGfm: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n emStrongRDelimAst: emStrongRDelimAstGfm,\n emStrongLDelim: emStrongLDelimGfm,\n delLDelim,\n delRDelim,\n url: edit(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/)\n .replace('protocol', _caseInsensitiveProtocol)\n .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)\n .getRegex(),\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,\n text: edit(/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/)\n .replace('protocol', _caseInsensitiveProtocol)\n .getRegex(),\n};\n\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\nconst inlineBreaks: Record<InlineKeys, RegExp> = {\n ...inlineGfm,\n br: edit(br).replace('{2,}', '*').getRegex(),\n text: edit(inlineGfm.text)\n .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n .replace(/\\{2,\\}/g, '*')\n .getRegex(),\n};\n\n/**\n * exports\n */\n\nexport const block = {\n normal: blockNormal,\n gfm: blockGfm,\n pedantic: blockPedantic,\n};\n\nexport const inline = {\n normal: inlineNormal,\n gfm: inlineGfm,\n breaks: inlineBreaks,\n pedantic: inlinePedantic,\n};\n\nexport interface Rules {\n other: typeof other\n block: Record<BlockKeys, RegExp>\n inline: Record<InlineKeys, RegExp>\n}\n","import { other } from './rules.ts';\n\n/**\n * Helpers\n */\nconst escapeReplacements: { [index: string]: string } = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\nconst getEscapeReplacement = (ch: string) => escapeReplacements[ch];\n\nexport function escape(html: string, encode?: boolean) {\n if (encode) {\n if (other.escapeTest.test(html)) {\n return html.replace(other.escapeReplace, getEscapeReplacement);\n }\n } else {\n if (other.escapeTestNoEncode.test(html)) {\n return html.replace(other.escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n}\n\nexport function unescape(html: string) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(other.unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon') return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\n\nexport function cleanUrl(href: string) {\n try {\n href = encodeURI(href).replace(other.percentDecode, '%');\n } catch {\n return null;\n }\n return href;\n}\n\nexport function splitCells(tableRow: string, count?: number) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(other.findPipe, (match, offset, str) => {\n let escaped = false;\n let curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(other.splitPipe);\n let i = 0;\n\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) {\n cells.shift();\n }\n if (cells.length > 0 && !cells.at(-1)?.trim()) {\n cells.pop();\n }\n\n if (count) {\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\n }\n\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(other.slashPipe, '|');\n }\n return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nexport function rtrim(str: string, c: string, invert?: boolean) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.slice(0, l - suffLen);\n}\n\nexport function findClosingBracket(str: string, b: string) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n\n let level = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n if (level > 0) {\n return -2;\n }\n\n return -1;\n}\n\nexport function expandTabs(line: string, indent = 0) {\n let col = indent;\n let expanded = '';\n for (const char of line) {\n if (char === '\\t') {\n const added = 4 - (col % 4);\n expanded += ' '.repeat(added);\n col += added;\n } else {\n expanded += char;\n col++;\n }\n }\n\n return expanded;\n}\n","import { _defaults } from './defaults.ts';\nimport {\n rtrim,\n splitCells,\n findClosingBracket,\n expandTabs,\n} from './helpers.ts';\nimport type { Rules } from './rules.ts';\nimport type { _Lexer } from './Lexer.ts';\nimport type { Links, Tokens, Token } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\nfunction outputLink(cap: string[], link: Pick<Tokens.Link, 'href' | 'title'>, raw: string, lexer: _Lexer, rules: Rules): Tokens.Link | Tokens.Image {\n const href = link.href;\n const title = link.title || null;\n const text = cap[1].replace(rules.other.outputLinkReplace, '$1');\n\n lexer.state.inLink = true;\n const token: Tokens.Link | Tokens.Image = {\n type: cap[0].charAt(0) === '!' ? 'image' : 'link',\n raw,\n href,\n title,\n text,\n tokens: lexer.inlineTokens(text),\n };\n lexer.state.inLink = false;\n return token;\n}\n\nfunction indentCodeCompensation(raw: string, text: string, rules: Rules) {\n const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);\n\n if (matchIndentToCode === null) {\n return text;\n }\n\n const indentToCode = matchIndentToCode[1];\n\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(rules.other.beginningSpace);\n if (matchIndentInNode === null) {\n return node;\n }\n\n const [indentInNode] = matchIndentInNode;\n\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n\n return node;\n })\n .join('\\n');\n}\n\n/**\n * Tokenizer\n */\nexport class _Tokenizer<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n rules!: Rules; // set by the lexer\n lexer!: _Lexer<ParserOutput, RendererOutput>; // set by the lexer\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n space(src: string): Tokens.Space | undefined {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0],\n };\n }\n }\n\n code(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const text = cap[0].replace(this.rules.other.codeRemoveIndent, '');\n return {\n type: 'code',\n raw: cap[0],\n codeBlockStyle: 'indented',\n text: !this.options.pedantic\n ? rtrim(text, '\\n')\n : text,\n };\n }\n }\n\n fences(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '', this.rules);\n\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n text,\n };\n }\n }\n\n heading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n\n // remove trailing #s\n if (this.rules.other.endingHash.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n } else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[1].length,\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n hr(src: string): Tokens.Hr | undefined {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: rtrim(cap[0], '\\n'),\n };\n }\n }\n\n blockquote(src: string): Tokens.Blockquote | undefined {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n let lines = rtrim(cap[0], '\\n').split('\\n');\n let raw = '';\n let text = '';\n const tokens: Token[] = [];\n\n while (lines.length > 0) {\n let inBlockquote = false;\n const currentLines = [];\n\n let i;\n for (i = 0; i < lines.length; i++) {\n // get lines up to a continuation\n if (this.rules.other.blockquoteStart.test(lines[i])) {\n currentLines.push(lines[i]);\n inBlockquote = true;\n } else if (!inBlockquote) {\n currentLines.push(lines[i]);\n } else {\n break;\n }\n }\n lines = lines.slice(i);\n\n const currentRaw = currentLines.join('\\n');\n const currentText = currentRaw\n // precede setext continuation with 4 spaces so it isn't a setext\n .replace(this.rules.other.blockquoteSetextReplace, '\\n $1')\n .replace(this.rules.other.blockquoteSetextReplace2, '');\n raw = raw ? `${raw}\\n${currentRaw}` : currentRaw;\n text = text ? `${text}\\n${currentText}` : currentText;\n\n // parse blockquote lines as top level tokens\n // merge paragraphs if this is a continuation\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n this.lexer.blockTokens(currentText, tokens, true);\n this.lexer.state.top = top;\n\n // if there is no continuation then we are done\n if (lines.length === 0) {\n break;\n }\n\n const lastToken = tokens.at(-1);\n\n if (lastToken?.type === 'code') {\n // blockquote continuation cannot be preceded by a code block\n break;\n } else if (lastToken?.type === 'blockquote') {\n // include continuation in nested blockquote\n const oldToken = lastToken as Tokens.Blockquote;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.blockquote(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n break;\n } else if (lastToken?.type === 'list') {\n // include continuation in nested list\n const oldToken = lastToken as Tokens.List;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.list(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n lines = newText.substring(tokens.at(-1)!.raw.length).split('\\n');\n continue;\n }\n }\n\n return {\n type: 'blockquote',\n raw,\n tokens,\n text,\n };\n }\n }\n\n list(src: string): Tokens.List | undefined {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n\n const list: Tokens.List = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: [],\n };\n\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n\n // Get next list item\n const itemRegex = this.rules.other.listItemRegex(bull);\n let endsWithBlankLine = false;\n // Check if current bullet point can start a new List Item\n while (src) {\n let endEarly = false;\n let raw = '';\n let itemContents = '';\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n\n raw = cap[0];\n src = src.substring(raw.length);\n\n let line = expandTabs(cap[2].split('\\n', 1)[0], cap[1].length);\n let nextLine = src.split('\\n', 1)[0];\n let blankLine = !line.trim();\n\n let indent = 0;\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimStart();\n } else if (blankLine) {\n indent = cap[1].length + 1;\n } else {\n indent = line.search(this.rules.other.nonSpaceChar); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += cap[1].length;\n }\n\n if (blankLine && this.rules.other.blankLine.test(nextLine)) { // Items begin with at most one blank line\n raw += nextLine + '\\n';\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n\n if (!endEarly) {\n const nextBulletRegex = this.rules.other.nextBulletRegex(indent);\n const hrRegex = this.rules.other.hrRegex(indent);\n const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);\n const headingBeginRegex = this.rules.other.headingBeginRegex(indent);\n const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);\n const blockquoteBeginRegex = this.rules.other.blockquoteBeginRegex(indent);\n\n // Check if following lines should be included in List Item\n while (src) {\n const rawLine = src.split('\\n', 1)[0];\n let nextLineWithoutTabs;\n nextLine = rawLine;\n\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(this.rules.other.listReplaceNesting, ' ');\n nextLineWithoutTabs = nextLine;\n } else {\n nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, ' ');\n }\n\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of html block\n if (htmlBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of blockquote\n if (blockquoteBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n\n // Horizontal rule found\n if (hrRegex.test(nextLine)) {\n break;\n }\n\n if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLineWithoutTabs.slice(indent);\n } else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n\n // paragraph continuation unless last line was a different block level element\n if (line.replace(this.rules.other.tabCharGlobal, ' ').search(this.rules.other.nonSpaceChar) >= 4) { // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n\n itemContents += '\\n' + nextLine;\n }\n\n blankLine = !nextLine.trim();\n\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n line = nextLineWithoutTabs.slice(indent);\n }\n }\n\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n } else if (this.rules.other.doubleBlankLine.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n\n list.items.push({\n type: 'list_item',\n raw,\n task: !!this.options.gfm && this.rules.other.listIsTask.test(itemContents),\n loose: false,\n text: itemContents,\n tokens: [],\n });\n\n list.raw += raw;\n }\n\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n const lastItem = list.items.at(-1);\n if (lastItem) {\n lastItem.raw = lastItem.raw.trimEnd();\n lastItem.text = lastItem.text.trimEnd();\n } else {\n // not a list since there were no items\n return;\n }\n list.raw = list.raw.trimEnd();\n\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n for (const item of list.items) {\n this.lexer.state.top = false;\n item.tokens = this.lexer.blockTokens(item.text, []);\n if (item.task) {\n // Remove checkbox markdown from item tokens\n item.text = item.text.replace(this.rules.other.listReplaceTask, '');\n if (item.tokens[0]?.type === 'text' || item.tokens[0]?.type === 'paragraph') {\n item.tokens[0].raw = item.tokens[0].raw.replace(this.rules.other.listReplaceTask, '');\n item.tokens[0].text = item.tokens[0].text.replace(this.rules.other.listReplaceTask, '');\n for (let i = this.lexer.inlineQueue.length - 1; i >= 0; i--) {\n if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[i].src)) {\n this.lexer.inlineQueue[i].src = this.lexer.inlineQueue[i].src.replace(this.rules.other.listReplaceTask, '');\n break;\n }\n }\n }\n\n const taskRaw = this.rules.other.listTaskCheckbox.exec(item.raw);\n if (taskRaw) {\n const checkboxToken: Tokens.Checkbox = {\n type: 'checkbox',\n raw: taskRaw[0] + ' ',\n checked: taskRaw[0] !== '[ ]',\n };\n item.checked = checkboxToken.checked;\n if (list.loose) {\n if (item.tokens[0] && ['paragraph', 'text'].includes(item.tokens[0].type) && 'tokens' in item.tokens[0] && item.tokens[0].tokens) {\n item.tokens[0].raw = checkboxToken.raw + item.tokens[0].raw;\n item.tokens[0].text = checkboxToken.raw + item.tokens[0].text;\n item.tokens[0].tokens.unshift(checkboxToken);\n } else {\n item.tokens.unshift({\n type: 'paragraph',\n raw: checkboxToken.raw,\n text: checkboxToken.raw,\n tokens: [checkboxToken],\n });\n }\n } else {\n item.tokens.unshift(checkboxToken);\n }\n }\n }\n\n if (!list.loose) {\n // Check if list should be loose\n const spacers = item.tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => this.rules.other.anyLine.test(t.raw));\n\n list.loose = hasMultipleLineBreaks;\n }\n }\n\n // Set all items to loose if list is loose\n if (list.loose) {\n for (const item of list.items) {\n item.loose = true;\n for (const token of item.tokens) {\n if (token.type === 'text') {\n token.type = 'paragraph';\n }\n }\n }\n }\n\n return list;\n }\n }\n\n html(src: string): Tokens.HTML | undefined {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const token: Tokens.HTML = {\n type: 'html',\n block: true,\n raw: cap[0],\n pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n text: cap[0],\n };\n return token;\n }\n }\n\n def(src: string): Tokens.Def | undefined {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n const tag = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, ' ');\n const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n return {\n type: 'def',\n tag,\n raw: cap[0],\n href,\n title,\n };\n }\n }\n\n table(src: string): Tokens.Table | undefined {\n const cap = this.rules.block.table.exec(src);\n if (!cap) {\n return;\n }\n\n if (!this.rules.other.tableDelimiter.test(cap[2])) {\n // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n return;\n }\n\n const headers = splitCells(cap[1]);\n const aligns = cap[2].replace(this.rules.other.tableAlignChars, '').split('|');\n const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, '').split('\\n') : [];\n\n const item: Tokens.Table = {\n type: 'table',\n raw: cap[0],\n header: [],\n align: [],\n rows: [],\n };\n\n if (headers.length !== aligns.length) {\n // header and align columns must be equal, rows can be different.\n return;\n }\n\n for (const align of aligns) {\n if (this.rules.other.tableAlignRight.test(align)) {\n item.align.push('right');\n } else if (this.rules.other.tableAlignCenter.test(align)) {\n item.align.push('center');\n } else if (this.rules.other.tableAlignLeft.test(align)) {\n item.align.push('left');\n } else {\n item.align.push(null);\n }\n }\n\n for (let i = 0; i < headers.length; i++) {\n item.header.push({\n text: headers[i],\n tokens: this.lexer.inline(headers[i]),\n header: true,\n align: item.align[i],\n });\n }\n\n for (const row of rows) {\n item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n return {\n text: cell,\n tokens: this.lexer.inline(cell),\n header: false,\n align: item.align[i],\n };\n }));\n }\n\n return item;\n }\n\n lheading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1],\n tokens: this.lexer.inline(cap[1]),\n };\n }\n }\n\n paragraph(src: string): Tokens.Paragraph | undefined {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n text(src: string): Tokens.Text | undefined {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0]),\n };\n }\n }\n\n escape(src: string): Tokens.Escape | undefined {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: cap[1],\n };\n }\n }\n\n tag(src: string): Tokens.Tag | undefined {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {\n this.lexer.state.inLink = true;\n } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n\n return {\n type: 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n block: false,\n text: cap[0],\n };\n }\n }\n\n link(src: string): Tokens.Link | Tokens.Image | undefined {\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n return;\n }\n\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n } else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex === -2) {\n // more open parens than closed\n return;\n }\n\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = this.rules.other.pedanticHrefTitle.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n\n href = href.trim();\n if (this.rules.other.startAngleBracket.test(href)) {\n if (this.options.pedantic && !(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n } else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title,\n }, cap[0], this.lexer, this.rules);\n }\n }\n\n reflink(src: string, links: Links): Tokens.Link | Tokens.Image | Tokens.Text | undefined {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, ' ');\n const link = links[linkString.toLowerCase()];\n if (!link) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text,\n };\n }\n return outputLink(cap, link, cap[0], this.lexer, this.rules);\n }\n }\n\n emStrong(src: string, maskedSrc: string, prevChar = ''): Tokens.Em | Tokens.Strong | undefined {\n let match = this.rules.inline.emStrongLDelim.exec(src);\n if (!match) return;\n\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;\n\n const nextChar = match[1] || match[2] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue; // skip single * in __abc*abc__\n\n rLength = [...rDelim].length;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n } else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n // char length can be >1 for unicode characters;\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = raw.slice(1, -1);\n return {\n type: 'em',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n codespan(src: string): Tokens.Codespan | undefined {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(this.rules.other.newLineCharGlobal, ' ');\n const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);\n const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n return {\n type: 'codespan',\n raw: cap[0],\n text,\n };\n }\n }\n\n br(src: string): Tokens.Br | undefined {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0],\n };\n }\n }\n\n del(src: string, maskedSrc: string, prevChar = ''): Tokens.Del | undefined {\n let match = this.rules.inline.delLDelim.exec(src);\n if (!match) return;\n\n const nextChar = match[1] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength;\n\n const endReg = this.rules.inline.delRDelim;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue;\n\n rLength = [...rDelim].length;\n\n if (rLength !== lLength) continue;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters\n rLength = Math.min(rLength, rLength + delimTotal);\n // char length can be >1 for unicode characters\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create del token - only single ~ or double ~~ supported\n const text = raw.slice(lLength, -lLength);\n return {\n type: 'del',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n autolink(src: string): Tokens.Link | undefined {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[1];\n href = 'mailto:' + text;\n } else {\n text = cap[1];\n href = text;\n }\n\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n url(src: string): Tokens.Link | undefined {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[0];\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n } while (prevCapZero !== cap[0]);\n text = cap[0];\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n } else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n inlineText(src: string): Tokens.Text | undefined {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n const escaped = this.lexer.state.inRawBlock;\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n escaped,\n };\n }\n }\n}\n","import { _Tokenizer } from './Tokenizer.ts';\nimport { _defaults } from './defaults.ts';\nimport { other, block, inline } from './rules.ts';\nimport type { Token, TokensList, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Block Lexer\n */\nexport class _Lexer<ParserOutput = string, RendererOutput = string> {\n tokens: TokensList;\n options: MarkedOptions<ParserOutput, RendererOutput>;\n state: {\n inLink: boolean;\n inRawBlock: boolean;\n top: boolean;\n };\n\n public inlineQueue: { src: string, tokens: Token[] }[];\n\n private tokenizer: _Tokenizer<ParserOutput, RendererOutput>;\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n // TokenList cannot be created in one go\n this.tokens = [] as unknown as TokensList;\n this.tokens.links = Object.create(null);\n this.options = options || _defaults;\n this.options.tokenizer = this.options.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n top: true,\n };\n\n const rules = {\n other,\n block: block.normal,\n inline: inline.normal,\n };\n\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n } else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n } else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline,\n };\n }\n\n /**\n * Static Lex Method\n */\n static lex<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n return lexer.lex(src);\n }\n\n /**\n * Static Lex Inline Method\n */\n static lexInline<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n return lexer.inlineTokens(src);\n }\n\n /**\n * Preprocessing\n */\n lex(src: string) {\n src = src.replace(other.carriageReturn, '\\n');\n\n this.blockTokens(src, this.tokens);\n\n for (let i = 0; i < this.inlineQueue.length; i++) {\n const next = this.inlineQueue[i];\n this.inlineTokens(next.src, next.tokens);\n }\n this.inlineQueue = [];\n\n return this.tokens;\n }\n\n /**\n * Lexing\n */\n blockTokens(src: string, tokens?: Token[], lastParagraphClipped?: boolean): Token[];\n blockTokens(src: string, tokens?: TokensList, lastParagraphClipped?: boolean): TokensList;\n blockTokens(src: string, tokens: Token[] = [], lastParagraphClipped = false) {\n if (this.options.pedantic) {\n src = src.replace(other.tabCharGlobal, ' ').replace(other.spaceLine, '');\n }\n\n while (src) {\n let token: Tokens.Generic | undefined;\n\n if (this.options.extensions?.block?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.raw.length === 1 && lastToken !== undefined) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unnecessary paragraph tags\n lastToken.raw += '\\n';\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n // An indented code block cannot interrupt a paragraph.\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title,\n };\n tokens.push(token);\n }\n continue;\n }\n\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n const lastToken = tokens.at(-1);\n if (lastParagraphClipped && lastToken?.type === 'paragraph') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n lastParagraphClipped = cutSrc.length !== src.length;\n src = src.substring(token.raw.length);\n continue;\n }\n\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n this.state.top = true;\n return tokens;\n }\n\n inline(src: string, tokens: Token[] = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n\n /**\n * Lexing/Compiling\n */\n inlineTokens(src: string, tokens: Token[] = []): Token[] {\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n let match: RegExpExecArray | null = null;\n\n // Mask out reflinks\n if (this.tokens.links) {\n const links = Object.keys(this.tokens.links);\n if (links.length > 0) {\n while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n maskedSrc = maskedSrc.slice(0, match.index)\n + '[' + 'a'.repeat(match[0].length - 2) + ']'\n + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n }\n\n // Mask out escaped characters\n while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n }\n\n // Mask out other blocks\n let offset;\n while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n offset = match[2] ? match[2].length : 0;\n maskedSrc = maskedSrc.slice(0, match.index + offset) + '[' + 'a'.repeat(match[0].length - offset - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n }\n\n // Mask out blocks from extensions\n maskedSrc = this.options.hooks?.emStrongMask?.call({ lexer: this }, maskedSrc) ?? maskedSrc;\n\n let keepPrevChar = false;\n let prevChar = '';\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n\n let token: Tokens.Generic | undefined;\n\n // extensions\n if (this.options.extensions?.inline?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.type === 'text' && lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // del (gfm)\n if (token = this.tokenizer.del(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // autolink\n if (token = this.tokenizer.autolink(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n return tokens;\n }\n}\n","import { _defaults } from './defaults.ts';\nimport {\n cleanUrl,\n escape,\n} from './helpers.ts';\nimport { other } from './rules.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Tokens } from './Tokens.ts';\nimport type { _Parser } from './Parser.ts';\n\n/**\n * Renderer\n */\nexport class _Renderer<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n parser!: _Parser<ParserOutput, RendererOutput>; // set by the parser\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n space(token: Tokens.Space): RendererOutput {\n return '' as RendererOutput;\n }\n\n code({ text, lang, escaped }: Tokens.Code): RendererOutput {\n const langString = (lang || '').match(other.notSpaceStart)?.[0];\n\n const code = text.replace(other.endingNewline, '') + '\\n';\n\n if (!langString) {\n return '<pre><code>'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n' as RendererOutput;\n }\n\n return '<pre><code class=\"language-'\n + escape(langString)\n + '\">'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n' as RendererOutput;\n }\n\n blockquote({ tokens }: Tokens.Blockquote): RendererOutput {\n const body = this.parser.parse(tokens);\n return `<blockquote>\\n${body}</blockquote>\\n` as RendererOutput;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n def(token: Tokens.Def): RendererOutput {\n return '' as RendererOutput;\n }\n\n heading({ tokens, depth }: Tokens.Heading): RendererOutput {\n return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\\n` as RendererOutput;\n }\n\n hr(token: Tokens.Hr): RendererOutput {\n return '<hr>\\n' as RendererOutput;\n }\n\n list(token: Tokens.List): RendererOutput {\n const ordered = token.ordered;\n const start = token.start;\n\n let body = '';\n for (let j = 0; j < token.items.length; j++) {\n const item = token.items[j];\n body += this.listitem(item);\n }\n\n const type = ordered ? 'ol' : 'ul';\n const startAttr = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startAttr + '>\\n' + body + '</' + type + '>\\n' as RendererOutput;\n }\n\n listitem(item: Tokens.ListItem): RendererOutput {\n return `<li>${this.parser.parse(item.tokens)}</li>\\n` as RendererOutput;\n }\n\n checkbox({ checked }: Tokens.Checkbox): RendererOutput {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\"> ' as RendererOutput;\n }\n\n paragraph({ tokens }: Tokens.Paragraph): RendererOutput {\n return `<p>${this.parser.parseInline(tokens)}</p>\\n` as RendererOutput;\n }\n\n table(token: Tokens.Table): RendererOutput {\n let header = '';\n\n // header\n let cell = '';\n for (let j = 0; j < token.header.length; j++) {\n cell += this.tablecell(token.header[j]);\n }\n header += this.tablerow({ text: cell as ParserOutput });\n\n let body = '';\n for (let j = 0; j < token.rows.length; j++) {\n const row = token.rows[j];\n\n cell = '';\n for (let k = 0; k < row.length; k++) {\n cell += this.tablecell(row[k]);\n }\n\n body += this.tablerow({ text: cell as ParserOutput });\n }\n if (body) body = `<tbody>${body}</tbody>`;\n\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n' as RendererOutput;\n }\n\n tablerow({ text }: Tokens.TableRow<ParserOutput>): RendererOutput {\n return `<tr>\\n${text}</tr>\\n` as RendererOutput;\n }\n\n tablecell(token: Tokens.TableCell): RendererOutput {\n const content = this.parser.parseInline(token.tokens);\n const type = token.header ? 'th' : 'td';\n const tag = token.align\n ? `<${type} align=\"${token.align}\">`\n : `<${type}>`;\n return tag + content + `</${type}>\\n` as RendererOutput;\n }\n\n /**\n * span level renderer\n */\n strong({ tokens }: Tokens.Strong): RendererOutput {\n return `<strong>${this.parser.parseInline(tokens)}</strong>` as RendererOutput;\n }\n\n em({ tokens }: Tokens.Em): RendererOutput {\n return `<em>${this.parser.parseInline(tokens)}</em>` as RendererOutput;\n }\n\n codespan({ text }: Tokens.Codespan): RendererOutput {\n return `<code>${escape(text, true)}</code>` as RendererOutput;\n }\n\n br(token: Tokens.Br): RendererOutput {\n return '<br>' as RendererOutput;\n }\n\n del({ tokens }: Tokens.Del): RendererOutput {\n return `<del>${this.parser.parseInline(tokens)}</del>` as RendererOutput;\n }\n\n link({ href, title, tokens }: Tokens.Link): RendererOutput {\n const text = this.parser.parseInline(tokens) as string;\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text as RendererOutput;\n }\n href = cleanHref;\n let out = '<a href=\"' + href + '\"';\n if (title) {\n out += ' title=\"' + (escape(title)) + '\"';\n }\n out += '>' + text + '</a>';\n return out as RendererOutput;\n }\n\n image({ href, title, text, tokens }: Tokens.Image): RendererOutput {\n if (tokens) {\n text = this.parser.parseInline(tokens, this.parser.textRenderer) as string;\n }\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return escape(text) as RendererOutput;\n }\n href = cleanHref;\n\n let out = `<img src=\"${href}\" alt=\"${escape(text)}\"`;\n if (title) {\n out += ` title=\"${escape(title)}\"`;\n }\n out += '>';\n return out as RendererOutput;\n }\n\n text(token: Tokens.Text | Tokens.Escape): RendererOutput {\n return 'tokens' in token && token.tokens\n ? this.parser.parseInline(token.tokens) as unknown as RendererOutput\n : ('escaped' in token && token.escaped ? token.text as RendererOutput : escape(token.text) as RendererOutput);\n }\n}\n","import type { Tokens } from './Tokens.ts';\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nexport class _TextRenderer<RendererOutput = string> {\n // no need for block level renderers\n strong({ text }: Tokens.Strong): RendererOutput {\n return text as RendererOutput;\n }\n\n em({ text }: Tokens.Em): RendererOutput {\n return text as RendererOutput;\n }\n\n codespan({ text }: Tokens.Codespan): RendererOutput {\n return text as RendererOutput;\n }\n\n del({ text }: Tokens.Del): RendererOutput {\n return text as RendererOutput;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n text({ text }: Tokens.Text | Tokens.Escape | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n link({ text }: Tokens.Link): RendererOutput {\n return '' + text as RendererOutput;\n }\n\n image({ text }: Tokens.Image): RendererOutput {\n return '' + text as RendererOutput;\n }\n\n br(): RendererOutput {\n return '' as RendererOutput;\n }\n\n checkbox({ raw }: Tokens.Checkbox): RendererOutput {\n return raw as RendererOutput;\n }\n}\n","import { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _defaults } from './defaults.ts';\nimport type { MarkedToken, Token, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Parsing & Compiling\n */\nexport class _Parser<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n renderer: _Renderer<ParserOutput, RendererOutput>;\n textRenderer: _TextRenderer<RendererOutput>;\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n this.options.renderer = this.options.renderer || new _Renderer<ParserOutput, RendererOutput>();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.renderer.parser = this;\n this.textRenderer = new _TextRenderer<RendererOutput>();\n }\n\n /**\n * Static Parse Method\n */\n static parse<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const parser = new _Parser<ParserOutput, RendererOutput>(options);\n return parser.parse(tokens);\n }\n\n /**\n * Static Parse Inline Method\n */\n static parseInline<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const parser = new _Parser<ParserOutput, RendererOutput>(options);\n return parser.parseInline(tokens);\n }\n\n /**\n * Parse Loop\n */\n parse(tokens: Token[]): ParserOutput {\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const genericToken = anyToken as Tokens.Generic;\n const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'def', 'paragraph', 'text'].includes(genericToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'space': {\n out += this.renderer.space(token);\n break;\n }\n case 'hr': {\n out += this.renderer.hr(token);\n break;\n }\n case 'heading': {\n out += this.renderer.heading(token);\n break;\n }\n case 'code': {\n out += this.renderer.code(token);\n break;\n }\n case 'table': {\n out += this.renderer.table(token);\n break;\n }\n case 'blockquote': {\n out += this.renderer.blockquote(token);\n break;\n }\n case 'list': {\n out += this.renderer.list(token);\n break;\n }\n case 'checkbox': {\n out += this.renderer.checkbox(token);\n break;\n }\n case 'html': {\n out += this.renderer.html(token);\n break;\n }\n case 'def': {\n out += this.renderer.def(token);\n break;\n }\n case 'paragraph': {\n out += this.renderer.paragraph(token);\n break;\n }\n case 'text': {\n out += this.renderer.text(token);\n break;\n }\n\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '' as ParserOutput;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n\n return out as ParserOutput;\n }\n\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens: Token[], renderer: _Renderer<ParserOutput, RendererOutput> | _TextRenderer<RendererOutput> = this.renderer): ParserOutput {\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'escape': {\n out += renderer.text(token);\n break;\n }\n case 'html': {\n out += renderer.html(token);\n break;\n }\n case 'link': {\n out += renderer.link(token);\n break;\n }\n case 'image': {\n out += renderer.image(token);\n break;\n }\n case 'checkbox': {\n out += renderer.checkbox(token);\n break;\n }\n case 'strong': {\n out += renderer.strong(token);\n break;\n }\n case 'em': {\n out += renderer.em(token);\n break;\n }\n case 'codespan': {\n out += renderer.codespan(token);\n break;\n }\n case 'br': {\n out += renderer.br(token);\n break;\n }\n case 'del': {\n out += renderer.del(token);\n break;\n }\n case 'text': {\n out += renderer.text(token);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '' as ParserOutput;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out as ParserOutput;\n }\n}\n","import { _defaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\n\nexport class _Hooks<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n block?: boolean;\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n 'emStrongMask',\n ]);\n\n static passThroughHooksRespectAsync = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n ]);\n\n /**\n * Process markdown before marked\n */\n preprocess(markdown: string) {\n return markdown;\n }\n\n /**\n * Process HTML after marked is finished\n */\n postprocess(html: ParserOutput) {\n return html;\n }\n\n /**\n * Process all tokens before walk tokens\n */\n processAllTokens(tokens: Token[] | TokensList) {\n return tokens;\n }\n\n /**\n * Mask contents that should not be interpreted as em/strong delimiters\n */\n emStrongMask(src: string) {\n return src;\n }\n\n /**\n * Provide function to tokenize markdown\n */\n provideLexer() {\n return this.block ? _Lexer.lex : _Lexer.lexInline;\n }\n\n /**\n * Provide function to parse tokens\n */\n provideParser() {\n return this.block ? _Parser.parse<ParserOutput, RendererOutput> : _Parser.parseInline<ParserOutput, RendererOutput>;\n }\n}\n","import { _getDefaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { escape } from './helpers.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, Tokens, TokensList } from './Tokens.ts';\n\nexport type MaybePromise = void | Promise<void>;\n\ntype UnknownFunction = (...args: unknown[]) => unknown;\ntype GenericRendererFunction = (...args: unknown[]) => string | false;\n\nexport class Marked<ParserOutput = string, RendererOutput = string> {\n defaults = _getDefaults<ParserOutput, RendererOutput>();\n options = this.setOptions;\n\n parse = this.parseMarkdown(true);\n parseInline = this.parseMarkdown(false);\n\n Parser = _Parser<ParserOutput, RendererOutput>;\n Renderer = _Renderer<ParserOutput, RendererOutput>;\n TextRenderer = _TextRenderer<RendererOutput>;\n Lexer = _Lexer;\n Tokenizer = _Tokenizer<ParserOutput, RendererOutput>;\n Hooks = _Hooks<ParserOutput, RendererOutput>;\n\n constructor(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n this.use(...args);\n }\n\n /**\n * Run callback for every token\n */\n walkTokens(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n let values: MaybePromise[] = [];\n for (const token of tokens) {\n values = values.concat(callback.call(this, token));\n switch (token.type) {\n case 'table': {\n const tableToken = token as Tokens.Table;\n for (const cell of tableToken.header) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n for (const row of tableToken.rows) {\n for (const cell of row) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n }\n break;\n }\n case 'list': {\n const listToken = token as Tokens.List;\n values = values.concat(this.walkTokens(listToken.items, callback));\n break;\n }\n default: {\n const genericToken = token as Tokens.Generic;\n if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n const tokens = genericToken[childTokens].flat(Infinity) as Token[] | TokensList;\n values = values.concat(this.walkTokens(tokens, callback));\n });\n } else if (genericToken.tokens) {\n values = values.concat(this.walkTokens(genericToken.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n\n use(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n const extensions: MarkedOptions<ParserOutput, RendererOutput>['extensions'] = this.defaults.extensions || { renderers: {}, childTokens: {} };\n\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack } as MarkedOptions<ParserOutput, RendererOutput>;\n\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if ('renderer' in ext) { // Renderer extensions\n const prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function(...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n } else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if ('tokenizer' in ext) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n const extLevel = extensions[ext.level];\n if (extLevel) {\n extLevel.unshift(ext.tokenizer);\n } else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n } else {\n extensions.startBlock = [ext.start];\n }\n } else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n } else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = this.defaults.renderer || new _Renderer<ParserOutput, RendererOutput>(this.defaults);\n for (const prop in pack.renderer) {\n if (!(prop in renderer)) {\n throw new Error(`renderer '${prop}' does not exist`);\n }\n if (['options', 'parser'].includes(prop)) {\n // ignore options property\n continue;\n }\n const rendererProp = prop as Exclude<keyof _Renderer<ParserOutput, RendererOutput>, 'options' | 'parser'>;\n const rendererFunc = pack.renderer[rendererProp] as GenericRendererFunction;\n const prevRenderer = renderer[rendererProp] as GenericRendererFunction;\n // Replace renderer with func to run extension, but fall back if false\n renderer[rendererProp] = (...args: unknown[]) => {\n let ret = rendererFunc.apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return (ret || '') as RendererOutput;\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = this.defaults.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>(this.defaults);\n for (const prop in pack.tokenizer) {\n if (!(prop in tokenizer)) {\n throw new Error(`tokenizer '${prop}' does not exist`);\n }\n if (['options', 'rules', 'lexer'].includes(prop)) {\n // ignore options, rules, and lexer properties\n continue;\n }\n const tokenizerProp = prop as Exclude<keyof _Tokenizer<ParserOutput, RendererOutput>, 'options' | 'rules' | 'lexer'>;\n const tokenizerFunc = pack.tokenizer[tokenizerProp] as UnknownFunction;\n const prevTokenizer = tokenizer[tokenizerProp] as UnknownFunction;\n // Replace tokenizer with func to run extension, but fall back if false\n // @ts-expect-error cannot type tokenizer function dynamically\n tokenizer[tokenizerProp] = (...args: unknown[]) => {\n let ret = tokenizerFunc.apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n const hooks = this.defaults.hooks || new _Hooks<ParserOutput, RendererOutput>();\n for (const prop in pack.hooks) {\n if (!(prop in hooks)) {\n throw new Error(`hook '${prop}' does not exist`);\n }\n if (['options', 'block'].includes(prop)) {\n // ignore options and block properties\n continue;\n }\n const hooksProp = prop as Exclude<keyof _Hooks<ParserOutput, RendererOutput>, 'options' | 'block'>;\n const hooksFunc = pack.hooks[hooksProp] as UnknownFunction;\n const prevHook = hooks[hooksProp] as UnknownFunction;\n if (_Hooks.passThroughHooks.has(prop)) {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (arg: unknown) => {\n if (this.defaults.async && _Hooks.passThroughHooksRespectAsync.has(prop)) {\n return (async() => {\n const ret = await hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n })();\n }\n\n const ret = hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n } else {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (...args: unknown[]) => {\n if (this.defaults.async) {\n return (async() => {\n let ret = await hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = await prevHook.apply(hooks, args);\n }\n return ret;\n })();\n }\n\n let ret = hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n }\n opts.hooks = hooks;\n }\n\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = this.defaults.walkTokens;\n const packWalktokens = pack.walkTokens;\n opts.walkTokens = function(token) {\n let values: MaybePromise[] = [];\n values.push(packWalktokens.call(this, token));\n if (walkTokens) {\n values = values.concat(walkTokens.call(this, token));\n }\n return values;\n };\n }\n\n this.defaults = { ...this.defaults, ...opts };\n });\n\n return this;\n }\n\n setOptions(opt: MarkedOptions<ParserOutput, RendererOutput>) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n\n lexer(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n return _Lexer.lex(src, options ?? this.defaults);\n }\n\n parser(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n return _Parser.parse<ParserOutput, RendererOutput>(tokens, options ?? this.defaults);\n }\n\n private parseMarkdown(blockType: boolean) {\n type overloadedParse = {\n (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: true }): Promise<ParserOutput>;\n (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: false }): ParserOutput;\n (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): ParserOutput | Promise<ParserOutput>;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parse: overloadedParse = (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): any => {\n const origOpt = { ...options };\n const opt = { ...this.defaults, ...origOpt };\n\n const throwError = this.onError(!!opt.silent, !!opt.async);\n\n // throw error if an extension set async to true but parse was called with async: false\n if (this.defaults.async === true && origOpt.async === false) {\n return throwError(new Error('marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.'));\n }\n\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected'));\n }\n\n if (opt.hooks) {\n opt.hooks.options = opt;\n opt.hooks.block = blockType;\n }\n\n if (opt.async) {\n return (async() => {\n const processedSrc = opt.hooks ? await opt.hooks.preprocess(src) : src;\n const lexer = opt.hooks ? await opt.hooks.provideLexer() : (blockType ? _Lexer.lex : _Lexer.lexInline);\n const tokens = await lexer(processedSrc, opt);\n const processedTokens = opt.hooks ? await opt.hooks.processAllTokens(tokens) : tokens;\n if (opt.walkTokens) {\n await Promise.all(this.walkTokens(processedTokens, opt.walkTokens));\n }\n const parser = opt.hooks ? await opt.hooks.provideParser() : (blockType ? _Parser.parse : _Parser.parseInline);\n const html = await parser(processedTokens, opt);\n return opt.hooks ? await opt.hooks.postprocess(html) : html;\n })().catch(throwError);\n }\n\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src) as string;\n }\n const lexer = opt.hooks ? opt.hooks.provideLexer() : (blockType ? _Lexer.lex : _Lexer.lexInline);\n let tokens = lexer(src, opt);\n if (opt.hooks) {\n tokens = opt.hooks.processAllTokens(tokens);\n }\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n const parser = opt.hooks ? opt.hooks.provideParser() : (blockType ? _Parser.parse : _Parser.parseInline);\n let html = parser(tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html);\n }\n return html;\n } catch(e) {\n return throwError(e as Error);\n }\n };\n\n return parse;\n }\n\n private onError(silent: boolean, async: boolean) {\n return (e: Error): string | Promise<string> => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n if (silent) {\n const msg = '<p>An error occurred:</p><pre>'\n + escape(e.message + '', true)\n + '</pre>';\n if (async) {\n return Promise.resolve(msg);\n }\n return msg;\n }\n\n if (async) {\n return Promise.reject(e);\n }\n throw e;\n };\n }\n}\n","import { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { Marked } from './Instance.ts';\nimport {\n _getDefaults,\n changeDefaults,\n _defaults,\n} from './defaults.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\nimport type { MaybePromise } from './Instance.ts';\n\nconst markedInstance = new Marked();\n\n/**\n * Compiles markdown to HTML asynchronously.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options, having async: true\n * @return Promise of string of compiled HTML\n */\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\n\n/**\n * Compiles markdown to HTML.\n *\n * @param src String of markdown source to be compiled\n * @param options Optional hash of options\n * @return String of compiled HTML. Will be a Promise of string if async is set to true by any extensions.\n */\nexport function marked(src: string, options: MarkedOptions & { async: false }): string;\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\nexport function marked(src: string, options?: MarkedOptions | null): string | Promise<string>;\nexport function marked(src: string, opt?: MarkedOptions | null): string | Promise<string> {\n return markedInstance.parse(src, opt);\n}\n\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n marked.setOptions = function(options: MarkedOptions) {\n markedInstance.setOptions(options);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n };\n\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\n\nmarked.defaults = _defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function(...args: MarkedExtension[]) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n return markedInstance.walkTokens(tokens, callback);\n};\n\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\n\nexport const options = marked.options;\nexport const setOptions = marked.setOptions;\nexport const use = marked.use;\nexport const walkTokens = marked.walkTokens;\nexport const parseInline = marked.parseInline;\nexport const parse = marked;\nexport const parser = _Parser.parse;\nexport const lexer = _Lexer.lex;\nexport { _defaults as defaults, _getDefaults as getDefaults } from './defaults.ts';\nexport { _Lexer as Lexer } from './Lexer.ts';\nexport { _Parser as Parser } from './Parser.ts';\nexport { _Tokenizer as Tokenizer } from './Tokenizer.ts';\nexport { _Renderer as Renderer } from './Renderer.ts';\nexport { _TextRenderer as TextRenderer } from './TextRenderer.ts';\nexport { _Hooks as Hooks } from './Hooks.ts';\nexport { Marked } from './Instance.ts';\nexport type * from './MarkedOptions.ts';\nexport type * from './Tokens.ts';\n","import type { FormSchema, Field, Step, SlotContent } from '../types'\n\n/**\n * Parser del schema JSON\n */\nexport class SchemaParser {\n /**\n * Parsea y valida un schema\n */\n parse(schema: FormSchema): ParsedSchema {\n if (!schema) {\n throw new Error('Schema es requerido')\n }\n\n // Validar que tenga fields o steps\n if (!schema.fields && !schema.steps) {\n throw new Error('Schema debe tener fields o steps')\n }\n\n // Si tiene steps, validar que todos los steps tengan fields\n if (schema.steps) {\n for (const step of schema.steps) {\n if (!step.fields || step.fields.length === 0) {\n throw new Error('Cada step debe tener al menos un field')\n }\n }\n }\n\n // Normalizar campos\n const normalizedFields = schema.fields\n ? this.normalizeFields(schema.fields)\n : []\n\n const normalizedSteps = schema.steps\n ? schema.steps.map((step) => ({\n ...step,\n fields: this.normalizeFields(step.fields),\n }))\n : undefined\n\n return {\n fields: normalizedFields,\n steps: normalizedSteps,\n isWizard: Boolean(schema.steps && schema.steps.length > 0),\n }\n }\n\n /**\n * Normaliza y valida campos\n */\n private normalizeFields(fields: Field[]): Field[] {\n return fields.map((field, index) => {\n // Validar que tenga type y name\n if (!field.type) {\n throw new Error(`Field en índice ${index} debe tener un type`)\n }\n if (!field.name) {\n throw new Error(`Field en índice ${index} debe tener un name`)\n }\n\n // Validar tipos específicos\n this.validateFieldType(field, index)\n\n // Aplicar valores por defecto\n return this.applyDefaults(field)\n })\n }\n\n /**\n * Valida el tipo de campo\n */\n private validateFieldType(field: Field, index: number): void {\n const validTypes = [\n 'text',\n 'email',\n 'number',\n 'password',\n 'textarea',\n 'select',\n 'checkbox',\n 'radio',\n 'switch',\n 'date',\n 'file',\n 'file-drop',\n 'map',\n 'rating',\n 'slider',\n 'colorpicker',\n 'array',\n 'group',\n 'row',\n 'custom',\n 'quantity',\n 'accordion-select',\n 'image-grid-select',\n 'otp',\n 'markdown',\n ]\n\n if (!validTypes.includes(field.type)) {\n throw new Error(\n `Field en índice ${index} tiene un type inválido: ${field.type}`\n )\n }\n\n // Validaciones específicas por tipo\n switch (field.type) {\n case 'select':\n case 'radio':\n case 'accordion-select':\n case 'image-grid-select':\n if (!('options' in field) || !field.options || field.options.length === 0) {\n throw new Error(\n `Field \"${field.name}\" de tipo ${field.type} debe tener options`\n )\n }\n break\n case 'array':\n if (!('itemSchema' in field) || !field.itemSchema) {\n throw new Error(\n `Field \"${field.name}\" de tipo array debe tener itemSchema`\n )\n }\n if ('minItems' in field) {\n const min = (field as any).minItems\n if (min < 0) {\n throw new Error(\n `Field \"${field.name}\" de tipo array: minItems debe ser >= 0`\n )\n }\n if ('maxItems' in field) {\n const max = (field as any).maxItems\n if (min > max) {\n throw new Error(\n `Field \"${field.name}\" de tipo array: minItems (${min}) no puede ser mayor que maxItems (${max})`\n )\n }\n }\n }\n break\n case 'group':\n if (!('fields' in field) || !field.fields || field.fields.length === 0) {\n throw new Error(\n `Field \"${field.name}\" de tipo group debe tener fields`\n )\n }\n break\n case 'row':\n if (!('fields' in field) || !field.fields || field.fields.length === 0) {\n throw new Error(\n `Field \"${field.name}\" de tipo row debe tener fields`\n )\n }\n break\n case 'colorpicker':\n if ('defaultValue' in field && field.defaultValue != null) {\n const hex = /^#[0-9A-Fa-f]{6}$/\n if (!hex.test(String(field.defaultValue))) {\n throw new Error(\n `Field \"${field.name}\" de tipo colorpicker debe tener defaultValue en formato hex (#RRGGBB)`\n )\n }\n }\n break\n }\n\n // Validar leadingIcon y trailingIcon si existen\n if ('leadingIcon' in field && field.leadingIcon) {\n this.validateSlotContent(field.leadingIcon, field.name, 'leadingIcon')\n }\n if ('trailingIcon' in field && field.trailingIcon) {\n this.validateSlotContent(field.trailingIcon, field.name, 'trailingIcon')\n }\n }\n\n /**\n * Valida que SlotContent tenga las propiedades requeridas según type\n */\n private validateSlotContent(\n slot: SlotContent,\n fieldName: string,\n slotName: string\n ): void {\n if (!slot.type || !['image', 'html'].includes(slot.type)) {\n throw new Error(\n `Field \"${fieldName}\" ${slotName} debe tener type 'image' o 'html'`\n )\n }\n if (slot.type === 'image') {\n if (!slot.src || typeof slot.src !== 'string') {\n throw new Error(\n `Field \"${fieldName}\" ${slotName} con type 'image' debe tener src`\n )\n }\n }\n if (slot.type === 'html') {\n if (!slot.html || typeof slot.html !== 'string') {\n throw new Error(\n `Field \"${fieldName}\" ${slotName} con type 'html' debe tener html`\n )\n }\n }\n }\n\n /**\n * Aplica valores por defecto a un campo\n */\n private applyDefaults(field: Field): Field {\n const defaults: any = {\n disabled: false,\n hidden: false,\n }\n\n // Aplicar defaults específicos por tipo\n switch (field.type) {\n case 'checkbox':\n case 'switch':\n if (!('checked' in field)) {\n defaults.checked = false\n }\n break\n case 'select':\n case 'accordion-select':\n case 'image-grid-select':\n if (!('multiple' in field)) {\n defaults.multiple = false\n }\n if (field.type === 'image-grid-select') {\n if (!('columns' in field)) {\n defaults.columns = 3\n }\n if (!('imageSize' in field)) {\n defaults.imageSize = 'medium'\n }\n }\n break\n case 'file':\n if (!('multiple' in field)) {\n defaults.multiple = false\n }\n break\n case 'quantity':\n if (!('min' in field)) {\n defaults.min = 0\n }\n if (!('step' in field)) {\n defaults.step = 1\n }\n break\n case 'otp':\n if (!('length' in field)) {\n defaults.length = 6\n }\n if (!('numeric' in field)) {\n defaults.numeric = true\n }\n break\n case 'slider':\n if (!('min' in field)) {\n defaults.min = 0\n }\n if (!('max' in field)) {\n defaults.max = 100\n }\n if (!('step' in field)) {\n defaults.step = 1\n }\n break\n case 'rating':\n if (!('max' in field)) {\n defaults.max = 5\n }\n break\n case 'colorpicker':\n if (!('defaultValue' in field) || field.defaultValue == null) {\n defaults.defaultValue = '#000000'\n }\n break\n }\n\n return { ...defaults, ...field } as Field\n }\n\n /**\n * Obtiene todos los campos de un schema (incluyendo nested)\n */\n getAllFields(schema: FormSchema): Field[] {\n const parsed = this.parse(schema)\n const allFields: Field[] = []\n\n const extractFields = (fields: Field[]) => {\n for (const field of fields) {\n allFields.push(field)\n if (field.type === 'group' && 'fields' in field) {\n extractFields(field.fields)\n }\n if (field.type === 'row' && 'fields' in field) {\n extractFields(field.fields)\n }\n if (field.type === 'array' && 'itemSchema' in field && field.itemSchema.fields) {\n extractFields(field.itemSchema.fields)\n }\n }\n }\n\n if (parsed.fields) {\n extractFields(parsed.fields)\n }\n\n if (parsed.steps) {\n for (const step of parsed.steps) {\n extractFields(step.fields)\n }\n }\n\n return allFields\n }\n}\n\n/**\n * Schema parseado\n */\nexport interface ParsedSchema {\n fields: Field[]\n steps?: Step[]\n isWizard: boolean\n}\n","import type { FormTheme, FormColors } from '../../types'\n\nexport function hexToRgb(hex: string): string {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n if (!result) {\n const short = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i.exec(hex)\n if (!short) return '0, 123, 255'\n return [\n parseInt(short[1] + short[1], 16),\n parseInt(short[2] + short[2], 16),\n parseInt(short[3] + short[3], 16),\n ].join(', ')\n }\n return [\n parseInt(result[1], 16),\n parseInt(result[2], 16),\n parseInt(result[3], 16),\n ].join(', ')\n}\n\nconst defaultColors: Required<FormColors> = {\n primary: '#007bff',\n secondary: '#6c757d',\n error: '#dc3545',\n success: '#28a745',\n text: '#212529',\n labelColor: '#212529',\n border: '#ddd',\n background: '#ffffff',\n groupBackground: 'var(--easy-form-group-background)',\n groupTitle: '#212529',\n groupBorder: '#ddd',\n}\n\nexport function getColors(colors?: FormColors): Required<FormColors> {\n return { ...defaultColors, ...colors }\n}\n\nexport function getBaseStyles(colors: Required<FormColors>): string {\n return `\n :host {\n display: block;\n --easy-form-primary: ${colors.primary};\n --easy-form-primary-rgb: ${hexToRgb(colors.primary)};\n --easy-form-secondary: ${colors.secondary};\n --easy-form-error: ${colors.error};\n --easy-form-success: ${colors.success};\n --easy-form-text: ${colors.text};\n --easy-form-label-color: ${colors.labelColor};\n --easy-form-border: ${colors.border};\n --easy-form-background: ${colors.background};\n --easy-form-group-background: ${colors.groupBackground};\n --easy-form-group-title: ${colors.groupTitle};\n --easy-form-group-border: ${colors.groupBorder};\n --easy-form-on-primary: #ffffff;\n --easy-form-hover-overlay: rgba(0, 0, 0, 0.03);\n }\n .easy-form-field {\n margin-bottom: 1rem;\n }\n .easy-form-label {\n display: block;\n margin-bottom: 0.5rem;\n font-weight: 500;\n color: var(--easy-form-label-color);\n }\n .easy-form-label-down .easy-form-label {\n margin-bottom: 0;\n margin-top: 0.5rem;\n }\n .easy-form-field-inner-horizontal {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.75rem;\n }\n .easy-form-field-inner-horizontal .easy-form-label {\n display: inline-block;\n margin-bottom: 0;\n margin-top: 0;\n flex-shrink: 0;\n white-space: nowrap;\n }\n .easy-form-field-inner-horizontal > *:not(.easy-form-label) {\n flex: 1;\n min-width: 0;\n }\n .easy-form-direction-vertical {\n display: block;\n }\n .easy-form-direction-horizontal {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 1rem;\n }\n .easy-form-direction-horizontal > * {\n flex: 1 1 auto;\n }\n .easy-form-completed-indicator {\n margin-bottom: 1rem;\n }\n .easy-form-completed-track {\n height: 6px;\n background: var(--easy-form-border);\n border-radius: 3px;\n overflow: hidden;\n }\n .easy-form-completed-fill {\n height: 100%;\n background: var(--easy-form-primary);\n border-radius: 3px;\n transition: width 0.2s ease;\n }\n .easy-form-slider-wrapper {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n .easy-form-slider-value {\n min-width: 2rem;\n font-weight: 500;\n }\n .easy-form-input-wrapper {\n display: flex;\n align-items: center;\n flex-wrap: nowrap;\n width: 100%;\n border: 1px solid var(--easy-form-border);\n border-radius: 4px;\n background: var(--easy-form-background);\n padding: 0 0.75rem;\n box-sizing: border-box;\n }\n .easy-form-input-wrapper:focus-within {\n border-color: var(--easy-form-primary);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.1);\n }\n .easy-form-input-wrapper .easy-form-input-core {\n flex: 1;\n min-width: 0;\n }\n .easy-form-input-wrapper .easy-form-input-core input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"color\"]),\n .easy-form-input-wrapper .easy-form-input-core textarea,\n .easy-form-input-wrapper .easy-form-input-core select {\n width: 100%;\n border: none !important;\n background: transparent !important;\n box-shadow: none !important;\n padding: 0.5rem 0 !important;\n }\n .easy-form-input-wrapper .easy-form-input-core input:focus,\n .easy-form-input-wrapper .easy-form-input-core textarea:focus,\n .easy-form-input-wrapper .easy-form-input-core select:focus {\n outline: none;\n }\n .easy-form-input-slot {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 0;\n min-width: 1.5rem;\n }\n .easy-form-input-slot-content {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .easy-form-input-slot-content img {\n width: 20px;\n height: 20px;\n min-width: 20px;\n min-height: 20px;\n object-fit: contain;\n display: block;\n }\n .easy-form-input-slot-leading {\n padding-right: 0.5rem;\n }\n .easy-form-input-slot-trailing {\n padding-left: 0.5rem;\n }\n .easy-form-color-wrapper {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n .easy-form-color-wrapper input[type=\"color\"] {\n width: 2.2rem;\n height: 2.2rem;\n min-width: 2.2rem;\n min-height: 2.2rem;\n padding: 0 !important;\n margin: 0;\n cursor: pointer;\n border: 1px solid var(--easy-form-border);\n border-radius: 2px;\n background: transparent;\n flex-shrink: 0;\n }\n .easy-form-color-wrapper input[type=\"color\"]::-webkit-color-swatch-wrapper {\n padding: 0;\n }\n .easy-form-color-wrapper input[type=\"color\"]::-webkit-color-swatch {\n border: none;\n border-radius: 1px;\n }\n .easy-form-color-wrapper input[type=\"color\"]::-moz-color-swatch {\n border: none;\n border-radius: 1px;\n }\n .easy-form-color-text {\n flex: 1;\n min-width: 0;\n color: var(--easy-form-text);\n background: var(--easy-form-background);\n border: 1px solid var(--easy-form-border);\n border-radius: 4px;\n padding: 0.5rem 0.75rem;\n font-family: ui-monospace, 'Cascadia Code', 'Fira Code', 'Courier New', monospace;\n font-size: 0.875rem;\n }\n .easy-form-rating {\n display: inline-flex;\n gap: 0.25rem;\n }\n .easy-form-rating-stars {\n display: flex;\n gap: 0.25rem;\n }\n .easy-form-rating-star {\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n color: var(--easy-form-border);\n }\n .easy-form-rating-star svg {\n display: block;\n }\n .easy-form-rating-star-filled {\n color: var(--easy-form-primary);\n }\n .easy-form-rating-star:hover,\n .easy-form-rating-star:focus {\n color: var(--easy-form-primary);\n }\n .easy-form-file-drop {\n border: 2px dashed var(--easy-form-border);\n border-radius: 8px;\n padding: 2rem;\n text-align: center;\n cursor: pointer;\n transition: border-color 0.2s, background 0.2s;\n }\n .easy-form-file-drop:hover,\n .easy-form-file-drop-over {\n border-color: var(--easy-form-primary);\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n }\n .easy-form-file-drop-list {\n margin-top: 0.75rem;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n .easy-form-file-drop-item {\n font-size: 0.875rem;\n color: var(--easy-form-text);\n padding: 0.25rem 0;\n border-bottom: 1px solid var(--easy-form-border);\n }\n .easy-form-map-inputs {\n display: flex;\n gap: 1rem;\n margin-bottom: 0.5rem;\n }\n .easy-form-map-inputs input {\n flex: 1;\n }\n .easy-form-map-placeholder,\n .easy-form-map-container {\n min-height: 300px;\n height: 300px;\n border-radius: 4px;\n position: relative;\n overflow: hidden;\n width: 100%;\n display: block;\n box-sizing: border-box;\n }\n .easy-form-map-container {\n background: var(--easy-form-group-background);\n }\n .easy-form-map-container .leaflet-container {\n height: 100% !important;\n width: 100% !important;\n position: relative !important;\n }\n .easy-form-map-container .leaflet-tile-container {\n position: absolute;\n left: 0;\n top: 0;\n }\n .easy-form-markdown {\n width: 100%;\n }\n .easy-form-markdown-toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n padding: 0.5rem;\n background: var(--easy-form-group-background);\n border: 1px solid var(--easy-form-border);\n border-bottom: none;\n border-radius: 4px 4px 0 0;\n }\n .easy-form-markdown-toolbar-btn {\n padding: 0.25rem 0.5rem;\n background: transparent;\n border: 1px solid var(--easy-form-border);\n border-radius: 3px;\n cursor: pointer;\n font-size: 0.875rem;\n color: var(--easy-form-text);\n transition: background 0.15s, border-color 0.15s;\n }\n .easy-form-markdown-toolbar-btn:hover {\n background: var(--easy-form-group-background);\n border-color: var(--easy-form-primary);\n }\n .easy-form-markdown-editor-wrapper {\n display: flex;\n gap: 0;\n border: 1px solid var(--easy-form-border);\n border-radius: 0 0 4px 4px;\n overflow: hidden;\n }\n .easy-form-markdown-textarea {\n flex: 1;\n min-width: 50%;\n padding: 0.75rem;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', monospace;\n font-size: 0.875rem;\n line-height: 1.5;\n border: none;\n resize: vertical;\n outline: none;\n background: var(--easy-form-background);\n color: var(--easy-form-text);\n box-sizing: border-box;\n }\n .easy-form-markdown-textarea:focus {\n background: var(--easy-form-background);\n }\n .easy-form-markdown-preview {\n flex: 1;\n min-width: 50%;\n padding: 0.75rem;\n overflow-y: auto;\n background: var(--easy-form-group-background);\n border-left: 1px solid var(--easy-form-border);\n font-size: 0.875rem;\n line-height: 1.6;\n color: var(--easy-form-text);\n box-sizing: border-box;\n }\n .easy-form-markdown-preview h1,\n .easy-form-markdown-preview h2,\n .easy-form-markdown-preview h3,\n .easy-form-markdown-preview h4,\n .easy-form-markdown-preview h5,\n .easy-form-markdown-preview h6 {\n margin-top: 1rem;\n margin-bottom: 0.5rem;\n font-weight: 600;\n line-height: 1.3;\n }\n .easy-form-markdown-preview h1 { font-size: 1.5rem; }\n .easy-form-markdown-preview h2 { font-size: 1.25rem; }\n .easy-form-markdown-preview h3 { font-size: 1.125rem; }\n .easy-form-markdown-preview p {\n margin: 0.5rem 0;\n }\n .easy-form-markdown-preview code {\n background: rgba(0,0,0,0.06);\n padding: 0.125rem 0.25rem;\n border-radius: 3px;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', monospace;\n font-size: 0.8125rem;\n }\n .easy-form-markdown-preview pre {\n background: rgba(0,0,0,0.04);\n padding: 0.75rem;\n border-radius: 4px;\n overflow-x: auto;\n }\n .easy-form-markdown-preview pre code {\n background: none;\n padding: 0;\n }\n .easy-form-markdown-preview ul,\n .easy-form-markdown-preview ol {\n padding-left: 1.5rem;\n margin: 0.5rem 0;\n }\n .easy-form-markdown-preview blockquote {\n border-left: 3px solid var(--easy-form-primary);\n margin: 0.5rem 0;\n padding-left: 0.75rem;\n color: var(--easy-form-secondary);\n }\n .easy-form-markdown-preview a {\n color: var(--easy-form-primary);\n }\n .easy-form-markdown-preview img {\n max-width: 100%;\n height: auto;\n }\n .easy-form-markdown-preview-placeholder {\n color: var(--easy-form-secondary);\n font-style: italic;\n }\n .easy-form-markdown-error {\n color: var(--easy-form-error);\n font-size: 0.8125rem;\n line-height: 1.5;\n }\n .easy-form-markdown-preview-loading {\n color: var(--easy-form-secondary);\n font-size: 0.875rem;\n }\n .easy-form-markdown-tabs {\n border: 1px solid var(--easy-form-border);\n border-radius: 4px;\n overflow: hidden;\n }\n .easy-form-markdown-tabs-header {\n display: flex;\n background: var(--easy-form-group-background);\n border-bottom: 1px solid var(--easy-form-border);\n }\n .easy-form-markdown-tabs .easy-form-markdown-tab {\n flex: 1;\n padding: 0.5rem 1rem;\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 0.875rem;\n color: var(--easy-form-secondary);\n transition: all 0.15s;\n }\n .easy-form-markdown-tabs .easy-form-markdown-tab:hover {\n background: var(--easy-form-group-background);\n color: var(--easy-form-text);\n }\n .easy-form-markdown-tabs .easy-form-markdown-tab.active {\n background: var(--easy-form-background);\n color: var(--easy-form-primary);\n border-bottom: 2px solid var(--easy-form-primary);\n }\n .easy-form-markdown-tabs-content {\n display: flex;\n flex-direction: column;\n }\n .easy-form-markdown-tabs-content .easy-form-markdown-toolbar {\n border-bottom: 1px solid var(--easy-form-border);\n border-radius: 0;\n }\n .easy-form-markdown-tabs-content .easy-form-markdown-textarea {\n border-radius: 0;\n }\n .easy-form-markdown-tabs-content .easy-form-markdown-preview {\n border-radius: 0;\n border-top: 1px solid var(--easy-form-border);\n }\n .easy-form-markdown-preview-mode {\n position: relative;\n border: 1px solid var(--easy-form-border);\n border-radius: 4px;\n overflow: hidden;\n }\n .easy-form-markdown-preview-mode .easy-form-markdown-textarea-invisible {\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n }\n .easy-form-markdown-preview-mode-content {\n padding: 0.75rem;\n overflow-y: auto;\n background: var(--easy-form-background);\n color: var(--easy-form-text);\n font-size: 0.875rem;\n line-height: 1.6;\n height: 100%;\n box-sizing: border-box;\n }\n .easy-form-markdown-preview-mode-content h1,\n .easy-form-markdown-preview-mode-content h2,\n .easy-form-markdown-preview-mode-content h3,\n .easy-form-markdown-preview-mode-content h4,\n .easy-form-markdown-preview-mode-content h5,\n .easy-form-markdown-preview-mode-content h6 {\n margin-top: 1rem;\n margin-bottom: 0.5rem;\n font-weight: 600;\n line-height: 1.3;\n }\n .easy-form-markdown-preview-mode-content h1 { font-size: 1.5rem; }\n .easy-form-markdown-preview-mode-content h2 { font-size: 1.25rem; }\n .easy-form-markdown-preview-mode-content h3 { font-size: 1.125rem; }\n .easy-form-markdown-preview-mode-content p { margin: 0.5rem 0; }\n .easy-form-markdown-preview-mode-content code {\n background: rgba(0,0,0,0.06);\n padding: 0.125rem 0.25rem;\n border-radius: 3px;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', monospace;\n font-size: 0.8125rem;\n }\n .easy-form-markdown-preview-mode-content pre {\n background: rgba(0,0,0,0.04);\n padding: 0.75rem;\n border-radius: 4px;\n overflow-x: auto;\n }\n .easy-form-markdown-preview-mode-content pre code {\n background: none;\n padding: 0;\n }\n .easy-form-markdown-preview-mode-content ul,\n .easy-form-markdown-preview-mode-content ol {\n padding-left: 1.5rem;\n margin: 0.5rem 0;\n }\n .easy-form-markdown-preview-mode-content blockquote {\n border-left: 3px solid var(--easy-form-primary);\n margin: 0.5rem 0;\n padding-left: 0.75rem;\n color: var(--easy-form-secondary);\n }\n .easy-form-markdown-preview-mode-content a {\n color: var(--easy-form-primary);\n }\n .easy-form-markdown-preview-mode-content img {\n max-width: 100%;\n height: auto;\n }\n .easy-form-required {\n color: var(--easy-form-error);\n }\n .easy-form-input-error {\n border-color: var(--easy-form-error) !important;\n }\n .easy-form-error {\n color: var(--easy-form-error);\n font-size: 0.875rem;\n margin-top: 0.25rem;\n }\n .easy-form-description {\n font-size: 0.875rem;\n color: var(--easy-form-secondary);\n margin-top: 0.25rem;\n }\n .easy-form-submit {\n padding: 0.5rem 1rem;\n background: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n border: none;\n cursor: pointer;\n font-size: 1rem;\n transition: all 0.2s ease;\n }\n .easy-form-submit:hover {\n opacity: 0.9;\n }\n .easy-form-submit:active {\n transform: scale(0.98);\n }\n .easy-form-submit-wrapper {\n margin-top: 1rem;\n margin-bottom: 0.5rem;\n }\n .easy-form-submit-wrapper .easy-form-submit {\n min-width: 100px;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"color\"]), textarea, select {\n width: 100%;\n padding: 0.5rem;\n font-size: 1rem;\n color: var(--easy-form-text);\n transition: all 0.2s ease;\n box-sizing: border-box;\n }\n input[type=\"checkbox\"],\n input[type=\"radio\"] {\n width: 18px !important;\n height: 18px !important;\n min-width: 18px !important;\n min-height: 18px !important;\n max-width: 18px !important;\n margin: 0;\n padding: 0;\n cursor: pointer;\n accent-color: var(--easy-form-primary);\n flex-shrink: 0;\n }\n input:focus, textarea:focus, select:focus {\n outline: none;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"color\"])::placeholder,\n textarea::placeholder {\n color: color-mix(in srgb, var(--easy-form-text) 55%, transparent);\n opacity: 1;\n }\n .easy-form-group {\n padding: 1rem;\n margin-bottom: 1rem;\n background: var(--easy-form-group-background);\n border: 1px solid var(--easy-form-group-border);\n border-radius: 4px;\n }\n .easy-form-group-label {\n color: var(--easy-form-group-title);\n font-weight: 600;\n font-size: 1rem;\n margin-bottom: 0.75rem;\n margin-top: 0;\n }\n .easy-form-group-collapsible {\n border: 1px solid var(--easy-form-group-border);\n border-radius: 4px;\n overflow: hidden;\n }\n .easy-form-group-collapsible .easy-form-group-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n cursor: pointer;\n background: var(--easy-form-group-background);\n color: var(--easy-form-group-title);\n font-weight: 600;\n font-size: 1rem;\n user-select: none;\n transition: background-color 0.2s ease;\n width: 100%;\n border: none;\n }\n .easy-form-group-collapsible .easy-form-group-header:hover {\n background: var(--easy-form-hover-overlay);\n }\n .easy-form-group-collapsible .easy-form-group-header:focus {\n outline: none;\n box-shadow: inset 0 0 0 2px var(--easy-form-primary);\n }\n .easy-form-group-collapsible .easy-form-group-chevron {\n flex-shrink: 0;\n margin-left: 0.5rem;\n transition: transform 0.2s ease;\n color: var(--easy-form-secondary);\n }\n .easy-form-group-collapsible.easy-form-group-collapsed .easy-form-group-chevron {\n transform: rotate(-90deg);\n }\n .easy-form-group-collapsible .easy-form-group-content {\n overflow: hidden;\n transition: max-height 0.3s ease;\n padding: 0 1rem 1rem 1rem;\n }\n .easy-form-group-collapsible.easy-form-group-collapsed .easy-form-group-content {\n max-height: 0 !important;\n padding-top: 0;\n padding-bottom: 0;\n }\n .easy-form-row {\n display: flex;\n flex-wrap: wrap;\n gap: 1rem;\n margin-bottom: 1rem;\n align-items: stretch;\n }\n .easy-form-row > div {\n flex: 1;\n min-width: 0;\n }\n @media (max-width: 768px) {\n .easy-form-row {\n flex-direction: column;\n }\n .easy-form-row > div {\n flex: none;\n width: 100%;\n }\n }\n .easy-form-radio-group {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-top: 0.5rem;\n }\n .easy-form-radio-option {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n }\n .easy-form-radio-option:hover {\n background-color: var(--easy-form-hover-overlay);\n }\n .easy-form-radio-option input[type=\"radio\"] {\n margin: 0;\n flex-shrink: 0;\n }\n .easy-form-radio-label {\n cursor: pointer;\n user-select: none;\n color: var(--easy-form-label-color);\n font-weight: 400;\n }\n .easy-form-label-checkbox,\n .easy-form-label-switch {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n cursor: pointer;\n user-select: none;\n padding: 0.5rem;\n border-radius: 6px;\n transition: background-color 0.2s ease;\n color: var(--easy-form-label-color);\n }\n .easy-form-label-checkbox input[type=\"checkbox\"],\n .easy-form-label-switch input[type=\"checkbox\"] {\n margin: 0;\n flex-shrink: 0;\n }\n .easy-form-label-checkbox:hover,\n .easy-form-label-switch:hover {\n background-color: var(--easy-form-hover-overlay);\n }\n .easy-form-wizard-steps {\n display: flex;\n gap: 1rem;\n margin-bottom: 2rem;\n }\n .easy-form-wizard-step {\n padding: 0.5rem 1rem;\n transition: all 0.2s ease;\n }\n\n /* CSS Custom Properties para stepper styles */\n .easy-form-wizard-steps {\n --ef-stepper-tabs-active-color: var(--easy-form-primary);\n --ef-stepper-tabs-hover-color: var(--easy-form-primary);\n --ef-stepper-tabs-text-color: var(--easy-form-text);\n --ef-stepper-buttons-bg: var(--easy-form-background);\n --ef-stepper-buttons-border: var(--easy-form-border);\n --ef-stepper-buttons-active-bg: var(--easy-form-primary);\n --ef-stepper-buttons-active-color: var(--easy-form-on-primary);\n --ef-stepper-buttons-completed-bg: var(--easy-form-success);\n --ef-stepper-timeline-line-color: var(--easy-form-border);\n --ef-stepper-timeline-node-size: 32px;\n --ef-stepper-timeline-active-color: var(--easy-form-primary);\n --ef-stepper-timeline-completed-color: var(--easy-form-success);\n }\n\n /* Tabs Style */\n .easy-form-wizard-steps.ef-stepper-tabs {\n gap: 0;\n border-bottom: 1px solid var(--easy-form-border);\n }\n .easy-form-wizard-steps.ef-stepper-tabs .easy-form-wizard-step {\n padding: 0.75rem 1.5rem;\n border: none;\n border-bottom: 3px solid transparent;\n background: transparent;\n color: var(--ef-stepper-tabs-text-color);\n cursor: pointer;\n transition: all 0.2s ease;\n }\n .easy-form-wizard-steps.ef-stepper-tabs .easy-form-wizard-step:hover {\n color: var(--ef-stepper-tabs-hover-color);\n background: rgba(0, 0, 0, 0.02);\n }\n .easy-form-wizard-steps.ef-stepper-tabs .easy-form-wizard-step.active {\n background: transparent;\n color: var(--ef-stepper-tabs-active-color);\n border-bottom-color: var(--ef-stepper-tabs-active-color);\n font-weight: 600;\n }\n .easy-form-wizard-steps.ef-stepper-tabs .easy-form-wizard-step.completed {\n background: transparent;\n color: var(--ef-stepper-tabs-text-color);\n border-bottom-color: var(--easy-form-success);\n }\n .easy-form-wizard-steps.ef-stepper-tabs .easy-form-wizard-step.completed::after {\n content: \"✓\";\n margin-left: 0.5rem;\n color: var(--easy-form-success);\n }\n\n /* Buttons Style */\n .easy-form-wizard-steps.ef-stepper-buttons {\n gap: 0.5rem;\n }\n .easy-form-wizard-steps.ef-stepper-buttons .easy-form-wizard-step {\n padding: 0.625rem 1.25rem;\n border: 2px solid var(--ef-stepper-buttons-border);\n border-radius: 6px;\n background: var(--ef-stepper-buttons-bg);\n color: var(--easy-form-text);\n cursor: pointer;\n transition: all 0.2s ease;\n font-weight: 500;\n }\n .easy-form-wizard-steps.ef-stepper-buttons .easy-form-wizard-step:hover:not(.active) {\n border-color: var(--ef-stepper-tabs-hover-color);\n color: var(--ef-stepper-tabs-hover-color);\n }\n .easy-form-wizard-steps.ef-stepper-buttons .easy-form-wizard-step.active {\n background: var(--ef-stepper-buttons-active-bg);\n color: var(--ef-stepper-buttons-active-color);\n border-color: var(--ef-stepper-buttons-active-bg);\n }\n .easy-form-wizard-steps.ef-stepper-buttons .easy-form-wizard-step.completed {\n background: var(--ef-stepper-buttons-completed-bg);\n color: var(--easy-form-on-primary);\n border-color: var(--ef-stepper-buttons-completed-bg);\n }\n\n /* Timeline Style - Horizontal */\n .easy-form-wizard-steps.ef-stepper-timeline {\n display: flex;\n position: relative;\n padding: 16px 0;\n }\n .easy-form-wizard-steps.ef-stepper-timeline::before {\n content: \"\";\n position: absolute;\n top: 37px;\n left: 15%;\n right: 15%;\n height: 2px;\n background: var(--easy-form-text);\n opacity: 0.2;\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n background: transparent !important;\n color: var(--easy-form-text) !important;\n border: none !important;\n position: relative;\n z-index: 1;\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step::before {\n content: \"\";\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--easy-form-background);\n border: 2px solid var(--easy-form-text);\n margin-bottom: 8px;\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step.completed::before {\n background: var(--easy-form-success);\n border-color: var(--easy-form-success);\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step.active::before {\n background: var(--easy-form-primary);\n border-color: var(--easy-form-primary);\n width: 28px;\n height: 28px;\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step.active {\n color: var(--easy-form-primary) !important;\n font-weight: 600;\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step.completed {\n color: var(--easy-form-success) !important;\n }\n .easy-form-wizard-steps.ef-stepper-timeline .easy-form-wizard-step .step-number {\n display: none;\n }\n\n /* Default Stepper Style (when no stepStyle is applied) */\n .easy-form-wizard-steps:not(.ef-stepper-tabs):not(.ef-stepper-buttons):not(.ef-stepper-timeline):not(.ef-stepper-none) .easy-form-wizard-step.active {\n background: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n }\n .easy-form-wizard-steps:not(.ef-stepper-tabs):not(.ef-stepper-buttons):not(.ef-stepper-timeline):not(.ef-stepper-none) .easy-form-wizard-step.completed {\n background: var(--easy-form-success);\n color: var(--easy-form-on-primary);\n }\n\n /* None Style */\n .easy-form-wizard-steps.ef-stepper-none {\n display: none;\n }\n\n .easy-form-wizard-nav {\n display: flex;\n gap: 1rem;\n margin-top: 2rem;\n justify-content: flex-end;\n align-items: center;\n }\n .easy-form-wizard-prev,\n .easy-form-wizard-next {\n padding: 0.75rem 1.5rem;\n background: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n border: none;\n border-radius: 4px;\n font-size: 1rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n font-family: inherit;\n min-width: 120px;\n }\n .easy-form-wizard-prev:hover:not(:disabled),\n .easy-form-wizard-next:hover:not(:disabled) {\n opacity: 0.9;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n .easy-form-wizard-prev:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .easy-form-wizard-prev {\n background: var(--easy-form-secondary);\n order: 1;\n }\n .easy-form-wizard-next {\n background: var(--easy-form-primary);\n order: 2;\n }\n .easy-form-array-item {\n padding: 1rem;\n margin-bottom: 1rem;\n }\n .easy-form-array-add,\n .easy-form-array-remove {\n padding: 0.25rem 0.5rem;\n background: var(--easy-form-secondary);\n color: var(--easy-form-on-primary);\n border: none;\n cursor: pointer;\n font-size: 0.875rem;\n transition: all 0.2s ease;\n }\n .easy-form-array-remove {\n background: var(--easy-form-error);\n }\n .easy-form-array-add:hover,\n .easy-form-array-remove:hover {\n opacity: 0.9;\n }\n .easy-form-quantity-container {\n display: flex;\n flex-direction: column;\n }\n .easy-form-quantity-wrapper {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n .easy-form-quantity-btn {\n width: 2.5rem;\n height: 2.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n border: none;\n border-radius: 4px;\n font-size: 1.25rem;\n font-weight: bold;\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n }\n .easy-form-quantity-btn:hover:not(.disabled) {\n opacity: 0.9;\n transform: scale(1.05);\n }\n .easy-form-quantity-btn.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .easy-form-quantity-input {\n flex: 1;\n text-align: center;\n max-width: 100px;\n }\n .easy-form-accordion-select-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n .easy-form-accordion-item {\n border: 1px solid var(--easy-form-border);\n border-radius: 4px;\n overflow: hidden;\n transition: all 0.2s ease;\n }\n .easy-form-accordion-item.selected {\n border-color: var(--easy-form-primary);\n box-shadow: 0 0 0 2px rgba(var(--easy-form-primary-rgb), 0.1);\n }\n .easy-form-accordion-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n cursor: pointer;\n background: var(--easy-form-background);\n transition: background 0.2s ease;\n }\n .easy-form-accordion-header:hover {\n background: color-mix(in srgb, var(--easy-form-border) 95%, transparent);\n }\n .easy-form-accordion-header-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n flex: 1;\n }\n .easy-form-accordion-indicator {\n width: 20px;\n height: 20px;\n border: 2px solid var(--easy-form-border);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n }\n .easy-form-accordion-indicator.radio {\n border-radius: 50%;\n }\n .easy-form-accordion-indicator.checkbox {\n border-radius: 4px;\n }\n .easy-form-accordion-indicator.checked {\n background: var(--easy-form-primary);\n border-color: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n }\n .easy-form-accordion-indicator.checked.radio::after {\n content: '';\n width: 8px;\n height: 8px;\n background: var(--easy-form-on-primary);\n border-radius: 50%;\n }\n .easy-form-accordion-indicator.checked.checkbox::after {\n content: '✓';\n font-size: 12px;\n color: var(--easy-form-on-primary);\n }\n .easy-form-accordion-label {\n font-weight: 500;\n color: var(--easy-form-text);\n }\n .easy-form-accordion-arrow {\n transition: transform 0.2s ease;\n color: var(--easy-form-secondary);\n }\n .easy-form-accordion-content {\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.3s ease;\n padding: 0 1rem;\n }\n .easy-form-accordion-item.open .easy-form-accordion-content {\n padding: 1rem;\n }\n .easy-form-accordion-description {\n color: var(--easy-form-secondary);\n font-size: 0.875rem;\n margin: 0;\n }\n .easy-form-image-grid-container {\n display: grid;\n gap: 1rem;\n }\n .easy-form-image-grid-item {\n position: relative;\n border: 2px solid var(--easy-form-border);\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--easy-form-background);\n }\n .easy-form-image-grid-item:hover {\n border-color: var(--easy-form-primary);\n transform: translateY(-2px);\n box-shadow: 0 4px 8px color-mix(in srgb, var(--easy-form-border) 30%, transparent);\n }\n .easy-form-image-grid-item.selected {\n border-color: var(--easy-form-primary);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.2);\n }\n .easy-form-image-grid-image-container {\n position: relative;\n width: 100%;\n aspect-ratio: 1;\n overflow: hidden;\n background: var(--easy-form-group-background);\n }\n .easy-form-image-grid-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n .easy-form-image-grid-placeholder {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--easy-form-secondary);\n color: var(--easy-form-on-primary);\n font-size: 2rem;\n font-weight: bold;\n }\n .easy-form-image-grid-indicator {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n width: 24px;\n height: 24px;\n border: 2px solid var(--easy-form-on-primary);\n background: var(--easy-form-primary);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--easy-form-on-primary);\n font-size: 12px;\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n .easy-form-image-grid-item.selected .easy-form-image-grid-indicator {\n opacity: 1;\n }\n .easy-form-image-grid-indicator.checkbox {\n border-radius: 4px;\n }\n .easy-form-image-grid-label {\n padding: 0.75rem;\n text-align: center;\n font-weight: 500;\n color: var(--easy-form-text);\n }\n .easy-form-image-grid-description {\n padding: 0 0.75rem 0.75rem;\n font-size: 0.875rem;\n color: var(--easy-form-secondary);\n text-align: center;\n }\n .easy-form-image-grid-small {\n grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));\n }\n .easy-form-image-grid-medium {\n grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));\n }\n .easy-form-image-grid-large {\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n }\n .easy-form-otp-container {\n display: flex;\n gap: 0.5rem;\n justify-content: center;\n align-items: center;\n }\n .easy-form-otp-input {\n width: 3rem;\n height: 3rem;\n text-align: center;\n font-size: 1.5rem;\n font-weight: bold;\n border: 2px solid var(--easy-form-border);\n border-radius: 4px;\n transition: all 0.2s ease;\n }\n .easy-form-otp-input:focus {\n border-color: var(--easy-form-primary);\n outline: none;\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.1);\n }\n .easy-form-otp-input:invalid {\n border-color: var(--easy-form-error);\n }\n .easy-form-password-inner {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n .easy-form-password-inner .easy-form-password-input {\n flex: 1;\n min-width: 0;\n }\n .easy-form-password-toggle {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.35rem;\n background: transparent;\n border: 1px solid var(--easy-form-border);\n border-radius: 4px;\n cursor: pointer;\n color: var(--easy-form-text);\n }\n .easy-form-password-toggle:hover {\n border-color: var(--easy-form-primary);\n color: var(--easy-form-primary);\n }\n .easy-form-password-toggle:focus {\n outline: none;\n box-shadow: 0 0 0 2px var(--easy-form-primary);\n }\n .easy-form-password-separated {\n display: flex;\n flex-wrap: nowrap;\n gap: 0.5rem;\n align-items: center;\n }\n .easy-form-password-separated-input {\n width: 2.5rem;\n height: 2.5rem;\n text-align: center;\n font-size: 1.25rem;\n border: 2px solid var(--easy-form-border);\n border-radius: 4px;\n transition: border-color 0.2s ease;\n }\n .easy-form-password-separated-input:focus {\n border-color: var(--easy-form-primary);\n outline: none;\n }\n .easy-form-password-separated-toggle {\n flex-shrink: 0;\n }\n .easy-form-password-separated-toggle .easy-form-password-toggle {\n padding: 0.35rem;\n }\n .easy-form-loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n backdrop-filter: blur(2px);\n border-radius: inherit;\n }\n .easy-form-loading-spinner {\n width: 40px;\n height: 40px;\n border: 4px solid rgba(0, 0, 0, 0.1);\n border-top-color: var(--easy-form-primary);\n border-radius: 50%;\n animation: easy-form-spin 0.8s linear infinite;\n }\n @keyframes easy-form-spin {\n to {\n transform: rotate(360deg);\n }\n }\n .easy-form-lock-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.9);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1001;\n backdrop-filter: blur(4px);\n border-radius: inherit;\n text-align: center;\n padding: 1.5rem;\n }\n .easy-form-lock-message {\n font-size: 1rem;\n color: var(--easy-form-text);\n max-width: 280px;\n }\n .easy-form-disabled,\n .easy-form-disabled *,\n .easy-form-slot-disabled,\n .easy-form-slot-disabled * {\n pointer-events: none;\n opacity: 0.6;\n }\n .easy-form-disabled input,\n .easy-form-disabled textarea,\n .easy-form-disabled select,\n .easy-form-disabled button,\n .easy-form-slot-disabled input,\n .easy-form-slot-disabled textarea,\n .easy-form-slot-disabled select,\n .easy-form-slot-disabled button {\n cursor: not-allowed;\n }\n .easy-form-input-disabled {\n opacity: 0.6;\n cursor: not-allowed !important;\n }\n .easy-form-timer {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n background: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n border-radius: 4px;\n font-size: 1.25rem;\n font-weight: 600;\n font-family: ui-monospace, 'Cascadia Code', 'Fira Code', 'Courier New', monospace;\n }\n .easy-form-timer-warning {\n background: #f59e0b;\n color: #fff;\n }\n .easy-form-timer-danger {\n background: var(--easy-form-error);\n color: #fff;\n animation: easy-form-timer-pulse 1s ease-in-out infinite;\n }\n .easy-form-timer-expired {\n background: var(--easy-form-error) !important;\n color: #fff !important;\n }\n .easy-form-timer-expired ~ .easy-form-submit-wrapper {\n display: none;\n }\n @keyframes easy-form-timer-pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.7;\n }\n }\n form {\n position: relative;\n }\n `\n}\n\nexport type { FormTheme, FormColors }\n","import type { FormColors } from '../../types'\n\nexport function getPlanoStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: none;\n border-bottom: 2px solid var(--easy-form-border);\n border-radius: 0;\n padding: 0.75rem 0;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n border-bottom-color: var(--easy-form-primary);\n }\n .easy-form-submit {\n border-radius: 0;\n font-weight: 600;\n }\n .easy-form-group {\n border: none;\n border-bottom: 1px solid var(--easy-form-group-border);\n border-radius: 0;\n background: transparent;\n }\n .easy-form-wizard-step {\n border: none;\n border-bottom: 2px solid var(--easy-form-border);\n border-radius: 0;\n }\n .easy-form-array-item {\n border: none;\n border-bottom: 1px solid var(--easy-form-group-border);\n border-radius: 0;\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getTradicionalStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 2px solid var(--easy-form-border);\n border-radius: 4px;\n padding: 0.625rem;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n border-color: var(--easy-form-primary);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.1);\n }\n .easy-form-submit {\n border-radius: 4px;\n font-weight: 500;\n }\n .easy-form-group {\n border: 2px solid var(--easy-form-group-border);\n border-radius: 4px;\n background: var(--easy-form-group-background);\n }\n .easy-form-wizard-step {\n border: 2px solid var(--easy-form-border);\n border-radius: 4px;\n background: var(--easy-form-group-background);\n }\n .easy-form-wizard-step.active {\n border-color: var(--easy-form-primary);\n }\n .easy-form-array-item {\n border: 2px solid var(--easy-form-group-border);\n border-radius: 4px;\n background: var(--easy-form-group-background);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getMaterialStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n font-size: 0.875rem;\n font-weight: 500;\n margin-bottom: 0.25rem;\n color: var(--easy-form-label-color);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: none;\n border-bottom: 1px solid color-mix(in srgb, var(--easy-form-text) 42%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 0.75rem 0.75rem 0.5rem 0.75rem;\n background: transparent;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n border-bottom-color: var(--easy-form-primary);\n border-bottom-width: 2px;\n padding-bottom: calc(0.5rem - 1px);\n }\n .easy-form-submit {\n border-radius: 4px;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n .easy-form-submit:hover {\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);\n }\n .easy-form-group {\n border: none;\n border-radius: 4px;\n background: var(--easy-form-group-background);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n }\n .easy-form-wizard-step {\n border: none;\n border-radius: 4px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n }\n .easy-form-array-item {\n border: none;\n border-radius: 4px;\n background: var(--easy-form-group-background);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);\n }\n .easy-form-array-add,\n .easy-form-quantity-btn {\n border-radius: 4px;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n .easy-form-array-add:hover,\n .easy-form-quantity-btn:hover:not(.disabled) {\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);\n }\n .easy-form-array-remove {\n border-radius: 4px;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n .easy-form-array-remove:hover {\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);\n }\n .easy-form-wizard-prev,\n .easy-form-wizard-next {\n border-radius: 4px;\n text-transform: uppercase;\n font-weight: 500;\n letter-spacing: 0.5px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n .easy-form-wizard-prev:hover:not(:disabled),\n .easy-form-wizard-next:hover {\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);\n }\n .easy-form-error,\n .easy-form-description {\n background: transparent;\n border: none;\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getRoundedShadowStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n }\n .easy-form-input-wrapper {\n border-radius: 12px;\n padding: 0 1rem;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n }\n .easy-form-input-wrapper:focus-within {\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.15);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 1px solid var(--easy-form-border);\n border-radius: 12px;\n padding: 0.75rem 1rem;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n border-color: var(--easy-form-primary);\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.15);\n transform: translateY(-1px);\n }\n .easy-form-submit {\n border-radius: 12px;\n font-weight: 600;\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.3);\n }\n .easy-form-submit:hover {\n box-shadow: 0 6px 16px rgba(var(--easy-form-primary-rgb), 0.4);\n transform: translateY(-2px);\n }\n .easy-form-group {\n border: 1px solid var(--easy-form-group-border);\n border-radius: 16px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n background: var(--easy-form-group-background);\n }\n .easy-form-wizard-step {\n border: 1px solid var(--easy-form-border);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n .easy-form-wizard-step.active {\n box-shadow: 0 4px 16px rgba(var(--easy-form-primary-rgb), 0.3);\n }\n .easy-form-array-item {\n border: 1px solid var(--easy-form-group-border);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n background: var(--easy-form-group-background);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getLinesStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-field {\n border-bottom: 1px solid var(--easy-form-border);\n padding-bottom: 1rem;\n margin-bottom: 1.5rem;\n }\n .easy-form-field:last-child {\n border-bottom: none;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: none;\n border-radius: 0;\n padding: 0.5rem 0;\n background: transparent;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n border-bottom: 2px solid var(--easy-form-primary);\n padding-bottom: calc(0.5rem - 1px);\n }\n .easy-form-submit {\n border-radius: 0;\n border-bottom: 3px solid var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n font-weight: 600;\n padding: 0.75rem 0;\n }\n .easy-form-submit:hover {\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n }\n .easy-form-group {\n border: none;\n border-bottom: 2px solid var(--easy-form-group-border);\n border-radius: 0;\n padding-bottom: 1rem;\n background: transparent;\n }\n .easy-form-wizard-step {\n border: none;\n border-bottom: 3px solid var(--easy-form-border);\n border-radius: 0;\n background: transparent;\n }\n .easy-form-wizard-step.active {\n border-bottom-color: var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n }\n .easy-form-wizard-step.completed {\n border-bottom-color: var(--easy-form-success);\n background: transparent;\n color: var(--easy-form-success);\n }\n .easy-form-array-item {\n border: none;\n border-bottom: 1px solid var(--easy-form-group-border);\n border-radius: 0;\n }\n .easy-form-array-add,\n .easy-form-quantity-btn {\n border-radius: 0;\n border: none;\n border-bottom: 3px solid var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n font-weight: 600;\n padding: 0.5rem 0.75rem;\n }\n .easy-form-array-add:hover,\n .easy-form-quantity-btn:hover:not(.disabled) {\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n }\n .easy-form-array-remove {\n border-radius: 0;\n border: none;\n border-bottom: 3px solid var(--easy-form-error);\n background: transparent;\n color: var(--easy-form-error);\n font-weight: 600;\n padding: 0.5rem 0.75rem;\n }\n .easy-form-array-remove:hover {\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n }\n .easy-form-wizard-prev {\n border-radius: 0;\n border: none;\n border-bottom: 3px solid var(--easy-form-secondary);\n background: transparent;\n color: var(--easy-form-secondary);\n font-weight: 600;\n padding: 0.5rem 0.75rem;\n }\n .easy-form-wizard-next {\n border-radius: 0;\n border: none;\n border-bottom: 3px solid var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n font-weight: 600;\n padding: 0.5rem 0.75rem;\n }\n .easy-form-wizard-prev:hover:not(:disabled),\n .easy-form-wizard-next:hover {\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n }\n .easy-form-error,\n .easy-form-description {\n background: none;\n border: none;\n padding: 0;\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getShadcnStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 0.75rem;\n letter-spacing: -0.01em;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 1.5px solid var(--easy-form-border);\n border-radius: 8px;\n padding: 0.75rem 1rem;\n background: linear-gradient(to bottom, var(--easy-form-background), var(--easy-form-group-background));\n color: var(--easy-form-text);\n font-size: 0.875rem;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), inset 0 1px 1px rgba(255, 255, 255, 0.8);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-color: color-mix(in srgb, var(--easy-form-border) 80%, black);\n background: linear-gradient(to bottom, var(--easy-form-background), var(--easy-form-group-background));\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08), inset 0 1px 1px rgba(255, 255, 255, 0.9);\n transform: translateY(-1px);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-color: var(--easy-form-primary);\n background: var(--easy-form-background);\n box-shadow: 0 0 0 4px rgba(var(--easy-form-primary-rgb), 0.12), 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.15);\n transform: translateY(-2px);\n }\n .easy-form-submit {\n border-radius: 8px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, color-mix(in srgb, var(--easy-form-primary) 75%, black) 100%);\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.3), 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n letter-spacing: 0.01em;\n }\n .easy-form-submit:hover {\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.4), 0 4px 8px rgba(0, 0, 0, 0.15);\n transform: translateY(-2px);\n background: linear-gradient(135deg, color-mix(in srgb, var(--easy-form-primary) 75%, black) 0%, var(--easy-form-primary) 100%);\n }\n .easy-form-submit:active {\n transform: translateY(0);\n box-shadow: 0 2px 8px rgba(var(--easy-form-primary-rgb), 0.3);\n }\n .easy-form-group {\n border: 1.5px solid var(--easy-form-group-border);\n border-radius: 12px;\n background: var(--easy-form-group-background);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n padding: 1.5rem;\n }\n .easy-form-wizard-step {\n border: 1.5px solid var(--easy-form-border);\n border-radius: 8px;\n background: linear-gradient(to bottom, var(--easy-form-background), var(--easy-form-group-background));\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-step:hover {\n border-color: color-mix(in srgb, var(--easy-form-border) 80%, black);\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n }\n .easy-form-wizard-step.active {\n border-color: var(--easy-form-primary);\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, color-mix(in srgb, var(--easy-form-primary) 75%, black) 100%);\n color: white;\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.4);\n transform: translateY(-2px);\n }\n .easy-form-array-item {\n border: 1.5px solid var(--easy-form-border);\n border-radius: 8px;\n background: var(--easy-form-group-background);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n }\n .easy-form-array-add,\n .easy-form-quantity-btn {\n border-radius: 8px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, color-mix(in srgb, var(--easy-form-primary) 75%, black) 100%);\n border: 1.5px solid color-mix(in srgb, var(--easy-form-primary) 85%, black);\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.3), 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-array-add:hover,\n .easy-form-quantity-btn:hover:not(.disabled) {\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.4), 0 4px 8px rgba(0, 0, 0, 0.15);\n transform: translateY(-2px);\n background: linear-gradient(135deg, color-mix(in srgb, var(--easy-form-primary) 75%, black) 0%, var(--easy-form-primary) 100%);\n }\n .easy-form-array-remove {\n border-radius: 8px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-error) 0%, color-mix(in srgb, var(--easy-form-error) 75%, black) 100%);\n border: 1.5px solid color-mix(in srgb, var(--easy-form-error) 85%, black);\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.2), 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-array-remove:hover {\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.3), 0 4px 8px rgba(0, 0, 0, 0.15);\n transform: translateY(-2px);\n }\n .easy-form-wizard-prev {\n border-radius: 8px;\n font-weight: 600;\n background: linear-gradient(to bottom, var(--easy-form-background), var(--easy-form-group-background));\n border: 1.5px solid var(--easy-form-border);\n color: var(--easy-form-text);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-next {\n border-radius: 8px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, color-mix(in srgb, var(--easy-form-primary) 75%, black) 100%);\n border: 1.5px solid color-mix(in srgb, var(--easy-form-primary) 85%, black);\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.3), 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-prev:hover:not(:disabled) {\n border-color: color-mix(in srgb, var(--easy-form-border) 80%, black);\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n }\n .easy-form-wizard-next:hover {\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.4), 0 4px 8px rgba(0, 0, 0, 0.15);\n transform: translateY(-2px);\n background: linear-gradient(135deg, color-mix(in srgb, var(--easy-form-primary) 75%, black) 0%, var(--easy-form-primary) 100%);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getChakraStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 0.5rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-size: 0.75rem;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 2px solid var(--easy-form-border);\n border-radius: 6px;\n padding: 0.625rem 0.875rem;\n background: var(--easy-form-background);\n color: var(--easy-form-text);\n font-size: 0.875rem;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n font-weight: 500;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-color: var(--easy-form-primary);\n background: var(--easy-form-group-background);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.1);\n transform: scale(1.02);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-color: var(--easy-form-primary);\n border-width: 2px;\n background: var(--easy-form-background);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.2), 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.15);\n transform: scale(1.02);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):disabled, textarea:disabled, select:disabled {\n background: var(--easy-form-group-background);\n border-color: var(--easy-form-border);\n cursor: not-allowed;\n opacity: 0.6;\n }\n .easy-form-submit {\n border-radius: 6px;\n font-weight: 600;\n background: var(--easy-form-primary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-size: 0.875rem;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 4px 6px rgba(var(--easy-form-primary-rgb), 0.25);\n }\n .easy-form-submit:hover {\n background: color-mix(in srgb, var(--easy-form-primary) 75%, black);\n box-shadow: 0 6px 12px rgba(var(--easy-form-primary-rgb), 0.35);\n transform: translateY(-2px) scale(1.02);\n }\n .easy-form-submit:active {\n transform: translateY(0) scale(0.98);\n }\n .easy-form-submit:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n transform: none;\n }\n .easy-form-group {\n border: 2px solid var(--easy-form-group-border);\n border-radius: 8px;\n background: var(--easy-form-group-background);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n .easy-form-wizard-step {\n border: 2px solid var(--easy-form-border);\n border-radius: 6px;\n background: var(--easy-form-background);\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-step:hover {\n border-color: var(--easy-form-primary);\n transform: scale(1.05);\n }\n .easy-form-wizard-step.active {\n border-color: var(--easy-form-primary);\n background: var(--easy-form-primary);\n color: white;\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.3);\n transform: scale(1.05);\n }\n .easy-form-array-item {\n border: 2px solid var(--easy-form-border);\n border-radius: 6px;\n background: var(--easy-form-background);\n transition: all 0.25s ease;\n }\n .easy-form-array-item:hover {\n border-color: var(--easy-form-group-border);\n box-shadow: 0 2px 8px rgba(var(--easy-form-primary-rgb), 0.15);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getMantineStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 0.625rem;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 1px solid var(--easy-form-border);\n border-radius: 12px;\n padding: 0.875rem 1.25rem;\n background: var(--easy-form-background);\n color: var(--easy-form-text);\n font-size: 0.875rem;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.8);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-color: color-mix(in srgb, var(--easy-form-border) 70%, black);\n background: linear-gradient(to bottom, var(--easy-form-background), var(--easy-form-group-background));\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.9);\n transform: translateY(-2px);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-color: var(--easy-form-primary);\n background: var(--easy-form-background);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.15), 0 6px 16px rgba(var(--easy-form-primary-rgb), 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.9);\n transform: translateY(-3px);\n }\n .easy-form-submit {\n border-radius: 12px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, color-mix(in srgb, var(--easy-form-primary) 75%, black) 100%);\n box-shadow: 0 4px 12px rgba(var(--easy-form-primary-rgb), 0.3), 0 2px 4px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-submit:hover {\n box-shadow: 0 8px 20px rgba(var(--easy-form-primary-rgb), 0.4), 0 4px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.3);\n transform: translateY(-3px) scale(1.02);\n }\n .easy-form-submit:active {\n transform: translateY(-1px) scale(0.98);\n box-shadow: 0 2px 8px rgba(var(--easy-form-primary-rgb), 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.2);\n }\n .easy-form-group {\n border: 1px solid var(--easy-form-group-border);\n border-radius: 16px;\n background: var(--easy-form-group-background);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.8);\n padding: 1.5rem;\n }\n .easy-form-wizard-step {\n border: 1px solid var(--easy-form-border);\n border-radius: 12px;\n background: var(--easy-form-background);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n }\n .easy-form-wizard-step:hover {\n background: linear-gradient(to bottom, var(--easy-form-background), var(--easy-form-group-background));\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n transform: translateY(-2px);\n }\n .easy-form-wizard-step.active {\n border-color: var(--easy-form-primary);\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, color-mix(in srgb, var(--easy-form-primary) 75%, black) 100%);\n color: white;\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.2);\n transform: translateY(-3px) scale(1.05);\n }\n .easy-form-array-item {\n border: 1px solid var(--easy-form-group-border);\n border-radius: 12px;\n background: var(--easy-form-group-background);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06), inset 0 1px 0 rgba(255, 255, 255, 0.8);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getGlassStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 0.75rem;\n text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 2px solid rgba(255, 255, 255, 0.4);\n border-radius: 16px;\n padding: 0.875rem 1.25rem;\n background: rgba(255, 255, 255, 0.15);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n font-size: 0.875rem;\n color: var(--easy-form-text);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.1);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"])::placeholder, textarea::placeholder, select::placeholder {\n color: rgba(255, 255, 255, 0.6);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-color: rgba(255, 255, 255, 0.6);\n background: rgba(255, 255, 255, 0.25);\n box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 20px rgba(255, 255, 255, 0.1);\n transform: translateY(-2px);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-color: rgba(255, 255, 255, 0.8);\n background: rgba(255, 255, 255, 0.3);\n box-shadow: 0 0 0 4px rgba(var(--easy-form-primary-rgb), 0.3), 0 16px 32px rgba(var(--easy-form-primary-rgb), 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 0 30px rgba(var(--easy-form-primary-rgb), 0.2);\n transform: translateY(-3px) scale(1.02);\n }\n .easy-form-submit {\n border-radius: 16px;\n font-weight: 600;\n background: rgba(255, 255, 255, 0.2);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n border: 2px solid rgba(255, 255, 255, 0.4);\n color: var(--easy-form-text);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3), 0 0 20px rgba(255, 255, 255, 0.1);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-submit:hover {\n background: rgba(255, 255, 255, 0.3);\n border-color: rgba(255, 255, 255, 0.6);\n box-shadow: 0 12px 32px rgba(var(--easy-form-primary-rgb), 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 0 40px rgba(var(--easy-form-primary-rgb), 0.3);\n transform: translateY(-3px) scale(1.05);\n }\n .easy-form-submit:active {\n transform: translateY(-1px) scale(0.98);\n }\n .easy-form-group {\n border: 2px solid var(--easy-form-group-border);\n border-radius: 20px;\n background: var(--easy-form-group-background);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n box-shadow: 0 16px 32px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3);\n padding: 2rem;\n }\n .easy-form-wizard-step {\n border: 2px solid rgba(255, 255, 255, 0.4);\n border-radius: 16px;\n background: rgba(255, 255, 255, 0.15);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--easy-form-text);\n }\n .easy-form-wizard-step:hover {\n background: rgba(255, 255, 255, 0.25);\n box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3), 0 0 20px rgba(255, 255, 255, 0.1);\n transform: translateY(-2px);\n }\n .easy-form-wizard-step.active {\n border-color: rgba(255, 255, 255, 0.8);\n background: rgba(var(--easy-form-primary-rgb), 0.3);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.4), 0 16px 32px rgba(var(--easy-form-primary-rgb), 0.3), 0 0 40px rgba(var(--easy-form-primary-rgb), 0.2);\n transform: translateY(-3px) scale(1.05);\n }\n .easy-form-array-item {\n border: 2px solid rgba(255, 255, 255, 0.4);\n border-radius: 16px;\n background: rgba(255, 255, 255, 0.15);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.3);\n }\n .easy-form-array-add,\n .easy-form-quantity-btn {\n border-radius: 16px;\n font-weight: 600;\n background: rgba(255, 255, 255, 0.2);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n border: 2px solid rgba(255, 255, 255, 0.4);\n color: var(--easy-form-text);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3), 0 0 20px rgba(255, 255, 255, 0.1);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-array-add:hover,\n .easy-form-quantity-btn:hover:not(.disabled) {\n background: rgba(255, 255, 255, 0.3);\n border-color: rgba(255, 255, 255, 0.6);\n box-shadow: 0 12px 32px rgba(var(--easy-form-primary-rgb), 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 0 40px rgba(var(--easy-form-primary-rgb), 0.3);\n transform: translateY(-3px) scale(1.05);\n }\n .easy-form-array-remove {\n border-radius: 16px;\n font-weight: 600;\n background: rgba(255, 255, 255, 0.2);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n border: 2px solid rgba(255, 255, 255, 0.4);\n color: var(--easy-form-error);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-array-remove:hover {\n background: rgba(255, 255, 255, 0.3);\n border-color: rgba(255, 255, 255, 0.6);\n box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3), 0 0 20px rgba(255, 255, 255, 0.1);\n transform: translateY(-2px);\n }\n .easy-form-wizard-prev,\n .easy-form-wizard-next {\n border-radius: 16px;\n font-weight: 600;\n background: rgba(255, 255, 255, 0.2);\n backdrop-filter: blur(20px) saturate(180%);\n -webkit-backdrop-filter: blur(20px) saturate(180%);\n border: 2px solid rgba(255, 255, 255, 0.4);\n color: var(--easy-form-text);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3), 0 0 20px rgba(255, 255, 255, 0.1);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-prev:hover:not(:disabled),\n .easy-form-wizard-next:hover {\n background: rgba(255, 255, 255, 0.3);\n border-color: rgba(255, 255, 255, 0.6);\n box-shadow: 0 12px 32px rgba(var(--easy-form-primary-rgb), 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.5), 0 0 40px rgba(var(--easy-form-primary-rgb), 0.3);\n transform: translateY(-3px) scale(1.05);\n }\n .easy-form-wizard-next {\n background: rgba(var(--easy-form-primary-rgb), 0.25);\n }\n .easy-form-wizard-next:hover {\n background: rgba(var(--easy-form-primary-rgb), 0.35);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getBorderedStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.875rem;\n font-weight: 700;\n margin-bottom: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 3px solid var(--easy-form-text);\n border-radius: 0;\n padding: 0.875rem 1.25rem;\n background: var(--easy-form-background);\n color: var(--easy-form-text);\n font-size: 0.875rem;\n font-weight: 600;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1), inset 0 2px 4px rgba(0, 0, 0, 0.05);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-color: var(--easy-form-primary);\n box-shadow: 6px 6px 0 rgba(var(--easy-form-primary-rgb), 0.2), inset 0 2px 4px rgba(0, 0, 0, 0.05);\n transform: translate(-2px, -2px);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-color: var(--easy-form-primary);\n border-width: 4px;\n box-shadow: 8px 8px 0 rgba(var(--easy-form-primary-rgb), 0.3), inset 0 2px 4px rgba(0, 0, 0, 0.05), 0 0 0 4px rgba(var(--easy-form-primary-rgb), 0.1);\n transform: translate(-4px, -4px);\n }\n .easy-form-submit {\n border-radius: 0;\n font-weight: 700;\n border: 4px solid var(--easy-form-text);\n background: var(--easy-form-primary);\n color: var(--easy-form-on-primary);\n text-transform: uppercase;\n letter-spacing: 0.1em;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 6px 6px 0 rgba(0, 0, 0, 0.2);\n }\n .easy-form-submit:hover {\n background: color-mix(in srgb, var(--easy-form-primary) 75%, black);\n box-shadow: 8px 8px 0 rgba(0, 0, 0, 0.3);\n transform: translate(-2px, -2px);\n }\n .easy-form-submit:active {\n transform: translate(0, 0);\n box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.2);\n }\n .easy-form-group {\n border: 4px solid var(--easy-form-group-border);\n border-radius: 0;\n background: var(--easy-form-group-background);\n box-shadow: 8px 8px 0 rgba(0, 0, 0, 0.1);\n padding: 2rem;\n }\n .easy-form-wizard-step {\n border: 3px solid var(--easy-form-text);\n border-radius: 0;\n background: var(--easy-form-background);\n font-weight: 600;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);\n }\n .easy-form-wizard-step:hover {\n box-shadow: 6px 6px 0 rgba(0, 0, 0, 0.15);\n transform: translate(-2px, -2px);\n }\n .easy-form-wizard-step.active {\n border-color: var(--easy-form-primary);\n border-width: 4px;\n background: var(--easy-form-primary);\n color: white;\n box-shadow: 8px 8px 0 rgba(var(--easy-form-primary-rgb), 0.3);\n transform: translate(-4px, -4px);\n }\n .easy-form-array-item {\n border: 3px solid var(--easy-form-group-border);\n border-radius: 0;\n background: var(--easy-form-group-background);\n box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getMinimalStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.75rem;\n font-weight: 500;\n margin-bottom: 0.5rem;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: none;\n border-bottom: 1px solid var(--easy-form-border);\n border-radius: 0;\n padding: 0.625rem 0;\n background: transparent;\n color: var(--easy-form-text);\n font-size: 0.9375rem;\n font-weight: 300;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"])::after, textarea::after, select::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n width: 0;\n height: 2px;\n background: var(--easy-form-primary);\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-bottom-color: color-mix(in srgb, var(--easy-form-border) 75%, black);\n padding-left: 0.5rem;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-bottom-color: var(--easy-form-primary);\n border-bottom-width: 2px;\n padding-bottom: calc(0.625rem - 1px);\n padding-left: 0;\n background: linear-gradient(to bottom, transparent 98%, rgba(var(--easy-form-primary-rgb), 0.05) 100%);\n }\n .easy-form-submit {\n border-radius: 0;\n font-weight: 300;\n border: none;\n border-bottom: 2px solid var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n padding: 0.75rem 0;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n text-transform: uppercase;\n letter-spacing: 0.2em;\n font-size: 0.75rem;\n position: relative;\n overflow: hidden;\n }\n .easy-form-submit::before {\n content: '';\n position: absolute;\n bottom: 0;\n left: -100%;\n width: 100%;\n height: 2px;\n background: var(--easy-form-primary);\n transition: left 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-submit:hover {\n background: linear-gradient(to bottom, rgba(var(--easy-form-primary-rgb), 0.03), transparent);\n padding-left: 1rem;\n }\n .easy-form-submit:hover::before {\n left: 0;\n }\n .easy-form-group {\n border: none;\n border-bottom: 1px solid var(--easy-form-group-border);\n border-radius: 0;\n background: transparent;\n padding-bottom: 2rem;\n margin-bottom: 2rem;\n }\n .easy-form-wizard-step {\n border: none;\n border-bottom: 2px solid var(--easy-form-border);\n border-radius: 0;\n background: transparent;\n font-weight: 300;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n font-size: 0.75rem;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n }\n .easy-form-wizard-step::after {\n content: '';\n position: absolute;\n bottom: -2px;\n left: 0;\n width: 0;\n height: 2px;\n background: var(--easy-form-primary);\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-step:hover {\n color: var(--easy-form-primary);\n padding-left: 0.5rem;\n }\n .easy-form-wizard-step:hover::after {\n width: 100%;\n }\n .easy-form-wizard-step.active {\n border-bottom-color: var(--easy-form-primary);\n color: var(--easy-form-primary);\n font-weight: 500;\n }\n .easy-form-wizard-step.active::after {\n width: 100%;\n }\n .easy-form-array-item {\n border: none;\n border-bottom: 1px solid var(--easy-form-group-border);\n border-radius: 0;\n background: transparent;\n padding-bottom: 1.5rem;\n margin-bottom: 1.5rem;\n }\n .easy-form-array-add,\n .easy-form-quantity-btn {\n border-radius: 0;\n font-weight: 300;\n border: none;\n border-bottom: 2px solid var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n padding: 0.5rem 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n font-size: 0.75rem;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-array-add:hover,\n .easy-form-quantity-btn:hover:not(.disabled) {\n background: linear-gradient(to bottom, rgba(var(--easy-form-primary-rgb), 0.03), transparent);\n padding-left: 1rem;\n }\n .easy-form-array-remove {\n border-radius: 0;\n font-weight: 300;\n border: none;\n border-bottom: 2px solid var(--easy-form-error);\n background: transparent;\n color: var(--easy-form-error);\n padding: 0.5rem 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n font-size: 0.75rem;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-array-remove:hover {\n background: linear-gradient(to bottom, rgba(var(--easy-form-primary-rgb), 0.03), transparent);\n padding-left: 1rem;\n }\n .easy-form-wizard-prev {\n border-radius: 0;\n font-weight: 300;\n border: none;\n border-bottom: 2px solid var(--easy-form-secondary);\n background: transparent;\n color: var(--easy-form-secondary);\n padding: 0.5rem 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n font-size:rem;\n transition 0.75: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-next {\n border-radius: 0;\n font-weight: 300;\n border: none;\n border-bottom: 2px solid var(--easy-form-primary);\n background: transparent;\n color: var(--easy-form-primary);\n padding: 0.5rem 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n font-size: 0.75rem;\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .easy-form-wizard-prev:hover:not(:disabled),\n .easy-form-wizard-next:hover {\n background: linear-gradient(to bottom, rgba(var(--easy-form-primary-rgb), 0.03), transparent);\n padding-left: 1rem;\n }\n .easy-form-error,\n .easy-form-description {\n background: none;\n border: none;\n padding: 0;\n }\n `\n}\n","import type { FormColors } from '../../types'\n\nexport function getEfcStyles(_colors: Required<FormColors>): string {\n return `\n .easy-form-label {\n color: var(--easy-form-label-color);\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 0.75rem;\n letter-spacing: 0.025em;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select {\n border: 1px solid rgba(var(--easy-form-primary-rgb), 0.2);\n border-radius: 12px;\n padding: 0.875rem 1rem;\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n font-size: 0.9rem;\n color: var(--easy-form-text);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"])::placeholder, textarea::placeholder, select::placeholder {\n color: var(--easy-form-label-color);\n opacity: 0.5;\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):hover, textarea:hover, select:hover {\n border-color: rgba(var(--easy-form-primary-rgb), 0.4);\n background: rgba(var(--easy-form-primary-rgb), 0.08);\n }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus, textarea:focus, select:focus {\n outline: none;\n border-color: rgba(var(--easy-form-primary-rgb), 0.5);\n background: rgba(var(--easy-form-primary-rgb), 0.1);\n box-shadow: 0 0 0 3px rgba(var(--easy-form-primary-rgb), 0.15);\n }\n .easy-form-submit {\n border-radius: 12px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, var(--easy-form-primary) 100%);\n border: none;\n color: white;\n padding: 0.875rem 1.5rem;\n box-shadow: 0 4px 14px rgba(var(--easy-form-primary-rgb), 0.35);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: pointer;\n }\n .easy-form-submit:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.45);\n }\n .easy-form-submit:active {\n transform: translateY(0);\n box-shadow: 0 2px 8px rgba(var(--easy-form-primary-rgb), 0.3);\n }\n .easy-form-group {\n border: 1px solid rgba(var(--easy-form-primary-rgb), 0.2);\n border-radius: 16px;\n background: rgba(var(--easy-form-primary-rgb), 0.03);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n padding: 1.5rem;\n transition: all 0.3s ease;\n }\n .easy-form-group:hover {\n border-color: rgba(var(--easy-form-primary-rgb), 0.3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n }\n .easy-form-group-label {\n color: var(--easy-form-group-title);\n font-weight: 700;\n font-size: 1.1rem;\n }\n .easy-form-wizard-step {\n border: 1px solid rgba(var(--easy-form-primary-rgb), 0.2);\n border-radius: 10px;\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--easy-form-text);\n padding: 0.75rem 1.25rem;\n }\n .easy-form-wizard-step:hover {\n background: rgba(var(--easy-form-primary-rgb), 0.1);\n border-color: rgba(var(--easy-form-primary-rgb), 0.4);\n transform: translateY(-2px);\n }\n .easy-form-wizard-step.active {\n border-color: var(--easy-form-primary);\n background: linear-gradient(135deg, rgba(var(--easy-form-primary-rgb), 0.2) 0%, rgba(var(--easy-form-primary-rgb), 0.1) 100%);\n font-weight: 600;\n }\n .easy-form-array-item {\n border: 1px solid rgba(var(--easy-form-primary-rgb), 0.15);\n border-radius: 12px;\n background: rgba(var(--easy-form-primary-rgb), 0.03);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n padding: 1rem;\n transition: all 0.3s ease;\n }\n .easy-form-array-item:hover {\n border-color: rgba(var(--easy-form-primary-rgb), 0.25);\n }\n .easy-form-array-add,\n .easy-form-quantity-btn {\n border-radius: 10px;\n font-weight: 600;\n border: 1px solid rgba(var(--easy-form-primary-rgb), 0.2);\n background: rgba(var(--easy-form-primary-rgb), 0.1);\n color: var(--easy-form-primary);\n padding: 0.5rem 1rem;\n font-size: 0.85rem;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: pointer;\n }\n .easy-form-array-add:hover,\n .easy-form-quantity-btn:hover:not(.disabled) {\n background: rgba(var(--easy-form-primary-rgb), 0.2);\n border-color: rgba(var(--easy-form-primary-rgb), 0.4);\n transform: translateY(-1px);\n }\n .easy-form-array-remove {\n border-radius: 10px;\n font-weight: 600;\n border: 1px solid rgba(var(--easy-form-error-rgb), 0.2);\n background: rgba(var(--easy-form-error-rgb), 0.1);\n color: var(--easy-form-error);\n padding: 0.5rem 1rem;\n font-size: 0.85rem;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: pointer;\n }\n .easy-form-array-remove:hover {\n background: rgba(var(--easy-form-error-rgb), 0.2);\n border-color: rgba(var(--easy-form-error-rgb), 0.4);\n transform: translateY(-1px);\n }\n .easy-form-wizard-prev {\n border-radius: 10px;\n font-weight: 600;\n border: 1px solid rgba(var(--easy-form-primary-rgb), 0.2);\n background: rgba(var(--easy-form-primary-rgb), 0.05);\n color: var(--easy-form-primary);\n padding: 0.75rem 1.25rem;\n font-size: 0.9rem;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: pointer;\n }\n .easy-form-wizard-next {\n border-radius: 10px;\n font-weight: 600;\n background: linear-gradient(135deg, var(--easy-form-primary) 0%, var(--easy-form-primary) 100%);\n border: none;\n color: white;\n padding: 0.75rem 1.25rem;\n font-size: 0.9rem;\n box-shadow: 0 4px 14px rgba(var(--easy-form-primary-rgb), 0.35);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n cursor: pointer;\n }\n .easy-form-wizard-prev:hover:not(:disabled) {\n background: rgba(var(--easy-form-primary-rgb), 0.1);\n border-color: rgba(var(--easy-form-primary-rgb), 0.4);\n }\n .easy-form-wizard-next:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 20px rgba(var(--easy-form-primary-rgb), 0.45);\n }\n .easy-form-error {\n background: rgba(var(--easy-form-error-rgb), 0.1);\n border: 1px solid rgba(var(--easy-form-error-rgb), 0.2);\n border-radius: 8px;\n padding: 0.5rem 0.75rem;\n color: var(--easy-form-error);\n font-size: 0.85rem;\n }\n .easy-form-description {\n color: var(--easy-form-label-color);\n opacity: 0.7;\n font-size: 0.85rem;\n }\n .easy-form-checkbox-wrapper,\n .easy-form-radio-wrapper {\n gap: 0.75rem;\n }\n input[type=\"checkbox\"],\n input[type=\"radio\"] {\n accent-color: var(--easy-form-primary);\n width: 1.1rem;\n height: 1.1rem;\n }\n select {\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236366f1' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 1rem center;\n padding-right: 2.5rem;\n }\n `\n}\n","import type { FormTheme, FormColors } from '../../types'\nimport { getColors, getBaseStyles } from './base'\nimport { getPlanoStyles } from './plano'\nimport { getTradicionalStyles } from './tradicional'\nimport { getMaterialStyles } from './material'\nimport { getRoundedShadowStyles } from './rounded-shadow'\nimport { getLinesStyles } from './lines'\nimport { getShadcnStyles } from './shadcn'\nimport { getChakraStyles } from './chakra'\nimport { getMantineStyles } from './mantine'\nimport { getGlassStyles } from './glass'\nimport { getBorderedStyles } from './bordered'\nimport { getMinimalStyles } from './minimal'\nimport { getEfcStyles } from './efc'\n\nexport function getThemeStyles(theme: FormTheme, colors: Required<FormColors>): string {\n const baseStyles = getBaseStyles(colors)\n const themeStyles = getThemeSpecificStyles(theme, colors)\n return baseStyles + themeStyles\n}\n\nexport function getThemeSpecificStyles(theme: FormTheme, colors: Required<FormColors>): string {\n switch (theme) {\n case 'plano':\n return getPlanoStyles(colors)\n case 'tradicional':\n return getTradicionalStyles(colors)\n case 'material':\n return getMaterialStyles(colors)\n case 'rounded-shadow':\n return getRoundedShadowStyles(colors)\n case 'lines':\n return getLinesStyles(colors)\n case 'shadcn':\n return getShadcnStyles(colors)\n case 'chakra':\n return getChakraStyles(colors)\n case 'mantine':\n return getMantineStyles(colors)\n case 'glass':\n return getGlassStyles(colors)\n case 'bordered':\n return getBorderedStyles(colors)\n case 'minimal':\n return getMinimalStyles(colors)\n case 'efc':\n return getEfcStyles(colors)\n default:\n return getPlanoStyles(colors)\n }\n}\n\nexport { getColors, getBaseStyles }\nexport type { FormTheme, FormColors }\n","import type { PredefinedMask, CustomMask } from '../types'\n\n/**\n * Máscaras predefinidas\n */\nexport const PREDEFINED_MASKS: Record<PredefinedMask, CustomMask> = {\n 'phone': {\n pattern: '(999) 999-9999',\n placeholder: '_',\n },\n 'phone-us': {\n pattern: '(999) 999-9999',\n placeholder: '_',\n },\n 'phone-international': {\n pattern: '+99 999 999 9999',\n placeholder: '_',\n },\n 'date': {\n pattern: '99/99/9999',\n placeholder: '_',\n },\n 'date-us': {\n pattern: '99/99/9999',\n placeholder: '_',\n },\n 'date-eu': {\n pattern: '99-99-9999',\n placeholder: '_',\n },\n 'credit-card': {\n pattern: '9999 9999 9999 9999',\n placeholder: '_',\n },\n 'ssn': {\n pattern: '999-99-9999',\n placeholder: '_',\n },\n 'zip-code': {\n pattern: '99999',\n placeholder: '_',\n },\n 'currency': {\n pattern: '$999,999.99',\n placeholder: '_',\n transform: (value: string) => {\n // Remover caracteres no numéricos excepto punto decimal\n const cleaned = value.replace(/[^\\d.]/g, '')\n const num = parseFloat(cleaned) || 0\n return num.toFixed(2)\n },\n },\n 'percentage': {\n pattern: '999%',\n placeholder: '_',\n transform: (value: string) => {\n const cleaned = value.replace(/[^\\d]/g, '')\n return cleaned\n },\n },\n 'time': {\n pattern: '99:99',\n placeholder: '_',\n },\n 'datetime': {\n pattern: '99/99/9999 99:99',\n placeholder: '_',\n },\n}\n\n/**\n * Obtiene una máscara predefinida\n */\nexport function getPredefinedMask(type: PredefinedMask): CustomMask {\n return PREDEFINED_MASKS[type]\n}\n","/**\n * Validación contra patrones de inyección (SQL, XSS, command injection, etc.)\n */\n\n/** Mensaje de error por defecto para validación de inyección */\nexport const INJECTION_VALIDATION_MESSAGE =\n 'El valor contiene caracteres o patrones no permitidos'\n\n/** Patrones de inyección (regex, case-insensitive) */\nconst INJECTION_PATTERNS: RegExp[] = [\n // SQL Injection\n /\\b(union|select|insert|update|delete|drop|exec|execute|declare)\\s+(all\\s+)?(select|from|into|table)/i,\n /\\b(or|and)\\s+['\"]?\\d+['\"]?\\s*=\\s*['\"]?\\d+/i,\n /;\\s*(drop|delete|truncate|alter)\\s+/i,\n /--\\s*$/, // SQL comment\n /\\/\\*[\\s\\S]*\\*\\//, // Block comment\n /'\\s*or\\s+'1'\\s*=\\s*'1/i,\n /\"\\s*or\\s+\"1\"\\s*=\\s*\"1/i,\n /\\bexec\\s*\\(/i,\n /\\bxp_\\w+/i, // SQL Server extended procedures\n\n // XSS / Scripting\n /<script\\b[\\s\\S]*?>[\\s\\S]*?<\\/script>/i,\n /<script\\b/i,\n /javascript\\s*:/i,\n /vbscript\\s*:/i,\n /on\\w+\\s*=\\s*[\"'][^\"']*[\"']/i, // onclick=, onerror=, onload=, etc.\n /on\\w+\\s*=\\s*[^\\s>]+/i,\n /<iframe\\b/i,\n /<object\\b/i,\n /<embed\\b/i,\n /\\beval\\s*\\(/i,\n /document\\.(cookie|write|location)/i,\n /window\\.(location|open|eval)/i,\n\n // Command injection (shell)\n /[;&|]\\s*(ls|cat|rm|wget|curl|nc|bash|sh|python|perl)\\s/i,\n /\\$\\s*\\([^)]+\\)/, // $(...)\n /`[^`]+`/, // Backtick command substitution\n /\\|\\s*\\w+/, // Pipe to command (with word after)\n\n // NoSQL / Template injection\n /\\$\\s*where\\b/i,\n /\\$\\s*gt\\b|\\$\\s*ne\\b|\\$\\s*regex\\b/i,\n /\\{\\{[^}]*\\}\\}/, // Template literals\n /\\$\\{[^}]*\\}/, // JS template literals\n]\n\n/**\n * Verifica si un valor string contiene patrones de inyección\n */\nexport function containsInjection(value: string): boolean {\n if (typeof value !== 'string' || value.length === 0) {\n return false\n }\n const normalized = value.trim()\n if (normalized.length === 0) return false\n\n for (const pattern of INJECTION_PATTERNS) {\n if (pattern.test(value)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Valida recursivamente un valor (string, array de strings, objetos con strings)\n * Retorna true si NO contiene inyección (válido), false si contiene (inválido)\n */\nexport function isSafeFromInjection(value: unknown): boolean {\n if (value === null || value === undefined) {\n return true\n }\n if (typeof value === 'string') {\n return !containsInjection(value)\n }\n if (Array.isArray(value)) {\n return value.every((item) => isSafeFromInjection(item))\n }\n if (typeof value === 'object') {\n return Object.values(value as Record<string, unknown>).every((v) =>\n isSafeFromInjection(v)\n )\n }\n // number, boolean, etc. - no aplica validación\n return true\n}\n","/**\n * Utilidad para bloquear formularios después de N intentos fallidos\n */\n\nexport interface AttemptsLockOptions {\n maxAttempts: number\n blockDurationMinutes?: number\n storageKey?: string\n onLocked?: (remainingMs: number) => void\n onUnlocked?: () => void\n}\n\ninterface StoredLockState {\n attempts: number\n lockedUntil?: number\n}\n\nexport class AttemptsLock {\n private maxAttempts: number\n private blockDurationMs: number\n private storageKey?: string\n private attempts: number = 0\n private lockedUntil: number | null = null\n private onLocked?: (remainingMs: number) => void\n private onUnlocked?: () => void\n private unlockCheckInterval: ReturnType<typeof setInterval> | null = null\n\n constructor(options: AttemptsLockOptions) {\n this.maxAttempts = Math.max(1, options.maxAttempts)\n this.blockDurationMs =\n (options.blockDurationMinutes ?? 5) * 60 * 1000\n this.storageKey = options.storageKey\n this.onLocked = options.onLocked\n this.onUnlocked = options.onUnlocked\n\n if (this.storageKey && typeof sessionStorage !== 'undefined') {\n this.loadFromStorage()\n }\n }\n\n private loadFromStorage(): void {\n if (!this.storageKey || typeof sessionStorage === 'undefined') return\n try {\n const stored = sessionStorage.getItem(this.storageKey)\n if (stored) {\n const data: StoredLockState = JSON.parse(stored)\n this.attempts = data.attempts ?? 0\n this.lockedUntil = data.lockedUntil ?? null\n this.checkExpiration()\n }\n } catch {\n // Ignorar errores de parsing\n }\n }\n\n private saveToStorage(): void {\n if (!this.storageKey || typeof sessionStorage === 'undefined') return\n try {\n const data: StoredLockState = {\n attempts: this.attempts,\n lockedUntil: this.lockedUntil ?? undefined,\n }\n sessionStorage.setItem(this.storageKey, JSON.stringify(data))\n } catch {\n // Ignorar errores\n }\n }\n\n private checkExpiration(): boolean {\n if (this.lockedUntil === null) return false\n if (Date.now() >= this.lockedUntil) {\n this.reset()\n this.onUnlocked?.()\n return true\n }\n return false\n }\n\n private startUnlockCheck(): void {\n if (this.unlockCheckInterval) return\n this.unlockCheckInterval = setInterval(() => {\n if (this.checkExpiration()) {\n this.stopUnlockCheck()\n }\n }, 1000)\n }\n\n private stopUnlockCheck(): void {\n if (this.unlockCheckInterval) {\n clearInterval(this.unlockCheckInterval)\n this.unlockCheckInterval = null\n }\n }\n\n /**\n * Incrementa el contador de intentos. Si alcanza maxAttempts, bloquea.\n */\n incrementAttempts(): void {\n this.attempts++\n if (this.attempts >= this.maxAttempts) {\n this.lockedUntil = Date.now() + this.blockDurationMs\n this.saveToStorage()\n this.onLocked?.(this.blockDurationMs)\n this.startUnlockCheck()\n } else {\n this.saveToStorage()\n }\n }\n\n /**\n * Retorna true si el lock está activo (aún dentro del período de bloqueo)\n */\n isLocked(): boolean {\n if (this.checkExpiration()) return false\n return this.lockedUntil !== null && Date.now() < this.lockedUntil\n }\n\n /**\n * Retorna los milisegundos restantes del bloqueo, o 0 si no está bloqueado\n */\n getRemainingBlockTimeMs(): number {\n if (this.checkExpiration()) return 0\n if (this.lockedUntil === null) return 0\n return Math.max(0, this.lockedUntil - Date.now())\n }\n\n /**\n * Resetea el contador de intentos y el bloqueo\n */\n reset(): void {\n this.attempts = 0\n this.lockedUntil = null\n this.stopUnlockCheck()\n this.saveToStorage()\n }\n\n /**\n * Retorna el número actual de intentos\n */\n getAttempts(): number {\n return this.attempts\n }\n}\n","/**\n * Utilidades generales\n */\n\n/**\n * Convierte un valor a string para atributos HTML\n */\nexport function attributeValue(value: any): string {\n if (value === null || value === undefined) {\n return ''\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false'\n }\n if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n return String(value)\n}\n\n/**\n * Parsea un valor desde un atributo HTML\n */\nexport function parseAttributeValue(value: string | null): any {\n if (!value) {\n return null\n }\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\n/**\n * Genera un ID único\n */\nexport function generateId(prefix = 'ef'): string {\n return `${prefix}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/**\n * Obtiene el valor anidado de un objeto usando notación de punto\n */\nexport function getNestedValue(obj: Record<string, any>, path: string): any {\n return path.split('.').reduce((current, key) => current?.[key], obj)\n}\n\n/**\n * Establece un valor anidado en un objeto usando notación de punto\n */\nexport function setNestedValue(\n obj: Record<string, any>,\n path: string,\n value: any\n): void {\n const keys = path.split('.')\n const lastKey = keys.pop()!\n const target = keys.reduce((current, key) => {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {}\n }\n return current[key]\n }, obj)\n target[lastKey] = value\n}\n\n/**\n * Valida si un email es válido\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n/**\n * Sanitiza un string para usar como ID de HTML\n */\nexport function sanitizeId(str: string): string {\n return str.replace(/[^a-zA-Z0-9-_]/g, '-')\n}\n\n// Exportar funciones de estilos\nexport { getThemeStyles, getColors } from './styles'\n\n// Exportar máscaras\nexport { PREDEFINED_MASKS, getPredefinedMask } from './masks'\n\n// Exportar validación anti-inyección\nexport {\n containsInjection,\n isSafeFromInjection,\n INJECTION_VALIDATION_MESSAGE,\n} from './injection-validation'\n\n// Exportar AttemptsLock\nexport { AttemptsLock } from './attempts-lock'\nexport type { AttemptsLockOptions } from './attempts-lock'\n","import type {\n FieldCondition,\n FieldDependencies,\n ConditionOperator,\n} from '../types'\n\n/**\n * Motor de evaluación de condiciones\n */\nexport class ConditionEngine {\n /**\n * Evalúa una condición individual\n */\n evaluateCondition(\n condition: FieldCondition,\n formValues: Record<string, any>\n ): boolean {\n const fieldValue = this.getFieldValue(condition.field, formValues)\n return this.compareValues(fieldValue, condition.operator, condition.value)\n }\n\n /**\n * Evalúa múltiples condiciones (AND por defecto, soportar OR)\n */\n evaluateConditions(\n conditions: FieldCondition | FieldCondition[],\n formValues: Record<string, any>,\n logic: 'and' | 'or' = 'and'\n ): boolean {\n const conditionsArray = Array.isArray(conditions) ? conditions : [conditions]\n\n if (conditionsArray.length === 0) {\n return true\n }\n\n if (logic === 'and') {\n return conditionsArray.every((condition) =>\n this.evaluateCondition(condition, formValues)\n )\n } else {\n return conditionsArray.some((condition) =>\n this.evaluateCondition(condition, formValues)\n )\n }\n }\n\n /**\n * Evalúa dependencias de un campo\n */\n evaluateDependencies(\n dependencies: FieldDependencies,\n formValues: Record<string, any>\n ): {\n visible: boolean\n enabled: boolean\n required: boolean\n } {\n let visible = true\n let enabled = true\n let required = false\n\n // Evaluar show/hide\n if (dependencies.show) {\n visible = this.evaluateConditions(dependencies.show, formValues)\n }\n if (dependencies.hide) {\n const shouldHide = this.evaluateConditions(dependencies.hide, formValues)\n visible = visible && !shouldHide\n }\n\n // Evaluar enable/disable\n if (dependencies.enable) {\n enabled = this.evaluateConditions(dependencies.enable, formValues)\n }\n if (dependencies.disable) {\n const shouldDisable = this.evaluateConditions(\n dependencies.disable,\n formValues\n )\n enabled = enabled && !shouldDisable\n }\n\n // Evaluar required/optional\n if (dependencies.required) {\n required = this.evaluateConditions(dependencies.required, formValues)\n }\n if (dependencies.optional) {\n const shouldBeOptional = this.evaluateConditions(\n dependencies.optional,\n formValues\n )\n required = required && !shouldBeOptional\n }\n\n return { visible, enabled, required }\n }\n\n /**\n * Obtiene el valor de un campo (soporta nested paths y claves con puntos)\n */\n private getFieldValue(\n fieldName: string,\n formValues: Record<string, any>\n ): any {\n // Primero intentar buscar por la clave exacta (incluyendo puntos)\n // Esto maneja el caso de campos con nombres como 'profile.type' que coexisten\n // con objetos anidados como { profile: { type: '...' } }\n if (fieldName in formValues) {\n return formValues[fieldName]\n }\n \n // Luego intentar navegación de objetos anidados\n const parts = fieldName.split('.')\n let value = formValues\n\n for (const part of parts) {\n if (value === null || value === undefined) {\n return null\n }\n value = value[part]\n }\n\n return value\n }\n\n /**\n * Compara valores según el operador\n */\n private compareValues(\n fieldValue: any,\n operator: ConditionOperator,\n compareValue: any\n ): boolean {\n switch (operator) {\n case 'equals':\n return this.deepEqual(fieldValue, compareValue)\n\n case 'notEquals':\n return !this.deepEqual(fieldValue, compareValue)\n\n case 'contains':\n if (Array.isArray(fieldValue)) {\n return fieldValue.includes(compareValue)\n }\n if (typeof fieldValue === 'string') {\n return fieldValue.includes(String(compareValue))\n }\n return false\n\n case 'notContains':\n return !this.compareValues(fieldValue, 'contains', compareValue)\n\n case 'greaterThan':\n return this.toNumber(fieldValue) > this.toNumber(compareValue)\n\n case 'lessThan':\n return this.toNumber(fieldValue) < this.toNumber(compareValue)\n\n case 'greaterThanOrEqual':\n return this.toNumber(fieldValue) >= this.toNumber(compareValue)\n\n case 'lessThanOrEqual':\n return this.toNumber(fieldValue) <= this.toNumber(compareValue)\n\n case 'in':\n if (Array.isArray(compareValue)) {\n return compareValue.includes(fieldValue)\n }\n return false\n\n case 'notIn':\n return !this.compareValues(fieldValue, 'in', compareValue)\n\n case 'isEmpty':\n return (\n fieldValue === null ||\n fieldValue === undefined ||\n fieldValue === '' ||\n (Array.isArray(fieldValue) && fieldValue.length === 0)\n )\n\n case 'isNotEmpty':\n return !this.compareValues(fieldValue, 'isEmpty', compareValue)\n\n case 'regex':\n try {\n const regex =\n typeof compareValue === 'string'\n ? new RegExp(compareValue)\n : compareValue\n return regex.test(String(fieldValue || ''))\n } catch {\n return false\n }\n\n default:\n return false\n }\n }\n\n /**\n * Comparación profunda de valores\n */\n private deepEqual(a: any, b: any): boolean {\n if (a === b) {\n return true\n }\n\n if (a === null || b === null || a === undefined || b === undefined) {\n return a === b\n }\n\n if (typeof a !== typeof b) {\n return false\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false\n }\n return a.every((val, index) => this.deepEqual(val, b[index]))\n }\n\n if (typeof a === 'object') {\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) {\n return false\n }\n\n return keysA.every((key) => this.deepEqual(a[key], b[key]))\n }\n\n return false\n }\n\n /**\n * Convierte un valor a número\n */\n private toNumber(value: any): number {\n if (typeof value === 'number') {\n return value\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value)\n return isNaN(parsed) ? 0 : parsed\n }\n return 0\n }\n}\n","import type {\n Validation,\n Field,\n MinLengthValidation,\n MaxLengthValidation,\n MinValidation,\n MaxValidation,\n CustomValidation,\n NoInjectionValidation,\n ArrayField,\n} from '../types'\nimport { isValidEmail } from '../utils'\nimport { isSafeFromInjection, INJECTION_VALIDATION_MESSAGE } from '../utils/injection-validation'\nimport { ConditionEngine } from './condition-engine'\n\n/**\n * Resultado de una validación\n */\nexport interface ValidationResult {\n isValid: boolean\n message?: string\n}\n\n/**\n * Motor de validaciones\n */\nexport class ValidationEngine {\n private conditionEngine: ConditionEngine\n\n constructor() {\n this.conditionEngine = new ConditionEngine()\n }\n /**\n * Valida un campo con todas sus validaciones\n */\n async validateField(\n field: Field,\n value: any\n ): Promise<string[]> {\n return this.validateFieldWithValidations(field, value, field.validations || [])\n }\n\n /**\n * Valida un campo con validaciones específicas\n */\n async validateFieldWithValidations(\n _field: Field,\n value: any,\n validations: Validation[]\n ): Promise<string[]> {\n const errors: string[] = []\n\n if (!validations || validations.length === 0) {\n return errors\n }\n\n for (const validation of validations) {\n const result = await this.validateValue(validation, value)\n if (!result.isValid) {\n errors.push(result.message || this.getDefaultMessage(validation))\n }\n }\n\n return errors\n }\n\n /**\n * Valida un valor con una validación específica\n */\n private async validateValue(\n validation: Validation,\n value: any\n ): Promise<ValidationResult> {\n switch (validation.type) {\n case 'required':\n return this.validateRequired(value)\n case 'email':\n return this.validateEmail(value)\n case 'minLength':\n return this.validateMinLength(value, validation.value)\n case 'maxLength':\n return this.validateMaxLength(value, validation.value)\n case 'min':\n return this.validateMin(value, validation.value)\n case 'max':\n return this.validateMax(value, validation.value)\n case 'pattern':\n return this.validatePattern(value, validation.value)\n case 'custom':\n return await this.validateCustom(value, validation)\n case 'noInjection':\n return this.validateNoInjection(value, validation)\n default:\n return { isValid: true }\n }\n }\n\n /**\n * Valida campo requerido\n */\n private validateRequired(value: any): ValidationResult {\n const isValid =\n value !== null &&\n value !== undefined &&\n value !== '' &&\n !(Array.isArray(value) && value.length === 0)\n return {\n isValid,\n message: isValid ? undefined : 'Este campo es requerido',\n }\n }\n\n /**\n * Valida email\n */\n private validateEmail(value: any): ValidationResult {\n if (!value) {\n return { isValid: true } // Si está vacío, required debe manejarlo\n }\n const isValid = typeof value === 'string' && isValidEmail(value)\n return {\n isValid,\n message: isValid ? undefined : 'Debe ser un email válido',\n }\n }\n\n /**\n * Valida longitud mínima\n */\n private validateMinLength(\n value: any,\n minLength: number\n ): ValidationResult {\n if (!value) {\n return { isValid: true }\n }\n const str = String(value)\n const isValid = str.length >= minLength\n return {\n isValid,\n message: isValid\n ? undefined\n : `Debe tener al menos ${minLength} caracteres`,\n }\n }\n\n /**\n * Valida longitud máxima\n */\n private validateMaxLength(\n value: any,\n maxLength: number\n ): ValidationResult {\n if (!value) {\n return { isValid: true }\n }\n const str = String(value)\n const isValid = str.length <= maxLength\n return {\n isValid,\n message: isValid\n ? undefined\n : `Debe tener máximo ${maxLength} caracteres`,\n }\n }\n\n /**\n * Valida valor mínimo\n */\n private validateMin(value: any, min: number): ValidationResult {\n if (value === null || value === undefined || value === '') {\n return { isValid: true }\n }\n const num = Number(value)\n const isValid = !isNaN(num) && num >= min\n return {\n isValid,\n message: isValid ? undefined : `Debe ser mayor o igual a ${min}`,\n }\n }\n\n /**\n * Valida valor máximo\n */\n private validateMax(value: any, max: number): ValidationResult {\n if (value === null || value === undefined || value === '') {\n return { isValid: true }\n }\n const num = Number(value)\n const isValid = !isNaN(num) && num <= max\n return {\n isValid,\n message: isValid ? undefined : `Debe ser menor o igual a ${max}`,\n }\n }\n\n /**\n * Valida patrón regex\n */\n private validatePattern(value: any, pattern: string | RegExp): ValidationResult {\n if (!value) {\n return { isValid: true }\n }\n \n // Convertir pattern a RegExp si es necesario\n let regex: RegExp\n if (pattern instanceof RegExp) {\n regex = pattern\n } else if (typeof pattern === 'string') {\n try {\n regex = new RegExp(pattern)\n } catch (e) {\n // Si el patrón no es válido, considerar como válido para no bloquear\n console.warn('Invalid regex pattern:', pattern)\n return { isValid: true }\n }\n } else {\n // Si pattern no es string ni RegExp, intentar convertirlo\n console.warn('Pattern validation expects string or RegExp, got:', typeof pattern, pattern)\n return { isValid: true }\n }\n \n const isValid = regex.test(String(value))\n return {\n isValid,\n message: isValid ? undefined : 'El formato no es válido',\n }\n }\n\n /**\n * Valida que el valor no contenga patrones de inyección (SQL, XSS, etc.)\n */\n private validateNoInjection(\n value: any,\n validation: NoInjectionValidation\n ): ValidationResult {\n if (value === null || value === undefined || value === '') {\n return { isValid: true }\n }\n const isValid = isSafeFromInjection(value)\n return {\n isValid,\n message: isValid ? undefined : validation.message || INJECTION_VALIDATION_MESSAGE,\n }\n }\n\n /**\n * Valida con función personalizada\n */\n private async validateCustom(\n value: any,\n validation: CustomValidation\n ): Promise<ValidationResult> {\n try {\n const result = await validation.validator(value)\n return {\n isValid: Boolean(result),\n message: result ? undefined : validation.message || 'Validación fallida',\n }\n } catch (error) {\n return {\n isValid: false,\n message: validation.message || 'Error en la validación',\n }\n }\n }\n\n /**\n * Obtiene mensaje por defecto para una validación\n */\n private getDefaultMessage(validation: Validation): string {\n switch (validation.type) {\n case 'required':\n return 'Este campo es requerido'\n case 'email':\n return 'Debe ser un email válido'\n case 'minLength':\n return `Debe tener al menos ${(validation as MinLengthValidation).value} caracteres`\n case 'maxLength':\n return `Debe tener máximo ${(validation as MaxLengthValidation).value} caracteres`\n case 'min':\n return `Debe ser mayor o igual a ${(validation as MinValidation).value}`\n case 'max':\n return `Debe ser menor o igual a ${(validation as MaxValidation).value}`\n case 'pattern':\n return 'El formato no es válido'\n case 'custom':\n return 'Validación fallida'\n case 'noInjection':\n return INJECTION_VALIDATION_MESSAGE\n default:\n return 'Campo inválido'\n }\n }\n\n /**\n * Evalúa si un campo debe ser validado basándose en sus dependencias\n * Un campo no debe validarse si está oculto por una condición\n */\n private shouldValidateField(field: Field, values: Record<string, any>): boolean {\n // Skip if explicitly hidden or disabled\n if (field.hidden || field.disabled) {\n return false\n }\n\n // Check dependencies to see if field should be validated\n if (field.dependencies) {\n // Use ConditionEngine to evaluate dependencies\n const result = this.conditionEngine.evaluateDependencies(field.dependencies, values)\n \n // If field is not visible, skip validation\n if (!result.visible) {\n return false\n }\n \n // If field is not enabled, skip validation \n if (!result.enabled) {\n return false\n }\n }\n \n return true\n }\n\n /**\n * Valida todos los campos de un formulario\n */\n async validateForm(\n fields: Field[],\n values: Record<string, any>\n ): Promise<Record<string, string[]>> {\n const errors: Record<string, string[]> = {}\n\n for (const field of fields) {\n if (!this.shouldValidateField(field, values)) {\n continue\n }\n \n // Handle array fields with itemSchema\n if (field.type === 'array' && 'itemSchema' in field) {\n const arrayField = field as ArrayField\n const itemSchema = arrayField.itemSchema\n const itemFields = itemSchema?.fields || []\n const arrayValue = values[field.name]\n \n if (Array.isArray(arrayValue)) {\n for (let i = 0; i < arrayValue.length; i++) {\n const itemValue = arrayValue[i]\n for (const itemField of itemFields) {\n const itemFieldName = `${field.name}.${i}.${itemField.name}`\n const itemFieldValue = itemValue?.[itemField.name]\n \n if (!this.shouldValidateField(itemField, values)) {\n continue\n }\n \n const fieldErrors = await this.validateField(itemField, itemFieldValue)\n if (fieldErrors.length > 0) {\n errors[itemFieldName] = fieldErrors\n }\n }\n }\n }\n \n // Validate array-level validations (minItems, maxItems)\n const arrayErrors = await this.validateArrayField(field, arrayValue)\n if (arrayErrors.length > 0) {\n errors[field.name] = arrayErrors\n }\n } else {\n const value = values[field.name]\n const fieldErrors = await this.validateField(field, value)\n if (fieldErrors.length > 0) {\n errors[field.name] = fieldErrors\n }\n }\n }\n\n return errors\n }\n\n /**\n * Valida un campo array a nivel de array (minItems, maxItems)\n */\n private async validateArrayField(field: Field, value: any): Promise<string[]> {\n const errors: string[] = []\n const arrayField = field as ArrayField\n \n if (arrayField.minItems !== undefined) {\n const isValid = Array.isArray(value) && value.length >= arrayField.minItems\n if (!isValid) {\n errors.push(`Debe tener al menos ${arrayField.minItems} elementos`)\n }\n }\n \n if (arrayField.maxItems !== undefined) {\n const isValid = Array.isArray(value) && value.length <= arrayField.maxItems\n if (!isValid) {\n errors.push(`Debe tener máximo ${arrayField.maxItems} elementos`)\n }\n }\n \n return errors\n }\n}\n","import type {\n FormState,\n WizardState,\n Field,\n FormSchema,\n} from '../types'\nimport { SchemaParser, type ParsedSchema } from './schema-parser'\nimport { ValidationEngine } from './validation-engine'\nimport { ConditionEngine } from './condition-engine'\nimport { getNestedValue, setNestedValue } from '../utils'\n\n/**\n * Gestor de estado del formulario\n */\nexport class StateManager {\n private state: FormState\n private wizardState: WizardState | null = null\n private schema: ParsedSchema | null = null\n private parser: SchemaParser\n private validator: ValidationEngine\n private conditionEngine: ConditionEngine\n private dependencyCache: Map<string, { visible: boolean; enabled: boolean; required: boolean }> = new Map()\n private fieldDependencies: Map<string, Set<string>> = new Map() // campo observado -> campos dependientes\n\n constructor() {\n this.parser = new SchemaParser()\n this.validator = new ValidationEngine()\n this.conditionEngine = new ConditionEngine()\n this.state = this.createInitialState()\n }\n\n /**\n * Crea el estado inicial\n */\n private createInitialState(): FormState {\n return {\n values: {},\n errors: {},\n touched: {},\n isValid: true,\n isSubmitting: false,\n }\n }\n\n /**\n * Inicializa el schema\n */\n initializeSchema(schema: FormSchema, initialData?: Record<string, any>): void {\n this.schema = this.parser.parse(schema)\n this.initializeValues(initialData)\n this.initializeWizard()\n this.buildDependencyMap()\n }\n\n /**\n * Extrae todos los campos recursivamente (incluyendo groups, rows).\n * Los campos de array.itemSchema NO se incluyen como top-level: viven dentro de cada ítem.\n */\n private extractAllFields(fields: Field[]): Field[] {\n const allFields: Field[] = []\n \n for (const field of fields) {\n allFields.push(field)\n \n if (field.type === 'group' && 'fields' in field) {\n allFields.push(...this.extractAllFields(field.fields))\n }\n if (field.type === 'row' && 'fields' in field) {\n allFields.push(...this.extractAllFields(field.fields))\n }\n // Array: no extraer itemSchema.fields como top-level; se inicializan dentro de cada ítem\n }\n \n return allFields\n }\n\n /**\n * Devuelve los nombres de campos que solo existen dentro de itemSchema de arrays\n * y NO como campos top-level. Estos NO deben aparecer como claves en la raíz de values.\n */\n private getArrayItemOnlyFieldNames(fields: Field[]): Set<string> {\n const topLevelNames = new Set(fields.map((f) => f.name))\n const arrayItemNames = new Set<string>()\n for (const field of fields) {\n if (field.type === 'array' && 'itemSchema' in field && field.itemSchema?.fields) {\n for (const sub of field.itemSchema.fields) {\n if (!topLevelNames.has(sub.name)) {\n arrayItemNames.add(sub.name)\n }\n }\n }\n }\n return arrayItemNames\n }\n\n /**\n * Extrae todos los campos incluyendo arrays (para mapa de dependencias)\n * Retorna campos con su información de container\n */\n private extractAllFieldsWithArrays(\n fields: Field[], \n parentPath: string = '',\n containerType: 'root' | 'group' | 'row' | 'array' = 'root'\n ): Array<{ field: Field; fullPath: string; containerType: 'root' | 'group' | 'row' | 'array'; containerPath: string }> {\n const result: Array<{ field: Field; fullPath: string; containerType: 'root' | 'group' | 'row' | 'array'; containerPath: string }> = []\n \n for (const field of fields) {\n const fullPath = parentPath ? `${parentPath}.${field.name}` : field.name\n const containerPath = parentPath || ''\n \n result.push({\n field,\n fullPath,\n containerType,\n containerPath\n })\n \n if (field.type === 'group' && 'fields' in field) {\n result.push(...this.extractAllFieldsWithArrays(field.fields, fullPath, 'group'))\n }\n if (field.type === 'row' && 'fields' in field) {\n result.push(...this.extractAllFieldsWithArrays(field.fields, fullPath, 'row'))\n }\n if (field.type === 'array' && 'itemSchema' in field && field.itemSchema?.fields) {\n // Para arrays, los campos del itemSchema tienen el array como contenedor\n result.push(...this.extractAllFieldsWithArrays(field.itemSchema.fields, field.name, 'array'))\n }\n }\n \n return result\n }\n\n /**\n * Construye el mapa de dependencias para optimizar re-evaluaciones\n */\n private buildDependencyMap(): void {\n this.fieldDependencies.clear()\n this.dependencyCache.clear()\n\n if (!this.schema) return\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n // Usar extractAllFieldsWithArrays para incluir campos de arrays\n const allFieldsWithArrays = this.extractAllFieldsWithArrays(topLevelFields)\n\n for (const { field, fullPath, containerType, containerPath } of allFieldsWithArrays) {\n if (!field.dependencies) continue\n\n // Extraer todos los campos observados\n const observedFields = this.extractObservedFields(field.dependencies)\n \n for (const observedField of observedFields) {\n if (!this.fieldDependencies.has(observedField)) {\n this.fieldDependencies.set(observedField, new Set())\n }\n // Agregar con nombre relativo\n this.fieldDependencies.get(observedField)!.add(field.name)\n // Agregar con path completo si es diferente\n // Agregar con path completo si es diferente\n if (fullPath !== field.name) {\n this.fieldDependencies.get(observedField)!.add(fullPath)\n }\n // Para arrays, también registrar la dependencia contra el campo del array\n if (containerType === 'array' && containerPath) {\n if (!this.fieldDependencies.has(containerPath)) {\n this.fieldDependencies.set(containerPath, new Set())\n }\n this.fieldDependencies.get(containerPath)!.add(fullPath)\n }\n }\n }\n }\n\n /**\n * Extrae los nombres de campos observados de las dependencias\n */\n private extractObservedFields(dependencies: any): Set<string> {\n const fields = new Set<string>()\n\n const extractFromCondition = (condition: any) => {\n if (condition && condition.field) {\n fields.add(condition.field)\n }\n }\n\n const extractFromConditions = (conditions: any) => {\n if (Array.isArray(conditions)) {\n conditions.forEach(extractFromCondition)\n } else if (conditions) {\n extractFromCondition(conditions)\n }\n }\n\n if (dependencies.show) extractFromConditions(dependencies.show)\n if (dependencies.hide) extractFromConditions(dependencies.hide)\n if (dependencies.enable) extractFromConditions(dependencies.enable)\n if (dependencies.disable) extractFromConditions(dependencies.disable)\n if (dependencies.required) extractFromConditions(dependencies.required)\n if (dependencies.optional) extractFromConditions(dependencies.optional)\n\n return fields\n }\n\n /**\n * Inicializa los valores por defecto\n */\n private initializeValues(initialData?: Record<string, any>): void {\n if (!this.schema) return\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n const allFields = this.extractAllFields(topLevelFields)\n\n // Preservar valores existentes\n const existingValues = { ...this.state.values }\n const values: Record<string, any> = {}\n\n // Primero, cargar valores desde initialData si está disponible\n if (initialData) {\n for (const key in initialData) {\n const value = initialData[key]\n if (value !== undefined && value !== null) {\n setNestedValue(values, key, value)\n }\n }\n }\n\n // Luego, inicializar campos desde defaultValue o valores por defecto\n for (const field of allFields) {\n // Verificar si ya hay un valor desde initialData\n const existingValue = getNestedValue(values, field.name)\n \n // Si el campo ya tiene un valor desde initialData o existingValues, preservarlo\n if (existingValue !== undefined && existingValue !== null) {\n // Ya está inicializado desde initialData\n continue\n }\n \n // Verificar si hay un valor previo en existingValues\n const prevValue = getNestedValue(existingValues, field.name)\n if (prevValue !== undefined && prevValue !== null) {\n setNestedValue(values, field.name, prevValue)\n } else {\n // Solo inicializar si no existe valor previo\n this.initializeFieldValue(field, values)\n }\n }\n\n // Preservar valores de campos que no están en el schema actual (por si acaso)\n // Excluir nombres que son solo de itemSchema de arrays (street, city, etc.) — no deben estar en raíz\n const arrayItemOnlyNames = this.getArrayItemOnlyFieldNames(topLevelFields)\n for (const key in existingValues) {\n if (arrayItemOnlyNames.has(key)) continue\n if (!(key in values)) {\n values[key] = existingValues[key]\n }\n }\n\n // Rellenar arrays con initialData cuando length < minItems\n for (const field of topLevelFields) {\n if (field.type === 'array' && 'minItems' in field && 'itemSchema' in field) {\n const arrayField = field as { minItems?: number; itemSchema?: { fields?: Field[] } }\n const minItems = arrayField.minItems ?? 0\n if (minItems >= 1 && arrayField.itemSchema?.fields?.length) {\n const arr = getNestedValue(values, field.name)\n if (Array.isArray(arr) && arr.length < minItems) {\n const padded = [...arr]\n for (let i = arr.length; i < minItems; i++) {\n const item: Record<string, any> = {}\n for (const subField of arrayField.itemSchema!.fields!) {\n this.initializeFieldValue(subField, item)\n }\n padded.push(item)\n }\n setNestedValue(values, field.name, padded)\n }\n }\n }\n }\n\n // Eliminar claves que solo pertenecen a itemSchema de arrays (nunca deben estar en raíz)\n for (const name of arrayItemOnlyNames) {\n if (name in values) {\n delete values[name]\n }\n }\n\n this.state.values = values\n }\n\n /**\n * Inicializa el valor de un campo\n */\n private initializeFieldValue(\n field: Field,\n values: Record<string, any>\n ): void {\n if (field.defaultValue !== undefined) {\n values[field.name] = field.defaultValue\n } else {\n switch (field.type) {\n case 'checkbox':\n case 'switch':\n values[field.name] = field.checked || false\n break\n case 'select':\n if ('multiple' in field && field.multiple) {\n values[field.name] = []\n } else {\n values[field.name] = null\n }\n break\n case 'array': {\n const arrayField = field as { itemSchema?: { fields?: Field[] }; minItems?: number }\n const minItems = arrayField.minItems ?? 0\n const itemFields = arrayField.itemSchema?.fields\n if (minItems >= 1 && itemFields?.length) {\n const arr: Record<string, any>[] = []\n for (let i = 0; i < minItems; i++) {\n const item: Record<string, any> = {}\n for (const subField of itemFields) {\n this.initializeFieldValue(subField, item)\n }\n arr.push(item)\n }\n values[field.name] = arr\n } else {\n values[field.name] = []\n }\n break\n }\n case 'group':\n values[field.name] = {}\n if ('fields' in field) {\n for (const subField of field.fields) {\n this.initializeFieldValue(subField, values[field.name] as Record<string, any>)\n }\n }\n break\n case 'colorpicker':\n values[field.name] =\n (field as { defaultValue?: string }).defaultValue ?? '#000000'\n break\n default:\n values[field.name] = null\n }\n }\n }\n\n /**\n * Inicializa el estado del wizard\n */\n private initializeWizard(): void {\n if (!this.schema || !this.schema.isWizard) {\n this.wizardState = null\n return\n }\n\n this.wizardState = {\n currentStep: 0,\n totalSteps: this.schema.steps!.length,\n completedSteps: [],\n }\n }\n\n /**\n * Obtiene el estado actual\n */\n getState(): FormState {\n return { ...this.state }\n }\n\n /**\n * Obtiene el estado del wizard\n */\n getWizardState(): WizardState | null {\n return this.wizardState ? { ...this.wizardState } : null\n }\n\n /**\n * Obtiene un valor del formulario\n */\n getValue(fieldName: string): any {\n return getNestedValue(this.state.values, fieldName)\n }\n\n /**\n * Crea un ítem nuevo con valores por defecto para un campo array\n */\n createDefaultArrayItem(arrayField: Field): Record<string, any> {\n const itemSchema = (arrayField as { itemSchema?: { fields?: Field[] } }).itemSchema\n const itemFields = itemSchema?.fields\n if (!itemFields?.length) return {}\n const item: Record<string, any> = {}\n for (const subField of itemFields) {\n this.initializeFieldValue(subField, item)\n }\n return item\n }\n\n /**\n * Establece un valor\n */\n async setValue(fieldName: string, value: any): Promise<void> {\n setNestedValue(this.state.values, fieldName, value)\n this.state.touched[fieldName] = true\n\n // Invalidar cache de dependencias para campos que dependen de este\n this.invalidateDependencyCache(fieldName)\n\n // Validar el campo si está touched\n if (this.state.touched[fieldName] && this.schema) {\n await this.validateField(fieldName)\n }\n\n // Validar campos dependientes que ahora pueden tener diferentes validaciones\n const dependentFields = this.fieldDependencies.get(fieldName)\n if (dependentFields) {\n for (const dependentField of dependentFields) {\n await this.validateField(dependentField)\n }\n }\n\n this.updateValidity()\n }\n\n /**\n * Invalida el cache de dependencias para campos dependientes\n */\n private invalidateDependencyCache(fieldName: string): void {\n // Buscar por el nombre exacto\n let dependentFields = this.fieldDependencies.get(fieldName)\n \n if (dependentFields) {\n for (const dependentField of dependentFields) {\n this.dependencyCache.delete(dependentField)\n // También eliminar versiones con corchetes del dependent field\n const dependentFieldWithIndex = this.addArrayIndexToPath(fieldName, dependentField)\n if (dependentFieldWithIndex) {\n this.dependencyCache.delete(dependentFieldWithIndex)\n }\n }\n }\n \n // Para campos con notación de corchetes (arrays), también buscar por el nombre sin índice\n // addresses[0].type -> addresses.type -> type\n const fieldNameWithoutIndex = fieldName.replace(/\\[\\d+\\]/g, '')\n if (fieldNameWithoutIndex !== fieldName) {\n dependentFields = this.fieldDependencies.get(fieldNameWithoutIndex)\n if (dependentFields) {\n for (const dependentField of dependentFields) {\n this.dependencyCache.delete(dependentField)\n // Agregar índice si el campo dependiente no lo tiene\n const indexMatch = fieldName.match(/\\[(\\d+)\\]/)\n if (indexMatch) {\n const dependentWithIndex = dependentField.includes('[') \n ? dependentField \n : `${dependentField.split('.').slice(0, -1).join('.')}[${indexMatch[1]}].${dependentField.split('.').pop()}`\n this.dependencyCache.delete(dependentWithIndex)\n }\n }\n }\n \n // También buscar solo por el nombre del campo (sin prefijo de array)\n const baseFieldName = fieldNameWithoutIndex.split('.').pop()\n if (baseFieldName && baseFieldName !== fieldNameWithoutIndex) {\n dependentFields = this.fieldDependencies.get(baseFieldName)\n if (dependentFields) {\n for (const dependentField of dependentFields) {\n this.dependencyCache.delete(dependentField)\n // Agregar índice\n const indexMatch = fieldName.match(/\\[(\\d+)\\]/)\n if (indexMatch) {\n const arrayName = fieldName.split('.')[0].replace(/\\[\\d+\\]/, '')\n const dependentWithIndex = `${arrayName}[${indexMatch[1]}].${dependentField}`\n this.dependencyCache.delete(dependentWithIndex)\n }\n }\n }\n }\n }\n \n // También buscar por partes del path para manejar grupos\n const parts = fieldName.split('.')\n for (let i = 1; i < parts.length; i++) {\n if (parts[i].includes('[')) continue\n \n const partialPath = parts.slice(i).join('.')\n dependentFields = this.fieldDependencies.get(partialPath)\n if (dependentFields) {\n for (const dependentField of dependentFields) {\n this.dependencyCache.delete(dependentField)\n this.dependencyCache.delete(`${parts[0]}.${partialPath}`)\n }\n }\n }\n \n // También limpiar el cache del campo que cambió (por si acaso)\n this.dependencyCache.delete(fieldName)\n }\n\n /**\n * Agrega el índice de array al path del campo\n */\n private addArrayIndexToPath(sourcePath: string, targetPath: string): string | null {\n const indexMatch = sourcePath.match(/\\[(\\d+)\\]/)\n if (!indexMatch) return null\n \n const index = indexMatch[1]\n const sourceArray = sourcePath.split('.')[0]\n \n // Si el targetPath empieza con el mismo array, agregar índice\n if (targetPath.startsWith(sourceArray)) {\n // addresses.city -> addresses[0].city\n const parts = targetPath.split('.')\n if (parts.length > 1) {\n return `${parts[0]}[${index}].${parts.slice(1).join('.')}`\n }\n }\n return null\n }\n\n /**\n * Establece un valor sin validar (útil para preservar valores durante re-renderizado)\n */\n setValueWithoutValidation(fieldName: string, value: any): void {\n setNestedValue(this.state.values, fieldName, value)\n // Invalidar cache de dependencias para campos que dependen de este\n this.invalidateDependencyCache(fieldName)\n // No marcar como touched ni validar\n }\n\n /**\n * Valida un campo específico\n */\n async validateField(fieldName: string): Promise<void> {\n if (!this.schema) return\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n const allFields = this.extractAllFields(topLevelFields)\n const field = allFields.find((f) => f.name === fieldName)\n if (!field) return\n\n // Si el campo no es visible, no validar\n if (!this.getFieldVisibility(fieldName)) {\n delete this.state.errors[fieldName]\n return\n }\n\n const value = this.getValue(fieldName)\n \n // Obtener validaciones activas (incluyendo condicionales)\n const activeValidations = this.getActiveValidations(field)\n \n const errors = await this.validator.validateFieldWithValidations(\n field,\n value,\n activeValidations\n )\n\n if (errors.length > 0) {\n this.state.errors[fieldName] = errors\n } else {\n delete this.state.errors[fieldName]\n }\n }\n\n /**\n * Obtiene las validaciones activas para un campo (incluyendo condicionales)\n */\n private getActiveValidations(field: Field): any[] {\n let validations = [...(field.validations || [])]\n\n // Agregar validación anti-inyección automática para campos de texto\n const textFieldTypes = ['text', 'email', 'password', 'textarea']\n const skipInjection = field.skipInjectionValidation ?? (field.props as any)?.skipInjectionValidation\n if (\n textFieldTypes.includes(field.type) &&\n !skipInjection &&\n !validations.some((v) => v.type === 'noInjection')\n ) {\n validations = [{ type: 'noInjection' }, ...validations]\n }\n\n // Verificar si el campo es requerido dinámicamente a través de dependencias\n const isRequired = this.getFieldRequired(field.name)\n const hasRequiredValidation = validations.some(v => v.type === 'required')\n \n if (isRequired && !hasRequiredValidation) {\n // Agregar validación required si no existe\n validations = [{ type: 'required' }, ...validations]\n } else if (!isRequired && hasRequiredValidation) {\n // Remover validación required si el campo no es requerido dinámicamente\n validations = validations.filter(v => v.type !== 'required')\n }\n\n // Agregar validaciones condicionales si se cumplen las condiciones\n if (field.conditionalValidations) {\n for (const conditional of field.conditionalValidations) {\n const conditionMet = this.conditionEngine.evaluateConditions(\n conditional.condition,\n this.state.values\n )\n if (conditionMet) {\n validations = [...validations, ...conditional.validations]\n }\n }\n }\n\n return validations\n }\n\n /**\n * Valida todo el formulario\n */\n async validateForm(): Promise<Record<string, string[]>> {\n if (!this.schema) {\n return {}\n }\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n const allFields = this.extractAllFields(topLevelFields)\n const errors = await this.validator.validateForm(\n allFields,\n this.state.values\n )\n\n this.state.errors = errors\n this.updateValidity()\n\n return errors\n }\n\n /**\n * Actualiza la validez del formulario\n */\n private updateValidity(): void {\n this.state.isValid = Object.keys(this.state.errors).length === 0\n }\n\n /**\n * Marca un campo como touched\n */\n setTouched(fieldName: string): void {\n this.state.touched[fieldName] = true\n }\n\n /**\n * Obtiene los errores de un campo\n */\n getErrors(fieldName: string): string[] {\n return this.state.errors[fieldName] || []\n }\n\n /**\n * Obtiene todos los errores\n */\n getAllErrors(): Record<string, string[]> {\n return { ...this.state.errors }\n }\n\n /**\n * Resetea el formulario\n */\n reset(): void {\n this.state = this.createInitialState()\n if (this.schema) {\n this.initializeValues()\n this.initializeWizard()\n }\n }\n\n /**\n * Avanza al siguiente step del wizard\n */\n nextStep(): boolean {\n if (!this.wizardState) return false\n if (this.wizardState.currentStep < this.wizardState.totalSteps - 1) {\n this.wizardState.currentStep++\n return true\n }\n return false\n }\n\n /**\n * Retrocede al step anterior del wizard\n */\n previousStep(): boolean {\n if (!this.wizardState) return false\n if (this.wizardState.currentStep > 0) {\n this.wizardState.currentStep--\n return true\n }\n return false\n }\n\n /**\n * Va a un step específico\n */\n goToStep(stepIndex: number): boolean {\n if (!this.wizardState) return false\n if (stepIndex >= 0 && stepIndex < this.wizardState.totalSteps) {\n this.wizardState.currentStep = stepIndex\n return true\n }\n return false\n }\n\n /**\n * Marca un step como completado\n */\n completeStep(stepIndex: number): void {\n if (!this.wizardState) return\n if (!this.wizardState.completedSteps.includes(stepIndex)) {\n this.wizardState.completedSteps.push(stepIndex)\n }\n }\n\n /**\n * Establece el estado de submitting\n */\n setSubmitting(isSubmitting: boolean): void {\n this.state.isSubmitting = isSubmitting\n }\n\n /**\n * Obtiene los campos del step actual\n */\n getCurrentStepFields(): Field[] {\n if (!this.schema || !this.schema.isWizard || !this.wizardState) {\n return this.schema?.fields || []\n }\n return this.schema.steps![this.wizardState.currentStep].fields\n }\n\n /**\n * Obtiene la visibilidad de un campo basándose en dependencias\n */\n getFieldVisibility(fieldName: string): boolean {\n // Verificar cache primero\n const cached = this.dependencyCache.get(fieldName)\n if (cached !== undefined) {\n return cached.visible\n }\n\n if (!this.schema) return true\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n // Usar extractAllFieldsWithArrays para incluir campos de arrays\n const allFieldsWithArrays = this.extractAllFieldsWithArrays(topLevelFields)\n\n // Buscar el campo por nombre completo primero\n let fieldInfo = allFieldsWithArrays.find((f) => f.fullPath === fieldName || f.field.name === fieldName)\n \n // Si no se encuentra, buscar por nombre relativo (sin índice para arrays)\n if (!fieldInfo) {\n // Extraer el nombre sin índice: phones[0].extension -> phones.extension\n const fieldNameWithoutIndex = fieldName.replace(/\\[\\d+\\]/g, '')\n fieldInfo = allFieldsWithArrays.find((f) => f.field.name === fieldNameWithoutIndex || f.fullPath === fieldNameWithoutIndex)\n }\n \n // Si aún no se encuentra, buscar solo por nombre de campo\n if (!fieldInfo) {\n const baseFieldName = fieldName.split('.').pop()\n fieldInfo = allFieldsWithArrays.find((f) => f.field.name === baseFieldName)\n }\n \n if (!fieldInfo || !fieldInfo.field.dependencies) {\n return !fieldInfo?.field.hidden\n }\n\n const { field, containerType, containerPath } = fieldInfo\n const dependencies = fieldInfo.field.dependencies!\n\n // Crear el contexto de valores según el tipo de contenedor\n let valuesContext: Record<string, any> = { ...this.state.values }\n\n if (containerType === 'array' && containerPath) {\n // Para arrays, verificar el valor del campo observador\n // Los valores pueden estar en el array real O en claves con notación de corchetes (phones[0].type)\n \n // Extraer el nombre del campo observador de las dependencias\n let observerField: string | undefined\n const getObserverField = (deps: any): string | undefined => {\n if (!deps) return undefined\n if (Array.isArray(deps)) {\n return deps[0]?.field\n }\n return deps.field\n }\n \n observerField = getObserverField(dependencies.show) || \n getObserverField(dependencies.hide) || \n getObserverField(dependencies.enable) ||\n getObserverField(dependencies.disable) ||\n getObserverField(dependencies.required) ||\n getObserverField(dependencies.optional)\n\n if (observerField && observerField) {\n // Extraer el índice del path del campo (si lo hay)\n // phones[0].extension -> index 0\n const indexMatch = fieldName.match(/\\[(\\d+)\\]/)\n const itemIndex = indexMatch ? parseInt(indexMatch[1], 10) : null\n \n // Buscar el valor del campo observador\n let observerValue: any = null\n \n if (itemIndex !== null) {\n // 1. Buscar en el array real en el índice específico\n const arrayValue = getNestedValue(this.state.values, containerPath)\n if (Array.isArray(arrayValue) && arrayValue[itemIndex]) {\n observerValue = arrayValue[itemIndex][observerField]\n }\n \n // 2. Si no se encuentra, buscar con notación de corchetes\n if (observerValue === null || observerValue === undefined) {\n const bracketKey = `${containerPath}[${itemIndex}]`\n const bracketObj = this.state.values[bracketKey]\n if (bracketObj && typeof bracketObj === 'object') {\n observerValue = bracketObj[observerField]\n }\n }\n } else {\n // Sin índice específico, buscar en cualquier ítem\n const arrayValue = getNestedValue(this.state.values, containerPath)\n if (Array.isArray(arrayValue)) {\n for (const item of arrayValue) {\n if (item && item[observerField!] !== undefined) {\n observerValue = item[observerField!]\n break\n }\n }\n }\n }\n\n // Evaluar la dependencia con el valor encontrado\n if (observerValue !== null && observerValue !== undefined) {\n const itemContext: Record<string, any> = { ...this.state.values }\n itemContext[observerField!] = observerValue\n \n const result = this.conditionEngine.evaluateDependencies(dependencies, itemContext)\n this.dependencyCache.set(fieldName, result)\n return result.visible && !field.hidden\n }\n }\n \n // Si no se puede determinar el valor, retornar visible por defecto\n const result = { visible: true, enabled: true, required: false }\n this.dependencyCache.set(fieldName, result)\n return result.visible && !field.hidden\n } else if (containerPath) {\n // Para grupos/rows, usar la lógica existente\n const containerValues = getNestedValue(this.state.values, containerPath)\n if (containerValues && typeof containerValues === 'object') {\n const createRelativeContext = (obj: any, prefix: string = ''): Record<string, any> => {\n const result: Record<string, any> = {}\n const entries = Object.entries(obj)\n \n for (const [key, value] of entries) {\n const relativeKey = prefix ? `${prefix}.${key}` : key\n if (value && typeof value === 'object' && !Array.isArray(value) && value !== null) {\n Object.assign(result, createRelativeContext(value, relativeKey))\n }\n }\n \n for (const [key, value] of entries) {\n const relativeKey = prefix ? `${prefix}.${key}` : key\n if (!(value && typeof value === 'object' && !Array.isArray(value) && value !== null)) {\n if (!(relativeKey in result)) {\n result[relativeKey] = value\n }\n }\n }\n \n return result\n }\n const relativeContext = createRelativeContext(containerValues)\n valuesContext = { ...this.state.values, ...relativeContext }\n }\n }\n\n const result = this.conditionEngine.evaluateDependencies(\n dependencies,\n valuesContext\n )\n\n // Cachear resultado\n this.dependencyCache.set(fieldName, result)\n\n return result.visible && !field.hidden\n }\n\n /**\n * Obtiene si un campo está habilitado basándose en dependencias\n */\n getFieldEnabled(fieldName: string): boolean {\n // Verificar cache primero\n const cached = this.dependencyCache.get(fieldName)\n if (cached !== undefined) {\n return cached.enabled\n }\n\n if (!this.schema) return true\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n const allFields = this.extractAllFields(topLevelFields)\n const field = allFields.find((f) => f.name === fieldName)\n if (!field) return true\n\n if (field.disabled) return false\n\n if (!field.dependencies) {\n return true\n }\n\n const result = this.conditionEngine.evaluateDependencies(\n field.dependencies,\n this.state.values\n )\n\n // Cachear resultado\n this.dependencyCache.set(fieldName, result)\n\n return result.enabled\n }\n\n /**\n * Obtiene si un campo es requerido basándose en dependencias\n */\n getFieldRequired(fieldName: string): boolean {\n // Verificar cache primero\n const cached = this.dependencyCache.get(fieldName)\n if (cached !== undefined) {\n return cached.required\n }\n\n if (!this.schema) return false\n\n const topLevelFields = this.schema.isWizard\n ? this.schema.steps!.flatMap((step) => step.fields)\n : this.schema.fields || []\n\n const allFields = this.extractAllFields(topLevelFields)\n\n const field = allFields.find((f) => f.name === fieldName)\n if (!field) return false\n\n // Verificar si tiene validación required estándar\n const hasRequired = field.validations?.some((v) => v.type === 'required') || false\n\n if (!field.dependencies) {\n return hasRequired\n }\n\n const result = this.conditionEngine.evaluateDependencies(\n field.dependencies,\n this.state.values\n )\n\n // Cachear resultado\n this.dependencyCache.set(fieldName, result)\n\n return result.required || hasRequired\n }\n\n /**\n * Obtiene los campos que dependen de un campo específico\n */\n getDependentFields(fieldName: string): string[] {\n return Array.from(this.fieldDependencies.get(fieldName) || [])\n }\n}\n","import type { Field, SlotContent } from '../../types'\n\n/**\n * Clase base para inputs\n */\nexport abstract class BaseInput {\n protected field: Field\n protected value: any\n protected error?: string\n protected onChange: (value: any) => void\n protected onBlur: () => void\n\n constructor(\n field: Field,\n value: any,\n error: string | undefined,\n onChange: (value: any) => void,\n onBlur: () => void\n ) {\n this.field = field\n this.value = value\n this.error = error\n this.onChange = onChange\n this.onBlur = onBlur\n }\n\n /**\n * Renderiza el input\n */\n abstract render(): HTMLElement\n\n /**\n * Crea wrapper con slots leading/trailing si el campo tiene leadingIcon o trailingIcon.\n * Si no hay slots, devuelve el input sin wrapper (retrocompatibilidad).\n */\n protected createInputWithSlots(rawInput: HTMLElement): HTMLElement {\n const leading = this.field.leadingIcon\n const trailing = this.field.trailingIcon\n if (!leading && !trailing) {\n return rawInput\n }\n\n const wrapper = document.createElement('div')\n wrapper.className = 'easy-form-input-wrapper'\n\n if (leading && this.isSlotContentValid(leading)) {\n const slotEl = this.renderSlotContent(leading)\n slotEl.className = 'easy-form-input-slot easy-form-input-slot-leading'\n wrapper.appendChild(slotEl)\n }\n\n const inputWrap = document.createElement('div')\n inputWrap.className = 'easy-form-input-core'\n inputWrap.appendChild(rawInput)\n wrapper.appendChild(inputWrap)\n\n if (trailing && this.isSlotContentValid(trailing)) {\n const slotEl = this.renderSlotContent(trailing)\n slotEl.className = 'easy-form-input-slot easy-form-input-slot-trailing'\n wrapper.appendChild(slotEl)\n }\n\n return wrapper\n }\n\n private isSlotContentValid(slot: SlotContent): boolean {\n if (!slot.type) return false\n if (slot.type === 'image') return Boolean(slot.src)\n if (slot.type === 'html') return Boolean(slot.html)\n return false\n }\n\n private renderSlotContent(slot: SlotContent): HTMLElement {\n const container = document.createElement('span')\n container.className = 'easy-form-input-slot-content'\n if (slot.type === 'image' && slot.src) {\n const img = document.createElement('img')\n img.src = slot.src\n img.alt = slot.alt ?? ''\n img.setAttribute('aria-hidden', 'true')\n container.appendChild(img)\n } else if (slot.type === 'html' && slot.html) {\n container.innerHTML = slot.html\n }\n return container\n }\n\n /**\n * Crea un contenedor con label y error\n */\n protected createFieldContainer(input: HTMLElement): HTMLElement {\n const container = document.createElement('div')\n \n // Si el input es un contenedor con clases específicas de componentes, preservarlas\n const inputClasses = Array.from(input.classList)\n const componentContainerClasses = inputClasses.filter(\n (cls) => cls.startsWith('easy-form-') && \n cls !== 'easy-form-field' &&\n (cls.includes('-container') || cls.includes('-wrapper'))\n )\n \n const labelPosition = (this.field as { labelPosition?: 'up' | 'down' | 'left' | 'right' | 'none' }).labelPosition ?? 'up'\n\n const inputToAppend = this.createInputWithSlots(input)\n\n if (componentContainerClasses.length > 0) {\n container.className = `easy-form-field easy-form-label-${labelPosition} ${componentContainerClasses.join(' ')}`\n } else {\n container.className = `easy-form-field easy-form-label-${labelPosition}`\n }\n\n // Aplicar aria-label si labelPosition es 'none' y hay label\n if (labelPosition === 'none' && this.field.label) {\n const el = inputToAppend.querySelector('input, textarea, select') || inputToAppend\n if (el instanceof HTMLElement) {\n el.setAttribute('aria-label', this.field.label)\n }\n }\n\n const createLabel = (): HTMLLabelElement | null => {\n if (!this.field.label || labelPosition === 'none') return null\n const label = document.createElement('label')\n label.className = 'easy-form-label'\n label.setAttribute('for', this.getFieldId())\n label.textContent = this.field.label\n if (this.field.validations?.some((v) => v.type === 'required')) {\n const required = document.createElement('span')\n required.className = 'easy-form-required'\n required.textContent = ' *'\n label.appendChild(required)\n }\n return label\n }\n\n const label = createLabel()\n\n // Orden según labelPosition\n if (labelPosition === 'up') {\n if (label) container.appendChild(label)\n container.appendChild(inputToAppend)\n } else if (labelPosition === 'down') {\n container.appendChild(inputToAppend)\n if (label) container.appendChild(label)\n } else if (labelPosition === 'left') {\n const inner = document.createElement('div')\n inner.className = 'easy-form-field-inner easy-form-field-inner-horizontal'\n if (label) inner.appendChild(label)\n inner.appendChild(inputToAppend)\n container.appendChild(inner)\n } else if (labelPosition === 'right') {\n const inner = document.createElement('div')\n inner.className = 'easy-form-field-inner easy-form-field-inner-horizontal'\n inner.appendChild(inputToAppend)\n if (label) inner.appendChild(label)\n container.appendChild(inner)\n } else {\n container.appendChild(inputToAppend)\n }\n\n // Description\n if (this.field.description) {\n const description = document.createElement('p')\n description.className = 'easy-form-description'\n description.textContent = this.field.description\n container.appendChild(description)\n }\n\n // Error\n if (this.error) {\n const errorEl = document.createElement('p')\n errorEl.className = 'easy-form-error'\n errorEl.textContent = this.error\n container.appendChild(errorEl)\n }\n\n return container\n }\n\n /**\n * Obtiene el ID del campo\n */\n protected getFieldId(): string {\n return `easy-form-${this.field.name}`\n }\n\n /**\n * Aplica props comunes a un elemento\n */\n protected applyCommonProps(element: HTMLElement): void {\n element.id = this.getFieldId()\n element.setAttribute('name', this.field.name)\n\n if (this.field.disabled) {\n element.setAttribute('disabled', 'true')\n element.classList.add('easy-form-input-disabled')\n }\n\n if (this.field.hidden) {\n element.style.display = 'none'\n element.classList.add('easy-form-field-hidden')\n }\n\n if (this.error) {\n element.classList.add('easy-form-input-error')\n }\n\n if (this.field.props) {\n for (const [key, value] of Object.entries(this.field.props)) {\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n element.setAttribute(key, String(value))\n }\n }\n }\n }\n}\n","/**\n * Token de máscara\n */\nexport interface MaskToken {\n type: 'digit' | 'letter' | 'any' | 'literal'\n char: string\n editable: boolean\n}\n\n/**\n * Parsea un patrón de máscara en tokens\n */\nexport function parseMaskPattern(pattern: string): MaskToken[] {\n const tokens: MaskToken[] = []\n\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]\n\n switch (char) {\n case '9':\n tokens.push({ type: 'digit', char: '9', editable: true })\n break\n case 'a':\n case 'A':\n tokens.push({ type: 'letter', char: char, editable: true })\n break\n case '*':\n tokens.push({ type: 'any', char: '*', editable: true })\n break\n default:\n tokens.push({ type: 'literal', char: char, editable: false })\n break\n }\n }\n\n return tokens\n}\n\n/**\n * Formatea un valor según los tokens de máscara\n */\nexport function formatValue(value: string, tokens: MaskToken[]): string {\n let result = ''\n let valueIndex = 0\n\n for (const token of tokens) {\n if (!token.editable) {\n result += token.char\n continue\n }\n\n if (valueIndex >= value.length) {\n break\n }\n\n const char = value[valueIndex]\n\n // Validar según el tipo de token\n if (token.type === 'digit' && !/\\d/.test(char)) {\n continue // Saltar caracteres no numéricos\n } else if (token.type === 'letter' && !/[a-zA-Z]/.test(char)) {\n continue // Saltar caracteres no alfabéticos\n } else if (token.type === 'any') {\n // Aceptar cualquier carácter\n } else if (token.type !== 'any' && token.type !== 'digit' && token.type !== 'letter') {\n continue\n }\n\n result += char\n valueIndex++\n }\n\n return result\n}\n\n/**\n * Remueve el formato de un valor (obtiene solo los caracteres editables)\n */\nexport function unformatValue(value: string, tokens: MaskToken[]): string {\n if (!value) return ''\n\n let result = ''\n let tokenIndex = 0\n\n for (let i = 0; i < value.length && tokenIndex < tokens.length; i++) {\n const char = value[i]\n const token = tokens[tokenIndex]\n\n if (token.editable) {\n // Verificar si el carácter coincide con el tipo de token\n if (token.type === 'digit' && /\\d/.test(char)) {\n result += char\n tokenIndex++\n } else if (token.type === 'letter' && /[a-zA-Z]/.test(char)) {\n result += char\n tokenIndex++\n } else if (token.type === 'any') {\n result += char\n tokenIndex++\n } else {\n // Carácter no válido para este token, avanzar al siguiente token editable\n tokenIndex++\n i-- // Revisar el mismo carácter con el siguiente token\n }\n } else {\n // Token literal, verificar si coincide\n if (char === token.char) {\n tokenIndex++\n } else {\n // El carácter no coincide con el literal esperado, puede ser un carácter editable extra\n // Intentar extraerlo si es válido\n if (tokenIndex < tokens.length - 1) {\n const nextToken = tokens[tokenIndex + 1]\n if (nextToken && nextToken.editable) {\n if (nextToken.type === 'digit' && /\\d/.test(char)) {\n result += char\n tokenIndex += 2\n } else if (nextToken.type === 'letter' && /[a-zA-Z]/.test(char)) {\n result += char\n tokenIndex += 2\n } else if (nextToken.type === 'any') {\n result += char\n tokenIndex += 2\n } else {\n tokenIndex++\n }\n } else {\n tokenIndex++\n }\n } else {\n break\n }\n }\n }\n }\n\n return result\n}\n\n/**\n * Obtiene la siguiente posición editable\n */\nexport function getNextEditablePosition(\n position: number,\n tokens: MaskToken[],\n direction: 'forward' | 'backward' = 'forward'\n): number {\n if (direction === 'forward') {\n for (let i = position + 1; i < tokens.length; i++) {\n if (tokens[i].editable) {\n return i\n }\n }\n return tokens.length\n } else {\n for (let i = position - 1; i >= 0; i--) {\n if (tokens[i].editable) {\n return i\n }\n }\n return 0\n }\n}\n\n/**\n * Obtiene el placeholder completo para una máscara\n */\nexport function getMaskPlaceholder(tokens: MaskToken[], placeholder: string = '_'): string {\n return tokens\n .map((token) => (token.editable ? placeholder : token.char))\n .join('')\n}\n\n/**\n * Calcula la posición del cursor después de aplicar máscara\n */\nexport function calculateCursorPosition(\n oldValue: string,\n newValue: string,\n oldCursorPosition: number,\n tokens: MaskToken[]\n): number {\n // Contar caracteres editables antes de la posición anterior\n let editableBeforeOld = 0\n for (let i = 0; i < Math.min(oldCursorPosition, oldValue.length); i++) {\n const tokenIndex = i\n if (tokenIndex < tokens.length && tokens[tokenIndex].editable) {\n editableBeforeOld++\n }\n }\n\n // Encontrar la posición correspondiente en el nuevo valor\n let editableCount = 0\n for (let i = 0; i < newValue.length && i < tokens.length; i++) {\n if (tokens[i].editable) {\n editableCount++\n if (editableCount > editableBeforeOld) {\n return i + 1\n }\n }\n }\n\n // Si no encontramos, buscar la siguiente posición editable\n return getNextEditablePosition(\n Math.min(oldCursorPosition, newValue.length - 1),\n tokens,\n 'forward'\n )\n}\n","import type { MaskConfig, CustomMask } from '../types'\nimport { getPredefinedMask } from '../utils/masks'\nimport {\n parseMaskPattern,\n formatValue,\n unformatValue,\n getNextEditablePosition,\n getMaskPlaceholder,\n calculateCursorPosition,\n type MaskToken,\n} from '../utils/mask-helpers'\n\n/**\n * Motor de máscaras\n */\nexport class MaskEngine {\n private tokenCache: Map<string, MaskToken[]> = new Map()\n\n /**\n * Obtiene la configuración de máscara personalizada\n */\n private getCustomMask(mask: MaskConfig): CustomMask | null {\n if (mask.custom) {\n return mask.custom\n }\n if (mask.type) {\n return getPredefinedMask(mask.type)\n }\n return null\n }\n\n /**\n * Obtiene los tokens parseados de una máscara (con cache)\n */\n private getTokens(mask: MaskConfig): MaskToken[] | null {\n const customMask = this.getCustomMask(mask)\n if (!customMask) {\n return null\n }\n\n const cacheKey = customMask.pattern\n if (this.tokenCache.has(cacheKey)) {\n return this.tokenCache.get(cacheKey)!\n }\n\n const tokens = parseMaskPattern(customMask.pattern)\n this.tokenCache.set(cacheKey, tokens)\n return tokens\n }\n\n /**\n * Aplica máscara a un valor\n */\n applyMask(value: string, mask: MaskConfig): string {\n const tokens = this.getTokens(mask)\n if (!tokens) {\n return value\n }\n\n const customMask = this.getCustomMask(mask)!\n // Extraer solo caracteres editables del valor\n const editableTokens = tokens.filter(t => t.editable)\n const acceptedTypes = new Set(editableTokens.map(t => t.type))\n let unformatted = ''\n for (const char of value) {\n if (acceptedTypes.has('any')) {\n unformatted += char\n } else if (acceptedTypes.has('digit') && /\\d/.test(char)) {\n unformatted += char\n } else if (acceptedTypes.has('letter') && /[a-zA-Z]/.test(char)) {\n unformatted += char\n }\n }\n let formatted = formatValue(unformatted, tokens)\n\n // Aplicar transformación si existe\n if (customMask.transform) {\n formatted = customMask.transform(formatted)\n // Re-formatear después de la transformación\n formatted = formatValue(formatted, tokens)\n }\n\n return formatted\n }\n\n /**\n * Remueve máscara de un valor (obtiene valor raw)\n */\n removeMask(value: string, mask: MaskConfig): string {\n const tokens = this.getTokens(mask)\n if (!tokens) {\n return value\n }\n\n return unformatValue(value, tokens)\n }\n\n /**\n * Obtiene el placeholder para una máscara\n */\n getMaskPlaceholder(mask: MaskConfig): string {\n const tokens = this.getTokens(mask)\n if (!tokens) {\n return ''\n }\n\n const customMask = this.getCustomMask(mask)!\n return getMaskPlaceholder(tokens, customMask.placeholder || '_')\n }\n\n /**\n * Valida si un carácter puede ser insertado en una posición\n */\n canInsertChar(char: string, position: number, mask: MaskConfig): boolean {\n const tokens = this.getTokens(mask)\n if (!tokens || position >= tokens.length) {\n return false\n }\n\n const token = tokens[position]\n if (!token.editable) {\n return false\n }\n\n switch (token.type) {\n case 'digit':\n return /\\d/.test(char)\n case 'letter':\n return /[a-zA-Z]/.test(char)\n case 'any':\n return true\n default:\n return false\n }\n }\n\n /**\n * Procesa entrada del usuario aplicando máscara en tiempo real\n */\n processInput(\n input: string,\n previousValue: string,\n mask: MaskConfig,\n cursorPosition: number\n ): { value: string; cursorPosition: number } {\n const tokens = this.getTokens(mask)\n if (!tokens) {\n return { value: input, cursorPosition: input.length }\n }\n\n // Obtener el valor sin formato del input actual\n const unformattedInput = unformatValue(input, tokens)\n\n // Aplicar máscara al nuevo valor\n let formatted = formatValue(unformattedInput, tokens)\n\n // Aplicar transformación si existe\n const customMask = this.getCustomMask(mask)!\n if (customMask.transform) {\n formatted = customMask.transform(formatted)\n formatted = formatValue(formatted, tokens)\n }\n\n // Calcular nueva posición del cursor\n const newCursorPosition = calculateCursorPosition(\n previousValue,\n formatted,\n cursorPosition,\n tokens\n )\n\n return {\n value: formatted,\n cursorPosition: Math.min(newCursorPosition, formatted.length),\n }\n }\n\n /**\n * Procesa entrada con manejo de backspace/delete\n */\n processKeyInput(\n key: string,\n currentValue: string,\n cursorPosition: number,\n mask: MaskConfig,\n isBackspace: boolean = false\n ): { value: string; cursorPosition: number } {\n const tokens = this.getTokens(mask)\n if (!tokens) {\n return { value: currentValue, cursorPosition: cursorPosition }\n }\n\n if (isBackspace) {\n // Manejar backspace\n if (cursorPosition === 0) {\n return { value: currentValue, cursorPosition: 0 }\n }\n\n // Encontrar la posición editable anterior\n const prevEditable = getNextEditablePosition(cursorPosition - 1, tokens, 'backward')\n \n // Remover el carácter en esa posición\n const before = currentValue.substring(0, prevEditable)\n const after = currentValue.substring(cursorPosition)\n const newValue = before + after\n\n // Re-aplicar máscara\n const unformatted = this.removeMask(newValue, mask)\n const formatted = this.applyMask(unformatted, mask)\n\n // Calcular nueva posición\n const newPos = Math.max(0, prevEditable - 1)\n const nextEditable = getNextEditablePosition(newPos, tokens, 'forward')\n\n return {\n value: formatted,\n cursorPosition: nextEditable,\n }\n }\n\n // Manejar entrada normal\n if (key.length === 1 && this.canInsertChar(key, cursorPosition, mask)) {\n // Insertar carácter en la posición actual\n const before = currentValue.substring(0, cursorPosition)\n const after = currentValue.substring(cursorPosition)\n const newValue = before + key + after\n\n return this.processInput(newValue, currentValue, mask, cursorPosition)\n }\n\n return { value: currentValue, cursorPosition: cursorPosition }\n }\n}\n","import { BaseInput } from './base-input'\nimport type { Field } from '../../types'\nimport { MaskEngine } from '../../core/mask-engine'\n\nexport class TextInput extends BaseInput {\n private maskEngine: MaskEngine | null = null\n private previousValue: string = ''\n\n constructor(\n field: Field,\n value: any,\n error: string | undefined,\n onChange: (value: any) => void,\n onBlur: () => void\n ) {\n super(field, value, error, onChange, onBlur)\n \n if (field.mask) {\n this.maskEngine = new MaskEngine()\n }\n }\n\n render(): HTMLElement {\n const input = document.createElement('input')\n input.type = this.field.type === 'email' ? 'email' : this.field.type === 'password' ? 'password' : 'text'\n \n // Aplicar máscara si existe\n let displayValue = this.value ?? ''\n if (this.maskEngine && this.field.mask) {\n if (displayValue) {\n displayValue = this.maskEngine.applyMask(String(displayValue), this.field.mask)\n }\n this.previousValue = displayValue\n }\n \n input.value = displayValue\n\n this.applyCommonProps(input)\n\n // Aplicar placeholder del field si está definido (después de applyCommonProps)\n if (this.field.placeholder) {\n input.placeholder = this.field.placeholder\n } else if (this.maskEngine && this.field.mask) {\n // Aplicar placeholder de máscara si no hay placeholder del field\n const maskPlaceholder = this.maskEngine.getMaskPlaceholder(this.field.mask)\n if (maskPlaceholder) {\n input.placeholder = maskPlaceholder\n }\n }\n\n // Manejar eventos de entrada con máscara\n if (this.maskEngine && this.field.mask) {\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n const cursorPosition = target.selectionStart || 0\n const inputValue = target.value\n\n const result = this.maskEngine!.processInput(\n inputValue,\n this.previousValue,\n this.field.mask!,\n cursorPosition\n )\n\n // Actualizar valor y cursor\n target.value = result.value\n this.previousValue = result.value\n\n // Restaurar posición del cursor\n setTimeout(() => {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition)\n }, 0)\n\n // Emitir valor según configuración (con o sin formato)\n const valueToEmit = this.field.mask!.keepFormat\n ? result.value\n : this.maskEngine!.removeMask(result.value, this.field.mask!)\n\n this.onChange(valueToEmit)\n })\n\n input.addEventListener('keydown', (e) => {\n const target = e.target as HTMLInputElement\n const cursorPosition = target.selectionStart || 0\n\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault()\n \n const isBackspace = e.key === 'Backspace'\n const result = this.maskEngine!.processKeyInput(\n '',\n target.value,\n cursorPosition,\n this.field.mask!,\n isBackspace\n )\n\n target.value = result.value\n this.previousValue = result.value\n\n setTimeout(() => {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition)\n }, 0)\n\n const valueToEmit = this.field.mask!.keepFormat\n ? result.value\n : this.maskEngine!.removeMask(result.value, this.field.mask!)\n\n this.onChange(valueToEmit)\n }\n })\n\n input.addEventListener('paste', (e) => {\n e.preventDefault()\n const pastedText = (e.clipboardData || (window as any).clipboardData).getData('text')\n \n if (pastedText) {\n const target = e.target as HTMLInputElement\n const cursorPosition = target.selectionStart || 0\n \n // Insertar texto pegado\n const before = target.value.substring(0, cursorPosition)\n const after = target.value.substring(cursorPosition)\n const newValue = before + pastedText + after\n\n const result = this.maskEngine!.processInput(\n newValue,\n this.previousValue,\n this.field.mask!,\n cursorPosition\n )\n\n target.value = result.value\n this.previousValue = result.value\n\n setTimeout(() => {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition)\n }, 0)\n\n const valueToEmit = this.field.mask!.keepFormat\n ? result.value\n : this.maskEngine!.removeMask(result.value, this.field.mask!)\n\n this.onChange(valueToEmit)\n }\n })\n } else {\n // Sin máscara, comportamiento normal\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n this.onChange(target.value)\n })\n }\n\n input.addEventListener('blur', () => {\n this.onBlur()\n })\n\n return this.createFieldContainer(input)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { NumberField } from '../../types'\nimport { MaskEngine } from '../../core/mask-engine'\n\nexport class NumberInput extends BaseInput {\n private maskEngine: MaskEngine | null = null\n private previousValue: string = ''\n\n constructor(\n field: NumberField,\n value: any,\n error: string | undefined,\n onChange: (value: any) => void,\n onBlur: () => void\n ) {\n super(field, value, error, onChange, onBlur)\n \n if (field.mask) {\n this.maskEngine = new MaskEngine()\n }\n }\n\n render(): HTMLElement {\n const input = document.createElement('input')\n \n // Si tiene máscara, usar tipo text para mejor control\n if (this.maskEngine && this.field.mask) {\n input.type = 'text'\n \n // Aplicar máscara al valor inicial\n let displayValue = this.value ?? ''\n if (displayValue !== null && displayValue !== '') {\n if (this.field.mask.type === 'currency') {\n displayValue = this.maskEngine.applyMask(String(displayValue), this.field.mask)\n } else if (this.field.mask.type === 'percentage') {\n displayValue = this.maskEngine.applyMask(String(displayValue), this.field.mask)\n }\n }\n this.previousValue = displayValue\n input.value = displayValue\n } else {\n input.type = 'number'\n input.value = this.value ?? ''\n }\n\n const numberField = this.field as NumberField\n if (!this.maskEngine && input.type === 'number') {\n if (numberField.min !== undefined) {\n input.min = String(numberField.min)\n }\n if (numberField.max !== undefined) {\n input.max = String(numberField.max)\n }\n if (numberField.step !== undefined) {\n input.step = String(numberField.step)\n }\n }\n\n this.applyCommonProps(input)\n\n // Aplicar placeholder del field si está definido\n if (this.field.placeholder) {\n input.placeholder = this.field.placeholder\n } else if (this.maskEngine && this.field.mask) {\n // Aplicar placeholder de máscara si no hay placeholder del field\n const maskPlaceholder = this.maskEngine.getMaskPlaceholder(this.field.mask)\n if (maskPlaceholder) {\n input.placeholder = maskPlaceholder\n }\n }\n\n // Manejar eventos con máscara\n if (this.maskEngine && this.field.mask) {\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n const cursorPosition = target.selectionStart || 0\n const inputValue = target.value\n\n const result = this.maskEngine!.processInput(\n inputValue,\n this.previousValue,\n this.field.mask!,\n cursorPosition\n )\n\n target.value = result.value\n this.previousValue = result.value\n\n setTimeout(() => {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition)\n }, 0)\n\n // Convertir a número según el tipo de máscara\n let numValue: number | null = null\n if (this.field.mask!.type === 'currency') {\n const unformatted = this.maskEngine!.removeMask(result.value, this.field.mask!)\n numValue = unformatted ? parseFloat(unformatted.replace(/[^\\d.]/g, '')) : null\n } else if (this.field.mask!.type === 'percentage') {\n const unformatted = this.maskEngine!.removeMask(result.value, this.field.mask!)\n numValue = unformatted ? parseFloat(unformatted) : null\n }\n\n this.onChange(numValue)\n })\n\n input.addEventListener('keydown', (e) => {\n const target = e.target as HTMLInputElement\n const cursorPosition = target.selectionStart || 0\n\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault()\n \n const isBackspace = e.key === 'Backspace'\n const result = this.maskEngine!.processKeyInput(\n '',\n target.value,\n cursorPosition,\n this.field.mask!,\n isBackspace\n )\n\n target.value = result.value\n this.previousValue = result.value\n\n setTimeout(() => {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition)\n }, 0)\n\n let numValue: number | null = null\n if (this.field.mask!.type === 'currency') {\n const unformatted = this.maskEngine!.removeMask(result.value, this.field.mask!)\n numValue = unformatted ? parseFloat(unformatted.replace(/[^\\d.]/g, '')) : null\n } else if (this.field.mask!.type === 'percentage') {\n const unformatted = this.maskEngine!.removeMask(result.value, this.field.mask!)\n numValue = unformatted ? parseFloat(unformatted) : null\n }\n\n this.onChange(numValue)\n }\n })\n\n input.addEventListener('paste', (e) => {\n e.preventDefault()\n const pastedText = (e.clipboardData || (window as any).clipboardData).getData('text')\n \n if (pastedText) {\n const target = e.target as HTMLInputElement\n const cursorPosition = target.selectionStart || 0\n \n const before = target.value.substring(0, cursorPosition)\n const after = target.value.substring(cursorPosition)\n const newValue = before + pastedText + after\n\n const result = this.maskEngine!.processInput(\n newValue,\n this.previousValue,\n this.field.mask!,\n cursorPosition\n )\n\n target.value = result.value\n this.previousValue = result.value\n\n setTimeout(() => {\n target.setSelectionRange(result.cursorPosition, result.cursorPosition)\n }, 0)\n\n let numValue: number | null = null\n if (this.field.mask!.type === 'currency') {\n const unformatted = this.maskEngine!.removeMask(result.value, this.field.mask!)\n numValue = unformatted ? parseFloat(unformatted.replace(/[^\\d.]/g, '')) : null\n } else if (this.field.mask!.type === 'percentage') {\n const unformatted = this.maskEngine!.removeMask(result.value, this.field.mask!)\n numValue = unformatted ? parseFloat(unformatted) : null\n }\n\n this.onChange(numValue)\n }\n })\n } else {\n // Sin máscara, comportamiento normal\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n const numValue = target.value === '' ? null : Number(target.value)\n this.onChange(numValue)\n })\n }\n\n input.addEventListener('blur', () => {\n this.onBlur()\n })\n\n return this.createFieldContainer(input)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { TextareaField } from '../../types'\n\nexport class TextareaInput extends BaseInput {\n render(): HTMLElement {\n const textarea = document.createElement('textarea')\n textarea.value = this.value ?? ''\n textarea.placeholder = this.field.placeholder || ''\n\n const textareaField = this.field as TextareaField\n if (textareaField.rows) {\n textarea.rows = textareaField.rows\n }\n if (textareaField.cols) {\n textarea.cols = textareaField.cols\n }\n\n this.applyCommonProps(textarea)\n\n textarea.addEventListener('input', (e) => {\n const target = e.target as HTMLTextAreaElement\n this.onChange(target.value)\n })\n\n textarea.addEventListener('blur', () => {\n this.onBlur()\n })\n\n return this.createFieldContainer(textarea)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { SelectField } from '../../types'\n\nexport class SelectInput extends BaseInput {\n render(): HTMLElement {\n const select = document.createElement('select')\n const selectField = this.field as SelectField\n\n if (selectField.multiple) {\n select.multiple = true\n }\n\n // Opción placeholder cuando no hay selección (solo para select simple)\n if (!selectField.multiple) {\n const placeholderOption = document.createElement('option')\n placeholderOption.value = ''\n placeholderOption.textContent = selectField.placeholder || 'Selecciona una opción'\n placeholderOption.setAttribute('data-placeholder', '')\n placeholderOption.disabled = true\n select.appendChild(placeholderOption)\n }\n\n // Crear opciones\n for (const option of selectField.options) {\n const optionEl = document.createElement('option')\n if (typeof option === 'string') {\n optionEl.value = option\n optionEl.textContent = option\n } else {\n optionEl.value = String(option.value)\n optionEl.textContent = option.label\n }\n select.appendChild(optionEl)\n }\n\n // Establecer valor\n if (selectField.multiple && Array.isArray(this.value)) {\n for (const option of select.options) {\n option.selected = this.value.includes(option.value)\n }\n } else {\n select.value = this.value ?? ''\n }\n\n this.applyCommonProps(select)\n\n const updatePlaceholderClass = () => {\n const isEmpty = !select.value\n if (isEmpty) {\n select.classList.add('easy-form-select-placeholder')\n } else {\n select.classList.remove('easy-form-select-placeholder')\n }\n }\n updatePlaceholderClass()\n\n select.addEventListener('change', (e) => {\n const target = e.target as HTMLSelectElement\n updatePlaceholderClass()\n if (selectField.multiple) {\n const selectedValues = Array.from(target.selectedOptions).map(\n (opt) => opt.value\n )\n this.onChange(selectedValues)\n } else {\n this.onChange(target.value || null)\n }\n })\n\n select.addEventListener('blur', () => {\n this.onBlur()\n })\n\n return this.createFieldContainer(select)\n }\n}\n","import { BaseInput } from './base-input'\n\nexport class CheckboxInput extends BaseInput {\n render(): HTMLElement {\n const checkbox = document.createElement('input')\n checkbox.type = 'checkbox'\n checkbox.checked = Boolean(this.value)\n\n this.applyCommonProps(checkbox)\n\n checkbox.addEventListener('change', (e) => {\n const target = e.target as HTMLInputElement\n this.onChange(target.checked)\n })\n\n checkbox.addEventListener('blur', () => {\n this.onBlur()\n })\n\n const container = document.createElement('div')\n container.className = 'easy-form-field'\n\n // Label (checkbox primero, luego label)\n const label = document.createElement('label')\n label.className = 'easy-form-label-checkbox'\n label.setAttribute('for', this.getFieldId())\n label.appendChild(checkbox)\n if (this.field.label) {\n const labelText = document.createTextNode(this.field.label)\n label.appendChild(labelText)\n }\n container.appendChild(label)\n\n // Description\n if (this.field.description) {\n const description = document.createElement('p')\n description.className = 'easy-form-description'\n description.textContent = this.field.description\n container.appendChild(description)\n }\n\n // Error\n if (this.error) {\n const errorEl = document.createElement('p')\n errorEl.className = 'easy-form-error'\n errorEl.textContent = this.error\n container.appendChild(errorEl)\n }\n\n return container\n }\n}\n","import { BaseInput } from './base-input'\nimport type { RadioField } from '../../types'\n\nexport class RadioInput extends BaseInput {\n render(): HTMLElement {\n const container = document.createElement('div')\n container.className = 'easy-form-field'\n\n // Label\n if (this.field.label) {\n const label = document.createElement('label')\n label.className = 'easy-form-label'\n label.textContent = this.field.label\n if (this.field.validations?.some((v) => v.type === 'required')) {\n const required = document.createElement('span')\n required.className = 'easy-form-required'\n required.textContent = ' *'\n label.appendChild(required)\n }\n container.appendChild(label)\n }\n\n // Radio buttons\n const radioGroup = document.createElement('div')\n radioGroup.className = 'easy-form-radio-group'\n\n const radioField = this.field as RadioField\n for (const option of radioField.options) {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n\n const radioContainer = document.createElement('div')\n radioContainer.className = 'easy-form-radio-option'\n\n const radio = document.createElement('input')\n radio.type = 'radio'\n radio.name = this.field.name\n radio.id = `${this.getFieldId()}-${optionValue}`\n radio.value = String(optionValue)\n radio.checked = String(this.value) === String(optionValue)\n\n if (this.field.disabled) {\n radio.disabled = true\n }\n\n const label = document.createElement('label')\n label.setAttribute('for', radio.id)\n label.textContent = optionLabel\n label.className = 'easy-form-radio-label'\n\n radio.addEventListener('change', () => {\n this.onChange(optionValue)\n })\n\n radio.addEventListener('blur', () => {\n this.onBlur()\n })\n\n radioContainer.appendChild(radio)\n radioContainer.appendChild(label)\n radioGroup.appendChild(radioContainer)\n }\n\n container.appendChild(radioGroup)\n\n // Description\n if (this.field.description) {\n const description = document.createElement('p')\n description.className = 'easy-form-description'\n description.textContent = this.field.description\n container.appendChild(description)\n }\n\n // Error\n if (this.error) {\n const errorEl = document.createElement('p')\n errorEl.className = 'easy-form-error'\n errorEl.textContent = this.error\n container.appendChild(errorEl)\n }\n\n return container\n }\n}\n","import { BaseInput } from './base-input'\n\nexport class SwitchInput extends BaseInput {\n render(): HTMLElement {\n const switchEl = document.createElement('input')\n switchEl.type = 'checkbox'\n switchEl.className = 'easy-form-switch'\n switchEl.checked = Boolean(this.value)\n\n this.applyCommonProps(switchEl)\n\n switchEl.addEventListener('change', (e) => {\n const target = e.target as HTMLInputElement\n this.onChange(target.checked)\n })\n\n switchEl.addEventListener('blur', () => {\n this.onBlur()\n })\n\n const container = document.createElement('div')\n container.className = 'easy-form-field'\n\n // Label con switch\n const label = document.createElement('label')\n label.className = 'easy-form-label-switch'\n label.setAttribute('for', this.getFieldId())\n if (this.field.label) {\n const labelText = document.createTextNode(this.field.label)\n label.appendChild(labelText)\n }\n label.appendChild(switchEl)\n container.appendChild(label)\n\n // Description\n if (this.field.description) {\n const description = document.createElement('p')\n description.className = 'easy-form-description'\n description.textContent = this.field.description\n container.appendChild(description)\n }\n\n // Error\n if (this.error) {\n const errorEl = document.createElement('p')\n errorEl.className = 'easy-form-error'\n errorEl.textContent = this.error\n container.appendChild(errorEl)\n }\n\n return container\n }\n}\n","import { BaseInput } from './base-input'\nimport type { DateField } from '../../types'\n\nexport class DateInput extends BaseInput {\n render(): HTMLElement {\n const input = document.createElement('input')\n input.type = 'date'\n \n const dateField = this.field as DateField\n if (dateField.min) {\n input.min = dateField.min\n }\n if (dateField.max) {\n input.max = dateField.max\n }\n\n if (this.value) {\n const date = this.value instanceof Date \n ? this.value.toISOString().split('T')[0]\n : String(this.value)\n input.value = date\n }\n\n this.applyCommonProps(input)\n\n input.addEventListener('change', (e) => {\n const target = e.target as HTMLInputElement\n this.onChange(target.value || null)\n })\n\n input.addEventListener('blur', () => {\n this.onBlur()\n })\n\n return this.createFieldContainer(input)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { FileField } from '../../types'\n\nexport class FileInput extends BaseInput {\n render(): HTMLElement {\n const input = document.createElement('input')\n input.type = 'file'\n \n const fileField = this.field as FileField\n if (fileField.accept) {\n input.accept = fileField.accept\n }\n if (fileField.multiple) {\n input.multiple = true\n }\n\n this.applyCommonProps(input)\n\n input.addEventListener('change', (e) => {\n const target = e.target as HTMLInputElement\n if (target.files) {\n if (fileField.multiple) {\n this.onChange(Array.from(target.files))\n } else {\n this.onChange(target.files[0] || null)\n }\n }\n })\n\n input.addEventListener('blur', () => {\n this.onBlur()\n })\n\n return this.createFieldContainer(input)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { QuantityField } from '../../types'\n\nexport class QuantityInput extends BaseInput {\n render(): HTMLElement {\n const container = document.createElement('div')\n container.className = 'easy-form-quantity-container'\n\n const quantityField = this.field as QuantityField\n const min = quantityField.min ?? 0\n const max = quantityField.max ?? undefined\n const step = quantityField.step ?? 1\n const currentValue = this.value ?? min\n\n // Contenedor del input con botones\n const inputWrapper = document.createElement('div')\n inputWrapper.className = 'easy-form-quantity-wrapper'\n\n // Botón de decremento\n const decrementBtn = document.createElement('button')\n decrementBtn.type = 'button'\n decrementBtn.className = 'easy-form-quantity-btn easy-form-quantity-decrement'\n decrementBtn.textContent = '−'\n decrementBtn.setAttribute('aria-label', 'Decrementar')\n \n if (currentValue <= min) {\n decrementBtn.disabled = true\n decrementBtn.classList.add('disabled')\n }\n\n // Input numérico\n const input = document.createElement('input')\n input.type = 'number'\n input.value = String(currentValue)\n input.min = String(min)\n if (max !== undefined) {\n input.max = String(max)\n }\n input.step = String(step)\n input.className = 'easy-form-quantity-input'\n this.applyCommonProps(input)\n\n // Botón de incremento\n const incrementBtn = document.createElement('button')\n incrementBtn.type = 'button'\n incrementBtn.className = 'easy-form-quantity-btn easy-form-quantity-increment'\n incrementBtn.textContent = '+'\n incrementBtn.setAttribute('aria-label', 'Incrementar')\n \n if (max !== undefined && currentValue >= max) {\n incrementBtn.disabled = true\n incrementBtn.classList.add('disabled')\n }\n\n // Event listeners para botones\n decrementBtn.addEventListener('click', () => {\n const newValue = Math.max(min, Number(input.value) - step)\n input.value = String(newValue)\n this.onChange(newValue)\n updateButtons()\n })\n\n incrementBtn.addEventListener('click', () => {\n const newValue = max !== undefined \n ? Math.min(max, Number(input.value) + step)\n : Number(input.value) + step\n input.value = String(newValue)\n this.onChange(newValue)\n updateButtons()\n })\n\n // Event listener para input directo\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n let numValue = Number(target.value)\n \n if (isNaN(numValue)) {\n numValue = min\n }\n \n if (numValue < min) {\n numValue = min\n }\n \n if (max !== undefined && numValue > max) {\n numValue = max\n }\n \n target.value = String(numValue)\n this.onChange(numValue)\n updateButtons()\n })\n\n input.addEventListener('blur', () => {\n this.onBlur()\n })\n\n // Función para actualizar estado de botones\n const updateButtons = () => {\n const value = Number(input.value)\n decrementBtn.disabled = value <= min\n decrementBtn.classList.toggle('disabled', value <= min)\n \n if (max !== undefined) {\n incrementBtn.disabled = value >= max\n incrementBtn.classList.toggle('disabled', value >= max)\n } else {\n incrementBtn.disabled = false\n incrementBtn.classList.remove('disabled')\n }\n }\n\n // Agregar elementos al wrapper\n inputWrapper.appendChild(decrementBtn)\n inputWrapper.appendChild(input)\n inputWrapper.appendChild(incrementBtn)\n\n container.appendChild(inputWrapper)\n\n return this.createFieldContainer(container)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { AccordionSelectField } from '../../types'\n\nexport class AccordionSelectInput extends BaseInput {\n private openAccordion: string | null = null\n\n render(): HTMLElement {\n const container = document.createElement('div')\n container.className = 'easy-form-accordion-select-container'\n\n const accordionField = this.field as AccordionSelectField\n const selectedValue = this.value ?? null\n\n // Crear acordeón\n accordionField.options.forEach((option, index) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const optionDescription = typeof option === 'object' && 'description' in option && option.description\n ? option.description\n : undefined\n\n const accordionItem = document.createElement('div')\n accordionItem.className = 'easy-form-accordion-item'\n accordionItem.setAttribute('data-value', String(optionValue))\n\n if (selectedValue === optionValue || (Array.isArray(selectedValue) && selectedValue.includes(optionValue))) {\n accordionItem.classList.add('selected')\n if (!accordionField.multiple) {\n this.openAccordion = String(optionValue)\n }\n }\n\n // Header del acordeón\n const header = document.createElement('div')\n header.className = 'easy-form-accordion-header'\n header.setAttribute('role', 'button')\n header.setAttribute('tabindex', '0')\n header.setAttribute('aria-expanded', 'false')\n\n const headerContent = document.createElement('div')\n headerContent.className = 'easy-form-accordion-header-content'\n\n // Radio/Checkbox visual\n const indicator = document.createElement('div')\n indicator.className = 'easy-form-accordion-indicator'\n if (accordionField.multiple) {\n indicator.classList.add('checkbox')\n if (Array.isArray(selectedValue) && selectedValue.includes(optionValue)) {\n indicator.classList.add('checked')\n }\n } else {\n indicator.classList.add('radio')\n if (selectedValue === optionValue) {\n indicator.classList.add('checked')\n }\n }\n\n const label = document.createElement('span')\n label.className = 'easy-form-accordion-label'\n label.textContent = optionLabel\n\n const arrow = document.createElement('span')\n arrow.className = 'easy-form-accordion-arrow'\n arrow.textContent = '▼'\n\n headerContent.appendChild(indicator)\n headerContent.appendChild(label)\n header.appendChild(headerContent)\n header.appendChild(arrow)\n\n // Contenido del acordeón\n const content = document.createElement('div')\n content.className = 'easy-form-accordion-content'\n \n if (optionDescription) {\n const description = document.createElement('p')\n description.className = 'easy-form-accordion-description'\n description.textContent = optionDescription\n content.appendChild(description)\n }\n\n // Si hay campos anidados o contenido adicional\n if (typeof option === 'object' && 'content' in option && option.content) {\n const customContent = document.createElement('div')\n customContent.className = 'easy-form-accordion-custom-content'\n if (typeof option.content === 'string') {\n customContent.innerHTML = option.content\n } else if (option.content instanceof HTMLElement) {\n customContent.appendChild(option.content)\n }\n content.appendChild(customContent)\n }\n\n accordionItem.appendChild(header)\n accordionItem.appendChild(content)\n\n // Toggle acordeón\n const toggleAccordion = () => {\n const isOpen = accordionItem.classList.contains('open')\n \n if (!accordionField.multiple) {\n // Cerrar otros acordeones\n container.querySelectorAll('.easy-form-accordion-item').forEach((item) => {\n if (item !== accordionItem) {\n item.classList.remove('open')\n const otherHeader = item.querySelector('.easy-form-accordion-header')\n const otherContent = item.querySelector('.easy-form-accordion-content')\n const otherArrow = item.querySelector('.easy-form-accordion-arrow')\n if (otherHeader) otherHeader.setAttribute('aria-expanded', 'false')\n if (otherContent) otherContent.style.maxHeight = null\n if (otherArrow) otherArrow.style.transform = 'rotate(0deg)'\n }\n })\n }\n\n if (isOpen) {\n accordionItem.classList.remove('open')\n header.setAttribute('aria-expanded', 'false')\n content.style.maxHeight = null\n arrow.style.transform = 'rotate(0deg)'\n this.openAccordion = null\n } else {\n accordionItem.classList.add('open')\n header.setAttribute('aria-expanded', 'true')\n content.style.maxHeight = content.scrollHeight + 'px'\n arrow.style.transform = 'rotate(180deg)'\n this.openAccordion = String(optionValue)\n }\n }\n\n // Seleccionar opción\n const selectOption = () => {\n if (accordionField.multiple) {\n const currentValues = Array.isArray(selectedValue) ? [...selectedValue] : []\n const index = currentValues.indexOf(optionValue)\n \n if (index > -1) {\n currentValues.splice(index, 1)\n accordionItem.classList.remove('selected')\n indicator.classList.remove('checked')\n } else {\n currentValues.push(optionValue)\n accordionItem.classList.add('selected')\n indicator.classList.add('checked')\n }\n \n this.onChange(currentValues.length > 0 ? currentValues : null)\n } else {\n // Deseleccionar otros\n container.querySelectorAll('.easy-form-accordion-item').forEach((item) => {\n item.classList.remove('selected')\n const itemIndicator = item.querySelector('.easy-form-accordion-indicator')\n if (itemIndicator) itemIndicator.classList.remove('checked')\n })\n \n accordionItem.classList.add('selected')\n indicator.classList.add('checked')\n this.onChange(optionValue)\n }\n }\n\n header.addEventListener('click', (e) => {\n e.stopPropagation()\n selectOption()\n toggleAccordion()\n })\n\n header.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectOption()\n toggleAccordion()\n }\n })\n\n // Abrir acordeón si está seleccionado inicialmente\n if (selectedValue === optionValue || (Array.isArray(selectedValue) && selectedValue.includes(optionValue))) {\n if (!accordionField.multiple || accordionField.autoExpand) {\n setTimeout(() => {\n accordionItem.classList.add('open')\n header.setAttribute('aria-expanded', 'true')\n content.style.maxHeight = content.scrollHeight + 'px'\n arrow.style.transform = 'rotate(180deg)'\n }, 0)\n }\n }\n\n container.appendChild(accordionItem)\n })\n\n return this.createFieldContainer(container)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { ImageGridSelectField } from '../../types'\n\nexport class ImageGridSelectInput extends BaseInput {\n render(): HTMLElement {\n const container = document.createElement('div')\n container.className = 'easy-form-image-grid-container'\n\n const imageGridField = this.field as ImageGridSelectField\n const selectedValue = this.value ?? null\n const columns = imageGridField.columns ?? 3\n const imageSize = imageGridField.imageSize ?? 'medium'\n\n // Establecer grid columns\n container.style.gridTemplateColumns = `repeat(${columns}, 1fr)`\n container.style.gap = imageGridField.gap ?? '1rem'\n\n // Crear items de imagen\n imageGridField.options.forEach((option) => {\n const optionValue = typeof option === 'string' ? option : option.value\n const optionLabel = typeof option === 'string' ? option : option.label\n const optionImage = typeof option === 'object' && 'image' in option && option.image\n ? option.image\n : undefined\n const optionDescription = typeof option === 'object' && 'description' in option && option.description\n ? option.description\n : undefined\n\n const gridItem = document.createElement('div')\n gridItem.className = `easy-form-image-grid-item easy-form-image-grid-${imageSize}`\n gridItem.setAttribute('data-value', String(optionValue))\n gridItem.setAttribute('role', 'button')\n gridItem.setAttribute('tabindex', '0')\n gridItem.setAttribute('aria-label', optionLabel)\n\n if (selectedValue === optionValue || (Array.isArray(selectedValue) && selectedValue.includes(optionValue))) {\n gridItem.classList.add('selected')\n }\n\n // Contenedor de imagen\n const imageContainer = document.createElement('div')\n imageContainer.className = 'easy-form-image-grid-image-container'\n\n if (optionImage) {\n const img = document.createElement('img')\n img.src = optionImage\n img.alt = optionLabel\n img.className = 'easy-form-image-grid-image'\n imageContainer.appendChild(img)\n } else {\n // Placeholder si no hay imagen\n const placeholder = document.createElement('div')\n placeholder.className = 'easy-form-image-grid-placeholder'\n placeholder.textContent = optionLabel.charAt(0).toUpperCase()\n imageContainer.appendChild(placeholder)\n }\n\n // Indicador de selección\n const indicator = document.createElement('div')\n indicator.className = 'easy-form-image-grid-indicator'\n if (imageGridField.multiple) {\n indicator.classList.add('checkbox')\n if (Array.isArray(selectedValue) && selectedValue.includes(optionValue)) {\n indicator.classList.add('checked')\n indicator.innerHTML = '✓'\n }\n } else {\n indicator.classList.add('radio')\n if (selectedValue === optionValue) {\n indicator.classList.add('checked')\n indicator.innerHTML = '●'\n }\n }\n imageContainer.appendChild(indicator)\n\n // Label\n const label = document.createElement('div')\n label.className = 'easy-form-image-grid-label'\n label.textContent = optionLabel\n\n // Description (opcional)\n if (optionDescription) {\n const description = document.createElement('div')\n description.className = 'easy-form-image-grid-description'\n description.textContent = optionDescription\n gridItem.appendChild(description)\n }\n\n gridItem.appendChild(imageContainer)\n gridItem.appendChild(label)\n\n // Seleccionar opción\n const selectOption = () => {\n if (imageGridField.multiple) {\n const currentValues = Array.isArray(selectedValue) ? [...selectedValue] : []\n const index = currentValues.indexOf(optionValue)\n \n if (index > -1) {\n currentValues.splice(index, 1)\n gridItem.classList.remove('selected')\n indicator.classList.remove('checked')\n indicator.innerHTML = ''\n } else {\n currentValues.push(optionValue)\n gridItem.classList.add('selected')\n indicator.classList.add('checked')\n indicator.innerHTML = '✓'\n }\n \n this.onChange(currentValues.length > 0 ? currentValues : null)\n } else {\n // Deseleccionar otros\n container.querySelectorAll('.easy-form-image-grid-item').forEach((item) => {\n item.classList.remove('selected')\n const itemIndicator = item.querySelector('.easy-form-image-grid-indicator')\n if (itemIndicator) {\n itemIndicator.classList.remove('checked')\n itemIndicator.innerHTML = ''\n }\n })\n \n gridItem.classList.add('selected')\n indicator.classList.add('checked')\n indicator.innerHTML = '●'\n this.onChange(optionValue)\n }\n }\n\n gridItem.addEventListener('click', selectOption)\n gridItem.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectOption()\n }\n })\n\n gridItem.addEventListener('blur', () => {\n this.onBlur()\n })\n\n container.appendChild(gridItem)\n })\n\n return this.createFieldContainer(container)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { OTPField } from '../../types'\n\nexport class OTPInput extends BaseInput {\n private inputs: HTMLInputElement[] = []\n\n render(): HTMLElement {\n const container = document.createElement('div')\n container.className = 'easy-form-otp-container'\n\n const otpField = this.field as OTPField\n const length = otpField.length ?? 6\n const value = this.value ?? ''\n const valueString = String(value).padStart(length, '').slice(0, length)\n\n // Crear inputs individuales\n for (let i = 0; i < length; i++) {\n const input = document.createElement('input')\n input.type = 'text'\n input.inputMode = 'numeric'\n input.maxLength = 1\n input.className = 'easy-form-otp-input'\n input.setAttribute('aria-label', `Código dígito ${i + 1}`)\n \n if (valueString[i]) {\n input.value = valueString[i]\n }\n\n this.applyCommonProps(input)\n input.id = `${this.getFieldId()}-${i}`\n\n // Capturar el índice actual para usar en los callbacks\n const currentIndex = i\n\n // Event listeners\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n const inputValue = target.value.replace(/[^0-9]/g, '')\n target.value = inputValue\n\n // Mover al siguiente input si hay valor\n if (inputValue && currentIndex < length - 1) {\n this.inputs[currentIndex + 1].focus()\n }\n\n this.updateOTPValue()\n })\n\n input.addEventListener('keydown', (e) => {\n const target = e.target as HTMLInputElement\n\n // Backspace: borrar y mover al anterior\n if (e.key === 'Backspace' && !target.value && currentIndex > 0) {\n this.inputs[currentIndex - 1].focus()\n this.inputs[currentIndex - 1].value = ''\n this.updateOTPValue()\n }\n\n // Arrow keys: navegar entre inputs\n if (e.key === 'ArrowLeft' && currentIndex > 0) {\n e.preventDefault()\n this.inputs[currentIndex - 1].focus()\n }\n if (e.key === 'ArrowRight' && currentIndex < length - 1) {\n e.preventDefault()\n this.inputs[currentIndex + 1].focus()\n }\n })\n\n input.addEventListener('paste', (e) => {\n e.preventDefault()\n const pastedData = (e.clipboardData || (window as any).clipboardData).getData('text')\n const digits = pastedData.replace(/[^0-9]/g, '').slice(0, length)\n\n // Llenar inputs con los dígitos pegados\n for (let j = 0; j < digits.length && (currentIndex + j) < length; j++) {\n this.inputs[currentIndex + j].value = digits[j]\n }\n\n // Mover foco al último input llenado o al siguiente vacío\n const nextEmptyIndex = Math.min(currentIndex + digits.length, length - 1)\n this.inputs[nextEmptyIndex].focus()\n this.updateOTPValue()\n })\n\n input.addEventListener('focus', (e) => {\n const target = e.target as HTMLInputElement\n target.select()\n })\n\n input.addEventListener('blur', () => {\n this.onBlur()\n })\n\n this.inputs.push(input)\n container.appendChild(input)\n }\n\n return this.createFieldContainer(container)\n }\n\n private updateOTPValue(): void {\n const otpValue = this.inputs.map(input => input.value).join('')\n const otpField = this.field as OTPField\n \n // Si está vacío, enviar null, de lo contrario el string completo\n const finalValue = otpValue.length === this.inputs.length ? otpValue : null\n \n // Si el campo tiene formato numérico, convertir a número\n if (otpField.numeric && finalValue) {\n this.onChange(Number(finalValue))\n } else {\n this.onChange(finalValue)\n }\n }\n}\n","import { BaseInput } from './base-input'\nimport type { PasswordField } from '../../types'\n\nconst DEFAULT_SEPARATED_LENGTH = 6\n\nfunction eyeSvg(visible: boolean): string {\n if (visible) {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/></svg>`\n }\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>`\n}\n\nexport class PasswordInput extends BaseInput {\n private inputs: HTMLInputElement[] = []\n private visible = false\n\n get passwordField(): PasswordField {\n return this.field as PasswordField\n }\n\n render(): HTMLElement {\n const pf = this.passwordField\n const useSeparated = !!pf.characterSeparated\n const length = useSeparated\n ? typeof pf.characterSeparated === 'number'\n ? pf.characterSeparated\n : DEFAULT_SEPARATED_LENGTH\n : 0\n\n if (useSeparated) {\n return this.createFieldContainer(this.renderSeparated(length))\n }\n return this.createFieldContainer(this.renderSingle())\n }\n\n private renderSingle(): HTMLElement {\n const pf = this.passwordField\n const showToggle = !!pf.showToggle\n\n const input = document.createElement('input')\n input.type = 'password'\n input.value = this.value ?? ''\n input.id = this.getFieldId()\n this.applyCommonProps(input)\n if (this.field.placeholder) input.placeholder = this.field.placeholder\n\n input.addEventListener('input', (e) => {\n this.onChange((e.target as HTMLInputElement).value)\n })\n input.addEventListener('blur', () => this.onBlur())\n\n if (!showToggle) {\n return input\n }\n\n const wrapper = document.createElement('div')\n wrapper.className = 'easy-form-password-inner'\n input.classList.add('easy-form-password-input')\n wrapper.appendChild(input)\n\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.className = 'easy-form-password-toggle'\n btn.setAttribute('aria-label', 'Mostrar contraseña')\n btn.innerHTML = eyeSvg(false)\n btn.addEventListener('click', () => {\n this.visible = !this.visible\n input.type = this.visible ? 'text' : 'password'\n btn.setAttribute('aria-label', this.visible ? 'Ocultar contraseña' : 'Mostrar contraseña')\n btn.innerHTML = eyeSvg(this.visible)\n })\n wrapper.appendChild(btn)\n return wrapper\n }\n\n private renderSeparated(length: number): HTMLElement {\n const pf = this.passwordField\n const showToggle = !!pf.showToggle\n const value = this.value ?? ''\n const valueString = String(value).slice(0, length)\n\n const container = document.createElement('div')\n container.className = 'easy-form-password-separated'\n\n for (let i = 0; i < length; i++) {\n const input = document.createElement('input')\n input.type = 'password'\n input.maxLength = 1\n input.className = 'easy-form-password-separated-input'\n input.setAttribute('aria-label', `Carácter ${i + 1} de ${length}`)\n if (valueString[i]) input.value = valueString[i]\n this.applyCommonProps(input)\n input.id = i === 0 ? this.getFieldId() : `${this.getFieldId()}-${i}`\n if (i > 0) input.removeAttribute('name') // solo el primero conserva name para que el form encuentre el campo\n const currentIndex = i\n\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n const val = target.value\n if (val && currentIndex < length - 1) {\n this.inputs[currentIndex + 1].focus()\n }\n this.updateSeparatedValue()\n })\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Backspace' && !(e.target as HTMLInputElement).value && currentIndex > 0) {\n this.inputs[currentIndex - 1].focus()\n this.inputs[currentIndex - 1].value = ''\n this.updateSeparatedValue()\n }\n if (e.key === 'ArrowLeft' && currentIndex > 0) {\n e.preventDefault()\n this.inputs[currentIndex - 1].focus()\n }\n if (e.key === 'ArrowRight' && currentIndex < length - 1) {\n e.preventDefault()\n this.inputs[currentIndex + 1].focus()\n }\n })\n\n input.addEventListener('paste', (e) => {\n e.preventDefault()\n const text = (e.clipboardData || (window as any).clipboardData)?.getData('text') || ''\n const chars = text.slice(0, length - currentIndex).split('')\n for (let j = 0; j < chars.length && currentIndex + j < length; j++) {\n this.inputs[currentIndex + j].value = chars[j]\n }\n const nextIdx = Math.min(currentIndex + chars.length, length - 1)\n this.inputs[nextIdx].focus()\n this.updateSeparatedValue()\n })\n\n input.addEventListener('focus', (e) => (e.target as HTMLInputElement).select())\n input.addEventListener('blur', () => this.onBlur())\n\n this.inputs.push(input)\n container.appendChild(input)\n }\n\n if (showToggle) {\n const toggleWrap = document.createElement('div')\n toggleWrap.className = 'easy-form-password-separated-toggle'\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.className = 'easy-form-password-toggle'\n btn.setAttribute('aria-label', 'Mostrar contraseña')\n btn.innerHTML = eyeSvg(false)\n btn.addEventListener('click', () => {\n this.visible = !this.visible\n const type = this.visible ? 'text' : 'password'\n this.inputs.forEach((inp) => { inp.type = type })\n btn.setAttribute('aria-label', this.visible ? 'Ocultar contraseña' : 'Mostrar contraseña')\n btn.innerHTML = eyeSvg(this.visible)\n })\n toggleWrap.appendChild(btn)\n container.appendChild(toggleWrap)\n }\n\n return container\n }\n\n private updateSeparatedValue(): void {\n const value = this.inputs.map((inp) => inp.value).join('')\n this.onChange(value || null)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { FileDropField } from '../../types'\n\nexport class FileDropInput extends BaseInput {\n render(): HTMLElement {\n const fileDropField = this.field as FileDropField\n const accept = fileDropField.accept ?? ''\n const multiple = fileDropField.multiple ?? false\n\n const dropZone = document.createElement('div')\n dropZone.className = 'easy-form-file-drop'\n dropZone.setAttribute('tabindex', '0')\n\n const hiddenInput = document.createElement('input')\n hiddenInput.type = 'file'\n hiddenInput.className = 'easy-form-file-drop-input'\n hiddenInput.style.display = 'none'\n if (accept) hiddenInput.accept = accept\n if (multiple) hiddenInput.multiple = true\n\n const label = document.createElement('span')\n label.className = 'easy-form-file-drop-label'\n label.textContent = 'Arrastra archivos aquí o haz clic para seleccionar'\n dropZone.appendChild(label)\n dropZone.appendChild(hiddenInput)\n\n const fileList = document.createElement('div')\n fileList.className = 'easy-form-file-drop-list'\n\n const renderFileList = (files: File | File[] | null) => {\n const names = !files\n ? []\n : Array.isArray(files)\n ? files.map((f) => f.name)\n : [files.name]\n fileList.innerHTML = ''\n if (names.length === 0) {\n fileList.style.display = 'none'\n return\n }\n fileList.style.display = 'block'\n names.forEach((name) => {\n const item = document.createElement('div')\n item.className = 'easy-form-file-drop-item'\n item.textContent = name\n fileList.appendChild(item)\n })\n }\n renderFileList(this.value as File | File[] | null)\n\n const handleFiles = (files: FileList | null) => {\n if (!files || files.length === 0) return\n const arr = multiple ? Array.from(files) : files[0]\n this.onChange(arr)\n this.onBlur()\n renderFileList(arr)\n }\n\n dropZone.addEventListener('click', () => {\n hiddenInput.click()\n })\n\n hiddenInput.addEventListener('change', (e) => {\n const target = e.target as HTMLInputElement\n handleFiles(target.files)\n target.value = ''\n })\n\n dropZone.addEventListener('dragover', (e) => {\n e.preventDefault()\n e.stopPropagation()\n dropZone.classList.add('easy-form-file-drop-over')\n })\n\n dropZone.addEventListener('dragleave', (e) => {\n e.preventDefault()\n e.stopPropagation()\n dropZone.classList.remove('easy-form-file-drop-over')\n })\n\n dropZone.addEventListener('drop', (e) => {\n e.preventDefault()\n e.stopPropagation()\n dropZone.classList.remove('easy-form-file-drop-over')\n handleFiles(e.dataTransfer?.files ?? null)\n })\n\n dropZone.appendChild(fileList)\n return this.createFieldContainer(dropZone)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { MapField } from '../../types'\n\nconst LEAFLET_CSS = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css'\n\nexport class MapInput extends BaseInput {\n private mapInstance: L.Map | null = null\n private markerInstance: L.Marker | null = null\n\n render(): HTMLElement {\n const mapField = this.field as MapField\n const center = mapField.center ?? { lat: 0, lng: 0 }\n const zoom = mapField.zoom ?? 13\n const value = this.value as { lat?: number; lng?: number } | string | null | undefined\n const lat = typeof value === 'object' && value?.lat != null ? value.lat : center.lat\n const lng = typeof value === 'object' && value?.lng != null ? value.lng : center.lng\n\n const container = document.createElement('div')\n container.className = 'easy-form-map'\n\n const inputsWrapper = document.createElement('div')\n inputsWrapper.className = 'easy-form-map-inputs'\n\n const latInput = document.createElement('input')\n latInput.type = 'number'\n latInput.step = 'any'\n latInput.placeholder = 'Latitud'\n latInput.value = String(lat)\n latInput.className = 'easy-form-map-lat'\n\n const lngInput = document.createElement('input')\n lngInput.type = 'number'\n lngInput.step = 'any'\n lngInput.placeholder = 'Longitud'\n lngInput.value = String(lng)\n lngInput.className = 'easy-form-map-lng'\n\n const updateFromInputs = () => {\n const latVal = parseFloat(latInput.value)\n const lngVal = parseFloat(lngInput.value)\n if (!isNaN(latVal) && !isNaN(lngVal)) {\n this.onChange({ lat: latVal, lng: lngVal })\n this.syncMarkerPosition(latVal, lngVal)\n }\n this.onBlur()\n }\n\n latInput.addEventListener('change', updateFromInputs)\n lngInput.addEventListener('change', updateFromInputs)\n\n inputsWrapper.appendChild(latInput)\n inputsWrapper.appendChild(lngInput)\n container.appendChild(inputsWrapper)\n\n const mapContainer = document.createElement('div')\n mapContainer.className = 'easy-form-map-container'\n container.appendChild(mapContainer)\n\n // Inyectar CSS de Leaflet DENTRO del contenedor para que quede en el Shadow DOM\n // (document.head no aplica estilos al Shadow DOM de easy-form)\n const linkId = 'easy-form-leaflet-css'\n let cssLoaded = false\n const link = document.createElement('link')\n link.id = linkId\n link.rel = 'stylesheet'\n link.href = LEAFLET_CSS\n link.onload = () => { cssLoaded = true }\n container.insertBefore(link, container.firstChild)\n\n const initMap = async () => {\n if (typeof window === 'undefined') return\n \n // Asegurar que el contenedor tenga dimensiones antes de inicializar\n mapContainer.style.height = '300px'\n mapContainer.style.width = '100%'\n mapContainer.style.position = 'relative'\n mapContainer.style.overflow = 'hidden'\n mapContainer.style.display = 'block'\n\n // Esperar a que el CSS se cargue y el contenedor esté en el DOM con dimensiones\n await new Promise((resolve) => {\n const checkReady = () => {\n if (cssLoaded && mapContainer.offsetWidth > 0 && mapContainer.offsetHeight > 0) {\n resolve(undefined)\n } else {\n requestAnimationFrame(checkReady)\n }\n }\n checkReady()\n })\n \n // Esperar un poco más para asegurar que el layout esté completamente calculado\n await new Promise((resolve) => setTimeout(resolve, 50))\n\n let L: typeof import('leaflet')\n try {\n L = await import('leaflet')\n } catch {\n mapContainer.innerHTML = `\n <div style=\"padding:2rem;text-align:center;color:#666;font-size:0.875rem;background:#f9f9f9;border-radius:4px;\">\n <strong>Campo map requiere Leaflet</strong><br><br>\n Instala e importa Leaflet para usar el mapa interactivo:<br>\n <code>npm install leaflet</code><br><br>\n En tu app: <code>import 'leaflet'</code> y <code>import 'leaflet/dist/leaflet.css'</code><br>\n <a href=\"https://easyforms.dev/docs/tipos-campos#map\" target=\"_blank\" rel=\"noopener\" style=\"color:var(--easy-form-primary,#007bff);\">Ver documentación</a>\n </div>\n `\n return\n }\n\n // Fix icon paths when bundled (Leaflet default icons break with bundlers)\n delete (L.Icon.Default.prototype as { _getIconUrl?: unknown })._getIconUrl\n L.Icon.Default.mergeOptions({\n iconRetinaUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon-2x.png',\n iconUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png',\n shadowUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png',\n })\n\n this.mapInstance = L.map(mapContainer, {\n preferCanvas: false,\n zoomControl: true\n }).setView([lat, lng], zoom)\n\n const tileLayer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a>',\n maxZoom: 19\n }).addTo(this.mapInstance)\n\n // Invalidar tamaño inmediatamente después de crear el mapa\n this.mapInstance.invalidateSize()\n \n // Invalidar tamaño después de que los tiles se hayan cargado\n tileLayer.on('load', () => {\n if (this.mapInstance) {\n this.mapInstance.invalidateSize()\n }\n })\n \n // Invalidar tamaño con múltiples intentos para asegurar que todo esté renderizado\n const invalidateSize = () => {\n if (this.mapInstance) {\n this.mapInstance.invalidateSize()\n }\n }\n setTimeout(invalidateSize, 100)\n setTimeout(invalidateSize, 300)\n setTimeout(invalidateSize, 500)\n \n // Invalidar tamaño cuando el contenedor sea visible (por si estaba oculto inicialmente)\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && this.mapInstance) {\n setTimeout(() => {\n this.mapInstance?.invalidateSize()\n }, 100)\n }\n })\n })\n observer.observe(mapContainer)\n\n this.markerInstance = L.marker([lat, lng], { draggable: true })\n .addTo(this.mapInstance)\n .on('dragend', () => {\n const pos = this.markerInstance!.getLatLng()\n latInput.value = String(Number(pos.lat.toFixed(6)))\n lngInput.value = String(Number(pos.lng.toFixed(6)))\n this.onChange({ lat: pos.lat, lng: pos.lng })\n this.onBlur()\n })\n\n this.mapInstance.on('click', (e: L.LeafletMouseEvent) => {\n const { lat: newLat, lng: newLng } = e.latlng\n this.markerInstance!.setLatLng([newLat, newLng])\n latInput.value = String(Number(newLat.toFixed(6)))\n lngInput.value = String(Number(newLng.toFixed(6)))\n this.onChange({ lat: newLat, lng: newLng })\n this.onBlur()\n })\n }\n\n initMap()\n\n return this.createFieldContainer(container)\n }\n\n private syncMarkerPosition(newLat: number, newLng: number): void {\n if (this.mapInstance && this.markerInstance) {\n this.markerInstance.setLatLng([newLat, newLng])\n this.mapInstance.setView([newLat, newLng])\n // Invalidar tamaño por si el contenedor cambió\n setTimeout(() => {\n this.mapInstance?.invalidateSize()\n }, 50)\n }\n }\n}\n","import { BaseInput } from './base-input'\nimport type { RatingField } from '../../types'\n\nconst STAR_SVG = (filled: boolean) =>\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"${filled ? 'currentColor' : 'none'}\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" role=\"img\" aria-hidden=\"true\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/></svg>`\n\nexport class RatingInput extends BaseInput {\n render(): HTMLElement {\n const ratingField = this.field as RatingField\n const max = ratingField.max ?? 5\n const half = ratingField.half ?? false\n const currentValue = this.value != null ? Number(this.value) : 0\n\n const container = document.createElement('div')\n container.className = 'easy-form-rating'\n container.setAttribute('role', 'slider')\n container.setAttribute('aria-valuemin', '0')\n container.setAttribute('aria-valuemax', String(max))\n container.setAttribute('aria-valuenow', String(currentValue))\n container.setAttribute('aria-label', this.field.label || 'Rating')\n container.setAttribute('tabindex', '0')\n\n const starsContainer = document.createElement('div')\n starsContainer.className = 'easy-form-rating-stars'\n\n for (let i = 1; i <= max; i++) {\n const starWrapper = document.createElement('button')\n starWrapper.type = 'button'\n const filled = currentValue >= i || (half && currentValue >= i - 0.5)\n starWrapper.className = filled\n ? 'easy-form-rating-star easy-form-rating-star-filled'\n : 'easy-form-rating-star'\n starWrapper.innerHTML = STAR_SVG(filled)\n starWrapper.setAttribute('aria-label', `${i} de ${max}`)\n starWrapper.addEventListener('click', (e) => {\n e.preventDefault()\n const rect = (e.target as HTMLElement).closest('button')?.getBoundingClientRect()\n let val = i\n if (half && rect) {\n const mid = rect.left + rect.width / 2\n val = (e as MouseEvent).clientX < mid ? i - 0.5 : i\n }\n this.onChange(val)\n this.onBlur()\n this.rerenderStars(container, max, val, half)\n container.setAttribute('aria-valuenow', String(val))\n })\n starsContainer.appendChild(starWrapper)\n }\n\n container.appendChild(starsContainer)\n\n container.addEventListener('keydown', (e) => {\n const cur = Number(container.getAttribute('aria-valuenow')) || 0\n let newVal = cur\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault()\n newVal = Math.min(max, half ? cur + 0.5 : cur + 1)\n this.onChange(newVal)\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault()\n newVal = Math.max(0, half ? cur - 0.5 : cur - 1)\n this.onChange(newVal)\n }\n if (newVal !== cur) {\n this.rerenderStars(container, max, newVal, half)\n container.setAttribute('aria-valuenow', String(newVal))\n }\n })\n\n return this.createFieldContainer(container)\n }\n\n private rerenderStars(\n container: HTMLElement,\n max: number,\n value: number,\n half: boolean\n ): void {\n const stars = container.querySelectorAll('.easy-form-rating-star')\n stars.forEach((star, i) => {\n const idx = i + 1\n const filled = value >= idx || (half && value >= idx - 0.5)\n star.className = filled\n ? 'easy-form-rating-star easy-form-rating-star-filled'\n : 'easy-form-rating-star'\n star.innerHTML = STAR_SVG(filled)\n })\n }\n}\n","import { BaseInput } from './base-input'\nimport type { SliderField } from '../../types'\n\nexport class SliderInput extends BaseInput {\n render(): HTMLElement {\n const sliderField = this.field as SliderField\n const min = sliderField.min ?? 0\n const max = sliderField.max ?? 100\n const step = sliderField.step ?? 1\n const showValue = sliderField.showValue ?? false\n\n const input = document.createElement('input')\n input.type = 'range'\n input.min = String(min)\n input.max = String(max)\n input.step = String(step)\n input.value = this.value != null ? String(this.value) : String(min)\n\n input.setAttribute('aria-valuemin', String(min))\n input.setAttribute('aria-valuemax', String(max))\n input.setAttribute('aria-valuenow', input.value)\n\n this.applyCommonProps(input)\n\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement\n const val = step >= 1 ? parseInt(target.value, 10) : parseFloat(target.value)\n this.onChange(isNaN(val) ? min : val)\n if (valueSpan) {\n valueSpan.textContent = target.value\n }\n input.setAttribute('aria-valuenow', target.value)\n })\n\n input.addEventListener('change', () => {\n this.onBlur()\n })\n\n let valueSpan: HTMLSpanElement | null = null\n if (showValue) {\n valueSpan = document.createElement('span')\n valueSpan.className = 'easy-form-slider-value'\n valueSpan.textContent = input.value\n const wrapper = document.createElement('div')\n wrapper.className = 'easy-form-slider-wrapper'\n wrapper.appendChild(input)\n wrapper.appendChild(valueSpan)\n return this.createFieldContainer(wrapper)\n }\n\n return this.createFieldContainer(input)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { ColorpickerField } from '../../types'\n\nconst HEX_REGEX = /^#?([0-9A-Fa-f]{6})$/\n\nfunction toHex(value: string): string {\n const m = value.match(HEX_REGEX)\n if (m) return `#${m[1].toLowerCase()}`\n if (/^[0-9A-Fa-f]{6}$/.test(value)) return `#${value.toLowerCase()}`\n return '#000000'\n}\n\nexport class ColorInput extends BaseInput {\n render(): HTMLElement {\n const colorField = this.field as ColorpickerField\n const defaultValue = colorField.defaultValue ?? '#000000'\n const currentValue =\n this.value != null && typeof this.value === 'string'\n ? toHex(this.value)\n : defaultValue\n\n const wrapper = document.createElement('div')\n wrapper.className = 'easy-form-color-wrapper'\n\n const colorPicker = document.createElement('input')\n colorPicker.type = 'color'\n colorPicker.value = currentValue\n colorPicker.setAttribute('value', currentValue)\n colorPicker.setAttribute('aria-label', this.field.label || 'Color')\n colorPicker.id = `${this.getFieldId()}-picker`\n if (this.field.disabled) colorPicker.setAttribute('disabled', 'true')\n\n const textInput = document.createElement('input')\n textInput.type = 'text'\n textInput.value = currentValue\n textInput.setAttribute('aria-label', `${this.field.label || 'Color'} (hex)`)\n textInput.placeholder = '#000000'\n textInput.className = 'easy-form-color-text'\n this.applyCommonProps(textInput)\n\n const syncFromPicker = () => {\n const value = colorPicker.value || '#000000'\n const hex = toHex(value)\n textInput.value = hex\n this.onChange(hex)\n }\n\n const syncFromText = () => {\n const raw = textInput.value.trim()\n const value = raw.startsWith('#') ? raw : `#${raw}`\n if (/^#[0-9A-Fa-f]{6}$/.test(value)) {\n const hex = toHex(value)\n colorPicker.value = hex\n this.onChange(hex)\n }\n }\n\n colorPicker.addEventListener('input', syncFromPicker)\n colorPicker.addEventListener('change', () => {\n syncFromPicker()\n this.onBlur()\n })\n textInput.addEventListener('input', syncFromText)\n textInput.addEventListener('blur', () => {\n syncFromText()\n this.onBlur()\n })\n\n wrapper.appendChild(colorPicker)\n wrapper.appendChild(textInput)\n return this.createFieldContainer(wrapper)\n }\n}\n","import { BaseInput } from './base-input'\nimport type { MarkdownField } from '../../types'\n\nexport class MarkdownInput extends BaseInput {\n private textareaEl: HTMLTextAreaElement | null = null\n private previewEl: HTMLElement | null = null\n private previewModeEl: HTMLDivElement | null = null\n\n render(): HTMLElement {\n const field = this.field as MarkdownField\n const mode = field.mode ?? 'split'\n const showToolbar = field.toolbar ?? true\n const height = field.height ?? '300px'\n\n const container = document.createElement('div')\n container.className = `easy-form-markdown easy-form-markdown-mode-${mode}`\n\n if (mode === 'tabs') {\n this.renderTabsMode(container, field, showToolbar, height)\n } else if (mode === 'preview') {\n this.renderPreviewMode(container, field, showToolbar, height)\n } else {\n this.renderSplitMode(container, field, showToolbar, height)\n }\n\n this.checkAndShowDependenciesMessage()\n\n return this.createFieldContainer(container)\n }\n\n private renderSplitMode(container: HTMLElement, field: MarkdownField, showToolbar: boolean, height: string): void {\n if (showToolbar) {\n const toolbar = this.createToolbar()\n container.appendChild(toolbar)\n }\n\n const editorWrapper = document.createElement('div')\n editorWrapper.className = 'easy-form-markdown-editor-wrapper easy-form-markdown-split'\n\n const textarea = document.createElement('textarea')\n textarea.className = 'easy-form-markdown-textarea'\n textarea.value = (this.value as string) || ''\n textarea.placeholder = field.placeholder || 'Escribe en Markdown...'\n textarea.style.height = height\n this.textareaEl = textarea\n\n textarea.addEventListener('input', () => {\n this.onChange(textarea.value)\n this.updatePreview()\n })\n\n textarea.addEventListener('blur', () => {\n this.onBlur()\n })\n\n editorWrapper.appendChild(textarea)\n container.appendChild(editorWrapper)\n\n const preview = document.createElement('div')\n preview.className = 'easy-form-markdown-preview'\n preview.style.height = height\n this.previewEl = preview\n\n if (this.value) {\n this.renderPreview(this.value as string, preview)\n } else {\n preview.innerHTML = '<div class=\"easy-form-markdown-preview-placeholder\">Vista previa</div>'\n }\n\n editorWrapper.appendChild(preview)\n }\n\n private renderTabsMode(container: HTMLElement, field: MarkdownField, showToolbar: boolean, height: string): void {\n const tabsContainer = document.createElement('div')\n tabsContainer.className = 'easy-form-markdown-tabs'\n\n const tabsHeader = document.createElement('div')\n tabsHeader.className = 'easy-form-markdown-tabs-header'\n\n const editorTab = document.createElement('button')\n editorTab.type = 'button'\n editorTab.className = 'easy-form-markdown-tab active'\n editorTab.textContent = 'Editor'\n editorTab.addEventListener('click', () => this.switchTab('editor'))\n\n const previewTab = document.createElement('button')\n previewTab.type = 'button'\n previewTab.className = 'easy-form-markdown-tab'\n previewTab.textContent = 'Vista previa'\n previewTab.addEventListener('click', () => this.switchTab('preview'))\n\n tabsHeader.appendChild(editorTab)\n tabsHeader.appendChild(previewTab)\n tabsContainer.appendChild(tabsHeader)\n\n const contentWrapper = document.createElement('div')\n contentWrapper.className = 'easy-form-markdown-tabs-content'\n\n if (showToolbar) {\n const toolbar = this.createToolbar()\n contentWrapper.appendChild(toolbar)\n }\n\n const textarea = document.createElement('textarea')\n textarea.className = 'easy-form-markdown-textarea'\n textarea.value = (this.value as string) || ''\n textarea.placeholder = field.placeholder || 'Escribe en Markdown...'\n textarea.style.height = height\n this.textareaEl = textarea\n\n textarea.addEventListener('input', () => {\n this.onChange(textarea.value)\n if (previewTab.classList.contains('active')) {\n this.renderPreview(textarea.value, this.previewEl!)\n }\n })\n\n textarea.addEventListener('blur', () => {\n this.onBlur()\n })\n\n contentWrapper.appendChild(textarea)\n\n const preview = document.createElement('div')\n preview.className = 'easy-form-markdown-preview'\n preview.style.height = height\n preview.style.display = 'none'\n this.previewEl = preview\n\n if (this.value) {\n this.renderPreview(this.value as string, preview)\n } else {\n preview.innerHTML = '<div class=\"easy-form-markdown-preview-placeholder\">Vista previa</div>'\n }\n\n contentWrapper.appendChild(preview)\n tabsContainer.appendChild(contentWrapper)\n container.appendChild(tabsContainer)\n\n ;(tabsContainer as any)._editorTab = editorTab\n ;(tabsContainer as any)._previewTab = previewTab\n ;(tabsContainer as any)._textarea = textarea\n ;(tabsContainer as any)._preview = preview\n }\n\n private renderPreviewMode(container: HTMLElement, field: MarkdownField, showToolbar: boolean, height: string): void {\n if (showToolbar) {\n const toolbar = this.createToolbar()\n container.appendChild(toolbar)\n }\n\n const previewMode = document.createElement('div')\n previewMode.className = 'easy-form-markdown-preview-mode'\n previewMode.style.height = height\n this.previewModeEl = previewMode\n\n const content = document.createElement('div')\n content.className = 'easy-form-markdown-preview-mode-content'\n\n this.renderPreview((this.value as string) || '', content)\n\n const textarea = document.createElement('textarea')\n textarea.className = 'easy-form-markdown-textarea-invisible'\n textarea.value = (this.value as string) || ''\n textarea.placeholder = field.placeholder || 'Escribe...'\n textarea.setAttribute('aria-label', 'Editor de markdown')\n\n textarea.addEventListener('input', () => {\n this.onChange(textarea.value)\n this.renderPreview(textarea.value, content)\n })\n\n textarea.addEventListener('blur', () => {\n this.onBlur()\n })\n\n previewMode.appendChild(textarea)\n previewMode.appendChild(content)\n container.appendChild(previewMode)\n }\n\n private switchTab(tab: 'editor' | 'preview'): void {\n const container = this.textareaEl?.closest('.easy-form-markdown-tabs')\n if (!container) return\n\n const editorTab = (container as any)._editorTab as HTMLElement\n const previewTab = (container as any)._previewTab as HTMLElement\n const textarea = (container as any)._textarea as HTMLTextAreaElement\n const preview = (container as any)._preview as HTMLElement\n\n if (tab === 'editor') {\n editorTab.classList.add('active')\n previewTab.classList.remove('active')\n textarea.style.display = 'block'\n preview.style.display = 'none'\n } else {\n editorTab.classList.remove('active')\n previewTab.classList.add('active')\n textarea.style.display = 'none'\n preview.style.display = 'block'\n if (textarea.value) {\n this.renderPreview(textarea.value, preview)\n }\n }\n }\n\n private createToolbar(): HTMLElement {\n const toolbar = document.createElement('div')\n toolbar.className = 'easy-form-markdown-toolbar'\n\n const buttons: Array<{ icon: string; title: string; prefix: string; suffix: string; placeholder: string }> = [\n { icon: '<strong>B</strong>', title: 'Negrita', prefix: '**', suffix: '**', placeholder: 'texto en negrita' },\n { icon: '<em>I</em>', title: 'Cursiva', prefix: '_', suffix: '_', placeholder: 'texto en cursiva' },\n { icon: 'H1', title: 'Encabezado 1', prefix: '# ', suffix: '', placeholder: 'título' },\n { icon: 'H2', title: 'Encabezado 2', prefix: '## ', suffix: '', placeholder: 'título' },\n { icon: '🔗', title: 'Enlace', prefix: '[', suffix: '](url)', placeholder: 'texto del enlace' },\n { icon: '<code>&lt;/&gt;</code>', title: 'Código', prefix: '`', suffix: '`', placeholder: 'código' },\n { icon: '📷', title: 'Imagen', prefix: '![', suffix: '](url)', placeholder: 'texto alternativo' },\n { icon: '•', title: 'Lista', prefix: '- ', suffix: '', placeholder: 'elemento' },\n { icon: '1.', title: 'Lista numerada', prefix: '1. ', suffix: '', placeholder: 'elemento' },\n { icon: '\"', title: 'Cita', prefix: '> ', suffix: '', placeholder: 'cita' },\n ]\n\n buttons.forEach(btn => {\n const button = document.createElement('button')\n button.type = 'button'\n button.className = 'easy-form-markdown-toolbar-btn'\n button.title = btn.title\n button.innerHTML = btn.icon\n button.addEventListener('click', () => this.insertMarkdown(btn.prefix, btn.suffix, btn.placeholder))\n toolbar.appendChild(button)\n })\n\n return toolbar\n }\n\n private insertMarkdown(prefix: string, suffix: string, placeholder: string): void {\n const textarea = this.textareaEl\n if (!textarea) {\n if (this.previewModeEl) {\n const textareaInvisible = this.previewModeEl.querySelector('.easy-form-markdown-textarea-invisible') as HTMLTextAreaElement\n if (textareaInvisible) {\n this.insertMarkdownToPreviewMode(textareaInvisible, prefix, suffix, placeholder)\n }\n }\n return\n }\n\n const start = textarea.selectionStart\n const end = textarea.selectionEnd\n const text = textarea.value\n const selectedText = text.substring(start, end) || (placeholder ?? '')\n\n const newText = text.substring(0, start) + prefix + selectedText + suffix + text.substring(end)\n textarea.value = newText\n\n const newCursorPos = start + prefix.length + selectedText.length\n textarea.setSelectionRange(newCursorPos, newCursorPos)\n textarea.focus()\n\n this.onChange(newText)\n this.updatePreview()\n }\n\n private insertMarkdownToPreviewMode(textarea: HTMLTextAreaElement, prefix: string, suffix: string, placeholder: string): void {\n const start = textarea.selectionStart\n const end = textarea.selectionEnd\n const text = textarea.value\n const selectedText = text.substring(start, end) || (placeholder ?? '')\n\n const newText = text.substring(0, start) + prefix + selectedText + suffix + text.substring(end)\n textarea.value = newText\n\n const newCursorPos = start + prefix.length + selectedText.length\n textarea.setSelectionRange(newCursorPos, newCursorPos)\n textarea.focus()\n\n this.onChange(newText)\n if (this.previewModeEl) {\n const content = this.previewModeEl.querySelector('.easy-form-markdown-preview-mode-content')\n if (content) {\n this.renderPreview(newText, content as HTMLElement)\n }\n }\n }\n\n private updatePreview(): void {\n if (!this.previewEl) return\n const value = this.textareaEl?.value || ''\n if (!value) {\n this.previewEl.innerHTML = '<div class=\"easy-form-markdown-preview-placeholder\">Vista previa</div>'\n return\n }\n this.renderPreview(value, this.previewEl)\n }\n\n private async renderPreview(markdown: string, container: HTMLElement): Promise<void> {\n if (!markdown || !markdown.trim()) {\n container.innerHTML = '<div class=\"easy-form-markdown-preview-placeholder\">Vista previa</div>'\n return\n }\n\n container.innerHTML = '<div class=\"easy-form-markdown-preview-loading\">Cargando...</div>'\n\n try {\n const marked = await import('marked')\n const markedModule = marked.default || marked\n const html = await markedModule.parse(markdown)\n container.innerHTML = html\n } catch {\n container.innerHTML = `\n <div class=\"easy-form-markdown-error\">\n <strong>Vista previa no disponible</strong><br><br>\n Instala <code>marked</code> para usar la vista previa:<br>\n <code>npm install marked</code><br><br>\n En tu app: <code>import 'marked'</code>\n </div>\n `\n }\n }\n\n private checkAndShowDependenciesMessage(): void {\n setTimeout(async () => {\n try {\n await import('marked')\n } catch {\n const container = this.textareaEl?.closest('.easy-form-markdown') || this.previewModeEl?.closest('.easy-form-markdown')\n if (!container) return\n\n const placeholder = container.querySelector('.easy-form-markdown-preview-placeholder') as HTMLElement\n if (placeholder) {\n placeholder.innerHTML += '<br><small style=\"color:#888\">Instala <code>marked</code> para renderizar</small>'\n }\n }\n }, 100)\n }\n}\n","import { TextInput } from './text-input'\nimport { NumberInput } from './number-input'\nimport { TextareaInput } from './textarea-input'\nimport { SelectInput } from './select-input'\nimport { CheckboxInput } from './checkbox-input'\nimport { RadioInput } from './radio-input'\nimport { SwitchInput } from './switch-input'\nimport { DateInput } from './date-input'\nimport { FileInput } from './file-input'\nimport { QuantityInput } from './quantity-input'\nimport { AccordionSelectInput } from './accordion-select-input'\nimport { ImageGridSelectInput } from './image-grid-select-input'\nimport { OTPInput } from './otp-input'\nimport { PasswordInput } from './password-input'\nimport { FileDropInput } from './file-drop-input'\nimport { MapInput } from './map-input'\nimport { RatingInput } from './rating-input'\nimport { SliderInput } from './slider-input'\nimport { ColorInput } from './color-input'\nimport { MarkdownInput } from './markdown-input'\nimport type { Field, CustomComponent } from '../../types'\n\n/**\n * Factory para crear inputs\n */\nexport function createInput(\n field: Field,\n value: any,\n error: string | undefined,\n onChange: (value: any) => void,\n onBlur: () => void\n): HTMLElement {\n switch (field.type) {\n case 'text':\n case 'email':\n return new TextInput(field, value, error, onChange, onBlur).render()\n case 'password':\n return new PasswordInput(field, value, error, onChange, onBlur).render()\n case 'number':\n return new NumberInput(field, value, error, onChange, onBlur).render()\n case 'textarea':\n return new TextareaInput(field, value, error, onChange, onBlur).render()\n case 'select':\n return new SelectInput(field, value, error, onChange, onBlur).render()\n case 'checkbox':\n return new CheckboxInput(field, value, error, onChange, onBlur).render()\n case 'radio':\n return new RadioInput(field, value, error, onChange, onBlur).render()\n case 'switch':\n return new SwitchInput(field, value, error, onChange, onBlur).render()\n case 'date':\n return new DateInput(field, value, error, onChange, onBlur).render()\n case 'file':\n return new FileInput(field, value, error, onChange, onBlur).render()\n case 'file-drop':\n return new FileDropInput(field, value, error, onChange, onBlur).render()\n case 'map':\n return new MapInput(field, value, error, onChange, onBlur).render()\n case 'rating':\n return new RatingInput(field, value, error, onChange, onBlur).render()\n case 'slider':\n return new SliderInput(field, value, error, onChange, onBlur).render()\n case 'colorpicker':\n return new ColorInput(field, value, error, onChange, onBlur).render()\n case 'quantity':\n return new QuantityInput(field, value, error, onChange, onBlur).render()\n case 'accordion-select':\n return new AccordionSelectInput(field, value, error, onChange, onBlur).render()\n case 'image-grid-select':\n return new ImageGridSelectInput(field, value, error, onChange, onBlur).render()\n case 'otp':\n return new OTPInput(field, value, error, onChange, onBlur).render()\n case 'markdown':\n return new MarkdownInput(field, value, error, onChange, onBlur).render()\n default:\n const div = document.createElement('div')\n div.textContent = `Tipo de campo no soportado: ${field.type}`\n return div\n }\n}\n\n/**\n * Registro de componentes personalizados\n */\nlet customComponents: Map<string, CustomComponent> = new Map()\n\n/**\n * Registra un componente personalizado\n */\nexport function registerComponent(\n type: string,\n component: CustomComponent\n): void {\n customComponents.set(type, component)\n}\n\n/**\n * Registra múltiples componentes\n */\nexport function registerComponents(\n components: Record<string, CustomComponent>\n): void {\n for (const [type, component] of Object.entries(components)) {\n registerComponent(type, component)\n }\n}\n\n/**\n * Obtiene un componente personalizado\n */\nexport function getCustomComponent(type: string): CustomComponent | undefined {\n return customComponents.get(type)\n}\n","import type { FormSchema, Field, TemplateName } from '../types'\n\n/**\n * Login form template\n */\nconst loginTemplate: FormSchema = {\n fields: [\n {\n type: 'email',\n name: 'email',\n label: 'Email',\n placeholder: 'Enter your email',\n validations: [\n { type: 'required', message: 'Email is required' },\n { type: 'email', message: 'Please enter a valid email' },\n ],\n },\n {\n type: 'password',\n name: 'password',\n label: 'Password',\n placeholder: 'Enter your password',\n validations: [\n { type: 'required', message: 'Password is required' },\n { type: 'minLength', value: 6, message: 'Password must be at least 6 characters' },\n ],\n },\n {\n type: 'checkbox',\n name: 'rememberMe',\n label: 'Remember me',\n defaultValue: false,\n },\n ],\n}\n\n/**\n * Registration form template\n */\nconst registerTemplate: FormSchema = {\n fields: [\n {\n type: 'text',\n name: 'name',\n label: 'Full Name',\n placeholder: 'Enter your full name',\n validations: [\n { type: 'required', message: 'Name is required' },\n { type: 'minLength', value: 2, message: 'Name must be at least 2 characters' },\n ],\n },\n {\n type: 'email',\n name: 'email',\n label: 'Email',\n placeholder: 'Enter your email',\n validations: [\n { type: 'required', message: 'Email is required' },\n { type: 'email', message: 'Please enter a valid email' },\n ],\n },\n {\n type: 'password',\n name: 'password',\n label: 'Password',\n placeholder: 'Create a password',\n validations: [\n { type: 'required', message: 'Password is required' },\n { type: 'minLength', value: 8, message: 'Password must be at least 8 characters' },\n ],\n },\n {\n type: 'password',\n name: 'confirmPassword',\n label: 'Confirm Password',\n placeholder: 'Confirm your password',\n validations: [\n { type: 'required', message: 'Please confirm your password' },\n {\n type: 'custom',\n validator: (value) => {\n // Note: For password matching validation, you may need to implement\n // a custom validation that accesses the form's state manager\n // or use a form-level validation on submit\n return typeof value === 'string' && value.length >= 8\n },\n message: 'Password must be at least 8 characters',\n },\n ],\n },\n ],\n}\n\n/**\n * OTP verification template\n */\nconst otpTemplate: FormSchema = {\n fields: [\n {\n type: 'otp',\n name: 'code',\n label: 'Verification Code',\n validations: [\n { type: 'required', message: 'Verification code is required' },\n ],\n },\n ],\n}\n\n/**\n * Contact form template\n */\nconst contactTemplate: FormSchema = {\n fields: [\n {\n type: 'text',\n name: 'name',\n label: 'Name',\n placeholder: 'Enter your name',\n validations: [\n { type: 'required', message: 'Name is required' },\n ],\n },\n {\n type: 'email',\n name: 'email',\n label: 'Email',\n placeholder: 'Enter your email',\n validations: [\n { type: 'required', message: 'Email is required' },\n { type: 'email', message: 'Please enter a valid email' },\n ],\n },\n {\n type: 'text',\n name: 'subject',\n label: 'Subject',\n placeholder: 'Enter the subject',\n validations: [\n { type: 'required', message: 'Subject is required' },\n ],\n },\n {\n type: 'textarea',\n name: 'message',\n label: 'Message',\n placeholder: 'Enter your message',\n rows: 5,\n validations: [\n { type: 'required', message: 'Message is required' },\n { type: 'minLength', value: 10, message: 'Message must be at least 10 characters' },\n ],\n },\n ],\n}\n\n/**\n * Password reset request template\n */\nconst passwordResetTemplate: FormSchema = {\n fields: [\n {\n type: 'email',\n name: 'email',\n label: 'Email',\n placeholder: 'Enter your email address',\n validations: [\n { type: 'required', message: 'Email is required' },\n { type: 'email', message: 'Please enter a valid email' },\n ],\n },\n ],\n}\n\n/**\n * Password change template\n */\nconst passwordChangeTemplate: FormSchema = {\n fields: [\n {\n type: 'password',\n name: 'currentPassword',\n label: 'Current Password',\n placeholder: 'Enter your current password',\n validations: [\n { type: 'required', message: 'Current password is required' },\n ],\n },\n {\n type: 'password',\n name: 'newPassword',\n label: 'New Password',\n placeholder: 'Enter your new password',\n validations: [\n { type: 'required', message: 'New password is required' },\n { type: 'minLength', value: 8, message: 'Password must be at least 8 characters' },\n ],\n },\n {\n type: 'password',\n name: 'confirmPassword',\n label: 'Confirm New Password',\n placeholder: 'Confirm your new password',\n validations: [\n { type: 'required', message: 'Please confirm your new password' },\n {\n type: 'custom',\n validator: (value) => {\n // Note: For password matching validation, you may need to implement\n // a custom validation that accesses the form's state manager\n // or use a form-level validation on submit\n return typeof value === 'string' && value.length >= 8\n },\n message: 'Password must be at least 8 characters',\n },\n ],\n },\n ],\n}\n\n/**\n * User profile edit template\n */\nconst profileTemplate: FormSchema = {\n fields: [\n {\n type: 'text',\n name: 'name',\n label: 'Full Name',\n placeholder: 'Enter your full name',\n validations: [\n { type: 'required', message: 'Name is required' },\n ],\n },\n {\n type: 'email',\n name: 'email',\n label: 'Email',\n placeholder: 'Enter your email',\n validations: [\n { type: 'required', message: 'Email is required' },\n { type: 'email', message: 'Please enter a valid email' },\n ],\n },\n {\n type: 'text',\n name: 'phone',\n label: 'Phone',\n placeholder: 'Enter your phone number',\n mask: {\n type: 'phone',\n },\n },\n {\n type: 'textarea',\n name: 'bio',\n label: 'Bio',\n placeholder: 'Tell us about yourself',\n rows: 4,\n },\n {\n type: 'file',\n name: 'avatar',\n label: 'Profile Picture',\n accept: 'image/*',\n },\n ],\n}\n\n/**\n * Checkout form template\n */\nconst checkoutTemplate: FormSchema = {\n fields: [\n {\n type: 'group',\n name: 'billingAddress',\n label: 'Billing Address',\n fields: [\n {\n type: 'text',\n name: 'street',\n label: 'Street Address',\n placeholder: 'Enter street address',\n validations: [\n { type: 'required', message: 'Street address is required' },\n ],\n },\n {\n type: 'row',\n name: 'cityState',\n fields: [\n {\n type: 'text',\n name: 'city',\n label: 'City',\n placeholder: 'City',\n validations: [\n { type: 'required', message: 'City is required' },\n ],\n },\n {\n type: 'text',\n name: 'state',\n label: 'State',\n placeholder: 'State',\n validations: [\n { type: 'required', message: 'State is required' },\n ],\n },\n ],\n },\n {\n type: 'text',\n name: 'zipCode',\n label: 'ZIP Code',\n placeholder: 'ZIP Code',\n validations: [\n { type: 'required', message: 'ZIP code is required' },\n ],\n },\n ],\n },\n {\n type: 'select',\n name: 'paymentMethod',\n label: 'Payment Method',\n options: [\n { label: 'Credit Card', value: 'credit-card' },\n { label: 'Debit Card', value: 'debit-card' },\n { label: 'PayPal', value: 'paypal' },\n { label: 'Bank Transfer', value: 'bank-transfer' },\n ],\n validations: [\n { type: 'required', message: 'Payment method is required' },\n ],\n },\n {\n type: 'select',\n name: 'shipping',\n label: 'Shipping Method',\n options: [\n { label: 'Standard (5-7 days)', value: 'standard' },\n { label: 'Express (2-3 days)', value: 'express' },\n { label: 'Overnight', value: 'overnight' },\n ],\n validations: [\n { type: 'required', message: 'Shipping method is required' },\n ],\n },\n ],\n}\n\n/**\n * Feedback form template\n */\nconst feedbackTemplate: FormSchema = {\n fields: [\n {\n type: 'select',\n name: 'rating',\n label: 'Rating',\n options: [\n { label: '1 - Poor', value: 1 },\n { label: '2 - Fair', value: 2 },\n { label: '3 - Good', value: 3 },\n { label: '4 - Very Good', value: 4 },\n { label: '5 - Excellent', value: 5 },\n ],\n validations: [\n { type: 'required', message: 'Rating is required' },\n ],\n },\n {\n type: 'textarea',\n name: 'comment',\n label: 'Comment',\n placeholder: 'Share your feedback',\n rows: 5,\n validations: [\n { type: 'required', message: 'Comment is required' },\n ],\n },\n {\n type: 'email',\n name: 'email',\n label: 'Email (optional)',\n placeholder: 'Enter your email if you want a response',\n },\n ],\n}\n\n/**\n * Newsletter subscription template\n */\nconst subscriptionTemplate: FormSchema = {\n fields: [\n {\n type: 'email',\n name: 'email',\n label: 'Email',\n placeholder: 'Enter your email',\n validations: [\n { type: 'required', message: 'Email is required' },\n { type: 'email', message: 'Please enter a valid email' },\n ],\n },\n {\n type: 'checkbox',\n name: 'weeklyNewsletter',\n label: 'Weekly Newsletter',\n defaultValue: true,\n },\n {\n type: 'checkbox',\n name: 'productUpdates',\n label: 'Product Updates',\n defaultValue: false,\n },\n {\n type: 'checkbox',\n name: 'promotions',\n label: 'Promotions and Special Offers',\n defaultValue: false,\n },\n ],\n}\n\n/**\n * Booking/reservation template\n */\nconst bookingTemplate: FormSchema = {\n fields: [\n {\n type: 'date',\n name: 'date',\n label: 'Date',\n validations: [\n { type: 'required', message: 'Date is required' },\n ],\n },\n {\n type: 'text',\n name: 'time',\n label: 'Time',\n placeholder: 'HH:MM',\n mask: {\n type: 'time',\n },\n validations: [\n { type: 'required', message: 'Time is required' },\n ],\n },\n {\n type: 'number',\n name: 'guests',\n label: 'Number of Guests',\n placeholder: 'Enter number of guests',\n min: 1,\n max: 20,\n validations: [\n { type: 'required', message: 'Number of guests is required' },\n { type: 'min', value: 1, message: 'At least 1 guest is required' },\n ],\n },\n {\n type: 'textarea',\n name: 'specialRequests',\n label: 'Special Requests',\n placeholder: 'Any special requests or dietary restrictions?',\n rows: 4,\n },\n ],\n}\n\n/**\n * Review/rating form template\n */\nconst reviewTemplate: FormSchema = {\n fields: [\n {\n type: 'select',\n name: 'rating',\n label: 'Rating',\n options: [\n { label: '1 Star', value: 1 },\n { label: '2 Stars', value: 2 },\n { label: '3 Stars', value: 3 },\n { label: '4 Stars', value: 4 },\n { label: '5 Stars', value: 5 },\n ],\n validations: [\n { type: 'required', message: 'Rating is required' },\n ],\n },\n {\n type: 'text',\n name: 'title',\n label: 'Review Title',\n placeholder: 'Give your review a title',\n validations: [\n { type: 'required', message: 'Review title is required' },\n { type: 'minLength', value: 5, message: 'Title must be at least 5 characters' },\n ],\n },\n {\n type: 'textarea',\n name: 'comment',\n label: 'Your Review',\n placeholder: 'Share your experience',\n rows: 6,\n validations: [\n { type: 'required', message: 'Review comment is required' },\n { type: 'minLength', value: 20, message: 'Review must be at least 20 characters' },\n ],\n },\n ],\n}\n\n/**\n * Registry of all available templates\n */\nexport const templates: Record<TemplateName, FormSchema> = {\n login: loginTemplate,\n register: registerTemplate,\n otp: otpTemplate,\n contact: contactTemplate,\n 'password-reset': passwordResetTemplate,\n 'password-change': passwordChangeTemplate,\n profile: profileTemplate,\n checkout: checkoutTemplate,\n feedback: feedbackTemplate,\n subscription: subscriptionTemplate,\n booking: bookingTemplate,\n review: reviewTemplate,\n}\n\n/**\n * Get a template by name\n * @param templateName - Name of the template to retrieve\n * @returns The template schema or null if not found\n */\nexport function getTemplate(templateName: string): FormSchema | null {\n if (templateName in templates) {\n return templates[templateName as TemplateName]\n }\n return null\n}\n\n/**\n * Get list of all available template names\n * @returns Array of template names\n */\nexport function getAvailableTemplates(): TemplateName[] {\n return Object.keys(templates) as TemplateName[]\n}\n\n/**\n * Extend a template with additional fields\n * @param templateName - Name of the template to extend\n * @param additionalFields - Additional fields to add to the template\n * @returns Extended schema with template fields + additional fields\n */\nexport function extendTemplate(\n templateName: string,\n additionalFields: Field[]\n): FormSchema {\n const baseTemplate = getTemplate(templateName)\n if (!baseTemplate) {\n throw new Error(`Template \"${templateName}\" not found`)\n }\n\n const existingFields = baseTemplate.fields || []\n const existingSteps = baseTemplate.steps\n\n // If template has steps, extend the last step\n if (existingSteps && existingSteps.length > 0) {\n const lastStep = existingSteps[existingSteps.length - 1]\n return {\n ...baseTemplate,\n steps: [\n ...existingSteps.slice(0, -1),\n {\n ...lastStep,\n fields: [...lastStep.fields, ...additionalFields],\n },\n ],\n }\n }\n\n // Otherwise, extend fields array\n return {\n ...baseTemplate,\n fields: [...existingFields, ...additionalFields],\n }\n}\n","import { StateManager } from '../core/state-manager'\nimport { AttemptsLock } from '../utils/attempts-lock'\nimport { createInput, getCustomComponent, registerComponents } from './inputs'\nimport type {\n FormSchema,\n Field,\n ComponentRegistry,\n SubmitEventDetail,\n ChangeEventDetail,\n ErrorEventDetail,\n StepChangeEventDetail,\n FormTheme,\n FormColors,\n TemplateName,\n SubmitButtonConfig,\n PersistenceConfig,\n TimeoutEventDetail,\n} from '../types'\nimport { attributeValue, parseAttributeValue } from '../utils'\nimport { getThemeStyles, getColors } from '../utils/styles'\nimport { getTemplate, extendTemplate } from '../templates'\n\n// Verificar si estamos en un entorno del navegador\nconst BrowserHTMLElement = typeof HTMLElement !== 'undefined' ? HTMLElement : class {} as typeof HTMLElement\n\n/**\n * Web Component principal EasyForm\n */\nexport class EasyForm extends BrowserHTMLElement {\n private stateManager: StateManager\n protected shadow: ShadowRoot\n private customComponents: ComponentRegistry = {}\n private isRendering: boolean = false\n private attemptsLock: AttemptsLock | null = null\n private lockCountdownInterval: ReturnType<typeof setInterval> | null = null\n /**\n * Plantillas de slots basados en atributo `row` en el light DOM.\n * Se inicializan una sola vez y se clonan en cada render.\n */\n private slotTemplates: { template: HTMLElement; row: number | null }[] | null = null\n private skipPreserveValuesOnNextRender = false\n private persistenceConfig: PersistenceConfig | null = null\n private persistenceDebounceTimer: ReturnType<typeof setTimeout> | null = null\n private pendingRestoreValues: Record<string, any> | null = null\n private isRestoringValues = false\n private completeTimeInterval: ReturnType<typeof setInterval> | null = null\n private timeRemaining: number = 0\n private timerStarted: boolean = false\n private timerExpired: boolean = false\n\n static get observedAttributes() {\n return [\n 'schema',\n 'template',\n 'template-extend',\n 'theme',\n 'colors',\n 'initialData',\n 'loading',\n 'disabled',\n 'max-attempts',\n 'block-duration-minutes',\n 'attempts-storage-key',\n 'submit-button',\n 'label-position',\n 'show-completed-indicator',\n 'form-direction',\n 'complete-time',\n ]\n }\n\n constructor() {\n if (typeof HTMLElement === 'undefined') {\n throw new Error('EasyForm can only be used in a browser environment')\n }\n super()\n this.stateManager = new StateManager()\n this.shadow = this.attachShadow({ mode: 'open' })\n // Los estilos se aplicarán en connectedCallback cuando los atributos estén disponibles\n }\n\n /**\n * Obtiene el schema\n */\n get schema(): FormSchema | null {\n const schemaAttr = this.getAttribute('schema')\n if (!schemaAttr) return null\n \n // Validar mutua exclusividad con template\n if (this.getAttribute('template')) {\n console.warn('EasyForm: Cannot use both \"schema\" and \"template\" attributes. \"template\" will be ignored.')\n return parseAttributeValue(schemaAttr)\n }\n \n return parseAttributeValue(schemaAttr)\n }\n\n /**\n * Establece el schema\n */\n set schema(value: FormSchema | null) {\n // Si se establece schema, remover template\n if (value && this.getAttribute('template')) {\n console.warn('EasyForm: Setting \"schema\" will remove \"template\" attribute.')\n this.removeAttribute('template')\n this.removeAttribute('template-extend')\n }\n \n console.log('EasyForm: Setting schema via JS', value?.fields?.map(f => ({ name: f.name, type: f.type, deps: !!f.dependencies })))\n \n if (value) {\n this.setAttribute('schema', attributeValue(value))\n // Llamar a handleSchemaChange para renderizar cuando se asigna por JS\n this.handleSchemaChange()\n } else {\n this.removeAttribute('schema')\n }\n }\n\n /**\n * Obtiene el template\n */\n get template(): TemplateName | null {\n const templateAttr = this.getAttribute('template')\n if (!templateAttr) return null\n \n // Validar mutua exclusividad con schema\n if (this.getAttribute('schema')) {\n console.warn('EasyForm: Cannot use both \"template\" and \"schema\" attributes. \"schema\" will be ignored.')\n return templateAttr as TemplateName\n }\n \n return templateAttr as TemplateName\n }\n\n /**\n * Establece el template\n */\n set template(value: TemplateName | null) {\n // Si se establece template, remover schema\n if (value && this.getAttribute('schema')) {\n console.warn('EasyForm: Setting \"template\" will remove \"schema\" attribute.')\n this.removeAttribute('schema')\n }\n \n if (value) {\n this.setAttribute('template', value)\n } else {\n this.removeAttribute('template')\n this.removeAttribute('template-extend')\n }\n }\n\n /**\n * Obtiene los campos adicionales para extender el template\n */\n get templateExtend(): Field[] | null {\n const extendAttr = this.getAttribute('template-extend')\n if (!extendAttr) return null\n return parseAttributeValue(extendAttr)\n }\n\n /**\n * Establece los campos adicionales para extender el template\n */\n set templateExtend(value: Field[] | null) {\n if (value) {\n this.setAttribute('template-extend', attributeValue(value))\n } else {\n this.removeAttribute('template-extend')\n }\n }\n\n /**\n * Máximo de intentos antes de bloquear (para AttemptsLock)\n */\n get maxAttempts(): number | null {\n const attr = this.getAttribute('max-attempts')\n if (!attr) return null\n const n = parseInt(attr, 10)\n return isNaN(n) ? null : n\n }\n\n set maxAttempts(value: number | null) {\n if (value != null && value >= 1) {\n this.setAttribute('max-attempts', String(value))\n } else {\n this.removeAttribute('max-attempts')\n }\n }\n\n /**\n * Duración del bloqueo en minutos (default: 5)\n */\n get blockDurationMinutes(): number | null {\n const attr = this.getAttribute('block-duration-minutes')\n if (!attr) return null\n const n = parseInt(attr, 10)\n return isNaN(n) ? null : n\n }\n\n set blockDurationMinutes(value: number | null) {\n if (value != null && value >= 1) {\n this.setAttribute('block-duration-minutes', String(value))\n } else {\n this.removeAttribute('block-duration-minutes')\n }\n }\n\n /**\n * Clave para persistir intentos en sessionStorage\n */\n get attemptsStorageKey(): string | null {\n return this.getAttribute('attempts-storage-key')\n }\n\n set attemptsStorageKey(value: string | null) {\n if (value) {\n this.setAttribute('attempts-storage-key', value)\n } else {\n this.removeAttribute('attempts-storage-key')\n }\n }\n\n /**\n * Configuración del botón de submit (desde atributo o schema)\n */\n get submitButton(): SubmitButtonConfig | null {\n const attr = this.getAttribute('submit-button')\n if (attr) {\n try {\n return parseAttributeValue(attr) as SubmitButtonConfig\n } catch {\n return null\n }\n }\n return null\n }\n\n set submitButton(value: SubmitButtonConfig | null) {\n if (value && typeof value === 'object') {\n this.setAttribute('submit-button', attributeValue(value))\n } else {\n this.removeAttribute('submit-button')\n }\n }\n\n /**\n * Obtiene la configuración efectiva del botón submit (atributo > schema > defaults)\n */\n private getSubmitButtonConfig(schema: FormSchema | null): Required<SubmitButtonConfig> {\n const fromAttr = this.submitButton\n const fromSchema = schema?.submitButton\n const merged = { ...fromSchema, ...fromAttr } as SubmitButtonConfig\n return {\n visible: merged.visible ?? true,\n text: merged.text ?? 'Enviar',\n width: merged.width ?? 'auto',\n align: merged.align ?? 'left',\n }\n }\n\n /**\n * Se llama cuando el componente se conecta al DOM\n */\n connectedCallback() {\n this.setupAttemptsLock()\n // Asegurar que los estilos estén aplicados con los atributos actuales\n this.setupStyles()\n // Solo renderizar si ya hay un schema definido (como atributo HTML)\n // Si el schema se asigna por JS, se renderizará desde el setter\n if (this.hasAttribute('schema') || this.schema) {\n this.render()\n }\n }\n\n /**\n * Se llama cuando un atributo cambia\n */\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\n // Validar mutua exclusividad\n if (name === 'schema' && newValue !== oldValue) {\n if (this.getAttribute('template')) {\n console.warn('EasyForm: \"schema\" and \"template\" cannot be used together. Removing \"template\".')\n this.removeAttribute('template')\n this.removeAttribute('template-extend')\n }\n this.handleSchemaChange()\n }\n if (name === 'template' && newValue !== oldValue) {\n if (this.getAttribute('schema')) {\n console.warn('EasyForm: \"template\" and \"schema\" cannot be used together. Removing \"schema\".')\n this.removeAttribute('schema')\n }\n this.handleSchemaChange()\n }\n if (name === 'template-extend' && newValue !== oldValue) {\n this.handleSchemaChange()\n }\n if (name === 'initialData' && newValue !== oldValue) {\n this.handleSchemaChange()\n }\n if ((name === 'theme' || name === 'colors') && newValue !== oldValue) {\n this.setupStyles()\n }\n if (name === 'loading' && newValue !== oldValue) {\n // Actualizar solo el overlay de loading sin re-renderizar todo\n const form = this.shadow.querySelector('form')\n this.updateLoadingOverlay(form || undefined)\n // También necesitamos actualizar el estado disabled de los campos\n if (form) {\n const inputs = form.querySelectorAll('input, textarea, select, button')\n inputs.forEach((input) => {\n if (input instanceof HTMLElement && 'disabled' in input) {\n (input as any).disabled = this.loading\n }\n })\n }\n }\n if (name === 'disabled' && newValue !== oldValue) {\n this.render()\n }\n if ((name === 'label-position' || name === 'form-direction' || name === 'show-completed-indicator') && newValue !== oldValue) {\n this.render()\n }\n if (\n (name === 'max-attempts' ||\n name === 'block-duration-minutes' ||\n name === 'attempts-storage-key') &&\n newValue !== oldValue\n ) {\n this.setupAttemptsLock()\n this.updateLockOverlay()\n }\n if (name === 'submit-button' && newValue !== oldValue) {\n this.render()\n }\n if (name === 'complete-time' && newValue !== oldValue) {\n this.resetTimer()\n if (this.completeTime) {\n this.timeRemaining = this.completeTime\n this.render()\n }\n }\n }\n\n /**\n * Configura el AttemptsLock según los atributos actuales\n */\n private setupAttemptsLock(): void {\n const maxAttempts = this.maxAttempts\n if (maxAttempts == null || maxAttempts < 1) {\n this.attemptsLock = null\n return\n }\n this.attemptsLock = new AttemptsLock({\n maxAttempts,\n blockDurationMinutes: this.blockDurationMinutes ?? 5,\n storageKey: this.attemptsStorageKey ?? undefined,\n onLocked: () => {\n this.updateLockOverlay()\n },\n onUnlocked: () => {\n this.stopLockCountdown()\n this.updateLockOverlay()\n this.render()\n },\n })\n }\n\n /**\n * Maneja el cambio de schema\n */\n private handleSchemaChange() {\n let schema: FormSchema | null = null\n \n // Priorizar template sobre schema\n const templateName = this.template\n if (templateName) {\n schema = this.getSchemaFromTemplate(templateName)\n } else {\n schema = this.schema\n }\n \n if (schema) {\n const initialData = this.initialData\n this.stateManager.initializeSchema(schema, initialData || undefined)\n this.initPersistence(schema)\n this.render()\n }\n }\n\n /**\n * Obtiene el schema desde un template\n */\n private getSchemaFromTemplate(templateName: TemplateName): FormSchema | null {\n const baseTemplate = getTemplate(templateName)\n if (!baseTemplate) {\n console.error(`EasyForm: Template \"${templateName}\" not found`)\n return null\n }\n\n // Si hay campos adicionales, extender el template\n const additionalFields = this.templateExtend\n if (additionalFields && additionalFields.length > 0) {\n return extendTemplate(templateName, additionalFields)\n }\n\n return baseTemplate\n }\n\n /**\n * Renderiza el formulario\n */\n private async render() {\n // Evitar renderizados simultáneos\n if (this.isRendering) {\n return\n }\n \n this.isRendering = true\n \n try {\n // Obtener schema desde template o atributo schema\n let schema: FormSchema | null = null\n const templateName = this.template\n if (templateName) {\n schema = this.getSchemaFromTemplate(templateName)\n } else {\n schema = this.schema\n }\n \n if (!schema) {\n // Eliminar solo el formulario, mantener los estilos\n const form = this.shadow.querySelector('form')\n if (form && form.parentNode === this.shadow) {\n form.remove()\n }\n return\n }\n\n // Preservar valores actuales del DOM antes de re-renderizar (omitir si viene de add/remove en array)\n const isArrayRefresh = this.skipPreserveValuesOnNextRender\n const preservedValues = isArrayRefresh ? {} : this.preserveCurrentValues()\n this.skipPreserveValuesOnNextRender = false\n\n // Preservar el estado del wizard ANTES de reinicializar (pero después de cualquier cambio)\n const previousWizardState = this.stateManager.getWizardState()\n\n // Guardar los valores preservados en el estado sin validar\n // Esto evita disparar validaciones de todos los campos\n if (preservedValues && Object.keys(preservedValues).length > 0) {\n for (const [key, value] of Object.entries(preservedValues)) {\n this.stateManager.setValueWithoutValidation(key, value)\n }\n }\n\n const initialData = this.initialData\n \n // Verificar si el schema ha cambiado comparando si es wizard o no\n const wasWizard = previousWizardState !== null\n const isWizard = schema.steps && schema.steps.length > 0\n \n // Solo reinicializar el schema si es necesario (si cambió de wizard a normal o viceversa)\n // O si el número de steps cambió, o si no hay estado previo.\n // No re-inicializar cuando es refresh por add/remove en array (preservar estado actual).\n const shouldReinitialize = !isArrayRefresh && (\n !previousWizardState || !wasWizard || !isWizard || \n (previousWizardState && schema.steps && previousWizardState.totalSteps !== schema.steps.length)\n )\n \n if (shouldReinitialize) {\n this.stateManager.initializeSchema(schema, initialData || undefined)\n \n // Si había un wizard state previo y el schema sigue siendo wizard, restaurarlo\n if (wasWizard && isWizard && previousWizardState) {\n const wizardState = this.stateManager.getWizardState()\n if (wizardState && previousWizardState.totalSteps === wizardState.totalSteps) {\n // Restaurar el paso actual primero\n if (previousWizardState.currentStep >= 0 && previousWizardState.currentStep < wizardState.totalSteps) {\n this.stateManager.goToStep(previousWizardState.currentStep)\n }\n // Restaurar pasos completados\n for (const completedStep of previousWizardState.completedSteps) {\n if (completedStep >= 0 && completedStep < wizardState.totalSteps) {\n this.stateManager.completeStep(completedStep)\n }\n }\n }\n }\n }\n // Si no se reinicializa, el estado del wizard ya está actualizado (por nextStep/previousStep)\n // y los valores ya fueron preservados arriba\n \n // Obtener el estado actualizado\n const finalWizardState = this.stateManager.getWizardState()\n\n // Crear formulario\n const newFormElement = document.createElement('form')\n newFormElement.addEventListener('submit', (e) => this.handleSubmit(e))\n \n // Aplicar disabled al formulario si está disabled o loading\n if (this.disabled || this.loading) {\n newFormElement.classList.add('easy-form-disabled')\n }\n\n // Dirección del layout (vertical | horizontal)\n const directionAttr = this.getAttribute('form-direction') as 'vertical' | 'horizontal' | null\n const direction = schema.direction ?? (directionAttr === 'vertical' || directionAttr === 'horizontal' ? directionAttr : 'vertical')\n newFormElement.classList.add(`easy-form-direction-${direction}`)\n\n // Indicador de progreso (campos obligatorios completados)\n const showCompletedAttr = this.getAttribute('show-completed-indicator')\n const completedIndicator = schema.completedIndicator ?? (showCompletedAttr !== null && showCompletedAttr !== 'false')\n const completedPosition = typeof completedIndicator === 'object' && completedIndicator?.position ? completedIndicator.position : 'top'\n\n // Renderizar campos o steps\n if (finalWizardState) {\n this.renderWizard(newFormElement, schema)\n // No agregar botón submit normal para wizard, ya tiene sus propios botones\n } else {\n this.renderFields(newFormElement, schema.fields || [])\n\n // Botón submit solo para formularios normales (no wizard)\n const submitConfig = this.getSubmitButtonConfig(schema)\n if (submitConfig.visible) {\n const submitWrapper = document.createElement('div')\n submitWrapper.className = 'easy-form-submit-wrapper'\n submitWrapper.style.textAlign = submitConfig.align\n\n const submitButton = document.createElement('button')\n submitButton.type = 'submit'\n submitButton.textContent = submitConfig.text\n submitButton.className = 'easy-form-submit'\n submitButton.style.width = submitConfig.width\n if (this.disabled || this.loading) {\n submitButton.disabled = true\n }\n submitWrapper.appendChild(submitButton)\n newFormElement.appendChild(submitWrapper)\n }\n }\n\n // Indicador de progreso (antes o después del formulario)\n let formWrapper: HTMLElement | null = null\n if (completedIndicator) {\n const { completed, total } = this.getCompletedRequiredProgress(schema)\n const progressBar = document.createElement('div')\n progressBar.className = 'easy-form-completed-indicator'\n progressBar.setAttribute('role', 'progressbar')\n progressBar.setAttribute('aria-valuenow', String(completed))\n progressBar.setAttribute('aria-valuemin', '0')\n progressBar.setAttribute('aria-valuemax', String(total))\n progressBar.setAttribute('aria-label', `Campos obligatorios completados: ${completed} de ${total}`)\n const track = document.createElement('div')\n track.className = 'easy-form-completed-track'\n const fill = document.createElement('div')\n fill.className = 'easy-form-completed-fill'\n fill.style.width = total > 0 ? `${(completed / total) * 100}%` : '0%'\n track.appendChild(fill)\n progressBar.appendChild(track)\n formWrapper = document.createElement('div')\n formWrapper.className = 'easy-form-wrapper'\n if (completedPosition === 'top') {\n formWrapper.appendChild(progressBar)\n formWrapper.appendChild(newFormElement)\n } else {\n formWrapper.appendChild(newFormElement)\n formWrapper.appendChild(progressBar)\n }\n }\n\n // Eliminar solo el formulario anterior si existe y está en el DOM, mantener los estilos\n const oldForm = this.shadow.querySelector('form')\n if (oldForm && oldForm.parentNode === this.shadow && oldForm !== newFormElement) {\n try {\n oldForm.remove()\n } catch (e) {\n // Ignorar errores si el elemento ya fue eliminado\n console.warn('Error al eliminar formulario anterior:', e)\n }\n }\n const oldWrapper = this.shadow.querySelector('.easy-form-wrapper')\n if (oldWrapper) oldWrapper.remove()\n\n // Agregar el nuevo formulario (o wrapper con indicador)\n this.shadow.appendChild(formWrapper || newFormElement)\n \n // Agregar timer display si complete-time está configurado\n if (this.completeTime && !this.timerExpired) {\n this.renderTimerDisplay()\n this.setupTimerInputListener()\n }\n \n // Agregar overlay de loading sobre el formulario si está activo\n if (this.loading) {\n this.updateLoadingOverlay(newFormElement)\n }\n // Agregar overlay de bloqueo si está activo\n this.updateLockOverlay(newFormElement)\n } finally {\n this.isRendering = false\n // Aplicar valores restaurados de localStorage después del render\n if (this.pendingRestoreValues) {\n this.applyPendingRestoreValues()\n }\n }\n }\n\n /**\n * Actualiza el overlay de bloqueo por intentos\n */\n private updateLockOverlay(formElement?: HTMLElement): void {\n const existingOverlay = this.shadow.querySelector('.easy-form-lock-overlay')\n if (existingOverlay) {\n existingOverlay.remove()\n }\n this.stopLockCountdown()\n\n if (!this.attemptsLock?.isLocked()) return\n\n const form = formElement || this.shadow.querySelector('form')\n if (!form) return\n\n const overlay = document.createElement('div')\n overlay.className = 'easy-form-lock-overlay'\n\n const message = document.createElement('div')\n message.className = 'easy-form-lock-message'\n message.setAttribute('role', 'alert')\n\n const updateCountdown = (): void => {\n const remainingMs = this.attemptsLock!.getRemainingBlockTimeMs()\n if (remainingMs <= 0) {\n this.stopLockCountdown()\n return\n }\n const minutes = Math.floor(remainingMs / 60000)\n const seconds = Math.floor((remainingMs % 60000) / 1000)\n const timeStr =\n minutes > 0\n ? `${minutes} min ${seconds} s`\n : `${seconds} segundos`\n message.textContent = `Demasiados intentos. Intenta de nuevo en ${timeStr}.`\n }\n\n updateCountdown()\n overlay.appendChild(message)\n form.appendChild(overlay)\n\n this.lockCountdownInterval = setInterval(updateCountdown, 1000)\n }\n\n private stopLockCountdown(): void {\n if (this.lockCountdownInterval) {\n clearInterval(this.lockCountdownInterval)\n this.lockCountdownInterval = null\n }\n }\n\n /**\n * Actualiza el overlay de loading sobre el formulario\n */\n private updateLoadingOverlay(formElement?: HTMLElement) {\n // Eliminar overlay anterior si existe\n const existingOverlay = this.shadow.querySelector('.easy-form-loading-overlay')\n if (existingOverlay) {\n existingOverlay.remove()\n }\n\n // Si loading está activo, agregar overlay sobre el formulario\n if (this.loading) {\n const form = formElement || this.shadow.querySelector('form')\n if (form) {\n const overlay = document.createElement('div')\n overlay.className = 'easy-form-loading-overlay'\n \n const spinner = document.createElement('div')\n spinner.className = 'easy-form-loading-spinner'\n overlay.appendChild(spinner)\n \n // Agregar el overlay como hijo del formulario\n form.appendChild(overlay)\n }\n }\n }\n\n /**\n * Preserva los valores actuales del DOM antes de re-renderizar\n * Retorna un objeto con los valores preservados\n */\n private preserveCurrentValues(): Record<string, any> {\n // Necesitamos el schema actual para poder filtrar inputs que no pertenecen al formulario\n // y asegurar que valores dentro de slots u otros elementos no definidos en el schema\n // no se mezclen con el estado interno del formulario.\n let currentSchema: FormSchema | null = null\n const templateName = this.template\n if (templateName) {\n currentSchema = this.getSchemaFromTemplate(templateName)\n } else {\n currentSchema = this.schema\n }\n\n if (!currentSchema) {\n return {}\n }\n\n const form = this.shadow.querySelector('form')\n const preservedValues: Record<string, any> = {}\n \n if (!form) return preservedValues\n\n // Obtener todos los inputs, textareas y selects del formulario\n const inputs = form.querySelectorAll('input, textarea, select')\n \n for (const input of inputs) {\n const name = input.getAttribute('name')\n if (!name) continue\n\n // Ignorar inputs que no están definidos en el schema (por ejemplo, dentro de slots)\n const belongsToSchema = this.findFieldInSchema(currentSchema, name) !== null\n if (!belongsToSchema) continue\n\n let value: any\n \n if (input instanceof HTMLInputElement) {\n if (input.type === 'checkbox') {\n value = input.checked\n } else if (input.type === 'radio') {\n if (input.checked) {\n value = input.value\n } else {\n continue // Solo guardar el radio seleccionado\n }\n } else if (input.type === 'number') {\n value = input.value === '' ? null : Number(input.value)\n } else {\n value = input.value\n }\n } else if (input instanceof HTMLTextAreaElement) {\n value = input.value\n } else if (input instanceof HTMLSelectElement) {\n if (input.multiple) {\n value = Array.from(input.selectedOptions).map(opt => opt.value)\n } else {\n value = input.value || null\n }\n }\n\n // Guardar el valor (incluso strings vacíos para preservar el estado)\n if (value !== undefined) {\n preservedValues[name] = value === '' ? null : value\n }\n }\n \n return preservedValues\n }\n\n /**\n * Inicializa las plantillas de slots a partir del light DOM.\n * Cualquier hijo directo que sea HTMLElement se considera slot; si tiene atributo `row` se usa para la posición, si no se inserta al final (-1).\n */\n private initializeSlotTemplates(): void {\n if (this.slotTemplates !== null) return\n\n const elements: HTMLElement[] = []\n for (const child of Array.from(this.children)) {\n if (child instanceof HTMLElement) {\n elements.push(child)\n }\n }\n\n if (elements.length === 0) {\n this.slotTemplates = []\n return\n }\n\n this.slotTemplates = elements.map((el) => {\n const raw = el.hasAttribute('row') ? el.getAttribute('row') : null\n const parsed = raw != null && raw !== '' ? Number(raw) : NaN\n const row = Number.isFinite(parsed) ? parsed : null\n return {\n template: el.cloneNode(true) as HTMLElement,\n row,\n }\n })\n }\n\n /**\n * Obtiene clones de slots agrupados por índice de fila efectivo.\n * Cualquier valor inválido o fuera de rango se normaliza a -1 (final del formulario).\n */\n private getSlotClonesByRow(totalRows: number): Map<number, HTMLElement[]> {\n this.initializeSlotTemplates()\n\n const result = new Map<number, HTMLElement[]>()\n\n if (!this.slotTemplates || this.slotTemplates.length === 0) {\n return result\n }\n\n for (const { template, row } of this.slotTemplates) {\n let effectiveRow: number = typeof row === 'number' ? row : -1\n\n if (!Number.isFinite(effectiveRow)) {\n effectiveRow = -1\n }\n\n // Normalizar índices fuera de rango al final\n if (effectiveRow < 0 || effectiveRow >= totalRows) {\n effectiveRow = -1\n }\n\n const clone = template.cloneNode(true) as HTMLElement\n const existing = result.get(effectiveRow) ?? []\n existing.push(clone)\n result.set(effectiveRow, existing)\n }\n\n return result\n }\n\n /**\n * Aplica estado disabled/loading a un clone de slot: deshabilita elementos\n * interactivos y añade clase para estilos. Respeta el estado del formulario.\n */\n private applySlotDisabledState(slotElement: HTMLElement): void {\n if (!this.disabled && !this.loading) return\n slotElement.classList.add('easy-form-slot-disabled')\n const interactives = slotElement.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement>(\n 'input, textarea, select, button'\n )\n interactives.forEach((el) => {\n if ('disabled' in el) el.disabled = true\n })\n }\n\n /**\n * Renderiza campos normales\n */\n private renderFields(container: HTMLElement, fields: Field[]) {\n // Si no hay campos, aún debemos soportar posibles slots al final\n if (fields.length === 0) {\n const slotClones = this.getSlotClonesByRow(0)\n const endSlots = slotClones.get(-1)\n if (endSlots && endSlots.length > 0) {\n for (const slotElement of endSlots) {\n this.applySlotDisabledState(slotElement)\n container.appendChild(slotElement)\n }\n }\n return\n }\n\n const totalRows = fields.length\n const slotClonesByRow = this.getSlotClonesByRow(totalRows)\n\n for (let rowIndex = 0; rowIndex < fields.length; rowIndex++) {\n // Insertar primero los slots asociados a este índice de fila\n const slotsForRow = slotClonesByRow.get(rowIndex)\n if (slotsForRow && slotsForRow.length > 0) {\n for (const slotElement of slotsForRow) {\n this.applySlotDisabledState(slotElement)\n container.appendChild(slotElement)\n }\n slotClonesByRow.delete(rowIndex)\n }\n\n const field = fields[rowIndex]\n const fieldElement = this.renderField(field)\n if (fieldElement) {\n container.appendChild(fieldElement)\n }\n }\n\n // Insertar cualquier slot restante (índice efectivo -1) al final del formulario\n const endSlots = slotClonesByRow.get(-1)\n if (endSlots && endSlots.length > 0) {\n for (const slotElement of endSlots) {\n this.applySlotDisabledState(slotElement)\n container.appendChild(slotElement)\n }\n }\n }\n\n /**\n * Renderiza un campo\n */\n private renderField(field: Field): HTMLElement | null {\n // Verificar visibilidad basada en dependencias\n const isVisible = this.stateManager.getFieldVisibility(field.name)\n const isEnabled = this.stateManager.getFieldEnabled(field.name)\n\n // Debug\n console.log(`Rendering field: ${field.name} (${field.type}), visible: ${isVisible}, enabled: ${isEnabled}, hasDeps: ${!!field.dependencies}`)\n\n // Campos especiales\n if (field.type === 'group') {\n const groupElement = this.renderGroup(field)\n if (!isVisible) {\n groupElement.style.display = 'none'\n groupElement.classList.add('easy-form-field-hidden')\n }\n if (!isEnabled) {\n groupElement.classList.add('easy-form-field-disabled')\n }\n return groupElement\n }\n if (field.type === 'row') {\n const rowElement = this.renderRow(field)\n if (!isVisible) {\n rowElement.style.display = 'none'\n rowElement.classList.add('easy-form-field-hidden')\n }\n if (!isEnabled) {\n rowElement.classList.add('easy-form-field-disabled')\n }\n return rowElement\n }\n if (field.type === 'array') {\n const arrayElement = this.renderArray(field)\n if (!isVisible) {\n arrayElement.style.display = 'none'\n arrayElement.classList.add('easy-form-field-hidden')\n }\n if (!isEnabled) {\n arrayElement.classList.add('easy-form-field-disabled')\n }\n return arrayElement\n }\n if (field.type === 'custom') {\n const customElement = this.renderCustom(field)\n if (customElement) {\n if (!isVisible) {\n customElement.style.display = 'none'\n customElement.classList.add('easy-form-field-hidden')\n }\n if (!isEnabled) {\n customElement.classList.add('easy-form-field-disabled')\n }\n }\n return customElement\n }\n\n // Campos normales\n const value = this.stateManager.getValue(field.name)\n const errors = this.stateManager.getErrors(field.name)\n const error = errors.length > 0 ? errors[0] : undefined\n\n // Aplicar disabled basado en dependencias, disabled general o loading\n const isFormDisabled = this.disabled || this.loading\n const labelPositionAttr = this.getAttribute('label-position') as\n | 'up'\n | 'down'\n | 'left'\n | 'right'\n | 'none'\n | null\n const validLabelPositions = ['up', 'down', 'left', 'right', 'none']\n const effectiveLabelPosition =\n field.labelPosition ??\n (labelPositionAttr && validLabelPositions.includes(labelPositionAttr)\n ? labelPositionAttr\n : 'up')\n const fieldWithDependencies = {\n ...field,\n disabled: isFormDisabled || !isEnabled || field.disabled,\n labelPosition: effectiveLabelPosition,\n }\n\n const customComponent = getCustomComponent(field.type)\n if (customComponent) {\n const element = customComponent({\n field: fieldWithDependencies,\n value,\n error,\n onChange: (val) => this.handleFieldChange(field.name, val),\n onBlur: () => this.handleFieldBlur(field.name),\n })\n if (element && !isVisible) {\n element.style.display = 'none'\n element.classList.add('easy-form-field-hidden')\n }\n return element\n }\n\n const inputElement = createInput(\n fieldWithDependencies,\n value,\n error,\n (val) => this.handleFieldChange(field.name, val),\n () => this.handleFieldBlur(field.name)\n )\n\n // Agregar atributo para identificar el campo\n const fieldContainer = inputElement.querySelector('.easy-form-field') || inputElement\n if (fieldContainer instanceof HTMLElement) {\n fieldContainer.setAttribute('data-field-name', field.name)\n }\n\n // Aplicar clases para visibilidad\n if (!isVisible) {\n inputElement.style.display = 'none'\n inputElement.classList.add('easy-form-field-hidden')\n }\n\n return inputElement\n }\n\n /**\n * Renderiza un grupo de campos\n */\n private renderGroup(field: Field): HTMLElement {\n const groupField = field as {\n direction?: 'vertical' | 'horizontal'\n collapsible?: boolean\n defaultOpen?: boolean\n }\n const dir = groupField.direction ?? 'vertical'\n const collapsible = groupField.collapsible === true\n const defaultOpen = groupField.defaultOpen !== false\n\n const groupContainer = document.createElement('div')\n groupContainer.className = `easy-form-group easy-form-direction-${dir}`\n if (field.name) {\n groupContainer.setAttribute('data-field-name', field.name)\n }\n\n if (collapsible) {\n groupContainer.classList.add('easy-form-group-collapsible')\n if (!defaultOpen) {\n groupContainer.classList.add('easy-form-group-collapsed')\n }\n\n const header = document.createElement('button')\n header.type = 'button'\n header.className = 'easy-form-group-header'\n header.setAttribute('aria-expanded', String(defaultOpen))\n const groupContentId = `easy-form-group-${(field.name || 'group').replace(/[^a-z0-9]/gi, '-')}-content`\n header.setAttribute('aria-controls', groupContentId)\n\n const labelSpan = document.createElement('span')\n labelSpan.textContent = field.label || 'Grupo'\n\n const chevron = document.createElement('span')\n chevron.className = 'easy-form-group-chevron'\n chevron.setAttribute('aria-hidden', 'true')\n chevron.textContent = '▼'\n\n header.appendChild(labelSpan)\n header.appendChild(chevron)\n groupContainer.appendChild(header)\n\n const content = document.createElement('div')\n content.id = groupContentId\n content.className = 'easy-form-group-content'\n\n if ('fields' in field && field.fields) {\n for (const subField of field.fields) {\n const fullName = subField.name.startsWith(field.name + '.')\n ? subField.name\n : `${field.name}.${subField.name}`\n const subFieldWithPath = { ...subField, name: fullName }\n const fieldElement = this.renderField(subFieldWithPath)\n if (fieldElement) {\n content.appendChild(fieldElement)\n }\n }\n }\n\n groupContainer.appendChild(content)\n\n const setContentHeight = (open: boolean) => {\n if (open) {\n content.style.maxHeight = content.scrollHeight + 'px'\n } else {\n content.style.maxHeight = '0'\n }\n }\n\n if (defaultOpen) {\n requestAnimationFrame(() => setContentHeight(true))\n } else {\n content.style.maxHeight = '0'\n }\n\n header.addEventListener('click', () => {\n const isCollapsed = groupContainer.classList.contains('easy-form-group-collapsed')\n if (isCollapsed) {\n groupContainer.classList.remove('easy-form-group-collapsed')\n header.setAttribute('aria-expanded', 'true')\n setContentHeight(true)\n } else {\n content.style.maxHeight = content.scrollHeight + 'px'\n requestAnimationFrame(() => {\n groupContainer.classList.add('easy-form-group-collapsed')\n header.setAttribute('aria-expanded', 'false')\n setContentHeight(false)\n })\n }\n })\n } else {\n if (field.label) {\n const label = document.createElement('h3')\n label.className = 'easy-form-group-label'\n label.textContent = field.label\n groupContainer.appendChild(label)\n }\n\n if ('fields' in field && field.fields) {\n for (const subField of field.fields) {\n const fullName = subField.name.startsWith(field.name + '.')\n ? subField.name\n : `${field.name}.${subField.name}`\n const subFieldWithPath = { ...subField, name: fullName }\n const fieldElement = this.renderField(subFieldWithPath)\n if (fieldElement) {\n groupContainer.appendChild(fieldElement)\n }\n }\n }\n }\n\n return groupContainer\n }\n\n /**\n * Renderiza una fila de campos\n */\n private renderRow(field: Field): HTMLElement {\n const rowContainer = document.createElement('div')\n rowContainer.className = 'easy-form-row'\n\n const rowField = field as any\n\n // Aplicar estilos flexbox\n rowContainer.style.display = 'flex'\n rowContainer.style.flexWrap = 'wrap'\n rowContainer.style.alignItems = rowField.align || 'stretch'\n\n // Aplicar gap\n if (rowField.gap !== undefined) {\n const gapValue = typeof rowField.gap === 'number' ? `${rowField.gap}px` : rowField.gap\n rowContainer.style.gap = gapValue\n } else {\n rowContainer.style.gap = '1rem'\n }\n\n // Renderizar campos dentro de la fila\n if ('fields' in field && field.fields) {\n for (const subField of field.fields) {\n const fieldElement = this.renderField(subField)\n if (fieldElement) {\n // Hacer que cada campo en la fila tenga flex: 1 para distribuirse equitativamente\n const fieldWrapper = document.createElement('div')\n fieldWrapper.style.flex = '1'\n fieldWrapper.style.minWidth = '0' // Permite que los campos se reduzcan\n fieldWrapper.appendChild(fieldElement)\n rowContainer.appendChild(fieldWrapper)\n }\n }\n }\n\n return rowContainer\n }\n\n /**\n * Renderiza un array dinámico\n */\n private renderArray(field: Field): HTMLElement {\n const arrayContainer = document.createElement('div')\n arrayContainer.className = 'easy-form-array'\n arrayContainer.setAttribute('data-field-name', field.name)\n\n if (field.label) {\n const label = document.createElement('label')\n label.className = 'easy-form-label'\n label.textContent = field.label\n arrayContainer.appendChild(label)\n }\n\n const values = this.stateManager.getValue(field.name) || []\n const arrayField = field as { itemSchema?: { fields?: Field[] }; minItems?: number; maxItems?: number }\n const minItems = arrayField.minItems ?? 0\n const maxItems = arrayField.maxItems ?? Infinity\n\n // Renderizar items existentes\n const itemsContainer = document.createElement('div')\n itemsContainer.className = 'easy-form-array-items'\n\n for (let i = 0; i < values.length; i++) {\n const itemContainer = document.createElement('div')\n itemContainer.className = 'easy-form-array-item'\n\n if (arrayField.itemSchema?.fields) {\n for (const itemField of arrayField.itemSchema.fields) {\n const itemFieldWithName = {\n ...itemField,\n name: `${field.name}.${i}.${itemField.name}`,\n }\n const fieldElement = this.renderField(itemFieldWithName)\n if (fieldElement) {\n itemContainer.appendChild(fieldElement)\n }\n }\n }\n\n // Botón eliminar\n const removeButton = document.createElement('button')\n removeButton.type = 'button'\n removeButton.textContent = 'Eliminar'\n removeButton.className = 'easy-form-array-remove'\n const atMinItems = values.length <= minItems\n if (this.disabled || this.loading || atMinItems) {\n removeButton.disabled = true\n } else {\n removeButton.addEventListener('click', () => {\n const newValues = [...values]\n newValues.splice(i, 1)\n this.handleFieldChange(field.name, newValues)\n })\n }\n itemContainer.appendChild(removeButton)\n\n itemsContainer.appendChild(itemContainer)\n }\n\n arrayContainer.appendChild(itemsContainer)\n\n // Botón agregar\n const addButton = document.createElement('button')\n addButton.type = 'button'\n addButton.textContent = 'Agregar'\n addButton.className = 'easy-form-array-add'\n const atMaxItems = values.length >= maxItems\n if (this.disabled || this.loading || atMaxItems) {\n addButton.disabled = true\n } else {\n addButton.addEventListener('click', () => {\n const newItem = this.stateManager.createDefaultArrayItem(field)\n const newValues = [...values, newItem]\n this.handleFieldChange(field.name, newValues)\n })\n }\n arrayContainer.appendChild(addButton)\n\n return arrayContainer\n }\n\n /**\n * Renderiza un campo custom\n */\n private renderCustom(field: Field): HTMLElement | null {\n const customComponent = getCustomComponent('custom')\n if (!customComponent) {\n const div = document.createElement('div')\n div.textContent = `Componente custom no registrado para: ${field.name}`\n return div\n }\n\n const value = this.stateManager.getValue(field.name)\n const errors = this.stateManager.getErrors(field.name)\n const error = errors.length > 0 ? errors[0] : undefined\n\n return customComponent({\n field,\n value,\n error,\n onChange: (val) => this.handleFieldChange(field.name, val),\n onBlur: () => this.handleFieldBlur(field.name),\n })\n }\n\n /**\n * Obtiene el progreso de campos obligatorios completados\n */\n private getCompletedRequiredProgress(schema: FormSchema): { completed: number; total: number } {\n const extractFields = (fields: Field[]): Field[] => {\n const result: Field[] = []\n for (const f of fields) {\n if (f.type === 'array' && 'itemSchema' in f && f.itemSchema?.fields) {\n const items = this.stateManager.getValue(f.name) as any[]\n const count = Array.isArray(items) ? items.length : 0\n for (let i = 0; i < count; i++) {\n for (const sf of f.itemSchema.fields) {\n result.push({ ...sf, name: `${f.name}.${i}.${sf.name}` } as Field)\n }\n }\n } else if ((f.type === 'group' || f.type === 'row') && 'fields' in f && f.fields) {\n result.push(...extractFields(f.fields))\n } else {\n result.push(f)\n }\n }\n return result\n }\n\n const fields = schema.steps\n ? (this.stateManager.getCurrentStepFields() || [])\n : schema.fields || []\n const allFields = extractFields(fields)\n const requiredFields = allFields.filter(\n (f) => f.validations?.some((v) => v.type === 'required')\n )\n const visibleRequired = requiredFields.filter((f) =>\n this.stateManager.getFieldVisibility(f.name)\n )\n const total = visibleRequired.length\n const completed = visibleRequired.filter((f) => {\n const errors = this.stateManager.getErrors(f.name)\n if (errors.length > 0) return false\n const val = this.stateManager.getValue(f.name)\n if (val === null || val === undefined) return false\n if (typeof val === 'string' && val.trim() === '') return false\n if (Array.isArray(val) && val.length === 0 && f.type === 'array') return false\n return true\n }).length\n return { completed, total }\n }\n\n /**\n * Renderiza wizard\n */\n private renderWizard(container: HTMLElement, schema: FormSchema) {\n // Obtener el estado actualizado del wizard\n const wizardState = this.stateManager.getWizardState()\n if (!wizardState) return\n\n const wizardContainer = document.createElement('div')\n wizardContainer.className = 'easy-form-wizard'\n\n // Indicador de steps\n const stepsIndicator = document.createElement('div')\n stepsIndicator.className = 'easy-form-wizard-steps'\n const schemaStepStyle = schema?.stepStyle\n if (schemaStepStyle && schemaStepStyle !== 'default') {\n stepsIndicator.classList.add(`ef-stepper-${schemaStepStyle}`)\n }\n if (schema?.steps) {\n for (let i = 0; i < schema.steps.length; i++) {\n const stepEl = document.createElement('div')\n stepEl.className = 'easy-form-wizard-step'\n if (i === wizardState.currentStep) {\n stepEl.classList.add('active')\n }\n if (wizardState.completedSteps.includes(i)) {\n stepEl.classList.add('completed')\n }\n stepEl.textContent = schema.steps[i].title\n stepsIndicator.appendChild(stepEl)\n }\n }\n wizardContainer.appendChild(stepsIndicator)\n\n // Campos del step actual (con soporte de slots por row, scoped al step actual)\n const fieldsContainer = document.createElement('div')\n fieldsContainer.className = 'easy-form-wizard-fields'\n const currentFields = this.stateManager.getCurrentStepFields()\n this.renderFields(fieldsContainer, currentFields)\n wizardContainer.appendChild(fieldsContainer)\n\n // Botones de navegación\n const navContainer = document.createElement('div')\n navContainer.className = 'easy-form-wizard-nav'\n\n // Botón Anterior (solo si no es el primer paso)\n if (wizardState.currentStep > 0) {\n const prevButton = document.createElement('button')\n prevButton.type = 'button'\n prevButton.textContent = 'Anterior'\n prevButton.className = 'easy-form-wizard-prev'\n if (this.disabled || this.loading) {\n prevButton.disabled = true\n } else {\n prevButton.addEventListener('click', () => {\n const currentState = this.stateManager.getWizardState()\n if (currentState && this.stateManager.previousStep()) {\n this.render()\n this.emitStepChange()\n }\n })\n }\n navContainer.appendChild(prevButton)\n }\n\n // Botón Siguiente (solo si NO es el último paso)\n if (wizardState.currentStep < wizardState.totalSteps - 1) {\n const nextButton = document.createElement('button')\n nextButton.type = 'button'\n nextButton.textContent = 'Siguiente'\n nextButton.className = 'easy-form-wizard-next'\n if (this.disabled || this.loading) {\n nextButton.disabled = true\n } else {\n nextButton.addEventListener('click', async () => {\n // Obtener el estado actual del wizard\n const currentState = this.stateManager.getWizardState()\n if (!currentState) return\n\n // Validar solo los campos del step actual antes de avanzar\n const currentFields = this.stateManager.getCurrentStepFields()\n \n // Validar cada campo del paso actual\n for (const field of currentFields) {\n // Solo validar campos visibles\n if (this.stateManager.getFieldVisibility(field.name)) {\n await this.stateManager.validateField(field.name)\n }\n }\n \n // Obtener errores después de validar\n const allErrors = this.stateManager.getAllErrors()\n const stepErrors: Record<string, string[]> = {}\n \n // Filtrar solo errores de campos del paso actual\n for (const field of currentFields) {\n if (allErrors[field.name] && allErrors[field.name].length > 0) {\n stepErrors[field.name] = allErrors[field.name]\n }\n }\n\n const hasErrors = Object.keys(stepErrors).length > 0\n\n if (!hasErrors) {\n // Marcar el paso actual como completado\n this.stateManager.completeStep(currentState.currentStep)\n \n // Avanzar al siguiente paso\n const moved = this.stateManager.nextStep()\n if (moved) {\n // Renderizar después de actualizar el estado\n // El render preservará el estado actualizado (con el nuevo paso)\n this.render()\n this.emitStepChange()\n }\n } else {\n this.emitError(stepErrors)\n }\n })\n }\n navContainer.appendChild(nextButton)\n }\n\n // Botón Enviar (solo en el último paso)\n const submitConfig = this.getSubmitButtonConfig(schema)\n if (\n wizardState.currentStep === wizardState.totalSteps - 1 &&\n submitConfig.visible\n ) {\n const submitButton = document.createElement('button')\n submitButton.type = 'button'\n submitButton.textContent = submitConfig.text\n submitButton.className = 'easy-form-wizard-next'\n submitButton.style.width = submitConfig.width\n if (this.disabled || this.loading) {\n submitButton.disabled = true\n } else {\n submitButton.addEventListener('click', async () => {\n // Validar todos los campos del último paso antes de enviar\n const currentFields = this.stateManager.getCurrentStepFields()\n \n // Validar cada campo del paso actual\n for (const field of currentFields) {\n // Solo validar campos visibles\n if (this.stateManager.getFieldVisibility(field.name)) {\n await this.stateManager.validateField(field.name)\n }\n }\n \n // Obtener errores después de validar\n const allErrors = this.stateManager.getAllErrors()\n const stepErrors: Record<string, string[]> = {}\n \n // Filtrar solo errores de campos del paso actual\n for (const field of currentFields) {\n if (allErrors[field.name] && allErrors[field.name].length > 0) {\n stepErrors[field.name] = allErrors[field.name]\n }\n }\n\n const hasErrors = Object.keys(stepErrors).length > 0\n\n if (!hasErrors) {\n await this.handleSubmit(new Event('submit') as SubmitEvent)\n } else {\n this.emitError(stepErrors)\n }\n })\n }\n navContainer.appendChild(submitButton)\n }\n\n wizardContainer.appendChild(navContainer)\n container.appendChild(wizardContainer)\n }\n\n /**\n * Maneja el cambio de un campo\n */\n private async handleFieldChange(fieldName: string, value: any) {\n await this.stateManager.setValue(fieldName, value)\n this.scheduleSave()\n \n // Si es un array, re-renderizar para reflejar add/remove\n const schema = this.schema\n if (schema) {\n const field = this.findFieldInSchema(schema, fieldName)\n if (field?.type === 'array') {\n const replaced = this.rerenderArrayField(field)\n // Si no se encontró el contenedor, hacer render completo (ej. array dentro de row/group)\n if (!replaced) {\n this.skipPreserveValuesOnNextRender = true\n requestAnimationFrame(() => this.render())\n }\n }\n }\n \n // Obtener campos dependientes que necesitan re-renderizarse\n const dependentFields = this.stateManager.getDependentFields(fieldName)\n \n // Re-renderizar campos dependientes si hay cambios en dependencias\n if (dependentFields.length > 0) {\n // Usar un pequeño delay para agrupar múltiples cambios\n if (this.dependencyRenderTimeout) {\n clearTimeout(this.dependencyRenderTimeout)\n }\n \n this.dependencyRenderTimeout = setTimeout(() => {\n this.renderDependentFields(dependentFields)\n this.emitDependencyChange(fieldName, dependentFields)\n }, 10)\n }\n\n // Emitir evento change\n const changeEvent = new CustomEvent<ChangeEventDetail>('change', {\n detail: {\n field: fieldName,\n value,\n values: this.stateManager.getState().values,\n },\n bubbles: true,\n composed: true,\n })\n this.dispatchEvent(changeEvent)\n }\n\n private dependencyRenderTimeout: ReturnType<typeof setTimeout> | null = null\n\n /**\n * Re-renderiza un campo array cuando se añaden o eliminan ítems.\n * Retorna true si se reemplazó, false si no se encontró el contenedor.\n */\n private rerenderArrayField(field: Field): boolean {\n const arrayContainer = this.shadow.querySelector(\n `[data-field-name=\"${field.name}\"].easy-form-array`\n )\n if (!arrayContainer?.parentNode) return false\n\n const newArrayElement = this.renderArray(field)\n arrayContainer.parentNode.replaceChild(newArrayElement, arrayContainer)\n return true\n }\n\n /**\n * Re-renderiza campos dependientes\n */\n private renderDependentFields(fieldNames: string[]): void {\n const schema = this.schema\n if (!schema) return\n\n // Obtener TODOS los campos que podrían verse afectados\n // Incluir todos los campos del schema que tengan dependencias\n const allFieldsWithDeps = this.getAllFieldsWithDependencies(schema)\n \n const hasAnyFieldsWithDeps = allFieldsWithDeps.length > 0\n\n console.log('renderDependentFields:', { fieldNames, hasAnyFieldsWithDeps, allFieldsWithDeps: allFieldsWithDeps.map(f => f.name) })\n\n // Siempre re-renderizar individualmente los campos afectados\n // Esto evita re-renders completos que causan pérdida de foco\n const form = this.shadow.querySelector('form')\n if (!form) return\n\n // Obtener todos los nombres de campos a re-renderizar\n const fieldsToRerender = new Set<string>()\n \n // Agregar los campos directamente afectados\n for (const fn of fieldNames) {\n fieldsToRerender.add(fn)\n }\n \n // Agregar campos que dependen de los campos afectados\n for (const fn of fieldNames) {\n const deps = this.stateManager.getDependentFields(fn)\n deps.forEach(d => fieldsToRerender.add(d))\n }\n\n // Re-renderizar cada campo individualmente\n for (const fieldName of fieldsToRerender) {\n // Buscar el campo en el DOM\n let fieldContainer = form.querySelector(`[data-field-name=\"${fieldName}\"]`)\n \n // Si no se encuentra por data-field-name, buscar por nombre en campos\n if (!fieldContainer) {\n fieldContainer = form.querySelector(`.easy-form-field[name=\"${fieldName}\"]`)\n }\n \n // Para grupos, buscar el contenedor del grupo\n if (!fieldContainer) {\n fieldContainer = form.querySelector(`[data-field-name=\"${fieldName}\"], [data-group-name=\"${fieldName}\"]`)\n }\n\n if (fieldContainer) {\n const field = this.findFieldInSchema(schema, fieldName)\n if (!field) continue\n\n // Siempre re-renderizar para recalcular visibilidad\n const parent = fieldContainer.parentElement\n if (parent) {\n const newFieldElement = this.renderField(field)\n if (newFieldElement) {\n parent.replaceChild(newFieldElement, fieldContainer)\n }\n }\n }\n }\n }\n\n /**\n * Obtiene todos los campos que tienen dependencias\n */\n private getAllFieldsWithDependencies(schema: FormSchema): Field[] {\n const result: Field[] = []\n \n const extractFields = (fields: Field[]) => {\n for (const field of fields) {\n if (field.dependencies) {\n result.push(field)\n }\n if (field.type === 'group' && 'fields' in field) {\n extractFields(field.fields)\n }\n if (field.type === 'row' && 'fields' in field) {\n extractFields(field.fields)\n }\n if (field.type === 'array' && 'itemSchema' in field && field.itemSchema?.fields) {\n extractFields(field.itemSchema.fields)\n }\n }\n }\n \n const topLevelFields = (schema as any).isWizard\n ? (schema as any).steps!.flatMap((step: any) => step.fields)\n : schema.fields || []\n \n extractFields(topLevelFields)\n return result\n }\n\n /**\n * Emite evento de cambio de dependencia\n */\n private emitDependencyChange(\n changedField: string,\n affectedFields: string[]\n ): void {\n const dependencyEvent = new CustomEvent('dependencyChange', {\n detail: {\n changedField,\n affectedFields,\n },\n bubbles: true,\n composed: true,\n })\n this.dispatchEvent(dependencyEvent)\n }\n\n /**\n * Maneja el blur de un campo\n */\n private async handleFieldBlur(fieldName: string) {\n this.stateManager.setTouched(fieldName)\n // Validar solo el campo que perdió el foco\n await this.stateManager.validateField(fieldName)\n // Actualizar solo el campo específico sin re-renderizar todo el formulario\n this.updateSingleField(fieldName)\n }\n\n /**\n * Actualiza solo un campo específico sin re-renderizar todo el formulario\n */\n private updateSingleField(fieldName: string) {\n const schema = this.schema\n if (!schema) return\n\n const field = this.findFieldInSchema(schema, fieldName)\n if (!field) return\n\n const errors = this.stateManager.getErrors(fieldName)\n const error = errors.length > 0 ? errors[0] : undefined\n\n // Buscar el contenedor del campo en el DOM\n const fieldContainer = this.shadow.querySelector(`[name=\"${fieldName}\"]`)?.closest('.easy-form-field')\n if (!fieldContainer) return\n\n // Actualizar el error\n const errorElement = fieldContainer.querySelector('.easy-form-error')\n if (error) {\n if (!errorElement) {\n const errorEl = document.createElement('p')\n errorEl.className = 'easy-form-error'\n errorEl.textContent = error\n fieldContainer.appendChild(errorEl)\n } else {\n errorElement.textContent = error\n }\n // Agregar clase de error al input\n const input = fieldContainer.querySelector('input, textarea, select') as HTMLElement\n input?.classList.add('easy-form-input-error')\n } else {\n errorElement?.remove()\n const input = fieldContainer.querySelector('input, textarea, select') as HTMLElement\n input?.classList.remove('easy-form-input-error')\n }\n }\n\n /**\n * Busca un campo por nombre en el schema (soporta rutas como 'group.subfield')\n */\n private findFieldInSchema(schema: FormSchema, name: string): Field | null {\n const fields = schema.fields || []\n const dot = name.indexOf('.')\n if (dot > 0) {\n const parentName = name.slice(0, dot)\n const childName = name.slice(dot + 1)\n const parent = fields.find((f) => f.name === parentName)\n if (!parent) return null\n if ((parent.type === 'group' || parent.type === 'row') && 'fields' in parent && parent.fields) {\n const found = this.findFieldInSchema({ fields: parent.fields }, childName)\n return found ? { ...found, name } : null\n }\n return null\n }\n for (const field of fields) {\n if (field.name === name) {\n return field\n }\n if (field.type === 'group' && 'fields' in field) {\n const found = this.findFieldInSchema({ fields: field.fields }, name)\n if (found) return found\n }\n if (field.type === 'row' && 'fields' in field) {\n const found = this.findFieldInSchema({ fields: field.fields }, name)\n if (found) return found\n }\n }\n return null\n }\n\n /**\n * Maneja el submit del formulario\n */\n private async handleSubmit(event: Event) {\n event.preventDefault()\n\n if (this.attemptsLock?.isLocked()) {\n return\n }\n\n if (this.timerExpired) {\n this.emitError({ form: ['El tiempo ha expirado. No puedes enviar el formulario.'] })\n return\n }\n\n const errors = await this.stateManager.validateForm()\n const state = this.stateManager.getState()\n\n if (Object.keys(errors).length > 0) {\n // Update error display without full re-render\n for (const fieldName of Object.keys(errors)) {\n this.updateSingleField(fieldName)\n }\n this.emitError(errors)\n return\n }\n\n // Emitir evento submit\n const submitDetail: SubmitEventDetail = {\n values: state.values,\n isValid: true,\n errors: {},\n }\n\n if (this.completeTime && this.timerStarted) {\n submitDetail.timeRemaining = this.timeRemaining\n }\n\n const submitEvent = new CustomEvent<SubmitEventDetail>('submit', {\n detail: submitDetail,\n bubbles: true,\n composed: true,\n })\n this.dispatchEvent(submitEvent)\n\n // Limpiar datos de persistencia después de submit exitoso\n this.clearPersistence()\n }\n\n /**\n * Emite evento de error\n */\n private emitError(errors: Record<string, string[]>) {\n const errorEvent = new CustomEvent<ErrorEventDetail>('error', {\n detail: {\n errors,\n },\n bubbles: true,\n composed: true,\n })\n this.dispatchEvent(errorEvent)\n }\n\n /**\n * Emite evento de cambio de step\n */\n private emitStepChange() {\n const wizardState = this.stateManager.getWizardState()\n if (!wizardState) return\n\n const stepChangeEvent = new CustomEvent<StepChangeEventDetail>(\n 'stepChange',\n {\n detail: {\n currentStep: wizardState.currentStep,\n previousStep:\n wizardState.currentStep > 0\n ? wizardState.currentStep - 1\n : wizardState.currentStep,\n totalSteps: wizardState.totalSteps,\n },\n bubbles: true,\n composed: true,\n }\n )\n this.dispatchEvent(stepChangeEvent)\n }\n\n /**\n * Registra componentes personalizados\n */\n public registerComponents(components: ComponentRegistry): void {\n this.customComponents = { ...this.customComponents, ...components }\n registerComponents(components)\n }\n\n /**\n * Resetea el formulario a sus valores iniciales\n */\n public reset(): void {\n this.stateManager.reset()\n this.render()\n }\n\n /**\n * Incrementa el contador de intentos (para bloqueo por intentos fallidos).\n * El consumidor debe llamar esto cuando la API/login falle.\n */\n public incrementAttempts(): void {\n this.attemptsLock?.incrementAttempts()\n if (this.attemptsLock?.isLocked()) {\n this.updateLockOverlay()\n }\n }\n\n /**\n * Resetea el contador de intentos y desbloquea el formulario.\n */\n public resetAttempts(): void {\n this.attemptsLock?.reset()\n this.stopLockCountdown()\n this.updateLockOverlay()\n this.render()\n }\n\n /**\n * Retorna true si el formulario está bloqueado por intentos.\n */\n public isLocked(): boolean {\n return this.attemptsLock?.isLocked() ?? false\n }\n\n /**\n * Retorna los milisegundos restantes del bloqueo, o 0 si no está bloqueado.\n */\n public getRemainingBlockTimeMs(): number {\n return this.attemptsLock?.getRemainingBlockTimeMs() ?? 0\n }\n\n /**\n * Dispara el submit del formulario programáticamente.\n * Útil cuando el botón submit está oculto (visible: false).\n */\n public requestSubmit(): void {\n const form = this.shadow.querySelector('form')\n if (form && typeof (form as HTMLFormElement).requestSubmit === 'function') {\n ;(form as HTMLFormElement).requestSubmit()\n }\n }\n\n /**\n * Limpia todos los valores del formulario\n */\n public clear(): void {\n const schema = this.schema\n const templateName = this.template\n let currentSchema: FormSchema | null = null\n \n if (templateName) {\n currentSchema = this.getSchemaFromTemplate(templateName)\n } else {\n currentSchema = schema\n }\n \n if (currentSchema) {\n this.stateManager.initializeSchema(currentSchema, {})\n this.render()\n }\n }\n\n /**\n * Obtiene todos los valores del formulario\n */\n public getValues(): Record<string, any> {\n return this.stateManager.getState().values\n }\n\n /**\n * Obtiene el valor de un campo específico\n */\n public getValue(fieldName: string): any {\n return this.stateManager.getValue(fieldName)\n }\n\n /**\n * Establece el valor de un campo específico\n */\n public async setValue(fieldName: string, value: any): Promise<void> {\n await this.stateManager.setValue(fieldName, value)\n this.render()\n }\n\n /**\n * Establece múltiples valores a la vez\n */\n public async setValues(values: Record<string, any>): Promise<void> {\n for (const [fieldName, value] of Object.entries(values)) {\n await this.stateManager.setValue(fieldName, value)\n }\n this.render()\n }\n\n /**\n * Valida el formulario completo\n */\n public async validate(): Promise<Record<string, string[]>> {\n const errors = await this.stateManager.validateForm()\n // Update error display without full re-render\n if (Object.keys(errors).length > 0) {\n // Update error messages for each field with errors\n for (const fieldName of Object.keys(errors)) {\n this.updateSingleField(fieldName)\n }\n this.emitError(errors)\n } else {\n // Clear all error displays\n const errorElements = this.shadow.querySelectorAll('.easy-form-error')\n errorElements.forEach(el => el.remove())\n const inputErrors = this.shadow.querySelectorAll('.easy-form-input-error')\n inputErrors.forEach(el => el.classList.remove('easy-form-input-error'))\n }\n return errors\n }\n\n /**\n * Valida un campo específico\n */\n public async validateField(fieldName: string): Promise<string[]> {\n await this.stateManager.validateField(fieldName)\n this.updateSingleField(fieldName)\n return this.stateManager.getErrors(fieldName)\n }\n\n /**\n * Obtiene todos los errores del formulario\n */\n public getErrors(): Record<string, string[]> {\n return this.stateManager.getAllErrors()\n }\n\n /**\n * Obtiene los errores de un campo específico\n */\n public getFieldErrors(fieldName: string): string[] {\n return this.stateManager.getErrors(fieldName)\n }\n\n /**\n * Verifica si el formulario es válido\n */\n public isValid(): boolean {\n return this.stateManager.getState().isValid\n }\n\n /**\n * Obtiene el tema del formulario\n */\n get theme(): FormTheme {\n const themeAttr = this.getAttribute('theme')\n const validThemes: FormTheme[] = [\n 'plano',\n 'tradicional',\n 'material',\n 'rounded-shadow',\n 'lines',\n 'shadcn',\n 'chakra',\n 'mantine',\n 'glass',\n 'bordered',\n 'minimal',\n 'efc'\n ]\n if (themeAttr && validThemes.includes(themeAttr as FormTheme)) {\n return themeAttr as FormTheme\n }\n return 'plano' // Tema por defecto\n }\n\n /**\n * Establece el tema del formulario\n */\n set theme(value: FormTheme) {\n if (value) {\n this.setAttribute('theme', value)\n } else {\n this.removeAttribute('theme')\n }\n }\n\n /**\n * Obtiene los colores personalizados\n */\n get colors(): FormColors | null {\n const colorsAttr = this.getAttribute('colors')\n if (!colorsAttr) return null\n return parseAttributeValue(colorsAttr)\n }\n\n /**\n * Establece los colores personalizados\n */\n set colors(value: FormColors | null) {\n if (value) {\n this.setAttribute('colors', attributeValue(value))\n } else {\n this.removeAttribute('colors')\n }\n }\n\n /**\n * Obtiene los datos iniciales\n */\n get initialData(): Record<string, any> | null {\n const initialDataAttr = this.getAttribute('initialData')\n if (!initialDataAttr) return null\n return parseAttributeValue(initialDataAttr)\n }\n\n /**\n * Establece los datos iniciales\n */\n set initialData(value: Record<string, any> | null) {\n if (value) {\n this.setAttribute('initialData', attributeValue(value))\n } else {\n this.removeAttribute('initialData')\n }\n }\n\n /**\n * Obtiene el estado de loading\n */\n get loading(): boolean {\n return this.hasAttribute('loading')\n }\n\n /**\n * Establece el estado de loading\n */\n set loading(value: boolean) {\n if (value) {\n this.setAttribute('loading', '')\n } else {\n this.removeAttribute('loading')\n }\n }\n\n/**\n * Obtiene el estado de disabled\n */\n get disabled(): boolean {\n return this.hasAttribute('disabled')\n }\n\n /**\n * Establece el estado de disabled\n */\n set disabled(value: boolean) {\n if (value) {\n this.setAttribute('disabled', '')\n } else {\n this.removeAttribute('disabled')\n }\n }\n\n /**\n * Obtiene el tiempo límite en segundos\n */\n get completeTime(): number | null {\n const attr = this.getAttribute('complete-time')\n if (!attr) return null\n const n = parseInt(attr, 10)\n return isNaN(n) || n <= 0 ? null : n\n }\n\n /**\n * Establece el tiempo límite en segundos\n */\n set completeTime(value: number | null) {\n if (value != null && value > 0) {\n this.setAttribute('complete-time', String(value))\n } else {\n this.removeAttribute('complete-time')\n }\n }\n\n /**\n * Configura estilos básicos\n */\n private setupStyles() {\n // Eliminar estilos anteriores si existen\n const existingStyle = this.shadow.querySelector('style')\n if (existingStyle) {\n existingStyle.remove()\n }\n\n const theme = this.theme\n const colors = getColors(this.colors || undefined)\n const styles = getThemeStyles(theme, colors)\n\n const style = document.createElement('style')\n style.textContent = styles\n \n // Insertar estilos ANTES de cualquier otro contenido para asegurar que se apliquen\n if (this.shadow.firstChild) {\n this.shadow.insertBefore(style, this.shadow.firstChild)\n } else {\n this.shadow.appendChild(style)\n }\n }\n\n /**\n * Inicializa la persistencia del formulario\n */\n private initPersistence(schema: FormSchema) {\n if (!schema.persistence || !schema.persistence.enabled) {\n this.persistenceConfig = null\n return\n }\n\n this.persistenceConfig = {\n enabled: true,\n key: schema.persistence.key,\n autoSave: schema.persistence.autoSave ?? true,\n debounce: schema.persistence.debounce ?? 500,\n onRestore: schema.persistence.onRestore,\n }\n\n // Intentar restaurar datos guardados\n this.restoreFromStorage()\n }\n\n /**\n * Restaura los valores desde localStorage\n */\n private restoreFromStorage() {\n if (!this.persistenceConfig || !this.persistenceConfig.enabled) return\n if (!this.persistenceConfig.key) return\n\n try {\n const stored = localStorage.getItem(this.persistenceConfig.key)\n if (stored) {\n const values = JSON.parse(stored)\n if (values && typeof values === 'object') {\n // Guardar valores temporalmente para aplicar después del render\n this.pendingRestoreValues = values\n \n // Llamar al callback onRestore si existe\n if (this.persistenceConfig.onRestore) {\n this.persistenceConfig.onRestore(values)\n }\n }\n }\n } catch (e) {\n console.warn('EasyForm: Error restoring from localStorage:', e)\n }\n }\n\n /**\n * Aplica los valores pendientes de restauración después del render\n */\n private applyPendingRestoreValues() {\n if (!this.pendingRestoreValues || this.isRestoringValues) return\n \n this.isRestoringValues = true\n const valuesToRestore = { ...this.pendingRestoreValues }\n this.pendingRestoreValues = null\n \n for (const [key, value] of Object.entries(valuesToRestore)) {\n this.stateManager.setValueWithoutValidation(key, value)\n }\n \n // Actualizar los inputs del DOM directamente\n this.updateInputsWithValues(valuesToRestore)\n \n this.isRestoringValues = false\n }\n\n /**\n * Actualiza los valores de los inputs del DOM\n */\n private updateInputsWithValues(values: Record<string, any>) {\n for (const fieldName of Object.keys(values)) {\n const input = this.shadow.querySelector(`[name=\"${fieldName}\"]`) as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n if (input) {\n input.value = values[fieldName] ?? ''\n }\n }\n }\n\n /**\n * Guarda los valores en localStorage\n */\n private saveToStorage() {\n if (!this.persistenceConfig || !this.persistenceConfig.enabled) return\n if (!this.persistenceConfig.key) return\n\n try {\n const values = this.stateManager.getState().values\n localStorage.setItem(this.persistenceConfig.key, JSON.stringify(values))\n } catch (e) {\n console.warn('EasyForm: Error saving to localStorage:', e)\n }\n }\n\n /**\n * Programa un guardado debounced\n */\n private scheduleSave() {\n if (!this.persistenceConfig || !this.persistenceConfig.enabled) return\n if (!this.persistenceConfig.autoSave) return\n\n // Limpiar timer anterior\n if (this.persistenceDebounceTimer) {\n clearTimeout(this.persistenceDebounceTimer)\n }\n\n // Programar nuevo guardado\n this.persistenceDebounceTimer = setTimeout(() => {\n this.saveToStorage()\n }, this.persistenceConfig.debounce)\n }\n\n /**\n * Limpia los datos de persistencia\n */\n private clearPersistence() {\n if (!this.persistenceConfig || !this.persistenceConfig.key) return\n\n try {\n localStorage.removeItem(this.persistenceConfig.key)\n } catch (e) {\n console.warn('EasyForm: Error clearing localStorage:', e)\n }\n }\n\n /**\n * Resetea el timer de complete-time\n */\n private resetTimer(): void {\n if (this.completeTimeInterval) {\n clearInterval(this.completeTimeInterval)\n this.completeTimeInterval = null\n }\n this.timerStarted = false\n this.timerExpired = false\n if (this.completeTime) {\n this.timeRemaining = this.completeTime\n }\n }\n\n /**\n * Inicia el timer de complete-time\n */\n private startTimer(): void {\n if (this.timerStarted || this.timerExpired || !this.completeTime) return\n\n this.timerStarted = true\n this.timeRemaining = this.completeTime\n\n this.updateTimerDisplay()\n\n this.completeTimeInterval = setInterval(() => {\n this.timeRemaining--\n this.updateTimerDisplay()\n\n if (this.timeRemaining <= 0) {\n this.handleTimerExpired()\n }\n }, 1000)\n }\n\n /**\n * Actualiza la visualización del timer\n */\n private updateTimerDisplay(): void {\n const existingTimer = this.shadow.querySelector('.easy-form-timer')\n if (!existingTimer) return\n\n const minutes = Math.floor(this.timeRemaining / 60)\n const seconds = this.timeRemaining % 60\n const timeStr = `${minutes}:${seconds.toString().padStart(2, '0')}`\n existingTimer.textContent = timeStr\n\n if (this.timeRemaining <= 30) {\n existingTimer.classList.add('easy-form-timer-warning')\n }\n if (this.timeRemaining <= 10) {\n existingTimer.classList.add('easy-form-timer-danger')\n }\n }\n\n /**\n * Maneja cuando el timer expira\n */\n private handleTimerExpired(): void {\n if (this.completeTimeInterval) {\n clearInterval(this.completeTimeInterval)\n this.completeTimeInterval = null\n }\n\n this.timerExpired = true\n\n const timeoutEvent = new CustomEvent<TimeoutEventDetail>('timeout', {\n detail: {\n originalTime: this.completeTime || 0,\n expiredAt: new Date(),\n },\n bubbles: true,\n composed: true,\n })\n this.dispatchEvent(timeoutEvent)\n\n this.disableAllFields()\n }\n\n /**\n * Deshabilita todos los campos del formulario\n */\n private disableAllFields(): void {\n const form = this.shadow.querySelector('form')\n if (!form) return\n\n const inputs = form.querySelectorAll('input, textarea, select, button')\n inputs.forEach((input) => {\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement || input instanceof HTMLSelectElement) {\n (input as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).disabled = true\n } else if (input instanceof HTMLButtonElement && input.type !== 'submit') {\n input.disabled = true\n }\n })\n\n form.classList.add('easy-form-timer-expired')\n\n const timerDisplay = this.shadow.querySelector('.easy-form-timer')\n if (timerDisplay) {\n timerDisplay.classList.add('easy-form-timer-expired')\n timerDisplay.textContent = 'Tiempo agotado'\n }\n }\n\n /**\n * Configura el event listener para iniciar el timer en el primer input\n */\n private setupTimerInputListener(): void {\n if (!this.completeTime || this.timerStarted) return\n\n const form = this.shadow.querySelector('form')\n if (!form) return\n\n const handleFirstInput = () => {\n if (!this.timerStarted && !this.timerExpired) {\n this.startTimer()\n }\n }\n\n form.addEventListener('input', handleFirstInput, { once: true })\n }\n\n /**\n * Renderiza el display del timer\n */\n private renderTimerDisplay(): void {\n const existingTimer = this.shadow.querySelector('.easy-form-timer')\n if (existingTimer) existingTimer.remove()\n\n const form = this.shadow.querySelector('form')\n if (!form) return\n\n const timerContainer = document.createElement('div')\n timerContainer.className = 'easy-form-timer'\n\n const initialTime = this.completeTime || 0\n const minutes = Math.floor(initialTime / 60)\n const seconds = initialTime % 60\n timerContainer.textContent = `${minutes}:${seconds.toString().padStart(2, '0')}`\n\n form.insertBefore(timerContainer, form.firstChild)\n }\n}\n\n// Registrar el Web Component solo en el navegador\nif (typeof window !== 'undefined' && typeof customElements !== 'undefined' && !customElements.get('easy-form')) {\n customElements.define('easy-form', EasyForm)\n}\n"],"mappings":"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AAM;AAAA,gCACTA,EAAO,UAAU;AAAA,sCACXA,EAAO,eAAe;AAAA,iCAC3BA,EAAO,UAAU;AAAA,kCAChBA,EAAO,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAiHT,CClHO,SAASC,GAAgBC,EAAuC,CACrE,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAsIT,CCvIO,SAASC,GAAgBC,EAAuC,CACrE,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAiGT,CClGO,SAASC,GAAiBC,EAAuC,CACtE,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA8ET,CC/EO,SAASC,GAAeC,EAAuC,CACpE,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA6JT,CC9JO,SAASC,GAAkBC,EAAuC,CACvE,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAsFT,CCvFO,SAASC,GAAiBC,EAAuC,CACtE,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA0MT,CC3MO,SAASC,GAAaC,EAAuC,CAClE,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAsMT,CC1LO,SAASC,EAAeC,EAAkBC,EAAsC,CACrF,IAAMC,EAAaC,GAAcF,CAAM,EACjCG,EAAcC,GAAuBL,EAAOC,CAAM,EACxD,OAAOC,EAAaE,CACtB,CAEO,SAASC,GAAuBL,EAAkBC,EAAsC,CAC7F,OAAQD,EAAO,CACb,IAAK,QACH,OAAOM,GAAeL,CAAM,EAC9B,IAAK,cACH,OAAOM,GAAqBN,CAAM,EACpC,IAAK,WACH,OAAOO,GAAkBP,CAAM,EACjC,IAAK,iBACH,OAAOQ,GAAuBR,CAAM,EACtC,IAAK,QACH,OAAOS,GAAeT,CAAM,EAC9B,IAAK,SACH,OAAOU,GAAgBV,CAAM,EAC/B,IAAK,SACH,OAAOW,GAAgBX,CAAM,EAC/B,IAAK,UACH,OAAOY,GAAiBZ,CAAM,EAChC,IAAK,QACH,OAAOa,GAAeb,CAAM,EAC9B,IAAK,WACH,OAAOc,GAAkBd,CAAM,EACjC,IAAK,UACH,OAAOe,GAAiBf,CAAM,EAChC,IAAK,MACH,OAAOgB,GAAahB,CAAM,EAC5B,QACE,OAAOK,GAAeL,CAAM,CAChC,CACF,CC7CO,IAAMiB,GAAuD,CAClE,MAAS,CACP,QAAS,iBACT,YAAa,GACf,EACA,WAAY,CACV,QAAS,iBACT,YAAa,GACf,EACA,sBAAuB,CACrB,QAAS,mBACT,YAAa,GACf,EACA,KAAQ,CACN,QAAS,aACT,YAAa,GACf,EACA,UAAW,CACT,QAAS,aACT,YAAa,GACf,EACA,UAAW,CACT,QAAS,aACT,YAAa,GACf,EACA,cAAe,CACb,QAAS,sBACT,YAAa,GACf,EACA,IAAO,CACL,QAAS,cACT,YAAa,GACf,EACA,WAAY,CACV,QAAS,QACT,YAAa,GACf,EACA,SAAY,CACV,QAAS,cACT,YAAa,IACb,UAAYC,GAAkB,CAE5B,IAAMC,EAAUD,EAAM,QAAQ,UAAW,EAAE,EAE3C,OADY,WAAWC,CAAO,GAAK,GACxB,QAAQ,CAAC,CACtB,CACF,EACA,WAAc,CACZ,QAAS,OACT,YAAa,IACb,UAAYD,GACMA,EAAM,QAAQ,SAAU,EAAE,CAG9C,EACA,KAAQ,CACN,QAAS,QACT,YAAa,GACf,EACA,SAAY,CACV,QAAS,mBACT,YAAa,GACf,CACF,EAKO,SAASE,GAAkBC,EAAkC,CAClE,OAAOJ,GAAiBI,CAAI,CAC9B,CCtEO,IAAMC,GACX,wDAGIC,GAA+B,CAEnC,uGACA,6CACA,uCACA,SACA,kBACA,yBACA,yBACA,eACA,YAGA,wCACA,aACA,kBACA,gBACA,8BACA,uBACA,aACA,aACA,YACA,eACA,qCACA,gCAGA,0DACA,iBACA,UACA,WAGA,gBACA,oCACA,gBACA,aACF,EAKO,SAASC,GAAkBC,EAAwB,CAKxD,GAJI,OAAOA,GAAU,UAAYA,EAAM,SAAW,GAG/BA,EAAM,KAAK,EACf,SAAW,EAAG,MAAO,GAEpC,QAAWC,KAAWH,GACpB,GAAIG,EAAQ,KAAKD,CAAK,EACpB,MAAO,GAGX,MAAO,EACT,CAMO,SAASE,EAAoBF,EAAyB,CAC3D,OAAIA,GAAU,KACL,GAEL,OAAOA,GAAU,SACZ,CAACD,GAAkBC,CAAK,EAE7B,MAAM,QAAQA,CAAK,EACdA,EAAM,MAAOG,GAASD,EAAoBC,CAAI,CAAC,EAEpD,OAAOH,GAAU,SACZ,OAAO,OAAOA,CAAgC,EAAE,MAAOI,GAC5DF,EAAoBE,CAAC,CACvB,EAGK,EACT,CCtEO,IAAMC,EAAN,KAAmB,CAUxB,YAAYC,EAA8B,CAN1C,KAAQ,SAAmB,EAC3B,KAAQ,YAA6B,KAGrC,KAAQ,oBAA6D,KAGnE,KAAK,YAAc,KAAK,IAAI,EAAGA,EAAQ,WAAW,EAClD,KAAK,iBACFA,EAAQ,sBAAwB,GAAK,GAAK,IAC7C,KAAK,WAAaA,EAAQ,WAC1B,KAAK,SAAWA,EAAQ,SACxB,KAAK,WAAaA,EAAQ,WAEtB,KAAK,YAAc,OAAO,eAAmB,KAC/C,KAAK,gBAAgB,CAEzB,CAEQ,iBAAwB,CAC9B,GAAI,GAAC,KAAK,YAAc,OAAO,eAAmB,KAClD,GAAI,CACF,IAAMC,EAAS,eAAe,QAAQ,KAAK,UAAU,EACrD,GAAIA,EAAQ,CACV,IAAMC,EAAwB,KAAK,MAAMD,CAAM,EAC/C,KAAK,SAAWC,EAAK,UAAY,EACjC,KAAK,YAAcA,EAAK,aAAe,KACvC,KAAK,gBAAgB,CACvB,CACF,MAAQ,CAER,CACF,CAEQ,eAAsB,CAC5B,GAAI,GAAC,KAAK,YAAc,OAAO,eAAmB,KAClD,GAAI,CACF,IAAMA,EAAwB,CAC5B,SAAU,KAAK,SACf,YAAa,KAAK,aAAe,MACnC,EACA,eAAe,QAAQ,KAAK,WAAY,KAAK,UAAUA,CAAI,CAAC,CAC9D,MAAQ,CAER,CACF,CAEQ,iBAA2B,CACjC,OAAI,KAAK,cAAgB,KAAa,GAClC,KAAK,IAAI,GAAK,KAAK,aACrB,KAAK,MAAM,EACX,KAAK,aAAa,EACX,IAEF,EACT,CAEQ,kBAAyB,CAC3B,KAAK,sBACT,KAAK,oBAAsB,YAAY,IAAM,CACvC,KAAK,gBAAgB,GACvB,KAAK,gBAAgB,CAEzB,EAAG,GAAI,EACT,CAEQ,iBAAwB,CAC1B,KAAK,sBACP,cAAc,KAAK,mBAAmB,EACtC,KAAK,oBAAsB,KAE/B,CAKA,mBAA0B,CACxB,KAAK,WACD,KAAK,UAAY,KAAK,aACxB,KAAK,YAAc,KAAK,IAAI,EAAI,KAAK,gBACrC,KAAK,cAAc,EACnB,KAAK,WAAW,KAAK,eAAe,EACpC,KAAK,iBAAiB,GAEtB,KAAK,cAAc,CAEvB,CAKA,UAAoB,CAClB,OAAI,KAAK,gBAAgB,EAAU,GAC5B,KAAK,cAAgB,MAAQ,KAAK,IAAI,EAAI,KAAK,WACxD,CAKA,yBAAkC,CAEhC,OADI,KAAK,gBAAgB,GACrB,KAAK,cAAgB,KAAa,EAC/B,KAAK,IAAI,EAAG,KAAK,YAAc,KAAK,IAAI,CAAC,CAClD,CAKA,OAAc,CACZ,KAAK,SAAW,EAChB,KAAK,YAAc,KACnB,KAAK,gBAAgB,EACrB,KAAK,cAAc,CACrB,CAKA,aAAsB,CACpB,OAAO,KAAK,QACd,CACF,ECvIO,SAASC,EAAeC,EAAoB,CACjD,OAAIA,GAAU,KACL,GAEL,OAAOA,GAAU,UACZA,EAAQ,OAAS,QAEtB,OAAOA,GAAU,SACZ,KAAK,UAAUA,CAAK,EAEtB,OAAOA,CAAK,CACrB,CAKO,SAASC,EAAoBD,EAA2B,CAC7D,GAAI,CAACA,EACH,OAAO,KAET,GAAI,CACF,OAAO,KAAK,MAAMA,CAAK,CACzB,MAAQ,CACN,OAAOA,CACT,CACF,CAYO,SAASE,EAAeC,EAA0BC,EAAmB,CAC1E,OAAOA,EAAK,MAAM,GAAG,EAAE,OAAO,CAACC,EAASC,IAAQD,IAAUC,CAAG,EAAGH,CAAG,CACrE,CAKO,SAASI,EACdJ,EACAC,EACAI,EACM,CACN,IAAMC,EAAOL,EAAK,MAAM,GAAG,EACrBM,EAAUD,EAAK,IAAI,EACnBE,EAASF,EAAK,OAAO,CAACJ,EAASC,MAC/B,CAACD,EAAQC,CAAG,GAAK,OAAOD,EAAQC,CAAG,GAAM,YAC3CD,EAAQC,CAAG,EAAI,CAAC,GAEXD,EAAQC,CAAG,GACjBH,CAAG,EACNQ,EAAOD,CAAO,EAAIF,CACpB,CAKO,SAASI,GAAaC,EAAwB,CAEnD,MADmB,6BACD,KAAKA,CAAK,CAC9B,CChEO,IAAMC,EAAN,KAAsB,CAI3B,kBACEC,EACAC,EACS,CACT,IAAMC,EAAa,KAAK,cAAcF,EAAU,MAAOC,CAAU,EACjE,OAAO,KAAK,cAAcC,EAAYF,EAAU,SAAUA,EAAU,KAAK,CAC3E,CAKA,mBACEG,EACAF,EACAG,EAAsB,MACb,CACT,IAAMC,EAAkB,MAAM,QAAQF,CAAU,EAAIA,EAAa,CAACA,CAAU,EAE5E,OAAIE,EAAgB,SAAW,EACtB,GAGLD,IAAU,MACLC,EAAgB,MAAOL,GAC5B,KAAK,kBAAkBA,EAAWC,CAAU,CAC9C,EAEOI,EAAgB,KAAML,GAC3B,KAAK,kBAAkBA,EAAWC,CAAU,CAC9C,CAEJ,CAKA,qBACEK,EACAL,EAKA,CACA,IAAIM,EAAU,GACVC,EAAU,GACVC,EAAW,GAMf,GAHIH,EAAa,OACfC,EAAU,KAAK,mBAAmBD,EAAa,KAAML,CAAU,GAE7DK,EAAa,KAAM,CACrB,IAAMI,EAAa,KAAK,mBAAmBJ,EAAa,KAAML,CAAU,EACxEM,EAAUA,GAAW,CAACG,CACxB,CAMA,GAHIJ,EAAa,SACfE,EAAU,KAAK,mBAAmBF,EAAa,OAAQL,CAAU,GAE/DK,EAAa,QAAS,CACxB,IAAMK,EAAgB,KAAK,mBACzBL,EAAa,QACbL,CACF,EACAO,EAAUA,GAAW,CAACG,CACxB,CAMA,GAHIL,EAAa,WACfG,EAAW,KAAK,mBAAmBH,EAAa,SAAUL,CAAU,GAElEK,EAAa,SAAU,CACzB,IAAMM,EAAmB,KAAK,mBAC5BN,EAAa,SACbL,CACF,EACAQ,EAAWA,GAAY,CAACG,CAC1B,CAEA,MAAO,CAAE,QAAAL,EAAS,QAAAC,EAAS,SAAAC,CAAS,CACtC,CAKQ,cACNI,EACAZ,EACK,CAIL,GAAIY,KAAaZ,EACf,OAAOA,EAAWY,CAAS,EAI7B,IAAMC,EAAQD,EAAU,MAAM,GAAG,EAC7BE,EAAQd,EAEZ,QAAWe,KAAQF,EAAO,CACxB,GAAIC,GAAU,KACZ,OAAO,KAETA,EAAQA,EAAMC,CAAI,CACpB,CAEA,OAAOD,CACT,CAKQ,cACNb,EACAe,EACAC,EACS,CACT,OAAQD,EAAU,CAChB,IAAK,SACH,OAAO,KAAK,UAAUf,EAAYgB,CAAY,EAEhD,IAAK,YACH,MAAO,CAAC,KAAK,UAAUhB,EAAYgB,CAAY,EAEjD,IAAK,WACH,OAAI,MAAM,QAAQhB,CAAU,EACnBA,EAAW,SAASgB,CAAY,EAErC,OAAOhB,GAAe,SACjBA,EAAW,SAAS,OAAOgB,CAAY,CAAC,EAE1C,GAET,IAAK,cACH,MAAO,CAAC,KAAK,cAAchB,EAAY,WAAYgB,CAAY,EAEjE,IAAK,cACH,OAAO,KAAK,SAAShB,CAAU,EAAI,KAAK,SAASgB,CAAY,EAE/D,IAAK,WACH,OAAO,KAAK,SAAShB,CAAU,EAAI,KAAK,SAASgB,CAAY,EAE/D,IAAK,qBACH,OAAO,KAAK,SAAShB,CAAU,GAAK,KAAK,SAASgB,CAAY,EAEhE,IAAK,kBACH,OAAO,KAAK,SAAShB,CAAU,GAAK,KAAK,SAASgB,CAAY,EAEhE,IAAK,KACH,OAAI,MAAM,QAAQA,CAAY,EACrBA,EAAa,SAAShB,CAAU,EAElC,GAET,IAAK,QACH,MAAO,CAAC,KAAK,cAAcA,EAAY,KAAMgB,CAAY,EAE3D,IAAK,UACH,OACEhB,GAAe,MAEfA,IAAe,IACd,MAAM,QAAQA,CAAU,GAAKA,EAAW,SAAW,EAGxD,IAAK,aACH,MAAO,CAAC,KAAK,cAAcA,EAAY,UAAWgB,CAAY,EAEhE,IAAK,QACH,GAAI,CAKF,OAHE,OAAOA,GAAiB,SACpB,IAAI,OAAOA,CAAY,EACvBA,GACO,KAAK,OAAOhB,GAAc,EAAE,CAAC,CAC5C,MAAQ,CACN,MAAO,EACT,CAEF,QACE,MAAO,EACX,CACF,CAKQ,UAAUiB,EAAQC,EAAiB,CACzC,GAAID,IAAMC,EACR,MAAO,GAGT,GAAID,IAAM,MAAQC,IAAM,MAAQD,IAAM,QAAaC,IAAM,OACvD,OAAOD,IAAMC,EAGf,GAAI,OAAOD,GAAM,OAAOC,EACtB,MAAO,GAGT,GAAI,MAAM,QAAQD,CAAC,GAAK,MAAM,QAAQC,CAAC,EACrC,OAAID,EAAE,SAAWC,EAAE,OACV,GAEFD,EAAE,MAAM,CAACE,EAAKC,IAAU,KAAK,UAAUD,EAAKD,EAAEE,CAAK,CAAC,CAAC,EAG9D,GAAI,OAAOH,GAAM,SAAU,CACzB,IAAMI,EAAQ,OAAO,KAAKJ,CAAC,EACrBK,EAAQ,OAAO,KAAKJ,CAAC,EAE3B,OAAIG,EAAM,SAAWC,EAAM,OAClB,GAGFD,EAAM,MAAOE,GAAQ,KAAK,UAAUN,EAAEM,CAAG,EAAGL,EAAEK,CAAG,CAAC,CAAC,CAC5D,CAEA,MAAO,EACT,CAKQ,SAASV,EAAoB,CACnC,GAAI,OAAOA,GAAU,SACnB,OAAOA,EAET,GAAI,OAAOA,GAAU,SAAU,CAC7B,IAAMW,EAAS,WAAWX,CAAK,EAC/B,OAAO,MAAMW,CAAM,EAAI,EAAIA,CAC7B,CACA,MAAO,EACT,CACF,EChOO,IAAMC,GAAN,KAAuB,CAG5B,aAAc,CACZ,KAAK,gBAAkB,IAAIC,CAC7B,CAIA,MAAM,cACJC,EACAC,EACmB,CACnB,OAAO,KAAK,6BAA6BD,EAAOC,EAAOD,EAAM,aAAe,CAAC,CAAC,CAChF,CAKA,MAAM,6BACJE,EACAD,EACAE,EACmB,CACnB,IAAMC,EAAmB,CAAC,EAE1B,GAAI,CAACD,GAAeA,EAAY,SAAW,EACzC,OAAOC,EAGT,QAAWC,KAAcF,EAAa,CACpC,IAAMG,EAAS,MAAM,KAAK,cAAcD,EAAYJ,CAAK,EACpDK,EAAO,SACVF,EAAO,KAAKE,EAAO,SAAW,KAAK,kBAAkBD,CAAU,CAAC,CAEpE,CAEA,OAAOD,CACT,CAKA,MAAc,cACZC,EACAJ,EAC2B,CAC3B,OAAQI,EAAW,KAAM,CACvB,IAAK,WACH,OAAO,KAAK,iBAAiBJ,CAAK,EACpC,IAAK,QACH,OAAO,KAAK,cAAcA,CAAK,EACjC,IAAK,YACH,OAAO,KAAK,kBAAkBA,EAAOI,EAAW,KAAK,EACvD,IAAK,YACH,OAAO,KAAK,kBAAkBJ,EAAOI,EAAW,KAAK,EACvD,IAAK,MACH,OAAO,KAAK,YAAYJ,EAAOI,EAAW,KAAK,EACjD,IAAK,MACH,OAAO,KAAK,YAAYJ,EAAOI,EAAW,KAAK,EACjD,IAAK,UACH,OAAO,KAAK,gBAAgBJ,EAAOI,EAAW,KAAK,EACrD,IAAK,SACH,OAAO,MAAM,KAAK,eAAeJ,EAAOI,CAAU,EACpD,IAAK,cACH,OAAO,KAAK,oBAAoBJ,EAAOI,CAAU,EACnD,QACE,MAAO,CAAE,QAAS,EAAK,CAC3B,CACF,CAKQ,iBAAiBJ,EAA8B,CACrD,IAAMM,EACJN,GAAU,MAEVA,IAAU,IACV,EAAE,MAAM,QAAQA,CAAK,GAAKA,EAAM,SAAW,GAC7C,MAAO,CACL,QAAAM,EACA,QAASA,EAAU,OAAY,yBACjC,CACF,CAKQ,cAAcN,EAA8B,CAClD,GAAI,CAACA,EACH,MAAO,CAAE,QAAS,EAAK,EAEzB,IAAMM,EAAU,OAAON,GAAU,UAAYO,GAAaP,CAAK,EAC/D,MAAO,CACL,QAAAM,EACA,QAASA,EAAU,OAAY,6BACjC,CACF,CAKQ,kBACNN,EACAQ,EACkB,CAClB,GAAI,CAACR,EACH,MAAO,CAAE,QAAS,EAAK,EAGzB,IAAMM,EADM,OAAON,CAAK,EACJ,QAAUQ,EAC9B,MAAO,CACL,QAAAF,EACA,QAASA,EACL,OACA,uBAAuBE,CAAS,aACtC,CACF,CAKQ,kBACNR,EACAS,EACkB,CAClB,GAAI,CAACT,EACH,MAAO,CAAE,QAAS,EAAK,EAGzB,IAAMM,EADM,OAAON,CAAK,EACJ,QAAUS,EAC9B,MAAO,CACL,QAAAH,EACA,QAASA,EACL,OACA,wBAAqBG,CAAS,aACpC,CACF,CAKQ,YAAYT,EAAYU,EAA+B,CAC7D,GAAIV,GAAU,MAA+BA,IAAU,GACrD,MAAO,CAAE,QAAS,EAAK,EAEzB,IAAMW,EAAM,OAAOX,CAAK,EAClBM,EAAU,CAAC,MAAMK,CAAG,GAAKA,GAAOD,EACtC,MAAO,CACL,QAAAJ,EACA,QAASA,EAAU,OAAY,4BAA4BI,CAAG,EAChE,CACF,CAKQ,YAAYV,EAAYY,EAA+B,CAC7D,GAAIZ,GAAU,MAA+BA,IAAU,GACrD,MAAO,CAAE,QAAS,EAAK,EAEzB,IAAMW,EAAM,OAAOX,CAAK,EAClBM,EAAU,CAAC,MAAMK,CAAG,GAAKA,GAAOC,EACtC,MAAO,CACL,QAAAN,EACA,QAASA,EAAU,OAAY,4BAA4BM,CAAG,EAChE,CACF,CAKQ,gBAAgBZ,EAAYa,EAA4C,CAC9E,GAAI,CAACb,EACH,MAAO,CAAE,QAAS,EAAK,EAIzB,IAAIc,EACJ,GAAID,aAAmB,OACrBC,EAAQD,UACC,OAAOA,GAAY,SAC5B,GAAI,CACFC,EAAQ,IAAI,OAAOD,CAAO,CAC5B,MAAY,CAEV,eAAQ,KAAK,yBAA0BA,CAAO,EACvC,CAAE,QAAS,EAAK,CACzB,KAGA,gBAAQ,KAAK,oDAAqD,OAAOA,EAASA,CAAO,EAClF,CAAE,QAAS,EAAK,EAGzB,IAAMP,EAAUQ,EAAM,KAAK,OAAOd,CAAK,CAAC,EACxC,MAAO,CACL,QAAAM,EACA,QAASA,EAAU,OAAY,4BACjC,CACF,CAKQ,oBACNN,EACAI,EACkB,CAClB,GAAIJ,GAAU,MAA+BA,IAAU,GACrD,MAAO,CAAE,QAAS,EAAK,EAEzB,IAAMM,EAAUS,EAAoBf,CAAK,EACzC,MAAO,CACL,QAAAM,EACA,QAASA,EAAU,OAAYF,EAAW,SAAWY,EACvD,CACF,CAKA,MAAc,eACZhB,EACAI,EAC2B,CAC3B,GAAI,CACF,IAAMC,EAAS,MAAMD,EAAW,UAAUJ,CAAK,EAC/C,MAAO,CACL,QAAS,EAAQK,EACjB,QAASA,EAAS,OAAYD,EAAW,SAAW,uBACtD,CACF,MAAgB,CACd,MAAO,CACL,QAAS,GACT,QAASA,EAAW,SAAW,2BACjC,CACF,CACF,CAKQ,kBAAkBA,EAAgC,CACxD,OAAQA,EAAW,KAAM,CACvB,IAAK,WACH,MAAO,0BACT,IAAK,QACH,MAAO,8BACT,IAAK,YACH,MAAO,uBAAwBA,EAAmC,KAAK,cACzE,IAAK,YACH,MAAO,wBAAsBA,EAAmC,KAAK,cACvE,IAAK,MACH,MAAO,4BAA6BA,EAA6B,KAAK,GACxE,IAAK,MACH,MAAO,4BAA6BA,EAA6B,KAAK,GACxE,IAAK,UACH,MAAO,6BACT,IAAK,SACH,MAAO,wBACT,IAAK,cACH,OAAOY,GACT,QACE,MAAO,mBACX,CACF,CAMQ,oBAAoBjB,EAAckB,EAAsC,CAE9E,GAAIlB,EAAM,QAAUA,EAAM,SACxB,MAAO,GAIT,GAAIA,EAAM,aAAc,CAEtB,IAAMM,EAAS,KAAK,gBAAgB,qBAAqBN,EAAM,aAAckB,CAAM,EAQnF,GALI,CAACZ,EAAO,SAKR,CAACA,EAAO,QACV,MAAO,EAEX,CAEA,MAAO,EACT,CAKA,MAAM,aACJa,EACAD,EACmC,CACnC,IAAMd,EAAmC,CAAC,EAE1C,QAAWJ,KAASmB,EAClB,GAAK,KAAK,oBAAoBnB,EAAOkB,CAAM,EAK3C,GAAIlB,EAAM,OAAS,SAAW,eAAgBA,EAAO,CAGnD,IAAMoB,EAFapB,EACW,YACC,QAAU,CAAC,EACpCqB,EAAaH,EAAOlB,EAAM,IAAI,EAEpC,GAAI,MAAM,QAAQqB,CAAU,EAC1B,QAASC,EAAI,EAAGA,EAAID,EAAW,OAAQC,IAAK,CAC1C,IAAMC,EAAYF,EAAWC,CAAC,EAC9B,QAAWE,KAAaJ,EAAY,CAClC,IAAMK,EAAgB,GAAGzB,EAAM,IAAI,IAAIsB,CAAC,IAAIE,EAAU,IAAI,GACpDE,EAAiBH,IAAYC,EAAU,IAAI,EAEjD,GAAI,CAAC,KAAK,oBAAoBA,EAAWN,CAAM,EAC7C,SAGF,IAAMS,EAAc,MAAM,KAAK,cAAcH,EAAWE,CAAc,EAClEC,EAAY,OAAS,IACvBvB,EAAOqB,CAAa,EAAIE,EAE5B,CACF,CAIF,IAAMC,EAAc,MAAM,KAAK,mBAAmB5B,EAAOqB,CAAU,EAC/DO,EAAY,OAAS,IACvBxB,EAAOJ,EAAM,IAAI,EAAI4B,EAEzB,KAAO,CACL,IAAM3B,EAAQiB,EAAOlB,EAAM,IAAI,EACzB2B,EAAc,MAAM,KAAK,cAAc3B,EAAOC,CAAK,EACrD0B,EAAY,OAAS,IACvBvB,EAAOJ,EAAM,IAAI,EAAI2B,EAEzB,CAGF,OAAOvB,CACT,CAKA,MAAc,mBAAmBJ,EAAcC,EAA+B,CAC5E,IAAMG,EAAmB,CAAC,EACpByB,EAAa7B,EAEnB,OAAI6B,EAAW,WAAa,SACV,MAAM,QAAQ5B,CAAK,GAAKA,EAAM,QAAU4B,EAAW,UAEjEzB,EAAO,KAAK,uBAAuByB,EAAW,QAAQ,YAAY,GAIlEA,EAAW,WAAa,SACV,MAAM,QAAQ5B,CAAK,GAAKA,EAAM,QAAU4B,EAAW,UAEjEzB,EAAO,KAAK,wBAAqByB,EAAW,QAAQ,YAAY,GAI7DzB,CACT,CACF,ECtYO,IAAM0B,GAAN,KAAmB,CAUxB,aAAc,CARd,KAAQ,YAAkC,KAC1C,KAAQ,OAA8B,KAItC,KAAQ,gBAA0F,IAAI,IACtG,KAAQ,kBAA8C,IAAI,IAGxD,KAAK,OAAS,IAAIC,EAClB,KAAK,UAAY,IAAIC,GACrB,KAAK,gBAAkB,IAAIC,EAC3B,KAAK,MAAQ,KAAK,mBAAmB,CACvC,CAKQ,oBAAgC,CACtC,MAAO,CACL,OAAQ,CAAC,EACT,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,QAAS,GACT,aAAc,EAChB,CACF,CAKA,iBAAiBC,EAAoBC,EAAyC,CAC5E,KAAK,OAAS,KAAK,OAAO,MAAMD,CAAM,EACtC,KAAK,iBAAiBC,CAAW,EACjC,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,CAC1B,CAMQ,iBAAiBC,EAA0B,CACjD,IAAMC,EAAqB,CAAC,EAE5B,QAAWC,KAASF,EAClBC,EAAU,KAAKC,CAAK,EAEhBA,EAAM,OAAS,SAAW,WAAYA,GACxCD,EAAU,KAAK,GAAG,KAAK,iBAAiBC,EAAM,MAAM,CAAC,EAEnDA,EAAM,OAAS,OAAS,WAAYA,GACtCD,EAAU,KAAK,GAAG,KAAK,iBAAiBC,EAAM,MAAM,CAAC,EAKzD,OAAOD,CACT,CAMQ,2BAA2BD,EAA8B,CAC/D,IAAMG,EAAgB,IAAI,IAAIH,EAAO,IAAKI,GAAMA,EAAE,IAAI,CAAC,EACjDC,EAAiB,IAAI,IAC3B,QAAWH,KAASF,EAClB,GAAIE,EAAM,OAAS,SAAW,eAAgBA,GAASA,EAAM,YAAY,OACvE,QAAWI,KAAOJ,EAAM,WAAW,OAC5BC,EAAc,IAAIG,EAAI,IAAI,GAC7BD,EAAe,IAAIC,EAAI,IAAI,EAKnC,OAAOD,CACT,CAMQ,2BACNL,EACAO,EAAqB,GACrBC,EAAoD,OACiE,CACrH,IAAMC,EAA8H,CAAC,EAErI,QAAWP,KAASF,EAAQ,CAC1B,IAAMU,EAAWH,EAAa,GAAGA,CAAU,IAAIL,EAAM,IAAI,GAAKA,EAAM,KAC9DS,EAAgBJ,GAAc,GAEpCE,EAAO,KAAK,CACV,MAAAP,EACA,SAAAQ,EACA,cAAAF,EACA,cAAAG,CACF,CAAC,EAEGT,EAAM,OAAS,SAAW,WAAYA,GACxCO,EAAO,KAAK,GAAG,KAAK,2BAA2BP,EAAM,OAAQQ,EAAU,OAAO,CAAC,EAE7ER,EAAM,OAAS,OAAS,WAAYA,GACtCO,EAAO,KAAK,GAAG,KAAK,2BAA2BP,EAAM,OAAQQ,EAAU,KAAK,CAAC,EAE3ER,EAAM,OAAS,SAAW,eAAgBA,GAASA,EAAM,YAAY,QAEvEO,EAAO,KAAK,GAAG,KAAK,2BAA2BP,EAAM,WAAW,OAAQA,EAAM,KAAM,OAAO,CAAC,CAEhG,CAEA,OAAOO,CACT,CAKQ,oBAA2B,CAIjC,GAHA,KAAK,kBAAkB,MAAM,EAC7B,KAAK,gBAAgB,MAAM,EAEvB,CAAC,KAAK,OAAQ,OAElB,IAAMG,EAAiB,KAAK,OAAO,SAC/B,KAAK,OAAO,MAAO,QAASC,GAASA,EAAK,MAAM,EAChD,KAAK,OAAO,QAAU,CAAC,EAGrBC,EAAsB,KAAK,2BAA2BF,CAAc,EAE1E,OAAW,CAAE,MAAAV,EAAO,SAAAQ,EAAU,cAAAF,EAAe,cAAAG,CAAc,IAAKG,EAAqB,CACnF,GAAI,CAACZ,EAAM,aAAc,SAGzB,IAAMa,EAAiB,KAAK,sBAAsBb,EAAM,YAAY,EAEpE,QAAWc,KAAiBD,EACrB,KAAK,kBAAkB,IAAIC,CAAa,GAC3C,KAAK,kBAAkB,IAAIA,EAAe,IAAI,GAAK,EAGrD,KAAK,kBAAkB,IAAIA,CAAa,EAAG,IAAId,EAAM,IAAI,EAGrDQ,IAAaR,EAAM,MACrB,KAAK,kBAAkB,IAAIc,CAAa,EAAG,IAAIN,CAAQ,EAGrDF,IAAkB,SAAWG,IAC1B,KAAK,kBAAkB,IAAIA,CAAa,GAC3C,KAAK,kBAAkB,IAAIA,EAAe,IAAI,GAAK,EAErD,KAAK,kBAAkB,IAAIA,CAAa,EAAG,IAAID,CAAQ,EAG7D,CACF,CAKQ,sBAAsBO,EAAgC,CAC5D,IAAMjB,EAAS,IAAI,IAEbkB,EAAwBC,GAAmB,CAC3CA,GAAaA,EAAU,OACzBnB,EAAO,IAAImB,EAAU,KAAK,CAE9B,EAEMC,EAAyBC,GAAoB,CAC7C,MAAM,QAAQA,CAAU,EAC1BA,EAAW,QAAQH,CAAoB,EAC9BG,GACTH,EAAqBG,CAAU,CAEnC,EAEA,OAAIJ,EAAa,MAAMG,EAAsBH,EAAa,IAAI,EAC1DA,EAAa,MAAMG,EAAsBH,EAAa,IAAI,EAC1DA,EAAa,QAAQG,EAAsBH,EAAa,MAAM,EAC9DA,EAAa,SAASG,EAAsBH,EAAa,OAAO,EAChEA,EAAa,UAAUG,EAAsBH,EAAa,QAAQ,EAClEA,EAAa,UAAUG,EAAsBH,EAAa,QAAQ,EAE/DjB,CACT,CAKQ,iBAAiBD,EAAyC,CAChE,GAAI,CAAC,KAAK,OAAQ,OAElB,IAAMa,EAAiB,KAAK,OAAO,SAC/B,KAAK,OAAO,MAAO,QAASC,GAASA,EAAK,MAAM,EAChD,KAAK,OAAO,QAAU,CAAC,EAErBZ,EAAY,KAAK,iBAAiBW,CAAc,EAGhDU,EAAiB,CAAE,GAAG,KAAK,MAAM,MAAO,EACxCC,EAA8B,CAAC,EAGrC,GAAIxB,EACF,QAAWyB,KAAOzB,EAAa,CAC7B,IAAM0B,EAAQ1B,EAAYyB,CAAG,EACFC,GAAU,MACnCC,EAAeH,EAAQC,EAAKC,CAAK,CAErC,CAIF,QAAWvB,KAASD,EAAW,CAE7B,IAAM0B,EAAgBC,EAAeL,EAAQrB,EAAM,IAAI,EAGvD,GAAmCyB,GAAkB,KAEnD,SAIF,IAAME,EAAYD,EAAeN,EAAgBpB,EAAM,IAAI,EAC5B2B,GAAc,KAC3CH,EAAeH,EAAQrB,EAAM,KAAM2B,CAAS,EAG5C,KAAK,qBAAqB3B,EAAOqB,CAAM,CAE3C,CAIA,IAAMO,EAAqB,KAAK,2BAA2BlB,CAAc,EACzE,QAAWY,KAAOF,EACZQ,EAAmB,IAAIN,CAAG,GACxBA,KAAOD,IACXA,EAAOC,CAAG,EAAIF,EAAeE,CAAG,GAKpC,QAAWtB,KAASU,EAClB,GAAIV,EAAM,OAAS,SAAW,aAAcA,GAAS,eAAgBA,EAAO,CAC1E,IAAM6B,EAAa7B,EACb8B,EAAWD,EAAW,UAAY,EACxC,GAAIC,GAAY,GAAKD,EAAW,YAAY,QAAQ,OAAQ,CAC1D,IAAME,EAAML,EAAeL,EAAQrB,EAAM,IAAI,EAC7C,GAAI,MAAM,QAAQ+B,CAAG,GAAKA,EAAI,OAASD,EAAU,CAC/C,IAAME,EAAS,CAAC,GAAGD,CAAG,EACtB,QAASE,EAAIF,EAAI,OAAQE,EAAIH,EAAUG,IAAK,CAC1C,IAAMC,EAA4B,CAAC,EACnC,QAAWC,KAAYN,EAAW,WAAY,OAC5C,KAAK,qBAAqBM,EAAUD,CAAI,EAE1CF,EAAO,KAAKE,CAAI,CAClB,CACAV,EAAeH,EAAQrB,EAAM,KAAMgC,CAAM,CAC3C,CACF,CACF,CAIF,QAAWI,KAAQR,EACbQ,KAAQf,GACV,OAAOA,EAAOe,CAAI,EAItB,KAAK,MAAM,OAASf,CACtB,CAKQ,qBACNrB,EACAqB,EACM,CACN,GAAIrB,EAAM,eAAiB,OACzBqB,EAAOrB,EAAM,IAAI,EAAIA,EAAM,iBAE3B,QAAQA,EAAM,KAAM,CAClB,IAAK,WACL,IAAK,SACHqB,EAAOrB,EAAM,IAAI,EAAIA,EAAM,SAAW,GACtC,MACF,IAAK,SACC,aAAcA,GAASA,EAAM,SAC/BqB,EAAOrB,EAAM,IAAI,EAAI,CAAC,EAEtBqB,EAAOrB,EAAM,IAAI,EAAI,KAEvB,MACF,IAAK,QAAS,CACZ,IAAM6B,EAAa7B,EACb8B,EAAWD,EAAW,UAAY,EAClCQ,EAAaR,EAAW,YAAY,OAC1C,GAAIC,GAAY,GAAKO,GAAY,OAAQ,CACvC,IAAMN,EAA6B,CAAC,EACpC,QAASE,EAAI,EAAGA,EAAIH,EAAUG,IAAK,CACjC,IAAMC,EAA4B,CAAC,EACnC,QAAWC,KAAYE,EACrB,KAAK,qBAAqBF,EAAUD,CAAI,EAE1CH,EAAI,KAAKG,CAAI,CACf,CACAb,EAAOrB,EAAM,IAAI,EAAI+B,CACvB,MACEV,EAAOrB,EAAM,IAAI,EAAI,CAAC,EAExB,KACF,CACA,IAAK,QAEH,GADAqB,EAAOrB,EAAM,IAAI,EAAI,CAAC,EAClB,WAAYA,EACd,QAAWmC,KAAYnC,EAAM,OAC3B,KAAK,qBAAqBmC,EAAUd,EAAOrB,EAAM,IAAI,CAAwB,EAGjF,MACF,IAAK,cACHqB,EAAOrB,EAAM,IAAI,EACdA,EAAoC,cAAgB,UACvD,MACF,QACEqB,EAAOrB,EAAM,IAAI,EAAI,IACzB,CAEJ,CAKQ,kBAAyB,CAC/B,GAAI,CAAC,KAAK,QAAU,CAAC,KAAK,OAAO,SAAU,CACzC,KAAK,YAAc,KACnB,MACF,CAEA,KAAK,YAAc,CACjB,YAAa,EACb,WAAY,KAAK,OAAO,MAAO,OAC/B,eAAgB,CAAC,CACnB,CACF,CAKA,UAAsB,CACpB,MAAO,CAAE,GAAG,KAAK,KAAM,CACzB,CAKA,gBAAqC,CACnC,OAAO,KAAK,YAAc,CAAE,GAAG,KAAK,WAAY,EAAI,IACtD,CAKA,SAASsC,EAAwB,CAC/B,OAAOZ,EAAe,KAAK,MAAM,OAAQY,CAAS,CACpD,CAKA,uBAAuBT,EAAwC,CAE7D,IAAMQ,EADcR,EAAqD,YAC1C,OAC/B,GAAI,CAACQ,GAAY,OAAQ,MAAO,CAAC,EACjC,IAAMH,EAA4B,CAAC,EACnC,QAAWC,KAAYE,EACrB,KAAK,qBAAqBF,EAAUD,CAAI,EAE1C,OAAOA,CACT,CAKA,MAAM,SAASI,EAAmBf,EAA2B,CAC3DC,EAAe,KAAK,MAAM,OAAQc,EAAWf,CAAK,EAClD,KAAK,MAAM,QAAQe,CAAS,EAAI,GAGhC,KAAK,0BAA0BA,CAAS,EAGpC,KAAK,MAAM,QAAQA,CAAS,GAAK,KAAK,QACxC,MAAM,KAAK,cAAcA,CAAS,EAIpC,IAAMC,EAAkB,KAAK,kBAAkB,IAAID,CAAS,EAC5D,GAAIC,EACF,QAAWC,KAAkBD,EAC3B,MAAM,KAAK,cAAcC,CAAc,EAI3C,KAAK,eAAe,CACtB,CAKQ,0BAA0BF,EAAyB,CAEzD,IAAIC,EAAkB,KAAK,kBAAkB,IAAID,CAAS,EAE1D,GAAIC,EACF,QAAWC,KAAkBD,EAAiB,CAC5C,KAAK,gBAAgB,OAAOC,CAAc,EAE1C,IAAMC,EAA0B,KAAK,oBAAoBH,EAAWE,CAAc,EAC9EC,GACF,KAAK,gBAAgB,OAAOA,CAAuB,CAEvD,CAKF,IAAMC,EAAwBJ,EAAU,QAAQ,WAAY,EAAE,EAC9D,GAAII,IAA0BJ,EAAW,CAEvC,GADAC,EAAkB,KAAK,kBAAkB,IAAIG,CAAqB,EAC9DH,EACF,QAAWC,KAAkBD,EAAiB,CAC5C,KAAK,gBAAgB,OAAOC,CAAc,EAE1C,IAAMG,EAAaL,EAAU,MAAM,WAAW,EAC9C,GAAIK,EAAY,CACd,IAAMC,EAAqBJ,EAAe,SAAS,GAAG,EAClDA,EACA,GAAGA,EAAe,MAAM,GAAG,EAAE,MAAM,EAAG,EAAE,EAAE,KAAK,GAAG,CAAC,IAAIG,EAAW,CAAC,CAAC,KAAKH,EAAe,MAAM,GAAG,EAAE,IAAI,CAAC,GAC5G,KAAK,gBAAgB,OAAOI,CAAkB,CAChD,CACF,CAIF,IAAMC,EAAgBH,EAAsB,MAAM,GAAG,EAAE,IAAI,EAC3D,GAAIG,GAAiBA,IAAkBH,IACrCH,EAAkB,KAAK,kBAAkB,IAAIM,CAAa,EACtDN,GACF,QAAWC,KAAkBD,EAAiB,CAC5C,KAAK,gBAAgB,OAAOC,CAAc,EAE1C,IAAMG,EAAaL,EAAU,MAAM,WAAW,EAC9C,GAAIK,EAAY,CAEd,IAAMC,EAAqB,GADTN,EAAU,MAAM,GAAG,EAAE,CAAC,EAAE,QAAQ,UAAW,EAAE,CACxB,IAAIK,EAAW,CAAC,CAAC,KAAKH,CAAc,GAC3E,KAAK,gBAAgB,OAAOI,CAAkB,CAChD,CACF,CAGN,CAGA,IAAME,EAAQR,EAAU,MAAM,GAAG,EACjC,QAASL,EAAI,EAAGA,EAAIa,EAAM,OAAQb,IAAK,CACrC,GAAIa,EAAMb,CAAC,EAAE,SAAS,GAAG,EAAG,SAE5B,IAAMc,EAAcD,EAAM,MAAMb,CAAC,EAAE,KAAK,GAAG,EAE3C,GADAM,EAAkB,KAAK,kBAAkB,IAAIQ,CAAW,EACpDR,EACF,QAAWC,KAAkBD,EAC3B,KAAK,gBAAgB,OAAOC,CAAc,EAC1C,KAAK,gBAAgB,OAAO,GAAGM,EAAM,CAAC,CAAC,IAAIC,CAAW,EAAE,CAG9D,CAGA,KAAK,gBAAgB,OAAOT,CAAS,CACvC,CAKQ,oBAAoBU,EAAoBC,EAAmC,CACjF,IAAMN,EAAaK,EAAW,MAAM,WAAW,EAC/C,GAAI,CAACL,EAAY,OAAO,KAExB,IAAMO,EAAQP,EAAW,CAAC,EACpBQ,EAAcH,EAAW,MAAM,GAAG,EAAE,CAAC,EAG3C,GAAIC,EAAW,WAAWE,CAAW,EAAG,CAEtC,IAAML,EAAQG,EAAW,MAAM,GAAG,EAClC,GAAIH,EAAM,OAAS,EACjB,MAAO,GAAGA,EAAM,CAAC,CAAC,IAAII,CAAK,KAAKJ,EAAM,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,EAE5D,CACA,OAAO,IACT,CAKA,0BAA0BR,EAAmBf,EAAkB,CAC7DC,EAAe,KAAK,MAAM,OAAQc,EAAWf,CAAK,EAElD,KAAK,0BAA0Be,CAAS,CAE1C,CAKA,MAAM,cAAcA,EAAkC,CACpD,GAAI,CAAC,KAAK,OAAQ,OAElB,IAAM5B,EAAiB,KAAK,OAAO,SAC/B,KAAK,OAAO,MAAO,QAASC,GAASA,EAAK,MAAM,EAChD,KAAK,OAAO,QAAU,CAAC,EAGrBX,EADY,KAAK,iBAAiBU,CAAc,EAC9B,KAAMR,GAAMA,EAAE,OAASoC,CAAS,EACxD,GAAI,CAACtC,EAAO,OAGZ,GAAI,CAAC,KAAK,mBAAmBsC,CAAS,EAAG,CACvC,OAAO,KAAK,MAAM,OAAOA,CAAS,EAClC,MACF,CAEA,IAAMf,EAAQ,KAAK,SAASe,CAAS,EAG/Bc,EAAoB,KAAK,qBAAqBpD,CAAK,EAEnDqD,EAAS,MAAM,KAAK,UAAU,6BAClCrD,EACAuB,EACA6B,CACF,EAEIC,EAAO,OAAS,EAClB,KAAK,MAAM,OAAOf,CAAS,EAAIe,EAE/B,OAAO,KAAK,MAAM,OAAOf,CAAS,CAEtC,CAKQ,qBAAqBtC,EAAqB,CAChD,IAAIsD,EAAc,CAAC,GAAItD,EAAM,aAAe,CAAC,CAAE,EAGzCuD,EAAiB,CAAC,OAAQ,QAAS,WAAY,UAAU,EACzDC,EAAgBxD,EAAM,yBAA4BA,EAAM,OAAe,wBAE3EuD,EAAe,SAASvD,EAAM,IAAI,GAClC,CAACwD,GACD,CAACF,EAAY,KAAMG,GAAMA,EAAE,OAAS,aAAa,IAEjDH,EAAc,CAAC,CAAE,KAAM,aAAc,EAAG,GAAGA,CAAW,GAIxD,IAAMI,EAAa,KAAK,iBAAiB1D,EAAM,IAAI,EAC7C2D,EAAwBL,EAAY,KAAKG,GAAKA,EAAE,OAAS,UAAU,EAWzE,GATIC,GAAc,CAACC,EAEjBL,EAAc,CAAC,CAAE,KAAM,UAAW,EAAG,GAAGA,CAAW,EAC1C,CAACI,GAAcC,IAExBL,EAAcA,EAAY,OAAOG,GAAKA,EAAE,OAAS,UAAU,GAIzDzD,EAAM,uBACR,QAAW4D,KAAe5D,EAAM,uBACT,KAAK,gBAAgB,mBACxC4D,EAAY,UACZ,KAAK,MAAM,MACb,IAEEN,EAAc,CAAC,GAAGA,EAAa,GAAGM,EAAY,WAAW,GAK/D,OAAON,CACT,CAKA,MAAM,cAAkD,CACtD,GAAI,CAAC,KAAK,OACR,MAAO,CAAC,EAGV,IAAM5C,EAAiB,KAAK,OAAO,SAC/B,KAAK,OAAO,MAAO,QAASC,GAASA,EAAK,MAAM,EAChD,KAAK,OAAO,QAAU,CAAC,EAErBZ,EAAY,KAAK,iBAAiBW,CAAc,EAChD2C,EAAS,MAAM,KAAK,UAAU,aAClCtD,EACA,KAAK,MAAM,MACb,EAEA,YAAK,MAAM,OAASsD,EACpB,KAAK,eAAe,EAEbA,CACT,CAKQ,gBAAuB,CAC7B,KAAK,MAAM,QAAU,OAAO,KAAK,KAAK,MAAM,MAAM,EAAE,SAAW,CACjE,CAKA,WAAWf,EAAyB,CAClC,KAAK,MAAM,QAAQA,CAAS,EAAI,EAClC,CAKA,UAAUA,EAA6B,CACrC,OAAO,KAAK,MAAM,OAAOA,CAAS,GAAK,CAAC,CAC1C,CAKA,cAAyC,CACvC,MAAO,CAAE,GAAG,KAAK,MAAM,MAAO,CAChC,CAKA,OAAc,CACZ,KAAK,MAAQ,KAAK,mBAAmB,EACjC,KAAK,SACP,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAE1B,CAKA,UAAoB,CAClB,OAAK,KAAK,aACN,KAAK,YAAY,YAAc,KAAK,YAAY,WAAa,GAC/D,KAAK,YAAY,cACV,IAHqB,EAMhC,CAKA,cAAwB,CACtB,OAAK,KAAK,aACN,KAAK,YAAY,YAAc,GACjC,KAAK,YAAY,cACV,IAHqB,EAMhC,CAKA,SAASuB,EAA4B,CACnC,OAAK,KAAK,aACNA,GAAa,GAAKA,EAAY,KAAK,YAAY,YACjD,KAAK,YAAY,YAAcA,EACxB,IAHqB,EAMhC,CAKA,aAAaA,EAAyB,CAC/B,KAAK,cACL,KAAK,YAAY,eAAe,SAASA,CAAS,GACrD,KAAK,YAAY,eAAe,KAAKA,CAAS,EAElD,CAKA,cAAcC,EAA6B,CACzC,KAAK,MAAM,aAAeA,CAC5B,CAKA,sBAAgC,CAC9B,MAAI,CAAC,KAAK,QAAU,CAAC,KAAK,OAAO,UAAY,CAAC,KAAK,YAC1C,KAAK,QAAQ,QAAU,CAAC,EAE1B,KAAK,OAAO,MAAO,KAAK,YAAY,WAAW,EAAE,MAC1D,CAKA,mBAAmBxB,EAA4B,CAE7C,IAAMyB,EAAS,KAAK,gBAAgB,IAAIzB,CAAS,EACjD,GAAIyB,IAAW,OACb,OAAOA,EAAO,QAGhB,GAAI,CAAC,KAAK,OAAQ,MAAO,GAEzB,IAAMrD,EAAiB,KAAK,OAAO,SAC/B,KAAK,OAAO,MAAO,QAASC,GAASA,EAAK,MAAM,EAChD,KAAK,OAAO,QAAU,CAAC,EAGrBC,EAAsB,KAAK,2BAA2BF,CAAc,EAGtEsD,EAAYpD,EAAoB,KAAMV,GAAMA,EAAE,WAAaoC,GAAapC,EAAE,MAAM,OAASoC,CAAS,EAGtG,GAAI,CAAC0B,EAAW,CAEd,IAAMtB,EAAwBJ,EAAU,QAAQ,WAAY,EAAE,EAC9D0B,EAAYpD,EAAoB,KAAMV,GAAMA,EAAE,MAAM,OAASwC,GAAyBxC,EAAE,WAAawC,CAAqB,CAC5H,CAGA,GAAI,CAACsB,EAAW,CACd,IAAMnB,EAAgBP,EAAU,MAAM,GAAG,EAAE,IAAI,EAC/C0B,EAAYpD,EAAoB,KAAMV,GAAMA,EAAE,MAAM,OAAS2C,CAAa,CAC5E,CAEA,GAAI,CAACmB,GAAa,CAACA,EAAU,MAAM,aACjC,MAAO,CAACA,GAAW,MAAM,OAG3B,GAAM,CAAE,MAAAhE,EAAO,cAAAM,EAAe,cAAAG,CAAc,EAAIuD,EAC1CjD,EAAeiD,EAAU,MAAM,aAGjCC,EAAqC,CAAE,GAAG,KAAK,MAAM,MAAO,EAEhE,GAAI3D,IAAkB,SAAWG,EAAe,CAK9C,IAAIyD,EACEC,EAAoBC,GAAkC,CAC1D,GAAKA,EACL,OAAI,MAAM,QAAQA,CAAI,EACbA,EAAK,CAAC,GAAG,MAEXA,EAAK,KACd,EASA,GAPAF,EAAgBC,EAAiBpD,EAAa,IAAI,GAClCoD,EAAiBpD,EAAa,IAAI,GAClCoD,EAAiBpD,EAAa,MAAM,GACpCoD,EAAiBpD,EAAa,OAAO,GACrCoD,EAAiBpD,EAAa,QAAQ,GACtCoD,EAAiBpD,EAAa,QAAQ,EAElDmD,GAAiBA,EAAe,CAGlC,IAAMvB,EAAaL,EAAU,MAAM,WAAW,EACxC+B,EAAY1B,EAAa,SAASA,EAAW,CAAC,EAAG,EAAE,EAAI,KAGzD2B,EAAqB,KAEzB,GAAID,IAAc,KAAM,CAEtB,IAAME,EAAa7C,EAAe,KAAK,MAAM,OAAQjB,CAAa,EAMlE,GALI,MAAM,QAAQ8D,CAAU,GAAKA,EAAWF,CAAS,IACnDC,EAAgBC,EAAWF,CAAS,EAAEH,CAAa,GAIjDI,GAAkB,KAAqC,CACzD,IAAME,EAAa,GAAG/D,CAAa,IAAI4D,CAAS,IAC1CI,EAAa,KAAK,MAAM,OAAOD,CAAU,EAC3CC,GAAc,OAAOA,GAAe,WACtCH,EAAgBG,EAAWP,CAAa,EAE5C,CACF,KAAO,CAEL,IAAMK,EAAa7C,EAAe,KAAK,MAAM,OAAQjB,CAAa,EAClE,GAAI,MAAM,QAAQ8D,CAAU,GAC1B,QAAWrC,KAAQqC,EACjB,GAAIrC,GAAQA,EAAKgC,CAAc,IAAM,OAAW,CAC9CI,EAAgBpC,EAAKgC,CAAc,EACnC,KACF,EAGN,CAGA,GAAII,GAAkB,KAAqC,CACzD,IAAMI,EAAmC,CAAE,GAAG,KAAK,MAAM,MAAO,EAChEA,EAAYR,CAAc,EAAII,EAE9B,IAAM/D,EAAS,KAAK,gBAAgB,qBAAqBQ,EAAc2D,CAAW,EAClF,YAAK,gBAAgB,IAAIpC,EAAW/B,CAAM,EACnCA,EAAO,SAAW,CAACP,EAAM,MAClC,CACF,CAGA,IAAMO,EAAS,CAAE,QAAS,GAAM,QAAS,GAAM,SAAU,EAAM,EAC/D,YAAK,gBAAgB,IAAI+B,EAAW/B,CAAM,EACnCA,EAAO,SAAW,CAACP,EAAM,MAClC,SAAWS,EAAe,CAExB,IAAMkE,EAAkBjD,EAAe,KAAK,MAAM,OAAQjB,CAAa,EACvE,GAAIkE,GAAmB,OAAOA,GAAoB,SAAU,CAC1D,IAAMC,EAAwB,CAACC,EAAUC,EAAiB,KAA4B,CACpF,IAAMvE,EAA8B,CAAC,EAC/BwE,EAAU,OAAO,QAAQF,CAAG,EAElC,OAAW,CAACvD,EAAKC,CAAK,IAAKwD,EAAS,CAClC,IAAMC,EAAcF,EAAS,GAAGA,CAAM,IAAIxD,CAAG,GAAKA,EAC9CC,GAAS,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,GAAKA,IAAU,MAC3E,OAAO,OAAOhB,EAAQqE,EAAsBrD,EAAOyD,CAAW,CAAC,CAEnE,CAEA,OAAW,CAAC1D,EAAKC,CAAK,IAAKwD,EAAS,CAClC,IAAMC,EAAcF,EAAS,GAAGA,CAAM,IAAIxD,CAAG,GAAKA,EAC5CC,GAAS,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,GAAKA,IAAU,MACvEyD,KAAezE,IACnBA,EAAOyE,CAAW,EAAIzD,EAG5B,CAEA,OAAOhB,CACT,EACM0E,EAAkBL,EAAsBD,CAAe,EAC7DV,EAAgB,CAAE,GAAG,KAAK,MAAM,OAAQ,GAAGgB,CAAgB,CAC7D,CACF,CAEA,IAAM1E,EAAS,KAAK,gBAAgB,qBAClCQ,EACAkD,CACF,EAGA,YAAK,gBAAgB,IAAI3B,EAAW/B,CAAM,EAEnCA,EAAO,SAAW,CAACP,EAAM,MAClC,CAKA,gBAAgBsC,EAA4B,CAE1C,IAAMyB,EAAS,KAAK,gBAAgB,IAAIzB,CAAS,EACjD,GAAIyB,IAAW,OACb,OAAOA,EAAO,QAGhB,GAAI,CAAC,KAAK,OAAQ,MAAO,GAEzB,IAAMrD,EAAiB,KAAK,OAAO,SAC/B,KAAK,OAAO,MAAO,QAASC,GAASA,EAAK,MAAM,EAChD,KAAK,OAAO,QAAU,CAAC,EAGrBX,EADY,KAAK,iBAAiBU,CAAc,EAC9B,KAAMR,GAAMA,EAAE,OAASoC,CAAS,EACxD,GAAI,CAACtC,EAAO,MAAO,GAEnB,GAAIA,EAAM,SAAU,MAAO,GAE3B,GAAI,CAACA,EAAM,aACT,MAAO,GAGT,IAAMO,EAAS,KAAK,gBAAgB,qBAClCP,EAAM,aACN,KAAK,MAAM,MACb,EAGA,YAAK,gBAAgB,IAAIsC,EAAW/B,CAAM,EAEnCA,EAAO,OAChB,CAKA,iBAAiB+B,EAA4B,CAE3C,IAAMyB,EAAS,KAAK,gBAAgB,IAAIzB,CAAS,EACjD,GAAIyB,IAAW,OACb,OAAOA,EAAO,SAGhB,GAAI,CAAC,KAAK,OAAQ,MAAO,GAEzB,IAAMrD,EAAiB,KAAK,OAAO,SAC/B,KAAK,OAAO,MAAO,QAASC,GAASA,EAAK,MAAM,EAChD,KAAK,OAAO,QAAU,CAAC,EAIrBX,EAFY,KAAK,iBAAiBU,CAAc,EAE9B,KAAMR,GAAMA,EAAE,OAASoC,CAAS,EACxD,GAAI,CAACtC,EAAO,MAAO,GAGnB,IAAMkF,EAAclF,EAAM,aAAa,KAAMyD,GAAMA,EAAE,OAAS,UAAU,GAAK,GAE7E,GAAI,CAACzD,EAAM,aACT,OAAOkF,EAGT,IAAM3E,EAAS,KAAK,gBAAgB,qBAClCP,EAAM,aACN,KAAK,MAAM,MACb,EAGA,YAAK,gBAAgB,IAAIsC,EAAW/B,CAAM,EAEnCA,EAAO,UAAY2E,CAC5B,CAKA,mBAAmB5C,EAA6B,CAC9C,OAAO,MAAM,KAAK,KAAK,kBAAkB,IAAIA,CAAS,GAAK,CAAC,CAAC,CAC/D,CACF,ECv9BO,IAAe6C,EAAf,KAAyB,CAO9B,YACEC,EACAC,EACAC,EACAC,EACAC,EACA,CACA,KAAK,MAAQJ,EACb,KAAK,MAAQC,EACb,KAAK,MAAQC,EACb,KAAK,SAAWC,EAChB,KAAK,OAASC,CAChB,CAWU,qBAAqBC,EAAoC,CACjE,IAAMC,EAAU,KAAK,MAAM,YACrBC,EAAW,KAAK,MAAM,aAC5B,GAAI,CAACD,GAAW,CAACC,EACf,OAAOF,EAGT,IAAMG,EAAU,SAAS,cAAc,KAAK,EAG5C,GAFAA,EAAQ,UAAY,0BAEhBF,GAAW,KAAK,mBAAmBA,CAAO,EAAG,CAC/C,IAAMG,EAAS,KAAK,kBAAkBH,CAAO,EAC7CG,EAAO,UAAY,oDACnBD,EAAQ,YAAYC,CAAM,CAC5B,CAEA,IAAMC,EAAY,SAAS,cAAc,KAAK,EAK9C,GAJAA,EAAU,UAAY,uBACtBA,EAAU,YAAYL,CAAQ,EAC9BG,EAAQ,YAAYE,CAAS,EAEzBH,GAAY,KAAK,mBAAmBA,CAAQ,EAAG,CACjD,IAAME,EAAS,KAAK,kBAAkBF,CAAQ,EAC9CE,EAAO,UAAY,qDACnBD,EAAQ,YAAYC,CAAM,CAC5B,CAEA,OAAOD,CACT,CAEQ,mBAAmBG,EAA4B,CACrD,OAAKA,EAAK,KACNA,EAAK,OAAS,QAAgB,EAAQA,EAAK,IAC3CA,EAAK,OAAS,OAAe,EAAQA,EAAK,KACvC,GAHgB,EAIzB,CAEQ,kBAAkBA,EAAgC,CACxD,IAAMC,EAAY,SAAS,cAAc,MAAM,EAE/C,GADAA,EAAU,UAAY,+BAClBD,EAAK,OAAS,SAAWA,EAAK,IAAK,CACrC,IAAME,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,IAAMF,EAAK,IACfE,EAAI,IAAMF,EAAK,KAAO,GACtBE,EAAI,aAAa,cAAe,MAAM,EACtCD,EAAU,YAAYC,CAAG,CAC3B,MAAWF,EAAK,OAAS,QAAUA,EAAK,OACtCC,EAAU,UAAYD,EAAK,MAE7B,OAAOC,CACT,CAKU,qBAAqBE,EAAiC,CAC9D,IAAMF,EAAY,SAAS,cAAc,KAAK,EAIxCG,EADe,MAAM,KAAKD,EAAM,SAAS,EACA,OAC5CE,GAAQA,EAAI,WAAW,YAAY,GACpCA,IAAQ,oBACPA,EAAI,SAAS,YAAY,GAAKA,EAAI,SAAS,UAAU,EACxD,EAEMC,EAAiB,KAAK,MAAwE,eAAiB,KAE/GC,EAAgB,KAAK,qBAAqBJ,CAAK,EASrD,GAPIC,EAA0B,OAAS,EACrCH,EAAU,UAAY,mCAAmCK,CAAa,IAAIF,EAA0B,KAAK,GAAG,CAAC,GAE7GH,EAAU,UAAY,mCAAmCK,CAAa,GAIpEA,IAAkB,QAAU,KAAK,MAAM,MAAO,CAChD,IAAME,EAAKD,EAAc,cAAc,yBAAyB,GAAKA,EACjEC,aAAc,aAChBA,EAAG,aAAa,aAAc,KAAK,MAAM,KAAK,CAElD,CAiBA,IAAMC,GAfc,IAA+B,CACjD,GAAI,CAAC,KAAK,MAAM,OAASH,IAAkB,OAAQ,OAAO,KAC1D,IAAMG,EAAQ,SAAS,cAAc,OAAO,EAI5C,GAHAA,EAAM,UAAY,kBAClBA,EAAM,aAAa,MAAO,KAAK,WAAW,CAAC,EAC3CA,EAAM,YAAc,KAAK,MAAM,MAC3B,KAAK,MAAM,aAAa,KAAMC,GAAMA,EAAE,OAAS,UAAU,EAAG,CAC9D,IAAMC,EAAW,SAAS,cAAc,MAAM,EAC9CA,EAAS,UAAY,qBACrBA,EAAS,YAAc,KACvBF,EAAM,YAAYE,CAAQ,CAC5B,CACA,OAAOF,CACT,GAE0B,EAG1B,GAAIH,IAAkB,KAChBG,GAAOR,EAAU,YAAYQ,CAAK,EACtCR,EAAU,YAAYM,CAAa,UAC1BD,IAAkB,OAC3BL,EAAU,YAAYM,CAAa,EAC/BE,GAAOR,EAAU,YAAYQ,CAAK,UAC7BH,IAAkB,OAAQ,CACnC,IAAMM,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,yDACdH,GAAOG,EAAM,YAAYH,CAAK,EAClCG,EAAM,YAAYL,CAAa,EAC/BN,EAAU,YAAYW,CAAK,CAC7B,SAAWN,IAAkB,QAAS,CACpC,IAAMM,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,yDAClBA,EAAM,YAAYL,CAAa,EAC3BE,GAAOG,EAAM,YAAYH,CAAK,EAClCR,EAAU,YAAYW,CAAK,CAC7B,MACEX,EAAU,YAAYM,CAAa,EAIrC,GAAI,KAAK,MAAM,YAAa,CAC1B,IAAMM,EAAc,SAAS,cAAc,GAAG,EAC9CA,EAAY,UAAY,wBACxBA,EAAY,YAAc,KAAK,MAAM,YACrCZ,EAAU,YAAYY,CAAW,CACnC,CAGA,GAAI,KAAK,MAAO,CACd,IAAMC,EAAU,SAAS,cAAc,GAAG,EAC1CA,EAAQ,UAAY,kBACpBA,EAAQ,YAAc,KAAK,MAC3Bb,EAAU,YAAYa,CAAO,CAC/B,CAEA,OAAOb,CACT,CAKU,YAAqB,CAC7B,MAAO,aAAa,KAAK,MAAM,IAAI,EACrC,CAKU,iBAAiBc,EAA4B,CAkBrD,GAjBAA,EAAQ,GAAK,KAAK,WAAW,EAC7BA,EAAQ,aAAa,OAAQ,KAAK,MAAM,IAAI,EAExC,KAAK,MAAM,WACbA,EAAQ,aAAa,WAAY,MAAM,EACvCA,EAAQ,UAAU,IAAI,0BAA0B,GAG9C,KAAK,MAAM,SACbA,EAAQ,MAAM,QAAU,OACxBA,EAAQ,UAAU,IAAI,wBAAwB,GAG5C,KAAK,OACPA,EAAQ,UAAU,IAAI,uBAAuB,EAG3C,KAAK,MAAM,MACb,OAAW,CAACC,EAAK1B,CAAK,IAAK,OAAO,QAAQ,KAAK,MAAM,KAAK,GACpD0B,EAAI,WAAW,OAAO,GAAKA,EAAI,WAAW,OAAO,IACnDD,EAAQ,aAAaC,EAAK,OAAO1B,CAAK,CAAC,CAI/C,CACF,EC1MO,SAAS2B,GAAiBC,EAA8B,CAC7D,IAAMC,EAAsB,CAAC,EAE7B,QAASC,EAAI,EAAGA,EAAIF,EAAQ,OAAQE,IAAK,CACvC,IAAMC,EAAOH,EAAQE,CAAC,EAEtB,OAAQC,EAAM,CACZ,IAAK,IACHF,EAAO,KAAK,CAAE,KAAM,QAAS,KAAM,IAAK,SAAU,EAAK,CAAC,EACxD,MACF,IAAK,IACL,IAAK,IACHA,EAAO,KAAK,CAAE,KAAM,SAAU,KAAME,EAAM,SAAU,EAAK,CAAC,EAC1D,MACF,IAAK,IACHF,EAAO,KAAK,CAAE,KAAM,MAAO,KAAM,IAAK,SAAU,EAAK,CAAC,EACtD,MACF,QACEA,EAAO,KAAK,CAAE,KAAM,UAAW,KAAME,EAAM,SAAU,EAAM,CAAC,EAC5D,KACJ,CACF,CAEA,OAAOF,CACT,CAKO,SAASG,EAAYC,EAAeJ,EAA6B,CACtE,IAAIK,EAAS,GACTC,EAAa,EAEjB,QAAWC,KAASP,EAAQ,CAC1B,GAAI,CAACO,EAAM,SAAU,CACnBF,GAAUE,EAAM,KAChB,QACF,CAEA,GAAID,GAAcF,EAAM,OACtB,MAGF,IAAMF,EAAOE,EAAME,CAAU,EAG7B,GAAI,EAAAC,EAAM,OAAS,SAAW,CAAC,KAAK,KAAKL,CAAI,GAEtC,KAAIK,EAAM,OAAS,UAAY,CAAC,WAAW,KAAKL,CAAI,EACzD,SACK,GAAIK,EAAM,OAAS,OAEnB,GAAIA,EAAM,OAAS,OAASA,EAAM,OAAS,SAAWA,EAAM,OAAS,SAC1E,UAGFF,GAAUH,EACVI,IACF,CAEA,OAAOD,CACT,CAKO,SAASG,GAAcJ,EAAeJ,EAA6B,CACxE,GAAI,CAACI,EAAO,MAAO,GAEnB,IAAIC,EAAS,GACTI,EAAa,EAEjB,QAASR,EAAI,EAAGA,EAAIG,EAAM,QAAUK,EAAaT,EAAO,OAAQC,IAAK,CACnE,IAAMC,EAAOE,EAAMH,CAAC,EACdM,EAAQP,EAAOS,CAAU,EAE/B,GAAIF,EAAM,SAEJA,EAAM,OAAS,SAAW,KAAK,KAAKL,CAAI,GAGjCK,EAAM,OAAS,UAAY,WAAW,KAAKL,CAAI,GAG/CK,EAAM,OAAS,OALxBF,GAAUH,EACVO,MASAA,IACAR,aAIEC,IAASK,EAAM,KACjBE,YAIIA,EAAaT,EAAO,OAAS,EAAG,CAClC,IAAMU,EAAYV,EAAOS,EAAa,CAAC,EACnCC,GAAaA,EAAU,WACrBA,EAAU,OAAS,SAAW,KAAK,KAAKR,CAAI,GAGrCQ,EAAU,OAAS,UAAY,WAAW,KAAKR,CAAI,GAGnDQ,EAAU,OAAS,QAL5BL,GAAUH,EACVO,GAAc,GAWhBA,GAEJ,KACE,MAIR,CAEA,OAAOJ,CACT,CAKO,SAASM,GACdC,EACAZ,EACAa,EAAoC,UAC5B,CACR,GAAIA,IAAc,UAAW,CAC3B,QAASZ,EAAIW,EAAW,EAAGX,EAAID,EAAO,OAAQC,IAC5C,GAAID,EAAOC,CAAC,EAAE,SACZ,OAAOA,EAGX,OAAOD,EAAO,MAChB,KAAO,CACL,QAASC,EAAIW,EAAW,EAAGX,GAAK,EAAGA,IACjC,GAAID,EAAOC,CAAC,EAAE,SACZ,OAAOA,EAGX,MAAO,EACT,CACF,CAKO,SAASa,GAAmBd,EAAqBe,EAAsB,IAAa,CACzF,OAAOf,EACJ,IAAKO,GAAWA,EAAM,SAAWQ,EAAcR,EAAM,IAAK,EAC1D,KAAK,EAAE,CACZ,CAKO,SAASS,GACdC,EACAC,EACAC,EACAnB,EACQ,CAER,IAAIoB,EAAoB,EACxB,QAAS,EAAI,EAAG,EAAI,KAAK,IAAID,EAAmBF,EAAS,MAAM,EAAG,IAAK,CACrE,IAAMR,EAAa,EACfA,EAAaT,EAAO,QAAUA,EAAOS,CAAU,EAAE,UACnDW,GAEJ,CAGA,IAAIC,EAAgB,EACpB,QAAS,EAAI,EAAG,EAAIH,EAAS,QAAU,EAAIlB,EAAO,OAAQ,IACxD,GAAIA,EAAO,CAAC,EAAE,WACZqB,IACIA,EAAgBD,GAClB,OAAO,EAAI,EAMjB,OAAOT,GACL,KAAK,IAAIQ,EAAmBD,EAAS,OAAS,CAAC,EAC/ClB,EACA,SACF,CACF,CCjMO,IAAMsB,EAAN,KAAiB,CAAjB,cACL,KAAQ,WAAuC,IAAI,IAK3C,cAAcC,EAAqC,CACzD,OAAIA,EAAK,OACAA,EAAK,OAEVA,EAAK,KACAC,GAAkBD,EAAK,IAAI,EAE7B,IACT,CAKQ,UAAUA,EAAsC,CACtD,IAAME,EAAa,KAAK,cAAcF,CAAI,EAC1C,GAAI,CAACE,EACH,OAAO,KAGT,IAAMC,EAAWD,EAAW,QAC5B,GAAI,KAAK,WAAW,IAAIC,CAAQ,EAC9B,OAAO,KAAK,WAAW,IAAIA,CAAQ,EAGrC,IAAMC,EAASC,GAAiBH,EAAW,OAAO,EAClD,YAAK,WAAW,IAAIC,EAAUC,CAAM,EAC7BA,CACT,CAKA,UAAUE,EAAeN,EAA0B,CACjD,IAAMI,EAAS,KAAK,UAAUJ,CAAI,EAClC,GAAI,CAACI,EACH,OAAOE,EAGT,IAAMJ,EAAa,KAAK,cAAcF,CAAI,EAEpCO,EAAiBH,EAAO,OAAOI,GAAKA,EAAE,QAAQ,EAC9CC,EAAgB,IAAI,IAAIF,EAAe,IAAIC,GAAKA,EAAE,IAAI,CAAC,EACzDE,EAAc,GAClB,QAAWC,KAAQL,GACbG,EAAc,IAAI,KAAK,GAEhBA,EAAc,IAAI,OAAO,GAAK,KAAK,KAAKE,CAAI,GAE5CF,EAAc,IAAI,QAAQ,GAAK,WAAW,KAAKE,CAAI,KAC5DD,GAAeC,GAGnB,IAAIC,EAAYC,EAAYH,EAAaN,CAAM,EAG/C,OAAIF,EAAW,YACbU,EAAYV,EAAW,UAAUU,CAAS,EAE1CA,EAAYC,EAAYD,EAAWR,CAAM,GAGpCQ,CACT,CAKA,WAAWN,EAAeN,EAA0B,CAClD,IAAMI,EAAS,KAAK,UAAUJ,CAAI,EAClC,OAAKI,EAIEU,GAAcR,EAAOF,CAAM,EAHzBE,CAIX,CAKA,mBAAmBN,EAA0B,CAC3C,IAAMI,EAAS,KAAK,UAAUJ,CAAI,EAClC,GAAI,CAACI,EACH,MAAO,GAGT,IAAMF,EAAa,KAAK,cAAcF,CAAI,EAC1C,OAAOe,GAAmBX,EAAQF,EAAW,aAAe,GAAG,CACjE,CAKA,cAAcS,EAAcK,EAAkBhB,EAA2B,CACvE,IAAMI,EAAS,KAAK,UAAUJ,CAAI,EAClC,GAAI,CAACI,GAAUY,GAAYZ,EAAO,OAChC,MAAO,GAGT,IAAMa,EAAQb,EAAOY,CAAQ,EAC7B,GAAI,CAACC,EAAM,SACT,MAAO,GAGT,OAAQA,EAAM,KAAM,CAClB,IAAK,QACH,MAAO,KAAK,KAAKN,CAAI,EACvB,IAAK,SACH,MAAO,WAAW,KAAKA,CAAI,EAC7B,IAAK,MACH,MAAO,GACT,QACE,MAAO,EACX,CACF,CAKA,aACEO,EACAC,EACAnB,EACAoB,EAC2C,CAC3C,IAAMhB,EAAS,KAAK,UAAUJ,CAAI,EAClC,GAAI,CAACI,EACH,MAAO,CAAE,MAAOc,EAAO,eAAgBA,EAAM,MAAO,EAItD,IAAMG,EAAmBP,GAAcI,EAAOd,CAAM,EAGhDQ,EAAYC,EAAYQ,EAAkBjB,CAAM,EAG9CF,EAAa,KAAK,cAAcF,CAAI,EACtCE,EAAW,YACbU,EAAYV,EAAW,UAAUU,CAAS,EAC1CA,EAAYC,EAAYD,EAAWR,CAAM,GAI3C,IAAMkB,EAAoBC,GACxBJ,EACAP,EACAQ,EACAhB,CACF,EAEA,MAAO,CACL,MAAOQ,EACP,eAAgB,KAAK,IAAIU,EAAmBV,EAAU,MAAM,CAC9D,CACF,CAKA,gBACEY,EACAC,EACAL,EACApB,EACA0B,EAAuB,GACoB,CAC3C,IAAMtB,EAAS,KAAK,UAAUJ,CAAI,EAClC,GAAI,CAACI,EACH,MAAO,CAAE,MAAOqB,EAAc,eAAgBL,CAAe,EAG/D,GAAIM,EAAa,CAEf,GAAIN,IAAmB,EACrB,MAAO,CAAE,MAAOK,EAAc,eAAgB,CAAE,EAIlD,IAAME,EAAeC,GAAwBR,EAAiB,EAAGhB,EAAQ,UAAU,EAG7EyB,EAASJ,EAAa,UAAU,EAAGE,CAAY,EAC/CG,EAAQL,EAAa,UAAUL,CAAc,EAC7CW,EAAWF,EAASC,EAGpBpB,EAAc,KAAK,WAAWqB,EAAU/B,CAAI,EAC5CY,EAAY,KAAK,UAAUF,EAAaV,CAAI,EAG5CgC,EAAS,KAAK,IAAI,EAAGL,EAAe,CAAC,EACrCM,EAAeL,GAAwBI,EAAQ5B,EAAQ,SAAS,EAEtE,MAAO,CACL,MAAOQ,EACP,eAAgBqB,CAClB,CACF,CAGA,GAAIT,EAAI,SAAW,GAAK,KAAK,cAAcA,EAAKJ,EAAgBpB,CAAI,EAAG,CAErE,IAAM6B,EAASJ,EAAa,UAAU,EAAGL,CAAc,EACjDU,EAAQL,EAAa,UAAUL,CAAc,EAC7CW,EAAWF,EAASL,EAAMM,EAEhC,OAAO,KAAK,aAAaC,EAAUN,EAAczB,EAAMoB,CAAc,CACvE,CAEA,MAAO,CAAE,MAAOK,EAAc,eAAgBL,CAAe,CAC/D,CACF,ECpOO,IAAMc,GAAN,cAAwBC,CAAU,CAIvC,YACEC,EACAC,EACAC,EACAC,EACAC,EACA,CACA,MAAMJ,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAV7C,KAAQ,WAAgC,KACxC,KAAQ,cAAwB,GAW1BJ,EAAM,OACR,KAAK,WAAa,IAAIK,EAE1B,CAEA,QAAsB,CACpB,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,KAAK,MAAM,OAAS,QAAU,QAAU,KAAK,MAAM,OAAS,WAAa,WAAa,OAGnG,IAAIC,EAAe,KAAK,OAAS,GAajC,GAZI,KAAK,YAAc,KAAK,MAAM,OAC5BA,IACFA,EAAe,KAAK,WAAW,UAAU,OAAOA,CAAY,EAAG,KAAK,MAAM,IAAI,GAEhF,KAAK,cAAgBA,GAGvBD,EAAM,MAAQC,EAEd,KAAK,iBAAiBD,CAAK,EAGvB,KAAK,MAAM,YACbA,EAAM,YAAc,KAAK,MAAM,oBACtB,KAAK,YAAc,KAAK,MAAM,KAAM,CAE7C,IAAME,EAAkB,KAAK,WAAW,mBAAmB,KAAK,MAAM,IAAI,EACtEA,IACFF,EAAM,YAAcE,EAExB,CAGA,OAAI,KAAK,YAAc,KAAK,MAAM,MAChCF,EAAM,iBAAiB,QAAUG,GAAM,CACrC,IAAMC,EAASD,EAAE,OACXE,EAAiBD,EAAO,gBAAkB,EAC1CE,EAAaF,EAAO,MAEpBG,EAAS,KAAK,WAAY,aAC9BD,EACA,KAAK,cACL,KAAK,MAAM,KACXD,CACF,EAGAD,EAAO,MAAQG,EAAO,MACtB,KAAK,cAAgBA,EAAO,MAG5B,WAAW,IAAM,CACfH,EAAO,kBAAkBG,EAAO,eAAgBA,EAAO,cAAc,CACvE,EAAG,CAAC,EAGJ,IAAMC,EAAc,KAAK,MAAM,KAAM,WACjCD,EAAO,MACP,KAAK,WAAY,WAAWA,EAAO,MAAO,KAAK,MAAM,IAAK,EAE9D,KAAK,SAASC,CAAW,CAC3B,CAAC,EAEDR,EAAM,iBAAiB,UAAYG,GAAM,CACvC,IAAMC,EAASD,EAAE,OACXE,EAAiBD,EAAO,gBAAkB,EAEhD,GAAID,EAAE,MAAQ,aAAeA,EAAE,MAAQ,SAAU,CAC/CA,EAAE,eAAe,EAEjB,IAAMM,EAAcN,EAAE,MAAQ,YACxBI,EAAS,KAAK,WAAY,gBAC9B,GACAH,EAAO,MACPC,EACA,KAAK,MAAM,KACXI,CACF,EAEAL,EAAO,MAAQG,EAAO,MACtB,KAAK,cAAgBA,EAAO,MAE5B,WAAW,IAAM,CACfH,EAAO,kBAAkBG,EAAO,eAAgBA,EAAO,cAAc,CACvE,EAAG,CAAC,EAEJ,IAAMC,EAAc,KAAK,MAAM,KAAM,WACjCD,EAAO,MACP,KAAK,WAAY,WAAWA,EAAO,MAAO,KAAK,MAAM,IAAK,EAE9D,KAAK,SAASC,CAAW,CAC3B,CACF,CAAC,EAEDR,EAAM,iBAAiB,QAAUG,GAAM,CACrCA,EAAE,eAAe,EACjB,IAAMO,GAAcP,EAAE,eAAkB,OAAe,eAAe,QAAQ,MAAM,EAEpF,GAAIO,EAAY,CACd,IAAMN,EAASD,EAAE,OACXE,EAAiBD,EAAO,gBAAkB,EAG1CO,EAASP,EAAO,MAAM,UAAU,EAAGC,CAAc,EACjDO,EAAQR,EAAO,MAAM,UAAUC,CAAc,EAC7CQ,EAAWF,EAASD,EAAaE,EAEjCL,EAAS,KAAK,WAAY,aAC9BM,EACA,KAAK,cACL,KAAK,MAAM,KACXR,CACF,EAEAD,EAAO,MAAQG,EAAO,MACtB,KAAK,cAAgBA,EAAO,MAE5B,WAAW,IAAM,CACfH,EAAO,kBAAkBG,EAAO,eAAgBA,EAAO,cAAc,CACvE,EAAG,CAAC,EAEJ,IAAMC,EAAc,KAAK,MAAM,KAAM,WACjCD,EAAO,MACP,KAAK,WAAY,WAAWA,EAAO,MAAO,KAAK,MAAM,IAAK,EAE9D,KAAK,SAASC,CAAW,CAC3B,CACF,CAAC,GAGDR,EAAM,iBAAiB,QAAUG,GAAM,CACrC,IAAMC,EAASD,EAAE,OACjB,KAAK,SAASC,EAAO,KAAK,CAC5B,CAAC,EAGHJ,EAAM,iBAAiB,OAAQ,IAAM,CACnC,KAAK,OAAO,CACd,CAAC,EAEM,KAAK,qBAAqBA,CAAK,CACxC,CACF,EC5JO,IAAMc,GAAN,cAA0BC,CAAU,CAIzC,YACEC,EACAC,EACAC,EACAC,EACAC,EACA,CACA,MAAMJ,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAV7C,KAAQ,WAAgC,KACxC,KAAQ,cAAwB,GAW1BJ,EAAM,OACR,KAAK,WAAa,IAAIK,EAE1B,CAEA,QAAsB,CACpB,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAG5C,GAAI,KAAK,YAAc,KAAK,MAAM,KAAM,CACtCA,EAAM,KAAO,OAGb,IAAIC,EAAe,KAAK,OAAS,GAC7BA,IAAiB,MAAQA,IAAiB,KACxC,KAAK,MAAM,KAAK,OAAS,WAC3BA,EAAe,KAAK,WAAW,UAAU,OAAOA,CAAY,EAAG,KAAK,MAAM,IAAI,EACrE,KAAK,MAAM,KAAK,OAAS,eAClCA,EAAe,KAAK,WAAW,UAAU,OAAOA,CAAY,EAAG,KAAK,MAAM,IAAI,IAGlF,KAAK,cAAgBA,EACrBD,EAAM,MAAQC,CAChB,MACED,EAAM,KAAO,SACbA,EAAM,MAAQ,KAAK,OAAS,GAG9B,IAAME,EAAc,KAAK,MAgBzB,GAfI,CAAC,KAAK,YAAcF,EAAM,OAAS,WACjCE,EAAY,MAAQ,SACtBF,EAAM,IAAM,OAAOE,EAAY,GAAG,GAEhCA,EAAY,MAAQ,SACtBF,EAAM,IAAM,OAAOE,EAAY,GAAG,GAEhCA,EAAY,OAAS,SACvBF,EAAM,KAAO,OAAOE,EAAY,IAAI,IAIxC,KAAK,iBAAiBF,CAAK,EAGvB,KAAK,MAAM,YACbA,EAAM,YAAc,KAAK,MAAM,oBACtB,KAAK,YAAc,KAAK,MAAM,KAAM,CAE7C,IAAMG,EAAkB,KAAK,WAAW,mBAAmB,KAAK,MAAM,IAAI,EACtEA,IACFH,EAAM,YAAcG,EAExB,CAGA,OAAI,KAAK,YAAc,KAAK,MAAM,MAChCH,EAAM,iBAAiB,QAAUI,GAAM,CACrC,IAAMC,EAASD,EAAE,OACXE,EAAiBD,EAAO,gBAAkB,EAC1CE,EAAaF,EAAO,MAEpBG,EAAS,KAAK,WAAY,aAC9BD,EACA,KAAK,cACL,KAAK,MAAM,KACXD,CACF,EAEAD,EAAO,MAAQG,EAAO,MACtB,KAAK,cAAgBA,EAAO,MAE5B,WAAW,IAAM,CACfH,EAAO,kBAAkBG,EAAO,eAAgBA,EAAO,cAAc,CACvE,EAAG,CAAC,EAGJ,IAAIC,EAA0B,KAC9B,GAAI,KAAK,MAAM,KAAM,OAAS,WAAY,CACxC,IAAMC,EAAc,KAAK,WAAY,WAAWF,EAAO,MAAO,KAAK,MAAM,IAAK,EAC9EC,EAAWC,EAAc,WAAWA,EAAY,QAAQ,UAAW,EAAE,CAAC,EAAI,IAC5E,SAAW,KAAK,MAAM,KAAM,OAAS,aAAc,CACjD,IAAMA,EAAc,KAAK,WAAY,WAAWF,EAAO,MAAO,KAAK,MAAM,IAAK,EAC9EC,EAAWC,EAAc,WAAWA,CAAW,EAAI,IACrD,CAEA,KAAK,SAASD,CAAQ,CACxB,CAAC,EAEDT,EAAM,iBAAiB,UAAYI,GAAM,CACvC,IAAMC,EAASD,EAAE,OACXE,EAAiBD,EAAO,gBAAkB,EAEhD,GAAID,EAAE,MAAQ,aAAeA,EAAE,MAAQ,SAAU,CAC/CA,EAAE,eAAe,EAEjB,IAAMO,EAAcP,EAAE,MAAQ,YACxBI,EAAS,KAAK,WAAY,gBAC9B,GACAH,EAAO,MACPC,EACA,KAAK,MAAM,KACXK,CACF,EAEAN,EAAO,MAAQG,EAAO,MACtB,KAAK,cAAgBA,EAAO,MAE5B,WAAW,IAAM,CACfH,EAAO,kBAAkBG,EAAO,eAAgBA,EAAO,cAAc,CACvE,EAAG,CAAC,EAEJ,IAAIC,EAA0B,KAC9B,GAAI,KAAK,MAAM,KAAM,OAAS,WAAY,CACxC,IAAMC,EAAc,KAAK,WAAY,WAAWF,EAAO,MAAO,KAAK,MAAM,IAAK,EAC9EC,EAAWC,EAAc,WAAWA,EAAY,QAAQ,UAAW,EAAE,CAAC,EAAI,IAC5E,SAAW,KAAK,MAAM,KAAM,OAAS,aAAc,CACjD,IAAMA,EAAc,KAAK,WAAY,WAAWF,EAAO,MAAO,KAAK,MAAM,IAAK,EAC9EC,EAAWC,EAAc,WAAWA,CAAW,EAAI,IACrD,CAEA,KAAK,SAASD,CAAQ,CACxB,CACF,CAAC,EAEDT,EAAM,iBAAiB,QAAUI,GAAM,CACrCA,EAAE,eAAe,EACjB,IAAMQ,GAAcR,EAAE,eAAkB,OAAe,eAAe,QAAQ,MAAM,EAEpF,GAAIQ,EAAY,CACd,IAAMP,EAASD,EAAE,OACXE,EAAiBD,EAAO,gBAAkB,EAE1CQ,EAASR,EAAO,MAAM,UAAU,EAAGC,CAAc,EACjDQ,EAAQT,EAAO,MAAM,UAAUC,CAAc,EAC7CS,EAAWF,EAASD,EAAaE,EAEjCN,EAAS,KAAK,WAAY,aAC9BO,EACA,KAAK,cACL,KAAK,MAAM,KACXT,CACF,EAEAD,EAAO,MAAQG,EAAO,MACtB,KAAK,cAAgBA,EAAO,MAE5B,WAAW,IAAM,CACfH,EAAO,kBAAkBG,EAAO,eAAgBA,EAAO,cAAc,CACvE,EAAG,CAAC,EAEJ,IAAIC,EAA0B,KAC9B,GAAI,KAAK,MAAM,KAAM,OAAS,WAAY,CACxC,IAAMC,EAAc,KAAK,WAAY,WAAWF,EAAO,MAAO,KAAK,MAAM,IAAK,EAC9EC,EAAWC,EAAc,WAAWA,EAAY,QAAQ,UAAW,EAAE,CAAC,EAAI,IAC5E,SAAW,KAAK,MAAM,KAAM,OAAS,aAAc,CACjD,IAAMA,EAAc,KAAK,WAAY,WAAWF,EAAO,MAAO,KAAK,MAAM,IAAK,EAC9EC,EAAWC,EAAc,WAAWA,CAAW,EAAI,IACrD,CAEA,KAAK,SAASD,CAAQ,CACxB,CACF,CAAC,GAGDT,EAAM,iBAAiB,QAAUI,GAAM,CACrC,IAAMC,EAASD,EAAE,OACXK,EAAWJ,EAAO,QAAU,GAAK,KAAO,OAAOA,EAAO,KAAK,EACjE,KAAK,SAASI,CAAQ,CACxB,CAAC,EAGHT,EAAM,iBAAiB,OAAQ,IAAM,CACnC,KAAK,OAAO,CACd,CAAC,EAEM,KAAK,qBAAqBA,CAAK,CACxC,CACF,EC/LO,IAAMgB,GAAN,cAA4BC,CAAU,CAC3C,QAAsB,CACpB,IAAMC,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,MAAQ,KAAK,OAAS,GAC/BA,EAAS,YAAc,KAAK,MAAM,aAAe,GAEjD,IAAMC,EAAgB,KAAK,MAC3B,OAAIA,EAAc,OAChBD,EAAS,KAAOC,EAAc,MAE5BA,EAAc,OAChBD,EAAS,KAAOC,EAAc,MAGhC,KAAK,iBAAiBD,CAAQ,EAE9BA,EAAS,iBAAiB,QAAUE,GAAM,CACxC,IAAMC,EAASD,EAAE,OACjB,KAAK,SAASC,EAAO,KAAK,CAC5B,CAAC,EAEDH,EAAS,iBAAiB,OAAQ,IAAM,CACtC,KAAK,OAAO,CACd,CAAC,EAEM,KAAK,qBAAqBA,CAAQ,CAC3C,CACF,EC3BO,IAAMI,GAAN,cAA0BC,CAAU,CACzC,QAAsB,CACpB,IAAMC,EAAS,SAAS,cAAc,QAAQ,EACxCC,EAAc,KAAK,MAOzB,GALIA,EAAY,WACdD,EAAO,SAAW,IAIhB,CAACC,EAAY,SAAU,CACzB,IAAMC,EAAoB,SAAS,cAAc,QAAQ,EACzDA,EAAkB,MAAQ,GAC1BA,EAAkB,YAAcD,EAAY,aAAe,2BAC3DC,EAAkB,aAAa,mBAAoB,EAAE,EACrDA,EAAkB,SAAW,GAC7BF,EAAO,YAAYE,CAAiB,CACtC,CAGA,QAAWC,KAAUF,EAAY,QAAS,CACxC,IAAMG,EAAW,SAAS,cAAc,QAAQ,EAC5C,OAAOD,GAAW,UACpBC,EAAS,MAAQD,EACjBC,EAAS,YAAcD,IAEvBC,EAAS,MAAQ,OAAOD,EAAO,KAAK,EACpCC,EAAS,YAAcD,EAAO,OAEhCH,EAAO,YAAYI,CAAQ,CAC7B,CAGA,GAAIH,EAAY,UAAY,MAAM,QAAQ,KAAK,KAAK,EAClD,QAAWE,KAAUH,EAAO,QAC1BG,EAAO,SAAW,KAAK,MAAM,SAASA,EAAO,KAAK,OAGpDH,EAAO,MAAQ,KAAK,OAAS,GAG/B,KAAK,iBAAiBA,CAAM,EAE5B,IAAMK,EAAyB,IAAM,CACnB,CAACL,EAAO,MAEtBA,EAAO,UAAU,IAAI,8BAA8B,EAEnDA,EAAO,UAAU,OAAO,8BAA8B,CAE1D,EACA,OAAAK,EAAuB,EAEvBL,EAAO,iBAAiB,SAAWM,GAAM,CACvC,IAAMC,EAASD,EAAE,OAEjB,GADAD,EAAuB,EACnBJ,EAAY,SAAU,CACxB,IAAMO,EAAiB,MAAM,KAAKD,EAAO,eAAe,EAAE,IACvDE,GAAQA,EAAI,KACf,EACA,KAAK,SAASD,CAAc,CAC9B,MACE,KAAK,SAASD,EAAO,OAAS,IAAI,CAEtC,CAAC,EAEDP,EAAO,iBAAiB,OAAQ,IAAM,CACpC,KAAK,OAAO,CACd,CAAC,EAEM,KAAK,qBAAqBA,CAAM,CACzC,CACF,ECzEO,IAAMU,GAAN,cAA4BC,CAAU,CAC3C,QAAsB,CACpB,IAAMC,EAAW,SAAS,cAAc,OAAO,EAC/CA,EAAS,KAAO,WAChBA,EAAS,QAAU,EAAQ,KAAK,MAEhC,KAAK,iBAAiBA,CAAQ,EAE9BA,EAAS,iBAAiB,SAAWC,GAAM,CACzC,IAAMC,EAASD,EAAE,OACjB,KAAK,SAASC,EAAO,OAAO,CAC9B,CAAC,EAEDF,EAAS,iBAAiB,OAAQ,IAAM,CACtC,KAAK,OAAO,CACd,CAAC,EAED,IAAMG,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,kBAGtB,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAI5C,GAHAA,EAAM,UAAY,2BAClBA,EAAM,aAAa,MAAO,KAAK,WAAW,CAAC,EAC3CA,EAAM,YAAYJ,CAAQ,EACtB,KAAK,MAAM,MAAO,CACpB,IAAMK,EAAY,SAAS,eAAe,KAAK,MAAM,KAAK,EAC1DD,EAAM,YAAYC,CAAS,CAC7B,CAIA,GAHAF,EAAU,YAAYC,CAAK,EAGvB,KAAK,MAAM,YAAa,CAC1B,IAAME,EAAc,SAAS,cAAc,GAAG,EAC9CA,EAAY,UAAY,wBACxBA,EAAY,YAAc,KAAK,MAAM,YACrCH,EAAU,YAAYG,CAAW,CACnC,CAGA,GAAI,KAAK,MAAO,CACd,IAAMC,EAAU,SAAS,cAAc,GAAG,EAC1CA,EAAQ,UAAY,kBACpBA,EAAQ,YAAc,KAAK,MAC3BJ,EAAU,YAAYI,CAAO,CAC/B,CAEA,OAAOJ,CACT,CACF,EChDO,IAAMK,GAAN,cAAyBC,CAAU,CACxC,QAAsB,CACpB,IAAMC,EAAY,SAAS,cAAc,KAAK,EAI9C,GAHAA,EAAU,UAAY,kBAGlB,KAAK,MAAM,MAAO,CACpB,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAG5C,GAFAA,EAAM,UAAY,kBAClBA,EAAM,YAAc,KAAK,MAAM,MAC3B,KAAK,MAAM,aAAa,KAAMC,GAAMA,EAAE,OAAS,UAAU,EAAG,CAC9D,IAAMC,EAAW,SAAS,cAAc,MAAM,EAC9CA,EAAS,UAAY,qBACrBA,EAAS,YAAc,KACvBF,EAAM,YAAYE,CAAQ,CAC5B,CACAH,EAAU,YAAYC,CAAK,CAC7B,CAGA,IAAMG,EAAa,SAAS,cAAc,KAAK,EAC/CA,EAAW,UAAY,wBAEvB,IAAMC,EAAa,KAAK,MACxB,QAAWC,KAAUD,EAAW,QAAS,CACvC,IAAME,EAAc,OAAOD,GAAW,SAAWA,EAASA,EAAO,MAC3DE,EAAc,OAAOF,GAAW,SAAWA,EAASA,EAAO,MAE3DG,EAAiB,SAAS,cAAc,KAAK,EACnDA,EAAe,UAAY,yBAE3B,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,QACbA,EAAM,KAAO,KAAK,MAAM,KACxBA,EAAM,GAAK,GAAG,KAAK,WAAW,CAAC,IAAIH,CAAW,GAC9CG,EAAM,MAAQ,OAAOH,CAAW,EAChCG,EAAM,QAAU,OAAO,KAAK,KAAK,IAAM,OAAOH,CAAW,EAErD,KAAK,MAAM,WACbG,EAAM,SAAW,IAGnB,IAAMT,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,aAAa,MAAOS,EAAM,EAAE,EAClCT,EAAM,YAAcO,EACpBP,EAAM,UAAY,wBAElBS,EAAM,iBAAiB,SAAU,IAAM,CACrC,KAAK,SAASH,CAAW,CAC3B,CAAC,EAEDG,EAAM,iBAAiB,OAAQ,IAAM,CACnC,KAAK,OAAO,CACd,CAAC,EAEDD,EAAe,YAAYC,CAAK,EAChCD,EAAe,YAAYR,CAAK,EAChCG,EAAW,YAAYK,CAAc,CACvC,CAKA,GAHAT,EAAU,YAAYI,CAAU,EAG5B,KAAK,MAAM,YAAa,CAC1B,IAAMO,EAAc,SAAS,cAAc,GAAG,EAC9CA,EAAY,UAAY,wBACxBA,EAAY,YAAc,KAAK,MAAM,YACrCX,EAAU,YAAYW,CAAW,CACnC,CAGA,GAAI,KAAK,MAAO,CACd,IAAMC,EAAU,SAAS,cAAc,GAAG,EAC1CA,EAAQ,UAAY,kBACpBA,EAAQ,YAAc,KAAK,MAC3BZ,EAAU,YAAYY,CAAO,CAC/B,CAEA,OAAOZ,CACT,CACF,ECjFO,IAAMa,GAAN,cAA0BC,CAAU,CACzC,QAAsB,CACpB,IAAMC,EAAW,SAAS,cAAc,OAAO,EAC/CA,EAAS,KAAO,WAChBA,EAAS,UAAY,mBACrBA,EAAS,QAAU,EAAQ,KAAK,MAEhC,KAAK,iBAAiBA,CAAQ,EAE9BA,EAAS,iBAAiB,SAAWC,GAAM,CACzC,IAAMC,EAASD,EAAE,OACjB,KAAK,SAASC,EAAO,OAAO,CAC9B,CAAC,EAEDF,EAAS,iBAAiB,OAAQ,IAAM,CACtC,KAAK,OAAO,CACd,CAAC,EAED,IAAMG,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,kBAGtB,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAG5C,GAFAA,EAAM,UAAY,yBAClBA,EAAM,aAAa,MAAO,KAAK,WAAW,CAAC,EACvC,KAAK,MAAM,MAAO,CACpB,IAAMC,EAAY,SAAS,eAAe,KAAK,MAAM,KAAK,EAC1DD,EAAM,YAAYC,CAAS,CAC7B,CAKA,GAJAD,EAAM,YAAYJ,CAAQ,EAC1BG,EAAU,YAAYC,CAAK,EAGvB,KAAK,MAAM,YAAa,CAC1B,IAAME,EAAc,SAAS,cAAc,GAAG,EAC9CA,EAAY,UAAY,wBACxBA,EAAY,YAAc,KAAK,MAAM,YACrCH,EAAU,YAAYG,CAAW,CACnC,CAGA,GAAI,KAAK,MAAO,CACd,IAAMC,EAAU,SAAS,cAAc,GAAG,EAC1CA,EAAQ,UAAY,kBACpBA,EAAQ,YAAc,KAAK,MAC3BJ,EAAU,YAAYI,CAAO,CAC/B,CAEA,OAAOJ,CACT,CACF,ECjDO,IAAMK,GAAN,cAAwBC,CAAU,CACvC,QAAsB,CACpB,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,OAEb,IAAMC,EAAY,KAAK,MAQvB,GAPIA,EAAU,MACZD,EAAM,IAAMC,EAAU,KAEpBA,EAAU,MACZD,EAAM,IAAMC,EAAU,KAGpB,KAAK,MAAO,CACd,IAAMC,EAAO,KAAK,iBAAiB,KAC/B,KAAK,MAAM,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,EACrC,OAAO,KAAK,KAAK,EACrBF,EAAM,MAAQE,CAChB,CAEA,YAAK,iBAAiBF,CAAK,EAE3BA,EAAM,iBAAiB,SAAWG,GAAM,CACtC,IAAMC,EAASD,EAAE,OACjB,KAAK,SAASC,EAAO,OAAS,IAAI,CACpC,CAAC,EAEDJ,EAAM,iBAAiB,OAAQ,IAAM,CACnC,KAAK,OAAO,CACd,CAAC,EAEM,KAAK,qBAAqBA,CAAK,CACxC,CACF,ECjCO,IAAMK,GAAN,cAAwBC,CAAU,CACvC,QAAsB,CACpB,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,OAEb,IAAMC,EAAY,KAAK,MACvB,OAAIA,EAAU,SACZD,EAAM,OAASC,EAAU,QAEvBA,EAAU,WACZD,EAAM,SAAW,IAGnB,KAAK,iBAAiBA,CAAK,EAE3BA,EAAM,iBAAiB,SAAWE,GAAM,CACtC,IAAMC,EAASD,EAAE,OACbC,EAAO,QACLF,EAAU,SACZ,KAAK,SAAS,MAAM,KAAKE,EAAO,KAAK,CAAC,EAEtC,KAAK,SAASA,EAAO,MAAM,CAAC,GAAK,IAAI,EAG3C,CAAC,EAEDH,EAAM,iBAAiB,OAAQ,IAAM,CACnC,KAAK,OAAO,CACd,CAAC,EAEM,KAAK,qBAAqBA,CAAK,CACxC,CACF,EChCO,IAAMI,GAAN,cAA4BC,CAAU,CAC3C,QAAsB,CACpB,IAAMC,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,+BAEtB,IAAMC,EAAgB,KAAK,MACrBC,EAAMD,EAAc,KAAO,EAC3BE,EAAMF,EAAc,KAAO,OAC3BG,EAAOH,EAAc,MAAQ,EAC7BI,EAAe,KAAK,OAASH,EAG7BI,EAAe,SAAS,cAAc,KAAK,EACjDA,EAAa,UAAY,6BAGzB,IAAMC,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,KAAO,SACpBA,EAAa,UAAY,sDACzBA,EAAa,YAAc,SAC3BA,EAAa,aAAa,aAAc,aAAa,EAEjDF,GAAgBH,IAClBK,EAAa,SAAW,GACxBA,EAAa,UAAU,IAAI,UAAU,GAIvC,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,SACbA,EAAM,MAAQ,OAAOH,CAAY,EACjCG,EAAM,IAAM,OAAON,CAAG,EAClBC,IAAQ,SACVK,EAAM,IAAM,OAAOL,CAAG,GAExBK,EAAM,KAAO,OAAOJ,CAAI,EACxBI,EAAM,UAAY,2BAClB,KAAK,iBAAiBA,CAAK,EAG3B,IAAMC,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,KAAO,SACpBA,EAAa,UAAY,sDACzBA,EAAa,YAAc,IAC3BA,EAAa,aAAa,aAAc,aAAa,EAEjDN,IAAQ,QAAaE,GAAgBF,IACvCM,EAAa,SAAW,GACxBA,EAAa,UAAU,IAAI,UAAU,GAIvCF,EAAa,iBAAiB,QAAS,IAAM,CAC3C,IAAMG,EAAW,KAAK,IAAIR,EAAK,OAAOM,EAAM,KAAK,EAAIJ,CAAI,EACzDI,EAAM,MAAQ,OAAOE,CAAQ,EAC7B,KAAK,SAASA,CAAQ,EACtBC,EAAc,CAChB,CAAC,EAEDF,EAAa,iBAAiB,QAAS,IAAM,CAC3C,IAAMC,EAAWP,IAAQ,OACrB,KAAK,IAAIA,EAAK,OAAOK,EAAM,KAAK,EAAIJ,CAAI,EACxC,OAAOI,EAAM,KAAK,EAAIJ,EAC1BI,EAAM,MAAQ,OAAOE,CAAQ,EAC7B,KAAK,SAASA,CAAQ,EACtBC,EAAc,CAChB,CAAC,EAGDH,EAAM,iBAAiB,QAAUI,GAAM,CACrC,IAAMC,EAASD,EAAE,OACbE,EAAW,OAAOD,EAAO,KAAK,EAE9B,MAAMC,CAAQ,IAChBA,EAAWZ,GAGTY,EAAWZ,IACbY,EAAWZ,GAGTC,IAAQ,QAAaW,EAAWX,IAClCW,EAAWX,GAGbU,EAAO,MAAQ,OAAOC,CAAQ,EAC9B,KAAK,SAASA,CAAQ,EACtBH,EAAc,CAChB,CAAC,EAEDH,EAAM,iBAAiB,OAAQ,IAAM,CACnC,KAAK,OAAO,CACd,CAAC,EAGD,IAAMG,EAAgB,IAAM,CAC1B,IAAMI,EAAQ,OAAOP,EAAM,KAAK,EAChCD,EAAa,SAAWQ,GAASb,EACjCK,EAAa,UAAU,OAAO,WAAYQ,GAASb,CAAG,EAElDC,IAAQ,QACVM,EAAa,SAAWM,GAASZ,EACjCM,EAAa,UAAU,OAAO,WAAYM,GAASZ,CAAG,IAEtDM,EAAa,SAAW,GACxBA,EAAa,UAAU,OAAO,UAAU,EAE5C,EAGA,OAAAH,EAAa,YAAYC,CAAY,EACrCD,EAAa,YAAYE,CAAK,EAC9BF,EAAa,YAAYG,CAAY,EAErCT,EAAU,YAAYM,CAAY,EAE3B,KAAK,qBAAqBN,CAAS,CAC5C,CACF,ECtHO,IAAMgB,GAAN,cAAmCC,CAAU,CAA7C,kCACL,KAAQ,cAA+B,KAEvC,QAAsB,CACpB,IAAMC,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,uCAEtB,IAAMC,EAAiB,KAAK,MACtBC,EAAgB,KAAK,OAAS,KAGpC,OAAAD,EAAe,QAAQ,QAAQ,CAACE,EAAQC,IAAU,CAChD,IAAMC,EAAc,OAAOF,GAAW,SAAWA,EAASA,EAAO,MAC3DG,EAAc,OAAOH,GAAW,SAAWA,EAASA,EAAO,MAC3DI,EAAoB,OAAOJ,GAAW,UAAY,gBAAiBA,GAAUA,EAAO,YACtFA,EAAO,YACP,OAEEK,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,UAAY,2BAC1BA,EAAc,aAAa,aAAc,OAAOH,CAAW,CAAC,GAExDH,IAAkBG,GAAgB,MAAM,QAAQH,CAAa,GAAKA,EAAc,SAASG,CAAW,KACtGG,EAAc,UAAU,IAAI,UAAU,EACjCP,EAAe,WAClB,KAAK,cAAgB,OAAOI,CAAW,IAK3C,IAAMI,EAAS,SAAS,cAAc,KAAK,EAC3CA,EAAO,UAAY,6BACnBA,EAAO,aAAa,OAAQ,QAAQ,EACpCA,EAAO,aAAa,WAAY,GAAG,EACnCA,EAAO,aAAa,gBAAiB,OAAO,EAE5C,IAAMC,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,UAAY,qCAG1B,IAAMC,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,gCAClBV,EAAe,UACjBU,EAAU,UAAU,IAAI,UAAU,EAC9B,MAAM,QAAQT,CAAa,GAAKA,EAAc,SAASG,CAAW,GACpEM,EAAU,UAAU,IAAI,SAAS,IAGnCA,EAAU,UAAU,IAAI,OAAO,EAC3BT,IAAkBG,GACpBM,EAAU,UAAU,IAAI,SAAS,GAIrC,IAAMC,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,UAAY,4BAClBA,EAAM,YAAcN,EAEpB,IAAMO,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,UAAY,4BAClBA,EAAM,YAAc,SAEpBH,EAAc,YAAYC,CAAS,EACnCD,EAAc,YAAYE,CAAK,EAC/BH,EAAO,YAAYC,CAAa,EAChCD,EAAO,YAAYI,CAAK,EAGxB,IAAMC,EAAU,SAAS,cAAc,KAAK,EAG5C,GAFAA,EAAQ,UAAY,8BAEhBP,EAAmB,CACrB,IAAMQ,EAAc,SAAS,cAAc,GAAG,EAC9CA,EAAY,UAAY,kCACxBA,EAAY,YAAcR,EAC1BO,EAAQ,YAAYC,CAAW,CACjC,CAGA,GAAI,OAAOZ,GAAW,UAAY,YAAaA,GAAUA,EAAO,QAAS,CACvE,IAAMa,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,UAAY,qCACtB,OAAOb,EAAO,SAAY,SAC5Ba,EAAc,UAAYb,EAAO,QACxBA,EAAO,mBAAmB,aACnCa,EAAc,YAAYb,EAAO,OAAO,EAE1CW,EAAQ,YAAYE,CAAa,CACnC,CAEAR,EAAc,YAAYC,CAAM,EAChCD,EAAc,YAAYM,CAAO,EAGjC,IAAMG,EAAkB,IAAM,CAC5B,IAAMC,EAASV,EAAc,UAAU,SAAS,MAAM,EAEjDP,EAAe,UAElBD,EAAU,iBAAiB,2BAA2B,EAAE,QAASmB,GAAS,CACxE,GAAIA,IAASX,EAAe,CAC1BW,EAAK,UAAU,OAAO,MAAM,EAC5B,IAAMC,EAAcD,EAAK,cAAc,6BAA6B,EAC9DE,EAAeF,EAAK,cAAc,8BAA8B,EAChEG,EAAaH,EAAK,cAAc,4BAA4B,EAC9DC,GAAaA,EAAY,aAAa,gBAAiB,OAAO,EAC9DC,IAAcA,EAAa,MAAM,UAAY,MAC7CC,IAAYA,EAAW,MAAM,UAAY,eAC/C,CACF,CAAC,EAGCJ,GACFV,EAAc,UAAU,OAAO,MAAM,EACrCC,EAAO,aAAa,gBAAiB,OAAO,EAC5CK,EAAQ,MAAM,UAAY,KAC1BD,EAAM,MAAM,UAAY,eACxB,KAAK,cAAgB,OAErBL,EAAc,UAAU,IAAI,MAAM,EAClCC,EAAO,aAAa,gBAAiB,MAAM,EAC3CK,EAAQ,MAAM,UAAYA,EAAQ,aAAe,KACjDD,EAAM,MAAM,UAAY,iBACxB,KAAK,cAAgB,OAAOR,CAAW,EAE3C,EAGMkB,EAAe,IAAM,CACzB,GAAItB,EAAe,SAAU,CAC3B,IAAMuB,EAAgB,MAAM,QAAQtB,CAAa,EAAI,CAAC,GAAGA,CAAa,EAAI,CAAC,EACrEE,EAAQoB,EAAc,QAAQnB,CAAW,EAE3CD,EAAQ,IACVoB,EAAc,OAAOpB,EAAO,CAAC,EAC7BI,EAAc,UAAU,OAAO,UAAU,EACzCG,EAAU,UAAU,OAAO,SAAS,IAEpCa,EAAc,KAAKnB,CAAW,EAC9BG,EAAc,UAAU,IAAI,UAAU,EACtCG,EAAU,UAAU,IAAI,SAAS,GAGnC,KAAK,SAASa,EAAc,OAAS,EAAIA,EAAgB,IAAI,CAC/D,MAEExB,EAAU,iBAAiB,2BAA2B,EAAE,QAASmB,GAAS,CACxEA,EAAK,UAAU,OAAO,UAAU,EAChC,IAAMM,EAAgBN,EAAK,cAAc,gCAAgC,EACrEM,GAAeA,EAAc,UAAU,OAAO,SAAS,CAC7D,CAAC,EAEDjB,EAAc,UAAU,IAAI,UAAU,EACtCG,EAAU,UAAU,IAAI,SAAS,EACjC,KAAK,SAASN,CAAW,CAE7B,EAEAI,EAAO,iBAAiB,QAAUiB,GAAM,CACtCA,EAAE,gBAAgB,EAClBH,EAAa,EACbN,EAAgB,CAClB,CAAC,EAEDR,EAAO,iBAAiB,UAAYiB,GAAM,EACpCA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAe,EACjBH,EAAa,EACbN,EAAgB,EAEpB,CAAC,GAGGf,IAAkBG,GAAgB,MAAM,QAAQH,CAAa,GAAKA,EAAc,SAASG,CAAW,KAClG,CAACJ,EAAe,UAAYA,EAAe,aAC7C,WAAW,IAAM,CACfO,EAAc,UAAU,IAAI,MAAM,EAClCC,EAAO,aAAa,gBAAiB,MAAM,EAC3CK,EAAQ,MAAM,UAAYA,EAAQ,aAAe,KACjDD,EAAM,MAAM,UAAY,gBAC1B,EAAG,CAAC,EAIRb,EAAU,YAAYQ,CAAa,CACrC,CAAC,EAEM,KAAK,qBAAqBR,CAAS,CAC5C,CACF,EC7LO,IAAM2B,GAAN,cAAmCC,CAAU,CAClD,QAAsB,CACpB,IAAMC,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,iCAEtB,IAAMC,EAAiB,KAAK,MACtBC,EAAgB,KAAK,OAAS,KAC9BC,EAAUF,EAAe,SAAW,EACpCG,EAAYH,EAAe,WAAa,SAG9C,OAAAD,EAAU,MAAM,oBAAsB,UAAUG,CAAO,SACvDH,EAAU,MAAM,IAAMC,EAAe,KAAO,OAG5CA,EAAe,QAAQ,QAASI,GAAW,CACzC,IAAMC,EAAc,OAAOD,GAAW,SAAWA,EAASA,EAAO,MAC3DE,EAAc,OAAOF,GAAW,SAAWA,EAASA,EAAO,MAC3DG,EAAc,OAAOH,GAAW,UAAY,UAAWA,GAAUA,EAAO,MAC1EA,EAAO,MACP,OACEI,EAAoB,OAAOJ,GAAW,UAAY,gBAAiBA,GAAUA,EAAO,YACtFA,EAAO,YACP,OAEEK,EAAW,SAAS,cAAc,KAAK,EAC7CA,EAAS,UAAY,kDAAkDN,CAAS,GAChFM,EAAS,aAAa,aAAc,OAAOJ,CAAW,CAAC,EACvDI,EAAS,aAAa,OAAQ,QAAQ,EACtCA,EAAS,aAAa,WAAY,GAAG,EACrCA,EAAS,aAAa,aAAcH,CAAW,GAE3CL,IAAkBI,GAAgB,MAAM,QAAQJ,CAAa,GAAKA,EAAc,SAASI,CAAW,IACtGI,EAAS,UAAU,IAAI,UAAU,EAInC,IAAMC,EAAiB,SAAS,cAAc,KAAK,EAGnD,GAFAA,EAAe,UAAY,uCAEvBH,EAAa,CACf,IAAMI,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,IAAMJ,EACVI,EAAI,IAAML,EACVK,EAAI,UAAY,6BAChBD,EAAe,YAAYC,CAAG,CAChC,KAAO,CAEL,IAAMC,EAAc,SAAS,cAAc,KAAK,EAChDA,EAAY,UAAY,mCACxBA,EAAY,YAAcN,EAAY,OAAO,CAAC,EAAE,YAAY,EAC5DI,EAAe,YAAYE,CAAW,CACxC,CAGA,IAAMC,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,iCAClBb,EAAe,UACjBa,EAAU,UAAU,IAAI,UAAU,EAC9B,MAAM,QAAQZ,CAAa,GAAKA,EAAc,SAASI,CAAW,IACpEQ,EAAU,UAAU,IAAI,SAAS,EACjCA,EAAU,UAAY,YAGxBA,EAAU,UAAU,IAAI,OAAO,EAC3BZ,IAAkBI,IACpBQ,EAAU,UAAU,IAAI,SAAS,EACjCA,EAAU,UAAY,WAG1BH,EAAe,YAAYG,CAAS,EAGpC,IAAMC,EAAQ,SAAS,cAAc,KAAK,EAK1C,GAJAA,EAAM,UAAY,6BAClBA,EAAM,YAAcR,EAGhBE,EAAmB,CACrB,IAAMO,EAAc,SAAS,cAAc,KAAK,EAChDA,EAAY,UAAY,mCACxBA,EAAY,YAAcP,EAC1BC,EAAS,YAAYM,CAAW,CAClC,CAEAN,EAAS,YAAYC,CAAc,EACnCD,EAAS,YAAYK,CAAK,EAG1B,IAAME,EAAe,IAAM,CACzB,GAAIhB,EAAe,SAAU,CAC3B,IAAMiB,EAAgB,MAAM,QAAQhB,CAAa,EAAI,CAAC,GAAGA,CAAa,EAAI,CAAC,EACrEiB,EAAQD,EAAc,QAAQZ,CAAW,EAE3Ca,EAAQ,IACVD,EAAc,OAAOC,EAAO,CAAC,EAC7BT,EAAS,UAAU,OAAO,UAAU,EACpCI,EAAU,UAAU,OAAO,SAAS,EACpCA,EAAU,UAAY,KAEtBI,EAAc,KAAKZ,CAAW,EAC9BI,EAAS,UAAU,IAAI,UAAU,EACjCI,EAAU,UAAU,IAAI,SAAS,EACjCA,EAAU,UAAY,UAGxB,KAAK,SAASI,EAAc,OAAS,EAAIA,EAAgB,IAAI,CAC/D,MAEElB,EAAU,iBAAiB,4BAA4B,EAAE,QAASoB,GAAS,CACzEA,EAAK,UAAU,OAAO,UAAU,EAChC,IAAMC,EAAgBD,EAAK,cAAc,iCAAiC,EACtEC,IACFA,EAAc,UAAU,OAAO,SAAS,EACxCA,EAAc,UAAY,GAE9B,CAAC,EAEDX,EAAS,UAAU,IAAI,UAAU,EACjCI,EAAU,UAAU,IAAI,SAAS,EACjCA,EAAU,UAAY,SACtB,KAAK,SAASR,CAAW,CAE7B,EAEAI,EAAS,iBAAiB,QAASO,CAAY,EAC/CP,EAAS,iBAAiB,UAAYY,GAAM,EACtCA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAe,EACjBL,EAAa,EAEjB,CAAC,EAEDP,EAAS,iBAAiB,OAAQ,IAAM,CACtC,KAAK,OAAO,CACd,CAAC,EAEDV,EAAU,YAAYU,CAAQ,CAChC,CAAC,EAEM,KAAK,qBAAqBV,CAAS,CAC5C,CACF,EC9IO,IAAMuB,GAAN,cAAuBC,CAAU,CAAjC,kCACL,KAAQ,OAA6B,CAAC,EAEtC,QAAsB,CACpB,IAAMC,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,0BAGtB,IAAMC,EADW,KAAK,MACE,QAAU,EAC5BC,EAAQ,KAAK,OAAS,GACtBC,EAAc,OAAOD,CAAK,EAAE,SAASD,EAAQ,EAAE,EAAE,MAAM,EAAGA,CAAM,EAGtE,QAASG,EAAI,EAAGA,EAAIH,EAAQG,IAAK,CAC/B,IAAMC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,OACbA,EAAM,UAAY,UAClBA,EAAM,UAAY,EAClBA,EAAM,UAAY,sBAClBA,EAAM,aAAa,aAAc,uBAAiBD,EAAI,CAAC,EAAE,EAErDD,EAAYC,CAAC,IACfC,EAAM,MAAQF,EAAYC,CAAC,GAG7B,KAAK,iBAAiBC,CAAK,EAC3BA,EAAM,GAAK,GAAG,KAAK,WAAW,CAAC,IAAID,CAAC,GAGpC,IAAME,EAAeF,EAGrBC,EAAM,iBAAiB,QAAUE,GAAM,CACrC,IAAMC,EAASD,EAAE,OACXE,EAAaD,EAAO,MAAM,QAAQ,UAAW,EAAE,EACrDA,EAAO,MAAQC,EAGXA,GAAcH,EAAeL,EAAS,GACxC,KAAK,OAAOK,EAAe,CAAC,EAAE,MAAM,EAGtC,KAAK,eAAe,CACtB,CAAC,EAEDD,EAAM,iBAAiB,UAAYE,GAAM,CACvC,IAAMC,EAASD,EAAE,OAGbA,EAAE,MAAQ,aAAe,CAACC,EAAO,OAASF,EAAe,IAC3D,KAAK,OAAOA,EAAe,CAAC,EAAE,MAAM,EACpC,KAAK,OAAOA,EAAe,CAAC,EAAE,MAAQ,GACtC,KAAK,eAAe,GAIlBC,EAAE,MAAQ,aAAeD,EAAe,IAC1CC,EAAE,eAAe,EACjB,KAAK,OAAOD,EAAe,CAAC,EAAE,MAAM,GAElCC,EAAE,MAAQ,cAAgBD,EAAeL,EAAS,IACpDM,EAAE,eAAe,EACjB,KAAK,OAAOD,EAAe,CAAC,EAAE,MAAM,EAExC,CAAC,EAEDD,EAAM,iBAAiB,QAAUE,GAAM,CACrCA,EAAE,eAAe,EAEjB,IAAMG,GADcH,EAAE,eAAkB,OAAe,eAAe,QAAQ,MAAM,EAC1D,QAAQ,UAAW,EAAE,EAAE,MAAM,EAAGN,CAAM,EAGhE,QAASU,EAAI,EAAGA,EAAID,EAAO,QAAWJ,EAAeK,EAAKV,EAAQU,IAChE,KAAK,OAAOL,EAAeK,CAAC,EAAE,MAAQD,EAAOC,CAAC,EAIhD,IAAMC,EAAiB,KAAK,IAAIN,EAAeI,EAAO,OAAQT,EAAS,CAAC,EACxE,KAAK,OAAOW,CAAc,EAAE,MAAM,EAClC,KAAK,eAAe,CACtB,CAAC,EAEDP,EAAM,iBAAiB,QAAUE,GAAM,CACtBA,EAAE,OACV,OAAO,CAChB,CAAC,EAEDF,EAAM,iBAAiB,OAAQ,IAAM,CACnC,KAAK,OAAO,CACd,CAAC,EAED,KAAK,OAAO,KAAKA,CAAK,EACtBL,EAAU,YAAYK,CAAK,CAC7B,CAEA,OAAO,KAAK,qBAAqBL,CAAS,CAC5C,CAEQ,gBAAuB,CAC7B,IAAMa,EAAW,KAAK,OAAO,IAAIR,GAASA,EAAM,KAAK,EAAE,KAAK,EAAE,EACxDS,EAAW,KAAK,MAGhBC,EAAaF,EAAS,SAAW,KAAK,OAAO,OAASA,EAAW,KAGnEC,EAAS,SAAWC,EACtB,KAAK,SAAS,OAAOA,CAAU,CAAC,EAEhC,KAAK,SAASA,CAAU,CAE5B,CACF,EChHA,IAAMC,GAA2B,EAEjC,SAASC,GAAOC,EAA0B,CACxC,OAAIA,EACK,maAEF,oRACT,CAEO,IAAMC,GAAN,cAA4BC,CAAU,CAAtC,kCACL,KAAQ,OAA6B,CAAC,EACtC,KAAQ,QAAU,GAElB,IAAI,eAA+B,CACjC,OAAO,KAAK,KACd,CAEA,QAAsB,CACpB,IAAMC,EAAK,KAAK,cACVC,EAAe,CAAC,CAACD,EAAG,mBACpBE,EAASD,EACX,OAAOD,EAAG,oBAAuB,SAC/BA,EAAG,mBACHL,GACF,EAEJ,OAAIM,EACK,KAAK,qBAAqB,KAAK,gBAAgBC,CAAM,CAAC,EAExD,KAAK,qBAAqB,KAAK,aAAa,CAAC,CACtD,CAEQ,cAA4B,CAElC,IAAMC,EAAa,CAAC,CADT,KAAK,cACQ,WAElBC,EAAQ,SAAS,cAAc,OAAO,EAY5C,GAXAA,EAAM,KAAO,WACbA,EAAM,MAAQ,KAAK,OAAS,GAC5BA,EAAM,GAAK,KAAK,WAAW,EAC3B,KAAK,iBAAiBA,CAAK,EACvB,KAAK,MAAM,cAAaA,EAAM,YAAc,KAAK,MAAM,aAE3DA,EAAM,iBAAiB,QAAUC,GAAM,CACrC,KAAK,SAAUA,EAAE,OAA4B,KAAK,CACpD,CAAC,EACDD,EAAM,iBAAiB,OAAQ,IAAM,KAAK,OAAO,CAAC,EAE9C,CAACD,EACH,OAAOC,EAGT,IAAME,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,2BACpBF,EAAM,UAAU,IAAI,0BAA0B,EAC9CE,EAAQ,YAAYF,CAAK,EAEzB,IAAMG,EAAM,SAAS,cAAc,QAAQ,EAC3C,OAAAA,EAAI,KAAO,SACXA,EAAI,UAAY,4BAChBA,EAAI,aAAa,aAAc,uBAAoB,EACnDA,EAAI,UAAYX,GAAO,EAAK,EAC5BW,EAAI,iBAAiB,QAAS,IAAM,CAClC,KAAK,QAAU,CAAC,KAAK,QACrBH,EAAM,KAAO,KAAK,QAAU,OAAS,WACrCG,EAAI,aAAa,aAAc,KAAK,QAAU,wBAAuB,uBAAoB,EACzFA,EAAI,UAAYX,GAAO,KAAK,OAAO,CACrC,CAAC,EACDU,EAAQ,YAAYC,CAAG,EAChBD,CACT,CAEQ,gBAAgBJ,EAA6B,CAEnD,IAAMC,EAAa,CAAC,CADT,KAAK,cACQ,WAClBK,EAAQ,KAAK,OAAS,GACtBC,EAAc,OAAOD,CAAK,EAAE,MAAM,EAAGN,CAAM,EAE3CQ,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,+BAEtB,QAASC,EAAI,EAAGA,EAAIT,EAAQS,IAAK,CAC/B,IAAMP,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,WACbA,EAAM,UAAY,EAClBA,EAAM,UAAY,qCAClBA,EAAM,aAAa,aAAc,eAAYO,EAAI,CAAC,OAAOT,CAAM,EAAE,EAC7DO,EAAYE,CAAC,IAAGP,EAAM,MAAQK,EAAYE,CAAC,GAC/C,KAAK,iBAAiBP,CAAK,EAC3BA,EAAM,GAAKO,IAAM,EAAI,KAAK,WAAW,EAAI,GAAG,KAAK,WAAW,CAAC,IAAIA,CAAC,GAC9DA,EAAI,GAAGP,EAAM,gBAAgB,MAAM,EACvC,IAAMQ,EAAeD,EAErBP,EAAM,iBAAiB,QAAUC,GAAM,CACtBA,EAAE,OACE,OACRO,EAAeV,EAAS,GACjC,KAAK,OAAOU,EAAe,CAAC,EAAE,MAAM,EAEtC,KAAK,qBAAqB,CAC5B,CAAC,EAEDR,EAAM,iBAAiB,UAAYC,GAAM,CACnCA,EAAE,MAAQ,aAAe,CAAEA,EAAE,OAA4B,OAASO,EAAe,IACnF,KAAK,OAAOA,EAAe,CAAC,EAAE,MAAM,EACpC,KAAK,OAAOA,EAAe,CAAC,EAAE,MAAQ,GACtC,KAAK,qBAAqB,GAExBP,EAAE,MAAQ,aAAeO,EAAe,IAC1CP,EAAE,eAAe,EACjB,KAAK,OAAOO,EAAe,CAAC,EAAE,MAAM,GAElCP,EAAE,MAAQ,cAAgBO,EAAeV,EAAS,IACpDG,EAAE,eAAe,EACjB,KAAK,OAAOO,EAAe,CAAC,EAAE,MAAM,EAExC,CAAC,EAEDR,EAAM,iBAAiB,QAAUC,GAAM,CACrCA,EAAE,eAAe,EAEjB,IAAMQ,IADQR,EAAE,eAAkB,OAAe,gBAAgB,QAAQ,MAAM,GAAK,IACjE,MAAM,EAAGH,EAASU,CAAY,EAAE,MAAM,EAAE,EAC3D,QAASE,EAAI,EAAGA,EAAID,EAAM,QAAUD,EAAeE,EAAIZ,EAAQY,IAC7D,KAAK,OAAOF,EAAeE,CAAC,EAAE,MAAQD,EAAMC,CAAC,EAE/C,IAAMC,EAAU,KAAK,IAAIH,EAAeC,EAAM,OAAQX,EAAS,CAAC,EAChE,KAAK,OAAOa,CAAO,EAAE,MAAM,EAC3B,KAAK,qBAAqB,CAC5B,CAAC,EAEDX,EAAM,iBAAiB,QAAUC,GAAOA,EAAE,OAA4B,OAAO,CAAC,EAC9ED,EAAM,iBAAiB,OAAQ,IAAM,KAAK,OAAO,CAAC,EAElD,KAAK,OAAO,KAAKA,CAAK,EACtBM,EAAU,YAAYN,CAAK,CAC7B,CAEA,GAAID,EAAY,CACd,IAAMa,EAAa,SAAS,cAAc,KAAK,EAC/CA,EAAW,UAAY,sCACvB,IAAMT,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,KAAO,SACXA,EAAI,UAAY,4BAChBA,EAAI,aAAa,aAAc,uBAAoB,EACnDA,EAAI,UAAYX,GAAO,EAAK,EAC5BW,EAAI,iBAAiB,QAAS,IAAM,CAClC,KAAK,QAAU,CAAC,KAAK,QACrB,IAAMU,EAAO,KAAK,QAAU,OAAS,WACrC,KAAK,OAAO,QAASC,GAAQ,CAAEA,EAAI,KAAOD,CAAK,CAAC,EAChDV,EAAI,aAAa,aAAc,KAAK,QAAU,wBAAuB,uBAAoB,EACzFA,EAAI,UAAYX,GAAO,KAAK,OAAO,CACrC,CAAC,EACDoB,EAAW,YAAYT,CAAG,EAC1BG,EAAU,YAAYM,CAAU,CAClC,CAEA,OAAON,CACT,CAEQ,sBAA6B,CACnC,IAAMF,EAAQ,KAAK,OAAO,IAAKU,GAAQA,EAAI,KAAK,EAAE,KAAK,EAAE,EACzD,KAAK,SAASV,GAAS,IAAI,CAC7B,CACF,ECnKO,IAAMW,GAAN,cAA4BC,CAAU,CAC3C,QAAsB,CACpB,IAAMC,EAAgB,KAAK,MACrBC,EAASD,EAAc,QAAU,GACjCE,EAAWF,EAAc,UAAY,GAErCG,EAAW,SAAS,cAAc,KAAK,EAC7CA,EAAS,UAAY,sBACrBA,EAAS,aAAa,WAAY,GAAG,EAErC,IAAMC,EAAc,SAAS,cAAc,OAAO,EAClDA,EAAY,KAAO,OACnBA,EAAY,UAAY,4BACxBA,EAAY,MAAM,QAAU,OACxBH,IAAQG,EAAY,OAASH,GAC7BC,IAAUE,EAAY,SAAW,IAErC,IAAMC,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,UAAY,4BAClBA,EAAM,YAAc,wDACpBF,EAAS,YAAYE,CAAK,EAC1BF,EAAS,YAAYC,CAAW,EAEhC,IAAME,EAAW,SAAS,cAAc,KAAK,EAC7CA,EAAS,UAAY,2BAErB,IAAMC,EAAkBC,GAAgC,CACtD,IAAMC,EAASD,EAEX,MAAM,QAAQA,CAAK,EACjBA,EAAM,IAAKE,GAAMA,EAAE,IAAI,EACvB,CAACF,EAAM,IAAI,EAHb,CAAC,EAKL,GADAF,EAAS,UAAY,GACjBG,EAAM,SAAW,EAAG,CACtBH,EAAS,MAAM,QAAU,OACzB,MACF,CACAA,EAAS,MAAM,QAAU,QACzBG,EAAM,QAASE,GAAS,CACtB,IAAMC,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,2BACjBA,EAAK,YAAcD,EACnBL,EAAS,YAAYM,CAAI,CAC3B,CAAC,CACH,EACAL,EAAe,KAAK,KAA6B,EAEjD,IAAMM,EAAeL,GAA2B,CAC9C,GAAI,CAACA,GAASA,EAAM,SAAW,EAAG,OAClC,IAAMM,EAAMZ,EAAW,MAAM,KAAKM,CAAK,EAAIA,EAAM,CAAC,EAClD,KAAK,SAASM,CAAG,EACjB,KAAK,OAAO,EACZP,EAAeO,CAAG,CACpB,EAEA,OAAAX,EAAS,iBAAiB,QAAS,IAAM,CACvCC,EAAY,MAAM,CACpB,CAAC,EAEDA,EAAY,iBAAiB,SAAWW,GAAM,CAC5C,IAAMC,EAASD,EAAE,OACjBF,EAAYG,EAAO,KAAK,EACxBA,EAAO,MAAQ,EACjB,CAAC,EAEDb,EAAS,iBAAiB,WAAaY,GAAM,CAC3CA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBZ,EAAS,UAAU,IAAI,0BAA0B,CACnD,CAAC,EAEDA,EAAS,iBAAiB,YAAcY,GAAM,CAC5CA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBZ,EAAS,UAAU,OAAO,0BAA0B,CACtD,CAAC,EAEDA,EAAS,iBAAiB,OAASY,GAAM,CACvCA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBZ,EAAS,UAAU,OAAO,0BAA0B,EACpDU,EAAYE,EAAE,cAAc,OAAS,IAAI,CAC3C,CAAC,EAEDZ,EAAS,YAAYG,CAAQ,EACtB,KAAK,qBAAqBH,CAAQ,CAC3C,CACF,ECvFA,IAAMc,GAAc,mDAEPC,GAAN,cAAuBC,CAAU,CAAjC,kCACL,KAAQ,YAA4B,KACpC,KAAQ,eAAkC,KAE1C,QAAsB,CACpB,IAAMC,EAAW,KAAK,MAChBC,EAASD,EAAS,QAAU,CAAE,IAAK,EAAG,IAAK,CAAE,EAC7CE,EAAOF,EAAS,MAAQ,GACxBG,EAAQ,KAAK,MACbC,EAAM,OAAOD,GAAU,UAAYA,GAAO,KAAO,KAAOA,EAAM,IAAMF,EAAO,IAC3EI,EAAM,OAAOF,GAAU,UAAYA,GAAO,KAAO,KAAOA,EAAM,IAAMF,EAAO,IAE3EK,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,gBAEtB,IAAMC,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,UAAY,uBAE1B,IAAMC,EAAW,SAAS,cAAc,OAAO,EAC/CA,EAAS,KAAO,SAChBA,EAAS,KAAO,MAChBA,EAAS,YAAc,UACvBA,EAAS,MAAQ,OAAOJ,CAAG,EAC3BI,EAAS,UAAY,oBAErB,IAAMC,EAAW,SAAS,cAAc,OAAO,EAC/CA,EAAS,KAAO,SAChBA,EAAS,KAAO,MAChBA,EAAS,YAAc,WACvBA,EAAS,MAAQ,OAAOJ,CAAG,EAC3BI,EAAS,UAAY,oBAErB,IAAMC,EAAmB,IAAM,CAC7B,IAAMC,EAAS,WAAWH,EAAS,KAAK,EAClCI,EAAS,WAAWH,EAAS,KAAK,EACpC,CAAC,MAAME,CAAM,GAAK,CAAC,MAAMC,CAAM,IACjC,KAAK,SAAS,CAAE,IAAKD,EAAQ,IAAKC,CAAO,CAAC,EAC1C,KAAK,mBAAmBD,EAAQC,CAAM,GAExC,KAAK,OAAO,CACd,EAEAJ,EAAS,iBAAiB,SAAUE,CAAgB,EACpDD,EAAS,iBAAiB,SAAUC,CAAgB,EAEpDH,EAAc,YAAYC,CAAQ,EAClCD,EAAc,YAAYE,CAAQ,EAClCH,EAAU,YAAYC,CAAa,EAEnC,IAAMM,EAAe,SAAS,cAAc,KAAK,EACjDA,EAAa,UAAY,0BACzBP,EAAU,YAAYO,CAAY,EAIlC,IAAMC,EAAS,wBACXC,EAAY,GACVC,EAAO,SAAS,cAAc,MAAM,EAC1C,OAAAA,EAAK,GAAKF,EACVE,EAAK,IAAM,aACXA,EAAK,KAAOnB,GACZmB,EAAK,OAAS,IAAM,CAAED,EAAY,EAAK,EACvCT,EAAU,aAAaU,EAAMV,EAAU,UAAU,GAEjC,SAAY,CAC1B,GAAI,OAAO,OAAW,IAAa,OAGnCO,EAAa,MAAM,OAAS,QAC5BA,EAAa,MAAM,MAAQ,OAC3BA,EAAa,MAAM,SAAW,WAC9BA,EAAa,MAAM,SAAW,SAC9BA,EAAa,MAAM,QAAU,QAG7B,MAAM,IAAI,QAASI,GAAY,CAC7B,IAAMC,EAAa,IAAM,CACnBH,GAAaF,EAAa,YAAc,GAAKA,EAAa,aAAe,EAC3EI,EAAQ,MAAS,EAEjB,sBAAsBC,CAAU,CAEpC,EACAA,EAAW,CACb,CAAC,EAGD,MAAM,IAAI,QAASD,GAAY,WAAWA,EAAS,EAAE,CAAC,EAEtD,IAAIE,EACJ,GAAI,CACFA,EAAI,KAAM,QAAO,SAAS,CAC5B,MAAQ,CACNN,EAAa,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UASzB,MACF,CAGA,OAAQM,EAAE,KAAK,QAAQ,UAAwC,YAC/DA,EAAE,KAAK,QAAQ,aAAa,CAC1B,cAAe,iEACf,QAAS,8DACT,UAAW,+DACb,CAAC,EAED,KAAK,YAAcA,EAAE,IAAIN,EAAc,CACrC,aAAc,GACd,YAAa,EACf,CAAC,EAAE,QAAQ,CAACT,EAAKC,CAAG,EAAGH,CAAI,EAE3B,IAAMkB,EAAYD,EAAE,UAAU,qDAAsD,CAClF,YAAa,6EACb,QAAS,EACX,CAAC,EAAE,MAAM,KAAK,WAAW,EAGzB,KAAK,YAAY,eAAe,EAGhCC,EAAU,GAAG,OAAQ,IAAM,CACrB,KAAK,aACP,KAAK,YAAY,eAAe,CAEpC,CAAC,EAGD,IAAMC,EAAiB,IAAM,CACvB,KAAK,aACP,KAAK,YAAY,eAAe,CAEpC,EACA,WAAWA,EAAgB,GAAG,EAC9B,WAAWA,EAAgB,GAAG,EAC9B,WAAWA,EAAgB,GAAG,EAGb,IAAI,qBAAsBC,GAAY,CACrDA,EAAQ,QAASC,GAAU,CACrBA,EAAM,gBAAkB,KAAK,aAC/B,WAAW,IAAM,CACf,KAAK,aAAa,eAAe,CACnC,EAAG,GAAG,CAEV,CAAC,CACH,CAAC,EACQ,QAAQV,CAAY,EAE7B,KAAK,eAAiBM,EAAE,OAAO,CAACf,EAAKC,CAAG,EAAG,CAAE,UAAW,EAAK,CAAC,EAC3D,MAAM,KAAK,WAAW,EACtB,GAAG,UAAW,IAAM,CACnB,IAAMmB,EAAM,KAAK,eAAgB,UAAU,EAC3ChB,EAAS,MAAQ,OAAO,OAAOgB,EAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,EAClDf,EAAS,MAAQ,OAAO,OAAOe,EAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,EAClD,KAAK,SAAS,CAAE,IAAKA,EAAI,IAAK,IAAKA,EAAI,GAAI,CAAC,EAC5C,KAAK,OAAO,CACd,CAAC,EAEH,KAAK,YAAY,GAAG,QAAUC,GAA2B,CACvD,GAAM,CAAE,IAAKC,EAAQ,IAAKC,CAAO,EAAIF,EAAE,OACvC,KAAK,eAAgB,UAAU,CAACC,EAAQC,CAAM,CAAC,EAC/CnB,EAAS,MAAQ,OAAO,OAAOkB,EAAO,QAAQ,CAAC,CAAC,CAAC,EACjDjB,EAAS,MAAQ,OAAO,OAAOkB,EAAO,QAAQ,CAAC,CAAC,CAAC,EACjD,KAAK,SAAS,CAAE,IAAKD,EAAQ,IAAKC,CAAO,CAAC,EAC1C,KAAK,OAAO,CACd,CAAC,CACH,GAEQ,EAED,KAAK,qBAAqBrB,CAAS,CAC5C,CAEQ,mBAAmBoB,EAAgBC,EAAsB,CAC3D,KAAK,aAAe,KAAK,iBAC3B,KAAK,eAAe,UAAU,CAACD,EAAQC,CAAM,CAAC,EAC9C,KAAK,YAAY,QAAQ,CAACD,EAAQC,CAAM,CAAC,EAEzC,WAAW,IAAM,CACf,KAAK,aAAa,eAAe,CACnC,EAAG,EAAE,EAET,CACF,EChMA,IAAMC,GAAYC,GAChB,4FAA4FA,EAAS,eAAiB,MAAM,mPAEjHC,GAAN,cAA0BC,CAAU,CACzC,QAAsB,CACpB,IAAMC,EAAc,KAAK,MACnBC,EAAMD,EAAY,KAAO,EACzBE,EAAOF,EAAY,MAAQ,GAC3BG,EAAe,KAAK,OAAS,KAAO,OAAO,KAAK,KAAK,EAAI,EAEzDC,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,mBACtBA,EAAU,aAAa,OAAQ,QAAQ,EACvCA,EAAU,aAAa,gBAAiB,GAAG,EAC3CA,EAAU,aAAa,gBAAiB,OAAOH,CAAG,CAAC,EACnDG,EAAU,aAAa,gBAAiB,OAAOD,CAAY,CAAC,EAC5DC,EAAU,aAAa,aAAc,KAAK,MAAM,OAAS,QAAQ,EACjEA,EAAU,aAAa,WAAY,GAAG,EAEtC,IAAMC,EAAiB,SAAS,cAAc,KAAK,EACnDA,EAAe,UAAY,yBAE3B,QAASC,EAAI,EAAGA,GAAKL,EAAKK,IAAK,CAC7B,IAAMC,EAAc,SAAS,cAAc,QAAQ,EACnDA,EAAY,KAAO,SACnB,IAAMV,EAASM,GAAgBG,GAAMJ,GAAQC,GAAgBG,EAAI,GACjEC,EAAY,UAAYV,EACpB,qDACA,wBACJU,EAAY,UAAYX,GAASC,CAAM,EACvCU,EAAY,aAAa,aAAc,GAAGD,CAAC,OAAOL,CAAG,EAAE,EACvDM,EAAY,iBAAiB,QAAUC,GAAM,CAC3CA,EAAE,eAAe,EACjB,IAAMC,EAAQD,EAAE,OAAuB,QAAQ,QAAQ,GAAG,sBAAsB,EAC5EE,EAAMJ,EACV,GAAIJ,GAAQO,EAAM,CAChB,IAAME,EAAMF,EAAK,KAAOA,EAAK,MAAQ,EACrCC,EAAOF,EAAiB,QAAUG,EAAML,EAAI,GAAMA,CACpD,CACA,KAAK,SAASI,CAAG,EACjB,KAAK,OAAO,EACZ,KAAK,cAAcN,EAAWH,EAAKS,EAAKR,CAAI,EAC5CE,EAAU,aAAa,gBAAiB,OAAOM,CAAG,CAAC,CACrD,CAAC,EACDL,EAAe,YAAYE,CAAW,CACxC,CAEA,OAAAH,EAAU,YAAYC,CAAc,EAEpCD,EAAU,iBAAiB,UAAYI,GAAM,CAC3C,IAAMI,EAAM,OAAOR,EAAU,aAAa,eAAe,CAAC,GAAK,EAC3DS,EAASD,EACTJ,EAAE,MAAQ,cAAgBA,EAAE,MAAQ,WACtCA,EAAE,eAAe,EACjBK,EAAS,KAAK,IAAIZ,EAAKC,EAAOU,EAAM,GAAMA,EAAM,CAAC,EACjD,KAAK,SAASC,CAAM,IACXL,EAAE,MAAQ,aAAeA,EAAE,MAAQ,eAC5CA,EAAE,eAAe,EACjBK,EAAS,KAAK,IAAI,EAAGX,EAAOU,EAAM,GAAMA,EAAM,CAAC,EAC/C,KAAK,SAASC,CAAM,GAElBA,IAAWD,IACb,KAAK,cAAcR,EAAWH,EAAKY,EAAQX,CAAI,EAC/CE,EAAU,aAAa,gBAAiB,OAAOS,CAAM,CAAC,EAE1D,CAAC,EAEM,KAAK,qBAAqBT,CAAS,CAC5C,CAEQ,cACNA,EACAH,EACAa,EACAZ,EACM,CACQE,EAAU,iBAAiB,wBAAwB,EAC3D,QAAQ,CAACW,EAAMT,IAAM,CACzB,IAAMU,EAAMV,EAAI,EACVT,EAASiB,GAASE,GAAQd,GAAQY,GAASE,EAAM,GACvDD,EAAK,UAAYlB,EACb,qDACA,wBACJkB,EAAK,UAAYnB,GAASC,CAAM,CAClC,CAAC,CACH,CACF,ECtFO,IAAMoB,GAAN,cAA0BC,CAAU,CACzC,QAAsB,CACpB,IAAMC,EAAc,KAAK,MACnBC,EAAMD,EAAY,KAAO,EACzBE,EAAMF,EAAY,KAAO,IACzBG,EAAOH,EAAY,MAAQ,EAC3BI,EAAYJ,EAAY,WAAa,GAErCK,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,KAAO,QACbA,EAAM,IAAM,OAAOJ,CAAG,EACtBI,EAAM,IAAM,OAAOH,CAAG,EACtBG,EAAM,KAAO,OAAOF,CAAI,EACxBE,EAAM,MAAQ,KAAK,OAAS,KAAO,OAAO,KAAK,KAAK,EAAI,OAAOJ,CAAG,EAElEI,EAAM,aAAa,gBAAiB,OAAOJ,CAAG,CAAC,EAC/CI,EAAM,aAAa,gBAAiB,OAAOH,CAAG,CAAC,EAC/CG,EAAM,aAAa,gBAAiBA,EAAM,KAAK,EAE/C,KAAK,iBAAiBA,CAAK,EAE3BA,EAAM,iBAAiB,QAAUC,GAAM,CACrC,IAAMC,EAASD,EAAE,OACXE,EAAML,GAAQ,EAAI,SAASI,EAAO,MAAO,EAAE,EAAI,WAAWA,EAAO,KAAK,EAC5E,KAAK,SAAS,MAAMC,CAAG,EAAIP,EAAMO,CAAG,EAChCC,IACFA,EAAU,YAAcF,EAAO,OAEjCF,EAAM,aAAa,gBAAiBE,EAAO,KAAK,CAClD,CAAC,EAEDF,EAAM,iBAAiB,SAAU,IAAM,CACrC,KAAK,OAAO,CACd,CAAC,EAED,IAAII,EAAoC,KACxC,GAAIL,EAAW,CACbK,EAAY,SAAS,cAAc,MAAM,EACzCA,EAAU,UAAY,yBACtBA,EAAU,YAAcJ,EAAM,MAC9B,IAAMK,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,UAAY,2BACpBA,EAAQ,YAAYL,CAAK,EACzBK,EAAQ,YAAYD,CAAS,EACtB,KAAK,qBAAqBC,CAAO,CAC1C,CAEA,OAAO,KAAK,qBAAqBL,CAAK,CACxC,CACF,ECjDA,IAAMM,GAAY,uBAElB,SAASC,GAAMC,EAAuB,CACpC,IAAMC,EAAID,EAAM,MAAMF,EAAS,EAC/B,OAAIG,EAAU,IAAIA,EAAE,CAAC,EAAE,YAAY,CAAC,GAChC,mBAAmB,KAAKD,CAAK,EAAU,IAAIA,EAAM,YAAY,CAAC,GAC3D,SACT,CAEO,IAAME,GAAN,cAAyBC,CAAU,CACxC,QAAsB,CAEpB,IAAMC,EADa,KAAK,MACQ,cAAgB,UAC1CC,EACJ,KAAK,OAAS,MAAQ,OAAO,KAAK,OAAU,SACxCN,GAAM,KAAK,KAAK,EAChBK,EAEAE,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,0BAEpB,IAAMC,EAAc,SAAS,cAAc,OAAO,EAClDA,EAAY,KAAO,QACnBA,EAAY,MAAQF,EACpBE,EAAY,aAAa,QAASF,CAAY,EAC9CE,EAAY,aAAa,aAAc,KAAK,MAAM,OAAS,OAAO,EAClEA,EAAY,GAAK,GAAG,KAAK,WAAW,CAAC,UACjC,KAAK,MAAM,UAAUA,EAAY,aAAa,WAAY,MAAM,EAEpE,IAAMC,EAAY,SAAS,cAAc,OAAO,EAChDA,EAAU,KAAO,OACjBA,EAAU,MAAQH,EAClBG,EAAU,aAAa,aAAc,GAAG,KAAK,MAAM,OAAS,OAAO,QAAQ,EAC3EA,EAAU,YAAc,UACxBA,EAAU,UAAY,uBACtB,KAAK,iBAAiBA,CAAS,EAE/B,IAAMC,EAAiB,IAAM,CAC3B,IAAMT,EAAQO,EAAY,OAAS,UAC7BG,EAAMX,GAAMC,CAAK,EACvBQ,EAAU,MAAQE,EAClB,KAAK,SAASA,CAAG,CACnB,EAEMC,EAAe,IAAM,CACzB,IAAMC,EAAMJ,EAAU,MAAM,KAAK,EAC3BR,EAAQY,EAAI,WAAW,GAAG,EAAIA,EAAM,IAAIA,CAAG,GACjD,GAAI,oBAAoB,KAAKZ,CAAK,EAAG,CACnC,IAAMU,EAAMX,GAAMC,CAAK,EACvBO,EAAY,MAAQG,EACpB,KAAK,SAASA,CAAG,CACnB,CACF,EAEA,OAAAH,EAAY,iBAAiB,QAASE,CAAc,EACpDF,EAAY,iBAAiB,SAAU,IAAM,CAC3CE,EAAe,EACf,KAAK,OAAO,CACd,CAAC,EACDD,EAAU,iBAAiB,QAASG,CAAY,EAChDH,EAAU,iBAAiB,OAAQ,IAAM,CACvCG,EAAa,EACb,KAAK,OAAO,CACd,CAAC,EAEDL,EAAQ,YAAYC,CAAW,EAC/BD,EAAQ,YAAYE,CAAS,EACtB,KAAK,qBAAqBF,CAAO,CAC1C,CACF,ECrEO,IAAMO,GAAN,cAA4BC,CAAU,CAAtC,kCACL,KAAQ,WAAyC,KACjD,KAAQ,UAAgC,KACxC,KAAQ,cAAuC,KAE/C,QAAsB,CACpB,IAAMC,EAAQ,KAAK,MACbC,EAAOD,EAAM,MAAQ,QACrBE,EAAcF,EAAM,SAAW,GAC/BG,EAASH,EAAM,QAAU,QAEzBI,EAAY,SAAS,cAAc,KAAK,EAC9C,OAAAA,EAAU,UAAY,8CAA8CH,CAAI,GAEpEA,IAAS,OACX,KAAK,eAAeG,EAAWJ,EAAOE,EAAaC,CAAM,EAChDF,IAAS,UAClB,KAAK,kBAAkBG,EAAWJ,EAAOE,EAAaC,CAAM,EAE5D,KAAK,gBAAgBC,EAAWJ,EAAOE,EAAaC,CAAM,EAG5D,KAAK,gCAAgC,EAE9B,KAAK,qBAAqBC,CAAS,CAC5C,CAEQ,gBAAgBA,EAAwBJ,EAAsBE,EAAsBC,EAAsB,CAChH,GAAID,EAAa,CACf,IAAMG,EAAU,KAAK,cAAc,EACnCD,EAAU,YAAYC,CAAO,CAC/B,CAEA,IAAMC,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,UAAY,6DAE1B,IAAMC,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,UAAY,8BACrBA,EAAS,MAAS,KAAK,OAAoB,GAC3CA,EAAS,YAAcP,EAAM,aAAe,yBAC5CO,EAAS,MAAM,OAASJ,EACxB,KAAK,WAAaI,EAElBA,EAAS,iBAAiB,QAAS,IAAM,CACvC,KAAK,SAASA,EAAS,KAAK,EAC5B,KAAK,cAAc,CACrB,CAAC,EAEDA,EAAS,iBAAiB,OAAQ,IAAM,CACtC,KAAK,OAAO,CACd,CAAC,EAEDD,EAAc,YAAYC,CAAQ,EAClCH,EAAU,YAAYE,CAAa,EAEnC,IAAME,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,6BACpBA,EAAQ,MAAM,OAASL,EACvB,KAAK,UAAYK,EAEb,KAAK,MACP,KAAK,cAAc,KAAK,MAAiBA,CAAO,EAEhDA,EAAQ,UAAY,yEAGtBF,EAAc,YAAYE,CAAO,CACnC,CAEQ,eAAeJ,EAAwBJ,EAAsBE,EAAsBC,EAAsB,CAC/G,IAAMM,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,UAAY,0BAE1B,IAAMC,EAAa,SAAS,cAAc,KAAK,EAC/CA,EAAW,UAAY,iCAEvB,IAAMC,EAAY,SAAS,cAAc,QAAQ,EACjDA,EAAU,KAAO,SACjBA,EAAU,UAAY,gCACtBA,EAAU,YAAc,SACxBA,EAAU,iBAAiB,QAAS,IAAM,KAAK,UAAU,QAAQ,CAAC,EAElE,IAAMC,EAAa,SAAS,cAAc,QAAQ,EAClDA,EAAW,KAAO,SAClBA,EAAW,UAAY,yBACvBA,EAAW,YAAc,eACzBA,EAAW,iBAAiB,QAAS,IAAM,KAAK,UAAU,SAAS,CAAC,EAEpEF,EAAW,YAAYC,CAAS,EAChCD,EAAW,YAAYE,CAAU,EACjCH,EAAc,YAAYC,CAAU,EAEpC,IAAMG,EAAiB,SAAS,cAAc,KAAK,EAGnD,GAFAA,EAAe,UAAY,kCAEvBX,EAAa,CACf,IAAMG,EAAU,KAAK,cAAc,EACnCQ,EAAe,YAAYR,CAAO,CACpC,CAEA,IAAME,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,UAAY,8BACrBA,EAAS,MAAS,KAAK,OAAoB,GAC3CA,EAAS,YAAcP,EAAM,aAAe,yBAC5CO,EAAS,MAAM,OAASJ,EACxB,KAAK,WAAaI,EAElBA,EAAS,iBAAiB,QAAS,IAAM,CACvC,KAAK,SAASA,EAAS,KAAK,EACxBK,EAAW,UAAU,SAAS,QAAQ,GACxC,KAAK,cAAcL,EAAS,MAAO,KAAK,SAAU,CAEtD,CAAC,EAEDA,EAAS,iBAAiB,OAAQ,IAAM,CACtC,KAAK,OAAO,CACd,CAAC,EAEDM,EAAe,YAAYN,CAAQ,EAEnC,IAAMC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,6BACpBA,EAAQ,MAAM,OAASL,EACvBK,EAAQ,MAAM,QAAU,OACxB,KAAK,UAAYA,EAEb,KAAK,MACP,KAAK,cAAc,KAAK,MAAiBA,CAAO,EAEhDA,EAAQ,UAAY,yEAGtBK,EAAe,YAAYL,CAAO,EAClCC,EAAc,YAAYI,CAAc,EACxCT,EAAU,YAAYK,CAAa,EAEjCA,EAAsB,WAAaE,EACnCF,EAAsB,YAAcG,EACpCH,EAAsB,UAAYF,EAClCE,EAAsB,SAAWD,CACrC,CAEQ,kBAAkBJ,EAAwBJ,EAAsBE,EAAsBC,EAAsB,CAClH,GAAID,EAAa,CACf,IAAMG,EAAU,KAAK,cAAc,EACnCD,EAAU,YAAYC,CAAO,CAC/B,CAEA,IAAMS,EAAc,SAAS,cAAc,KAAK,EAChDA,EAAY,UAAY,kCACxBA,EAAY,MAAM,OAASX,EAC3B,KAAK,cAAgBW,EAErB,IAAMC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,0CAEpB,KAAK,cAAe,KAAK,OAAoB,GAAIA,CAAO,EAExD,IAAMR,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,UAAY,wCACrBA,EAAS,MAAS,KAAK,OAAoB,GAC3CA,EAAS,YAAcP,EAAM,aAAe,aAC5CO,EAAS,aAAa,aAAc,oBAAoB,EAExDA,EAAS,iBAAiB,QAAS,IAAM,CACvC,KAAK,SAASA,EAAS,KAAK,EAC5B,KAAK,cAAcA,EAAS,MAAOQ,CAAO,CAC5C,CAAC,EAEDR,EAAS,iBAAiB,OAAQ,IAAM,CACtC,KAAK,OAAO,CACd,CAAC,EAEDO,EAAY,YAAYP,CAAQ,EAChCO,EAAY,YAAYC,CAAO,EAC/BX,EAAU,YAAYU,CAAW,CACnC,CAEQ,UAAUE,EAAiC,CACjD,IAAMZ,EAAY,KAAK,YAAY,QAAQ,0BAA0B,EACrE,GAAI,CAACA,EAAW,OAEhB,IAAMO,EAAaP,EAAkB,WAC/BQ,EAAcR,EAAkB,YAChCG,EAAYH,EAAkB,UAC9BI,EAAWJ,EAAkB,SAE/BY,IAAQ,UACVL,EAAU,UAAU,IAAI,QAAQ,EAChCC,EAAW,UAAU,OAAO,QAAQ,EACpCL,EAAS,MAAM,QAAU,QACzBC,EAAQ,MAAM,QAAU,SAExBG,EAAU,UAAU,OAAO,QAAQ,EACnCC,EAAW,UAAU,IAAI,QAAQ,EACjCL,EAAS,MAAM,QAAU,OACzBC,EAAQ,MAAM,QAAU,QACpBD,EAAS,OACX,KAAK,cAAcA,EAAS,MAAOC,CAAO,EAGhD,CAEQ,eAA6B,CACnC,IAAMH,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,UAAY,6BAEyF,CAC3G,CAAE,KAAM,qBAAsB,MAAO,UAAW,OAAQ,KAAM,OAAQ,KAAM,YAAa,kBAAmB,EAC5G,CAAE,KAAM,aAAc,MAAO,UAAW,OAAQ,IAAK,OAAQ,IAAK,YAAa,kBAAmB,EAClG,CAAE,KAAM,KAAM,MAAO,eAAgB,OAAQ,KAAM,OAAQ,GAAI,YAAa,WAAS,EACrF,CAAE,KAAM,KAAM,MAAO,eAAgB,OAAQ,MAAO,OAAQ,GAAI,YAAa,WAAS,EACtF,CAAE,KAAM,YAAM,MAAO,SAAU,OAAQ,IAAK,OAAQ,SAAU,YAAa,kBAAmB,EAC9F,CAAE,KAAM,yBAA0B,MAAO,YAAU,OAAQ,IAAK,OAAQ,IAAK,YAAa,WAAS,EACnG,CAAE,KAAM,YAAM,MAAO,SAAU,OAAQ,KAAM,OAAQ,SAAU,YAAa,mBAAoB,EAChG,CAAE,KAAM,SAAK,MAAO,QAAS,OAAQ,KAAM,OAAQ,GAAI,YAAa,UAAW,EAC/E,CAAE,KAAM,KAAM,MAAO,iBAAkB,OAAQ,MAAO,OAAQ,GAAI,YAAa,UAAW,EAC1F,CAAE,KAAM,IAAK,MAAO,OAAQ,OAAQ,KAAM,OAAQ,GAAI,YAAa,MAAO,CAC5E,EAEQ,QAAQY,GAAO,CACrB,IAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,KAAO,SACdA,EAAO,UAAY,iCACnBA,EAAO,MAAQD,EAAI,MACnBC,EAAO,UAAYD,EAAI,KACvBC,EAAO,iBAAiB,QAAS,IAAM,KAAK,eAAeD,EAAI,OAAQA,EAAI,OAAQA,EAAI,WAAW,CAAC,EACnGZ,EAAQ,YAAYa,CAAM,CAC5B,CAAC,EAEMb,CACT,CAEQ,eAAec,EAAgBC,EAAgBC,EAA2B,CAChF,IAAMd,EAAW,KAAK,WACtB,GAAI,CAACA,EAAU,CACb,GAAI,KAAK,cAAe,CACtB,IAAMe,EAAoB,KAAK,cAAc,cAAc,wCAAwC,EAC/FA,GACF,KAAK,4BAA4BA,EAAmBH,EAAQC,EAAQC,CAAW,CAEnF,CACA,MACF,CAEA,IAAME,EAAQhB,EAAS,eACjBiB,EAAMjB,EAAS,aACfkB,EAAOlB,EAAS,MAChBmB,EAAeD,EAAK,UAAUF,EAAOC,CAAG,IAAMH,GAAe,IAE7DM,EAAUF,EAAK,UAAU,EAAGF,CAAK,EAAIJ,EAASO,EAAeN,EAASK,EAAK,UAAUD,CAAG,EAC9FjB,EAAS,MAAQoB,EAEjB,IAAMC,EAAeL,EAAQJ,EAAO,OAASO,EAAa,OAC1DnB,EAAS,kBAAkBqB,EAAcA,CAAY,EACrDrB,EAAS,MAAM,EAEf,KAAK,SAASoB,CAAO,EACrB,KAAK,cAAc,CACrB,CAEQ,4BAA4BpB,EAA+BY,EAAgBC,EAAgBC,EAA2B,CAC5H,IAAME,EAAQhB,EAAS,eACjBiB,EAAMjB,EAAS,aACfkB,EAAOlB,EAAS,MAChBmB,EAAeD,EAAK,UAAUF,EAAOC,CAAG,IAAMH,GAAe,IAE7DM,EAAUF,EAAK,UAAU,EAAGF,CAAK,EAAIJ,EAASO,EAAeN,EAASK,EAAK,UAAUD,CAAG,EAC9FjB,EAAS,MAAQoB,EAEjB,IAAMC,EAAeL,EAAQJ,EAAO,OAASO,EAAa,OAK1D,GAJAnB,EAAS,kBAAkBqB,EAAcA,CAAY,EACrDrB,EAAS,MAAM,EAEf,KAAK,SAASoB,CAAO,EACjB,KAAK,cAAe,CACtB,IAAMZ,EAAU,KAAK,cAAc,cAAc,0CAA0C,EACvFA,GACF,KAAK,cAAcY,EAASZ,CAAsB,CAEtD,CACF,CAEQ,eAAsB,CAC5B,GAAI,CAAC,KAAK,UAAW,OACrB,IAAMc,EAAQ,KAAK,YAAY,OAAS,GACxC,GAAI,CAACA,EAAO,CACV,KAAK,UAAU,UAAY,yEAC3B,MACF,CACA,KAAK,cAAcA,EAAO,KAAK,SAAS,CAC1C,CAEA,MAAc,cAAcC,EAAkB1B,EAAuC,CACnF,GAAI,CAAC0B,GAAY,CAACA,EAAS,KAAK,EAAG,CACjC1B,EAAU,UAAY,yEACtB,MACF,CAEAA,EAAU,UAAY,oEAEtB,GAAI,CACF,IAAM2B,EAAS,KAAM,uCAEfC,EAAO,MADQD,EAAO,SAAWA,GACP,MAAMD,CAAQ,EAC9C1B,EAAU,UAAY4B,CACxB,MAAQ,CACN5B,EAAU,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAQxB,CACF,CAEQ,iCAAwC,CAC9C,WAAW,SAAY,CACrB,GAAI,CACF,KAAM,sCACR,MAAQ,CACN,IAAMA,EAAY,KAAK,YAAY,QAAQ,qBAAqB,GAAK,KAAK,eAAe,QAAQ,qBAAqB,EACtH,GAAI,CAACA,EAAW,OAEhB,IAAMiB,EAAcjB,EAAU,cAAc,yCAAyC,EACjFiB,IACFA,EAAY,WAAa,oFAE7B,CACF,EAAG,GAAG,CACR,CACF,ECvTO,SAASY,GACdC,EACAC,EACAC,EACAC,EACAC,EACa,CACb,OAAQJ,EAAM,KAAM,CAClB,IAAK,OACL,IAAK,QACH,OAAO,IAAIK,GAAUL,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACrE,IAAK,WACH,OAAO,IAAIE,GAAcN,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACzE,IAAK,SACH,OAAO,IAAIG,GAAYP,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACvE,IAAK,WACH,OAAO,IAAII,GAAcR,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACzE,IAAK,SACH,OAAO,IAAIK,GAAYT,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACvE,IAAK,WACH,OAAO,IAAIM,GAAcV,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACzE,IAAK,QACH,OAAO,IAAIO,GAAWX,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACtE,IAAK,SACH,OAAO,IAAIQ,GAAYZ,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACvE,IAAK,OACH,OAAO,IAAIS,GAAUb,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACrE,IAAK,OACH,OAAO,IAAIU,GAAUd,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACrE,IAAK,YACH,OAAO,IAAIW,GAAcf,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACzE,IAAK,MACH,OAAO,IAAIY,GAAShB,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACpE,IAAK,SACH,OAAO,IAAIa,GAAYjB,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACvE,IAAK,SACH,OAAO,IAAIc,GAAYlB,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACvE,IAAK,cACH,OAAO,IAAIe,GAAWnB,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACtE,IAAK,WACH,OAAO,IAAIgB,GAAcpB,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACzE,IAAK,mBACH,OAAO,IAAIiB,GAAqBrB,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EAChF,IAAK,oBACH,OAAO,IAAIkB,GAAqBtB,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EAChF,IAAK,MACH,OAAO,IAAImB,GAASvB,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACpE,IAAK,WACH,OAAO,IAAIoB,GAAcxB,EAAOC,EAAOC,EAAOC,EAAUC,CAAM,EAAE,OAAO,EACzE,QACE,IAAMqB,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,YAAc,+BAA+BzB,EAAM,IAAI,GACpDyB,CACX,CACF,CAKA,IAAIC,GAAiD,IAAI,IAKlD,SAASC,GACdC,EACAC,EACM,CACNH,GAAiB,IAAIE,EAAMC,CAAS,CACtC,CAKO,SAASC,GACdC,EACM,CACN,OAAW,CAACH,EAAMC,CAAS,IAAK,OAAO,QAAQE,CAAU,EACvDJ,GAAkBC,EAAMC,CAAS,CAErC,CAKO,SAASG,GAAmBJ,EAA2C,CAC5E,OAAOF,GAAiB,IAAIE,CAAI,CAClC,CC3GA,IAAMK,GAA4B,CAChC,OAAQ,CACN,CACE,KAAM,QACN,KAAM,QACN,MAAO,QACP,YAAa,mBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,mBAAoB,EACjD,CAAE,KAAM,QAAS,QAAS,4BAA6B,CACzD,CACF,EACA,CACE,KAAM,WACN,KAAM,WACN,MAAO,WACP,YAAa,sBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,sBAAuB,EACpD,CAAE,KAAM,YAAa,MAAO,EAAG,QAAS,wCAAyC,CACnF,CACF,EACA,CACE,KAAM,WACN,KAAM,aACN,MAAO,cACP,aAAc,EAChB,CACF,CACF,EAKMC,GAA+B,CACnC,OAAQ,CACN,CACE,KAAM,OACN,KAAM,OACN,MAAO,YACP,YAAa,uBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,kBAAmB,EAChD,CAAE,KAAM,YAAa,MAAO,EAAG,QAAS,oCAAqC,CAC/E,CACF,EACA,CACE,KAAM,QACN,KAAM,QACN,MAAO,QACP,YAAa,mBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,mBAAoB,EACjD,CAAE,KAAM,QAAS,QAAS,4BAA6B,CACzD,CACF,EACA,CACE,KAAM,WACN,KAAM,WACN,MAAO,WACP,YAAa,oBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,sBAAuB,EACpD,CAAE,KAAM,YAAa,MAAO,EAAG,QAAS,wCAAyC,CACnF,CACF,EACA,CACE,KAAM,WACN,KAAM,kBACN,MAAO,mBACP,YAAa,wBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,8BAA+B,EAC5D,CACE,KAAM,SACN,UAAYC,GAIH,OAAOA,GAAU,UAAYA,EAAM,QAAU,EAEtD,QAAS,wCACX,CACF,CACF,CACF,CACF,EAKMC,GAA0B,CAC9B,OAAQ,CACN,CACE,KAAM,MACN,KAAM,OACN,MAAO,oBACP,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,+BAAgC,CAC/D,CACF,CACF,CACF,EAKMC,GAA8B,CAClC,OAAQ,CACN,CACE,KAAM,OACN,KAAM,OACN,MAAO,OACP,YAAa,kBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,kBAAmB,CAClD,CACF,EACA,CACE,KAAM,QACN,KAAM,QACN,MAAO,QACP,YAAa,mBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,mBAAoB,EACjD,CAAE,KAAM,QAAS,QAAS,4BAA6B,CACzD,CACF,EACA,CACE,KAAM,OACN,KAAM,UACN,MAAO,UACP,YAAa,oBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,qBAAsB,CACrD,CACF,EACA,CACE,KAAM,WACN,KAAM,UACN,MAAO,UACP,YAAa,qBACb,KAAM,EACN,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,qBAAsB,EACnD,CAAE,KAAM,YAAa,MAAO,GAAI,QAAS,wCAAyC,CACpF,CACF,CACF,CACF,EAKMC,GAAoC,CACxC,OAAQ,CACN,CACE,KAAM,QACN,KAAM,QACN,MAAO,QACP,YAAa,2BACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,mBAAoB,EACjD,CAAE,KAAM,QAAS,QAAS,4BAA6B,CACzD,CACF,CACF,CACF,EAKMC,GAAqC,CACzC,OAAQ,CACN,CACE,KAAM,WACN,KAAM,kBACN,MAAO,mBACP,YAAa,8BACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,8BAA+B,CAC9D,CACF,EACA,CACE,KAAM,WACN,KAAM,cACN,MAAO,eACP,YAAa,0BACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,0BAA2B,EACxD,CAAE,KAAM,YAAa,MAAO,EAAG,QAAS,wCAAyC,CACnF,CACF,EACA,CACE,KAAM,WACN,KAAM,kBACN,MAAO,uBACP,YAAa,4BACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,kCAAmC,EAChE,CACE,KAAM,SACN,UAAYJ,GAIH,OAAOA,GAAU,UAAYA,EAAM,QAAU,EAEtD,QAAS,wCACX,CACF,CACF,CACF,CACF,EAKMK,GAA8B,CAClC,OAAQ,CACN,CACE,KAAM,OACN,KAAM,OACN,MAAO,YACP,YAAa,uBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,kBAAmB,CAClD,CACF,EACA,CACE,KAAM,QACN,KAAM,QACN,MAAO,QACP,YAAa,mBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,mBAAoB,EACjD,CAAE,KAAM,QAAS,QAAS,4BAA6B,CACzD,CACF,EACA,CACE,KAAM,OACN,KAAM,QACN,MAAO,QACP,YAAa,0BACb,KAAM,CACJ,KAAM,OACR,CACF,EACA,CACE,KAAM,WACN,KAAM,MACN,MAAO,MACP,YAAa,yBACb,KAAM,CACR,EACA,CACE,KAAM,OACN,KAAM,SACN,MAAO,kBACP,OAAQ,SACV,CACF,CACF,EAKMC,GAA+B,CACnC,OAAQ,CACN,CACE,KAAM,QACN,KAAM,iBACN,MAAO,kBACP,OAAQ,CACN,CACE,KAAM,OACN,KAAM,SACN,MAAO,iBACP,YAAa,uBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,4BAA6B,CAC5D,CACF,EACA,CACE,KAAM,MACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,OACN,MAAO,OACP,YAAa,OACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,kBAAmB,CAClD,CACF,EACA,CACE,KAAM,OACN,KAAM,QACN,MAAO,QACP,YAAa,QACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,mBAAoB,CACnD,CACF,CACF,CACF,EACA,CACE,KAAM,OACN,KAAM,UACN,MAAO,WACP,YAAa,WACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,sBAAuB,CACtD,CACF,CACF,CACF,EACA,CACE,KAAM,SACN,KAAM,gBACN,MAAO,iBACP,QAAS,CACP,CAAE,MAAO,cAAe,MAAO,aAAc,EAC7C,CAAE,MAAO,aAAc,MAAO,YAAa,EAC3C,CAAE,MAAO,SAAU,MAAO,QAAS,EACnC,CAAE,MAAO,gBAAiB,MAAO,eAAgB,CACnD,EACA,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,4BAA6B,CAC5D,CACF,EACA,CACE,KAAM,SACN,KAAM,WACN,MAAO,kBACP,QAAS,CACP,CAAE,MAAO,sBAAuB,MAAO,UAAW,EAClD,CAAE,MAAO,qBAAsB,MAAO,SAAU,EAChD,CAAE,MAAO,YAAa,MAAO,WAAY,CAC3C,EACA,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,6BAA8B,CAC7D,CACF,CACF,CACF,EAKMC,GAA+B,CACnC,OAAQ,CACN,CACE,KAAM,SACN,KAAM,SACN,MAAO,SACP,QAAS,CACP,CAAE,MAAO,WAAY,MAAO,CAAE,EAC9B,CAAE,MAAO,WAAY,MAAO,CAAE,EAC9B,CAAE,MAAO,WAAY,MAAO,CAAE,EAC9B,CAAE,MAAO,gBAAiB,MAAO,CAAE,EACnC,CAAE,MAAO,gBAAiB,MAAO,CAAE,CACrC,EACA,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,oBAAqB,CACpD,CACF,EACA,CACE,KAAM,WACN,KAAM,UACN,MAAO,UACP,YAAa,sBACb,KAAM,EACN,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,qBAAsB,CACrD,CACF,EACA,CACE,KAAM,QACN,KAAM,QACN,MAAO,mBACP,YAAa,yCACf,CACF,CACF,EAKMC,GAAmC,CACvC,OAAQ,CACN,CACE,KAAM,QACN,KAAM,QACN,MAAO,QACP,YAAa,mBACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,mBAAoB,EACjD,CAAE,KAAM,QAAS,QAAS,4BAA6B,CACzD,CACF,EACA,CACE,KAAM,WACN,KAAM,mBACN,MAAO,oBACP,aAAc,EAChB,EACA,CACE,KAAM,WACN,KAAM,iBACN,MAAO,kBACP,aAAc,EAChB,EACA,CACE,KAAM,WACN,KAAM,aACN,MAAO,gCACP,aAAc,EAChB,CACF,CACF,EAKMC,GAA8B,CAClC,OAAQ,CACN,CACE,KAAM,OACN,KAAM,OACN,MAAO,OACP,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,kBAAmB,CAClD,CACF,EACA,CACE,KAAM,OACN,KAAM,OACN,MAAO,OACP,YAAa,QACb,KAAM,CACJ,KAAM,MACR,EACA,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,kBAAmB,CAClD,CACF,EACA,CACE,KAAM,SACN,KAAM,SACN,MAAO,mBACP,YAAa,yBACb,IAAK,EACL,IAAK,GACL,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,8BAA+B,EAC5D,CAAE,KAAM,MAAO,MAAO,EAAG,QAAS,8BAA+B,CACnE,CACF,EACA,CACE,KAAM,WACN,KAAM,kBACN,MAAO,mBACP,YAAa,gDACb,KAAM,CACR,CACF,CACF,EAKMC,GAA6B,CACjC,OAAQ,CACN,CACE,KAAM,SACN,KAAM,SACN,MAAO,SACP,QAAS,CACP,CAAE,MAAO,SAAU,MAAO,CAAE,EAC5B,CAAE,MAAO,UAAW,MAAO,CAAE,EAC7B,CAAE,MAAO,UAAW,MAAO,CAAE,EAC7B,CAAE,MAAO,UAAW,MAAO,CAAE,EAC7B,CAAE,MAAO,UAAW,MAAO,CAAE,CAC/B,EACA,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,oBAAqB,CACpD,CACF,EACA,CACE,KAAM,OACN,KAAM,QACN,MAAO,eACP,YAAa,2BACb,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,0BAA2B,EACxD,CAAE,KAAM,YAAa,MAAO,EAAG,QAAS,qCAAsC,CAChF,CACF,EACA,CACE,KAAM,WACN,KAAM,UACN,MAAO,cACP,YAAa,wBACb,KAAM,EACN,YAAa,CACX,CAAE,KAAM,WAAY,QAAS,4BAA6B,EAC1D,CAAE,KAAM,YAAa,MAAO,GAAI,QAAS,uCAAwC,CACnF,CACF,CACF,CACF,EAKaC,GAA8C,CACzD,MAAOb,GACP,SAAUC,GACV,IAAKE,GACL,QAASC,GACT,iBAAkBC,GAClB,kBAAmBC,GACnB,QAASC,GACT,SAAUC,GACV,SAAUC,GACV,aAAcC,GACd,QAASC,GACT,OAAQC,EACV,EAOO,SAASE,GAAYC,EAAyC,CACnE,OAAIA,KAAgBF,GACXA,GAAUE,CAA4B,EAExC,IACT,CAgBO,SAASC,GACdC,EACAC,EACY,CACZ,IAAMC,EAAeC,GAAYH,CAAY,EAC7C,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,aAAaF,CAAY,aAAa,EAGxD,IAAMI,EAAiBF,EAAa,QAAU,CAAC,EACzCG,EAAgBH,EAAa,MAGnC,GAAIG,GAAiBA,EAAc,OAAS,EAAG,CAC7C,IAAMC,EAAWD,EAAcA,EAAc,OAAS,CAAC,EACvD,MAAO,CACL,GAAGH,EACH,MAAO,CACL,GAAGG,EAAc,MAAM,EAAG,EAAE,EAC5B,CACE,GAAGC,EACH,OAAQ,CAAC,GAAGA,EAAS,OAAQ,GAAGL,CAAgB,CAClD,CACF,CACF,CACF,CAGA,MAAO,CACL,GAAGC,EACH,OAAQ,CAAC,GAAGE,EAAgB,GAAGH,CAAgB,CACjD,CACF,CC5jBA,IAAMM,GAAqB,OAAO,YAAgB,IAAc,YAAc,KAAM,CAAC,EAKxEC,GAAN,cAAuBD,EAAmB,CA2C/C,aAAc,CACZ,GAAI,OAAO,YAAgB,IACzB,MAAM,IAAI,MAAM,oDAAoD,EAEtE,MAAM,EA5CR,KAAQ,iBAAsC,CAAC,EAC/C,KAAQ,YAAuB,GAC/B,KAAQ,aAAoC,KAC5C,KAAQ,sBAA+D,KAKvE,KAAQ,cAAwE,KAChF,KAAQ,+BAAiC,GACzC,KAAQ,kBAA8C,KACtD,KAAQ,yBAAiE,KACzE,KAAQ,qBAAmD,KAC3D,KAAQ,kBAAoB,GAC5B,KAAQ,qBAA8D,KACtE,KAAQ,cAAwB,EAChC,KAAQ,aAAwB,GAChC,KAAQ,aAAwB,GA09ChC,KAAQ,wBAAgE,KA97CtE,KAAK,aAAe,IAAIE,GACxB,KAAK,OAAS,KAAK,aAAa,CAAE,KAAM,MAAO,CAAC,CAElD,CA7BA,WAAW,oBAAqB,CAC9B,MAAO,CACL,SACA,WACA,kBACA,QACA,SACA,cACA,UACA,WACA,eACA,yBACA,uBACA,gBACA,iBACA,2BACA,iBACA,eACF,CACF,CAeA,IAAI,QAA4B,CAC9B,IAAMC,EAAa,KAAK,aAAa,QAAQ,EAC7C,OAAKA,EAGD,KAAK,aAAa,UAAU,GAC9B,QAAQ,KAAK,2FAA2F,EACjGC,EAAoBD,CAAU,GAGhCC,EAAoBD,CAAU,EARb,IAS1B,CAKA,IAAI,OAAOE,EAA0B,CAE/BA,GAAS,KAAK,aAAa,UAAU,IACvC,QAAQ,KAAK,8DAA8D,EAC3E,KAAK,gBAAgB,UAAU,EAC/B,KAAK,gBAAgB,iBAAiB,GAGxC,QAAQ,IAAI,kCAAmCA,GAAO,QAAQ,IAAIC,IAAM,CAAE,KAAMA,EAAE,KAAM,KAAMA,EAAE,KAAM,KAAM,CAAC,CAACA,EAAE,YAAa,EAAE,CAAC,EAE5HD,GACF,KAAK,aAAa,SAAUE,EAAeF,CAAK,CAAC,EAEjD,KAAK,mBAAmB,GAExB,KAAK,gBAAgB,QAAQ,CAEjC,CAKA,IAAI,UAAgC,CAClC,IAAMG,EAAe,KAAK,aAAa,UAAU,EACjD,OAAKA,GAGD,KAAK,aAAa,QAAQ,GAC5B,QAAQ,KAAK,yFAAyF,EAC/FA,GALiB,IAS5B,CAKA,IAAI,SAASH,EAA4B,CAEnCA,GAAS,KAAK,aAAa,QAAQ,IACrC,QAAQ,KAAK,8DAA8D,EAC3E,KAAK,gBAAgB,QAAQ,GAG3BA,EACF,KAAK,aAAa,WAAYA,CAAK,GAEnC,KAAK,gBAAgB,UAAU,EAC/B,KAAK,gBAAgB,iBAAiB,EAE1C,CAKA,IAAI,gBAAiC,CACnC,IAAMI,EAAa,KAAK,aAAa,iBAAiB,EACtD,OAAKA,EACEL,EAAoBK,CAAU,EADb,IAE1B,CAKA,IAAI,eAAeJ,EAAuB,CACpCA,EACF,KAAK,aAAa,kBAAmBE,EAAeF,CAAK,CAAC,EAE1D,KAAK,gBAAgB,iBAAiB,CAE1C,CAKA,IAAI,aAA6B,CAC/B,IAAMK,EAAO,KAAK,aAAa,cAAc,EAC7C,GAAI,CAACA,EAAM,OAAO,KAClB,IAAMC,EAAI,SAASD,EAAM,EAAE,EAC3B,OAAO,MAAMC,CAAC,EAAI,KAAOA,CAC3B,CAEA,IAAI,YAAYN,EAAsB,CAChCA,GAAS,MAAQA,GAAS,EAC5B,KAAK,aAAa,eAAgB,OAAOA,CAAK,CAAC,EAE/C,KAAK,gBAAgB,cAAc,CAEvC,CAKA,IAAI,sBAAsC,CACxC,IAAMK,EAAO,KAAK,aAAa,wBAAwB,EACvD,GAAI,CAACA,EAAM,OAAO,KAClB,IAAMC,EAAI,SAASD,EAAM,EAAE,EAC3B,OAAO,MAAMC,CAAC,EAAI,KAAOA,CAC3B,CAEA,IAAI,qBAAqBN,EAAsB,CACzCA,GAAS,MAAQA,GAAS,EAC5B,KAAK,aAAa,yBAA0B,OAAOA,CAAK,CAAC,EAEzD,KAAK,gBAAgB,wBAAwB,CAEjD,CAKA,IAAI,oBAAoC,CACtC,OAAO,KAAK,aAAa,sBAAsB,CACjD,CAEA,IAAI,mBAAmBA,EAAsB,CACvCA,EACF,KAAK,aAAa,uBAAwBA,CAAK,EAE/C,KAAK,gBAAgB,sBAAsB,CAE/C,CAKA,IAAI,cAA0C,CAC5C,IAAMK,EAAO,KAAK,aAAa,eAAe,EAC9C,GAAIA,EACF,GAAI,CACF,OAAON,EAAoBM,CAAI,CACjC,MAAQ,CACN,OAAO,IACT,CAEF,OAAO,IACT,CAEA,IAAI,aAAaL,EAAkC,CAC7CA,GAAS,OAAOA,GAAU,SAC5B,KAAK,aAAa,gBAAiBE,EAAeF,CAAK,CAAC,EAExD,KAAK,gBAAgB,eAAe,CAExC,CAKQ,sBAAsBO,EAAyD,CACrF,IAAMC,EAAW,KAAK,aAEhBC,EAAS,CAAE,GADEF,GAAQ,aACK,GAAGC,CAAS,EAC5C,MAAO,CACL,QAASC,EAAO,SAAW,GAC3B,KAAMA,EAAO,MAAQ,SACrB,MAAOA,EAAO,OAAS,OACvB,MAAOA,EAAO,OAAS,MACzB,CACF,CAKA,mBAAoB,CAClB,KAAK,kBAAkB,EAEvB,KAAK,YAAY,GAGb,KAAK,aAAa,QAAQ,GAAK,KAAK,SACtC,KAAK,OAAO,CAEhB,CAKA,yBAAyBC,EAAcC,EAAkBC,EAAkB,CA0BzE,GAxBIF,IAAS,UAAYE,IAAaD,IAChC,KAAK,aAAa,UAAU,IAC9B,QAAQ,KAAK,iFAAiF,EAC9F,KAAK,gBAAgB,UAAU,EAC/B,KAAK,gBAAgB,iBAAiB,GAExC,KAAK,mBAAmB,GAEtBD,IAAS,YAAcE,IAAaD,IAClC,KAAK,aAAa,QAAQ,IAC5B,QAAQ,KAAK,+EAA+E,EAC5F,KAAK,gBAAgB,QAAQ,GAE/B,KAAK,mBAAmB,GAEtBD,IAAS,mBAAqBE,IAAaD,GAC7C,KAAK,mBAAmB,EAEtBD,IAAS,eAAiBE,IAAaD,GACzC,KAAK,mBAAmB,GAErBD,IAAS,SAAWA,IAAS,WAAaE,IAAaD,GAC1D,KAAK,YAAY,EAEfD,IAAS,WAAaE,IAAaD,EAAU,CAE/C,IAAME,EAAO,KAAK,OAAO,cAAc,MAAM,EAC7C,KAAK,qBAAqBA,GAAQ,MAAS,EAEvCA,GACaA,EAAK,iBAAiB,iCAAiC,EAC/D,QAASC,GAAU,CACpBA,aAAiB,aAAe,aAAcA,IAC/CA,EAAc,SAAW,KAAK,QAEnC,CAAC,CAEL,CACIJ,IAAS,YAAcE,IAAaD,GACtC,KAAK,OAAO,GAETD,IAAS,kBAAoBA,IAAS,kBAAoBA,IAAS,6BAA+BE,IAAaD,GAClH,KAAK,OAAO,GAGXD,IAAS,gBACRA,IAAS,0BACTA,IAAS,yBACXE,IAAaD,IAEb,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GAErBD,IAAS,iBAAmBE,IAAaD,GAC3C,KAAK,OAAO,EAEVD,IAAS,iBAAmBE,IAAaD,IAC3C,KAAK,WAAW,EACZ,KAAK,eACP,KAAK,cAAgB,KAAK,aAC1B,KAAK,OAAO,GAGlB,CAKQ,mBAA0B,CAChC,IAAMI,EAAc,KAAK,YACzB,GAAIA,GAAe,MAAQA,EAAc,EAAG,CAC1C,KAAK,aAAe,KACpB,MACF,CACA,KAAK,aAAe,IAAIC,EAAa,CACnC,YAAAD,EACA,qBAAsB,KAAK,sBAAwB,EACnD,WAAY,KAAK,oBAAsB,OACvC,SAAU,IAAM,CACd,KAAK,kBAAkB,CACzB,EACA,WAAY,IAAM,CAChB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,OAAO,CACd,CACF,CAAC,CACH,CAKQ,oBAAqB,CAC3B,IAAIR,EAA4B,KAG1BU,EAAe,KAAK,SAO1B,GANIA,EACFV,EAAS,KAAK,sBAAsBU,CAAY,EAEhDV,EAAS,KAAK,OAGZA,EAAQ,CACV,IAAMW,EAAc,KAAK,YACzB,KAAK,aAAa,iBAAiBX,EAAQW,GAAe,MAAS,EACnE,KAAK,gBAAgBX,CAAM,EAC3B,KAAK,OAAO,CACd,CACF,CAKQ,sBAAsBU,EAA+C,CAC3E,IAAME,EAAeC,GAAYH,CAAY,EAC7C,GAAI,CAACE,EACH,eAAQ,MAAM,uBAAuBF,CAAY,aAAa,EACvD,KAIT,IAAMI,EAAmB,KAAK,eAC9B,OAAIA,GAAoBA,EAAiB,OAAS,EACzCC,GAAeL,EAAcI,CAAgB,EAG/CF,CACT,CAKA,MAAc,QAAS,CAErB,GAAI,MAAK,YAIT,MAAK,YAAc,GAEnB,GAAI,CAEF,IAAIZ,EAA4B,KAC1BU,EAAe,KAAK,SAO1B,GANIA,EACFV,EAAS,KAAK,sBAAsBU,CAAY,EAEhDV,EAAS,KAAK,OAGZ,CAACA,EAAQ,CAEX,IAAMM,EAAO,KAAK,OAAO,cAAc,MAAM,EACzCA,GAAQA,EAAK,aAAe,KAAK,QACnCA,EAAK,OAAO,EAEd,MACF,CAGA,IAAMU,EAAiB,KAAK,+BACtBC,EAAkBD,EAAiB,CAAC,EAAI,KAAK,sBAAsB,EACzE,KAAK,+BAAiC,GAGtC,IAAME,EAAsB,KAAK,aAAa,eAAe,EAI7D,GAAID,GAAmB,OAAO,KAAKA,CAAe,EAAE,OAAS,EAC3D,OAAW,CAACE,EAAK1B,CAAK,IAAK,OAAO,QAAQwB,CAAe,EACvD,KAAK,aAAa,0BAA0BE,EAAK1B,CAAK,EAI1D,IAAMkB,EAAc,KAAK,YAGnBS,EAAYF,IAAwB,KACpCG,EAAWrB,EAAO,OAASA,EAAO,MAAM,OAAS,EAUvD,GAL2B,CAACgB,IAC1B,CAACE,GAAuB,CAACE,GAAa,CAACC,GACtCH,GAAuBlB,EAAO,OAASkB,EAAoB,aAAelB,EAAO,MAAM,UAIxF,KAAK,aAAa,iBAAiBA,EAAQW,GAAe,MAAS,EAG/DS,GAAaC,GAAYH,GAAqB,CAChD,IAAMI,EAAc,KAAK,aAAa,eAAe,EACrD,GAAIA,GAAeJ,EAAoB,aAAeI,EAAY,WAAY,CAExEJ,EAAoB,aAAe,GAAKA,EAAoB,YAAcI,EAAY,YACxF,KAAK,aAAa,SAASJ,EAAoB,WAAW,EAG5D,QAAWK,KAAiBL,EAAoB,eAC1CK,GAAiB,GAAKA,EAAgBD,EAAY,YACpD,KAAK,aAAa,aAAaC,CAAa,CAGlD,CACF,CAMF,IAAMC,EAAmB,KAAK,aAAa,eAAe,EAGpDC,EAAiB,SAAS,cAAc,MAAM,EACpDA,EAAe,iBAAiB,SAAWC,GAAM,KAAK,aAAaA,CAAC,CAAC,GAGjE,KAAK,UAAY,KAAK,UACxBD,EAAe,UAAU,IAAI,oBAAoB,EAInD,IAAME,EAAgB,KAAK,aAAa,gBAAgB,EAClDC,EAAY5B,EAAO,YAAc2B,IAAkB,YAAcA,IAAkB,aAAeA,EAAgB,YACxHF,EAAe,UAAU,IAAI,uBAAuBG,CAAS,EAAE,EAG/D,IAAMC,EAAoB,KAAK,aAAa,0BAA0B,EAChEC,EAAqB9B,EAAO,qBAAuB6B,IAAsB,MAAQA,IAAsB,SACvGE,EAAoB,OAAOD,GAAuB,UAAYA,GAAoB,SAAWA,EAAmB,SAAW,MAGjI,GAAIN,EACF,KAAK,aAAaC,EAAgBzB,CAAM,MAEnC,CACL,KAAK,aAAayB,EAAgBzB,EAAO,QAAU,CAAC,CAAC,EAGrD,IAAMgC,EAAe,KAAK,sBAAsBhC,CAAM,EACtD,GAAIgC,EAAa,QAAS,CACxB,IAAMC,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,UAAY,2BAC1BA,EAAc,MAAM,UAAYD,EAAa,MAE7C,IAAME,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,KAAO,SACpBA,EAAa,YAAcF,EAAa,KACxCE,EAAa,UAAY,mBACzBA,EAAa,MAAM,MAAQF,EAAa,OACpC,KAAK,UAAY,KAAK,WACxBE,EAAa,SAAW,IAE1BD,EAAc,YAAYC,CAAY,EACtCT,EAAe,YAAYQ,CAAa,CAC1C,CACF,CAGA,IAAIE,EAAkC,KACtC,GAAIL,EAAoB,CACtB,GAAM,CAAE,UAAAM,EAAW,MAAAC,CAAM,EAAI,KAAK,6BAA6BrC,CAAM,EAC/DsC,EAAc,SAAS,cAAc,KAAK,EAChDA,EAAY,UAAY,gCACxBA,EAAY,aAAa,OAAQ,aAAa,EAC9CA,EAAY,aAAa,gBAAiB,OAAOF,CAAS,CAAC,EAC3DE,EAAY,aAAa,gBAAiB,GAAG,EAC7CA,EAAY,aAAa,gBAAiB,OAAOD,CAAK,CAAC,EACvDC,EAAY,aAAa,aAAc,oCAAoCF,CAAS,OAAOC,CAAK,EAAE,EAClG,IAAME,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,4BAClB,IAAMC,GAAO,SAAS,cAAc,KAAK,EACzCA,GAAK,UAAY,2BACjBA,GAAK,MAAM,MAAQH,EAAQ,EAAI,GAAID,EAAYC,EAAS,GAAG,IAAM,KACjEE,EAAM,YAAYC,EAAI,EACtBF,EAAY,YAAYC,CAAK,EAC7BJ,EAAc,SAAS,cAAc,KAAK,EAC1CA,EAAY,UAAY,oBACpBJ,IAAsB,OACxBI,EAAY,YAAYG,CAAW,EACnCH,EAAY,YAAYV,CAAc,IAEtCU,EAAY,YAAYV,CAAc,EACtCU,EAAY,YAAYG,CAAW,EAEvC,CAGA,IAAMG,EAAU,KAAK,OAAO,cAAc,MAAM,EAChD,GAAIA,GAAWA,EAAQ,aAAe,KAAK,QAAUA,IAAYhB,EAC/D,GAAI,CACFgB,EAAQ,OAAO,CACjB,OAASf,EAAG,CAEV,QAAQ,KAAK,yCAA0CA,CAAC,CAC1D,CAEF,IAAMgB,EAAa,KAAK,OAAO,cAAc,oBAAoB,EAC7DA,GAAYA,EAAW,OAAO,EAGlC,KAAK,OAAO,YAAYP,GAAeV,CAAc,EAGjD,KAAK,cAAgB,CAAC,KAAK,eAC7B,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,GAI3B,KAAK,SACP,KAAK,qBAAqBA,CAAc,EAG1C,KAAK,kBAAkBA,CAAc,CACvC,QAAE,CACA,KAAK,YAAc,GAEf,KAAK,sBACP,KAAK,0BAA0B,CAEnC,EACF,CAKQ,kBAAkBkB,EAAiC,CACzD,IAAMC,EAAkB,KAAK,OAAO,cAAc,yBAAyB,EAM3E,GALIA,GACFA,EAAgB,OAAO,EAEzB,KAAK,kBAAkB,EAEnB,CAAC,KAAK,cAAc,SAAS,EAAG,OAEpC,IAAMtC,EAAOqC,GAAe,KAAK,OAAO,cAAc,MAAM,EAC5D,GAAI,CAACrC,EAAM,OAEX,IAAMuC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,yBAEpB,IAAMC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,yBACpBA,EAAQ,aAAa,OAAQ,OAAO,EAEpC,IAAMC,EAAkB,IAAY,CAClC,IAAMC,EAAc,KAAK,aAAc,wBAAwB,EAC/D,GAAIA,GAAe,EAAG,CACpB,KAAK,kBAAkB,EACvB,MACF,CACA,IAAMC,EAAU,KAAK,MAAMD,EAAc,GAAK,EACxCE,EAAU,KAAK,MAAOF,EAAc,IAAS,GAAI,EACjDG,EACJF,EAAU,EACN,GAAGA,CAAO,QAAQC,CAAO,KACzB,GAAGA,CAAO,YAChBJ,EAAQ,YAAc,4CAA4CK,CAAO,GAC3E,EAEAJ,EAAgB,EAChBF,EAAQ,YAAYC,CAAO,EAC3BxC,EAAK,YAAYuC,CAAO,EAExB,KAAK,sBAAwB,YAAYE,EAAiB,GAAI,CAChE,CAEQ,mBAA0B,CAC5B,KAAK,wBACP,cAAc,KAAK,qBAAqB,EACxC,KAAK,sBAAwB,KAEjC,CAKQ,qBAAqBJ,EAA2B,CAEtD,IAAMC,EAAkB,KAAK,OAAO,cAAc,4BAA4B,EAM9E,GALIA,GACFA,EAAgB,OAAO,EAIrB,KAAK,QAAS,CAChB,IAAMtC,EAAOqC,GAAe,KAAK,OAAO,cAAc,MAAM,EAC5D,GAAIrC,EAAM,CACR,IAAMuC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,4BAEpB,IAAMO,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,4BACpBP,EAAQ,YAAYO,CAAO,EAG3B9C,EAAK,YAAYuC,CAAO,CAC1B,CACF,CACF,CAMQ,uBAA6C,CAInD,IAAIQ,EAAmC,KACjC3C,EAAe,KAAK,SAO1B,GANIA,EACF2C,EAAgB,KAAK,sBAAsB3C,CAAY,EAEvD2C,EAAgB,KAAK,OAGnB,CAACA,EACH,MAAO,CAAC,EAGV,IAAM/C,EAAO,KAAK,OAAO,cAAc,MAAM,EACvCW,EAAuC,CAAC,EAE9C,GAAI,CAACX,EAAM,OAAOW,EAGlB,IAAMqC,EAAShD,EAAK,iBAAiB,yBAAyB,EAE9D,QAAWC,KAAS+C,EAAQ,CAC1B,IAAMnD,EAAOI,EAAM,aAAa,MAAM,EAKtC,GAJI,CAACJ,GAID,EADoB,KAAK,kBAAkBkD,EAAelD,CAAI,IAAM,MAClD,SAEtB,IAAIV,EAEJ,GAAIc,aAAiB,iBACnB,GAAIA,EAAM,OAAS,WACjBd,EAAQc,EAAM,gBACLA,EAAM,OAAS,QACxB,GAAIA,EAAM,QACRd,EAAQc,EAAM,UAEd,eAEOA,EAAM,OAAS,SACxBd,EAAQc,EAAM,QAAU,GAAK,KAAO,OAAOA,EAAM,KAAK,EAEtDd,EAAQc,EAAM,WAEPA,aAAiB,oBAC1Bd,EAAQc,EAAM,MACLA,aAAiB,oBACtBA,EAAM,SACRd,EAAQ,MAAM,KAAKc,EAAM,eAAe,EAAE,IAAIgD,GAAOA,EAAI,KAAK,EAE9D9D,EAAQc,EAAM,OAAS,MAKvBd,IAAU,SACZwB,EAAgBd,CAAI,EAAIV,IAAU,GAAK,KAAOA,EAElD,CAEA,OAAOwB,CACT,CAMQ,yBAAgC,CACtC,GAAI,KAAK,gBAAkB,KAAM,OAEjC,IAAMuC,EAA0B,CAAC,EACjC,QAAWC,KAAS,MAAM,KAAK,KAAK,QAAQ,EACtCA,aAAiB,aACnBD,EAAS,KAAKC,CAAK,EAIvB,GAAID,EAAS,SAAW,EAAG,CACzB,KAAK,cAAgB,CAAC,EACtB,MACF,CAEA,KAAK,cAAgBA,EAAS,IAAKE,GAAO,CACxC,IAAMC,EAAMD,EAAG,aAAa,KAAK,EAAIA,EAAG,aAAa,KAAK,EAAI,KACxDE,EAASD,GAAO,MAAQA,IAAQ,GAAK,OAAOA,CAAG,EAAI,IACnDE,EAAM,OAAO,SAASD,CAAM,EAAIA,EAAS,KAC/C,MAAO,CACL,SAAUF,EAAG,UAAU,EAAI,EAC3B,IAAAG,CACF,CACF,CAAC,CACH,CAMQ,mBAAmBC,EAA+C,CACxE,KAAK,wBAAwB,EAE7B,IAAMC,EAAS,IAAI,IAEnB,GAAI,CAAC,KAAK,eAAiB,KAAK,cAAc,SAAW,EACvD,OAAOA,EAGT,OAAW,CAAE,SAAAC,EAAU,IAAAH,CAAI,IAAK,KAAK,cAAe,CAClD,IAAII,EAAuB,OAAOJ,GAAQ,SAAWA,EAAM,GAEtD,OAAO,SAASI,CAAY,IAC/BA,EAAe,KAIbA,EAAe,GAAKA,GAAgBH,KACtCG,EAAe,IAGjB,IAAMC,EAAQF,EAAS,UAAU,EAAI,EAC/BG,EAAWJ,EAAO,IAAIE,CAAY,GAAK,CAAC,EAC9CE,EAAS,KAAKD,CAAK,EACnBH,EAAO,IAAIE,EAAcE,CAAQ,CACnC,CAEA,OAAOJ,CACT,CAMQ,uBAAuBK,EAAgC,CAC7D,GAAI,CAAC,KAAK,UAAY,CAAC,KAAK,QAAS,OACrCA,EAAY,UAAU,IAAI,yBAAyB,EAC9BA,EAAY,iBAC/B,iCACF,EACa,QAASV,GAAO,CACvB,aAAcA,IAAIA,EAAG,SAAW,GACtC,CAAC,CACH,CAKQ,aAAaW,EAAwBC,EAAiB,CAE5D,GAAIA,EAAO,SAAW,EAAG,CAEvB,IAAMC,EADa,KAAK,mBAAmB,CAAC,EAChB,IAAI,EAAE,EAClC,GAAIA,GAAYA,EAAS,OAAS,EAChC,QAAWH,KAAeG,EACxB,KAAK,uBAAuBH,CAAW,EACvCC,EAAU,YAAYD,CAAW,EAGrC,MACF,CAEA,IAAMN,EAAYQ,EAAO,OACnBE,EAAkB,KAAK,mBAAmBV,CAAS,EAEzD,QAASW,EAAW,EAAGA,EAAWH,EAAO,OAAQG,IAAY,CAE3D,IAAMC,EAAcF,EAAgB,IAAIC,CAAQ,EAChD,GAAIC,GAAeA,EAAY,OAAS,EAAG,CACzC,QAAWN,KAAeM,EACxB,KAAK,uBAAuBN,CAAW,EACvCC,EAAU,YAAYD,CAAW,EAEnCI,EAAgB,OAAOC,CAAQ,CACjC,CAEA,IAAME,EAAQL,EAAOG,CAAQ,EACvBG,EAAe,KAAK,YAAYD,CAAK,EACvCC,GACFP,EAAU,YAAYO,CAAY,CAEtC,CAGA,IAAML,EAAWC,EAAgB,IAAI,EAAE,EACvC,GAAID,GAAYA,EAAS,OAAS,EAChC,QAAWH,KAAeG,EACxB,KAAK,uBAAuBH,CAAW,EACvCC,EAAU,YAAYD,CAAW,CAGvC,CAKQ,YAAYO,EAAkC,CAEpD,IAAME,EAAY,KAAK,aAAa,mBAAmBF,EAAM,IAAI,EAC3DG,EAAY,KAAK,aAAa,gBAAgBH,EAAM,IAAI,EAM9D,GAHA,QAAQ,IAAI,oBAAoBA,EAAM,IAAI,KAAKA,EAAM,IAAI,eAAeE,CAAS,cAAcC,CAAS,cAAc,CAAC,CAACH,EAAM,YAAY,EAAE,EAGxIA,EAAM,OAAS,QAAS,CAC1B,IAAMI,EAAe,KAAK,YAAYJ,CAAK,EAC3C,OAAKE,IACHE,EAAa,MAAM,QAAU,OAC7BA,EAAa,UAAU,IAAI,wBAAwB,GAEhDD,GACHC,EAAa,UAAU,IAAI,0BAA0B,EAEhDA,CACT,CACA,GAAIJ,EAAM,OAAS,MAAO,CACxB,IAAMK,EAAa,KAAK,UAAUL,CAAK,EACvC,OAAKE,IACHG,EAAW,MAAM,QAAU,OAC3BA,EAAW,UAAU,IAAI,wBAAwB,GAE9CF,GACHE,EAAW,UAAU,IAAI,0BAA0B,EAE9CA,CACT,CACA,GAAIL,EAAM,OAAS,QAAS,CAC1B,IAAMM,EAAe,KAAK,YAAYN,CAAK,EAC3C,OAAKE,IACHI,EAAa,MAAM,QAAU,OAC7BA,EAAa,UAAU,IAAI,wBAAwB,GAEhDH,GACHG,EAAa,UAAU,IAAI,0BAA0B,EAEhDA,CACT,CACA,GAAIN,EAAM,OAAS,SAAU,CAC3B,IAAMO,EAAgB,KAAK,aAAaP,CAAK,EAC7C,OAAIO,IACGL,IACHK,EAAc,MAAM,QAAU,OAC9BA,EAAc,UAAU,IAAI,wBAAwB,GAEjDJ,GACHI,EAAc,UAAU,IAAI,0BAA0B,GAGnDA,CACT,CAGA,IAAMzF,EAAQ,KAAK,aAAa,SAASkF,EAAM,IAAI,EAC7CQ,EAAS,KAAK,aAAa,UAAUR,EAAM,IAAI,EAC/CS,EAAQD,EAAO,OAAS,EAAIA,EAAO,CAAC,EAAI,OAGxCE,EAAiB,KAAK,UAAY,KAAK,QACvCC,EAAoB,KAAK,aAAa,gBAAgB,EAOtDC,EAAsB,CAAC,KAAM,OAAQ,OAAQ,QAAS,MAAM,EAC5DC,EACJb,EAAM,gBACLW,GAAqBC,EAAoB,SAASD,CAAiB,EAChEA,EACA,MACAG,EAAwB,CAC5B,GAAGd,EACH,SAAUU,GAAkB,CAACP,GAAaH,EAAM,SAChD,cAAea,CACjB,EAEME,EAAkBC,GAAmBhB,EAAM,IAAI,EACrD,GAAIe,EAAiB,CACnB,IAAME,EAAUF,EAAgB,CAC9B,MAAOD,EACP,MAAAhG,EACA,MAAA2F,EACA,SAAWS,GAAQ,KAAK,kBAAkBlB,EAAM,KAAMkB,CAAG,EACzD,OAAQ,IAAM,KAAK,gBAAgBlB,EAAM,IAAI,CAC/C,CAAC,EACD,OAAIiB,GAAW,CAACf,IACde,EAAQ,MAAM,QAAU,OACxBA,EAAQ,UAAU,IAAI,wBAAwB,GAEzCA,CACT,CAEA,IAAME,EAAeC,GACnBN,EACAhG,EACA2F,EACCS,GAAQ,KAAK,kBAAkBlB,EAAM,KAAMkB,CAAG,EAC/C,IAAM,KAAK,gBAAgBlB,EAAM,IAAI,CACvC,EAGMqB,EAAiBF,EAAa,cAAc,kBAAkB,GAAKA,EACzE,OAAIE,aAA0B,aAC5BA,EAAe,aAAa,kBAAmBrB,EAAM,IAAI,EAItDE,IACHiB,EAAa,MAAM,QAAU,OAC7BA,EAAa,UAAU,IAAI,wBAAwB,GAG9CA,CACT,CAKQ,YAAYnB,EAA2B,CAC7C,IAAMsB,EAAatB,EAKbuB,EAAMD,EAAW,WAAa,WAC9BE,EAAcF,EAAW,cAAgB,GACzCG,EAAcH,EAAW,cAAgB,GAEzCI,EAAiB,SAAS,cAAc,KAAK,EAMnD,GALAA,EAAe,UAAY,uCAAuCH,CAAG,GACjEvB,EAAM,MACR0B,EAAe,aAAa,kBAAmB1B,EAAM,IAAI,EAGvDwB,EAAa,CACfE,EAAe,UAAU,IAAI,6BAA6B,EACrDD,GACHC,EAAe,UAAU,IAAI,2BAA2B,EAG1D,IAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,KAAO,SACdA,EAAO,UAAY,yBACnBA,EAAO,aAAa,gBAAiB,OAAOF,CAAW,CAAC,EACxD,IAAMG,EAAiB,oBAAoB5B,EAAM,MAAQ,SAAS,QAAQ,cAAe,GAAG,CAAC,WAC7F2B,EAAO,aAAa,gBAAiBC,CAAc,EAEnD,IAAMC,EAAY,SAAS,cAAc,MAAM,EAC/CA,EAAU,YAAc7B,EAAM,OAAS,QAEvC,IAAM8B,EAAU,SAAS,cAAc,MAAM,EAC7CA,EAAQ,UAAY,0BACpBA,EAAQ,aAAa,cAAe,MAAM,EAC1CA,EAAQ,YAAc,SAEtBH,EAAO,YAAYE,CAAS,EAC5BF,EAAO,YAAYG,CAAO,EAC1BJ,EAAe,YAAYC,CAAM,EAEjC,IAAMI,EAAU,SAAS,cAAc,KAAK,EAI5C,GAHAA,EAAQ,GAAKH,EACbG,EAAQ,UAAY,0BAEhB,WAAY/B,GAASA,EAAM,OAC7B,QAAWgC,KAAYhC,EAAM,OAAQ,CACnC,IAAMiC,EAAWD,EAAS,KAAK,WAAWhC,EAAM,KAAO,GAAG,EACtDgC,EAAS,KACT,GAAGhC,EAAM,IAAI,IAAIgC,EAAS,IAAI,GAC5BE,EAAmB,CAAE,GAAGF,EAAU,KAAMC,CAAS,EACjDhC,EAAe,KAAK,YAAYiC,CAAgB,EAClDjC,GACF8B,EAAQ,YAAY9B,CAAY,CAEpC,CAGFyB,EAAe,YAAYK,CAAO,EAElC,IAAMI,EAAoBC,GAAkB,CACtCA,EACFL,EAAQ,MAAM,UAAYA,EAAQ,aAAe,KAEjDA,EAAQ,MAAM,UAAY,GAE9B,EAEIN,EACF,sBAAsB,IAAMU,EAAiB,EAAI,CAAC,EAElDJ,EAAQ,MAAM,UAAY,IAG5BJ,EAAO,iBAAiB,QAAS,IAAM,CACjBD,EAAe,UAAU,SAAS,2BAA2B,GAE/EA,EAAe,UAAU,OAAO,2BAA2B,EAC3DC,EAAO,aAAa,gBAAiB,MAAM,EAC3CQ,EAAiB,EAAI,IAErBJ,EAAQ,MAAM,UAAYA,EAAQ,aAAe,KACjD,sBAAsB,IAAM,CAC1BL,EAAe,UAAU,IAAI,2BAA2B,EACxDC,EAAO,aAAa,gBAAiB,OAAO,EAC5CQ,EAAiB,EAAK,CACxB,CAAC,EAEL,CAAC,CACH,KAAO,CACL,GAAInC,EAAM,MAAO,CACf,IAAMqC,EAAQ,SAAS,cAAc,IAAI,EACzCA,EAAM,UAAY,wBAClBA,EAAM,YAAcrC,EAAM,MAC1B0B,EAAe,YAAYW,CAAK,CAClC,CAEA,GAAI,WAAYrC,GAASA,EAAM,OAC7B,QAAWgC,KAAYhC,EAAM,OAAQ,CACnC,IAAMiC,EAAWD,EAAS,KAAK,WAAWhC,EAAM,KAAO,GAAG,EACtDgC,EAAS,KACT,GAAGhC,EAAM,IAAI,IAAIgC,EAAS,IAAI,GAC5BE,EAAmB,CAAE,GAAGF,EAAU,KAAMC,CAAS,EACjDhC,EAAe,KAAK,YAAYiC,CAAgB,EAClDjC,GACFyB,EAAe,YAAYzB,CAAY,CAE3C,CAEJ,CAEA,OAAOyB,CACT,CAKQ,UAAU1B,EAA2B,CAC3C,IAAMsC,EAAe,SAAS,cAAc,KAAK,EACjDA,EAAa,UAAY,gBAEzB,IAAMC,EAAWvC,EAQjB,GALAsC,EAAa,MAAM,QAAU,OAC7BA,EAAa,MAAM,SAAW,OAC9BA,EAAa,MAAM,WAAaC,EAAS,OAAS,UAG9CA,EAAS,MAAQ,OAAW,CAC9B,IAAMC,EAAW,OAAOD,EAAS,KAAQ,SAAW,GAAGA,EAAS,GAAG,KAAOA,EAAS,IACnFD,EAAa,MAAM,IAAME,CAC3B,MACEF,EAAa,MAAM,IAAM,OAI3B,GAAI,WAAYtC,GAASA,EAAM,OAC7B,QAAWgC,KAAYhC,EAAM,OAAQ,CACnC,IAAMC,EAAe,KAAK,YAAY+B,CAAQ,EAC9C,GAAI/B,EAAc,CAEhB,IAAMwC,EAAe,SAAS,cAAc,KAAK,EACjDA,EAAa,MAAM,KAAO,IAC1BA,EAAa,MAAM,SAAW,IAC9BA,EAAa,YAAYxC,CAAY,EACrCqC,EAAa,YAAYG,CAAY,CACvC,CACF,CAGF,OAAOH,CACT,CAKQ,YAAYtC,EAA2B,CAC7C,IAAM0C,EAAiB,SAAS,cAAc,KAAK,EAInD,GAHAA,EAAe,UAAY,kBAC3BA,EAAe,aAAa,kBAAmB1C,EAAM,IAAI,EAErDA,EAAM,MAAO,CACf,IAAMqC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,UAAY,kBAClBA,EAAM,YAAcrC,EAAM,MAC1B0C,EAAe,YAAYL,CAAK,CAClC,CAEA,IAAMM,EAAS,KAAK,aAAa,SAAS3C,EAAM,IAAI,GAAK,CAAC,EACpD4C,EAAa5C,EACb6C,EAAWD,EAAW,UAAY,EAClCE,EAAWF,EAAW,UAAY,IAGlCG,EAAiB,SAAS,cAAc,KAAK,EACnDA,EAAe,UAAY,wBAE3B,QAASC,EAAI,EAAGA,EAAIL,EAAO,OAAQK,IAAK,CACtC,IAAMC,EAAgB,SAAS,cAAc,KAAK,EAGlD,GAFAA,EAAc,UAAY,uBAEtBL,EAAW,YAAY,OACzB,QAAWM,KAAaN,EAAW,WAAW,OAAQ,CACpD,IAAMO,EAAoB,CACxB,GAAGD,EACH,KAAM,GAAGlD,EAAM,IAAI,IAAIgD,CAAC,IAAIE,EAAU,IAAI,EAC5C,EACMjD,EAAe,KAAK,YAAYkD,CAAiB,EACnDlD,GACFgD,EAAc,YAAYhD,CAAY,CAE1C,CAIF,IAAMmD,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,KAAO,SACpBA,EAAa,YAAc,WAC3BA,EAAa,UAAY,yBACzB,IAAMC,EAAaV,EAAO,QAAUE,EAChC,KAAK,UAAY,KAAK,SAAWQ,EACnCD,EAAa,SAAW,GAExBA,EAAa,iBAAiB,QAAS,IAAM,CAC3C,IAAME,EAAY,CAAC,GAAGX,CAAM,EAC5BW,EAAU,OAAON,EAAG,CAAC,EACrB,KAAK,kBAAkBhD,EAAM,KAAMsD,CAAS,CAC9C,CAAC,EAEHL,EAAc,YAAYG,CAAY,EAEtCL,EAAe,YAAYE,CAAa,CAC1C,CAEAP,EAAe,YAAYK,CAAc,EAGzC,IAAMQ,EAAY,SAAS,cAAc,QAAQ,EACjDA,EAAU,KAAO,SACjBA,EAAU,YAAc,UACxBA,EAAU,UAAY,sBACtB,IAAMC,EAAab,EAAO,QAAUG,EACpC,OAAI,KAAK,UAAY,KAAK,SAAWU,EACnCD,EAAU,SAAW,GAErBA,EAAU,iBAAiB,QAAS,IAAM,CACxC,IAAME,EAAU,KAAK,aAAa,uBAAuBzD,CAAK,EACxDsD,EAAY,CAAC,GAAGX,EAAQc,CAAO,EACrC,KAAK,kBAAkBzD,EAAM,KAAMsD,CAAS,CAC9C,CAAC,EAEHZ,EAAe,YAAYa,CAAS,EAE7Bb,CACT,CAKQ,aAAa1C,EAAkC,CACrD,IAAMe,EAAkBC,GAAmB,QAAQ,EACnD,GAAI,CAACD,EAAiB,CACpB,IAAM2C,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,YAAc,yCAAyC1D,EAAM,IAAI,GAC9D0D,CACT,CAEA,IAAM5I,EAAQ,KAAK,aAAa,SAASkF,EAAM,IAAI,EAC7CQ,EAAS,KAAK,aAAa,UAAUR,EAAM,IAAI,EAC/CS,EAAQD,EAAO,OAAS,EAAIA,EAAO,CAAC,EAAI,OAE9C,OAAOO,EAAgB,CACrB,MAAAf,EACA,MAAAlF,EACA,MAAA2F,EACA,SAAWS,GAAQ,KAAK,kBAAkBlB,EAAM,KAAMkB,CAAG,EACzD,OAAQ,IAAM,KAAK,gBAAgBlB,EAAM,IAAI,CAC/C,CAAC,CACH,CAKQ,6BAA6B3E,EAA0D,CAC7F,IAAMsI,EAAiBhE,GAA6B,CAClD,IAAMP,EAAkB,CAAC,EACzB,QAAWrE,KAAK4E,EACd,GAAI5E,EAAE,OAAS,SAAW,eAAgBA,GAAKA,EAAE,YAAY,OAAQ,CACnE,IAAM6I,EAAQ,KAAK,aAAa,SAAS7I,EAAE,IAAI,EACzC8I,EAAQ,MAAM,QAAQD,CAAK,EAAIA,EAAM,OAAS,EACpD,QAASZ,EAAI,EAAGA,EAAIa,EAAOb,IACzB,QAAWc,KAAM/I,EAAE,WAAW,OAC5BqE,EAAO,KAAK,CAAE,GAAG0E,EAAI,KAAM,GAAG/I,EAAE,IAAI,IAAIiI,CAAC,IAAIc,EAAG,IAAI,EAAG,CAAU,CAGvE,MAAY/I,EAAE,OAAS,SAAWA,EAAE,OAAS,QAAU,WAAYA,GAAKA,EAAE,OACxEqE,EAAO,KAAK,GAAGuE,EAAc5I,EAAE,MAAM,CAAC,EAEtCqE,EAAO,KAAKrE,CAAC,EAGjB,OAAOqE,CACT,EAEMO,EAAStE,EAAO,MACjB,KAAK,aAAa,qBAAqB,GAAK,CAAC,EAC9CA,EAAO,QAAU,CAAC,EAKhB0I,EAJYJ,EAAchE,CAAM,EACL,OAC9B5E,GAAMA,EAAE,aAAa,KAAMiJ,GAAMA,EAAE,OAAS,UAAU,CACzD,EACuC,OAAQjJ,GAC7C,KAAK,aAAa,mBAAmBA,EAAE,IAAI,CAC7C,EACM2C,EAAQqG,EAAgB,OAU9B,MAAO,CAAE,UATSA,EAAgB,OAAQhJ,GAAM,CAE9C,GADe,KAAK,aAAa,UAAUA,EAAE,IAAI,EACtC,OAAS,EAAG,MAAO,GAC9B,IAAMmG,EAAM,KAAK,aAAa,SAASnG,EAAE,IAAI,EAG7C,MAFI,EAAAmG,GAAQ,MACR,OAAOA,GAAQ,UAAYA,EAAI,KAAK,IAAM,IAC1C,MAAM,QAAQA,CAAG,GAAKA,EAAI,SAAW,GAAKnG,EAAE,OAAS,QAE3D,CAAC,EAAE,OACiB,MAAA2C,CAAM,CAC5B,CAKQ,aAAagC,EAAwBrE,EAAoB,CAE/D,IAAMsB,EAAc,KAAK,aAAa,eAAe,EACrD,GAAI,CAACA,EAAa,OAElB,IAAMsH,EAAkB,SAAS,cAAc,KAAK,EACpDA,EAAgB,UAAY,mBAG5B,IAAMC,EAAiB,SAAS,cAAc,KAAK,EACnDA,EAAe,UAAY,yBAC3B,IAAMC,EAAkB9I,GAAQ,UAIhC,GAHI8I,GAAmBA,IAAoB,WACzCD,EAAe,UAAU,IAAI,cAAcC,CAAe,EAAE,EAE1D9I,GAAQ,MACV,QAAS2H,EAAI,EAAGA,EAAI3H,EAAO,MAAM,OAAQ2H,IAAK,CAC5C,IAAMoB,EAAS,SAAS,cAAc,KAAK,EAC3CA,EAAO,UAAY,wBACfpB,IAAMrG,EAAY,aACpByH,EAAO,UAAU,IAAI,QAAQ,EAE3BzH,EAAY,eAAe,SAASqG,CAAC,GACvCoB,EAAO,UAAU,IAAI,WAAW,EAElCA,EAAO,YAAc/I,EAAO,MAAM2H,CAAC,EAAE,MACrCkB,EAAe,YAAYE,CAAM,CACnC,CAEFH,EAAgB,YAAYC,CAAc,EAG1C,IAAMG,EAAkB,SAAS,cAAc,KAAK,EACpDA,EAAgB,UAAY,0BAC5B,IAAMC,EAAgB,KAAK,aAAa,qBAAqB,EAC7D,KAAK,aAAaD,EAAiBC,CAAa,EAChDL,EAAgB,YAAYI,CAAe,EAG3C,IAAME,EAAe,SAAS,cAAc,KAAK,EAIjD,GAHAA,EAAa,UAAY,uBAGrB5H,EAAY,YAAc,EAAG,CAC/B,IAAM6H,EAAa,SAAS,cAAc,QAAQ,EAClDA,EAAW,KAAO,SAClBA,EAAW,YAAc,WACzBA,EAAW,UAAY,wBACnB,KAAK,UAAY,KAAK,QACxBA,EAAW,SAAW,GAEtBA,EAAW,iBAAiB,QAAS,IAAM,CACpB,KAAK,aAAa,eAAe,GAClC,KAAK,aAAa,aAAa,IACjD,KAAK,OAAO,EACZ,KAAK,eAAe,EAExB,CAAC,EAEHD,EAAa,YAAYC,CAAU,CACrC,CAGA,GAAI7H,EAAY,YAAcA,EAAY,WAAa,EAAG,CACxD,IAAM8H,EAAa,SAAS,cAAc,QAAQ,EAClDA,EAAW,KAAO,SAClBA,EAAW,YAAc,YACzBA,EAAW,UAAY,wBACnB,KAAK,UAAY,KAAK,QACxBA,EAAW,SAAW,GAEtBA,EAAW,iBAAiB,QAAS,SAAY,CAEjD,IAAMC,EAAe,KAAK,aAAa,eAAe,EACtD,GAAI,CAACA,EAAc,OAGnB,IAAMJ,EAAgB,KAAK,aAAa,qBAAqB,EAG7D,QAAWtE,KAASsE,EAEd,KAAK,aAAa,mBAAmBtE,EAAM,IAAI,GACjD,MAAM,KAAK,aAAa,cAAcA,EAAM,IAAI,EAKpD,IAAM2E,EAAY,KAAK,aAAa,aAAa,EAC3CC,EAAuC,CAAC,EAG9C,QAAW5E,KAASsE,EACdK,EAAU3E,EAAM,IAAI,GAAK2E,EAAU3E,EAAM,IAAI,EAAE,OAAS,IAC1D4E,EAAW5E,EAAM,IAAI,EAAI2E,EAAU3E,EAAM,IAAI,GAI/B,OAAO,KAAK4E,CAAU,EAAE,OAAS,EAejD,KAAK,UAAUA,CAAU,GAXzB,KAAK,aAAa,aAAaF,EAAa,WAAW,EAGzC,KAAK,aAAa,SAAS,IAIvC,KAAK,OAAO,EACZ,KAAK,eAAe,GAKxB,CAAC,EAEHH,EAAa,YAAYE,CAAU,CACrC,CAGA,IAAMpH,EAAe,KAAK,sBAAsBhC,CAAM,EACtD,GACEsB,EAAY,cAAgBA,EAAY,WAAa,GACrDU,EAAa,QACb,CACA,IAAME,EAAe,SAAS,cAAc,QAAQ,EACpDA,EAAa,KAAO,SACpBA,EAAa,YAAcF,EAAa,KACxCE,EAAa,UAAY,wBACzBA,EAAa,MAAM,MAAQF,EAAa,MACpC,KAAK,UAAY,KAAK,QACxBE,EAAa,SAAW,GAExBA,EAAa,iBAAiB,QAAS,SAAY,CAEnD,IAAM+G,EAAgB,KAAK,aAAa,qBAAqB,EAG7D,QAAWtE,KAASsE,EAEd,KAAK,aAAa,mBAAmBtE,EAAM,IAAI,GACjD,MAAM,KAAK,aAAa,cAAcA,EAAM,IAAI,EAKpD,IAAM2E,EAAY,KAAK,aAAa,aAAa,EAC3CC,EAAuC,CAAC,EAG9C,QAAW5E,KAASsE,EACdK,EAAU3E,EAAM,IAAI,GAAK2E,EAAU3E,EAAM,IAAI,EAAE,OAAS,IAC1D4E,EAAW5E,EAAM,IAAI,EAAI2E,EAAU3E,EAAM,IAAI,GAI/B,OAAO,KAAK4E,CAAU,EAAE,OAAS,EAKjD,KAAK,UAAUA,CAAU,EAFzB,MAAM,KAAK,aAAa,IAAI,MAAM,QAAQ,CAAgB,CAI5D,CAAC,EAEHL,EAAa,YAAYhH,CAAY,CACvC,CAEA0G,EAAgB,YAAYM,CAAY,EACxC7E,EAAU,YAAYuE,CAAe,CACvC,CAKA,MAAc,kBAAkBY,EAAmB/J,EAAY,CAC7D,MAAM,KAAK,aAAa,SAAS+J,EAAW/J,CAAK,EACjD,KAAK,aAAa,EAGlB,IAAMO,EAAS,KAAK,OACpB,GAAIA,EAAQ,CACV,IAAM2E,EAAQ,KAAK,kBAAkB3E,EAAQwJ,CAAS,EAClD7E,GAAO,OAAS,UACD,KAAK,mBAAmBA,CAAK,IAG5C,KAAK,+BAAiC,GACtC,sBAAsB,IAAM,KAAK,OAAO,CAAC,GAG/C,CAGA,IAAM8E,EAAkB,KAAK,aAAa,mBAAmBD,CAAS,EAGlEC,EAAgB,OAAS,IAEvB,KAAK,yBACP,aAAa,KAAK,uBAAuB,EAG3C,KAAK,wBAA0B,WAAW,IAAM,CAC9C,KAAK,sBAAsBA,CAAe,EAC1C,KAAK,qBAAqBD,EAAWC,CAAe,CACtD,EAAG,EAAE,GAIP,IAAMC,EAAc,IAAI,YAA+B,SAAU,CAC/D,OAAQ,CACN,MAAOF,EACP,MAAA/J,EACA,OAAQ,KAAK,aAAa,SAAS,EAAE,MACvC,EACA,QAAS,GACT,SAAU,EACZ,CAAC,EACD,KAAK,cAAciK,CAAW,CAChC,CAQQ,mBAAmB/E,EAAuB,CAChD,IAAM0C,EAAiB,KAAK,OAAO,cACjC,qBAAqB1C,EAAM,IAAI,oBACjC,EACA,GAAI,CAAC0C,GAAgB,WAAY,MAAO,GAExC,IAAMsC,EAAkB,KAAK,YAAYhF,CAAK,EAC9C,OAAA0C,EAAe,WAAW,aAAasC,EAAiBtC,CAAc,EAC/D,EACT,CAKQ,sBAAsBuC,EAA4B,CACxD,IAAM5J,EAAS,KAAK,OACpB,GAAI,CAACA,EAAQ,OAIb,IAAM6J,EAAoB,KAAK,6BAA6B7J,CAAM,EAE5D8J,EAAuBD,EAAkB,OAAS,EAExD,QAAQ,IAAI,yBAA0B,CAAE,WAAAD,EAAY,qBAAAE,EAAsB,kBAAmBD,EAAkB,IAAInK,GAAKA,EAAE,IAAI,CAAE,CAAC,EAIjI,IAAMY,EAAO,KAAK,OAAO,cAAc,MAAM,EAC7C,GAAI,CAACA,EAAM,OAGX,IAAMyJ,EAAmB,IAAI,IAG7B,QAAWC,KAAMJ,EACfG,EAAiB,IAAIC,CAAE,EAIzB,QAAWA,KAAMJ,EACF,KAAK,aAAa,mBAAmBI,CAAE,EAC/C,QAAQC,GAAKF,EAAiB,IAAIE,CAAC,CAAC,EAI3C,QAAWT,KAAaO,EAAkB,CAExC,IAAI/D,EAAiB1F,EAAK,cAAc,qBAAqBkJ,CAAS,IAAI,EAY1E,GATKxD,IACHA,EAAiB1F,EAAK,cAAc,0BAA0BkJ,CAAS,IAAI,GAIxExD,IACHA,EAAiB1F,EAAK,cAAc,qBAAqBkJ,CAAS,yBAAyBA,CAAS,IAAI,GAGtGxD,EAAgB,CAClB,IAAMrB,EAAQ,KAAK,kBAAkB3E,EAAQwJ,CAAS,EACtD,GAAI,CAAC7E,EAAO,SAGZ,IAAMuF,EAASlE,EAAe,cAC9B,GAAIkE,EAAQ,CACV,IAAMC,EAAkB,KAAK,YAAYxF,CAAK,EAC1CwF,GACFD,EAAO,aAAaC,EAAiBnE,CAAc,CAEvD,CACF,CACF,CACF,CAKQ,6BAA6BhG,EAA6B,CAChE,IAAM+D,EAAkB,CAAC,EAEnBuE,EAAiBhE,GAAoB,CACzC,QAAWK,KAASL,EACdK,EAAM,cACRZ,EAAO,KAAKY,CAAK,EAEfA,EAAM,OAAS,SAAW,WAAYA,GACxC2D,EAAc3D,EAAM,MAAM,EAExBA,EAAM,OAAS,OAAS,WAAYA,GACtC2D,EAAc3D,EAAM,MAAM,EAExBA,EAAM,OAAS,SAAW,eAAgBA,GAASA,EAAM,YAAY,QACvE2D,EAAc3D,EAAM,WAAW,MAAM,CAG3C,EAEMyF,EAAkBpK,EAAe,SAClCA,EAAe,MAAO,QAASqK,GAAcA,EAAK,MAAM,EACzDrK,EAAO,QAAU,CAAC,EAEtB,OAAAsI,EAAc8B,CAAc,EACrBrG,CACT,CAKQ,qBACNuG,EACAC,EACM,CACN,IAAMC,EAAkB,IAAI,YAAY,mBAAoB,CAC1D,OAAQ,CACN,aAAAF,EACA,eAAAC,CACF,EACA,QAAS,GACT,SAAU,EACZ,CAAC,EACD,KAAK,cAAcC,CAAe,CACpC,CAKA,MAAc,gBAAgBhB,EAAmB,CAC/C,KAAK,aAAa,WAAWA,CAAS,EAEtC,MAAM,KAAK,aAAa,cAAcA,CAAS,EAE/C,KAAK,kBAAkBA,CAAS,CAClC,CAKQ,kBAAkBA,EAAmB,CAC3C,IAAMxJ,EAAS,KAAK,OAIpB,GAHI,CAACA,GAGD,CADU,KAAK,kBAAkBA,EAAQwJ,CAAS,EAC1C,OAEZ,IAAMrE,EAAS,KAAK,aAAa,UAAUqE,CAAS,EAC9CpE,EAAQD,EAAO,OAAS,EAAIA,EAAO,CAAC,EAAI,OAGxCa,EAAiB,KAAK,OAAO,cAAc,UAAUwD,CAAS,IAAI,GAAG,QAAQ,kBAAkB,EACrG,GAAI,CAACxD,EAAgB,OAGrB,IAAMyE,EAAezE,EAAe,cAAc,kBAAkB,EACpE,GAAIZ,EAAO,CACT,GAAKqF,EAMHA,EAAa,YAAcrF,MANV,CACjB,IAAMsF,EAAU,SAAS,cAAc,GAAG,EAC1CA,EAAQ,UAAY,kBACpBA,EAAQ,YAActF,EACtBY,EAAe,YAAY0E,CAAO,CACpC,CAIc1E,EAAe,cAAc,yBAAyB,GAC7D,UAAU,IAAI,uBAAuB,CAC9C,MACEyE,GAAc,OAAO,EACPzE,EAAe,cAAc,yBAAyB,GAC7D,UAAU,OAAO,uBAAuB,CAEnD,CAKQ,kBAAkBhG,EAAoBG,EAA4B,CACxE,IAAMmE,EAAStE,EAAO,QAAU,CAAC,EAC3B2K,EAAMxK,EAAK,QAAQ,GAAG,EAC5B,GAAIwK,EAAM,EAAG,CACX,IAAMC,EAAazK,EAAK,MAAM,EAAGwK,CAAG,EAC9BE,EAAY1K,EAAK,MAAMwK,EAAM,CAAC,EAC9BT,EAAS5F,EAAO,KAAM5E,GAAMA,EAAE,OAASkL,CAAU,EACvD,GAAI,CAACV,EAAQ,OAAO,KACpB,IAAKA,EAAO,OAAS,SAAWA,EAAO,OAAS,QAAU,WAAYA,GAAUA,EAAO,OAAQ,CAC7F,IAAMY,EAAQ,KAAK,kBAAkB,CAAE,OAAQZ,EAAO,MAAO,EAAGW,CAAS,EACzE,OAAOC,EAAQ,CAAE,GAAGA,EAAO,KAAA3K,CAAK,EAAI,IACtC,CACA,OAAO,IACT,CACA,QAAWwE,KAASL,EAAQ,CAC1B,GAAIK,EAAM,OAASxE,EACjB,OAAOwE,EAET,GAAIA,EAAM,OAAS,SAAW,WAAYA,EAAO,CAC/C,IAAMmG,EAAQ,KAAK,kBAAkB,CAAE,OAAQnG,EAAM,MAAO,EAAGxE,CAAI,EACnE,GAAI2K,EAAO,OAAOA,CACpB,CACA,GAAInG,EAAM,OAAS,OAAS,WAAYA,EAAO,CAC7C,IAAMmG,EAAQ,KAAK,kBAAkB,CAAE,OAAQnG,EAAM,MAAO,EAAGxE,CAAI,EACnE,GAAI2K,EAAO,OAAOA,CACpB,CACF,CACA,OAAO,IACT,CAKA,MAAc,aAAaC,EAAc,CAGvC,GAFAA,EAAM,eAAe,EAEjB,KAAK,cAAc,SAAS,EAC9B,OAGF,GAAI,KAAK,aAAc,CACrB,KAAK,UAAU,CAAE,KAAM,CAAC,wDAAwD,CAAE,CAAC,EACnF,MACF,CAEA,IAAM5F,EAAS,MAAM,KAAK,aAAa,aAAa,EAC9C6F,EAAQ,KAAK,aAAa,SAAS,EAEzC,GAAI,OAAO,KAAK7F,CAAM,EAAE,OAAS,EAAG,CAElC,QAAWqE,KAAa,OAAO,KAAKrE,CAAM,EACxC,KAAK,kBAAkBqE,CAAS,EAElC,KAAK,UAAUrE,CAAM,EACrB,MACF,CAGA,IAAM8F,EAAkC,CACtC,OAAQD,EAAM,OACd,QAAS,GACT,OAAQ,CAAC,CACX,EAEI,KAAK,cAAgB,KAAK,eAC5BC,EAAa,cAAgB,KAAK,eAGpC,IAAMC,EAAc,IAAI,YAA+B,SAAU,CAC/D,OAAQD,EACR,QAAS,GACT,SAAU,EACZ,CAAC,EACD,KAAK,cAAcC,CAAW,EAG9B,KAAK,iBAAiB,CACxB,CAKQ,UAAU/F,EAAkC,CAClD,IAAMgG,EAAa,IAAI,YAA8B,QAAS,CAC5D,OAAQ,CACN,OAAAhG,CACF,EACA,QAAS,GACT,SAAU,EACZ,CAAC,EACD,KAAK,cAAcgG,CAAU,CAC/B,CAKQ,gBAAiB,CACvB,IAAM7J,EAAc,KAAK,aAAa,eAAe,EACrD,GAAI,CAACA,EAAa,OAElB,IAAM8J,EAAkB,IAAI,YAC1B,aACA,CACE,OAAQ,CACN,YAAa9J,EAAY,YACzB,aACEA,EAAY,YAAc,EACtBA,EAAY,YAAc,EAC1BA,EAAY,YAClB,WAAYA,EAAY,UAC1B,EACA,QAAS,GACT,SAAU,EACZ,CACF,EACA,KAAK,cAAc8J,CAAe,CACpC,CAKO,mBAAmBC,EAAqC,CAC7D,KAAK,iBAAmB,CAAE,GAAG,KAAK,iBAAkB,GAAGA,CAAW,EAClEC,GAAmBD,CAAU,CAC/B,CAKO,OAAc,CACnB,KAAK,aAAa,MAAM,EACxB,KAAK,OAAO,CACd,CAMO,mBAA0B,CAC/B,KAAK,cAAc,kBAAkB,EACjC,KAAK,cAAc,SAAS,GAC9B,KAAK,kBAAkB,CAE3B,CAKO,eAAsB,CAC3B,KAAK,cAAc,MAAM,EACzB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,OAAO,CACd,CAKO,UAAoB,CACzB,OAAO,KAAK,cAAc,SAAS,GAAK,EAC1C,CAKO,yBAAkC,CACvC,OAAO,KAAK,cAAc,wBAAwB,GAAK,CACzD,CAMO,eAAsB,CAC3B,IAAM/K,EAAO,KAAK,OAAO,cAAc,MAAM,EACzCA,GAAQ,OAAQA,EAAyB,eAAkB,YAC3DA,EAAyB,cAAc,CAE7C,CAKO,OAAc,CACnB,IAAMN,EAAS,KAAK,OACdU,EAAe,KAAK,SACtB2C,EAAmC,KAEnC3C,EACF2C,EAAgB,KAAK,sBAAsB3C,CAAY,EAEvD2C,EAAgBrD,EAGdqD,IACF,KAAK,aAAa,iBAAiBA,EAAe,CAAC,CAAC,EACpD,KAAK,OAAO,EAEhB,CAKO,WAAiC,CACtC,OAAO,KAAK,aAAa,SAAS,EAAE,MACtC,CAKO,SAASmG,EAAwB,CACtC,OAAO,KAAK,aAAa,SAASA,CAAS,CAC7C,CAKA,MAAa,SAASA,EAAmB/J,EAA2B,CAClE,MAAM,KAAK,aAAa,SAAS+J,EAAW/J,CAAK,EACjD,KAAK,OAAO,CACd,CAKA,MAAa,UAAU6H,EAA4C,CACjE,OAAW,CAACkC,EAAW/J,CAAK,IAAK,OAAO,QAAQ6H,CAAM,EACpD,MAAM,KAAK,aAAa,SAASkC,EAAW/J,CAAK,EAEnD,KAAK,OAAO,CACd,CAKA,MAAa,UAA8C,CACzD,IAAM0F,EAAS,MAAM,KAAK,aAAa,aAAa,EAEpD,GAAI,OAAO,KAAKA,CAAM,EAAE,OAAS,EAAG,CAElC,QAAWqE,KAAa,OAAO,KAAKrE,CAAM,EACxC,KAAK,kBAAkBqE,CAAS,EAElC,KAAK,UAAUrE,CAAM,CACvB,MAEwB,KAAK,OAAO,iBAAiB,kBAAkB,EACvD,QAAQzB,GAAMA,EAAG,OAAO,CAAC,EACnB,KAAK,OAAO,iBAAiB,wBAAwB,EAC7D,QAAQA,GAAMA,EAAG,UAAU,OAAO,uBAAuB,CAAC,EAExE,OAAOyB,CACT,CAKA,MAAa,cAAcqE,EAAsC,CAC/D,aAAM,KAAK,aAAa,cAAcA,CAAS,EAC/C,KAAK,kBAAkBA,CAAS,EACzB,KAAK,aAAa,UAAUA,CAAS,CAC9C,CAKO,WAAsC,CAC3C,OAAO,KAAK,aAAa,aAAa,CACxC,CAKO,eAAeA,EAA6B,CACjD,OAAO,KAAK,aAAa,UAAUA,CAAS,CAC9C,CAKO,SAAmB,CACxB,OAAO,KAAK,aAAa,SAAS,EAAE,OACtC,CAKA,IAAI,OAAmB,CACrB,IAAM+B,EAAY,KAAK,aAAa,OAAO,EAe3C,OAAIA,GAd6B,CAC/B,QACA,cACA,WACA,iBACA,QACA,SACA,SACA,UACA,QACA,WACA,UACA,KACF,EAC6B,SAASA,CAAsB,EACnDA,EAEF,OACT,CAKA,IAAI,MAAM9L,EAAkB,CACtBA,EACF,KAAK,aAAa,QAASA,CAAK,EAEhC,KAAK,gBAAgB,OAAO,CAEhC,CAKA,IAAI,QAA4B,CAC9B,IAAM+L,EAAa,KAAK,aAAa,QAAQ,EAC7C,OAAKA,EACEhM,EAAoBgM,CAAU,EADb,IAE1B,CAKA,IAAI,OAAO/L,EAA0B,CAC/BA,EACF,KAAK,aAAa,SAAUE,EAAeF,CAAK,CAAC,EAEjD,KAAK,gBAAgB,QAAQ,CAEjC,CAKA,IAAI,aAA0C,CAC5C,IAAMgM,EAAkB,KAAK,aAAa,aAAa,EACvD,OAAKA,EACEjM,EAAoBiM,CAAe,EADb,IAE/B,CAKA,IAAI,YAAYhM,EAAmC,CAC7CA,EACF,KAAK,aAAa,cAAeE,EAAeF,CAAK,CAAC,EAEtD,KAAK,gBAAgB,aAAa,CAEtC,CAKA,IAAI,SAAmB,CACrB,OAAO,KAAK,aAAa,SAAS,CACpC,CAKA,IAAI,QAAQA,EAAgB,CACtBA,EACF,KAAK,aAAa,UAAW,EAAE,EAE/B,KAAK,gBAAgB,SAAS,CAElC,CAKA,IAAI,UAAoB,CACtB,OAAO,KAAK,aAAa,UAAU,CACrC,CAKA,IAAI,SAASA,EAAgB,CACvBA,EACF,KAAK,aAAa,WAAY,EAAE,EAEhC,KAAK,gBAAgB,UAAU,CAEnC,CAKA,IAAI,cAA8B,CAChC,IAAMK,EAAO,KAAK,aAAa,eAAe,EAC9C,GAAI,CAACA,EAAM,OAAO,KAClB,IAAMC,EAAI,SAASD,EAAM,EAAE,EAC3B,OAAO,MAAMC,CAAC,GAAKA,GAAK,EAAI,KAAOA,CACrC,CAKA,IAAI,aAAaN,EAAsB,CACjCA,GAAS,MAAQA,EAAQ,EAC3B,KAAK,aAAa,gBAAiB,OAAOA,CAAK,CAAC,EAEhD,KAAK,gBAAgB,eAAe,CAExC,CAKQ,aAAc,CAEpB,IAAMiM,EAAgB,KAAK,OAAO,cAAc,OAAO,EACnDA,GACFA,EAAc,OAAO,EAGvB,IAAMC,EAAQ,KAAK,MACbC,EAASC,EAAU,KAAK,QAAU,MAAS,EAC3CC,EAASC,EAAeJ,EAAOC,CAAM,EAErCI,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,YAAcF,EAGhB,KAAK,OAAO,WACd,KAAK,OAAO,aAAaE,EAAO,KAAK,OAAO,UAAU,EAEtD,KAAK,OAAO,YAAYA,CAAK,CAEjC,CAKQ,gBAAgBhM,EAAoB,CAC1C,GAAI,CAACA,EAAO,aAAe,CAACA,EAAO,YAAY,QAAS,CACtD,KAAK,kBAAoB,KACzB,MACF,CAEA,KAAK,kBAAoB,CACvB,QAAS,GACT,IAAKA,EAAO,YAAY,IACxB,SAAUA,EAAO,YAAY,UAAY,GACzC,SAAUA,EAAO,YAAY,UAAY,IACzC,UAAWA,EAAO,YAAY,SAChC,EAGA,KAAK,mBAAmB,CAC1B,CAKQ,oBAAqB,CAC3B,GAAI,GAAC,KAAK,mBAAqB,CAAC,KAAK,kBAAkB,UAClD,KAAK,kBAAkB,IAE5B,GAAI,CACF,IAAMiM,EAAS,aAAa,QAAQ,KAAK,kBAAkB,GAAG,EAC9D,GAAIA,EAAQ,CACV,IAAM3E,EAAS,KAAK,MAAM2E,CAAM,EAC5B3E,GAAU,OAAOA,GAAW,WAE9B,KAAK,qBAAuBA,EAGxB,KAAK,kBAAkB,WACzB,KAAK,kBAAkB,UAAUA,CAAM,EAG7C,CACF,OAAS,EAAG,CACV,QAAQ,KAAK,+CAAgD,CAAC,CAChE,CACF,CAKQ,2BAA4B,CAClC,GAAI,CAAC,KAAK,sBAAwB,KAAK,kBAAmB,OAE1D,KAAK,kBAAoB,GACzB,IAAM4E,EAAkB,CAAE,GAAG,KAAK,oBAAqB,EACvD,KAAK,qBAAuB,KAE5B,OAAW,CAAC/K,EAAK1B,CAAK,IAAK,OAAO,QAAQyM,CAAe,EACvD,KAAK,aAAa,0BAA0B/K,EAAK1B,CAAK,EAIxD,KAAK,uBAAuByM,CAAe,EAE3C,KAAK,kBAAoB,EAC3B,CAKQ,uBAAuB5E,EAA6B,CAC1D,QAAWkC,KAAa,OAAO,KAAKlC,CAAM,EAAG,CAC3C,IAAM/G,EAAQ,KAAK,OAAO,cAAc,UAAUiJ,CAAS,IAAI,EAC3DjJ,IACFA,EAAM,MAAQ+G,EAAOkC,CAAS,GAAK,GAEvC,CACF,CAKS,eAAgB,CACtB,GAAI,GAAC,KAAK,mBAAqB,CAAC,KAAK,kBAAkB,UAClD,KAAK,kBAAkB,IAE5B,GAAI,CACF,IAAMlC,EAAS,KAAK,aAAa,SAAS,EAAE,OAC5C,aAAa,QAAQ,KAAK,kBAAkB,IAAK,KAAK,UAAUA,CAAM,CAAC,CACzE,OAAS,EAAG,CACV,QAAQ,KAAK,0CAA2C,CAAC,CAC3D,CACF,CAKO,cAAe,CACjB,CAAC,KAAK,mBAAqB,CAAC,KAAK,kBAAkB,SAClD,KAAK,kBAAkB,WAGxB,KAAK,0BACP,aAAa,KAAK,wBAAwB,EAI5C,KAAK,yBAA2B,WAAW,IAAM,CAC/C,KAAK,cAAc,CACrB,EAAG,KAAK,kBAAkB,QAAQ,EACpC,CAKQ,kBAAmB,CACzB,GAAI,GAAC,KAAK,mBAAqB,CAAC,KAAK,kBAAkB,KAEvD,GAAI,CACF,aAAa,WAAW,KAAK,kBAAkB,GAAG,CACpD,OAAS,EAAG,CACV,QAAQ,KAAK,yCAA0C,CAAC,CAC1D,CACF,CAKQ,YAAmB,CACrB,KAAK,uBACP,cAAc,KAAK,oBAAoB,EACvC,KAAK,qBAAuB,MAE9B,KAAK,aAAe,GACpB,KAAK,aAAe,GAChB,KAAK,eACP,KAAK,cAAgB,KAAK,aAE9B,CAKQ,YAAmB,CACrB,KAAK,cAAgB,KAAK,cAAgB,CAAC,KAAK,eAEpD,KAAK,aAAe,GACpB,KAAK,cAAgB,KAAK,aAE1B,KAAK,mBAAmB,EAExB,KAAK,qBAAuB,YAAY,IAAM,CAC5C,KAAK,gBACL,KAAK,mBAAmB,EAEpB,KAAK,eAAiB,GACxB,KAAK,mBAAmB,CAE5B,EAAG,GAAI,EACT,CAKQ,oBAA2B,CACjC,IAAM6E,EAAgB,KAAK,OAAO,cAAc,kBAAkB,EAClE,GAAI,CAACA,EAAe,OAEpB,IAAMlJ,EAAU,KAAK,MAAM,KAAK,cAAgB,EAAE,EAC5CC,EAAU,KAAK,cAAgB,GAC/BC,EAAU,GAAGF,CAAO,IAAIC,EAAQ,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,GACjEiJ,EAAc,YAAchJ,EAExB,KAAK,eAAiB,IACxBgJ,EAAc,UAAU,IAAI,yBAAyB,EAEnD,KAAK,eAAiB,IACxBA,EAAc,UAAU,IAAI,wBAAwB,CAExD,CAKQ,oBAA2B,CAC7B,KAAK,uBACP,cAAc,KAAK,oBAAoB,EACvC,KAAK,qBAAuB,MAG9B,KAAK,aAAe,GAEpB,IAAMC,EAAe,IAAI,YAAgC,UAAW,CAClE,OAAQ,CACN,aAAc,KAAK,cAAgB,EACnC,UAAW,IAAI,IACjB,EACA,QAAS,GACT,SAAU,EACZ,CAAC,EACD,KAAK,cAAcA,CAAY,EAE/B,KAAK,iBAAiB,CACxB,CAKQ,kBAAyB,CAC/B,IAAM9L,EAAO,KAAK,OAAO,cAAc,MAAM,EAC7C,GAAI,CAACA,EAAM,OAEIA,EAAK,iBAAiB,iCAAiC,EAC/D,QAASC,GAAU,EACpBA,aAAiB,kBAAoBA,aAAiB,qBAAuBA,aAAiB,mBAEvFA,aAAiB,mBAAqBA,EAAM,OAAS,YAC9DA,EAAM,SAAW,GAErB,CAAC,EAEDD,EAAK,UAAU,IAAI,yBAAyB,EAE5C,IAAM+L,EAAe,KAAK,OAAO,cAAc,kBAAkB,EAC7DA,IACFA,EAAa,UAAU,IAAI,yBAAyB,EACpDA,EAAa,YAAc,iBAE/B,CAKQ,yBAAgC,CACtC,GAAI,CAAC,KAAK,cAAgB,KAAK,aAAc,OAE7C,IAAM/L,EAAO,KAAK,OAAO,cAAc,MAAM,EAC7C,GAAI,CAACA,EAAM,OAEX,IAAMgM,EAAmB,IAAM,CACzB,CAAC,KAAK,cAAgB,CAAC,KAAK,cAC9B,KAAK,WAAW,CAEpB,EAEAhM,EAAK,iBAAiB,QAASgM,EAAkB,CAAE,KAAM,EAAK,CAAC,CACjE,CAKQ,oBAA2B,CACjC,IAAMH,EAAgB,KAAK,OAAO,cAAc,kBAAkB,EAC9DA,GAAeA,EAAc,OAAO,EAExC,IAAM7L,EAAO,KAAK,OAAO,cAAc,MAAM,EAC7C,GAAI,CAACA,EAAM,OAEX,IAAMiM,EAAiB,SAAS,cAAc,KAAK,EACnDA,EAAe,UAAY,kBAE3B,IAAMC,EAAc,KAAK,cAAgB,EACnCvJ,EAAU,KAAK,MAAMuJ,EAAc,EAAE,EACrCtJ,EAAUsJ,EAAc,GAC9BD,EAAe,YAAc,GAAGtJ,CAAO,IAAIC,EAAQ,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,GAE9E5C,EAAK,aAAaiM,EAAgBjM,EAAK,UAAU,CACnD,CACF,EAGI,OAAO,OAAW,KAAe,OAAO,eAAmB,KAAe,CAAC,eAAe,IAAI,WAAW,GAC3G,eAAe,OAAO,YAAajB,EAAQ","names":["_getDefaults","changeDefaults","newDefaults","_defaults","edit","regex","opt","source","obj","name","val","valSource","other","escape","html","encode","getEscapeReplacement","cleanUrl","href","splitCells","tableRow","count","row","match","offset","str","escaped","curr","cells","i","rtrim","c","invert","l","suffLen","currChar","findClosingBracket","b","level","expandTabs","line","indent","col","expanded","char","added","outputLink","cap","link","raw","lexer","rules","title","text","token","indentCodeCompensation","matchIndentToCode","indentToCode","node","matchIndentInNode","indentInNode","marked","src","markedInstance","noopTest","supportsLookbehind","newline","blockCode","fences","hr","heading","bullet","lheadingCore","lheading","lheadingGfm","_paragraph","blockText","_blockLabel","def","list","_tag","_comment","paragraph","blockquote","blockNormal","gfmTable","blockGfm","blockPedantic","inlineCode","br","inlineText","_punctuation","_punctuationOrSpace","_notPunctuationOrSpace","punctuation","_punctuationGfmStrongEm","_punctuationOrSpaceGfmStrongEm","_notPunctuationOrSpaceGfmStrongEm","_punctuationGfmDel","_punctuationOrSpaceGfmDel","_notPunctuationOrSpaceGfmDel","blockSkip","emStrongLDelimCore","emStrongLDelim","emStrongLDelimGfm","emStrongRDelimAstCore","emStrongRDelimAst","emStrongRDelimAstGfm","emStrongRDelimUnd","delLDelim","delRDelimCore","delRDelim","anyPunctuation","autolink","_inlineComment","tag","_inlineLabel","reflink","nolink","reflinkSearch","_caseInsensitiveProtocol","inlineNormal","inlinePedantic","inlineGfm","inlineBreaks","block","inline","escapeReplacements","_Tokenizer","_Lexer","_Renderer","_TextRenderer","_Parser","_Hooks","Marked","options","setOptions","use","walkTokens","parseInline","parse","parser","bull","ch","__publicField","trimmed","lines","tokens","inBlockquote","currentLines","currentRaw","currentText","top","lastToken","oldToken","newText","newToken","isordered","itemRegex","endsWithBlankLine","endEarly","itemContents","nextLine","blankLine","nextBulletRegex","hrRegex","fencesBeginRegex","headingBeginRegex","htmlBeginRegex","blockquoteBeginRegex","rawLine","nextLineWithoutTabs","lastItem","item","taskRaw","checkboxToken","spacers","t","hasMultipleLineBreaks","headers","aligns","rows","align","cell","trimmedUrl","rtrimSlash","lastParenIndex","linkLen","links","linkString","maskedSrc","prevChar","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","lastCharLength","hasNonSpaceChars","hasSpaceCharsOnBothEnds","prevCapZero","__Lexer","next","lastParagraphClipped","extTokenizer","cutSrc","startIndex","tempSrc","tempStart","getStartIndex","errMsg","keepPrevChar","lang","langString","code","depth","ordered","start","body","j","type","startAttr","checked","header","k","content","cleanHref","out","__Parser","anyToken","genericToken","ret","renderer","_a","markdown","args","callback","values","tableToken","listToken","childTokens","extensions","pack","opts","ext","prevRenderer","extLevel","prop","rendererProp","rendererFunc","tokenizer","tokenizerProp","tokenizerFunc","prevTokenizer","hooks","hooksProp","hooksFunc","prevHook","arg","packWalktokens","blockType","origOpt","throwError","processedSrc","processedTokens","e","silent","async","msg","SchemaParser","schema","step","normalizedFields","normalizedSteps","fields","field","index","min","max","slot","fieldName","slotName","defaults","parsed","allFields","extractFields","hexToRgb","hex","result","short","defaultColors","getColors","colors","getBaseStyles","getPlanoStyles","_colors","getTradicionalStyles","_colors","getMaterialStyles","_colors","getRoundedShadowStyles","_colors","getLinesStyles","_colors","getShadcnStyles","_colors","getChakraStyles","_colors","getMantineStyles","_colors","getGlassStyles","_colors","getBorderedStyles","_colors","getMinimalStyles","_colors","getEfcStyles","_colors","getThemeStyles","theme","colors","baseStyles","getBaseStyles","themeStyles","getThemeSpecificStyles","getPlanoStyles","getTradicionalStyles","getMaterialStyles","getRoundedShadowStyles","getLinesStyles","getShadcnStyles","getChakraStyles","getMantineStyles","getGlassStyles","getBorderedStyles","getMinimalStyles","getEfcStyles","PREDEFINED_MASKS","value","cleaned","getPredefinedMask","type","INJECTION_VALIDATION_MESSAGE","INJECTION_PATTERNS","containsInjection","value","pattern","isSafeFromInjection","item","v","AttemptsLock","options","stored","data","attributeValue","value","parseAttributeValue","getNestedValue","obj","path","current","key","setNestedValue","value","keys","lastKey","target","isValidEmail","email","ConditionEngine","condition","formValues","fieldValue","conditions","logic","conditionsArray","dependencies","visible","enabled","required","shouldHide","shouldDisable","shouldBeOptional","fieldName","parts","value","part","operator","compareValue","a","b","val","index","keysA","keysB","key","parsed","ValidationEngine","ConditionEngine","field","value","_field","validations","errors","validation","result","isValid","isValidEmail","minLength","maxLength","min","num","max","pattern","regex","isSafeFromInjection","INJECTION_VALIDATION_MESSAGE","values","fields","itemFields","arrayValue","i","itemValue","itemField","itemFieldName","itemFieldValue","fieldErrors","arrayErrors","arrayField","StateManager","SchemaParser","ValidationEngine","ConditionEngine","schema","initialData","fields","allFields","field","topLevelNames","f","arrayItemNames","sub","parentPath","containerType","result","fullPath","containerPath","topLevelFields","step","allFieldsWithArrays","observedFields","observedField","dependencies","extractFromCondition","condition","extractFromConditions","conditions","existingValues","values","key","value","setNestedValue","existingValue","getNestedValue","prevValue","arrayItemOnlyNames","arrayField","minItems","arr","padded","i","item","subField","name","itemFields","fieldName","dependentFields","dependentField","dependentFieldWithIndex","fieldNameWithoutIndex","indexMatch","dependentWithIndex","baseFieldName","parts","partialPath","sourcePath","targetPath","index","sourceArray","activeValidations","errors","validations","textFieldTypes","skipInjection","v","isRequired","hasRequiredValidation","conditional","stepIndex","isSubmitting","cached","fieldInfo","valuesContext","observerField","getObserverField","deps","itemIndex","observerValue","arrayValue","bracketKey","bracketObj","itemContext","containerValues","createRelativeContext","obj","prefix","entries","relativeKey","relativeContext","hasRequired","BaseInput","field","value","error","onChange","onBlur","rawInput","leading","trailing","wrapper","slotEl","inputWrap","slot","container","img","input","componentContainerClasses","cls","labelPosition","inputToAppend","el","label","v","required","inner","description","errorEl","element","key","parseMaskPattern","pattern","tokens","i","char","formatValue","value","result","valueIndex","token","unformatValue","tokenIndex","nextToken","getNextEditablePosition","position","direction","getMaskPlaceholder","placeholder","calculateCursorPosition","oldValue","newValue","oldCursorPosition","editableBeforeOld","editableCount","MaskEngine","mask","getPredefinedMask","customMask","cacheKey","tokens","parseMaskPattern","value","editableTokens","t","acceptedTypes","unformatted","char","formatted","formatValue","unformatValue","getMaskPlaceholder","position","token","input","previousValue","cursorPosition","unformattedInput","newCursorPosition","calculateCursorPosition","key","currentValue","isBackspace","prevEditable","getNextEditablePosition","before","after","newValue","newPos","nextEditable","TextInput","BaseInput","field","value","error","onChange","onBlur","MaskEngine","input","displayValue","maskPlaceholder","e","target","cursorPosition","inputValue","result","valueToEmit","isBackspace","pastedText","before","after","newValue","NumberInput","BaseInput","field","value","error","onChange","onBlur","MaskEngine","input","displayValue","numberField","maskPlaceholder","e","target","cursorPosition","inputValue","result","numValue","unformatted","isBackspace","pastedText","before","after","newValue","TextareaInput","BaseInput","textarea","textareaField","e","target","SelectInput","BaseInput","select","selectField","placeholderOption","option","optionEl","updatePlaceholderClass","e","target","selectedValues","opt","CheckboxInput","BaseInput","checkbox","e","target","container","label","labelText","description","errorEl","RadioInput","BaseInput","container","label","v","required","radioGroup","radioField","option","optionValue","optionLabel","radioContainer","radio","description","errorEl","SwitchInput","BaseInput","switchEl","e","target","container","label","labelText","description","errorEl","DateInput","BaseInput","input","dateField","date","e","target","FileInput","BaseInput","input","fileField","e","target","QuantityInput","BaseInput","container","quantityField","min","max","step","currentValue","inputWrapper","decrementBtn","input","incrementBtn","newValue","updateButtons","e","target","numValue","value","AccordionSelectInput","BaseInput","container","accordionField","selectedValue","option","index","optionValue","optionLabel","optionDescription","accordionItem","header","headerContent","indicator","label","arrow","content","description","customContent","toggleAccordion","isOpen","item","otherHeader","otherContent","otherArrow","selectOption","currentValues","itemIndicator","e","ImageGridSelectInput","BaseInput","container","imageGridField","selectedValue","columns","imageSize","option","optionValue","optionLabel","optionImage","optionDescription","gridItem","imageContainer","img","placeholder","indicator","label","description","selectOption","currentValues","index","item","itemIndicator","e","OTPInput","BaseInput","container","length","value","valueString","i","input","currentIndex","e","target","inputValue","digits","j","nextEmptyIndex","otpValue","otpField","finalValue","DEFAULT_SEPARATED_LENGTH","eyeSvg","visible","PasswordInput","BaseInput","pf","useSeparated","length","showToggle","input","e","wrapper","btn","value","valueString","container","i","currentIndex","chars","j","nextIdx","toggleWrap","type","inp","FileDropInput","BaseInput","fileDropField","accept","multiple","dropZone","hiddenInput","label","fileList","renderFileList","files","names","f","name","item","handleFiles","arr","e","target","LEAFLET_CSS","MapInput","BaseInput","mapField","center","zoom","value","lat","lng","container","inputsWrapper","latInput","lngInput","updateFromInputs","latVal","lngVal","mapContainer","linkId","cssLoaded","link","resolve","checkReady","L","tileLayer","invalidateSize","entries","entry","pos","e","newLat","newLng","STAR_SVG","filled","RatingInput","BaseInput","ratingField","max","half","currentValue","container","starsContainer","i","starWrapper","e","rect","val","mid","cur","newVal","value","star","idx","SliderInput","BaseInput","sliderField","min","max","step","showValue","input","e","target","val","valueSpan","wrapper","HEX_REGEX","toHex","value","m","ColorInput","BaseInput","defaultValue","currentValue","wrapper","colorPicker","textInput","syncFromPicker","hex","syncFromText","raw","MarkdownInput","BaseInput","field","mode","showToolbar","height","container","toolbar","editorWrapper","textarea","preview","tabsContainer","tabsHeader","editorTab","previewTab","contentWrapper","previewMode","content","tab","btn","button","prefix","suffix","placeholder","textareaInvisible","start","end","text","selectedText","newText","newCursorPos","value","markdown","marked","html","createInput","field","value","error","onChange","onBlur","TextInput","PasswordInput","NumberInput","TextareaInput","SelectInput","CheckboxInput","RadioInput","SwitchInput","DateInput","FileInput","FileDropInput","MapInput","RatingInput","SliderInput","ColorInput","QuantityInput","AccordionSelectInput","ImageGridSelectInput","OTPInput","MarkdownInput","div","customComponents","registerComponent","type","component","registerComponents","components","getCustomComponent","loginTemplate","registerTemplate","value","otpTemplate","contactTemplate","passwordResetTemplate","passwordChangeTemplate","profileTemplate","checkoutTemplate","feedbackTemplate","subscriptionTemplate","bookingTemplate","reviewTemplate","templates","getTemplate","templateName","extendTemplate","templateName","additionalFields","baseTemplate","getTemplate","existingFields","existingSteps","lastStep","BrowserHTMLElement","EasyForm","StateManager","schemaAttr","parseAttributeValue","value","f","attributeValue","templateAttr","extendAttr","attr","n","schema","fromAttr","merged","name","oldValue","newValue","form","input","maxAttempts","AttemptsLock","templateName","initialData","baseTemplate","getTemplate","additionalFields","extendTemplate","isArrayRefresh","preservedValues","previousWizardState","key","wasWizard","isWizard","wizardState","completedStep","finalWizardState","newFormElement","e","directionAttr","direction","showCompletedAttr","completedIndicator","completedPosition","submitConfig","submitWrapper","submitButton","formWrapper","completed","total","progressBar","track","fill","oldForm","oldWrapper","formElement","existingOverlay","overlay","message","updateCountdown","remainingMs","minutes","seconds","timeStr","spinner","currentSchema","inputs","opt","elements","child","el","raw","parsed","row","totalRows","result","template","effectiveRow","clone","existing","slotElement","container","fields","endSlots","slotClonesByRow","rowIndex","slotsForRow","field","fieldElement","isVisible","isEnabled","groupElement","rowElement","arrayElement","customElement","errors","error","isFormDisabled","labelPositionAttr","validLabelPositions","effectiveLabelPosition","fieldWithDependencies","customComponent","getCustomComponent","element","val","inputElement","createInput","fieldContainer","groupField","dir","collapsible","defaultOpen","groupContainer","header","groupContentId","labelSpan","chevron","content","subField","fullName","subFieldWithPath","setContentHeight","open","label","rowContainer","rowField","gapValue","fieldWrapper","arrayContainer","values","arrayField","minItems","maxItems","itemsContainer","i","itemContainer","itemField","itemFieldWithName","removeButton","atMinItems","newValues","addButton","atMaxItems","newItem","div","extractFields","items","count","sf","visibleRequired","v","wizardContainer","stepsIndicator","schemaStepStyle","stepEl","fieldsContainer","currentFields","navContainer","prevButton","nextButton","currentState","allErrors","stepErrors","fieldName","dependentFields","changeEvent","newArrayElement","fieldNames","allFieldsWithDeps","hasAnyFieldsWithDeps","fieldsToRerender","fn","d","parent","newFieldElement","topLevelFields","step","changedField","affectedFields","dependencyEvent","errorElement","errorEl","dot","parentName","childName","found","event","state","submitDetail","submitEvent","errorEvent","stepChangeEvent","components","registerComponents","themeAttr","colorsAttr","initialDataAttr","existingStyle","theme","colors","getColors","styles","getThemeStyles","style","stored","valuesToRestore","existingTimer","timeoutEvent","timerDisplay","handleFirstInput","timerContainer","initialTime"]}