@mindfiredigital/ignix-lite-engine 1.4.2 → 1.4.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,6 +1,6 @@
1
1
 
2
- > @mindfiredigital/ignix-lite-engine@1.4.2 build /home/runner/work/ignix-lite/ignix-lite/packages/engine
3
- > tsup && copyfiles -u 2 src/manifests/*.json dist/manifests && pnpm build:index
2
+ > @mindfiredigital/ignix-lite-engine@1.4.3 build /home/runner/work/ignix-lite/ignix-lite/packages/engine
3
+ > tsup && copyfiles -u 2 src/manifests/*.json dist/manifests && copyfiles -f ../../api-full.txt dist && pnpm build:index
4
4
 
5
5
  CLI Building entry: src/index.ts
6
6
  CLI Using tsconfig: tsconfig.json
@@ -9,14 +9,14 @@
9
9
  CLI Target: es2022
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
- ESM dist/index.js 76.59 KB
13
- ESM dist/index.js.map 145.43 KB
14
- ESM ⚡️ Build success in 93ms
12
+ ESM dist/index.js 76.73 KB
13
+ ESM dist/index.js.map 145.57 KB
14
+ ESM ⚡️ Build success in 61ms
15
15
  DTS Build start
16
- DTS ⚡️ Build success in 4312ms
16
+ DTS ⚡️ Build success in 4400ms
17
17
  DTS dist/index.d.ts 4.32 KB
18
18
 
19
- > @mindfiredigital/ignix-lite-engine@1.4.2 build:index /home/runner/work/ignix-lite/ignix-lite/packages/engine
19
+ > @mindfiredigital/ignix-lite-engine@1.4.3 build:index /home/runner/work/ignix-lite/ignix-lite/packages/engine
20
20
  > tsx src/tools/build-index.ts
21
21
 
22
22
  Vector index built
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @mindfiredigital/ignix-lite-engine
2
2
 
3
+ ## 1.4.3
4
+
5
+ ### Patch Changes
6
+
7
+ - resolve filesystem launch crash
8
+
3
9
  ## 1.4.2
4
10
 
5
11
  ### Patch Changes
@@ -0,0 +1,310 @@
1
+ ignix-lite v2. Native HTML + ~8KB CSS. Zero classes. Zero JS (95%).
2
+
3
+ ELEMENTS:
4
+ button[data-intent=primary|danger|warning|success|neutral|ghost][disabled][aria-busy][type=button|submit|reset]
5
+ input[type=text|email|password|number|date|search|tel|url|file][required][disabled][aria-invalid][data-intent=primary|danger|warning|success|neutral]
6
+ textarea[rows placeholder][disabled][required][aria-invalid][data-intent=primary|danger|warning|success|neutral]
7
+ select[data-intent=primary|danger|warning|success|neutral][disabled][required][aria-invalid][multiple]>option
8
+ label[data-intent][data-size]>(input[type=checkbox]+{Label})
9
+ label[data-intent][data-size]>(input[type=radio]+{Label})
10
+ dialog#id[data-intent=danger|warning|info]>(h2+p+button*)
11
+ details>summary+p
12
+ progress[value max]
13
+ meter[value min max low high optimum]
14
+ aside[data-intent=danger|warning|success|info]{message}
15
+ mark[data-intent=success|danger|warning|neutral]{label}
16
+ img[src alt data-size=sm|md|lg]
17
+ span[role=status][aria-busy][data-shape=text|rect|circle]
18
+ article>(img|span[slot=avatar])+(span|h1|h2|h3[slot=title])+(span|small[slot=meta])+(p[slot=body])+(button|a[slot=action])+(span|small[slot=footer])
19
+ nav>ul>(li>a[href][aria-current=page])*
20
+ nav[aria-label=Breadcrumb][data-style=chevron|slash|guillemet|arrow|thread|pipe][data-intent]>ol>(li>a)*
21
+ form#id[action][method=get|post][aria-busy][data-loading]
22
+ section[data-grid=1|2|3|4|5|6|auto|fill][data-gap][data-align][data-justify][data-dense]>article[data-col][data-row]*
23
+ hr[data-orientation=horizontal|vertical]
24
+ pre>code[data-lang=js|ts|python|bash|html|css|json]
25
+ table[is=ix-table]>thead>tr+tbody ; th[data-sortable][aria-sort=ascending|descending|none]
26
+
27
+ WEB COMPONENTS:
28
+ ix-tabs[data-variant=underline|pill|gradient]>(button[slot=tab][aria-selected])+(section[slot=panel][hidden])
29
+ ix-dropdown>(button[slot=trigger][aria-haspopup=menu][aria-expanded])+ul[slot=menu]>(li>button)*
30
+ ix-combobox>(label>(span[data-chips])+input[placeholder]+button[data-clear])+ul>(li{Option})*
31
+ ix-tooltip[content][data-position=top|bottom|left|right][data-intent=success|danger|warning]>button
32
+ ix-toast#toast[data-intent][data-variant=fade|slide|pop|action][data-position];show({title,message,intent,duration,actionText})
33
+ THEME:
34
+ :root{--ix-primary --ix-danger --ix-success --ix-surface --ix-text --ix-radius}
35
+ DARK:prefers-color-scheme
36
+ STATE:disabled|checked|open|loading|required|aria-busy|aria-invalid|aria-expanded|aria-selected|hidden|ascending|descending
37
+
38
+ RULES:
39
+ Use data-intent not class/variant/color
40
+ Use native attrs for state
41
+ Preserve slots & wrappers
42
+ Prefer semantic HTML
43
+
44
+ MCP:
45
+ npx ignix-lite mcp
46
+
47
+ TOOLS:
48
+ list_components|get_manifest|validate|how_to_build|get_emmet|check_a11y|generate_theme|preview|create_handoff|apply_handoff
49
+
50
+ INTENTS:
51
+ [caveman prompt -> emmet. match closest.]
52
+
53
+ --- BUTTONS ---
54
+ primary button / action button / main button / call to action
55
+ - button[data-intent=primary]{Label}
56
+
57
+ secondary button / cancel button / back button
58
+ - button[data-intent=secondary]{Cancel}
59
+
60
+ small button / tiny button
61
+ - button[data-intent=primary data-size=sm]{Label}
62
+
63
+ large button / big button
64
+ - button[data-intent=primary data-size=lg]{Label}
65
+
66
+ disabled button / inactive button
67
+ - button[data-intent=primary disabled]{Label}
68
+
69
+ loading button / spinner button / busy button
70
+ - button[data-intent=primary aria-busy=true]{Saving…}
71
+
72
+ --- DESTROY / DANGER ---
73
+ danger button / delete button / destructive button
74
+ - button[data-intent=danger]{Delete}
75
+
76
+ user want remove item from list
77
+ - button[data-intent=danger]{Remove}
78
+
79
+ user want cancel account / danger zone
80
+ - section>(h2{Danger Zone})+p{Cannot undo.}+button[data-intent=danger]{Delete Account}
81
+
82
+ user need confirm before destroy
83
+ - dialog#confirm[data-intent=danger]>(h2{Are you sure?})+p{This cannot be undone.}+(button{Cancel})+(button[data-intent=danger]{Delete})
84
+
85
+ --- WARN USER ---
86
+ user about to do risky thing
87
+ - dialog#warn[data-intent=warning]>(h2{Warning})+p{This will affect all users.}+(button{Cancel})+(button[data-intent=warning]{Continue})
88
+
89
+ show yellow warning banner / warning alert / warning message / session warning
90
+ - aside[data-intent=warning]{Your session will expire soon.}
91
+
92
+ --- TELL USER SUCCESS ---
93
+ thing worked. show green
94
+ - aside[data-intent=success]{Changes saved!}
95
+
96
+ show success popup / toast
97
+ - ix-toast#t[data-intent=success data-variant=slide];show({title:"Done",message:"Saved.",intent:"success",duration:3000})
98
+
99
+ --- TELL USER ERROR ---
100
+ something broke. show red
101
+ - aside[data-intent=danger]{Something went wrong. Please try again.}
102
+
103
+ input is wrong. highlight field
104
+ - label>(input[type=text aria-invalid=true data-intent=danger]+span{Error message here})
105
+
106
+ show error popup
107
+ - ix-toast#t[data-intent=danger data-variant=pop];show({title:"Error",message:"Failed.",intent:"danger"})
108
+
109
+ --- SHOW INFO ---
110
+ neutral info banner / tip
111
+ - aside[data-intent=info]{Your data syncs every 5 minutes.}
112
+
113
+ --- LOADING / ASYNC ---
114
+ button doing async work right now
115
+ - button[aria-busy=true data-intent=primary]{Saving…}
116
+
117
+ whole form submitting
118
+ - form#f[aria-busy=true]>(label{Email}+input[type=email])+button[type=submit aria-busy=true]{Submitting…}
119
+
120
+ page section loading / loading skeleton / rectangular skeleton / rect skeleton / skeleton rectangle
121
+ - span[role=status aria-busy=true data-shape=rect]
122
+
123
+ avatar with skeleton / avatar and loading / profile image with skeleton
124
+ - img[src=? alt="User" data-size=md]+span[role=status aria-busy=true data-shape=rect]
125
+
126
+ show skeleton card while data loads
127
+ - article>(span[slot=avatar aria-busy data-shape=circle])+(span[slot=title aria-busy data-shape=text])+(p[slot=body aria-busy data-shape=text])
128
+
129
+ --- USER INPUT: TEXT ---
130
+ user type text
131
+ - label{Label}+input[type=text]
132
+
133
+ user type email
134
+ - label{Email}+input[type=email required]
135
+
136
+ user type password
137
+ - label{Password}+input[type=password required]
138
+
139
+ user type number
140
+ - label{Amount}+input[type=number]
141
+
142
+ user type phone
143
+ - label{Phone}+input[type=tel]
144
+
145
+ user type url
146
+ - label{Website}+input[type=url]
147
+
148
+ user pick date
149
+ - label{Date}+input[type=date]
150
+
151
+ user search / filter list
152
+ - label{Search}+input[type=search]
153
+
154
+ search bar with button / search input and button / search with submit
155
+ - label{Search}+input[type=search]+button[type=submit data-intent=primary]{Search}
156
+
157
+ user upload file
158
+ - label{Upload}+input[type=file]
159
+
160
+ user write long text / bio / message
161
+ - label{Message}+textarea[rows=4 placeholder="Type here…"]
162
+
163
+ --- USER INPUT: CHOICE ---
164
+ user pick one from dropdown list
165
+ - select[required]>(option{Choose…})+(option[value=a]{Option A})+(option[value=b]{Option B})
166
+
167
+ user pick one with radio buttons
168
+ - (label>(input[type=radio name=g value=a]+{Option A}))+(label>(input[type=radio name=g value=b]+{Option B}))
169
+
170
+ user toggle yes/no with checkbox / checkbox input / accept terms / agree terms
171
+ - label>(input[type=checkbox]+{I agree to terms})
172
+
173
+ user pick many items / multi-select chips
174
+ - ix-combobox>(label>(span[data-chips])+input[placeholder="Search…"]+button[data-clear])+ul>(li{Option A})+(li{Option B})+(li{Option C})
175
+
176
+ --- FORM ---
177
+ basic form with submit
178
+ - form#f[method=post]>(label{Name}+input[type=text required])+button[type=submit data-intent=primary]{Submit}
179
+
180
+ login form / sign in form / email password form / form with email and password
181
+ - form#login>(label{Email}+input[type=email required])+(label{Password}+input[type=password required])+button[type=submit data-intent=primary]{Sign In}
182
+
183
+ login form with avatar / login with profile picture
184
+ - form#login>(img[src=? alt="User avatar" data-size=md])+(label{Email}+input[type=email required])+(label{Password}+input[type=password required])+button[type=submit data-intent=primary]{Sign In}
185
+
186
+ signup / register form
187
+ - form#signup>(label{Name}+input[type=text required])+(label{Email}+input[type=email required])+(label{Password}+input[type=password required])+button[type=submit data-intent=primary]{Create Account}
188
+
189
+ contact / message form
190
+ - form#contact>(label{Name}+input[type=text required])+(label{Email}+input[type=email required])+(label{Message}+textarea[rows=5 required])+button[type=submit data-intent=primary]{Send}
191
+
192
+ settings form with save button
193
+ - form#settings>(label{Display Name}+input[type=text])+(label{Email}+input[type=email])+button[type=submit data-intent=primary]{Save Changes}
194
+
195
+ --- NAVIGATION ---
196
+ top nav / menu links
197
+ - nav>ul>(li>a[href=/]{Home})+(li>a[href=/about]{About})+(li>a[href=/contact]{Contact})
198
+
199
+ breadcrumb trail
200
+ - nav[aria-label=Breadcrumb data-style=chevro]n>ol>(li>a[href=/]{Home})+(li>a[href=/settings]{Settings})+(li[aria-current="page"]{Profile})
201
+
202
+ tabs / tabbed sections
203
+ - ix-tabs[data-variant=underline]>(button[slot=tab aria-selected=true]{Tab 1})+(button[slot=tab]{Tab 2})+(section[slot=panel]{Content 1})+(section[slot=panel hidden]{Content 2})
204
+
205
+ pill tabs
206
+ - ix-tabs[data-variant=pill]>(button[slot=tab aria-selected=true]{Overview})+(button[slot=tab]{Details})+(section[slot=panel]{…})+(section[slot=panel hidden]{…})
207
+
208
+ --- DROPDOWN / MENU ---
209
+ button that opens menu
210
+ - ix-dropdown>(button[slot=trigger aria-haspopup=menu aria-expanded=false]{Options ▾})+ul[slot=menu]>(li>button{Edit})+(li>button{Duplicate})+(li>button[data-intent=danger]{Delete})
211
+
212
+ user avatar menu / profile menu
213
+ - ix-dropdown>(button[slot=trigger aria-haspopup=menu aria-expanded=false]{Profile ▾})+ul[slot=menu]>(li>a[href=/profile]{My Profile})+(li>a[href=/settings]{Settings})+(li>button[data-intent=danger]{Sign Out})
214
+
215
+ --- TOOLTIP / HINT ---
216
+ show hint on hover / tooltip / hover hint
217
+ - ix-tooltip[content="More info here" data-position=top]>button{?}
218
+
219
+ show danger warning on hover / tooltip on delete button / danger tooltip
220
+ - ix-tooltip[content="This will delete everything" data-intent=danger data-position=top]>button[data-intent=danger]{Delete}
221
+
222
+ --- BADGE / LABEL / TAG ---
223
+ green status badge
224
+ - mark[data-intent=success]{Active}
225
+
226
+ red status badge / error tag
227
+ - mark[data-intent=danger]{Failed}
228
+
229
+ yellow warning tag
230
+ - mark[data-intent=warning]{Pending}
231
+
232
+ neutral grey tag
233
+ - mark[data-intent=neutral]{Draft}
234
+
235
+ --- CARD ---
236
+ user profile card
237
+ - article>(img[slot=avatar src=? alt="User photo" data-size=md])+(h2[slot=title]{Name})+(small[slot=meta]{Role})+(p[slot=body]{Short bio here.})+(button[slot=action data-intent=primary]{View Profile})
238
+
239
+ product card
240
+ - article>(img[slot=avatar src=? alt="Product"])+(h3[slot=title]{Product Name})+(small[slot=meta]{$29.99})+(p[slot=body]{Short description.})+(a[slot=action href=? data-intent=primary]{Buy Now})
241
+
242
+ simple content card / info card
243
+ - article>(h3[slot=title]{Card Title})+(p[slot=body]{Card body content goes here.})+(button[slot=action data-intent=ghost]{Learn More})
244
+
245
+ --- ACCORDION / FAQ ---
246
+ expandable section / FAQ item
247
+ - details>summary{Question goes here?}+p{Answer goes here.}
248
+
249
+ multiple FAQ items
250
+ - (details>summary{Question 1}+p{Answer 1})+(details>summary{Question 2}+p{Answer 2})+(details>summary{Question 3}+p{Answer 3})
251
+
252
+ default open accordion
253
+ - details[open]>summary{Already Open}+p{This is visible by default.}
254
+
255
+ --- PROGRESS / METER ---
256
+ show how far along task is
257
+ - progress[value=60 max=100]
258
+
259
+ show health / score / level gauge
260
+ - meter[value=7 min=0 max=10 low=3 high=8 optimum=9]
261
+
262
+ --- TABLE ---
263
+ data table with sort
264
+ - table[is=ix-table]>(thead>tr>(th[data-sortable aria-sort=ascending]{Name})+(th[data-sortable aria-sort=ascending]{Status})+(th{Actions}))+(tbody>tr>(td{Row 1})+(td>mark[data-intent=success]{Active})+(td>button[data-intent=danger]{Delete}))
265
+
266
+ --- CODE / PREFORMATTED ---
267
+ show code snippet
268
+ - pre>code[data-lang=js]{const x = 1;}
269
+
270
+ --- DIVIDER ---
271
+ horizontal line / separator
272
+ - hr[data-orientation=horizontal]
273
+
274
+ vertical divider between items
275
+ - hr[data-orientation=vertical]
276
+
277
+ --- AVATAR / IMAGE ---
278
+ user avatar small
279
+ - img[src=? alt="User" data-size=sm]
280
+
281
+ user avatar large
282
+ - img[src=? alt="User" data-size=lg]
283
+
284
+ --- GRID LAYOUT ---
285
+ 2-column card grid
286
+ - section[data-grid=2 data-gap]>(article{Card 1})+(article{Card 2})+(article{Card 3})+(article{Card 4})
287
+
288
+ 3-column responsive grid
289
+ - section[data-grid=3 data-gap]>(article{A})+(article{B})+(article{C})
290
+
291
+ auto-fill responsive grid
292
+ - section[data-grid=fill data-gap]>(article{Item})*6
293
+
294
+ --- FULL PAGE PATTERNS ---
295
+ settings page with danger zone
296
+ - main>(form#settings>(label{Email}+input[type=email])+button[type=submit data-intent=primary]{Save})+(section>(h2{Danger Zone})+button[data-intent=danger]{Delete Account})
297
+
298
+ dashboard with cards and table
299
+ - main>(section[data-grid=3 data-gap]>(article>(h3[slot=title]{Users})+(p[slot=body]{142}))+(article>(h3[slot=title]{Revenue})+(p[slot=body]{$4,200}))+(article>(h3[slot=title]{Issues})+(p[slot=body]>mark[data-intent=danger]{3 open})))+(table[is=ix-table]>(thead>tr>(th[data-sortable aria-sort=ascending]{Name})+(th{Status}))+(tbody>tr>(td{Alice})+(td>mark[data-intent=success]{Active})))
300
+
301
+ login page
302
+ - main>(h1{Sign In})+(form#login>(label{Email}+input[type=email required])+(label{Password}+input[type=password required])+button[type=submit data-intent=primary]{Sign In})
303
+
304
+ --- NEVER DO ---
305
+ never use class= - use data-intent
306
+ never use variant= - use data-intent
307
+ never use color= - use data-intent
308
+ never use isDisabled= - use disabled
309
+ never use isLoading= - use aria-busy=true
310
+ never use onClick on CSS component - CSS-only, no JS handler needed
package/dist/index.js CHANGED
@@ -1497,11 +1497,14 @@ function parseIntents(raw) {
1497
1497
  function loadIntents() {
1498
1498
  try {
1499
1499
  const currentDir = path3.dirname(fileURLToPath3(import.meta.url));
1500
+ const pathDist = path3.resolve(currentDir, "./api-full.txt");
1500
1501
  const path1 = path3.resolve(currentDir, "../../../api-full.txt");
1501
1502
  const path22 = path3.resolve(currentDir, "../../api-full.txt");
1502
1503
  const path32 = path3.resolve(currentDir, "../../../../api-full.txt");
1503
- let txtPath = path1;
1504
- if (existsSync3(path1)) {
1504
+ let txtPath = pathDist;
1505
+ if (existsSync3(pathDist)) {
1506
+ txtPath = pathDist;
1507
+ } else if (existsSync3(path1)) {
1505
1508
  txtPath = path1;
1506
1509
  } else if (existsSync3(path22)) {
1507
1510
  txtPath = path22;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/manifests/index.ts","../src/utils/tokenizer.ts","../src/tools/validator.ts","../src/tools/check-a11y.ts","../src/utils/a11y-rules.ts","../src/tools/theme-palette.ts","../src/tools/theme-tokens.ts","../src/tools/search-index.ts","../src/tools/embedder.ts","../src/utils/cosine.ts","../src/utils/intent-helpers.ts","../src/utils/intent-parser.ts","../src/utils/emmet-helpers.ts","../src/tools/intent-engine.ts","../src/tools/preview.ts","../src/tools/handoff.ts","../src/tools/generate-theme.ts","../src/tools/get-emmet.ts","../src/tools/get-manifests.ts","../src/tools/list-components.ts","../src/tools/token-counter.ts"],"sourcesContent":["import { readFileSync, existsSync } from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\nimport type { Manifest } from '../types.js'\nimport { getTokenCount } from '../utils/tokenizer.js'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\nfunction loadManifest(file: string): Manifest {\n let manifestsDir = path.resolve(__dirname, 'manifests')\n if (!existsSync(manifestsDir) && existsSync(path.resolve(__dirname, file))) {\n manifestsDir = __dirname\n }\n const manifestPath = path.resolve(manifestsDir, file)\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as Manifest\n manifest.tokens = getTokenCount(manifest.emmet)\n return manifest\n}\n\nexport const manifests: Record<string, Manifest> = {\n accordion: loadManifest('accordion.json'),\n alert: loadManifest('alert.json'),\n avatar: loadManifest('avatar.json'),\n badge: loadManifest('badge.json'),\n breadcrumb: loadManifest('breadcrumb.json'),\n button: loadManifest('button.json'),\n card: loadManifest('card.json'),\n checkbox: loadManifest('checkbox.json'),\n codeblock: loadManifest('codeblock.json'),\n combobox: loadManifest('combobox.json'),\n dialog: loadManifest('dialog.json'),\n divider: loadManifest('divider.json'),\n dropdown: loadManifest('dropdown.json'),\n form: loadManifest('form.json'),\n grid: loadManifest('grid.json'),\n input: loadManifest('input.json'),\n meter: loadManifest('meter.json'),\n navigation: loadManifest('navigation.json'),\n progress: loadManifest('progress.json'),\n radio: loadManifest('radio.json'),\n select: loadManifest('select.json'),\n skeleton: loadManifest('skeleton.json'),\n tab: loadManifest('tab.json'),\n table: loadManifest('table.json'),\n textarea: loadManifest('textarea.json'),\n toast: loadManifest('toast.json'),\n tooltip: loadManifest('tooltip.json')\n}\n","import { encoding_for_model } from 'tiktoken'\n\nconst encoder = encoding_for_model('gpt-4')\n\nexport function getTokenCount(input: string): number {\n return encoder.encode(input).length\n}\n","import { parse } from 'node-html-parser'\nimport { manifests } from '../manifests/index.js'\nimport type { ManifestSlot } from '../types.js'\n\ntype ErrorType =\n | 'UNKNOWN_ATTRIBUTE'\n | 'INVALID_VALUE'\n | 'FORBIDDEN_CLASS'\n | 'MISSING_REQUIRED'\n | 'WRONG_ELEMENT'\n | 'PROP_EXPLOSION'\n | 'JS_ON_CSS_COMPONENT'\n | 'MISSING_SLOT'\n\nexport type ValidationError = {\n element: string\n prop: string\n type: ErrorType\n message: string\n suggestion?: string\n valid_values?: string[]\n fix: string\n confidence: number\n line: number\n}\n\nfunction getLineNumber(html: string, index: number): number {\n if (index === undefined || index === null) return 1\n return html.substring(0, index).split('\\n').length\n}\n\nexport function validateHtml(html: string): { valid: boolean, score: number, errors: ValidationError[] } {\n const root = parse(html)\n const errors: ValidationError[] = []\n const elements = root.querySelectorAll('*')\n\n const allowedWrappers = [\n 'label',\n 'span',\n 'p',\n 'img',\n 'small',\n 'h1',\n 'h2',\n 'h3',\n 'a',\n 'button',\n 'ul',\n 'li',\n 'thead',\n 'tbody',\n 'tr',\n 'td',\n 'th',\n 'summary',\n 'strong',\n 'code',\n 'em',\n 'b',\n 'i',\n 'time'\n ]\n\n const nativeAttributes = new Set([\n 'id',\n 'role',\n 'slot',\n 'tabindex',\n 'aria-label',\n 'aria-live',\n 'aria-hidden',\n 'aria-expanded',\n 'aria-selected',\n 'aria-current',\n 'aria-sort',\n 'aria-invalid',\n 'aria-describedby',\n 'aria-labelledby',\n 'aria-haspopup',\n 'aria-busy',\n 'disabled',\n 'required',\n 'checked',\n 'multiple',\n 'readonly',\n 'type',\n 'value',\n 'placeholder',\n 'name',\n 'autocomplete',\n 'min',\n 'max',\n 'low',\n 'high',\n 'optimum',\n 'rows',\n 'open',\n 'hidden',\n 'href',\n 'content',\n 'is',\n 'src',\n 'alt',\n 'data-intent',\n 'data-position',\n 'data-variant',\n 'data-shape',\n 'data-sortable',\n 'data-open',\n 'data-lines',\n 'data-grid',\n 'data-gap',\n 'data-align',\n 'data-justify',\n 'data-col',\n 'data-row',\n 'data-dense',\n 'data-ix-manifest'\n ])\n\n for (const el of elements) {\n const tag = el.tagName.toLowerCase()\n const attrs = el.attributes\n const startIdx = el.range ? el.range[0] : 0\n const line = getLineNumber(html, startIdx)\n\n const dataIxManifest = el.getAttribute('data-ix-manifest')\n let manifestKey = dataIxManifest || (tag.startsWith('ix-') ? tag.slice(3) : tag)\n\n if (tag === 'table' && attrs.is === 'ix-table') {\n manifestKey = 'table'\n }\n\n if (tag === 'nav') {\n manifestKey = 'navigation'\n }\n\n if (tag === 'article' && el.querySelector('[slot]')) {\n manifestKey = 'card'\n }\n\n if (tag === 'aside') {\n manifestKey = 'alert'\n }\n\n if (tag === 'details') {\n manifestKey = 'accordion'\n }\n\n if (tag === 'hr') {\n manifestKey = 'divider'\n }\n\n let manifest = manifests[manifestKey]\n\n if (!manifest) {\n if (tag === 'mark') {\n manifest = manifests.badge\n }\n if (tag === 'span' && attrs.role === 'status') {\n manifest = manifests.badge\n }\n }\n\n if (!manifest && !allowedWrappers.includes(tag)) {\n errors.push({\n element: tag,\n prop: '',\n type: 'WRONG_ELEMENT',\n message: `<${tag}> is not a valid ignix-lite component`,\n fix: `<button>Fix me</button>`,\n confidence: 0.7,\n line\n })\n continue\n }\n\n if (!manifest) continue\n\n const elementName = tag.startsWith('ix-') ? tag : manifest.element || tag\n\n if (manifest.required_wrapper) {\n const parent = el.parentNode as unknown as { tagName?: string }\n if (!parent || parent.tagName?.toLowerCase() !== manifest.required_wrapper) {\n errors.push({\n element: tag,\n prop: 'wrapper',\n type: 'MISSING_REQUIRED',\n message: `<${tag}> must be inside <${manifest.required_wrapper}>`,\n fix: `<${manifest.required_wrapper}><${elementName}></${elementName}></${manifest.required_wrapper}>`,\n confidence: 0.95,\n line\n })\n }\n }\n\n if (tag === 'span' && manifest.component === 'badge' && attrs.role !== 'status') {\n errors.push({\n element: tag,\n prop: 'role',\n type: 'INVALID_VALUE',\n message: 'span badge must have role=status',\n fix: `<span role=\"status\">${el.innerText}</span>`,\n confidence: 0.9,\n line\n })\n }\n\n if ('class' in attrs) {\n errors.push({\n element: tag,\n prop: 'class',\n type: 'FORBIDDEN_CLASS',\n message: 'class attribute not allowed',\n fix: `<${elementName}>${el.innerText}</${elementName}>`,\n confidence: 0.99,\n line\n })\n }\n\n const nonFreeAttrs = Object.keys(attrs).filter(\n (key) => key !== 'id' && key !== 'role' && !key.startsWith('aria-')\n )\n if (nonFreeAttrs.length > 4) {\n errors.push({\n element: tag,\n prop: 'multiple',\n type: 'PROP_EXPLOSION',\n message: 'Too many props',\n fix: `<${elementName}></${elementName}>`,\n confidence: 0.85,\n line\n })\n }\n\n for (const attr of Object.keys(attrs)) {\n if (attr.startsWith('on')) {\n errors.push({\n element: tag,\n prop: attr,\n type: 'JS_ON_CSS_COMPONENT',\n message: 'JS handlers forbidden',\n fix: `<${elementName}></${elementName}>`,\n confidence: 0.95,\n line\n })\n }\n }\n\n for (const attr of Object.keys(attrs)) {\n if (manifest.forbidden_props?.includes(attr)) {\n errors.push({\n element: tag,\n prop: attr,\n type: 'UNKNOWN_ATTRIBUTE',\n message: `'${attr}' forbidden`,\n fix: `<${elementName}></${elementName}>`,\n confidence: 0.98,\n line\n })\n continue\n }\n\n if (!manifest.props?.[attr] && !nativeAttributes.has(attr)) {\n errors.push({\n element: tag,\n prop: attr,\n type: 'UNKNOWN_ATTRIBUTE',\n message: `'${attr}' invalid`,\n fix: `<${elementName}></${elementName}>`,\n confidence: 0.95,\n line\n })\n }\n }\n\n for (const attr of Object.keys(attrs)) {\n const def = manifest.props?.[attr]\n if (def?.values) {\n const value = attrs[attr]\n if (!def.values.includes(value)) {\n errors.push({\n element: tag,\n prop: attr,\n type: 'INVALID_VALUE',\n message: `'${value}' invalid`,\n valid_values: def.values,\n fix: `<${elementName} ${attr}=\"${def.values[0]}\"></${elementName}>`,\n confidence: 0.97,\n line\n })\n }\n }\n }\n\n for (const req of manifest.required_props || []) {\n if (!(req in attrs)) {\n errors.push({\n element: tag,\n prop: req,\n type: 'MISSING_REQUIRED',\n message: `Missing ${req}`,\n fix: `<${elementName} ${req}=\"\"></${elementName}>`,\n confidence: 0.9,\n line\n })\n }\n }\n\n const slots = manifest.slots ?? {}\n for (const [slotName, slotDefVal] of Object.entries(slots)) {\n const slotDef = slotDefVal as ManifestSlot\n const child = el.querySelector(`[slot=\"${slotName}\"]`)\n\n if (slotDef.required && !child) {\n errors.push({\n element: tag,\n prop: slotName,\n type: 'MISSING_SLOT',\n message: `Missing slot ${slotName}`,\n fix: `<${elementName}><span slot=\"${slotName}\"></span></${elementName}>`,\n confidence: 0.95,\n line\n })\n }\n\n if (child && slotDef.element) {\n const childTag = child.tagName.toLowerCase()\n if (!slotDef.element.includes(childTag)) {\n errors.push({\n element: childTag,\n prop: slotName,\n type: 'INVALID_VALUE',\n message: `${childTag} invalid for slot ${slotName}`,\n valid_values: slotDef.element,\n fix: `<${slotDef.element[0]} slot=\"${slotName}\"></${slotDef.element[0]}>`,\n confidence: 0.95,\n line\n })\n }\n }\n }\n }\n\n const valid = errors.length === 0\n const score = valid ? 100 : Math.max(0, 100 - errors.length * 10)\n\n return {\n valid,\n score,\n errors\n }\n}\n","import { parse } from 'node-html-parser'\nimport type { A11yIssue, RuleResult } from '../utils/a11y-types.js'\nimport {\n checkImages,\n checkFormLabels,\n checkEmptyLabels,\n checkButtons,\n checkLinks,\n checkAriaStates,\n checkDuplicateIds,\n checkTabIndex,\n checkHeadings,\n checkTables,\n checkDialogs,\n checkRoles,\n checkAutocomplete,\n checkFocusStyle,\n checkLang\n} from '../utils/a11y-rules.js'\n\nconst RULE_CONFIDENCES: Record<string, { error: number; warning: number }> = {\n 'WCAG 1.1.1 Non-text Content': { error: 0.99, warning: 0.80 },\n 'WCAG 1.3.1 Form Labels': { error: 0.98, warning: 0.78 },\n 'WCAG 2.4.6 Empty Labels': { error: 0.95, warning: 0.75 },\n 'WCAG 4.1.2 Button Names': { error: 0.99, warning: 0.80 },\n 'WCAG 2.4.4 Link Purpose': { error: 0.97, warning: 0.75 },\n 'WCAG 3.3.1 Error Identification': { error: 0.98, warning: 0.75 },\n 'WCAG 4.1.2 ARIA State Values': { error: 0.96, warning: 0.75 },\n 'WCAG 4.1.1 Parsing': { error: 0.99, warning: 0.80 },\n 'WCAG 2.1.1 Keyboard': { error: 0.95, warning: 0.75 },\n 'WCAG 2.4.6 Heading Hierarchy': { error: 0.95, warning: 0.75 },\n 'WCAG 1.3.1 Table Structure': { error: 0.97, warning: 0.75 },\n 'WCAG 4.1.2 Dialog Accessibility': { error: 0.98, warning: 0.75 },\n 'WCAG 4.1.2 ARIA Role Requirements': { error: 0.98, warning: 0.75 },\n 'WCAG 1.3.5 Input Purpose': { error: 0.95, warning: 0.75 },\n 'WCAG 2.4.7 Focus Visible': { error: 0.95, warning: 0.75 },\n 'WCAG 3.1.1 Language of Page': { error: 0.99, warning: 0.80 }\n}\n\nfunction getConfidenceForRule(\n ruleName: string,\n type: 'error' | 'warning'\n): number {\n const conf = RULE_CONFIDENCES[ruleName]\n if (conf) {\n return type === 'error' ? conf.error : conf.warning\n }\n return type === 'error' ? 0.98 : 0.75\n}\n\nfunction computeScore(issues: A11yIssue[]): number {\n const errors = issues.filter((i) => i.type === 'error').length\n const warnings = issues.filter((i) => i.type === 'warning').length\n return Math.max(0, 100 - errors * 10 - warnings * 3)\n}\n\nfunction getPassingRules(results: RuleResult[]): string[] {\n return results.filter((r) => r.issues.length === 0).map((r) => r.ruleName)\n}\n\nexport function auditA11y(html: string): { score: number; passes: string[]; issues: A11yIssue[]; wcag: string } {\n const root = parse(html)\n\n const results: RuleResult[] = [\n checkImages(root),\n checkFormLabels(root),\n checkEmptyLabels(root),\n checkButtons(root),\n checkLinks(root),\n checkAriaStates(root),\n checkDuplicateIds(root),\n checkTabIndex(root),\n checkHeadings(root),\n checkTables(root),\n checkDialogs(root),\n checkRoles(root),\n checkAutocomplete(root),\n checkFocusStyle(root),\n checkLang(root)\n ]\n\n const rawIssues = results.flatMap((r) => r.issues)\n const issues: A11yIssue[] = rawIssues.map((i) => ({\n ...i,\n confidence: getConfidenceForRule(i.rule, i.type)\n }))\n const passes = getPassingRules(results)\n const score = computeScore(issues)\n\n return {\n score,\n passes,\n issues,\n wcag: 'AA'\n }\n}\n","import type { HTMLElement } from 'node-html-parser'\nimport type { A11yIssue, RuleResult } from './a11y-types.js'\n\nfunction injectAttr(outerHTML: string, attr: string, value: string): string {\n return outerHTML.replace(/^(<[a-zA-Z][a-zA-Z0-9-]*)/, `$1 ${attr}=\"${value}\"`)\n}\n\nfunction clip(str: string, max = 200): string {\n return str.length > max ? str.slice(0, max) + '...' : str\n}\n\nfunction isDecorative(img: HTMLElement): boolean {\n const role = img.getAttribute('role')\n const ariaHidden = img.getAttribute('aria-hidden')\n return role === 'presentation' || role === 'none' || ariaHidden === 'true'\n}\n\n// Returns IDs from an ARIA reference attribute that do not exist in the DOM\nfunction findBrokenAriaRefs(\n el: HTMLElement,\n attr: string,\n root: HTMLElement\n): string[] {\n const val = el.getAttribute(attr)\n if (!val?.trim()) return []\n return val\n .trim()\n .split(/\\s+/)\n .filter((id) => !root.querySelector(`[id=\"${id}\"]`))\n}\n\n// Walks child nodes skipping any subtree rooted at aria-hidden=\"true\"\nfunction getVisibleText(el: HTMLElement): string {\n if (el.getAttribute('aria-hidden') === 'true') return ''\n let result = ''\n for (const child of el.childNodes) {\n if (child.nodeType === 1) {\n result += getVisibleText(child as HTMLElement)\n } else if (child.nodeType === 3) {\n result += child.text ?? ''\n }\n }\n return result\n}\n\nfunction getAccessibleName(el: HTMLElement, root: HTMLElement): string {\n const text = getVisibleText(el).trim()\n if (text) return text\n\n const ariaLabel = el.getAttribute('aria-label')?.trim()\n if (ariaLabel) return ariaLabel\n\n const title = el.getAttribute('title')?.trim()\n if (title) return title\n\n const childImg = el.querySelector('img')\n const childAlt = childImg?.getAttribute('alt')?.trim()\n if (childAlt) return childAlt\n\n const labelledBy = el.getAttribute('aria-labelledby')\n if (labelledBy) {\n const name = labelledBy\n .trim()\n .split(/\\s+/)\n .map((id) => root.querySelector(`[id=\"${id}\"]`)?.text.trim() ?? '')\n .join(' ')\n .trim()\n if (name) return name\n }\n\n return ''\n}\n\nexport function checkImages(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 1.1.1 Non-text Content'\n const issues: A11yIssue[] = []\n\n root.querySelectorAll('img').forEach((img) => {\n const alt = img.getAttribute('alt')\n const ariaLabel = img.getAttribute('aria-label')?.trim()\n const labelledBy = img.getAttribute('aria-labelledby')\n const hasAriaName = !!(ariaLabel || labelledBy)\n\n if (alt === undefined) {\n if (hasAriaName) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(img.outerHTML),\n message:\n '<img> uses aria-label/aria-labelledby but the alt attribute is recommended for broader screen reader compatibility',\n fix: injectAttr(\n img.outerHTML,\n 'alt',\n ariaLabel ?? '[Describe the image]'\n )\n })\n } else {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(img.outerHTML),\n message: '<img> is missing the alt attribute',\n fix: injectAttr(img.outerHTML, 'alt', '[Describe the image]')\n })\n }\n return\n }\n\n if (alt.trim() === '' && !isDecorative(img)) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(img.outerHTML),\n message:\n '<img> has an empty alt but is not marked as decorative - add role=\"presentation\" or provide a description',\n fix: injectAttr(img.outerHTML, 'role', 'presentation')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkFormLabels(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 1.3.1 Form Labels'\n const issues: A11yIssue[] = []\n const UNLABELED_SKIP = new Set([\n 'hidden',\n 'submit',\n 'reset',\n 'button',\n 'image'\n ])\n\n for (const tag of ['input', 'select', 'textarea'] as const) {\n root.querySelectorAll(tag).forEach((el) => {\n if (tag === 'input') {\n const type = (el.getAttribute('type') ?? 'text').toLowerCase()\n if (UNLABELED_SKIP.has(type)) return\n }\n\n const id = el.getAttribute('id')\n const hasExplicit = id\n ? !!root.querySelector(`label[for=\"${id}\"]`)\n : false\n const hasImplicit = !!el.closest('label')\n const ariaLabel = el.getAttribute('aria-label')?.trim()\n const ariaLabelledBy = el.getAttribute('aria-labelledby')\n const hasTitle = !!el.getAttribute('title')?.trim()\n\n if (\n !hasExplicit &&\n !hasImplicit &&\n !ariaLabel &&\n !ariaLabelledBy &&\n !hasTitle\n ) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `<${tag}> is not associated with a <label> - use for/id, wrapping label, or aria-label`,\n fix: id\n ? `<label for=\"${id}\">[Label text]</label>\\n${el.outerHTML}`\n : `<label>[Label text] ${el.outerHTML}</label>`\n })\n return\n }\n\n // Verify aria-labelledby targets actually exist in the DOM\n if (ariaLabelledBy) {\n const broken = findBrokenAriaRefs(el, 'aria-labelledby', root)\n if (broken.length > 0) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `<${tag}> aria-labelledby references non-existent element(s): ${broken.map((id) => `#${id}`).join(', ')}`,\n fix: `Ensure element(s) with id=\"${broken.join('\", \"')}\" exist in the DOM, or use aria-label instead`\n })\n }\n }\n })\n }\n\n root.querySelectorAll('fieldset').forEach((fieldset) => {\n const legend = fieldset.querySelector('legend')\n if (!legend || !legend.text.trim()) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: '<fieldset>',\n message:\n '<fieldset> must have a non-empty <legend> to group related form controls',\n fix: `<fieldset>\\n <legend>[Group label]</legend>\\n ...\\n</fieldset>`\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkEmptyLabels(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 2.4.6 Empty Labels'\n const issues: A11yIssue[] = []\n\n root.querySelectorAll('label').forEach((label) => {\n const hasText = !!label.text.trim()\n const hasAriaLabel = !!label.getAttribute('aria-label')?.trim()\n\n if (!hasText && !hasAriaLabel) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(label.outerHTML),\n message:\n '<label> is empty and provides no accessible name for its control',\n fix: label.outerHTML.replace('</label>', '[Label text]</label>')\n })\n }\n\n // Check broken label[for] association\n const forAttr = label.getAttribute('for')\n if (forAttr && !root.querySelector(`[id=\"${forAttr}\"]`)) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(label.outerHTML),\n message: `<label for=\"${forAttr}\"> references id=\"${forAttr}\" which does not exist in the DOM`,\n fix: `Add id=\"${forAttr}\" to the target form element, or correct the for attribute`\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkButtons(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 4.1.2 Button Names'\n const issues: A11yIssue[] = []\n\n root.querySelectorAll('button').forEach((button) => {\n if (!getAccessibleName(button, root)) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(button.outerHTML),\n message:\n '<button> has no accessible name - add text content, aria-label, or a child <img> with alt',\n fix: injectAttr(button.outerHTML, 'aria-label', '[Action description]')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkLinks(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 2.4.4 Link Purpose'\n const issues: A11yIssue[] = []\n const VAGUE = new Set([\n 'click here',\n 'here',\n 'read more',\n 'more',\n 'link',\n 'click',\n 'learn more',\n 'details',\n 'info'\n ])\n\n root.querySelectorAll('a').forEach((link) => {\n const name = getAccessibleName(link, root)\n const href = link.getAttribute('href')\n const isButtonRole = link.getAttribute('role') === 'button'\n\n if (!name) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(link.outerHTML),\n message:\n '<a> has no accessible name - add text, aria-label, or a child <img> with alt',\n fix: injectAttr(\n link.outerHTML,\n 'aria-label',\n '[Describe the link destination]'\n )\n })\n return\n }\n\n if (VAGUE.has(name.toLowerCase())) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(link.outerHTML),\n message: `<a> has non-descriptive text \"${name}\" - use aria-label to clarify the destination`,\n fix: injectAttr(\n link.outerHTML,\n 'aria-label',\n '[Describe where this link goes]'\n )\n })\n }\n\n if (!href && !isButtonRole) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(link.outerHTML),\n message:\n '<a> has no href - use <button> for actions, or add a valid href',\n fix: link.outerHTML.replace(/^<a\\b/, '<a href=\"#\"')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkAriaStates(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 3.3.1 Error Identification'\n const issues: A11yIssue[] = []\n\n // aria-invalid=\"true\" must have aria-describedby pointing to an existing element\n root.querySelectorAll('[aria-invalid]').forEach((el) => {\n const invalidVal = el.getAttribute('aria-invalid')\n const VALID_INVALID_VALUES = new Set([\n 'false',\n 'true',\n 'grammar',\n 'spelling'\n ])\n\n if (!VALID_INVALID_VALUES.has(invalidVal ?? '')) {\n issues.push({\n type: 'warning',\n rule: 'WCAG 4.1.2 ARIA State Values',\n element: clip(el.outerHTML),\n message: `aria-invalid=\"${invalidVal}\" is not valid - use \"true\", \"false\", \"grammar\", or \"spelling\"`,\n fix: el.outerHTML.replace(\n `aria-invalid=\"${invalidVal}\"`,\n 'aria-invalid=\"true\"'\n )\n })\n return\n }\n\n if (invalidVal === 'true') {\n const describedBy = el.getAttribute('aria-describedby')\n if (!describedBy) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message:\n 'Element with aria-invalid=\"true\" must have aria-describedby pointing to the error message element',\n fix: injectAttr(el.outerHTML, 'aria-describedby', 'error-message-id')\n })\n } else {\n // Verify the describedby target exists\n const broken = findBrokenAriaRefs(el, 'aria-describedby', root)\n if (broken.length > 0) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `aria-describedby references non-existent element(s): ${broken.map((id) => `#${id}`).join(', ')}`,\n fix: `Ensure element(s) with id=\"${broken.join('\", \"')}\" exist in the DOM`\n })\n }\n }\n }\n })\n\n // Strictly boolean ARIA attributes (only \"true\" or \"false\" valid)\n const BOOLEAN_ARIA_ATTRS = [\n 'aria-busy',\n 'aria-expanded',\n 'aria-selected',\n 'aria-pressed'\n ]\n for (const attr of BOOLEAN_ARIA_ATTRS) {\n root.querySelectorAll(`[${attr}]`).forEach((el) => {\n const val = el.getAttribute(attr)\n if (val !== 'true' && val !== 'false') {\n issues.push({\n type: 'warning',\n rule: 'WCAG 4.1.2 ARIA State Values',\n element: clip(el.outerHTML),\n message: `${attr} must be \"true\" or \"false\", got \"${val}\"`,\n fix: el.outerHTML.replace(`${attr}=\"${val}\"`, `${attr}=\"true\"`)\n })\n }\n })\n }\n\n // aria-checked also allows \"mixed\" for tri-state checkboxes (WAI-ARIA spec)\n root.querySelectorAll('[aria-checked]').forEach((el) => {\n const val = el.getAttribute('aria-checked')\n if (val !== 'true' && val !== 'false' && val !== 'mixed') {\n issues.push({\n type: 'warning',\n rule: 'WCAG 4.1.2 ARIA State Values',\n element: clip(el.outerHTML),\n message: `aria-checked must be \"true\", \"false\", or \"mixed\" (for tri-state), got \"${val}\"`,\n fix: el.outerHTML.replace(\n `aria-checked=\"${val}\"`,\n 'aria-checked=\"false\"'\n )\n })\n }\n })\n\n // aria-live with invalid value\n const VALID_ARIA_LIVE = new Set(['off', 'polite', 'assertive'])\n root.querySelectorAll('[aria-live]').forEach((el) => {\n const val = el.getAttribute('aria-live') ?? ''\n if (!VALID_ARIA_LIVE.has(val)) {\n issues.push({\n type: 'warning',\n rule: 'WCAG 4.1.2 ARIA State Values',\n element: clip(el.outerHTML),\n message: `aria-live=\"${val}\" is not valid - use \"off\", \"polite\", or \"assertive\"`,\n fix: el.outerHTML.replace(`aria-live=\"${val}\"`, 'aria-live=\"polite\"')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkDuplicateIds(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 4.1.1 Parsing'\n const issues: A11yIssue[] = []\n const seen = new Map<string, number>()\n\n root.querySelectorAll('[id]').forEach((el) => {\n const id = el.getAttribute('id')\n\n // Empty id is invalid HTML and breaks all ARIA references\n if (id !== undefined && id.trim() === '') {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: 'id=\"\" is an empty ID - IDs must have a non-empty value',\n fix: el.outerHTML.replace('id=\"\"', 'id=\"[unique-id]\"')\n })\n return\n }\n\n if (id) seen.set(id, (seen.get(id) ?? 0) + 1)\n })\n\n seen.forEach((count, id) => {\n if (count > 1) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: `id=\"${id}\"`,\n message: `id=\"${id}\" is used ${count} times - IDs must be unique within a document`,\n fix: `Keep one element with id=\"${id}\" and rename all duplicates to unique IDs`\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkTabIndex(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 2.1.1 Keyboard'\n const issues: A11yIssue[] = []\n\n root.querySelectorAll('[tabindex]').forEach((el) => {\n const raw = el.getAttribute('tabindex') ?? ''\n const val = parseInt(raw, 10)\n\n if (isNaN(val)) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `tabindex=\"${raw}\" is not a valid integer`,\n fix: el.outerHTML.replace(`tabindex=\"${raw}\"`, 'tabindex=\"0\"')\n })\n return\n }\n\n if (val > 0) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `tabindex=\"${val}\" disrupts natural tab order - use tabindex=\"0\" or rely on DOM order`,\n fix: el.outerHTML.replace(`tabindex=\"${val}\"`, 'tabindex=\"0\"')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkHeadings(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 2.4.6 Heading Hierarchy'\n const issues: A11yIssue[] = []\n const headings = root.querySelectorAll('h1, h2, h3, h4, h5, h6')\n\n let lastLevel = 0\n let h1Count = 0\n\n headings.forEach((h) => {\n const tag = h.tagName.toLowerCase()\n const level = parseInt(h.tagName.slice(1), 10)\n\n if (!h.text.trim()) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(h.outerHTML),\n message: `<${tag}> is empty - headings must have descriptive text`,\n fix: `<${tag}>[Heading text]</${tag}>`\n })\n }\n\n if (level === 1) h1Count++\n\n if (lastLevel > 0 && level > lastLevel + 1) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(h.outerHTML),\n message: `Heading skips from h${lastLevel} to h${level} - use h${lastLevel + 1} to maintain document outline`,\n fix: `<h${lastLevel + 1}>${h.text.trim()}</h${lastLevel + 1}>`\n })\n }\n\n lastLevel = level\n })\n\n if (h1Count > 1) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: 'h1',\n message: `${h1Count} <h1> elements found - a page should have exactly one <h1>`,\n fix: 'Demote additional <h1> elements to <h2> or lower'\n })\n }\n\n return { ruleName, issues }\n}\n\nexport function checkTables(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 1.3.1 Table Structure'\n const issues: A11yIssue[] = []\n\n root.querySelectorAll('table').forEach((table) => {\n // Layout/presentational tables do not need captions or headers\n const role = table.getAttribute('role')\n if (role === 'presentation' || role === 'none') return\n\n const caption = table.querySelector('caption')\n const ariaLabel = table.getAttribute('aria-label')\n const ariaLabelledBy = table.getAttribute('aria-labelledby')\n\n if (!caption && !ariaLabel && !ariaLabelledBy) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: '<table>',\n message:\n '<table> has no caption, aria-label, or aria-labelledby - screen readers cannot identify its purpose',\n fix: injectAttr('<table>', 'aria-label', '[Describe the table]')\n })\n }\n\n // Empty caption is as bad as no caption\n if (caption && !caption.text.trim()) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(caption.outerHTML),\n message:\n '<caption> is empty - provide a meaningful description of the table',\n fix: caption.outerHTML.replace(\n '</caption>',\n '[Table description]</caption>'\n )\n })\n }\n\n table.querySelectorAll('th').forEach((th) => {\n if (!th.getAttribute('scope')) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(th.outerHTML),\n message:\n '<th> is missing the scope attribute - use scope=\"col\" for column headers or scope=\"row\" for row headers',\n fix: injectAttr(th.outerHTML, 'scope', 'col')\n })\n }\n })\n })\n\n return { ruleName, issues }\n}\n\nexport function checkDialogs(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 4.1.2 Dialog Accessibility'\n const issues: A11yIssue[] = []\n\n root.querySelectorAll('dialog').forEach((dialog) => {\n const id = dialog.getAttribute('id')\n const ariaLabel = dialog.getAttribute('aria-label')\n const ariaLabelledBy = dialog.getAttribute('aria-labelledby')\n\n if (!id) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: '<dialog>',\n message:\n '<dialog> has no id - required by the ignix-lite button[onclick=\"dialogId.showModal()\"] pattern',\n fix: injectAttr('<dialog>', 'id', 'dialog-id')\n })\n }\n\n if (!ariaLabel && !ariaLabelledBy) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: '<dialog>',\n message:\n '<dialog> has no accessible name - add aria-labelledby pointing to a heading inside, or aria-label',\n fix: id\n ? `<dialog id=\"${id}\" aria-labelledby=\"dialog-title\">...</dialog>`\n : `<dialog aria-label=\"[Dialog purpose]\">...</dialog>`\n })\n } else if (ariaLabelledBy) {\n // Verify the labelledby target exists\n const broken = findBrokenAriaRefs(dialog, 'aria-labelledby', root)\n if (broken.length > 0) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: '<dialog>',\n message: `dialog aria-labelledby references non-existent element(s): ${broken.map((id) => `#${id}`).join(', ')}`,\n fix: `Ensure element(s) with id=\"${broken.join('\", \"')}\" exist inside the dialog`\n })\n }\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkRoles(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 4.1.2 ARIA Role Requirements'\n const issues: A11yIssue[] = []\n const NATIVELY_INTERACTIVE = new Set([\n 'a',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'details',\n 'summary'\n ])\n\n root.querySelectorAll('[role=\"button\"]').forEach((el) => {\n const tag = el.tagName.toLowerCase()\n const tabIndex = el.getAttribute('tabindex')\n if (!NATIVELY_INTERACTIVE.has(tag) && tabIndex !== '0') {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message:\n 'Element with role=\"button\" must have tabindex=\"0\" to be keyboard-accessible',\n fix: injectAttr(el.outerHTML, 'tabindex', '0')\n })\n }\n })\n\n // Roles requiring aria-checked\n for (const role of [\n 'checkbox',\n 'radio',\n 'menuitemcheckbox',\n 'menuitemradio'\n ] as const) {\n root.querySelectorAll(`[role=\"${role}\"]`).forEach((el) => {\n if (!el.getAttribute('aria-checked')) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `role=\"${role}\" requires aria-checked attribute (values: \"true\", \"false\"${role === 'checkbox' ? ', \"mixed\"' : ''})`,\n fix: injectAttr(el.outerHTML, 'aria-checked', 'false')\n })\n }\n })\n }\n\n root.querySelectorAll('[role=\"combobox\"]').forEach((el) => {\n if (!el.getAttribute('aria-expanded')) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: 'role=\"combobox\" requires aria-expanded attribute',\n fix: injectAttr(el.outerHTML, 'aria-expanded', 'false')\n })\n }\n })\n\n // Roles requiring aria-selected\n for (const role of ['tab', 'option', 'treeitem', 'gridcell'] as const) {\n root.querySelectorAll(`[role=\"${role}\"]`).forEach((el) => {\n if (!el.getAttribute('aria-selected')) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `role=\"${role}\" requires aria-selected attribute`,\n fix: injectAttr(el.outerHTML, 'aria-selected', 'false')\n })\n }\n })\n }\n\n root.querySelectorAll('[role=\"slider\"]').forEach((el) => {\n const required = ['aria-valuenow', 'aria-valuemin', 'aria-valuemax']\n const missing = required.filter((attr) => !el.getAttribute(attr))\n if (missing.length > 0) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `role=\"slider\" is missing required attributes: ${missing.join(', ')}`,\n fix: 'Add aria-valuenow=\"50\" aria-valuemin=\"0\" aria-valuemax=\"100\" to the element'\n })\n }\n })\n\n root.querySelectorAll('[role=\"progressbar\"]').forEach((el) => {\n if (\n !el.getAttribute('aria-valuenow') &&\n !el.getAttribute('aria-valuetext')\n ) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(el.outerHTML),\n message:\n 'role=\"progressbar\" should have aria-valuenow or aria-valuetext to communicate current progress',\n fix: injectAttr(el.outerHTML, 'aria-valuenow', '0')\n })\n }\n })\n\n root.querySelectorAll('[role=\"listbox\"]').forEach((el) => {\n if (!getAccessibleName(el, root)) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(el.outerHTML),\n message:\n 'role=\"listbox\" should have an accessible name via aria-label or aria-labelledby',\n fix: injectAttr(\n el.outerHTML,\n 'aria-label',\n '[Describe the list options]'\n )\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkAutocomplete(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 1.3.5 Input Purpose'\n const issues: A11yIssue[] = []\n\n const TYPE_AUTOCOMPLETE: Record<string, string> = {\n email: 'email',\n tel: 'tel',\n url: 'url'\n }\n\n root.querySelectorAll('input').forEach((input) => {\n const type = (input.getAttribute('type') ?? 'text').toLowerCase()\n const expected = TYPE_AUTOCOMPLETE[type]\n\n if (expected && !input.getAttribute('autocomplete')) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(input.outerHTML),\n message: `<input type=\"${type}\"> should have autocomplete=\"${expected}\" to assist users with autofill`,\n fix: injectAttr(input.outerHTML, 'autocomplete', expected)\n })\n }\n\n if (type === 'password' && !input.getAttribute('autocomplete')) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(input.outerHTML),\n message:\n '<input type=\"password\"> should have autocomplete=\"current-password\" or autocomplete=\"new-password\"',\n fix: injectAttr(input.outerHTML, 'autocomplete', 'current-password')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkFocusStyle(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 2.4.7 Focus Visible'\n const issues: A11yIssue[] = []\n const KILLS_FOCUS = [\n /outline\\s*:\\s*none/i,\n /outline\\s*:\\s*0(?:px)?/i,\n /outline-width\\s*:\\s*0/i\n ]\n\n root.querySelectorAll('[style]').forEach((el) => {\n const style = el.getAttribute('style') ?? ''\n if (KILLS_FOCUS.some((rx) => rx.test(style))) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(el.outerHTML),\n message:\n 'Inline style removes the focus outline - keyboard users cannot see the focus indicator',\n fix: el.outerHTML\n .replace(/outline\\s*:\\s*(none|0(?:px)?)\\s*;?/gi, '')\n .replace(/outline-width\\s*:\\s*0\\s*;?/gi, '')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkLang(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 3.1.1 Language of Page'\n const issues: A11yIssue[] = []\n\n const htmlEl = root.querySelector('html')\n if (htmlEl && !htmlEl.getAttribute('lang')?.trim()) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: '<html>',\n message:\n '<html> is missing the lang attribute - screen readers need this to select the correct voice/language',\n fix: '<html lang=\"en\">'\n })\n }\n\n return { ruleName, issues }\n}\n\n\n","export interface ColorEntry {\n primary: string\n contrast: string\n}\n\nexport const PALETTE: Record<string, ColorEntry> = {\n red: { primary: '#ef4444', contrast: '#ffffff' },\n orange: { primary: '#f97316', contrast: '#ffffff' },\n amber: { primary: '#f59e0b', contrast: '#111827' },\n yellow: { primary: '#eab308', contrast: '#111827' },\n lime: { primary: '#84cc16', contrast: '#111827' },\n green: { primary: '#22c55e', contrast: '#ffffff' },\n emerald: { primary: '#10b981', contrast: '#ffffff' },\n teal: { primary: '#14b8a6', contrast: '#ffffff' },\n cyan: { primary: '#06b6d4', contrast: '#111827' },\n sky: { primary: '#0ea5e9', contrast: '#111827' },\n blue: { primary: '#3b82f6', contrast: '#ffffff' },\n indigo: { primary: '#6366f1', contrast: '#ffffff' },\n violet: { primary: '#8b5cf6', contrast: '#ffffff' },\n purple: { primary: '#a855f7', contrast: '#ffffff' },\n fuchsia: { primary: '#d946ef', contrast: '#ffffff' },\n pink: { primary: '#ec4899', contrast: '#ffffff' },\n rose: { primary: '#f43f5e', contrast: '#ffffff' },\n cyberpunk: { primary: '#ec4899', contrast: '#ffffff' },\n neon: { primary: '#d946ef', contrast: '#ffffff' },\n eco: { primary: '#10b981', contrast: '#ffffff' },\n forest: { primary: '#0f766e', contrast: '#ffffff' },\n coffee: { primary: '#78350f', contrast: '#ffffff' },\n ocean: { primary: '#0284c7', contrast: '#ffffff' },\n sunset: { primary: '#f97316', contrast: '#ffffff' },\n midnight: { primary: '#3730a3', contrast: '#ffffff' },\n lavender: { primary: '#8b5cf6', contrast: '#ffffff' },\n coral: { primary: '#f43f5e', contrast: '#ffffff' },\n slate: { primary: '#64748b', contrast: '#ffffff' },\n gold: { primary: '#d97706', contrast: '#111827' },\n silver: { primary: '#94a3b8', contrast: '#111827' }\n}\n\nexport function expandHex(hex: string): string {\n const h = hex.replace('#', '')\n return h.length === 3 ? '#' + h[0] + h[0] + h[1] + h[1] + h[2] + h[2] : hex\n}\n\nexport function contrastFor(hex6: string): string {\n const h = hex6.replace('#', '')\n const r = parseInt(h.substring(0, 2), 16)\n const g = parseInt(h.substring(2, 4), 16)\n const b = parseInt(h.substring(4, 6), 16)\n return (r * 299 + g * 587 + b * 114) / 1000 > 165 ? '#111827' : '#ffffff'\n}\n\nexport function resolveColor(query: string): ColorEntry {\n const hexMatch = query.match(/#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})\\b/)\n if (hexMatch) {\n const primary = expandHex(hexMatch[0])\n return { primary, contrast: contrastFor(primary) }\n }\n\n const sorted = Object.keys(PALETTE).sort((a, b) => b.length - a.length)\n for (const name of sorted) {\n if (query.includes(name)) return PALETTE[name]\n }\n\n return { primary: '#6366f1', contrast: '#ffffff' }\n}\n","import { resolveColor } from './theme-palette.js'\n\nexport interface ThemeTokens {\n primary: string\n primaryHover: string\n primaryContrast: string\n primaryBg: string\n\n danger: string\n dangerText: string\n dangerBg: string\n\n warning: string\n warningBg: string\n\n success: string\n successBg: string\n\n infoBg: string\n neutral: string\n divider: string\n\n surface: string\n surfaceRaised: string\n\n text: string\n textMuted: string\n border: string\n\n radius: string\n radiusLg: string\n badgeRadius: string\n\n skeletonBg: string\n skeletonShimmer: string\n\n gradientStart: string\n gradientEnd: string\n gradientBgEnd: string\n\n isDark: boolean\n resolvedPrimary: string\n resolvedContrast: string\n}\n\nexport function resolveTokens(query: string): ThemeTokens {\n const { primary, contrast } = resolveColor(query)\n\n const isDark =\n query.includes('dark') ||\n query.includes('night') ||\n query.includes('midnight') ||\n query.includes('cyberpunk') ||\n query.includes('dim')\n\n const sharp =\n query.includes('sharp') ||\n query.includes('flat') ||\n query.includes('square')\n const round =\n query.includes('round') || query.includes('pill') || query.includes('soft')\n\n return {\n resolvedPrimary: primary,\n resolvedContrast: contrast,\n isDark,\n\n primary,\n primaryHover: isDark\n ? 'color-mix(in srgb, var(--ix-primary) 75%, white)'\n : 'color-mix(in srgb, var(--ix-primary) 85%, black)',\n primaryContrast: isDark\n ? 'color-mix(in srgb, var(--ix-primary) 40%, white)'\n : contrast,\n primaryBg: isDark\n ? 'color-mix(in srgb, var(--ix-primary) 20%, #0f172a)'\n : 'color-mix(in srgb, var(--ix-primary) 15%, white)',\n\n danger: '#ef4444',\n dangerText: isDark ? '#f87171' : '#ef4444',\n dangerBg: isDark ? '#3f1d1d' : '#fee2e2',\n\n warning: isDark ? '#fbbf24' : '#f59e0b',\n warningBg: isDark ? '#3f2e05' : '#fef3c7',\n\n success: '#22c55e',\n successBg: isDark ? '#052e16' : '#dcfce7',\n\n infoBg: isDark ? '#1e293b' : '#f3f4f6',\n neutral: isDark ? '#9ca3af' : '#6b7280',\n divider: isDark ? '#475569' : '#9ca3af',\n\n surface: isDark ? '#0f172a' : '#f9fafb',\n surfaceRaised: isDark ? '#1e293b' : '#ffffff',\n\n text: isDark ? '#f9fafb' : '#111827',\n textMuted: isDark ? '#94a3b8' : '#6b7280',\n border: isDark ? '#334155' : '#e5e7eb',\n\n radius: sharp ? '0px' : round ? '0.75rem' : '0.375rem',\n radiusLg: sharp ? '0px' : round ? '1rem' : '0.5rem',\n badgeRadius: '999px',\n\n skeletonBg: isDark ? '#1e293b' : '#e5e7eb',\n skeletonShimmer: isDark ? 'rgba(255,255,255,0.1)' : 'rgba(255,255,255,0.6)',\n\n gradientStart: primary,\n gradientEnd: '#fffbd5',\n gradientBgEnd: isDark ? '#aba67a' : '#d7d4bc'\n }\n}\n\nexport function buildCss(t: ThemeTokens): string {\n return `:root {\n --ix-primary: ${t.primary};\n --ix-primary-hover: ${t.primaryHover};\n --ix-primary-contrast: ${t.primaryContrast};\n\n --ix-danger: ${t.danger};\n --ix-danger-text: ${t.dangerText};\n\n --ix-warning: ${t.warning};\n --ix-success: ${t.success};\n --ix-neutral: ${t.neutral};\n --ix-ghost: transparent;\n\n --ix-primary-bg: ${t.primaryBg};\n --ix-danger-bg: ${t.dangerBg};\n --ix-warning-bg: ${t.warningBg};\n --ix-success-bg: ${t.successBg};\n --ix-info-bg: ${t.infoBg};\n\n --ix-on-danger: #ffffff;\n --ix-on-warning: #000000;\n --ix-on-success: #ffffff;\n --ix-on-primary: ${t.resolvedContrast};\n\n --ix-divider: ${t.divider};\n\n --ix-surface: ${t.surface};\n --ix-surface-raised: ${t.surfaceRaised};\n\n --ix-text: ${t.text};\n --ix-text-muted: ${t.textMuted};\n\n --ix-border: ${t.border};\n --ix-focus: 2px solid var(--ix-primary);\n\n --ix-font: 'Segoe UI Variable', 'Segoe UI', 'Roboto', 'Noto Sans', system-ui, sans-serif;\n --ix-font-mono: 'JetBrains Mono', 'SFMono-Regular', Consolas, monospace;\n\n --ix-size-xs: 0.75rem;\n --ix-size-sm: 0.875rem;\n --ix-size-md: 1rem;\n --ix-size-lg: 1.125rem;\n --ix-size-xl: 1.25rem;\n\n --ix-line-height: 1.5;\n\n --ix-space-sm: 0.5rem;\n --ix-space-md: 1rem;\n --ix-space-lg: 1.5rem;\n\n --ix-radius: ${t.radius};\n --ix-radius-lg: ${t.radiusLg};\n --ix-badge-radius: ${t.badgeRadius};\n\n --ix-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n\n --ix-gradient: linear-gradient(to right, ${t.gradientStart}, ${t.gradientEnd});\n --ix-gradient-bg: linear-gradient(to right, ${t.gradientStart}, ${t.gradientBgEnd});\n\n --ix-skeleton-bg: ${t.skeletonBg};\n --ix-skeleton-shimmer: ${t.skeletonShimmer};\n}`\n}\n","import path from 'path'\nimport { readFileSync, existsSync } from 'fs'\nimport { fileURLToPath } from 'url'\nimport { embedText } from './embedder.js'\nimport { cosineSimilarity } from '../utils/cosine.js'\nimport { STOP_WORDS } from '../utils/intent-helpers.js'\n\ntype IndexItem = {\n name: string\n emmet: string\n searchable: string\n embedding: number[]\n}\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\nlet _index: IndexItem[] | null = null\n\nfunction loadIndex(): IndexItem[] {\n if (_index) return _index\n const paths = [\n path.resolve(__dirname, '../../dist/vector-index.json'),\n path.resolve(__dirname, './vector-index.json'),\n path.resolve(__dirname, '../vector-index.json')\n ]\n let indexPath = paths[0]\n for (const p of paths) {\n if (existsSync(p)) {\n indexPath = p\n break\n }\n }\n if (!existsSync(indexPath)) {\n console.warn(\n `[search-index] dist/vector-index.json not found at: ${indexPath} - run pnpm build:index`\n )\n _index = []\n return _index\n }\n try {\n _index = JSON.parse(readFileSync(indexPath, 'utf8'))\n } catch (err) {\n console.error(`[search-index] Failed to load index from ${indexPath}:`, err)\n _index = []\n }\n return _index!\n}\n\nexport function searchIndex(description: string) {\n const index = loadIndex()\n const queryEmbedding = embedText(description)\n\n const words = description.toLowerCase().split(/\\s+/)\n const ranked = index\n .map((item) => {\n const similarity = cosineSimilarity(queryEmbedding, item.embedding)\n let boost = 0\n const searchable = item.searchable.toLowerCase()\n\n words.forEach((word) => {\n if (STOP_WORDS.has(word) || word.length < 3) {\n return\n }\n if (item.name.toLowerCase() === word) {\n boost += 2\n } else if (item.name.toLowerCase().includes(word)) {\n boost += 1\n }\n if (searchable.includes(word)) {\n boost += 0.3\n }\n })\n return {\n ...item,\n score: similarity + boost\n }\n })\n .sort((a, b) => b.score - a.score)\n return ranked.slice(0, 3)\n}\n\n","const VOCAB_SIZE = 512\n\nexport function embedText(text: string): number[] {\n const vector = new Array(VOCAB_SIZE).fill(0)\n const words = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter(Boolean)\n words.forEach((word) => {\n let hash = 0\n for (let i = 0; i < word.length; i++) {\n hash = (hash * 31 + word.charCodeAt(i)) % VOCAB_SIZE\n }\n vector[hash] += 1\n })\n return vector\n}\n","export function cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0\n let magA = 0\n let magB = 0\n\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i]\n magA += a[i] * a[i]\n magB += b[i] * b[i]\n }\n\n if (magA === 0 || magB === 0) return 0\n\n return dot / (Math.sqrt(magA) * Math.sqrt(magB))\n}\n","export const STOP_WORDS = new Set([\n 'with',\n 'for',\n 'and',\n 'the',\n 'you',\n 'can',\n 'from',\n 'this',\n 'that',\n 'your',\n 'want',\n 'need',\n 'show',\n 'give',\n 'nice',\n 'page',\n 'here',\n 'please',\n 'make',\n 'create',\n 'build',\n 'about',\n 'using',\n 'what',\n 'should',\n 'how'\n])\n\nexport function tokenise(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9\\s/]/g, ' ')\n .split(/[\\s/]+/)\n .filter((w) => w.length > 1 && !STOP_WORDS.has(w))\n}\n\nexport function editDistance(s1: string, s2: string): number {\n const costs: number[] = []\n for (let i = 0; i <= s1.length; i++) {\n let lastValue = i\n for (let j = 0; j <= s2.length; j++) {\n if (i === 0) {\n costs[j] = j\n } else {\n if (j > 0) {\n let newValue = costs[j - 1]\n if (s1.charAt(i - 1) !== s2.charAt(j - 1)) {\n newValue = Math.min(Math.min(newValue, lastValue), costs[j]) + 1\n }\n costs[j - 1] = lastValue\n lastValue = newValue\n }\n }\n }\n if (i > 0) costs[s2.length] = lastValue\n }\n return costs[s2.length]\n}\n\nexport function isSimilar(w1: string, w2: string): boolean {\n if (w1.length < 3 || w2.length < 3) return w1 === w2\n // Typo tolerance: 1 edit for 3-5 chars, 2 edits for 6+ chars\n const maxDistance = w1.length >= 6 && w2.length >= 6 ? 2 : 1\n return editDistance(w1, w2) <= maxDistance\n}\n","import { readFileSync, existsSync } from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\nimport { tokenise, isSimilar } from './intent-helpers.js'\n\nexport type IntentEntry = {\n name: string\n phrases: string[]\n emmet: string\n category: string\n}\n\n\nfunction parseIntents(raw: string): IntentEntry[] {\n const entries: IntentEntry[] = []\n\n // Find where the INTENTS block starts\n const intentStart = raw.indexOf('INTENTS:')\n if (intentStart === -1) return entries\n\n const block = raw.slice(intentStart)\n const lines = block.split(/\\r?\\n/)\n\n let currentCategory = 'GENERAL'\n let pendingPhrase: string | null = null\n\n for (const raw_line of lines) {\n const line = raw_line.trim()\n\n // Category header: --- DESTROY / DANGER ---\n if (line.startsWith('---') && line.endsWith('---')) {\n currentCategory = line\n .replace(/^-+\\s*/, '')\n .replace(/\\s*-+$/, '')\n .trim()\n pendingPhrase = null\n continue\n }\n\n // Skip meta comment line [caveman prompt → emmet...]\n if (line.startsWith('[') && line.endsWith(']')) continue\n\n // Skip NEVER DO section (starts with \"never use\")\n if (line.startsWith('never ')) continue\n\n // Skip blank lines and \"→\" alias lines (these are in NEVER DO)\n if (line === '' || line.startsWith('→')) continue\n\n // Emmet line: starts with \"- \"\n if (line.startsWith('- ') && pendingPhrase !== null) {\n const emmet = line.slice(2).trim()\n entries.push({\n name: pendingPhrase,\n phrases: tokenise(pendingPhrase),\n emmet,\n category: currentCategory\n })\n pendingPhrase = null\n continue\n }\n\n // Anything else is a caveman phrase (intent description)\n if (!line.startsWith('-')) {\n pendingPhrase = line\n }\n }\n\n return entries\n}\n\n// ---- Resolve the api-full.txt path relative to this package root ----\nfunction loadIntents(): IntentEntry[] {\n try {\n const currentDir = path.dirname(fileURLToPath(import.meta.url))\n\n // Try relative paths from current file structure (packages/mcp/src/utils/ or dist/utils/)\n const path1 = path.resolve(currentDir, '../../../api-full.txt')\n const path2 = path.resolve(currentDir, '../../api-full.txt')\n const path3 = path.resolve(currentDir, '../../../../api-full.txt')\n\n let txtPath = path1\n if (existsSync(path1)) {\n txtPath = path1\n } else if (existsSync(path2)) {\n txtPath = path2\n } else if (existsSync(path3)) {\n txtPath = path3\n } else {\n txtPath = path.resolve(process.cwd(), '../../api-full.txt')\n }\n\n const raw = readFileSync(txtPath, 'utf8')\n return parseIntents(raw)\n } catch {\n return []\n }\n}\n\n// Singleton - parsed once at server startup, stays in-memory (DC-13)\nlet _cache: IntentEntry[] | null = null\n\nexport function getIntentEntries(): IntentEntry[] {\n if (!_cache) {\n _cache = loadIntents()\n }\n return _cache\n}\n\nexport type ScoreResult = {\n score: number\n density: number\n}\n\n// Score a single IntentEntry against the query, tolerating minor typos. eturns { score, density } for tie-breaking.\n\nexport function scoreEntry(\n entry: IntentEntry,\n queryWords: string[]\n): ScoreResult {\n let score = 0\n const entryWords = new Set(entry.phrases)\n let matchedCount = 0\n\n for (const qw of queryWords) {\n let matched = false\n // 1. Exact match (+10)\n if (entryWords.has(qw)) {\n score += 10\n matched = true\n } else {\n // 2. Fuzzy spelling similarity match (+8)\n for (const ew of entryWords) {\n if (isSimilar(qw, ew)) {\n score += 8\n matched = true\n break\n }\n }\n // 3. Substring match fallback (+4)\n if (!matched) {\n for (const ew of entryWords) {\n if (ew.includes(qw) || qw.includes(ew)) {\n score += 4\n matched = true\n break\n }\n }\n }\n }\n if (matched) {\n matchedCount++\n }\n }\n\n // Bonus: category keyword overlap (supports fuzzy spelling matches)\n const catWords = tokenise(entry.category)\n for (const qw of queryWords) {\n if (catWords.includes(qw)) {\n score += 3\n } else {\n for (const cw of catWords) {\n if (isSimilar(qw, cw)) {\n score += 2\n break\n }\n }\n }\n }\n\n // Density = portion of the entry's phrases that were matched by the query\n const density =\n entry.phrases.length > 0 ? matchedCount / entry.phrases.length : 0\n\n return { score, density }\n}\n","import emmet from 'emmet'\n\n// Expand Emmet shorthand to full HTML using the emmet npm package\nexport function expandEmmet(emmetStr: string): string {\n try {\n return emmet(emmetStr)\n } catch {\n return `<!-- expand: ${emmetStr} -->`\n }\n}\n\n// Maps HTML element names / web-component tag names → ignix-lite component names\nexport const ELEMENT_TO_COMPONENT: Record<string, string> = {\n // Native elements\n button: 'button',\n input: 'input',\n textarea: 'textarea',\n select: 'select',\n form: 'form',\n dialog: 'dialog',\n details: 'accordion',\n summary: 'accordion',\n progress: 'progress',\n meter: 'meter',\n aside: 'alert',\n mark: 'badge',\n img: 'avatar',\n article: 'card',\n nav: 'navigation',\n table: 'table',\n pre: 'codeblock',\n code: 'codeblock',\n hr: 'divider',\n label: 'input', // label wraps input/checkbox/radio\n // Web components\n 'ix-tabs': 'tab',\n 'ix-dropdown': 'dropdown',\n 'ix-combobox': 'combobox',\n 'ix-tooltip': 'tooltip',\n 'ix-toast': 'toast'\n}\n\n// Skeleton heuristic: span with aria-busy or data-shape\nexport const SKELETON_PATTERN = /span\\[[^\\]]*(?:aria-busy|data-shape)[^\\]]*\\]/i\n\n// Given an emmet string, return the unique set of ignix-lite component names hat the pattern uses.\n\nexport function extractComponents(emmetStr: string): string[] {\n const found = new Set<string>()\n\n // Special case: skeleton uses span[aria-busy] or span[data-shape]\n if (SKELETON_PATTERN.test(emmetStr)) {\n found.add('skeleton')\n }\n\n // Special case: nav[aria-label=Breadcrumb] → breadcrumb\n if (/nav\\[[^\\]]*breadcrumb/i.test(emmetStr)) {\n found.add('breadcrumb')\n } else if (/\\bnav\\b/.test(emmetStr)) {\n found.add('navigation')\n }\n\n // Special case: label > input[type=checkbox] → checkbox\n if (/input\\[[^\\]]*type=checkbox/i.test(emmetStr)) {\n found.add('checkbox')\n }\n\n // Special case: label > input[type=radio] → radio\n if (/input\\[[^\\]]*type=radio/i.test(emmetStr)) {\n found.add('radio')\n }\n\n // Special case: section[data-grid] → grid (only when data-grid attr is present)\n if (/section\\[[^\\]]*data-grid/i.test(emmetStr)) {\n found.add('grid')\n }\n\n // General: extract all tag names from the emmet string\n const tagPattern = /(?:^|[>+(])([a-z][a-z0-9-]*)/gi\n let m: RegExpExecArray | null\n while ((m = tagPattern.exec(emmetStr)) !== null) {\n const tag = m[1].toLowerCase()\n const component = ELEMENT_TO_COMPONENT[tag]\n if (component) found.add(component)\n }\n\n return Array.from(found)\n}\n\n// Customizes standard Emmet shorthand by dynamically replacing text strings and visual intent attributes based on the user prompt description.\n\nfunction injectAttribute(emmetStr: string, attr: string, value: string): string {\n if (emmetStr.includes(attr)) return emmetStr\n const match = emmetStr.match(/^([a-z][a-z0-9-]*)(?:\\[([^\\]]*)\\])?/i)\n if (!match) return emmetStr\n const tag = match[1]\n const attrs = match[2] ? `${attr}=${value} ${match[2]}` : `${attr}=${value}`\n return emmetStr.replace(/^([a-z][a-z0-9-]*)(?:\\[[^\\]]*\\])?/i, `${tag}[${attrs}]`)\n}\n\nexport function interpolateEmmet(\n emmetStr: string,\n description: string\n): string {\n let result = emmetStr\n const descLower = description.toLowerCase()\n\n let intent = 'primary'\n if (/\\b(red|danger|delete|remove|destroy)\\b/.test(descLower)) {\n intent = 'danger'\n } else if (/\\b(green|success|work|done)\\b/.test(descLower)) {\n intent = 'success'\n } else if (/\\b(yellow|orange|warning|risky)\\b/.test(descLower)) {\n intent = 'warning'\n } else if (/\\b(ghost|secondary)\\b/.test(descLower)) {\n intent = 'ghost'\n } else if (/\\b(neutral|gray|grey)\\b/.test(descLower)) {\n intent = 'neutral'\n }\n result = result.replace(/data-intent=\\?/g, `data-intent=${intent}`)\n\n // Only override data-intent on semantic elements, not wrappers like label\n const INTENT_ELEMENTS = /^(button|aside|mark|dialog|ix-tooltip|ix-toast)/\n if (intent !== 'primary') {\n result = result.replace(\n /data-intent=(?:primary|neutral|ghost|success|warning|danger)/g,\n (match, offset) => {\n // Walk backwards to find the tag name to avoid injecting on label\n const before = result.slice(0, offset)\n const tagMatch = before.match(/([a-z][a-z0-9-]*)\\[[^\\]]*$/i)\n if (tagMatch && !INTENT_ELEMENTS.test(tagMatch[1])) {\n return match // leave unchanged\n }\n return `data-intent=${intent}`\n }\n )\n }\n\n let size = 'md'\n if (/\\b(large|lg|big)\\b/.test(descLower)) {\n size = 'lg'\n } else if (/\\b(small|sm|tiny)\\b/.test(descLower)) {\n size = 'sm'\n }\n result = result.replace(/data-size=\\?/g, `data-size=${size}`)\n\n let variant = 'solid'\n if (/\\b(outline|ghost|link)\\b/.test(descLower)) {\n variant = 'outline'\n }\n result = result.replace(/data-variant=\\?/g, `data-variant=${variant}`)\n\n // Recognize shape keywords: rectangular → rect, circle/round → circle\n if (/\\b(rect|rectangular|rectangle)\\b/.test(descLower)) {\n result = result.replace(/data-shape=(?:text|circle|\\?)/g, 'data-shape=rect')\n } else if (/\\b(circle|round|circular)\\b/.test(descLower)) {\n result = result.replace(/data-shape=(?:text|rect|\\?)/g, 'data-shape=circle')\n }\n\n if (/\\b(loading|spinner|busy)\\b/.test(descLower)) {\n result = injectAttribute(result, 'aria-busy', 'true')\n }\n if (/\\b(disabled|inactive)\\b/.test(descLower)) {\n result = injectAttribute(result, 'disabled', 'true')\n }\n\n const matches = [...description.matchAll(/['\"]([^'\"]+)['\"]/g)]\n const quotedStrings = matches\n .map((m) => m[1].trim())\n .filter((s) => s.length > 0)\n\n if (quotedStrings.length > 0) {\n let quoteIndex = 0\n\n result = result.replace(/content(=\\?|=\"\"|=''|(?=[\\]\\s]|$))/g, () => {\n if (quoteIndex < quotedStrings.length) {\n return `content=\"${quotedStrings[quoteIndex++]}\"`\n }\n return 'content=\"\"'\n })\n\n result = result.replace(/title(=\\?|=\"\"|=''|(?=[\\]\\s]|$))/g, () => {\n if (quoteIndex < quotedStrings.length) {\n return `title=\"${quotedStrings[quoteIndex++]}\"`\n }\n return 'title=\"\"'\n })\n\n result = result.replace(/label(=\\?|=\"\"|=''|(?=[\\]\\s]|$))/g, () => {\n if (quoteIndex < quotedStrings.length) {\n return `label=\"${quotedStrings[quoteIndex++]}\"`\n }\n return 'label=\"\"'\n })\n\n const hasButtonMention = /\\b(button|says|labeled|action|click)\\b/i.test(\n description\n )\n\n // Don't replace button labels when the only quoted string was already consumed as content=\n const remainingQuotes = quotedStrings.slice(quoteIndex)\n // Also skip if the emmet already has a populated content= attribute (e.g. from tooltip template)\n // — in that case the quoted string belongs to content, not the button label\n const hasPopulatedContent = /content=\"[^\"]+\"/i.test(result)\n const shouldReplaceButton =\n !hasPopulatedContent &&\n (remainingQuotes.length >= 2 ||\n (remainingQuotes.length === 1 && hasButtonMention))\n\n if (shouldReplaceButton) {\n const buttonRegex = /(button[^}]*)\\{([^}]+)\\}/g\n const buttonMatches = [...result.matchAll(buttonRegex)]\n\n if (buttonMatches.length > 0) {\n const buttonLabel = remainingQuotes[remainingQuotes.length - 1]\n result = result.replace(buttonRegex, (match, p1) => {\n return `${p1}{${buttonLabel}}`\n })\n }\n }\n\n\n\n const textPlaceholderRegex = /\\{(label|message|title|text)\\}/gi\n result = result.replace(textPlaceholderRegex, (match) => {\n if (quoteIndex < quotedStrings.length) {\n return `{${quotedStrings[quoteIndex++]}}`\n }\n return match\n })\n\n const labelRegex = /label\\{([^}]+)\\}/g\n result = result.replace(labelRegex, (match) => {\n if (quoteIndex < quotedStrings.length) {\n return `label{${quotedStrings[quoteIndex++]}}`\n }\n return match\n })\n\n if (/label\\{username\\}/i.test(result)) {\n result = result.replace(/type=email/g, 'type=text')\n }\n } else {\n const labelMap: Record<string, string> = {\n delete: 'Delete',\n remove: 'Remove',\n destroy: 'Destroy',\n danger: 'Delete',\n save: 'Save',\n submit: 'Submit',\n cancel: 'Cancel',\n confirm: 'Confirm',\n search: 'Search',\n download: 'Download',\n upload: 'Upload',\n edit: 'Edit',\n add: 'Add',\n create: 'Create',\n update: 'Update'\n }\n let extractedLabel = ''\n for (const [key, val] of Object.entries(labelMap)) {\n if (descLower.includes(key)) {\n extractedLabel = val\n break\n }\n }\n if (!extractedLabel) {\n const components = extractComponents(emmetStr)\n if (components.length > 0) {\n extractedLabel = components[0].charAt(0).toUpperCase() + components[0].slice(1)\n } else {\n extractedLabel = 'Button'\n }\n }\n result = result.replace(/\\{(label|Label|message|Message|title|Title|text|Text)\\}/g, `{${extractedLabel}}`)\n }\n\n result = result.replace(/alt=\\?/g, 'alt=\"User\"')\n result = result.replace(/src=\\?/g, 'src=\"?\"')\n\n return result\n}\n","import { searchIndex } from './search-index.js'\nimport { getIntentEntries, scoreEntry } from '../utils/intent-parser.js'\nimport { getTokenCount } from '../utils/tokenizer.js'\nimport { tokenise } from '../utils/intent-helpers.js'\nimport {\n expandEmmet,\n extractComponents,\n interpolateEmmet\n} from '../utils/emmet-helpers.js'\n\nimport type { IntentEntry } from '../utils/intent-parser.js'\nimport type { MCPResponse } from '../types.js'\n\n\ntype IntentMatch = {\n name: string\n emmet: string\n score: number\n source: 'intent-table' | 'vector-index'\n}\n\nconst LAYER1_THRESHOLD = 15 // minimum score to trust an intent-table hit\n\nfunction searchIntentTable(description: string): IntentMatch | null {\n const entries = getIntentEntries()\n if (entries.length === 0) return null\n\n const isStitchRequested =\n /\\b(and|plus|\\+)\\b/i.test(description) || description.includes(',')\n\n const queryWords = tokenise(description)\n\n const candidates: {\n entry: IntentEntry\n score: number\n density: number\n components: string[]\n }[] = []\n let bestSingle: (IntentMatch & { density: number }) | null = null\n\n for (const entry of entries) {\n const { score, density } = scoreEntry(entry, queryWords)\n if (score >= LAYER1_THRESHOLD) {\n const components = extractComponents(entry.emmet)\n candidates.push({ entry, score, density, components })\n\n const isBetter =\n !bestSingle ||\n score > bestSingle.score ||\n (score === bestSingle.score && density > bestSingle.density)\n if (isBetter) {\n bestSingle = {\n name: entry.name,\n emmet: entry.emmet,\n score,\n density,\n source: 'intent-table'\n }\n }\n }\n }\n\n if (bestSingle && bestSingle.score >= 18) {\n if (!isStitchRequested || bestSingle.score >= 25) {\n return bestSingle\n }\n }\n\n if (isStitchRequested && candidates.length >= 2) {\n candidates.sort((a, b) => b.score - a.score || b.density - a.density)\n\n const selected: typeof candidates = []\n const usedComponents = new Set<string>()\n\n for (const c of candidates) {\n const hasOverlap = c.components.some((comp) => usedComponents.has(comp))\n if (!hasOverlap) {\n selected.push(c)\n c.components.forEach((comp) => usedComponents.add(comp))\n }\n }\n\n if (selected.length >= 2) {\n selected.sort((a, b) => {\n const indexA = description\n .toLowerCase()\n .indexOf(tokenise(a.entry.name)[0])\n const indexB = description\n .toLowerCase()\n .indexOf(tokenise(b.entry.name)[0])\n return indexA - indexB\n })\n\n const combinedEmmet = selected.map((s) => s.entry.emmet).join('+')\n const totalScore = selected.reduce((sum, s) => sum + s.score, 0)\n\n return {\n name: selected.map((s) => s.entry.name).join(' and '),\n emmet: combinedEmmet,\n score: totalScore,\n source: 'intent-table'\n }\n }\n }\n\n if (bestSingle && bestSingle.score >= 18) {\n if (!isStitchRequested || bestSingle.score >= 25) {\n return bestSingle\n }\n }\n return null\n}\n\n\nfunction searchVectorLayer(description: string): IntentMatch | null {\n const results = searchIndex(description)\n if (results.length === 0) return null\n\n const isStitchRequested =\n /\\b(and|plus|\\+)\\b/i.test(description) || description.includes(',')\n\n if (isStitchRequested && results.length >= 2) {\n const top = results[0]\n const second = results[1]\n if (top.name !== second.name && top.score >= 2.0 && second.score >= 2.0) {\n const indexA = description.toLowerCase().indexOf(top.name.toLowerCase())\n const indexB = description.toLowerCase().indexOf(second.name.toLowerCase())\n const firstItem = indexA < indexB ? top : second\n const secondItem = indexA < indexB ? second : top\n return {\n name: `${firstItem.name} and ${secondItem.name}`,\n emmet: `${firstItem.emmet}+${secondItem.emmet}`,\n score: (top.score + second.score) / 2,\n source: 'vector-index'\n }\n }\n }\n\n const top = results[0]\n return {\n name: top.name,\n emmet: top.emmet,\n score: top.score,\n source: 'vector-index'\n }\n}\n\n\nexport async function howToBuild(description: string): Promise<MCPResponse> {\n let cleanDesc = description.trim()\n if (cleanDesc.startsWith('{') && cleanDesc.endsWith('}')) {\n try {\n const parsed = JSON.parse(cleanDesc)\n if (parsed && typeof parsed.description === 'string') {\n cleanDesc = parsed.description\n } else if (parsed && typeof parsed.text === 'string') {\n cleanDesc = parsed.text\n }\n } catch {\n // Ignore parsing errors, keep original string\n }\n }\n\n // Layer 1 - fast, deterministic, hand-crafted intent table\n let match = searchIntentTable(cleanDesc)\n\n // Layer 2 - vector index fallback for novel / unknown queries\n if (!match) {\n match = searchVectorLayer(cleanDesc)\n }\n\n if (!match) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n emmet: '',\n html: '',\n components_used: [],\n confidence: 0,\n tokens: 0,\n tokens_used: 15,\n source: 'no-match',\n suggestion:\n 'Call list_components() to see all available components, or try a different description.'\n })\n }\n ]\n }\n }\n\n // Apply dynamic interpolation to customize labels, types, and colors on the fly\n const emmet = interpolateEmmet(match.emmet, cleanDesc)\n const components_used = extractComponents(emmet)\n\n const confidence = Math.min(1, match.score / 40)\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n emmet,\n html: expandEmmet(emmet),\n components_used,\n confidence: Number(confidence.toFixed(2)),\n tokens: getTokenCount(emmet),\n tokens_used: 15,\n source: match.source // tells caller which layer matched\n })\n }\n ]\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { chromium, webkit } from 'playwright'\nimport { readFileSync, existsSync } from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\nimport { expandEmmet } from '../utils/emmet-helpers.js'\nimport type { MCPResponse } from '../types.js'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\nexport type PreviewOptions = {\n width?: number\n theme?: string\n scale?: number\n}\n\nexport type PreviewArgs = {\n input: string\n options?: PreviewOptions\n}\n\nexport async function preview(args: PreviewArgs): Promise<MCPResponse> {\n const start = Date.now()\n const { input, options = {} } = args\n const { width = 400, scale = 2, theme } = options\n\n // Sanitize width and scale to prevent emulation protocol crashes on non-positive values\n const sanitizedWidth = typeof width === 'number' && width > 0 ? width : 400\n const sanitizedScale = typeof scale === 'number' && scale > 0 ? scale : 2\n\n // Expand Emmet to HTML if it doesn't look like standard HTML\n const html = input.trim().startsWith('<') ? input : expandEmmet(input)\n\n // Resolve CSS path by searching upwards for workspace root directory\n let currentDir = __dirname\n let rootDir = ''\n for (let i = 0; i < 6; i++) {\n if (\n existsSync(path.join(currentDir, 'pnpm-workspace.yaml')) ||\n (existsSync(path.join(currentDir, 'package.json')) &&\n existsSync(path.join(currentDir, 'packages')))\n ) {\n rootDir = currentDir\n break\n }\n const parent = path.dirname(currentDir)\n if (parent === currentDir) break\n currentDir = parent\n }\n\n let cssPath = ''\n if (rootDir) {\n cssPath = path.join(rootDir, 'packages/core/dist/ignix-lite.min.css')\n }\n\n // Fallback options\n if (!cssPath || !existsSync(cssPath)) {\n cssPath = path.resolve(\n process.cwd(),\n 'packages/core/dist/ignix-lite.min.css'\n )\n }\n if (!existsSync(cssPath)) {\n cssPath = path.resolve(process.cwd(), '../core/dist/ignix-lite.min.css')\n }\n if (!existsSync(cssPath)) {\n cssPath = path.resolve(__dirname, '../../../core/dist/ignix-lite.min.css')\n }\n\n let cssContent = ''\n if (existsSync(cssPath)) {\n cssContent = readFileSync(cssPath, 'utf8')\n } else {\n console.warn(`[preview] CSS file not found at: ${cssPath}`)\n }\n\n let browser\n try {\n browser = await webkit.launch({\n headless: true\n })\n\n const context = await browser.newContext({\n javaScriptEnabled: false,\n viewport: {\n width: sanitizedWidth,\n height: 600\n },\n deviceScaleFactor: sanitizedScale,\n colorScheme: (theme === 'dark' || theme === 'light') ? theme : undefined\n })\n\n const page = await context.newPage()\n\n // Route interception (SSRF Mitigation & Sandbox Hardening)\n // Only allow data URIs and about:blank. Block all outgoing HTTP/HTTPS traffic.\n await page.route('**/*', (route) => {\n const url = route.request().url()\n if (url.startsWith('data:') || url === 'about:blank') {\n route.continue()\n } else {\n route.abort()\n }\n })\n\n // Set page content with Ignix-Lite styles injected\n const pageContent = `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; style-src 'unsafe-inline'; img-src data:;\">\n <style>\n body {\n margin: 0;\n padding: 16px;\n background-color: var(--ix-surface, #f9fafb);\n font-family: var(--ix-font, sans-serif);\n }\n #preview-container {\n display: flex;\n justify-content: center;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n width: 100%;\n box-sizing: border-box;\n }\n ${cssContent}\n </style>\n </head>\n <body>\n <div id=\"preview-container\">${html}</div>\n </body>\n </html>\n `\n await page.setContent(pageContent, { waitUntil: 'load' })\n\n // Take screenshot of container\n const container = page.locator('#preview-container')\n let base64Png = ''\n try {\n const buffer = await container.screenshot()\n base64Png = buffer.toString('base64')\n } catch (error) {\n // Fallback to taking a full page screenshot if container has 0 size or fails\n const buffer = await page.screenshot()\n base64Png = buffer.toString('base64')\n }\n\n const duration = Date.now() - start\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n png: `data:image/png;base64,${base64Png}`,\n width: sanitizedWidth,\n render_ms: duration,\n tokens_used: 5\n })\n }\n ]\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error('[preview] Render failed:', error)\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: `Preview render failed: ${errorMessage}`,\n tokens_used: 5\n })\n }\n ]\n }\n } finally {\n if (browser) {\n await browser.close()\n }\n }\n}\n","import { parse, type HTMLElement } from 'node-html-parser'\nimport { expandEmmet } from '../utils/emmet-helpers.js'\nimport { getTokenCount } from '../utils/tokenizer.js'\nimport type { MCPResponse } from '../types.js'\n\nexport interface HandoffComponent {\n selector: string\n emmet: string\n state: Record<string, string>\n tokens: number\n}\n\nexport interface HandoffEnvelope {\n schema: 'ignix-lite-handoff'\n version: '1.0'\n id: string\n timestamp: number\n html: string\n components: HandoffComponent[]\n total_tokens: number\n metadata?: Record<string, unknown>\n}\n\nconst MAX_HANDOFFS = 100\nconst handoffs = new Map<string, HandoffEnvelope>()\n\nfunction saveHandoff(id: string, envelope: HandoffEnvelope): void {\n if (handoffs.size >= MAX_HANDOFFS) {\n const oldestKey = handoffs.keys().next().value\n if (oldestKey !== undefined) {\n handoffs.delete(oldestKey)\n }\n }\n handoffs.set(id, envelope)\n}\n\nfunction generateHandoffId(): string {\n return 'hndff_' + Math.random().toString(36).substring(2, 15)\n}\n\nfunction extractState(element: HTMLElement): Record<string, string> {\n const state: Record<string, string> = {}\n const attrs = [\n 'data-intent',\n 'disabled',\n 'checked',\n 'open',\n 'aria-busy',\n 'aria-invalid',\n 'aria-selected',\n 'aria-expanded'\n ]\n for (const attr of attrs) {\n const val = element.getAttribute(attr)\n if (val !== undefined && val !== null) {\n state[attr] = val === '' ? 'true' : val\n }\n }\n return state\n}\n\nfunction getElementSelector(el: HTMLElement, root: HTMLElement): string {\n const elementId = el.getAttribute('id')\n if (elementId) {\n return `#${elementId}`\n }\n\n const tag = el.tagName.toLowerCase()\n const parent = el.parentNode as HTMLElement | null\n\n if (!parent || parent === root || !parent.tagName) {\n const siblings = (root.childNodes || []).filter(\n (node): node is HTMLElement => node.nodeType === 1\n )\n const sameTagSiblings = siblings.filter(\n (node) => node.tagName && node.tagName.toLowerCase() === tag\n )\n const index = Math.max(1, sameTagSiblings.indexOf(el) + 1)\n return `${tag}:nth-of-type(${index})`\n }\n\n const siblings = (parent.childNodes || []).filter(\n (node): node is HTMLElement => node.nodeType === 1\n )\n const sameTagSiblings = siblings.filter(\n (node) => node.tagName && node.tagName.toLowerCase() === tag\n )\n const index = Math.max(1, sameTagSiblings.indexOf(el) + 1)\n\n const parentSelector = getElementSelector(parent, root)\n return `${parentSelector} > ${tag}:nth-of-type(${index})`\n}\n\nexport function createHandoff(args: {\n rendered_html: string\n metadata?: Record<string, unknown>\n}): MCPResponse {\n const { rendered_html, metadata } = args\n const root = parse(rendered_html)\n\n const id = generateHandoffId()\n const timestamp = Date.now()\n const components: HandoffComponent[] = []\n\n const componentTags = [\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'aside',\n 'mark',\n 'article',\n 'dialog',\n 'details',\n 'progress',\n 'meter',\n 'nav',\n 'hr',\n 'pre',\n 'table',\n 'ix-tabs',\n 'ix-dropdown',\n 'ix-combobox',\n 'ix-tooltip',\n 'ix-toast'\n ]\n\n const elements = root.querySelectorAll('*')\n for (const el of elements) {\n const tag = el.tagName.toLowerCase()\n if (componentTags.includes(tag) || el.getAttribute('data-intent')) {\n const selector = getElementSelector(el, root)\n\n const outerHtml = el.outerHTML\n const tokens = getTokenCount(outerHtml)\n const state = extractState(el)\n\n components.push({\n selector,\n emmet: outerHtml,\n state,\n tokens\n })\n }\n }\n\n const envelope: HandoffEnvelope = {\n schema: 'ignix-lite-handoff',\n version: '1.0',\n id,\n timestamp,\n html: rendered_html,\n components,\n total_tokens: getTokenCount(rendered_html),\n metadata\n }\n\n saveHandoff(id, envelope)\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n handoff_id: id,\n snapshot: {\n schema: envelope.schema,\n version: envelope.version,\n id: envelope.id,\n timestamp: envelope.timestamp,\n components: envelope.components.map((c) => ({\n selector: c.selector,\n emmet: c.emmet,\n state: c.state,\n tokens: c.tokens\n })),\n total_tokens: envelope.total_tokens,\n metadata: envelope.metadata\n },\n tokens_used: 10\n })\n }\n ]\n }\n}\n\nexport interface HandoffChange {\n selector: string\n action: 'update' | 'add' | 'remove'\n emmet?: string\n html?: string\n}\n\nexport function applyHandoff(args: {\n handoff_id: string\n changes: HandoffChange[]\n}): MCPResponse {\n const { handoff_id, changes } = args\n const envelope = handoffs.get(handoff_id)\n\n if (!envelope) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: `Handoff snapshot not found: ${handoff_id}`,\n tokens_used: 5\n })\n }\n ]\n }\n }\n\n // Assert that change.html or change.emmet is present for add and update actions\n for (const change of changes) {\n if (change.action === 'update' || change.action === 'add') {\n const hasHtml = change.html !== undefined && change.html !== null && change.html.trim() !== ''\n const hasEmmet = change.emmet !== undefined && change.emmet !== null && change.emmet.trim() !== ''\n if (!hasHtml && !hasEmmet) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: `Validation error: change for selector \"${change.selector}\" with action \"${change.action}\" must provide a non-empty \"html\" or \"emmet\" payload.`,\n tokens_used: 5\n })\n }\n ]\n }\n }\n }\n }\n\n const root = parse(envelope.html)\n let diffTokens = 0\n const failedSelectors: string[] = []\n const errors: string[] = []\n\n const sortedChanges = [...changes].sort((a, b) => {\n if (a.action === 'remove' && b.action !== 'remove') return 1\n if (a.action !== 'remove' && b.action === 'remove') return -1\n return 0\n })\n\n for (const change of sortedChanges) {\n try {\n const target = root.querySelector(change.selector)\n if (!target) {\n failedSelectors.push(change.selector)\n continue\n }\n\n const changeContent =\n change.html || (change.emmet ? expandEmmet(change.emmet) : '')\n diffTokens += getTokenCount(changeContent || change.selector)\n\n if (change.action === 'update') {\n const newNode = parse(changeContent)\n target.replaceWith(newNode)\n } else if (change.action === 'add') {\n const newNode = parse(changeContent)\n target.appendChild(newNode)\n } else if (change.action === 'remove') {\n target.remove()\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err)\n errors.push(\n `Failed to apply change on selector \"${change.selector}\": ${message}`\n )\n }\n }\n\n const updatedHtml = root.toString()\n const fullTokens = getTokenCount(updatedHtml)\n const savingsPct =\n fullTokens > 0 ? Math.round((1 - diffTokens / fullTokens) * 100) : 0\n\n envelope.html = updatedHtml\n envelope.total_tokens = fullTokens\n saveHandoff(handoff_id, envelope)\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n updated_html: updatedHtml,\n diff_tokens: diffTokens,\n full_tokens: fullTokens,\n savings_pct: Math.max(0, savingsPct),\n failed_selectors:\n failedSelectors.length > 0 ? failedSelectors : undefined,\n errors: errors.length > 0 ? errors : undefined,\n tokens_used: 15\n })\n }\n ]\n }\n}\n","import { z } from 'zod'\nimport type { MCPResponse } from '../types.js'\nimport { resolveTokens, buildCss } from './theme-tokens.js'\n\nconst schema = z.object({ prompt: z.string().min(1) })\n\nexport function generateTheme(args: unknown): MCPResponse {\n const parsed = schema.safeParse(args)\n\n if (!parsed.success) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: 'Invalid input',\n suggestion: 'Expected { prompt: string }',\n tokens_used: 2\n })\n }\n ]\n }\n }\n\n const { prompt } = parsed.data\n const tokens = resolveTokens(prompt.toLowerCase().trim())\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n prompt,\n primary: tokens.resolvedPrimary,\n isDark: tokens.isDark,\n css: buildCss(tokens),\n tokens_used: 10\n })\n }\n ]\n }\n}\n","import { z } from 'zod'\nimport { manifests } from '../manifests/index.js'\nimport type { MCPResponse } from '../types.js'\n\nconst schema = z.object({\n name: z.string()\n})\n\nexport function getEmmet(args: unknown): MCPResponse {\n const parsed = schema.safeParse(args)\n\n if (!parsed.success) {\n return {\n content: [\n {\n type: 'text',\n\n text: JSON.stringify({\n error: 'Invalid input',\n\n suggestion: 'Expected { name: string }',\n\n tokens_used: 2\n })\n }\n ]\n }\n }\n\n const { name } = parsed.data\n\n const manifest = manifests[name]\n\n if (!manifest) {\n return {\n content: [\n {\n type: 'text',\n\n text: JSON.stringify({\n error: `Unknown component: ${name}`,\n suggestion: 'Call list_components() first',\n tokens_used: 2\n })\n }\n ]\n }\n }\n\n return {\n content: [\n {\n type: 'text',\n\n text: JSON.stringify({\n component: manifest.component,\n emmet: manifest.emmet,\n tokens: manifest.tokens,\n tokens_used: 3\n })\n }\n ]\n }\n}\n","import { z } from 'zod'\nimport { manifests } from '../manifests/index.js'\nimport type { MCPResponse } from '../types.js'\n\nconst schema = z.object({\n name: z.string()\n})\n\nexport function getManifest(args: unknown): MCPResponse {\n const parsed = schema.safeParse(args)\n\n if (!parsed.success) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: 'Invalid input',\n suggestion: 'Expected { name: string }',\n tokens_used: 2\n })\n }\n ]\n }\n }\n\n const { name } = parsed.data\n\n const manifest = manifests[name]\n\n if (!manifest) {\n return {\n content: [\n {\n type: 'text',\n\n text: JSON.stringify({\n error: `Unknown component: ${name}`,\n suggestion: 'Call list_components() first',\n tokens_used: 2\n })\n }\n ]\n }\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(manifest)\n }\n ]\n }\n}\n","import { manifests } from '../manifests/index.js'\n\nimport type { MCPResponse } from '../types.js'\n\nexport function listComponents(): MCPResponse {\n const components = Object.keys(manifests).sort()\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n components,\n count: components.length,\n tokens_used: components.length\n })\n }\n ]\n }\n}\n","import type { MCPResponse } from '../types.js'\n\nexport type CallRecord = {\n tool: string\n tokens_used: number\n timestamp: number\n}\n\nlet totalTokensUsed = 0\nconst calls: CallRecord[] = []\nconst sessionId = Math.random().toString(36).substring(2, 15)\n\nconst MAX_CALL_HISTORY = 1000\n\nexport function recordCall(toolName: string, tokensUsed: number): void {\n const parsedTokens = Number(tokensUsed)\n const validTokens =\n isNaN(parsedTokens) || parsedTokens < 0 || !isFinite(parsedTokens)\n ? 0\n : parsedTokens\n\n if (calls.length >= MAX_CALL_HISTORY) {\n calls.shift()\n }\n calls.push({\n tool: toolName,\n tokens_used: validTokens,\n timestamp: Date.now()\n })\n totalTokensUsed += validTokens\n}\n\nexport function getTokenSummary(\n args: { context_window?: number } = {}\n): MCPResponse {\n const contextWindowInput = args.context_window || 128000\n const parsedWindow = Number(contextWindowInput)\n const contextWindow =\n isNaN(parsedWindow) || parsedWindow <= 0 || !isFinite(parsedWindow)\n ? 128000\n : parsedWindow\n\n const pct = Number(((totalTokensUsed / contextWindow) * 100).toFixed(4))\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n session_id: sessionId,\n calls,\n total_tokens_used: totalTokensUsed,\n estimated_context_pct: pct,\n tokens_used: 20\n })\n }\n ]\n }\n}\n"],"mappings":";AAAA,SAAS,cAAc,kBAAkB;AACzC,OAAO,UAAU;AACjB,SAAS,qBAAqB;;;ACF9B,SAAS,0BAA0B;AAEnC,IAAM,UAAU,mBAAmB,OAAO;AAEnC,SAAS,cAAc,OAAuB;AACnD,SAAO,QAAQ,OAAO,KAAK,EAAE;AAC/B;;;ADAA,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,KAAK,QAAQ,UAAU;AAEzC,SAAS,aAAa,MAAwB;AAC5C,MAAI,eAAe,KAAK,QAAQ,WAAW,WAAW;AACtD,MAAI,CAAC,WAAW,YAAY,KAAK,WAAW,KAAK,QAAQ,WAAW,IAAI,CAAC,GAAG;AAC1E,mBAAe;AAAA,EACjB;AACA,QAAM,eAAe,KAAK,QAAQ,cAAc,IAAI;AACpD,QAAM,WAAW,KAAK,MAAM,aAAa,cAAc,MAAM,CAAC;AAC9D,WAAS,SAAS,cAAc,SAAS,KAAK;AAC9C,SAAO;AACT;AAEO,IAAM,YAAsC;AAAA,EACjD,WAAW,aAAa,gBAAgB;AAAA,EACxC,OAAO,aAAa,YAAY;AAAA,EAChC,QAAQ,aAAa,aAAa;AAAA,EAClC,OAAO,aAAa,YAAY;AAAA,EAChC,YAAY,aAAa,iBAAiB;AAAA,EAC1C,QAAQ,aAAa,aAAa;AAAA,EAClC,MAAM,aAAa,WAAW;AAAA,EAC9B,UAAU,aAAa,eAAe;AAAA,EACtC,WAAW,aAAa,gBAAgB;AAAA,EACxC,UAAU,aAAa,eAAe;AAAA,EACtC,QAAQ,aAAa,aAAa;AAAA,EAClC,SAAS,aAAa,cAAc;AAAA,EACpC,UAAU,aAAa,eAAe;AAAA,EACtC,MAAM,aAAa,WAAW;AAAA,EAC9B,MAAM,aAAa,WAAW;AAAA,EAC9B,OAAO,aAAa,YAAY;AAAA,EAChC,OAAO,aAAa,YAAY;AAAA,EAChC,YAAY,aAAa,iBAAiB;AAAA,EAC1C,UAAU,aAAa,eAAe;AAAA,EACtC,OAAO,aAAa,YAAY;AAAA,EAChC,QAAQ,aAAa,aAAa;AAAA,EAClC,UAAU,aAAa,eAAe;AAAA,EACtC,KAAK,aAAa,UAAU;AAAA,EAC5B,OAAO,aAAa,YAAY;AAAA,EAChC,UAAU,aAAa,eAAe;AAAA,EACtC,OAAO,aAAa,YAAY;AAAA,EAChC,SAAS,aAAa,cAAc;AACtC;;;AEhDA,SAAS,aAAa;AA0BtB,SAAS,cAAc,MAAc,OAAuB;AACxD,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,SAAO,KAAK,UAAU,GAAG,KAAK,EAAE,MAAM,IAAI,EAAE;AAChD;AAEO,SAAS,aAAa,MAA4E;AACrG,QAAM,OAAO,MAAM,IAAI;AACvB,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAW,KAAK,iBAAiB,GAAG;AAE1C,QAAM,kBAAkB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,mBAAmB,oBAAI,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,aAAW,MAAM,UAAU;AACvB,UAAM,MAAM,GAAG,QAAQ,YAAY;AACnC,UAAM,QAAQ,GAAG;AACjB,UAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC,IAAI;AAC1C,UAAM,OAAO,cAAc,MAAM,QAAQ;AAEzC,UAAM,iBAAiB,GAAG,aAAa,kBAAkB;AACzD,QAAI,cAAc,mBAAmB,IAAI,WAAW,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI;AAE5E,QAAI,QAAQ,WAAW,MAAM,OAAO,YAAY;AAC5C,oBAAc;AAAA,IAClB;AAEA,QAAI,QAAQ,OAAO;AACf,oBAAc;AAAA,IAClB;AAEA,QAAI,QAAQ,aAAa,GAAG,cAAc,QAAQ,GAAG;AACjD,oBAAc;AAAA,IAClB;AAEA,QAAI,QAAQ,SAAS;AACjB,oBAAc;AAAA,IAClB;AAEA,QAAI,QAAQ,WAAW;AACnB,oBAAc;AAAA,IAClB;AAEA,QAAI,QAAQ,MAAM;AACd,oBAAc;AAAA,IAClB;AAEA,QAAI,WAAW,UAAU,WAAW;AAEpC,QAAI,CAAC,UAAU;AACX,UAAI,QAAQ,QAAQ;AAChB,mBAAW,UAAU;AAAA,MACzB;AACA,UAAI,QAAQ,UAAU,MAAM,SAAS,UAAU;AAC3C,mBAAW,UAAU;AAAA,MACzB;AAAA,IACJ;AAEA,QAAI,CAAC,YAAY,CAAC,gBAAgB,SAAS,GAAG,GAAG;AAC7C,aAAO,KAAK;AAAA,QACR,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,IAAI,GAAG;AAAA,QAChB,KAAK;AAAA,QACL,YAAY;AAAA,QACZ;AAAA,MACJ,CAAC;AACD;AAAA,IACJ;AAEA,QAAI,CAAC,SAAU;AAEf,UAAM,cAAc,IAAI,WAAW,KAAK,IAAI,MAAM,SAAS,WAAW;AAEtE,QAAI,SAAS,kBAAkB;AAC3B,YAAM,SAAS,GAAG;AAClB,UAAI,CAAC,UAAU,OAAO,SAAS,YAAY,MAAM,SAAS,kBAAkB;AACxE,eAAO,KAAK;AAAA,UACR,SAAS;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,IAAI,GAAG,qBAAqB,SAAS,gBAAgB;AAAA,UAC9D,KAAK,IAAI,SAAS,gBAAgB,KAAK,WAAW,MAAM,WAAW,MAAM,SAAS,gBAAgB;AAAA,UAClG,YAAY;AAAA,UACZ;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,QAAI,QAAQ,UAAU,SAAS,cAAc,WAAW,MAAM,SAAS,UAAU;AAC7E,aAAO,KAAK;AAAA,QACR,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,KAAK,uBAAuB,GAAG,SAAS;AAAA,QACxC,YAAY;AAAA,QACZ;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,QAAI,WAAW,OAAO;AAClB,aAAO,KAAK;AAAA,QACR,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,KAAK,IAAI,WAAW,IAAI,GAAG,SAAS,KAAK,WAAW;AAAA,QACpD,YAAY;AAAA,QACZ;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,eAAe,OAAO,KAAK,KAAK,EAAE;AAAA,MACpC,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,UAAU,CAAC,IAAI,WAAW,OAAO;AAAA,IACtE;AACA,QAAI,aAAa,SAAS,GAAG;AACzB,aAAO,KAAK;AAAA,QACR,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,KAAK,IAAI,WAAW,MAAM,WAAW;AAAA,QACrC,YAAY;AAAA,QACZ;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,eAAW,QAAQ,OAAO,KAAK,KAAK,GAAG;AACnC,UAAI,KAAK,WAAW,IAAI,GAAG;AACvB,eAAO,KAAK;AAAA,UACR,SAAS;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,KAAK,IAAI,WAAW,MAAM,WAAW;AAAA,UACrC,YAAY;AAAA,UACZ;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,eAAW,QAAQ,OAAO,KAAK,KAAK,GAAG;AACnC,UAAI,SAAS,iBAAiB,SAAS,IAAI,GAAG;AAC1C,eAAO,KAAK;AAAA,UACR,SAAS;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,IAAI,IAAI;AAAA,UACjB,KAAK,IAAI,WAAW,MAAM,WAAW;AAAA,UACrC,YAAY;AAAA,UACZ;AAAA,QACJ,CAAC;AACD;AAAA,MACJ;AAEA,UAAI,CAAC,SAAS,QAAQ,IAAI,KAAK,CAAC,iBAAiB,IAAI,IAAI,GAAG;AACxD,eAAO,KAAK;AAAA,UACR,SAAS;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,IAAI,IAAI;AAAA,UACjB,KAAK,IAAI,WAAW,MAAM,WAAW;AAAA,UACrC,YAAY;AAAA,UACZ;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,eAAW,QAAQ,OAAO,KAAK,KAAK,GAAG;AACnC,YAAM,MAAM,SAAS,QAAQ,IAAI;AACjC,UAAI,KAAK,QAAQ;AACb,cAAM,QAAQ,MAAM,IAAI;AACxB,YAAI,CAAC,IAAI,OAAO,SAAS,KAAK,GAAG;AAC7B,iBAAO,KAAK;AAAA,YACR,SAAS;AAAA,YACT,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,IAAI,KAAK;AAAA,YAClB,cAAc,IAAI;AAAA,YAClB,KAAK,IAAI,WAAW,IAAI,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC,OAAO,WAAW;AAAA,YAChE,YAAY;AAAA,YACZ;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AAEA,eAAW,OAAO,SAAS,kBAAkB,CAAC,GAAG;AAC7C,UAAI,EAAE,OAAO,QAAQ;AACjB,eAAO,KAAK;AAAA,UACR,SAAS;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,WAAW,GAAG;AAAA,UACvB,KAAK,IAAI,WAAW,IAAI,GAAG,SAAS,WAAW;AAAA,UAC/C,YAAY;AAAA,UACZ;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,UAAM,QAAQ,SAAS,SAAS,CAAC;AACjC,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,KAAK,GAAG;AACxD,YAAM,UAAU;AAChB,YAAM,QAAQ,GAAG,cAAc,UAAU,QAAQ,IAAI;AAErD,UAAI,QAAQ,YAAY,CAAC,OAAO;AAC5B,eAAO,KAAK;AAAA,UACR,SAAS;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,gBAAgB,QAAQ;AAAA,UACjC,KAAK,IAAI,WAAW,gBAAgB,QAAQ,cAAc,WAAW;AAAA,UACrE,YAAY;AAAA,UACZ;AAAA,QACJ,CAAC;AAAA,MACL;AAEA,UAAI,SAAS,QAAQ,SAAS;AAC1B,cAAM,WAAW,MAAM,QAAQ,YAAY;AAC3C,YAAI,CAAC,QAAQ,QAAQ,SAAS,QAAQ,GAAG;AACrC,iBAAO,KAAK;AAAA,YACR,SAAS;AAAA,YACT,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,GAAG,QAAQ,qBAAqB,QAAQ;AAAA,YACjD,cAAc,QAAQ;AAAA,YACtB,KAAK,IAAI,QAAQ,QAAQ,CAAC,CAAC,UAAU,QAAQ,OAAO,QAAQ,QAAQ,CAAC,CAAC;AAAA,YACtE,YAAY;AAAA,YACZ;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,QAAQ,OAAO,WAAW;AAChC,QAAM,QAAQ,QAAQ,MAAM,KAAK,IAAI,GAAG,MAAM,OAAO,SAAS,EAAE;AAEhE,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;;;AChWA,SAAS,SAAAA,cAAa;;;ACGtB,SAAS,WAAW,WAAmB,MAAc,OAAuB;AAC1E,SAAO,UAAU,QAAQ,6BAA6B,MAAM,IAAI,KAAK,KAAK,GAAG;AAC/E;AAEA,SAAS,KAAK,KAAa,MAAM,KAAa;AAC5C,SAAO,IAAI,SAAS,MAAM,IAAI,MAAM,GAAG,GAAG,IAAI,QAAQ;AACxD;AAEA,SAAS,aAAa,KAA2B;AAC/C,QAAM,OAAO,IAAI,aAAa,MAAM;AACpC,QAAM,aAAa,IAAI,aAAa,aAAa;AACjD,SAAO,SAAS,kBAAkB,SAAS,UAAU,eAAe;AACtE;AAGA,SAAS,mBACP,IACA,MACA,MACU;AACV,QAAM,MAAM,GAAG,aAAa,IAAI;AAChC,MAAI,CAAC,KAAK,KAAK,EAAG,QAAO,CAAC;AAC1B,SAAO,IACJ,KAAK,EACL,MAAM,KAAK,EACX,OAAO,CAAC,OAAO,CAAC,KAAK,cAAc,QAAQ,EAAE,IAAI,CAAC;AACvD;AAGA,SAAS,eAAe,IAAyB;AAC/C,MAAI,GAAG,aAAa,aAAa,MAAM,OAAQ,QAAO;AACtD,MAAI,SAAS;AACb,aAAW,SAAS,GAAG,YAAY;AACjC,QAAI,MAAM,aAAa,GAAG;AACxB,gBAAU,eAAe,KAAoB;AAAA,IAC/C,WAAW,MAAM,aAAa,GAAG;AAC/B,gBAAU,MAAM,QAAQ;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,IAAiB,MAA2B;AACrE,QAAM,OAAO,eAAe,EAAE,EAAE,KAAK;AACrC,MAAI,KAAM,QAAO;AAEjB,QAAM,YAAY,GAAG,aAAa,YAAY,GAAG,KAAK;AACtD,MAAI,UAAW,QAAO;AAEtB,QAAM,QAAQ,GAAG,aAAa,OAAO,GAAG,KAAK;AAC7C,MAAI,MAAO,QAAO;AAElB,QAAM,WAAW,GAAG,cAAc,KAAK;AACvC,QAAM,WAAW,UAAU,aAAa,KAAK,GAAG,KAAK;AACrD,MAAI,SAAU,QAAO;AAErB,QAAM,aAAa,GAAG,aAAa,iBAAiB;AACpD,MAAI,YAAY;AACd,UAAM,OAAO,WACV,KAAK,EACL,MAAM,KAAK,EACX,IAAI,CAAC,OAAO,KAAK,cAAc,QAAQ,EAAE,IAAI,GAAG,KAAK,KAAK,KAAK,EAAE,EACjE,KAAK,GAAG,EACR,KAAK;AACR,QAAI,KAAM,QAAO;AAAA,EACnB;AAEA,SAAO;AACT;AAEO,SAAS,YAAY,MAA+B;AACzD,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAE7B,OAAK,iBAAiB,KAAK,EAAE,QAAQ,CAAC,QAAQ;AAC5C,UAAM,MAAM,IAAI,aAAa,KAAK;AAClC,UAAM,YAAY,IAAI,aAAa,YAAY,GAAG,KAAK;AACvD,UAAM,aAAa,IAAI,aAAa,iBAAiB;AACrD,UAAM,cAAc,CAAC,EAAE,aAAa;AAEpC,QAAI,QAAQ,QAAW;AACrB,UAAI,aAAa;AACf,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,KAAK,IAAI,SAAS;AAAA,UAC3B,SACE;AAAA,UACF,KAAK;AAAA,YACH,IAAI;AAAA,YACJ;AAAA,YACA,aAAa;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,KAAK,IAAI,SAAS;AAAA,UAC3B,SAAS;AAAA,UACT,KAAK,WAAW,IAAI,WAAW,OAAO,sBAAsB;AAAA,QAC9D,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,IAAI,KAAK,MAAM,MAAM,CAAC,aAAa,GAAG,GAAG;AAC3C,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,IAAI,SAAS;AAAA,QAC3B,SACE;AAAA,QACF,KAAK,WAAW,IAAI,WAAW,QAAQ,cAAc;AAAA,MACvD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,gBAAgB,MAA+B;AAC7D,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAC7B,QAAM,iBAAiB,oBAAI,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,aAAW,OAAO,CAAC,SAAS,UAAU,UAAU,GAAY;AAC1D,SAAK,iBAAiB,GAAG,EAAE,QAAQ,CAAC,OAAO;AACzC,UAAI,QAAQ,SAAS;AACnB,cAAM,QAAQ,GAAG,aAAa,MAAM,KAAK,QAAQ,YAAY;AAC7D,YAAI,eAAe,IAAI,IAAI,EAAG;AAAA,MAChC;AAEA,YAAM,KAAK,GAAG,aAAa,IAAI;AAC/B,YAAM,cAAc,KAChB,CAAC,CAAC,KAAK,cAAc,cAAc,EAAE,IAAI,IACzC;AACJ,YAAM,cAAc,CAAC,CAAC,GAAG,QAAQ,OAAO;AACxC,YAAM,YAAY,GAAG,aAAa,YAAY,GAAG,KAAK;AACtD,YAAM,iBAAiB,GAAG,aAAa,iBAAiB;AACxD,YAAM,WAAW,CAAC,CAAC,GAAG,aAAa,OAAO,GAAG,KAAK;AAElD,UACE,CAAC,eACD,CAAC,eACD,CAAC,aACD,CAAC,kBACD,CAAC,UACD;AACA,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,KAAK,GAAG,SAAS;AAAA,UAC1B,SAAS,IAAI,GAAG;AAAA,UAChB,KAAK,KACD,eAAe,EAAE;AAAA,EAA2B,GAAG,SAAS,KACxD,uBAAuB,GAAG,SAAS;AAAA,QACzC,CAAC;AACD;AAAA,MACF;AAGA,UAAI,gBAAgB;AAClB,cAAM,SAAS,mBAAmB,IAAI,mBAAmB,IAAI;AAC7D,YAAI,OAAO,SAAS,GAAG;AACrB,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,KAAK,GAAG,SAAS;AAAA,YAC1B,SAAS,IAAI,GAAG,yDAAyD,OAAO,IAAI,CAACC,QAAO,IAAIA,GAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,YAChH,KAAK,8BAA8B,OAAO,KAAK,MAAM,CAAC;AAAA,UACxD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,OAAK,iBAAiB,UAAU,EAAE,QAAQ,CAAC,aAAa;AACtD,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAI,CAAC,UAAU,CAAC,OAAO,KAAK,KAAK,GAAG;AAClC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,QACF,KAAK;AAAA;AAAA;AAAA;AAAA,MACP,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,iBAAiB,MAA+B;AAC9D,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAE7B,OAAK,iBAAiB,OAAO,EAAE,QAAQ,CAAC,UAAU;AAChD,UAAM,UAAU,CAAC,CAAC,MAAM,KAAK,KAAK;AAClC,UAAM,eAAe,CAAC,CAAC,MAAM,aAAa,YAAY,GAAG,KAAK;AAE9D,QAAI,CAAC,WAAW,CAAC,cAAc;AAC7B,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,MAAM,SAAS;AAAA,QAC7B,SACE;AAAA,QACF,KAAK,MAAM,UAAU,QAAQ,YAAY,sBAAsB;AAAA,MACjE,CAAC;AAAA,IACH;AAGA,UAAM,UAAU,MAAM,aAAa,KAAK;AACxC,QAAI,WAAW,CAAC,KAAK,cAAc,QAAQ,OAAO,IAAI,GAAG;AACvD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,MAAM,SAAS;AAAA,QAC7B,SAAS,eAAe,OAAO,qBAAqB,OAAO;AAAA,QAC3D,KAAK,WAAW,OAAO;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,aAAa,MAA+B;AAC1D,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAE7B,OAAK,iBAAiB,QAAQ,EAAE,QAAQ,CAAC,WAAW;AAClD,QAAI,CAAC,kBAAkB,QAAQ,IAAI,GAAG;AACpC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,OAAO,SAAS;AAAA,QAC9B,SACE;AAAA,QACF,KAAK,WAAW,OAAO,WAAW,cAAc,sBAAsB;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,WAAW,MAA+B;AACxD,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAC7B,QAAM,QAAQ,oBAAI,IAAI;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,OAAK,iBAAiB,GAAG,EAAE,QAAQ,CAAC,SAAS;AAC3C,UAAM,OAAO,kBAAkB,MAAM,IAAI;AACzC,UAAM,OAAO,KAAK,aAAa,MAAM;AACrC,UAAM,eAAe,KAAK,aAAa,MAAM,MAAM;AAEnD,QAAI,CAAC,MAAM;AACT,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,KAAK,SAAS;AAAA,QAC5B,SACE;AAAA,QACF,KAAK;AAAA,UACH,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,QAAI,MAAM,IAAI,KAAK,YAAY,CAAC,GAAG;AACjC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,KAAK,SAAS;AAAA,QAC5B,SAAS,iCAAiC,IAAI;AAAA,QAC9C,KAAK;AAAA,UACH,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,QAAQ,CAAC,cAAc;AAC1B,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,KAAK,SAAS;AAAA,QAC5B,SACE;AAAA,QACF,KAAK,KAAK,UAAU,QAAQ,SAAS,aAAa;AAAA,MACpD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,gBAAgB,MAA+B;AAC7D,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAG7B,OAAK,iBAAiB,gBAAgB,EAAE,QAAQ,CAAC,OAAO;AACtD,UAAM,aAAa,GAAG,aAAa,cAAc;AACjD,UAAM,uBAAuB,oBAAI,IAAI;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,CAAC,qBAAqB,IAAI,cAAc,EAAE,GAAG;AAC/C,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,GAAG,SAAS;AAAA,QAC1B,SAAS,iBAAiB,UAAU;AAAA,QACpC,KAAK,GAAG,UAAU;AAAA,UAChB,iBAAiB,UAAU;AAAA,UAC3B;AAAA,QACF;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,QAAI,eAAe,QAAQ;AACzB,YAAM,cAAc,GAAG,aAAa,kBAAkB;AACtD,UAAI,CAAC,aAAa;AAChB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,KAAK,GAAG,SAAS;AAAA,UAC1B,SACE;AAAA,UACF,KAAK,WAAW,GAAG,WAAW,oBAAoB,kBAAkB;AAAA,QACtE,CAAC;AAAA,MACH,OAAO;AAEL,cAAM,SAAS,mBAAmB,IAAI,oBAAoB,IAAI;AAC9D,YAAI,OAAO,SAAS,GAAG;AACrB,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,KAAK,GAAG,SAAS;AAAA,YAC1B,SAAS,wDAAwD,OAAO,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,YACxG,KAAK,8BAA8B,OAAO,KAAK,MAAM,CAAC;AAAA,UACxD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,QAAQ,oBAAoB;AACrC,SAAK,iBAAiB,IAAI,IAAI,GAAG,EAAE,QAAQ,CAAC,OAAO;AACjD,YAAM,MAAM,GAAG,aAAa,IAAI;AAChC,UAAI,QAAQ,UAAU,QAAQ,SAAS;AACrC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,KAAK,GAAG,SAAS;AAAA,UAC1B,SAAS,GAAG,IAAI,oCAAoC,GAAG;AAAA,UACvD,KAAK,GAAG,UAAU,QAAQ,GAAG,IAAI,KAAK,GAAG,KAAK,GAAG,IAAI,SAAS;AAAA,QAChE,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAGA,OAAK,iBAAiB,gBAAgB,EAAE,QAAQ,CAAC,OAAO;AACtD,UAAM,MAAM,GAAG,aAAa,cAAc;AAC1C,QAAI,QAAQ,UAAU,QAAQ,WAAW,QAAQ,SAAS;AACxD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,GAAG,SAAS;AAAA,QAC1B,SAAS,0EAA0E,GAAG;AAAA,QACtF,KAAK,GAAG,UAAU;AAAA,UAChB,iBAAiB,GAAG;AAAA,UACpB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGD,QAAM,kBAAkB,oBAAI,IAAI,CAAC,OAAO,UAAU,WAAW,CAAC;AAC9D,OAAK,iBAAiB,aAAa,EAAE,QAAQ,CAAC,OAAO;AACnD,UAAM,MAAM,GAAG,aAAa,WAAW,KAAK;AAC5C,QAAI,CAAC,gBAAgB,IAAI,GAAG,GAAG;AAC7B,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,GAAG,SAAS;AAAA,QAC1B,SAAS,cAAc,GAAG;AAAA,QAC1B,KAAK,GAAG,UAAU,QAAQ,cAAc,GAAG,KAAK,oBAAoB;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,kBAAkB,MAA+B;AAC/D,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAC7B,QAAM,OAAO,oBAAI,IAAoB;AAErC,OAAK,iBAAiB,MAAM,EAAE,QAAQ,CAAC,OAAO;AAC5C,UAAM,KAAK,GAAG,aAAa,IAAI;AAG/B,QAAI,OAAO,UAAa,GAAG,KAAK,MAAM,IAAI;AACxC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,GAAG,SAAS;AAAA,QAC1B,SAAS;AAAA,QACT,KAAK,GAAG,UAAU,QAAQ,SAAS,kBAAkB;AAAA,MACvD,CAAC;AACD;AAAA,IACF;AAEA,QAAI,GAAI,MAAK,IAAI,KAAK,KAAK,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,EAC9C,CAAC;AAED,OAAK,QAAQ,CAAC,OAAO,OAAO;AAC1B,QAAI,QAAQ,GAAG;AACb,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,OAAO,EAAE;AAAA,QAClB,SAAS,OAAO,EAAE,aAAa,KAAK;AAAA,QACpC,KAAK,6BAA6B,EAAE;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,cAAc,MAA+B;AAC3D,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAE7B,OAAK,iBAAiB,YAAY,EAAE,QAAQ,CAAC,OAAO;AAClD,UAAM,MAAM,GAAG,aAAa,UAAU,KAAK;AAC3C,UAAM,MAAM,SAAS,KAAK,EAAE;AAE5B,QAAI,MAAM,GAAG,GAAG;AACd,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,GAAG,SAAS;AAAA,QAC1B,SAAS,aAAa,GAAG;AAAA,QACzB,KAAK,GAAG,UAAU,QAAQ,aAAa,GAAG,KAAK,cAAc;AAAA,MAC/D,CAAC;AACD;AAAA,IACF;AAEA,QAAI,MAAM,GAAG;AACX,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,GAAG,SAAS;AAAA,QAC1B,SAAS,aAAa,GAAG;AAAA,QACzB,KAAK,GAAG,UAAU,QAAQ,aAAa,GAAG,KAAK,cAAc;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,cAAc,MAA+B;AAC3D,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAC7B,QAAM,WAAW,KAAK,iBAAiB,wBAAwB;AAE/D,MAAI,YAAY;AAChB,MAAI,UAAU;AAEd,WAAS,QAAQ,CAAC,MAAM;AACtB,UAAM,MAAM,EAAE,QAAQ,YAAY;AAClC,UAAM,QAAQ,SAAS,EAAE,QAAQ,MAAM,CAAC,GAAG,EAAE;AAE7C,QAAI,CAAC,EAAE,KAAK,KAAK,GAAG;AAClB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,EAAE,SAAS;AAAA,QACzB,SAAS,IAAI,GAAG;AAAA,QAChB,KAAK,IAAI,GAAG,oBAAoB,GAAG;AAAA,MACrC,CAAC;AAAA,IACH;AAEA,QAAI,UAAU,EAAG;AAEjB,QAAI,YAAY,KAAK,QAAQ,YAAY,GAAG;AAC1C,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,EAAE,SAAS;AAAA,QACzB,SAAS,uBAAuB,SAAS,QAAQ,KAAK,WAAW,YAAY,CAAC;AAAA,QAC9E,KAAK,KAAK,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,MAAM,YAAY,CAAC;AAAA,MAC7D,CAAC;AAAA,IACH;AAEA,gBAAY;AAAA,EACd,CAAC;AAED,MAAI,UAAU,GAAG;AACf,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,GAAG,OAAO;AAAA,MACnB,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,YAAY,MAA+B;AACzD,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAE7B,OAAK,iBAAiB,OAAO,EAAE,QAAQ,CAAC,UAAU;AAEhD,UAAM,OAAO,MAAM,aAAa,MAAM;AACtC,QAAI,SAAS,kBAAkB,SAAS,OAAQ;AAEhD,UAAM,UAAU,MAAM,cAAc,SAAS;AAC7C,UAAM,YAAY,MAAM,aAAa,YAAY;AACjD,UAAM,iBAAiB,MAAM,aAAa,iBAAiB;AAE3D,QAAI,CAAC,WAAW,CAAC,aAAa,CAAC,gBAAgB;AAC7C,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,QACF,KAAK,WAAW,WAAW,cAAc,sBAAsB;AAAA,MACjE,CAAC;AAAA,IACH;AAGA,QAAI,WAAW,CAAC,QAAQ,KAAK,KAAK,GAAG;AACnC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,QAAQ,SAAS;AAAA,QAC/B,SACE;AAAA,QACF,KAAK,QAAQ,UAAU;AAAA,UACrB;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,iBAAiB,IAAI,EAAE,QAAQ,CAAC,OAAO;AAC3C,UAAI,CAAC,GAAG,aAAa,OAAO,GAAG;AAC7B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,KAAK,GAAG,SAAS;AAAA,UAC1B,SACE;AAAA,UACF,KAAK,WAAW,GAAG,WAAW,SAAS,KAAK;AAAA,QAC9C,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,aAAa,MAA+B;AAC1D,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAE7B,OAAK,iBAAiB,QAAQ,EAAE,QAAQ,CAAC,WAAW;AAClD,UAAM,KAAK,OAAO,aAAa,IAAI;AACnC,UAAM,YAAY,OAAO,aAAa,YAAY;AAClD,UAAM,iBAAiB,OAAO,aAAa,iBAAiB;AAE5D,QAAI,CAAC,IAAI;AACP,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,QACF,KAAK,WAAW,YAAY,MAAM,WAAW;AAAA,MAC/C,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,aAAa,CAAC,gBAAgB;AACjC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,QACF,KAAK,KACD,eAAe,EAAE,kDACjB;AAAA,MACN,CAAC;AAAA,IACH,WAAW,gBAAgB;AAEzB,YAAM,SAAS,mBAAmB,QAAQ,mBAAmB,IAAI;AACjE,UAAI,OAAO,SAAS,GAAG;AACrB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,8DAA8D,OAAO,IAAI,CAACA,QAAO,IAAIA,GAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,UAC9G,KAAK,8BAA8B,OAAO,KAAK,MAAM,CAAC;AAAA,QACxD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,WAAW,MAA+B;AACxD,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAC7B,QAAM,uBAAuB,oBAAI,IAAI;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,OAAK,iBAAiB,iBAAiB,EAAE,QAAQ,CAAC,OAAO;AACvD,UAAM,MAAM,GAAG,QAAQ,YAAY;AACnC,UAAM,WAAW,GAAG,aAAa,UAAU;AAC3C,QAAI,CAAC,qBAAqB,IAAI,GAAG,KAAK,aAAa,KAAK;AACtD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,GAAG,SAAS;AAAA,QAC1B,SACE;AAAA,QACF,KAAK,WAAW,GAAG,WAAW,YAAY,GAAG;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGD,aAAW,QAAQ;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAY;AACV,SAAK,iBAAiB,UAAU,IAAI,IAAI,EAAE,QAAQ,CAAC,OAAO;AACxD,UAAI,CAAC,GAAG,aAAa,cAAc,GAAG;AACpC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,KAAK,GAAG,SAAS;AAAA,UAC1B,SAAS,SAAS,IAAI,6DAA6D,SAAS,aAAa,cAAc,EAAE;AAAA,UACzH,KAAK,WAAW,GAAG,WAAW,gBAAgB,OAAO;AAAA,QACvD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,OAAK,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,OAAO;AACzD,QAAI,CAAC,GAAG,aAAa,eAAe,GAAG;AACrC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,GAAG,SAAS;AAAA,QAC1B,SAAS;AAAA,QACT,KAAK,WAAW,GAAG,WAAW,iBAAiB,OAAO;AAAA,MACxD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGD,aAAW,QAAQ,CAAC,OAAO,UAAU,YAAY,UAAU,GAAY;AACrE,SAAK,iBAAiB,UAAU,IAAI,IAAI,EAAE,QAAQ,CAAC,OAAO;AACxD,UAAI,CAAC,GAAG,aAAa,eAAe,GAAG;AACrC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,KAAK,GAAG,SAAS;AAAA,UAC1B,SAAS,SAAS,IAAI;AAAA,UACtB,KAAK,WAAW,GAAG,WAAW,iBAAiB,OAAO;AAAA,QACxD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,OAAK,iBAAiB,iBAAiB,EAAE,QAAQ,CAAC,OAAO;AACvD,UAAM,WAAW,CAAC,iBAAiB,iBAAiB,eAAe;AACnE,UAAM,UAAU,SAAS,OAAO,CAAC,SAAS,CAAC,GAAG,aAAa,IAAI,CAAC;AAChE,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,GAAG,SAAS;AAAA,QAC1B,SAAS,iDAAiD,QAAQ,KAAK,IAAI,CAAC;AAAA,QAC5E,KAAK;AAAA,MACP,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,OAAK,iBAAiB,sBAAsB,EAAE,QAAQ,CAAC,OAAO;AAC5D,QACE,CAAC,GAAG,aAAa,eAAe,KAChC,CAAC,GAAG,aAAa,gBAAgB,GACjC;AACA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,GAAG,SAAS;AAAA,QAC1B,SACE;AAAA,QACF,KAAK,WAAW,GAAG,WAAW,iBAAiB,GAAG;AAAA,MACpD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,OAAK,iBAAiB,kBAAkB,EAAE,QAAQ,CAAC,OAAO;AACxD,QAAI,CAAC,kBAAkB,IAAI,IAAI,GAAG;AAChC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,GAAG,SAAS;AAAA,QAC1B,SACE;AAAA,QACF,KAAK;AAAA,UACH,GAAG;AAAA,UACH;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,kBAAkB,MAA+B;AAC/D,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAE7B,QAAM,oBAA4C;AAAA,IAChD,OAAO;AAAA,IACP,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AAEA,OAAK,iBAAiB,OAAO,EAAE,QAAQ,CAAC,UAAU;AAChD,UAAM,QAAQ,MAAM,aAAa,MAAM,KAAK,QAAQ,YAAY;AAChE,UAAM,WAAW,kBAAkB,IAAI;AAEvC,QAAI,YAAY,CAAC,MAAM,aAAa,cAAc,GAAG;AACnD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,MAAM,SAAS;AAAA,QAC7B,SAAS,gBAAgB,IAAI,gCAAgC,QAAQ;AAAA,QACrE,KAAK,WAAW,MAAM,WAAW,gBAAgB,QAAQ;AAAA,MAC3D,CAAC;AAAA,IACH;AAEA,QAAI,SAAS,cAAc,CAAC,MAAM,aAAa,cAAc,GAAG;AAC9D,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,MAAM,SAAS;AAAA,QAC7B,SACE;AAAA,QACF,KAAK,WAAW,MAAM,WAAW,gBAAgB,kBAAkB;AAAA,MACrE,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,gBAAgB,MAA+B;AAC7D,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAC7B,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,OAAK,iBAAiB,SAAS,EAAE,QAAQ,CAAC,OAAO;AAC/C,UAAM,QAAQ,GAAG,aAAa,OAAO,KAAK;AAC1C,QAAI,YAAY,KAAK,CAAC,OAAO,GAAG,KAAK,KAAK,CAAC,GAAG;AAC5C,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,KAAK,GAAG,SAAS;AAAA,QAC1B,SACE;AAAA,QACF,KAAK,GAAG,UACL,QAAQ,wCAAwC,EAAE,EAClD,QAAQ,gCAAgC,EAAE;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEO,SAAS,UAAU,MAA+B;AACvD,QAAM,WAAW;AACjB,QAAM,SAAsB,CAAC;AAE7B,QAAM,SAAS,KAAK,cAAc,MAAM;AACxC,MAAI,UAAU,CAAC,OAAO,aAAa,MAAM,GAAG,KAAK,GAAG;AAClD,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SACE;AAAA,MACF,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,UAAU,OAAO;AAC5B;;;ADl1BA,IAAM,mBAAuE;AAAA,EACzE,+BAA+B,EAAE,OAAO,MAAM,SAAS,IAAK;AAAA,EAC5D,0BAA0B,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,EACvD,2BAA2B,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,EACxD,2BAA2B,EAAE,OAAO,MAAM,SAAS,IAAK;AAAA,EACxD,2BAA2B,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,EACxD,mCAAmC,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,EAChE,gCAAgC,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,EAC7D,sBAAsB,EAAE,OAAO,MAAM,SAAS,IAAK;AAAA,EACnD,uBAAuB,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,EACpD,gCAAgC,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,EAC7D,8BAA8B,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,EAC3D,mCAAmC,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,EAChE,qCAAqC,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,EAClE,4BAA4B,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,EACzD,4BAA4B,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,EACzD,+BAA+B,EAAE,OAAO,MAAM,SAAS,IAAK;AAChE;AAEA,SAAS,qBACL,UACA,MACM;AACN,QAAM,OAAO,iBAAiB,QAAQ;AACtC,MAAI,MAAM;AACN,WAAO,SAAS,UAAU,KAAK,QAAQ,KAAK;AAAA,EAChD;AACA,SAAO,SAAS,UAAU,OAAO;AACrC;AAEA,SAAS,aAAa,QAA6B;AAC/C,QAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE;AACxD,QAAM,WAAW,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE;AAC5D,SAAO,KAAK,IAAI,GAAG,MAAM,SAAS,KAAK,WAAW,CAAC;AACvD;AAEA,SAAS,gBAAgB,SAAiC;AACtD,SAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ;AAC7E;AAEO,SAAS,UAAU,MAAsF;AAC5G,QAAM,OAAOC,OAAM,IAAI;AAEvB,QAAM,UAAwB;AAAA,IAC1B,YAAY,IAAI;AAAA,IAChB,gBAAgB,IAAI;AAAA,IACpB,iBAAiB,IAAI;AAAA,IACrB,aAAa,IAAI;AAAA,IACjB,WAAW,IAAI;AAAA,IACf,gBAAgB,IAAI;AAAA,IACpB,kBAAkB,IAAI;AAAA,IACtB,cAAc,IAAI;AAAA,IAClB,cAAc,IAAI;AAAA,IAClB,YAAY,IAAI;AAAA,IAChB,aAAa,IAAI;AAAA,IACjB,WAAW,IAAI;AAAA,IACf,kBAAkB,IAAI;AAAA,IACtB,gBAAgB,IAAI;AAAA,IACpB,UAAU,IAAI;AAAA,EAClB;AAEA,QAAM,YAAY,QAAQ,QAAQ,CAAC,MAAM,EAAE,MAAM;AACjD,QAAM,SAAsB,UAAU,IAAI,CAAC,OAAO;AAAA,IAC9C,GAAG;AAAA,IACH,YAAY,qBAAqB,EAAE,MAAM,EAAE,IAAI;AAAA,EACnD,EAAE;AACF,QAAM,SAAS,gBAAgB,OAAO;AACtC,QAAM,QAAQ,aAAa,MAAM;AAEjC,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACV;AACJ;;;AE1FO,IAAM,UAAsC;AAAA,EACjD,KAAK,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAC/C,QAAQ,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAClD,OAAO,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EACjD,QAAQ,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAClD,MAAM,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAChD,OAAO,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EACjD,SAAS,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EACnD,MAAM,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAChD,MAAM,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAChD,KAAK,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAC/C,MAAM,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAChD,QAAQ,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAClD,QAAQ,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAClD,QAAQ,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAClD,SAAS,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EACnD,MAAM,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAChD,MAAM,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAChD,WAAW,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EACrD,MAAM,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAChD,KAAK,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAC/C,QAAQ,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAClD,QAAQ,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAClD,OAAO,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EACjD,QAAQ,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAClD,UAAU,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EACpD,UAAU,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EACpD,OAAO,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EACjD,OAAO,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EACjD,MAAM,EAAE,SAAS,WAAW,UAAU,UAAU;AAAA,EAChD,QAAQ,EAAE,SAAS,WAAW,UAAU,UAAU;AACpD;AAEO,SAAS,UAAU,KAAqB;AAC7C,QAAM,IAAI,IAAI,QAAQ,KAAK,EAAE;AAC7B,SAAO,EAAE,WAAW,IAAI,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AAC1E;AAEO,SAAS,YAAY,MAAsB;AAChD,QAAM,IAAI,KAAK,QAAQ,KAAK,EAAE;AAC9B,QAAM,IAAI,SAAS,EAAE,UAAU,GAAG,CAAC,GAAG,EAAE;AACxC,QAAM,IAAI,SAAS,EAAE,UAAU,GAAG,CAAC,GAAG,EAAE;AACxC,QAAM,IAAI,SAAS,EAAE,UAAU,GAAG,CAAC,GAAG,EAAE;AACxC,UAAQ,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO,MAAO,MAAM,YAAY;AAClE;AAEO,SAAS,aAAa,OAA2B;AACtD,QAAM,WAAW,MAAM,MAAM,oCAAoC;AACjE,MAAI,UAAU;AACZ,UAAM,UAAU,UAAU,SAAS,CAAC,CAAC;AACrC,WAAO,EAAE,SAAS,UAAU,YAAY,OAAO,EAAE;AAAA,EACnD;AAEA,QAAM,SAAS,OAAO,KAAK,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AACtE,aAAW,QAAQ,QAAQ;AACzB,QAAI,MAAM,SAAS,IAAI,EAAG,QAAO,QAAQ,IAAI;AAAA,EAC/C;AAEA,SAAO,EAAE,SAAS,WAAW,UAAU,UAAU;AACnD;;;ACnBO,SAAS,cAAc,OAA4B;AACxD,QAAM,EAAE,SAAS,SAAS,IAAI,aAAa,KAAK;AAEhD,QAAM,SACJ,MAAM,SAAS,MAAM,KACrB,MAAM,SAAS,OAAO,KACtB,MAAM,SAAS,UAAU,KACzB,MAAM,SAAS,WAAW,KAC1B,MAAM,SAAS,KAAK;AAEtB,QAAM,QACJ,MAAM,SAAS,OAAO,KACtB,MAAM,SAAS,MAAM,KACrB,MAAM,SAAS,QAAQ;AACzB,QAAM,QACJ,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM;AAE5E,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB;AAAA,IAEA;AAAA,IACA,cAAc,SACV,qDACA;AAAA,IACJ,iBAAiB,SACb,qDACA;AAAA,IACJ,WAAW,SACP,uDACA;AAAA,IAEJ,QAAQ;AAAA,IACR,YAAY,SAAS,YAAY;AAAA,IACjC,UAAU,SAAS,YAAY;AAAA,IAE/B,SAAS,SAAS,YAAY;AAAA,IAC9B,WAAW,SAAS,YAAY;AAAA,IAEhC,SAAS;AAAA,IACT,WAAW,SAAS,YAAY;AAAA,IAEhC,QAAQ,SAAS,YAAY;AAAA,IAC7B,SAAS,SAAS,YAAY;AAAA,IAC9B,SAAS,SAAS,YAAY;AAAA,IAE9B,SAAS,SAAS,YAAY;AAAA,IAC9B,eAAe,SAAS,YAAY;AAAA,IAEpC,MAAM,SAAS,YAAY;AAAA,IAC3B,WAAW,SAAS,YAAY;AAAA,IAChC,QAAQ,SAAS,YAAY;AAAA,IAE7B,QAAQ,QAAQ,QAAQ,QAAQ,YAAY;AAAA,IAC5C,UAAU,QAAQ,QAAQ,QAAQ,SAAS;AAAA,IAC3C,aAAa;AAAA,IAEb,YAAY,SAAS,YAAY;AAAA,IACjC,iBAAiB,SAAS,0BAA0B;AAAA,IAEpD,eAAe;AAAA,IACf,aAAa;AAAA,IACb,eAAe,SAAS,YAAY;AAAA,EACtC;AACF;AAEO,SAAS,SAAS,GAAwB;AAC/C,SAAO;AAAA,2BACkB,EAAE,OAAO;AAAA,2BACT,EAAE,YAAY;AAAA,2BACd,EAAE,eAAe;AAAA;AAAA,sBAEtB,EAAE,MAAM;AAAA,sBACR,EAAE,UAAU;AAAA;AAAA,kBAEhB,EAAE,OAAO;AAAA,kBACT,EAAE,OAAO;AAAA,kBACT,EAAE,OAAO;AAAA;AAAA;AAAA,qBAGN,EAAE,SAAS;AAAA,qBACX,EAAE,QAAQ;AAAA,qBACV,EAAE,SAAS;AAAA,qBACX,EAAE,SAAS;AAAA,qBACX,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKR,EAAE,gBAAgB;AAAA;AAAA,kBAErB,EAAE,OAAO;AAAA;AAAA,yBAEF,EAAE,OAAO;AAAA,yBACT,EAAE,aAAa;AAAA;AAAA,qBAEnB,EAAE,IAAI;AAAA,qBACN,EAAE,SAAS;AAAA;AAAA,iBAEf,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAkBF,EAAE,MAAM;AAAA,uBACR,EAAE,QAAQ;AAAA,uBACV,EAAE,WAAW;AAAA;AAAA;AAAA;AAAA,gDAIY,EAAE,aAAa,KAAK,EAAE,WAAW;AAAA,gDACjC,EAAE,aAAa,KAAK,EAAE,aAAa;AAAA;AAAA,2BAExD,EAAE,UAAU;AAAA,2BACZ,EAAE,eAAe;AAAA;AAE5C;;;AC/KA,OAAOC,WAAU;AACjB,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AACzC,SAAS,iBAAAC,sBAAqB;;;ACF9B,IAAM,aAAa;AAEZ,SAAS,UAAU,MAAwB;AAChD,QAAM,SAAS,IAAI,MAAM,UAAU,EAAE,KAAK,CAAC;AAC3C,QAAM,QAAQ,KACX,YAAY,EACZ,QAAQ,gBAAgB,GAAG,EAC3B,MAAM,KAAK,EACX,OAAO,OAAO;AACjB,QAAM,QAAQ,CAAC,SAAS;AACtB,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAQ,OAAO,KAAK,KAAK,WAAW,CAAC,KAAK;AAAA,IAC5C;AACA,WAAO,IAAI,KAAK;AAAA,EAClB,CAAC;AACD,SAAO;AACT;;;ACjBO,SAAS,iBAAiB,GAAa,GAAqB;AACjE,MAAI,MAAM;AACV,MAAI,OAAO;AACX,MAAI,OAAO;AAEX,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,WAAO,EAAE,CAAC,IAAI,EAAE,CAAC;AACjB,YAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;AAClB,YAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,EACpB;AAEA,MAAI,SAAS,KAAK,SAAS,EAAG,QAAO;AAErC,SAAO,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;AAChD;;;ACdO,IAAM,aAAa,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,SAAS,MAAwB;AAC/C,SAAO,KACJ,YAAY,EACZ,QAAQ,iBAAiB,GAAG,EAC5B,MAAM,QAAQ,EACd,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;AACrD;AAEO,SAAS,aAAa,IAAY,IAAoB;AAC3D,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,KAAK,GAAG,QAAQ,KAAK;AACnC,QAAI,YAAY;AAChB,aAAS,IAAI,GAAG,KAAK,GAAG,QAAQ,KAAK;AACnC,UAAI,MAAM,GAAG;AACX,cAAM,CAAC,IAAI;AAAA,MACb,OAAO;AACL,YAAI,IAAI,GAAG;AACT,cAAI,WAAW,MAAM,IAAI,CAAC;AAC1B,cAAI,GAAG,OAAO,IAAI,CAAC,MAAM,GAAG,OAAO,IAAI,CAAC,GAAG;AACzC,uBAAW,KAAK,IAAI,KAAK,IAAI,UAAU,SAAS,GAAG,MAAM,CAAC,CAAC,IAAI;AAAA,UACjE;AACA,gBAAM,IAAI,CAAC,IAAI;AACf,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,EAAG,OAAM,GAAG,MAAM,IAAI;AAAA,EAChC;AACA,SAAO,MAAM,GAAG,MAAM;AACxB;AAEO,SAAS,UAAU,IAAY,IAAqB;AACzD,MAAI,GAAG,SAAS,KAAK,GAAG,SAAS,EAAG,QAAO,OAAO;AAElD,QAAM,cAAc,GAAG,UAAU,KAAK,GAAG,UAAU,IAAI,IAAI;AAC3D,SAAO,aAAa,IAAI,EAAE,KAAK;AACjC;;;AHnDA,IAAMC,cAAaC,eAAc,YAAY,GAAG;AAChD,IAAMC,aAAYC,MAAK,QAAQH,WAAU;AAEzC,IAAI,SAA6B;AAEjC,SAAS,YAAyB;AAChC,MAAI,OAAQ,QAAO;AACnB,QAAM,QAAQ;AAAA,IACZG,MAAK,QAAQD,YAAW,8BAA8B;AAAA,IACtDC,MAAK,QAAQD,YAAW,qBAAqB;AAAA,IAC7CC,MAAK,QAAQD,YAAW,sBAAsB;AAAA,EAChD;AACA,MAAI,YAAY,MAAM,CAAC;AACvB,aAAW,KAAK,OAAO;AACrB,QAAIE,YAAW,CAAC,GAAG;AACjB,kBAAY;AACZ;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAACA,YAAW,SAAS,GAAG;AAC1B,YAAQ;AAAA,MACN,uDAAuD,SAAS;AAAA,IAClE;AACA,aAAS,CAAC;AACV,WAAO;AAAA,EACT;AACA,MAAI;AACF,aAAS,KAAK,MAAMC,cAAa,WAAW,MAAM,CAAC;AAAA,EACrD,SAAS,KAAK;AACZ,YAAQ,MAAM,4CAA4C,SAAS,KAAK,GAAG;AAC3E,aAAS,CAAC;AAAA,EACZ;AACA,SAAO;AACT;AAEO,SAAS,YAAY,aAAqB;AAC/C,QAAM,QAAQ,UAAU;AACxB,QAAM,iBAAiB,UAAU,WAAW;AAE5C,QAAM,QAAQ,YAAY,YAAY,EAAE,MAAM,KAAK;AACnD,QAAM,SAAS,MACZ,IAAI,CAAC,SAAS;AACb,UAAM,aAAa,iBAAiB,gBAAgB,KAAK,SAAS;AAClE,QAAI,QAAQ;AACZ,UAAM,aAAa,KAAK,WAAW,YAAY;AAE/C,UAAM,QAAQ,CAAC,SAAS;AACtB,UAAI,WAAW,IAAI,IAAI,KAAK,KAAK,SAAS,GAAG;AAC3C;AAAA,MACF;AACA,UAAI,KAAK,KAAK,YAAY,MAAM,MAAM;AACpC,iBAAS;AAAA,MACX,WAAW,KAAK,KAAK,YAAY,EAAE,SAAS,IAAI,GAAG;AACjD,iBAAS;AAAA,MACX;AACA,UAAI,WAAW,SAAS,IAAI,GAAG;AAC7B,iBAAS;AAAA,MACX;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,aAAa;AAAA,IACtB;AAAA,EACF,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACnC,SAAO,OAAO,MAAM,GAAG,CAAC;AAC1B;;;AIhFA,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AACzC,OAAOC,WAAU;AACjB,SAAS,iBAAAC,sBAAqB;AAW9B,SAAS,aAAa,KAA4B;AAChD,QAAM,UAAyB,CAAC;AAGhC,QAAM,cAAc,IAAI,QAAQ,UAAU;AAC1C,MAAI,gBAAgB,GAAI,QAAO;AAE/B,QAAM,QAAQ,IAAI,MAAM,WAAW;AACnC,QAAM,QAAQ,MAAM,MAAM,OAAO;AAEjC,MAAI,kBAAkB;AACtB,MAAI,gBAA+B;AAEnC,aAAW,YAAY,OAAO;AAC5B,UAAM,OAAO,SAAS,KAAK;AAG3B,QAAI,KAAK,WAAW,KAAK,KAAK,KAAK,SAAS,KAAK,GAAG;AAClD,wBAAkB,KACf,QAAQ,UAAU,EAAE,EACpB,QAAQ,UAAU,EAAE,EACpB,KAAK;AACR,sBAAgB;AAChB;AAAA,IACF;AAGA,QAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,EAAG;AAGhD,QAAI,KAAK,WAAW,QAAQ,EAAG;AAG/B,QAAI,SAAS,MAAM,KAAK,WAAW,QAAG,EAAG;AAGzC,QAAI,KAAK,WAAW,IAAI,KAAK,kBAAkB,MAAM;AACnD,YAAMC,SAAQ,KAAK,MAAM,CAAC,EAAE,KAAK;AACjC,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS,SAAS,aAAa;AAAA,QAC/B,OAAAA;AAAA,QACA,UAAU;AAAA,MACZ,CAAC;AACD,sBAAgB;AAChB;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACzB,sBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,cAA6B;AACpC,MAAI;AACF,UAAM,aAAaC,MAAK,QAAQC,eAAc,YAAY,GAAG,CAAC;AAG9D,UAAM,QAAQD,MAAK,QAAQ,YAAY,uBAAuB;AAC9D,UAAME,SAAQF,MAAK,QAAQ,YAAY,oBAAoB;AAC3D,UAAMG,SAAQH,MAAK,QAAQ,YAAY,0BAA0B;AAEjE,QAAI,UAAU;AACd,QAAII,YAAW,KAAK,GAAG;AACrB,gBAAU;AAAA,IACZ,WAAWA,YAAWF,MAAK,GAAG;AAC5B,gBAAUA;AAAA,IACZ,WAAWE,YAAWD,MAAK,GAAG;AAC5B,gBAAUA;AAAA,IACZ,OAAO;AACL,gBAAUH,MAAK,QAAQ,QAAQ,IAAI,GAAG,oBAAoB;AAAA,IAC5D;AAEA,UAAM,MAAMK,cAAa,SAAS,MAAM;AACxC,WAAO,aAAa,GAAG;AAAA,EACzB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAGA,IAAI,SAA+B;AAE5B,SAAS,mBAAkC;AAChD,MAAI,CAAC,QAAQ;AACX,aAAS,YAAY;AAAA,EACvB;AACA,SAAO;AACT;AASO,SAAS,WACd,OACA,YACa;AACb,MAAI,QAAQ;AACZ,QAAM,aAAa,IAAI,IAAI,MAAM,OAAO;AACxC,MAAI,eAAe;AAEnB,aAAW,MAAM,YAAY;AAC3B,QAAI,UAAU;AAEd,QAAI,WAAW,IAAI,EAAE,GAAG;AACtB,eAAS;AACT,gBAAU;AAAA,IACZ,OAAO;AAEL,iBAAW,MAAM,YAAY;AAC3B,YAAI,UAAU,IAAI,EAAE,GAAG;AACrB,mBAAS;AACT,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,SAAS;AACZ,mBAAW,MAAM,YAAY;AAC3B,cAAI,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,EAAE,GAAG;AACtC,qBAAS;AACT,sBAAU;AACV;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAS;AACX;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW,SAAS,MAAM,QAAQ;AACxC,aAAW,MAAM,YAAY;AAC3B,QAAI,SAAS,SAAS,EAAE,GAAG;AACzB,eAAS;AAAA,IACX,OAAO;AACL,iBAAW,MAAM,UAAU;AACzB,YAAI,UAAU,IAAI,EAAE,GAAG;AACrB,mBAAS;AACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UACJ,MAAM,QAAQ,SAAS,IAAI,eAAe,MAAM,QAAQ,SAAS;AAEnE,SAAO,EAAE,OAAO,QAAQ;AAC1B;;;AC9KA,OAAO,WAAW;AAGX,SAAS,YAAY,UAA0B;AACpD,MAAI;AACF,WAAO,MAAM,QAAQ;AAAA,EACvB,QAAQ;AACN,WAAO,gBAAgB,QAAQ;AAAA,EACjC;AACF;AAGO,IAAM,uBAA+C;AAAA;AAAA,EAE1D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,OAAO;AAAA;AAAA;AAAA,EAEP,WAAW;AAAA,EACX,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,YAAY;AACd;AAGO,IAAM,mBAAmB;AAIzB,SAAS,kBAAkB,UAA4B;AAC5D,QAAM,QAAQ,oBAAI,IAAY;AAG9B,MAAI,iBAAiB,KAAK,QAAQ,GAAG;AACnC,UAAM,IAAI,UAAU;AAAA,EACtB;AAGA,MAAI,yBAAyB,KAAK,QAAQ,GAAG;AAC3C,UAAM,IAAI,YAAY;AAAA,EACxB,WAAW,UAAU,KAAK,QAAQ,GAAG;AACnC,UAAM,IAAI,YAAY;AAAA,EACxB;AAGA,MAAI,8BAA8B,KAAK,QAAQ,GAAG;AAChD,UAAM,IAAI,UAAU;AAAA,EACtB;AAGA,MAAI,2BAA2B,KAAK,QAAQ,GAAG;AAC7C,UAAM,IAAI,OAAO;AAAA,EACnB;AAGA,MAAI,4BAA4B,KAAK,QAAQ,GAAG;AAC9C,UAAM,IAAI,MAAM;AAAA,EAClB;AAGA,QAAM,aAAa;AACnB,MAAI;AACJ,UAAQ,IAAI,WAAW,KAAK,QAAQ,OAAO,MAAM;AAC/C,UAAM,MAAM,EAAE,CAAC,EAAE,YAAY;AAC7B,UAAM,YAAY,qBAAqB,GAAG;AAC1C,QAAI,UAAW,OAAM,IAAI,SAAS;AAAA,EACpC;AAEA,SAAO,MAAM,KAAK,KAAK;AACzB;AAIA,SAAS,gBAAgB,UAAkB,MAAc,OAAuB;AAC9E,MAAI,SAAS,SAAS,IAAI,EAAG,QAAO;AACpC,QAAM,QAAQ,SAAS,MAAM,sCAAsC;AACnE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,MAAM,MAAM,CAAC;AACnB,QAAM,QAAQ,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,KAAK,IAAI,MAAM,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK;AAC1E,SAAO,SAAS,QAAQ,sCAAsC,GAAG,GAAG,IAAI,KAAK,GAAG;AAClF;AAEO,SAAS,iBACd,UACA,aACQ;AACR,MAAI,SAAS;AACb,QAAM,YAAY,YAAY,YAAY;AAE1C,MAAI,SAAS;AACb,MAAI,yCAAyC,KAAK,SAAS,GAAG;AAC5D,aAAS;AAAA,EACX,WAAW,gCAAgC,KAAK,SAAS,GAAG;AAC1D,aAAS;AAAA,EACX,WAAW,oCAAoC,KAAK,SAAS,GAAG;AAC9D,aAAS;AAAA,EACX,WAAW,wBAAwB,KAAK,SAAS,GAAG;AAClD,aAAS;AAAA,EACX,WAAW,0BAA0B,KAAK,SAAS,GAAG;AACpD,aAAS;AAAA,EACX;AACA,WAAS,OAAO,QAAQ,mBAAmB,eAAe,MAAM,EAAE;AAGlE,QAAM,kBAAkB;AACxB,MAAI,WAAW,WAAW;AACxB,aAAS,OAAO;AAAA,MACd;AAAA,MACA,CAAC,OAAO,WAAW;AAEjB,cAAM,SAAS,OAAO,MAAM,GAAG,MAAM;AACrC,cAAM,WAAW,OAAO,MAAM,6BAA6B;AAC3D,YAAI,YAAY,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,GAAG;AAClD,iBAAO;AAAA,QACT;AACA,eAAO,eAAe,MAAM;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO;AACX,MAAI,qBAAqB,KAAK,SAAS,GAAG;AACxC,WAAO;AAAA,EACT,WAAW,sBAAsB,KAAK,SAAS,GAAG;AAChD,WAAO;AAAA,EACT;AACA,WAAS,OAAO,QAAQ,iBAAiB,aAAa,IAAI,EAAE;AAE5D,MAAI,UAAU;AACd,MAAI,2BAA2B,KAAK,SAAS,GAAG;AAC9C,cAAU;AAAA,EACZ;AACA,WAAS,OAAO,QAAQ,oBAAoB,gBAAgB,OAAO,EAAE;AAGrE,MAAI,mCAAmC,KAAK,SAAS,GAAG;AACtD,aAAS,OAAO,QAAQ,kCAAkC,iBAAiB;AAAA,EAC7E,WAAW,8BAA8B,KAAK,SAAS,GAAG;AACxD,aAAS,OAAO,QAAQ,gCAAgC,mBAAmB;AAAA,EAC7E;AAEA,MAAI,6BAA6B,KAAK,SAAS,GAAG;AAChD,aAAS,gBAAgB,QAAQ,aAAa,MAAM;AAAA,EACtD;AACA,MAAI,0BAA0B,KAAK,SAAS,GAAG;AAC7C,aAAS,gBAAgB,QAAQ,YAAY,MAAM;AAAA,EACrD;AAEA,QAAM,UAAU,CAAC,GAAG,YAAY,SAAS,mBAAmB,CAAC;AAC7D,QAAM,gBAAgB,QACnB,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,EACtB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAE7B,MAAI,cAAc,SAAS,GAAG;AAC5B,QAAI,aAAa;AAEjB,aAAS,OAAO,QAAQ,sCAAsC,MAAM;AAClE,UAAI,aAAa,cAAc,QAAQ;AACrC,eAAO,YAAY,cAAc,YAAY,CAAC;AAAA,MAChD;AACA,aAAO;AAAA,IACT,CAAC;AAED,aAAS,OAAO,QAAQ,oCAAoC,MAAM;AAChE,UAAI,aAAa,cAAc,QAAQ;AACrC,eAAO,UAAU,cAAc,YAAY,CAAC;AAAA,MAC9C;AACA,aAAO;AAAA,IACT,CAAC;AAED,aAAS,OAAO,QAAQ,oCAAoC,MAAM;AAChE,UAAI,aAAa,cAAc,QAAQ;AACrC,eAAO,UAAU,cAAc,YAAY,CAAC;AAAA,MAC9C;AACA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,mBAAmB,0CAA0C;AAAA,MACjE;AAAA,IACF;AAGA,UAAM,kBAAkB,cAAc,MAAM,UAAU;AAGtD,UAAM,sBAAsB,mBAAmB,KAAK,MAAM;AAC1D,UAAM,sBACJ,CAAC,wBACA,gBAAgB,UAAU,KACxB,gBAAgB,WAAW,KAAK;AAErC,QAAI,qBAAqB;AACvB,YAAM,cAAc;AACpB,YAAM,gBAAgB,CAAC,GAAG,OAAO,SAAS,WAAW,CAAC;AAEtD,UAAI,cAAc,SAAS,GAAG;AAC5B,cAAM,cAAc,gBAAgB,gBAAgB,SAAS,CAAC;AAC9D,iBAAS,OAAO,QAAQ,aAAa,CAAC,OAAO,OAAO;AAClD,iBAAO,GAAG,EAAE,IAAI,WAAW;AAAA,QAC7B,CAAC;AAAA,MACH;AAAA,IACF;AAIA,UAAM,uBAAuB;AAC7B,aAAS,OAAO,QAAQ,sBAAsB,CAAC,UAAU;AACvD,UAAI,aAAa,cAAc,QAAQ;AACrC,eAAO,IAAI,cAAc,YAAY,CAAC;AAAA,MACxC;AACA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,aAAa;AACnB,aAAS,OAAO,QAAQ,YAAY,CAAC,UAAU;AAC7C,UAAI,aAAa,cAAc,QAAQ;AACrC,eAAO,SAAS,cAAc,YAAY,CAAC;AAAA,MAC7C;AACA,aAAO;AAAA,IACT,CAAC;AAED,QAAI,qBAAqB,KAAK,MAAM,GAAG;AACrC,eAAS,OAAO,QAAQ,eAAe,WAAW;AAAA,IACpD;AAAA,EACF,OAAO;AACL,UAAM,WAAmC;AAAA,MACvC,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AACA,QAAI,iBAAiB;AACrB,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACjD,UAAI,UAAU,SAAS,GAAG,GAAG;AAC3B,yBAAiB;AACjB;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,gBAAgB;AACnB,YAAM,aAAa,kBAAkB,QAAQ;AAC7C,UAAI,WAAW,SAAS,GAAG;AACzB,yBAAiB,WAAW,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,WAAW,CAAC,EAAE,MAAM,CAAC;AAAA,MAChF,OAAO;AACL,yBAAiB;AAAA,MACnB;AAAA,IACF;AACA,aAAS,OAAO,QAAQ,4DAA4D,IAAI,cAAc,GAAG;AAAA,EAC3G;AAEA,WAAS,OAAO,QAAQ,WAAW,YAAY;AAC/C,WAAS,OAAO,QAAQ,WAAW,SAAS;AAE5C,SAAO;AACT;;;ACrQA,IAAM,mBAAmB;AAEzB,SAAS,kBAAkB,aAAyC;AAClE,QAAM,UAAU,iBAAiB;AACjC,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,oBACJ,qBAAqB,KAAK,WAAW,KAAK,YAAY,SAAS,GAAG;AAEpE,QAAM,aAAa,SAAS,WAAW;AAEvC,QAAM,aAKA,CAAC;AACP,MAAI,aAAyD;AAE7D,aAAW,SAAS,SAAS;AAC3B,UAAM,EAAE,OAAO,QAAQ,IAAI,WAAW,OAAO,UAAU;AACvD,QAAI,SAAS,kBAAkB;AAC7B,YAAM,aAAa,kBAAkB,MAAM,KAAK;AAChD,iBAAW,KAAK,EAAE,OAAO,OAAO,SAAS,WAAW,CAAC;AAErD,YAAM,WACJ,CAAC,cACD,QAAQ,WAAW,SAClB,UAAU,WAAW,SAAS,UAAU,WAAW;AACtD,UAAI,UAAU;AACZ,qBAAa;AAAA,UACX,MAAM,MAAM;AAAA,UACZ,OAAO,MAAM;AAAA,UACb;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,WAAW,SAAS,IAAI;AACxC,QAAI,CAAC,qBAAqB,WAAW,SAAS,IAAI;AAChD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,qBAAqB,WAAW,UAAU,GAAG;AAC/C,eAAW,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO;AAEpE,UAAM,WAA8B,CAAC;AACrC,UAAM,iBAAiB,oBAAI,IAAY;AAEvC,eAAW,KAAK,YAAY;AAC1B,YAAM,aAAa,EAAE,WAAW,KAAK,CAAC,SAAS,eAAe,IAAI,IAAI,CAAC;AACvE,UAAI,CAAC,YAAY;AACf,iBAAS,KAAK,CAAC;AACf,UAAE,WAAW,QAAQ,CAAC,SAAS,eAAe,IAAI,IAAI,CAAC;AAAA,MACzD;AAAA,IACF;AAEA,QAAI,SAAS,UAAU,GAAG;AACxB,eAAS,KAAK,CAAC,GAAG,MAAM;AACtB,cAAM,SAAS,YACZ,YAAY,EACZ,QAAQ,SAAS,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;AACpC,cAAM,SAAS,YACZ,YAAY,EACZ,QAAQ,SAAS,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;AACpC,eAAO,SAAS;AAAA,MAClB,CAAC;AAED,YAAM,gBAAgB,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,EAAE,KAAK,GAAG;AACjE,YAAM,aAAa,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AAE/D,aAAO;AAAA,QACL,MAAM,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,KAAK,OAAO;AAAA,QACpD,OAAO;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,WAAW,SAAS,IAAI;AACxC,QAAI,CAAC,qBAAqB,WAAW,SAAS,IAAI;AAChD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,kBAAkB,aAAyC;AAClE,QAAM,UAAU,YAAY,WAAW;AACvC,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,oBACJ,qBAAqB,KAAK,WAAW,KAAK,YAAY,SAAS,GAAG;AAEpE,MAAI,qBAAqB,QAAQ,UAAU,GAAG;AAC5C,UAAMC,OAAM,QAAQ,CAAC;AACrB,UAAM,SAAS,QAAQ,CAAC;AACxB,QAAIA,KAAI,SAAS,OAAO,QAAQA,KAAI,SAAS,KAAO,OAAO,SAAS,GAAK;AACvE,YAAM,SAAS,YAAY,YAAY,EAAE,QAAQA,KAAI,KAAK,YAAY,CAAC;AACvE,YAAM,SAAS,YAAY,YAAY,EAAE,QAAQ,OAAO,KAAK,YAAY,CAAC;AAC1E,YAAM,YAAY,SAAS,SAASA,OAAM;AAC1C,YAAM,aAAa,SAAS,SAAS,SAASA;AAC9C,aAAO;AAAA,QACL,MAAM,GAAG,UAAU,IAAI,QAAQ,WAAW,IAAI;AAAA,QAC9C,OAAO,GAAG,UAAU,KAAK,IAAI,WAAW,KAAK;AAAA,QAC7C,QAAQA,KAAI,QAAQ,OAAO,SAAS;AAAA,QACpC,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,QAAQ,CAAC;AACrB,SAAO;AAAA,IACL,MAAM,IAAI;AAAA,IACV,OAAO,IAAI;AAAA,IACX,OAAO,IAAI;AAAA,IACX,QAAQ;AAAA,EACV;AACF;AAGA,eAAsB,WAAW,aAA2C;AAC1E,MAAI,YAAY,YAAY,KAAK;AACjC,MAAI,UAAU,WAAW,GAAG,KAAK,UAAU,SAAS,GAAG,GAAG;AACxD,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,SAAS;AACnC,UAAI,UAAU,OAAO,OAAO,gBAAgB,UAAU;AACpD,oBAAY,OAAO;AAAA,MACrB,WAAW,UAAU,OAAO,OAAO,SAAS,UAAU;AACpD,oBAAY,OAAO;AAAA,MACrB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,MAAI,QAAQ,kBAAkB,SAAS;AAGvC,MAAI,CAAC,OAAO;AACV,YAAQ,kBAAkB,SAAS;AAAA,EACrC;AAEA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO;AAAA,YACP,MAAM;AAAA,YACN,iBAAiB,CAAC;AAAA,YAClB,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,QAAQ;AAAA,YACR,YACE;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAMC,SAAQ,iBAAiB,MAAM,OAAO,SAAS;AACrD,QAAM,kBAAkB,kBAAkBA,MAAK;AAE/C,QAAM,aAAa,KAAK,IAAI,GAAG,MAAM,QAAQ,EAAE;AAE/C,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU;AAAA,UACnB,OAAAA;AAAA,UACA,MAAM,YAAYA,MAAK;AAAA,UACvB;AAAA,UACA,YAAY,OAAO,WAAW,QAAQ,CAAC,CAAC;AAAA,UACxC,QAAQ,cAAcA,MAAK;AAAA,UAC3B,aAAa;AAAA,UACb,QAAQ,MAAM;AAAA;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACrNA,SAAmB,cAAc;AACjC,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AACzC,OAAOC,WAAU;AACjB,SAAS,iBAAAC,sBAAqB;AAI9B,IAAMC,cAAaC,eAAc,YAAY,GAAG;AAChD,IAAMC,aAAYC,MAAK,QAAQH,WAAU;AAazC,eAAsB,QAAQ,MAAyC;AACrE,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,EAAE,OAAO,UAAU,CAAC,EAAE,IAAI;AAChC,QAAM,EAAE,QAAQ,KAAK,QAAQ,GAAG,MAAM,IAAI;AAG1C,QAAM,iBAAiB,OAAO,UAAU,YAAY,QAAQ,IAAI,QAAQ;AACxE,QAAM,iBAAiB,OAAO,UAAU,YAAY,QAAQ,IAAI,QAAQ;AAGxE,QAAM,OAAO,MAAM,KAAK,EAAE,WAAW,GAAG,IAAI,QAAQ,YAAY,KAAK;AAGrE,MAAI,aAAaE;AACjB,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QACEE,YAAWD,MAAK,KAAK,YAAY,qBAAqB,CAAC,KACtDC,YAAWD,MAAK,KAAK,YAAY,cAAc,CAAC,KAC/CC,YAAWD,MAAK,KAAK,YAAY,UAAU,CAAC,GAC9C;AACA,gBAAU;AACV;AAAA,IACF;AACA,UAAM,SAASA,MAAK,QAAQ,UAAU;AACtC,QAAI,WAAW,WAAY;AAC3B,iBAAa;AAAA,EACf;AAEA,MAAI,UAAU;AACd,MAAI,SAAS;AACX,cAAUA,MAAK,KAAK,SAAS,uCAAuC;AAAA,EACtE;AAGA,MAAI,CAAC,WAAW,CAACC,YAAW,OAAO,GAAG;AACpC,cAAUD,MAAK;AAAA,MACb,QAAQ,IAAI;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAACC,YAAW,OAAO,GAAG;AACxB,cAAUD,MAAK,QAAQ,QAAQ,IAAI,GAAG,iCAAiC;AAAA,EACzE;AACA,MAAI,CAACC,YAAW,OAAO,GAAG;AACxB,cAAUD,MAAK,QAAQD,YAAW,uCAAuC;AAAA,EAC3E;AAEA,MAAI,aAAa;AACjB,MAAIE,YAAW,OAAO,GAAG;AACvB,iBAAaC,cAAa,SAAS,MAAM;AAAA,EAC3C,OAAO;AACL,YAAQ,KAAK,oCAAoC,OAAO,EAAE;AAAA,EAC5D;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,OAAO,OAAO;AAAA,MAC5B,UAAU;AAAA,IACZ,CAAC;AAED,UAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,MACvC,mBAAmB;AAAA,MACnB,UAAU;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MACA,mBAAmB;AAAA,MACnB,aAAc,UAAU,UAAU,UAAU,UAAW,QAAQ;AAAA,IACjE,CAAC;AAED,UAAM,OAAO,MAAM,QAAQ,QAAQ;AAInC,UAAM,KAAK,MAAM,QAAQ,CAAC,UAAU;AAClC,YAAM,MAAM,MAAM,QAAQ,EAAE,IAAI;AAChC,UAAI,IAAI,WAAW,OAAO,KAAK,QAAQ,eAAe;AACpD,cAAM,SAAS;AAAA,MACjB,OAAO;AACL,cAAM,MAAM;AAAA,MACd;AAAA,IACF,CAAC;AAGD,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAsBV,UAAU;AAAA;AAAA;AAAA;AAAA,wCAIgB,IAAI;AAAA;AAAA;AAAA;AAIxC,UAAM,KAAK,WAAW,aAAa,EAAE,WAAW,OAAO,CAAC;AAGxD,UAAM,YAAY,KAAK,QAAQ,oBAAoB;AACnD,QAAI,YAAY;AAChB,QAAI;AACF,YAAM,SAAS,MAAM,UAAU,WAAW;AAC1C,kBAAY,OAAO,SAAS,QAAQ;AAAA,IACtC,SAAS,OAAO;AAEd,YAAM,SAAS,MAAM,KAAK,WAAW;AACrC,kBAAY,OAAO,SAAS,QAAQ;AAAA,IACtC;AAEA,UAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,KAAK,yBAAyB,SAAS;AAAA,YACvC,OAAO;AAAA,YACP,WAAW;AAAA,YACX,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,YAAQ,MAAM,4BAA4B,KAAK;AAC/C,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO,0BAA0B,YAAY;AAAA,YAC7C,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,QAAI,SAAS;AACX,YAAM,QAAQ,MAAM;AAAA,IACtB;AAAA,EACF;AACF;;;ACzLA,SAAS,SAAAC,cAA+B;AAuBxC,IAAM,eAAe;AACrB,IAAM,WAAW,oBAAI,IAA6B;AAElD,SAAS,YAAY,IAAY,UAAiC;AAChE,MAAI,SAAS,QAAQ,cAAc;AACjC,UAAM,YAAY,SAAS,KAAK,EAAE,KAAK,EAAE;AACzC,QAAI,cAAc,QAAW;AAC3B,eAAS,OAAO,SAAS;AAAA,IAC3B;AAAA,EACF;AACA,WAAS,IAAI,IAAI,QAAQ;AAC3B;AAEA,SAAS,oBAA4B;AACnC,SAAO,WAAW,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAC9D;AAEA,SAAS,aAAa,SAA8C;AAClE,QAAM,QAAgC,CAAC;AACvC,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,QAAQ,aAAa,IAAI;AACrC,QAAI,QAAQ,UAAa,QAAQ,MAAM;AACrC,YAAM,IAAI,IAAI,QAAQ,KAAK,SAAS;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,IAAiB,MAA2B;AACtE,QAAM,YAAY,GAAG,aAAa,IAAI;AACtC,MAAI,WAAW;AACb,WAAO,IAAI,SAAS;AAAA,EACtB;AAEA,QAAM,MAAM,GAAG,QAAQ,YAAY;AACnC,QAAM,SAAS,GAAG;AAElB,MAAI,CAAC,UAAU,WAAW,QAAQ,CAAC,OAAO,SAAS;AACjD,UAAMC,aAAY,KAAK,cAAc,CAAC,GAAG;AAAA,MACvC,CAAC,SAA8B,KAAK,aAAa;AAAA,IACnD;AACA,UAAMC,mBAAkBD,UAAS;AAAA,MAC/B,CAAC,SAAS,KAAK,WAAW,KAAK,QAAQ,YAAY,MAAM;AAAA,IAC3D;AACA,UAAME,SAAQ,KAAK,IAAI,GAAGD,iBAAgB,QAAQ,EAAE,IAAI,CAAC;AACzD,WAAO,GAAG,GAAG,gBAAgBC,MAAK;AAAA,EACpC;AAEA,QAAM,YAAY,OAAO,cAAc,CAAC,GAAG;AAAA,IACzC,CAAC,SAA8B,KAAK,aAAa;AAAA,EACnD;AACA,QAAM,kBAAkB,SAAS;AAAA,IAC/B,CAAC,SAAS,KAAK,WAAW,KAAK,QAAQ,YAAY,MAAM;AAAA,EAC3D;AACA,QAAM,QAAQ,KAAK,IAAI,GAAG,gBAAgB,QAAQ,EAAE,IAAI,CAAC;AAEzD,QAAM,iBAAiB,mBAAmB,QAAQ,IAAI;AACtD,SAAO,GAAG,cAAc,MAAM,GAAG,gBAAgB,KAAK;AACxD;AAEO,SAAS,cAAc,MAGd;AACd,QAAM,EAAE,eAAe,SAAS,IAAI;AACpC,QAAM,OAAOC,OAAM,aAAa;AAEhC,QAAM,KAAK,kBAAkB;AAC7B,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,aAAiC,CAAC;AAExC,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW,KAAK,iBAAiB,GAAG;AAC1C,aAAW,MAAM,UAAU;AACzB,UAAM,MAAM,GAAG,QAAQ,YAAY;AACnC,QAAI,cAAc,SAAS,GAAG,KAAK,GAAG,aAAa,aAAa,GAAG;AACjE,YAAM,WAAW,mBAAmB,IAAI,IAAI;AAE5C,YAAM,YAAY,GAAG;AACrB,YAAM,SAAS,cAAc,SAAS;AACtC,YAAM,QAAQ,aAAa,EAAE;AAE7B,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,WAA4B;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,cAAc,cAAc,aAAa;AAAA,IACzC;AAAA,EACF;AAEA,cAAY,IAAI,QAAQ;AAExB,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU;AAAA,UACnB,YAAY;AAAA,UACZ,UAAU;AAAA,YACR,QAAQ,SAAS;AAAA,YACjB,SAAS,SAAS;AAAA,YAClB,IAAI,SAAS;AAAA,YACb,WAAW,SAAS;AAAA,YACpB,YAAY,SAAS,WAAW,IAAI,CAAC,OAAO;AAAA,cAC1C,UAAU,EAAE;AAAA,cACZ,OAAO,EAAE;AAAA,cACT,OAAO,EAAE;AAAA,cACT,QAAQ,EAAE;AAAA,YACZ,EAAE;AAAA,YACF,cAAc,SAAS;AAAA,YACvB,UAAU,SAAS;AAAA,UACrB;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AASO,SAAS,aAAa,MAGb;AACd,QAAM,EAAE,YAAY,QAAQ,IAAI;AAChC,QAAM,WAAW,SAAS,IAAI,UAAU;AAExC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO,+BAA+B,UAAU;AAAA,YAChD,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,WAAW,YAAY,OAAO,WAAW,OAAO;AACzD,YAAM,UAAU,OAAO,SAAS,UAAa,OAAO,SAAS,QAAQ,OAAO,KAAK,KAAK,MAAM;AAC5F,YAAM,WAAW,OAAO,UAAU,UAAa,OAAO,UAAU,QAAQ,OAAO,MAAM,KAAK,MAAM;AAChG,UAAI,CAAC,WAAW,CAAC,UAAU;AACzB,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB,OAAO,0CAA0C,OAAO,QAAQ,kBAAkB,OAAO,MAAM;AAAA,gBAC/F,aAAa;AAAA,cACf,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAOA,OAAM,SAAS,IAAI;AAChC,MAAI,aAAa;AACjB,QAAM,kBAA4B,CAAC;AACnC,QAAM,SAAmB,CAAC;AAE1B,QAAM,gBAAgB,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AAChD,QAAI,EAAE,WAAW,YAAY,EAAE,WAAW,SAAU,QAAO;AAC3D,QAAI,EAAE,WAAW,YAAY,EAAE,WAAW,SAAU,QAAO;AAC3D,WAAO;AAAA,EACT,CAAC;AAED,aAAW,UAAU,eAAe;AAClC,QAAI;AACF,YAAM,SAAS,KAAK,cAAc,OAAO,QAAQ;AACjD,UAAI,CAAC,QAAQ;AACX,wBAAgB,KAAK,OAAO,QAAQ;AACpC;AAAA,MACF;AAEA,YAAM,gBACJ,OAAO,SAAS,OAAO,QAAQ,YAAY,OAAO,KAAK,IAAI;AAC7D,oBAAc,cAAc,iBAAiB,OAAO,QAAQ;AAE5D,UAAI,OAAO,WAAW,UAAU;AAC9B,cAAM,UAAUA,OAAM,aAAa;AACnC,eAAO,YAAY,OAAO;AAAA,MAC5B,WAAW,OAAO,WAAW,OAAO;AAClC,cAAM,UAAUA,OAAM,aAAa;AACnC,eAAO,YAAY,OAAO;AAAA,MAC5B,WAAW,OAAO,WAAW,UAAU;AACrC,eAAO,OAAO;AAAA,MAChB;AAAA,IACF,SAAS,KAAc;AACrB,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,aAAO;AAAA,QACL,uCAAuC,OAAO,QAAQ,MAAM,OAAO;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,KAAK,SAAS;AAClC,QAAM,aAAa,cAAc,WAAW;AAC5C,QAAM,aACJ,aAAa,IAAI,KAAK,OAAO,IAAI,aAAa,cAAc,GAAG,IAAI;AAErE,WAAS,OAAO;AAChB,WAAS,eAAe;AACxB,cAAY,YAAY,QAAQ;AAEhC,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU;AAAA,UACnB,cAAc;AAAA,UACd,aAAa;AAAA,UACb,aAAa;AAAA,UACb,aAAa,KAAK,IAAI,GAAG,UAAU;AAAA,UACnC,kBACE,gBAAgB,SAAS,IAAI,kBAAkB;AAAA,UACjD,QAAQ,OAAO,SAAS,IAAI,SAAS;AAAA,UACrC,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AC7SA,SAAS,SAAS;AAIlB,IAAM,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;AAE9C,SAAS,cAAc,MAA4B;AACxD,QAAM,SAAS,OAAO,UAAU,IAAI;AAEpC,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,OAAO,IAAI,OAAO;AAC1B,QAAM,SAAS,cAAc,OAAO,YAAY,EAAE,KAAK,CAAC;AAExD,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA,SAAS,OAAO;AAAA,UAChB,QAAQ,OAAO;AAAA,UACf,KAAK,SAAS,MAAM;AAAA,UACpB,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACzCA,SAAS,KAAAC,UAAS;AAIlB,IAAMC,UAASC,GAAE,OAAO;AAAA,EACtB,MAAMA,GAAE,OAAO;AACjB,CAAC;AAEM,SAAS,SAAS,MAA4B;AACnD,QAAM,SAASD,QAAO,UAAU,IAAI;AAEpC,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UAEN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO;AAAA,YAEP,YAAY;AAAA,YAEZ,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,KAAK,IAAI,OAAO;AAExB,QAAM,WAAW,UAAU,IAAI;AAE/B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UAEN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO,sBAAsB,IAAI;AAAA,YACjC,YAAY;AAAA,YACZ,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QAEN,MAAM,KAAK,UAAU;AAAA,UACnB,WAAW,SAAS;AAAA,UACpB,OAAO,SAAS;AAAA,UAChB,QAAQ,SAAS;AAAA,UACjB,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AC/DA,SAAS,KAAAE,UAAS;AAIlB,IAAMC,UAASC,GAAE,OAAO;AAAA,EACtB,MAAMA,GAAE,OAAO;AACjB,CAAC;AAEM,SAAS,YAAY,MAA4B;AACtD,QAAM,SAASD,QAAO,UAAU,IAAI;AAEpC,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,KAAK,IAAI,OAAO;AAExB,QAAM,WAAW,UAAU,IAAI;AAE/B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UAEN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO,sBAAsB,IAAI;AAAA,YACjC,YAAY;AAAA,YACZ,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,QAAQ;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;;;AClDO,SAAS,iBAA8B;AAC5C,QAAM,aAAa,OAAO,KAAK,SAAS,EAAE,KAAK;AAE/C,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA,OAAO,WAAW;AAAA,UAClB,aAAa,WAAW;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACXA,IAAI,kBAAkB;AACtB,IAAM,QAAsB,CAAC;AAC7B,IAAM,YAAY,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAE5D,IAAM,mBAAmB;AAElB,SAAS,WAAW,UAAkB,YAA0B;AACrE,QAAM,eAAe,OAAO,UAAU;AACtC,QAAM,cACJ,MAAM,YAAY,KAAK,eAAe,KAAK,CAAC,SAAS,YAAY,IAC7D,IACA;AAEN,MAAI,MAAM,UAAU,kBAAkB;AACpC,UAAM,MAAM;AAAA,EACd;AACA,QAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW,KAAK,IAAI;AAAA,EACtB,CAAC;AACD,qBAAmB;AACrB;AAEO,SAAS,gBACd,OAAoC,CAAC,GACxB;AACb,QAAM,qBAAqB,KAAK,kBAAkB;AAClD,QAAM,eAAe,OAAO,kBAAkB;AAC9C,QAAM,gBACJ,MAAM,YAAY,KAAK,gBAAgB,KAAK,CAAC,SAAS,YAAY,IAC9D,QACA;AAEN,QAAM,MAAM,QAAS,kBAAkB,gBAAiB,KAAK,QAAQ,CAAC,CAAC;AAEvE,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU;AAAA,UACnB,YAAY;AAAA,UACZ;AAAA,UACA,mBAAmB;AAAA,UACnB,uBAAuB;AAAA,UACvB,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;","names":["parse","id","parse","path","readFileSync","existsSync","fileURLToPath","__filename","fileURLToPath","__dirname","path","existsSync","readFileSync","readFileSync","existsSync","path","fileURLToPath","emmet","path","fileURLToPath","path2","path3","existsSync","readFileSync","top","emmet","readFileSync","existsSync","path","fileURLToPath","__filename","fileURLToPath","__dirname","path","existsSync","readFileSync","parse","siblings","sameTagSiblings","index","parse","z","schema","z","z","schema","z"]}
1
+ {"version":3,"sources":["../src/manifests/index.ts","../src/utils/tokenizer.ts","../src/tools/validator.ts","../src/tools/check-a11y.ts","../src/utils/a11y-rules.ts","../src/tools/theme-palette.ts","../src/tools/theme-tokens.ts","../src/tools/search-index.ts","../src/tools/embedder.ts","../src/utils/cosine.ts","../src/utils/intent-helpers.ts","../src/utils/intent-parser.ts","../src/utils/emmet-helpers.ts","../src/tools/intent-engine.ts","../src/tools/preview.ts","../src/tools/handoff.ts","../src/tools/generate-theme.ts","../src/tools/get-emmet.ts","../src/tools/get-manifests.ts","../src/tools/list-components.ts","../src/tools/token-counter.ts"],"sourcesContent":["import { readFileSync, existsSync } from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\nimport type { Manifest } from '../types.js'\nimport { getTokenCount } from '../utils/tokenizer.js'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\nfunction loadManifest(file: string): Manifest {\n let manifestsDir = path.resolve(__dirname, 'manifests')\n if (!existsSync(manifestsDir) && existsSync(path.resolve(__dirname, file))) {\n manifestsDir = __dirname\n }\n const manifestPath = path.resolve(manifestsDir, file)\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as Manifest\n manifest.tokens = getTokenCount(manifest.emmet)\n return manifest\n}\n\nexport const manifests: Record<string, Manifest> = {\n accordion: loadManifest('accordion.json'),\n alert: loadManifest('alert.json'),\n avatar: loadManifest('avatar.json'),\n badge: loadManifest('badge.json'),\n breadcrumb: loadManifest('breadcrumb.json'),\n button: loadManifest('button.json'),\n card: loadManifest('card.json'),\n checkbox: loadManifest('checkbox.json'),\n codeblock: loadManifest('codeblock.json'),\n combobox: loadManifest('combobox.json'),\n dialog: loadManifest('dialog.json'),\n divider: loadManifest('divider.json'),\n dropdown: loadManifest('dropdown.json'),\n form: loadManifest('form.json'),\n grid: loadManifest('grid.json'),\n input: loadManifest('input.json'),\n meter: loadManifest('meter.json'),\n navigation: loadManifest('navigation.json'),\n progress: loadManifest('progress.json'),\n radio: loadManifest('radio.json'),\n select: loadManifest('select.json'),\n skeleton: loadManifest('skeleton.json'),\n tab: loadManifest('tab.json'),\n table: loadManifest('table.json'),\n textarea: loadManifest('textarea.json'),\n toast: loadManifest('toast.json'),\n tooltip: loadManifest('tooltip.json')\n}\n","import { encoding_for_model } from 'tiktoken'\n\nconst encoder = encoding_for_model('gpt-4')\n\nexport function getTokenCount(input: string): number {\n return encoder.encode(input).length\n}\n","import { parse } from 'node-html-parser'\nimport { manifests } from '../manifests/index.js'\nimport type { ManifestSlot } from '../types.js'\n\ntype ErrorType =\n | 'UNKNOWN_ATTRIBUTE'\n | 'INVALID_VALUE'\n | 'FORBIDDEN_CLASS'\n | 'MISSING_REQUIRED'\n | 'WRONG_ELEMENT'\n | 'PROP_EXPLOSION'\n | 'JS_ON_CSS_COMPONENT'\n | 'MISSING_SLOT'\n\nexport type ValidationError = {\n element: string\n prop: string\n type: ErrorType\n message: string\n suggestion?: string\n valid_values?: string[]\n fix: string\n confidence: number\n line: number\n}\n\nfunction getLineNumber(html: string, index: number): number {\n if (index === undefined || index === null) return 1\n return html.substring(0, index).split('\\n').length\n}\n\nexport function validateHtml(html: string): { valid: boolean, score: number, errors: ValidationError[] } {\n const root = parse(html)\n const errors: ValidationError[] = []\n const elements = root.querySelectorAll('*')\n\n const allowedWrappers = [\n 'label',\n 'span',\n 'p',\n 'img',\n 'small',\n 'h1',\n 'h2',\n 'h3',\n 'a',\n 'button',\n 'ul',\n 'li',\n 'thead',\n 'tbody',\n 'tr',\n 'td',\n 'th',\n 'summary',\n 'strong',\n 'code',\n 'em',\n 'b',\n 'i',\n 'time'\n ]\n\n const nativeAttributes = new Set([\n 'id',\n 'role',\n 'slot',\n 'tabindex',\n 'aria-label',\n 'aria-live',\n 'aria-hidden',\n 'aria-expanded',\n 'aria-selected',\n 'aria-current',\n 'aria-sort',\n 'aria-invalid',\n 'aria-describedby',\n 'aria-labelledby',\n 'aria-haspopup',\n 'aria-busy',\n 'disabled',\n 'required',\n 'checked',\n 'multiple',\n 'readonly',\n 'type',\n 'value',\n 'placeholder',\n 'name',\n 'autocomplete',\n 'min',\n 'max',\n 'low',\n 'high',\n 'optimum',\n 'rows',\n 'open',\n 'hidden',\n 'href',\n 'content',\n 'is',\n 'src',\n 'alt',\n 'data-intent',\n 'data-position',\n 'data-variant',\n 'data-shape',\n 'data-sortable',\n 'data-open',\n 'data-lines',\n 'data-grid',\n 'data-gap',\n 'data-align',\n 'data-justify',\n 'data-col',\n 'data-row',\n 'data-dense',\n 'data-ix-manifest'\n ])\n\n for (const el of elements) {\n const tag = el.tagName.toLowerCase()\n const attrs = el.attributes\n const startIdx = el.range ? el.range[0] : 0\n const line = getLineNumber(html, startIdx)\n\n const dataIxManifest = el.getAttribute('data-ix-manifest')\n let manifestKey = dataIxManifest || (tag.startsWith('ix-') ? tag.slice(3) : tag)\n\n if (tag === 'table' && attrs.is === 'ix-table') {\n manifestKey = 'table'\n }\n\n if (tag === 'nav') {\n manifestKey = 'navigation'\n }\n\n if (tag === 'article' && el.querySelector('[slot]')) {\n manifestKey = 'card'\n }\n\n if (tag === 'aside') {\n manifestKey = 'alert'\n }\n\n if (tag === 'details') {\n manifestKey = 'accordion'\n }\n\n if (tag === 'hr') {\n manifestKey = 'divider'\n }\n\n let manifest = manifests[manifestKey]\n\n if (!manifest) {\n if (tag === 'mark') {\n manifest = manifests.badge\n }\n if (tag === 'span' && attrs.role === 'status') {\n manifest = manifests.badge\n }\n }\n\n if (!manifest && !allowedWrappers.includes(tag)) {\n errors.push({\n element: tag,\n prop: '',\n type: 'WRONG_ELEMENT',\n message: `<${tag}> is not a valid ignix-lite component`,\n fix: `<button>Fix me</button>`,\n confidence: 0.7,\n line\n })\n continue\n }\n\n if (!manifest) continue\n\n const elementName = tag.startsWith('ix-') ? tag : manifest.element || tag\n\n if (manifest.required_wrapper) {\n const parent = el.parentNode as unknown as { tagName?: string }\n if (!parent || parent.tagName?.toLowerCase() !== manifest.required_wrapper) {\n errors.push({\n element: tag,\n prop: 'wrapper',\n type: 'MISSING_REQUIRED',\n message: `<${tag}> must be inside <${manifest.required_wrapper}>`,\n fix: `<${manifest.required_wrapper}><${elementName}></${elementName}></${manifest.required_wrapper}>`,\n confidence: 0.95,\n line\n })\n }\n }\n\n if (tag === 'span' && manifest.component === 'badge' && attrs.role !== 'status') {\n errors.push({\n element: tag,\n prop: 'role',\n type: 'INVALID_VALUE',\n message: 'span badge must have role=status',\n fix: `<span role=\"status\">${el.innerText}</span>`,\n confidence: 0.9,\n line\n })\n }\n\n if ('class' in attrs) {\n errors.push({\n element: tag,\n prop: 'class',\n type: 'FORBIDDEN_CLASS',\n message: 'class attribute not allowed',\n fix: `<${elementName}>${el.innerText}</${elementName}>`,\n confidence: 0.99,\n line\n })\n }\n\n const nonFreeAttrs = Object.keys(attrs).filter(\n (key) => key !== 'id' && key !== 'role' && !key.startsWith('aria-')\n )\n if (nonFreeAttrs.length > 4) {\n errors.push({\n element: tag,\n prop: 'multiple',\n type: 'PROP_EXPLOSION',\n message: 'Too many props',\n fix: `<${elementName}></${elementName}>`,\n confidence: 0.85,\n line\n })\n }\n\n for (const attr of Object.keys(attrs)) {\n if (attr.startsWith('on')) {\n errors.push({\n element: tag,\n prop: attr,\n type: 'JS_ON_CSS_COMPONENT',\n message: 'JS handlers forbidden',\n fix: `<${elementName}></${elementName}>`,\n confidence: 0.95,\n line\n })\n }\n }\n\n for (const attr of Object.keys(attrs)) {\n if (manifest.forbidden_props?.includes(attr)) {\n errors.push({\n element: tag,\n prop: attr,\n type: 'UNKNOWN_ATTRIBUTE',\n message: `'${attr}' forbidden`,\n fix: `<${elementName}></${elementName}>`,\n confidence: 0.98,\n line\n })\n continue\n }\n\n if (!manifest.props?.[attr] && !nativeAttributes.has(attr)) {\n errors.push({\n element: tag,\n prop: attr,\n type: 'UNKNOWN_ATTRIBUTE',\n message: `'${attr}' invalid`,\n fix: `<${elementName}></${elementName}>`,\n confidence: 0.95,\n line\n })\n }\n }\n\n for (const attr of Object.keys(attrs)) {\n const def = manifest.props?.[attr]\n if (def?.values) {\n const value = attrs[attr]\n if (!def.values.includes(value)) {\n errors.push({\n element: tag,\n prop: attr,\n type: 'INVALID_VALUE',\n message: `'${value}' invalid`,\n valid_values: def.values,\n fix: `<${elementName} ${attr}=\"${def.values[0]}\"></${elementName}>`,\n confidence: 0.97,\n line\n })\n }\n }\n }\n\n for (const req of manifest.required_props || []) {\n if (!(req in attrs)) {\n errors.push({\n element: tag,\n prop: req,\n type: 'MISSING_REQUIRED',\n message: `Missing ${req}`,\n fix: `<${elementName} ${req}=\"\"></${elementName}>`,\n confidence: 0.9,\n line\n })\n }\n }\n\n const slots = manifest.slots ?? {}\n for (const [slotName, slotDefVal] of Object.entries(slots)) {\n const slotDef = slotDefVal as ManifestSlot\n const child = el.querySelector(`[slot=\"${slotName}\"]`)\n\n if (slotDef.required && !child) {\n errors.push({\n element: tag,\n prop: slotName,\n type: 'MISSING_SLOT',\n message: `Missing slot ${slotName}`,\n fix: `<${elementName}><span slot=\"${slotName}\"></span></${elementName}>`,\n confidence: 0.95,\n line\n })\n }\n\n if (child && slotDef.element) {\n const childTag = child.tagName.toLowerCase()\n if (!slotDef.element.includes(childTag)) {\n errors.push({\n element: childTag,\n prop: slotName,\n type: 'INVALID_VALUE',\n message: `${childTag} invalid for slot ${slotName}`,\n valid_values: slotDef.element,\n fix: `<${slotDef.element[0]} slot=\"${slotName}\"></${slotDef.element[0]}>`,\n confidence: 0.95,\n line\n })\n }\n }\n }\n }\n\n const valid = errors.length === 0\n const score = valid ? 100 : Math.max(0, 100 - errors.length * 10)\n\n return {\n valid,\n score,\n errors\n }\n}\n","import { parse } from 'node-html-parser'\nimport type { A11yIssue, RuleResult } from '../utils/a11y-types.js'\nimport {\n checkImages,\n checkFormLabels,\n checkEmptyLabels,\n checkButtons,\n checkLinks,\n checkAriaStates,\n checkDuplicateIds,\n checkTabIndex,\n checkHeadings,\n checkTables,\n checkDialogs,\n checkRoles,\n checkAutocomplete,\n checkFocusStyle,\n checkLang\n} from '../utils/a11y-rules.js'\n\nconst RULE_CONFIDENCES: Record<string, { error: number; warning: number }> = {\n 'WCAG 1.1.1 Non-text Content': { error: 0.99, warning: 0.80 },\n 'WCAG 1.3.1 Form Labels': { error: 0.98, warning: 0.78 },\n 'WCAG 2.4.6 Empty Labels': { error: 0.95, warning: 0.75 },\n 'WCAG 4.1.2 Button Names': { error: 0.99, warning: 0.80 },\n 'WCAG 2.4.4 Link Purpose': { error: 0.97, warning: 0.75 },\n 'WCAG 3.3.1 Error Identification': { error: 0.98, warning: 0.75 },\n 'WCAG 4.1.2 ARIA State Values': { error: 0.96, warning: 0.75 },\n 'WCAG 4.1.1 Parsing': { error: 0.99, warning: 0.80 },\n 'WCAG 2.1.1 Keyboard': { error: 0.95, warning: 0.75 },\n 'WCAG 2.4.6 Heading Hierarchy': { error: 0.95, warning: 0.75 },\n 'WCAG 1.3.1 Table Structure': { error: 0.97, warning: 0.75 },\n 'WCAG 4.1.2 Dialog Accessibility': { error: 0.98, warning: 0.75 },\n 'WCAG 4.1.2 ARIA Role Requirements': { error: 0.98, warning: 0.75 },\n 'WCAG 1.3.5 Input Purpose': { error: 0.95, warning: 0.75 },\n 'WCAG 2.4.7 Focus Visible': { error: 0.95, warning: 0.75 },\n 'WCAG 3.1.1 Language of Page': { error: 0.99, warning: 0.80 }\n}\n\nfunction getConfidenceForRule(\n ruleName: string,\n type: 'error' | 'warning'\n): number {\n const conf = RULE_CONFIDENCES[ruleName]\n if (conf) {\n return type === 'error' ? conf.error : conf.warning\n }\n return type === 'error' ? 0.98 : 0.75\n}\n\nfunction computeScore(issues: A11yIssue[]): number {\n const errors = issues.filter((i) => i.type === 'error').length\n const warnings = issues.filter((i) => i.type === 'warning').length\n return Math.max(0, 100 - errors * 10 - warnings * 3)\n}\n\nfunction getPassingRules(results: RuleResult[]): string[] {\n return results.filter((r) => r.issues.length === 0).map((r) => r.ruleName)\n}\n\nexport function auditA11y(html: string): { score: number; passes: string[]; issues: A11yIssue[]; wcag: string } {\n const root = parse(html)\n\n const results: RuleResult[] = [\n checkImages(root),\n checkFormLabels(root),\n checkEmptyLabels(root),\n checkButtons(root),\n checkLinks(root),\n checkAriaStates(root),\n checkDuplicateIds(root),\n checkTabIndex(root),\n checkHeadings(root),\n checkTables(root),\n checkDialogs(root),\n checkRoles(root),\n checkAutocomplete(root),\n checkFocusStyle(root),\n checkLang(root)\n ]\n\n const rawIssues = results.flatMap((r) => r.issues)\n const issues: A11yIssue[] = rawIssues.map((i) => ({\n ...i,\n confidence: getConfidenceForRule(i.rule, i.type)\n }))\n const passes = getPassingRules(results)\n const score = computeScore(issues)\n\n return {\n score,\n passes,\n issues,\n wcag: 'AA'\n }\n}\n","import type { HTMLElement } from 'node-html-parser'\nimport type { A11yIssue, RuleResult } from './a11y-types.js'\n\nfunction injectAttr(outerHTML: string, attr: string, value: string): string {\n return outerHTML.replace(/^(<[a-zA-Z][a-zA-Z0-9-]*)/, `$1 ${attr}=\"${value}\"`)\n}\n\nfunction clip(str: string, max = 200): string {\n return str.length > max ? str.slice(0, max) + '...' : str\n}\n\nfunction isDecorative(img: HTMLElement): boolean {\n const role = img.getAttribute('role')\n const ariaHidden = img.getAttribute('aria-hidden')\n return role === 'presentation' || role === 'none' || ariaHidden === 'true'\n}\n\n// Returns IDs from an ARIA reference attribute that do not exist in the DOM\nfunction findBrokenAriaRefs(\n el: HTMLElement,\n attr: string,\n root: HTMLElement\n): string[] {\n const val = el.getAttribute(attr)\n if (!val?.trim()) return []\n return val\n .trim()\n .split(/\\s+/)\n .filter((id) => !root.querySelector(`[id=\"${id}\"]`))\n}\n\n// Walks child nodes skipping any subtree rooted at aria-hidden=\"true\"\nfunction getVisibleText(el: HTMLElement): string {\n if (el.getAttribute('aria-hidden') === 'true') return ''\n let result = ''\n for (const child of el.childNodes) {\n if (child.nodeType === 1) {\n result += getVisibleText(child as HTMLElement)\n } else if (child.nodeType === 3) {\n result += child.text ?? ''\n }\n }\n return result\n}\n\nfunction getAccessibleName(el: HTMLElement, root: HTMLElement): string {\n const text = getVisibleText(el).trim()\n if (text) return text\n\n const ariaLabel = el.getAttribute('aria-label')?.trim()\n if (ariaLabel) return ariaLabel\n\n const title = el.getAttribute('title')?.trim()\n if (title) return title\n\n const childImg = el.querySelector('img')\n const childAlt = childImg?.getAttribute('alt')?.trim()\n if (childAlt) return childAlt\n\n const labelledBy = el.getAttribute('aria-labelledby')\n if (labelledBy) {\n const name = labelledBy\n .trim()\n .split(/\\s+/)\n .map((id) => root.querySelector(`[id=\"${id}\"]`)?.text.trim() ?? '')\n .join(' ')\n .trim()\n if (name) return name\n }\n\n return ''\n}\n\nexport function checkImages(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 1.1.1 Non-text Content'\n const issues: A11yIssue[] = []\n\n root.querySelectorAll('img').forEach((img) => {\n const alt = img.getAttribute('alt')\n const ariaLabel = img.getAttribute('aria-label')?.trim()\n const labelledBy = img.getAttribute('aria-labelledby')\n const hasAriaName = !!(ariaLabel || labelledBy)\n\n if (alt === undefined) {\n if (hasAriaName) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(img.outerHTML),\n message:\n '<img> uses aria-label/aria-labelledby but the alt attribute is recommended for broader screen reader compatibility',\n fix: injectAttr(\n img.outerHTML,\n 'alt',\n ariaLabel ?? '[Describe the image]'\n )\n })\n } else {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(img.outerHTML),\n message: '<img> is missing the alt attribute',\n fix: injectAttr(img.outerHTML, 'alt', '[Describe the image]')\n })\n }\n return\n }\n\n if (alt.trim() === '' && !isDecorative(img)) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(img.outerHTML),\n message:\n '<img> has an empty alt but is not marked as decorative - add role=\"presentation\" or provide a description',\n fix: injectAttr(img.outerHTML, 'role', 'presentation')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkFormLabels(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 1.3.1 Form Labels'\n const issues: A11yIssue[] = []\n const UNLABELED_SKIP = new Set([\n 'hidden',\n 'submit',\n 'reset',\n 'button',\n 'image'\n ])\n\n for (const tag of ['input', 'select', 'textarea'] as const) {\n root.querySelectorAll(tag).forEach((el) => {\n if (tag === 'input') {\n const type = (el.getAttribute('type') ?? 'text').toLowerCase()\n if (UNLABELED_SKIP.has(type)) return\n }\n\n const id = el.getAttribute('id')\n const hasExplicit = id\n ? !!root.querySelector(`label[for=\"${id}\"]`)\n : false\n const hasImplicit = !!el.closest('label')\n const ariaLabel = el.getAttribute('aria-label')?.trim()\n const ariaLabelledBy = el.getAttribute('aria-labelledby')\n const hasTitle = !!el.getAttribute('title')?.trim()\n\n if (\n !hasExplicit &&\n !hasImplicit &&\n !ariaLabel &&\n !ariaLabelledBy &&\n !hasTitle\n ) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `<${tag}> is not associated with a <label> - use for/id, wrapping label, or aria-label`,\n fix: id\n ? `<label for=\"${id}\">[Label text]</label>\\n${el.outerHTML}`\n : `<label>[Label text] ${el.outerHTML}</label>`\n })\n return\n }\n\n // Verify aria-labelledby targets actually exist in the DOM\n if (ariaLabelledBy) {\n const broken = findBrokenAriaRefs(el, 'aria-labelledby', root)\n if (broken.length > 0) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `<${tag}> aria-labelledby references non-existent element(s): ${broken.map((id) => `#${id}`).join(', ')}`,\n fix: `Ensure element(s) with id=\"${broken.join('\", \"')}\" exist in the DOM, or use aria-label instead`\n })\n }\n }\n })\n }\n\n root.querySelectorAll('fieldset').forEach((fieldset) => {\n const legend = fieldset.querySelector('legend')\n if (!legend || !legend.text.trim()) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: '<fieldset>',\n message:\n '<fieldset> must have a non-empty <legend> to group related form controls',\n fix: `<fieldset>\\n <legend>[Group label]</legend>\\n ...\\n</fieldset>`\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkEmptyLabels(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 2.4.6 Empty Labels'\n const issues: A11yIssue[] = []\n\n root.querySelectorAll('label').forEach((label) => {\n const hasText = !!label.text.trim()\n const hasAriaLabel = !!label.getAttribute('aria-label')?.trim()\n\n if (!hasText && !hasAriaLabel) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(label.outerHTML),\n message:\n '<label> is empty and provides no accessible name for its control',\n fix: label.outerHTML.replace('</label>', '[Label text]</label>')\n })\n }\n\n // Check broken label[for] association\n const forAttr = label.getAttribute('for')\n if (forAttr && !root.querySelector(`[id=\"${forAttr}\"]`)) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(label.outerHTML),\n message: `<label for=\"${forAttr}\"> references id=\"${forAttr}\" which does not exist in the DOM`,\n fix: `Add id=\"${forAttr}\" to the target form element, or correct the for attribute`\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkButtons(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 4.1.2 Button Names'\n const issues: A11yIssue[] = []\n\n root.querySelectorAll('button').forEach((button) => {\n if (!getAccessibleName(button, root)) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(button.outerHTML),\n message:\n '<button> has no accessible name - add text content, aria-label, or a child <img> with alt',\n fix: injectAttr(button.outerHTML, 'aria-label', '[Action description]')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkLinks(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 2.4.4 Link Purpose'\n const issues: A11yIssue[] = []\n const VAGUE = new Set([\n 'click here',\n 'here',\n 'read more',\n 'more',\n 'link',\n 'click',\n 'learn more',\n 'details',\n 'info'\n ])\n\n root.querySelectorAll('a').forEach((link) => {\n const name = getAccessibleName(link, root)\n const href = link.getAttribute('href')\n const isButtonRole = link.getAttribute('role') === 'button'\n\n if (!name) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(link.outerHTML),\n message:\n '<a> has no accessible name - add text, aria-label, or a child <img> with alt',\n fix: injectAttr(\n link.outerHTML,\n 'aria-label',\n '[Describe the link destination]'\n )\n })\n return\n }\n\n if (VAGUE.has(name.toLowerCase())) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(link.outerHTML),\n message: `<a> has non-descriptive text \"${name}\" - use aria-label to clarify the destination`,\n fix: injectAttr(\n link.outerHTML,\n 'aria-label',\n '[Describe where this link goes]'\n )\n })\n }\n\n if (!href && !isButtonRole) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(link.outerHTML),\n message:\n '<a> has no href - use <button> for actions, or add a valid href',\n fix: link.outerHTML.replace(/^<a\\b/, '<a href=\"#\"')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkAriaStates(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 3.3.1 Error Identification'\n const issues: A11yIssue[] = []\n\n // aria-invalid=\"true\" must have aria-describedby pointing to an existing element\n root.querySelectorAll('[aria-invalid]').forEach((el) => {\n const invalidVal = el.getAttribute('aria-invalid')\n const VALID_INVALID_VALUES = new Set([\n 'false',\n 'true',\n 'grammar',\n 'spelling'\n ])\n\n if (!VALID_INVALID_VALUES.has(invalidVal ?? '')) {\n issues.push({\n type: 'warning',\n rule: 'WCAG 4.1.2 ARIA State Values',\n element: clip(el.outerHTML),\n message: `aria-invalid=\"${invalidVal}\" is not valid - use \"true\", \"false\", \"grammar\", or \"spelling\"`,\n fix: el.outerHTML.replace(\n `aria-invalid=\"${invalidVal}\"`,\n 'aria-invalid=\"true\"'\n )\n })\n return\n }\n\n if (invalidVal === 'true') {\n const describedBy = el.getAttribute('aria-describedby')\n if (!describedBy) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message:\n 'Element with aria-invalid=\"true\" must have aria-describedby pointing to the error message element',\n fix: injectAttr(el.outerHTML, 'aria-describedby', 'error-message-id')\n })\n } else {\n // Verify the describedby target exists\n const broken = findBrokenAriaRefs(el, 'aria-describedby', root)\n if (broken.length > 0) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `aria-describedby references non-existent element(s): ${broken.map((id) => `#${id}`).join(', ')}`,\n fix: `Ensure element(s) with id=\"${broken.join('\", \"')}\" exist in the DOM`\n })\n }\n }\n }\n })\n\n // Strictly boolean ARIA attributes (only \"true\" or \"false\" valid)\n const BOOLEAN_ARIA_ATTRS = [\n 'aria-busy',\n 'aria-expanded',\n 'aria-selected',\n 'aria-pressed'\n ]\n for (const attr of BOOLEAN_ARIA_ATTRS) {\n root.querySelectorAll(`[${attr}]`).forEach((el) => {\n const val = el.getAttribute(attr)\n if (val !== 'true' && val !== 'false') {\n issues.push({\n type: 'warning',\n rule: 'WCAG 4.1.2 ARIA State Values',\n element: clip(el.outerHTML),\n message: `${attr} must be \"true\" or \"false\", got \"${val}\"`,\n fix: el.outerHTML.replace(`${attr}=\"${val}\"`, `${attr}=\"true\"`)\n })\n }\n })\n }\n\n // aria-checked also allows \"mixed\" for tri-state checkboxes (WAI-ARIA spec)\n root.querySelectorAll('[aria-checked]').forEach((el) => {\n const val = el.getAttribute('aria-checked')\n if (val !== 'true' && val !== 'false' && val !== 'mixed') {\n issues.push({\n type: 'warning',\n rule: 'WCAG 4.1.2 ARIA State Values',\n element: clip(el.outerHTML),\n message: `aria-checked must be \"true\", \"false\", or \"mixed\" (for tri-state), got \"${val}\"`,\n fix: el.outerHTML.replace(\n `aria-checked=\"${val}\"`,\n 'aria-checked=\"false\"'\n )\n })\n }\n })\n\n // aria-live with invalid value\n const VALID_ARIA_LIVE = new Set(['off', 'polite', 'assertive'])\n root.querySelectorAll('[aria-live]').forEach((el) => {\n const val = el.getAttribute('aria-live') ?? ''\n if (!VALID_ARIA_LIVE.has(val)) {\n issues.push({\n type: 'warning',\n rule: 'WCAG 4.1.2 ARIA State Values',\n element: clip(el.outerHTML),\n message: `aria-live=\"${val}\" is not valid - use \"off\", \"polite\", or \"assertive\"`,\n fix: el.outerHTML.replace(`aria-live=\"${val}\"`, 'aria-live=\"polite\"')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkDuplicateIds(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 4.1.1 Parsing'\n const issues: A11yIssue[] = []\n const seen = new Map<string, number>()\n\n root.querySelectorAll('[id]').forEach((el) => {\n const id = el.getAttribute('id')\n\n // Empty id is invalid HTML and breaks all ARIA references\n if (id !== undefined && id.trim() === '') {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: 'id=\"\" is an empty ID - IDs must have a non-empty value',\n fix: el.outerHTML.replace('id=\"\"', 'id=\"[unique-id]\"')\n })\n return\n }\n\n if (id) seen.set(id, (seen.get(id) ?? 0) + 1)\n })\n\n seen.forEach((count, id) => {\n if (count > 1) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: `id=\"${id}\"`,\n message: `id=\"${id}\" is used ${count} times - IDs must be unique within a document`,\n fix: `Keep one element with id=\"${id}\" and rename all duplicates to unique IDs`\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkTabIndex(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 2.1.1 Keyboard'\n const issues: A11yIssue[] = []\n\n root.querySelectorAll('[tabindex]').forEach((el) => {\n const raw = el.getAttribute('tabindex') ?? ''\n const val = parseInt(raw, 10)\n\n if (isNaN(val)) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `tabindex=\"${raw}\" is not a valid integer`,\n fix: el.outerHTML.replace(`tabindex=\"${raw}\"`, 'tabindex=\"0\"')\n })\n return\n }\n\n if (val > 0) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `tabindex=\"${val}\" disrupts natural tab order - use tabindex=\"0\" or rely on DOM order`,\n fix: el.outerHTML.replace(`tabindex=\"${val}\"`, 'tabindex=\"0\"')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkHeadings(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 2.4.6 Heading Hierarchy'\n const issues: A11yIssue[] = []\n const headings = root.querySelectorAll('h1, h2, h3, h4, h5, h6')\n\n let lastLevel = 0\n let h1Count = 0\n\n headings.forEach((h) => {\n const tag = h.tagName.toLowerCase()\n const level = parseInt(h.tagName.slice(1), 10)\n\n if (!h.text.trim()) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(h.outerHTML),\n message: `<${tag}> is empty - headings must have descriptive text`,\n fix: `<${tag}>[Heading text]</${tag}>`\n })\n }\n\n if (level === 1) h1Count++\n\n if (lastLevel > 0 && level > lastLevel + 1) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(h.outerHTML),\n message: `Heading skips from h${lastLevel} to h${level} - use h${lastLevel + 1} to maintain document outline`,\n fix: `<h${lastLevel + 1}>${h.text.trim()}</h${lastLevel + 1}>`\n })\n }\n\n lastLevel = level\n })\n\n if (h1Count > 1) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: 'h1',\n message: `${h1Count} <h1> elements found - a page should have exactly one <h1>`,\n fix: 'Demote additional <h1> elements to <h2> or lower'\n })\n }\n\n return { ruleName, issues }\n}\n\nexport function checkTables(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 1.3.1 Table Structure'\n const issues: A11yIssue[] = []\n\n root.querySelectorAll('table').forEach((table) => {\n // Layout/presentational tables do not need captions or headers\n const role = table.getAttribute('role')\n if (role === 'presentation' || role === 'none') return\n\n const caption = table.querySelector('caption')\n const ariaLabel = table.getAttribute('aria-label')\n const ariaLabelledBy = table.getAttribute('aria-labelledby')\n\n if (!caption && !ariaLabel && !ariaLabelledBy) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: '<table>',\n message:\n '<table> has no caption, aria-label, or aria-labelledby - screen readers cannot identify its purpose',\n fix: injectAttr('<table>', 'aria-label', '[Describe the table]')\n })\n }\n\n // Empty caption is as bad as no caption\n if (caption && !caption.text.trim()) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(caption.outerHTML),\n message:\n '<caption> is empty - provide a meaningful description of the table',\n fix: caption.outerHTML.replace(\n '</caption>',\n '[Table description]</caption>'\n )\n })\n }\n\n table.querySelectorAll('th').forEach((th) => {\n if (!th.getAttribute('scope')) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(th.outerHTML),\n message:\n '<th> is missing the scope attribute - use scope=\"col\" for column headers or scope=\"row\" for row headers',\n fix: injectAttr(th.outerHTML, 'scope', 'col')\n })\n }\n })\n })\n\n return { ruleName, issues }\n}\n\nexport function checkDialogs(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 4.1.2 Dialog Accessibility'\n const issues: A11yIssue[] = []\n\n root.querySelectorAll('dialog').forEach((dialog) => {\n const id = dialog.getAttribute('id')\n const ariaLabel = dialog.getAttribute('aria-label')\n const ariaLabelledBy = dialog.getAttribute('aria-labelledby')\n\n if (!id) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: '<dialog>',\n message:\n '<dialog> has no id - required by the ignix-lite button[onclick=\"dialogId.showModal()\"] pattern',\n fix: injectAttr('<dialog>', 'id', 'dialog-id')\n })\n }\n\n if (!ariaLabel && !ariaLabelledBy) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: '<dialog>',\n message:\n '<dialog> has no accessible name - add aria-labelledby pointing to a heading inside, or aria-label',\n fix: id\n ? `<dialog id=\"${id}\" aria-labelledby=\"dialog-title\">...</dialog>`\n : `<dialog aria-label=\"[Dialog purpose]\">...</dialog>`\n })\n } else if (ariaLabelledBy) {\n // Verify the labelledby target exists\n const broken = findBrokenAriaRefs(dialog, 'aria-labelledby', root)\n if (broken.length > 0) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: '<dialog>',\n message: `dialog aria-labelledby references non-existent element(s): ${broken.map((id) => `#${id}`).join(', ')}`,\n fix: `Ensure element(s) with id=\"${broken.join('\", \"')}\" exist inside the dialog`\n })\n }\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkRoles(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 4.1.2 ARIA Role Requirements'\n const issues: A11yIssue[] = []\n const NATIVELY_INTERACTIVE = new Set([\n 'a',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'details',\n 'summary'\n ])\n\n root.querySelectorAll('[role=\"button\"]').forEach((el) => {\n const tag = el.tagName.toLowerCase()\n const tabIndex = el.getAttribute('tabindex')\n if (!NATIVELY_INTERACTIVE.has(tag) && tabIndex !== '0') {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message:\n 'Element with role=\"button\" must have tabindex=\"0\" to be keyboard-accessible',\n fix: injectAttr(el.outerHTML, 'tabindex', '0')\n })\n }\n })\n\n // Roles requiring aria-checked\n for (const role of [\n 'checkbox',\n 'radio',\n 'menuitemcheckbox',\n 'menuitemradio'\n ] as const) {\n root.querySelectorAll(`[role=\"${role}\"]`).forEach((el) => {\n if (!el.getAttribute('aria-checked')) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `role=\"${role}\" requires aria-checked attribute (values: \"true\", \"false\"${role === 'checkbox' ? ', \"mixed\"' : ''})`,\n fix: injectAttr(el.outerHTML, 'aria-checked', 'false')\n })\n }\n })\n }\n\n root.querySelectorAll('[role=\"combobox\"]').forEach((el) => {\n if (!el.getAttribute('aria-expanded')) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: 'role=\"combobox\" requires aria-expanded attribute',\n fix: injectAttr(el.outerHTML, 'aria-expanded', 'false')\n })\n }\n })\n\n // Roles requiring aria-selected\n for (const role of ['tab', 'option', 'treeitem', 'gridcell'] as const) {\n root.querySelectorAll(`[role=\"${role}\"]`).forEach((el) => {\n if (!el.getAttribute('aria-selected')) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `role=\"${role}\" requires aria-selected attribute`,\n fix: injectAttr(el.outerHTML, 'aria-selected', 'false')\n })\n }\n })\n }\n\n root.querySelectorAll('[role=\"slider\"]').forEach((el) => {\n const required = ['aria-valuenow', 'aria-valuemin', 'aria-valuemax']\n const missing = required.filter((attr) => !el.getAttribute(attr))\n if (missing.length > 0) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: clip(el.outerHTML),\n message: `role=\"slider\" is missing required attributes: ${missing.join(', ')}`,\n fix: 'Add aria-valuenow=\"50\" aria-valuemin=\"0\" aria-valuemax=\"100\" to the element'\n })\n }\n })\n\n root.querySelectorAll('[role=\"progressbar\"]').forEach((el) => {\n if (\n !el.getAttribute('aria-valuenow') &&\n !el.getAttribute('aria-valuetext')\n ) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(el.outerHTML),\n message:\n 'role=\"progressbar\" should have aria-valuenow or aria-valuetext to communicate current progress',\n fix: injectAttr(el.outerHTML, 'aria-valuenow', '0')\n })\n }\n })\n\n root.querySelectorAll('[role=\"listbox\"]').forEach((el) => {\n if (!getAccessibleName(el, root)) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(el.outerHTML),\n message:\n 'role=\"listbox\" should have an accessible name via aria-label or aria-labelledby',\n fix: injectAttr(\n el.outerHTML,\n 'aria-label',\n '[Describe the list options]'\n )\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkAutocomplete(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 1.3.5 Input Purpose'\n const issues: A11yIssue[] = []\n\n const TYPE_AUTOCOMPLETE: Record<string, string> = {\n email: 'email',\n tel: 'tel',\n url: 'url'\n }\n\n root.querySelectorAll('input').forEach((input) => {\n const type = (input.getAttribute('type') ?? 'text').toLowerCase()\n const expected = TYPE_AUTOCOMPLETE[type]\n\n if (expected && !input.getAttribute('autocomplete')) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(input.outerHTML),\n message: `<input type=\"${type}\"> should have autocomplete=\"${expected}\" to assist users with autofill`,\n fix: injectAttr(input.outerHTML, 'autocomplete', expected)\n })\n }\n\n if (type === 'password' && !input.getAttribute('autocomplete')) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(input.outerHTML),\n message:\n '<input type=\"password\"> should have autocomplete=\"current-password\" or autocomplete=\"new-password\"',\n fix: injectAttr(input.outerHTML, 'autocomplete', 'current-password')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkFocusStyle(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 2.4.7 Focus Visible'\n const issues: A11yIssue[] = []\n const KILLS_FOCUS = [\n /outline\\s*:\\s*none/i,\n /outline\\s*:\\s*0(?:px)?/i,\n /outline-width\\s*:\\s*0/i\n ]\n\n root.querySelectorAll('[style]').forEach((el) => {\n const style = el.getAttribute('style') ?? ''\n if (KILLS_FOCUS.some((rx) => rx.test(style))) {\n issues.push({\n type: 'warning',\n rule: ruleName,\n element: clip(el.outerHTML),\n message:\n 'Inline style removes the focus outline - keyboard users cannot see the focus indicator',\n fix: el.outerHTML\n .replace(/outline\\s*:\\s*(none|0(?:px)?)\\s*;?/gi, '')\n .replace(/outline-width\\s*:\\s*0\\s*;?/gi, '')\n })\n }\n })\n\n return { ruleName, issues }\n}\n\nexport function checkLang(root: HTMLElement): RuleResult {\n const ruleName = 'WCAG 3.1.1 Language of Page'\n const issues: A11yIssue[] = []\n\n const htmlEl = root.querySelector('html')\n if (htmlEl && !htmlEl.getAttribute('lang')?.trim()) {\n issues.push({\n type: 'error',\n rule: ruleName,\n element: '<html>',\n message:\n '<html> is missing the lang attribute - screen readers need this to select the correct voice/language',\n fix: '<html lang=\"en\">'\n })\n }\n\n return { ruleName, issues }\n}\n\n\n","export interface ColorEntry {\n primary: string\n contrast: string\n}\n\nexport const PALETTE: Record<string, ColorEntry> = {\n red: { primary: '#ef4444', contrast: '#ffffff' },\n orange: { primary: '#f97316', contrast: '#ffffff' },\n amber: { primary: '#f59e0b', contrast: '#111827' },\n yellow: { primary: '#eab308', contrast: '#111827' },\n lime: { primary: '#84cc16', contrast: '#111827' },\n green: { primary: '#22c55e', contrast: '#ffffff' },\n emerald: { primary: '#10b981', contrast: '#ffffff' },\n teal: { primary: '#14b8a6', contrast: '#ffffff' },\n cyan: { primary: '#06b6d4', contrast: '#111827' },\n sky: { primary: '#0ea5e9', contrast: '#111827' },\n blue: { primary: '#3b82f6', contrast: '#ffffff' },\n indigo: { primary: '#6366f1', contrast: '#ffffff' },\n violet: { primary: '#8b5cf6', contrast: '#ffffff' },\n purple: { primary: '#a855f7', contrast: '#ffffff' },\n fuchsia: { primary: '#d946ef', contrast: '#ffffff' },\n pink: { primary: '#ec4899', contrast: '#ffffff' },\n rose: { primary: '#f43f5e', contrast: '#ffffff' },\n cyberpunk: { primary: '#ec4899', contrast: '#ffffff' },\n neon: { primary: '#d946ef', contrast: '#ffffff' },\n eco: { primary: '#10b981', contrast: '#ffffff' },\n forest: { primary: '#0f766e', contrast: '#ffffff' },\n coffee: { primary: '#78350f', contrast: '#ffffff' },\n ocean: { primary: '#0284c7', contrast: '#ffffff' },\n sunset: { primary: '#f97316', contrast: '#ffffff' },\n midnight: { primary: '#3730a3', contrast: '#ffffff' },\n lavender: { primary: '#8b5cf6', contrast: '#ffffff' },\n coral: { primary: '#f43f5e', contrast: '#ffffff' },\n slate: { primary: '#64748b', contrast: '#ffffff' },\n gold: { primary: '#d97706', contrast: '#111827' },\n silver: { primary: '#94a3b8', contrast: '#111827' }\n}\n\nexport function expandHex(hex: string): string {\n const h = hex.replace('#', '')\n return h.length === 3 ? '#' + h[0] + h[0] + h[1] + h[1] + h[2] + h[2] : hex\n}\n\nexport function contrastFor(hex6: string): string {\n const h = hex6.replace('#', '')\n const r = parseInt(h.substring(0, 2), 16)\n const g = parseInt(h.substring(2, 4), 16)\n const b = parseInt(h.substring(4, 6), 16)\n return (r * 299 + g * 587 + b * 114) / 1000 > 165 ? '#111827' : '#ffffff'\n}\n\nexport function resolveColor(query: string): ColorEntry {\n const hexMatch = query.match(/#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})\\b/)\n if (hexMatch) {\n const primary = expandHex(hexMatch[0])\n return { primary, contrast: contrastFor(primary) }\n }\n\n const sorted = Object.keys(PALETTE).sort((a, b) => b.length - a.length)\n for (const name of sorted) {\n if (query.includes(name)) return PALETTE[name]\n }\n\n return { primary: '#6366f1', contrast: '#ffffff' }\n}\n","import { resolveColor } from './theme-palette.js'\n\nexport interface ThemeTokens {\n primary: string\n primaryHover: string\n primaryContrast: string\n primaryBg: string\n\n danger: string\n dangerText: string\n dangerBg: string\n\n warning: string\n warningBg: string\n\n success: string\n successBg: string\n\n infoBg: string\n neutral: string\n divider: string\n\n surface: string\n surfaceRaised: string\n\n text: string\n textMuted: string\n border: string\n\n radius: string\n radiusLg: string\n badgeRadius: string\n\n skeletonBg: string\n skeletonShimmer: string\n\n gradientStart: string\n gradientEnd: string\n gradientBgEnd: string\n\n isDark: boolean\n resolvedPrimary: string\n resolvedContrast: string\n}\n\nexport function resolveTokens(query: string): ThemeTokens {\n const { primary, contrast } = resolveColor(query)\n\n const isDark =\n query.includes('dark') ||\n query.includes('night') ||\n query.includes('midnight') ||\n query.includes('cyberpunk') ||\n query.includes('dim')\n\n const sharp =\n query.includes('sharp') ||\n query.includes('flat') ||\n query.includes('square')\n const round =\n query.includes('round') || query.includes('pill') || query.includes('soft')\n\n return {\n resolvedPrimary: primary,\n resolvedContrast: contrast,\n isDark,\n\n primary,\n primaryHover: isDark\n ? 'color-mix(in srgb, var(--ix-primary) 75%, white)'\n : 'color-mix(in srgb, var(--ix-primary) 85%, black)',\n primaryContrast: isDark\n ? 'color-mix(in srgb, var(--ix-primary) 40%, white)'\n : contrast,\n primaryBg: isDark\n ? 'color-mix(in srgb, var(--ix-primary) 20%, #0f172a)'\n : 'color-mix(in srgb, var(--ix-primary) 15%, white)',\n\n danger: '#ef4444',\n dangerText: isDark ? '#f87171' : '#ef4444',\n dangerBg: isDark ? '#3f1d1d' : '#fee2e2',\n\n warning: isDark ? '#fbbf24' : '#f59e0b',\n warningBg: isDark ? '#3f2e05' : '#fef3c7',\n\n success: '#22c55e',\n successBg: isDark ? '#052e16' : '#dcfce7',\n\n infoBg: isDark ? '#1e293b' : '#f3f4f6',\n neutral: isDark ? '#9ca3af' : '#6b7280',\n divider: isDark ? '#475569' : '#9ca3af',\n\n surface: isDark ? '#0f172a' : '#f9fafb',\n surfaceRaised: isDark ? '#1e293b' : '#ffffff',\n\n text: isDark ? '#f9fafb' : '#111827',\n textMuted: isDark ? '#94a3b8' : '#6b7280',\n border: isDark ? '#334155' : '#e5e7eb',\n\n radius: sharp ? '0px' : round ? '0.75rem' : '0.375rem',\n radiusLg: sharp ? '0px' : round ? '1rem' : '0.5rem',\n badgeRadius: '999px',\n\n skeletonBg: isDark ? '#1e293b' : '#e5e7eb',\n skeletonShimmer: isDark ? 'rgba(255,255,255,0.1)' : 'rgba(255,255,255,0.6)',\n\n gradientStart: primary,\n gradientEnd: '#fffbd5',\n gradientBgEnd: isDark ? '#aba67a' : '#d7d4bc'\n }\n}\n\nexport function buildCss(t: ThemeTokens): string {\n return `:root {\n --ix-primary: ${t.primary};\n --ix-primary-hover: ${t.primaryHover};\n --ix-primary-contrast: ${t.primaryContrast};\n\n --ix-danger: ${t.danger};\n --ix-danger-text: ${t.dangerText};\n\n --ix-warning: ${t.warning};\n --ix-success: ${t.success};\n --ix-neutral: ${t.neutral};\n --ix-ghost: transparent;\n\n --ix-primary-bg: ${t.primaryBg};\n --ix-danger-bg: ${t.dangerBg};\n --ix-warning-bg: ${t.warningBg};\n --ix-success-bg: ${t.successBg};\n --ix-info-bg: ${t.infoBg};\n\n --ix-on-danger: #ffffff;\n --ix-on-warning: #000000;\n --ix-on-success: #ffffff;\n --ix-on-primary: ${t.resolvedContrast};\n\n --ix-divider: ${t.divider};\n\n --ix-surface: ${t.surface};\n --ix-surface-raised: ${t.surfaceRaised};\n\n --ix-text: ${t.text};\n --ix-text-muted: ${t.textMuted};\n\n --ix-border: ${t.border};\n --ix-focus: 2px solid var(--ix-primary);\n\n --ix-font: 'Segoe UI Variable', 'Segoe UI', 'Roboto', 'Noto Sans', system-ui, sans-serif;\n --ix-font-mono: 'JetBrains Mono', 'SFMono-Regular', Consolas, monospace;\n\n --ix-size-xs: 0.75rem;\n --ix-size-sm: 0.875rem;\n --ix-size-md: 1rem;\n --ix-size-lg: 1.125rem;\n --ix-size-xl: 1.25rem;\n\n --ix-line-height: 1.5;\n\n --ix-space-sm: 0.5rem;\n --ix-space-md: 1rem;\n --ix-space-lg: 1.5rem;\n\n --ix-radius: ${t.radius};\n --ix-radius-lg: ${t.radiusLg};\n --ix-badge-radius: ${t.badgeRadius};\n\n --ix-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n\n --ix-gradient: linear-gradient(to right, ${t.gradientStart}, ${t.gradientEnd});\n --ix-gradient-bg: linear-gradient(to right, ${t.gradientStart}, ${t.gradientBgEnd});\n\n --ix-skeleton-bg: ${t.skeletonBg};\n --ix-skeleton-shimmer: ${t.skeletonShimmer};\n}`\n}\n","import path from 'path'\nimport { readFileSync, existsSync } from 'fs'\nimport { fileURLToPath } from 'url'\nimport { embedText } from './embedder.js'\nimport { cosineSimilarity } from '../utils/cosine.js'\nimport { STOP_WORDS } from '../utils/intent-helpers.js'\n\ntype IndexItem = {\n name: string\n emmet: string\n searchable: string\n embedding: number[]\n}\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\nlet _index: IndexItem[] | null = null\n\nfunction loadIndex(): IndexItem[] {\n if (_index) return _index\n const paths = [\n path.resolve(__dirname, '../../dist/vector-index.json'),\n path.resolve(__dirname, './vector-index.json'),\n path.resolve(__dirname, '../vector-index.json')\n ]\n let indexPath = paths[0]\n for (const p of paths) {\n if (existsSync(p)) {\n indexPath = p\n break\n }\n }\n if (!existsSync(indexPath)) {\n console.warn(\n `[search-index] dist/vector-index.json not found at: ${indexPath} - run pnpm build:index`\n )\n _index = []\n return _index\n }\n try {\n _index = JSON.parse(readFileSync(indexPath, 'utf8'))\n } catch (err) {\n console.error(`[search-index] Failed to load index from ${indexPath}:`, err)\n _index = []\n }\n return _index!\n}\n\nexport function searchIndex(description: string) {\n const index = loadIndex()\n const queryEmbedding = embedText(description)\n\n const words = description.toLowerCase().split(/\\s+/)\n const ranked = index\n .map((item) => {\n const similarity = cosineSimilarity(queryEmbedding, item.embedding)\n let boost = 0\n const searchable = item.searchable.toLowerCase()\n\n words.forEach((word) => {\n if (STOP_WORDS.has(word) || word.length < 3) {\n return\n }\n if (item.name.toLowerCase() === word) {\n boost += 2\n } else if (item.name.toLowerCase().includes(word)) {\n boost += 1\n }\n if (searchable.includes(word)) {\n boost += 0.3\n }\n })\n return {\n ...item,\n score: similarity + boost\n }\n })\n .sort((a, b) => b.score - a.score)\n return ranked.slice(0, 3)\n}\n\n","const VOCAB_SIZE = 512\n\nexport function embedText(text: string): number[] {\n const vector = new Array(VOCAB_SIZE).fill(0)\n const words = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter(Boolean)\n words.forEach((word) => {\n let hash = 0\n for (let i = 0; i < word.length; i++) {\n hash = (hash * 31 + word.charCodeAt(i)) % VOCAB_SIZE\n }\n vector[hash] += 1\n })\n return vector\n}\n","export function cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0\n let magA = 0\n let magB = 0\n\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i]\n magA += a[i] * a[i]\n magB += b[i] * b[i]\n }\n\n if (magA === 0 || magB === 0) return 0\n\n return dot / (Math.sqrt(magA) * Math.sqrt(magB))\n}\n","export const STOP_WORDS = new Set([\n 'with',\n 'for',\n 'and',\n 'the',\n 'you',\n 'can',\n 'from',\n 'this',\n 'that',\n 'your',\n 'want',\n 'need',\n 'show',\n 'give',\n 'nice',\n 'page',\n 'here',\n 'please',\n 'make',\n 'create',\n 'build',\n 'about',\n 'using',\n 'what',\n 'should',\n 'how'\n])\n\nexport function tokenise(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9\\s/]/g, ' ')\n .split(/[\\s/]+/)\n .filter((w) => w.length > 1 && !STOP_WORDS.has(w))\n}\n\nexport function editDistance(s1: string, s2: string): number {\n const costs: number[] = []\n for (let i = 0; i <= s1.length; i++) {\n let lastValue = i\n for (let j = 0; j <= s2.length; j++) {\n if (i === 0) {\n costs[j] = j\n } else {\n if (j > 0) {\n let newValue = costs[j - 1]\n if (s1.charAt(i - 1) !== s2.charAt(j - 1)) {\n newValue = Math.min(Math.min(newValue, lastValue), costs[j]) + 1\n }\n costs[j - 1] = lastValue\n lastValue = newValue\n }\n }\n }\n if (i > 0) costs[s2.length] = lastValue\n }\n return costs[s2.length]\n}\n\nexport function isSimilar(w1: string, w2: string): boolean {\n if (w1.length < 3 || w2.length < 3) return w1 === w2\n // Typo tolerance: 1 edit for 3-5 chars, 2 edits for 6+ chars\n const maxDistance = w1.length >= 6 && w2.length >= 6 ? 2 : 1\n return editDistance(w1, w2) <= maxDistance\n}\n","import { readFileSync, existsSync } from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\nimport { tokenise, isSimilar } from './intent-helpers.js'\n\nexport type IntentEntry = {\n name: string\n phrases: string[]\n emmet: string\n category: string\n}\n\n\nfunction parseIntents(raw: string): IntentEntry[] {\n const entries: IntentEntry[] = []\n\n // Find where the INTENTS block starts\n const intentStart = raw.indexOf('INTENTS:')\n if (intentStart === -1) return entries\n\n const block = raw.slice(intentStart)\n const lines = block.split(/\\r?\\n/)\n\n let currentCategory = 'GENERAL'\n let pendingPhrase: string | null = null\n\n for (const raw_line of lines) {\n const line = raw_line.trim()\n\n // Category header: --- DESTROY / DANGER ---\n if (line.startsWith('---') && line.endsWith('---')) {\n currentCategory = line\n .replace(/^-+\\s*/, '')\n .replace(/\\s*-+$/, '')\n .trim()\n pendingPhrase = null\n continue\n }\n\n // Skip meta comment line [caveman prompt → emmet...]\n if (line.startsWith('[') && line.endsWith(']')) continue\n\n // Skip NEVER DO section (starts with \"never use\")\n if (line.startsWith('never ')) continue\n\n // Skip blank lines and \"→\" alias lines (these are in NEVER DO)\n if (line === '' || line.startsWith('→')) continue\n\n // Emmet line: starts with \"- \"\n if (line.startsWith('- ') && pendingPhrase !== null) {\n const emmet = line.slice(2).trim()\n entries.push({\n name: pendingPhrase,\n phrases: tokenise(pendingPhrase),\n emmet,\n category: currentCategory\n })\n pendingPhrase = null\n continue\n }\n\n // Anything else is a caveman phrase (intent description)\n if (!line.startsWith('-')) {\n pendingPhrase = line\n }\n }\n\n return entries\n}\n\nfunction loadIntents(): IntentEntry[] {\n try {\n const currentDir = path.dirname(fileURLToPath(import.meta.url))\n\n // Try relative paths from current file structure (packages/mcp/src/utils/ or dist/utils/)\n const pathDist = path.resolve(currentDir, './api-full.txt')\n const path1 = path.resolve(currentDir, '../../../api-full.txt')\n const path2 = path.resolve(currentDir, '../../api-full.txt')\n const path3 = path.resolve(currentDir, '../../../../api-full.txt')\n\n let txtPath = pathDist\n if (existsSync(pathDist)) {\n txtPath = pathDist\n } else if (existsSync(path1)) {\n txtPath = path1\n } else if (existsSync(path2)) {\n txtPath = path2\n } else if (existsSync(path3)) {\n txtPath = path3\n } else {\n txtPath = path.resolve(process.cwd(), '../../api-full.txt')\n }\n\n const raw = readFileSync(txtPath, 'utf8')\n return parseIntents(raw)\n } catch {\n return []\n }\n}\n\n// Singleton - parsed once at server startup, stays in-memory (DC-13)\nlet _cache: IntentEntry[] | null = null\n\nexport function getIntentEntries(): IntentEntry[] {\n if (!_cache) {\n _cache = loadIntents()\n }\n return _cache\n}\n\nexport type ScoreResult = {\n score: number\n density: number\n}\n\n// Score a single IntentEntry against the query, tolerating minor typos. eturns { score, density } for tie-breaking.\n\nexport function scoreEntry(\n entry: IntentEntry,\n queryWords: string[]\n): ScoreResult {\n let score = 0\n const entryWords = new Set(entry.phrases)\n let matchedCount = 0\n\n for (const qw of queryWords) {\n let matched = false\n // 1. Exact match (+10)\n if (entryWords.has(qw)) {\n score += 10\n matched = true\n } else {\n // 2. Fuzzy spelling similarity match (+8)\n for (const ew of entryWords) {\n if (isSimilar(qw, ew)) {\n score += 8\n matched = true\n break\n }\n }\n // 3. Substring match fallback (+4)\n if (!matched) {\n for (const ew of entryWords) {\n if (ew.includes(qw) || qw.includes(ew)) {\n score += 4\n matched = true\n break\n }\n }\n }\n }\n if (matched) {\n matchedCount++\n }\n }\n\n // Bonus: category keyword overlap (supports fuzzy spelling matches)\n const catWords = tokenise(entry.category)\n for (const qw of queryWords) {\n if (catWords.includes(qw)) {\n score += 3\n } else {\n for (const cw of catWords) {\n if (isSimilar(qw, cw)) {\n score += 2\n break\n }\n }\n }\n }\n\n // Density = portion of the entry's phrases that were matched by the query\n const density =\n entry.phrases.length > 0 ? matchedCount / entry.phrases.length : 0\n\n return { score, density }\n}\n","import emmet from 'emmet'\n\n// Expand Emmet shorthand to full HTML using the emmet npm package\nexport function expandEmmet(emmetStr: string): string {\n try {\n return emmet(emmetStr)\n } catch {\n return `<!-- expand: ${emmetStr} -->`\n }\n}\n\n// Maps HTML element names / web-component tag names → ignix-lite component names\nexport const ELEMENT_TO_COMPONENT: Record<string, string> = {\n // Native elements\n button: 'button',\n input: 'input',\n textarea: 'textarea',\n select: 'select',\n form: 'form',\n dialog: 'dialog',\n details: 'accordion',\n summary: 'accordion',\n progress: 'progress',\n meter: 'meter',\n aside: 'alert',\n mark: 'badge',\n img: 'avatar',\n article: 'card',\n nav: 'navigation',\n table: 'table',\n pre: 'codeblock',\n code: 'codeblock',\n hr: 'divider',\n label: 'input', // label wraps input/checkbox/radio\n // Web components\n 'ix-tabs': 'tab',\n 'ix-dropdown': 'dropdown',\n 'ix-combobox': 'combobox',\n 'ix-tooltip': 'tooltip',\n 'ix-toast': 'toast'\n}\n\n// Skeleton heuristic: span with aria-busy or data-shape\nexport const SKELETON_PATTERN = /span\\[[^\\]]*(?:aria-busy|data-shape)[^\\]]*\\]/i\n\n// Given an emmet string, return the unique set of ignix-lite component names hat the pattern uses.\n\nexport function extractComponents(emmetStr: string): string[] {\n const found = new Set<string>()\n\n // Special case: skeleton uses span[aria-busy] or span[data-shape]\n if (SKELETON_PATTERN.test(emmetStr)) {\n found.add('skeleton')\n }\n\n // Special case: nav[aria-label=Breadcrumb] → breadcrumb\n if (/nav\\[[^\\]]*breadcrumb/i.test(emmetStr)) {\n found.add('breadcrumb')\n } else if (/\\bnav\\b/.test(emmetStr)) {\n found.add('navigation')\n }\n\n // Special case: label > input[type=checkbox] → checkbox\n if (/input\\[[^\\]]*type=checkbox/i.test(emmetStr)) {\n found.add('checkbox')\n }\n\n // Special case: label > input[type=radio] → radio\n if (/input\\[[^\\]]*type=radio/i.test(emmetStr)) {\n found.add('radio')\n }\n\n // Special case: section[data-grid] → grid (only when data-grid attr is present)\n if (/section\\[[^\\]]*data-grid/i.test(emmetStr)) {\n found.add('grid')\n }\n\n // General: extract all tag names from the emmet string\n const tagPattern = /(?:^|[>+(])([a-z][a-z0-9-]*)/gi\n let m: RegExpExecArray | null\n while ((m = tagPattern.exec(emmetStr)) !== null) {\n const tag = m[1].toLowerCase()\n const component = ELEMENT_TO_COMPONENT[tag]\n if (component) found.add(component)\n }\n\n return Array.from(found)\n}\n\n// Customizes standard Emmet shorthand by dynamically replacing text strings and visual intent attributes based on the user prompt description.\n\nfunction injectAttribute(emmetStr: string, attr: string, value: string): string {\n if (emmetStr.includes(attr)) return emmetStr\n const match = emmetStr.match(/^([a-z][a-z0-9-]*)(?:\\[([^\\]]*)\\])?/i)\n if (!match) return emmetStr\n const tag = match[1]\n const attrs = match[2] ? `${attr}=${value} ${match[2]}` : `${attr}=${value}`\n return emmetStr.replace(/^([a-z][a-z0-9-]*)(?:\\[[^\\]]*\\])?/i, `${tag}[${attrs}]`)\n}\n\nexport function interpolateEmmet(\n emmetStr: string,\n description: string\n): string {\n let result = emmetStr\n const descLower = description.toLowerCase()\n\n let intent = 'primary'\n if (/\\b(red|danger|delete|remove|destroy)\\b/.test(descLower)) {\n intent = 'danger'\n } else if (/\\b(green|success|work|done)\\b/.test(descLower)) {\n intent = 'success'\n } else if (/\\b(yellow|orange|warning|risky)\\b/.test(descLower)) {\n intent = 'warning'\n } else if (/\\b(ghost|secondary)\\b/.test(descLower)) {\n intent = 'ghost'\n } else if (/\\b(neutral|gray|grey)\\b/.test(descLower)) {\n intent = 'neutral'\n }\n result = result.replace(/data-intent=\\?/g, `data-intent=${intent}`)\n\n // Only override data-intent on semantic elements, not wrappers like label\n const INTENT_ELEMENTS = /^(button|aside|mark|dialog|ix-tooltip|ix-toast)/\n if (intent !== 'primary') {\n result = result.replace(\n /data-intent=(?:primary|neutral|ghost|success|warning|danger)/g,\n (match, offset) => {\n // Walk backwards to find the tag name to avoid injecting on label\n const before = result.slice(0, offset)\n const tagMatch = before.match(/([a-z][a-z0-9-]*)\\[[^\\]]*$/i)\n if (tagMatch && !INTENT_ELEMENTS.test(tagMatch[1])) {\n return match // leave unchanged\n }\n return `data-intent=${intent}`\n }\n )\n }\n\n let size = 'md'\n if (/\\b(large|lg|big)\\b/.test(descLower)) {\n size = 'lg'\n } else if (/\\b(small|sm|tiny)\\b/.test(descLower)) {\n size = 'sm'\n }\n result = result.replace(/data-size=\\?/g, `data-size=${size}`)\n\n let variant = 'solid'\n if (/\\b(outline|ghost|link)\\b/.test(descLower)) {\n variant = 'outline'\n }\n result = result.replace(/data-variant=\\?/g, `data-variant=${variant}`)\n\n // Recognize shape keywords: rectangular → rect, circle/round → circle\n if (/\\b(rect|rectangular|rectangle)\\b/.test(descLower)) {\n result = result.replace(/data-shape=(?:text|circle|\\?)/g, 'data-shape=rect')\n } else if (/\\b(circle|round|circular)\\b/.test(descLower)) {\n result = result.replace(/data-shape=(?:text|rect|\\?)/g, 'data-shape=circle')\n }\n\n if (/\\b(loading|spinner|busy)\\b/.test(descLower)) {\n result = injectAttribute(result, 'aria-busy', 'true')\n }\n if (/\\b(disabled|inactive)\\b/.test(descLower)) {\n result = injectAttribute(result, 'disabled', 'true')\n }\n\n const matches = [...description.matchAll(/['\"]([^'\"]+)['\"]/g)]\n const quotedStrings = matches\n .map((m) => m[1].trim())\n .filter((s) => s.length > 0)\n\n if (quotedStrings.length > 0) {\n let quoteIndex = 0\n\n result = result.replace(/content(=\\?|=\"\"|=''|(?=[\\]\\s]|$))/g, () => {\n if (quoteIndex < quotedStrings.length) {\n return `content=\"${quotedStrings[quoteIndex++]}\"`\n }\n return 'content=\"\"'\n })\n\n result = result.replace(/title(=\\?|=\"\"|=''|(?=[\\]\\s]|$))/g, () => {\n if (quoteIndex < quotedStrings.length) {\n return `title=\"${quotedStrings[quoteIndex++]}\"`\n }\n return 'title=\"\"'\n })\n\n result = result.replace(/label(=\\?|=\"\"|=''|(?=[\\]\\s]|$))/g, () => {\n if (quoteIndex < quotedStrings.length) {\n return `label=\"${quotedStrings[quoteIndex++]}\"`\n }\n return 'label=\"\"'\n })\n\n const hasButtonMention = /\\b(button|says|labeled|action|click)\\b/i.test(\n description\n )\n\n // Don't replace button labels when the only quoted string was already consumed as content=\n const remainingQuotes = quotedStrings.slice(quoteIndex)\n // Also skip if the emmet already has a populated content= attribute (e.g. from tooltip template)\n // — in that case the quoted string belongs to content, not the button label\n const hasPopulatedContent = /content=\"[^\"]+\"/i.test(result)\n const shouldReplaceButton =\n !hasPopulatedContent &&\n (remainingQuotes.length >= 2 ||\n (remainingQuotes.length === 1 && hasButtonMention))\n\n if (shouldReplaceButton) {\n const buttonRegex = /(button[^}]*)\\{([^}]+)\\}/g\n const buttonMatches = [...result.matchAll(buttonRegex)]\n\n if (buttonMatches.length > 0) {\n const buttonLabel = remainingQuotes[remainingQuotes.length - 1]\n result = result.replace(buttonRegex, (match, p1) => {\n return `${p1}{${buttonLabel}}`\n })\n }\n }\n\n\n\n const textPlaceholderRegex = /\\{(label|message|title|text)\\}/gi\n result = result.replace(textPlaceholderRegex, (match) => {\n if (quoteIndex < quotedStrings.length) {\n return `{${quotedStrings[quoteIndex++]}}`\n }\n return match\n })\n\n const labelRegex = /label\\{([^}]+)\\}/g\n result = result.replace(labelRegex, (match) => {\n if (quoteIndex < quotedStrings.length) {\n return `label{${quotedStrings[quoteIndex++]}}`\n }\n return match\n })\n\n if (/label\\{username\\}/i.test(result)) {\n result = result.replace(/type=email/g, 'type=text')\n }\n } else {\n const labelMap: Record<string, string> = {\n delete: 'Delete',\n remove: 'Remove',\n destroy: 'Destroy',\n danger: 'Delete',\n save: 'Save',\n submit: 'Submit',\n cancel: 'Cancel',\n confirm: 'Confirm',\n search: 'Search',\n download: 'Download',\n upload: 'Upload',\n edit: 'Edit',\n add: 'Add',\n create: 'Create',\n update: 'Update'\n }\n let extractedLabel = ''\n for (const [key, val] of Object.entries(labelMap)) {\n if (descLower.includes(key)) {\n extractedLabel = val\n break\n }\n }\n if (!extractedLabel) {\n const components = extractComponents(emmetStr)\n if (components.length > 0) {\n extractedLabel = components[0].charAt(0).toUpperCase() + components[0].slice(1)\n } else {\n extractedLabel = 'Button'\n }\n }\n result = result.replace(/\\{(label|Label|message|Message|title|Title|text|Text)\\}/g, `{${extractedLabel}}`)\n }\n\n result = result.replace(/alt=\\?/g, 'alt=\"User\"')\n result = result.replace(/src=\\?/g, 'src=\"?\"')\n\n return result\n}\n","import { searchIndex } from './search-index.js'\nimport { getIntentEntries, scoreEntry } from '../utils/intent-parser.js'\nimport { getTokenCount } from '../utils/tokenizer.js'\nimport { tokenise } from '../utils/intent-helpers.js'\nimport {\n expandEmmet,\n extractComponents,\n interpolateEmmet\n} from '../utils/emmet-helpers.js'\n\nimport type { IntentEntry } from '../utils/intent-parser.js'\nimport type { MCPResponse } from '../types.js'\n\n\ntype IntentMatch = {\n name: string\n emmet: string\n score: number\n source: 'intent-table' | 'vector-index'\n}\n\nconst LAYER1_THRESHOLD = 15 // minimum score to trust an intent-table hit\n\nfunction searchIntentTable(description: string): IntentMatch | null {\n const entries = getIntentEntries()\n if (entries.length === 0) return null\n\n const isStitchRequested =\n /\\b(and|plus|\\+)\\b/i.test(description) || description.includes(',')\n\n const queryWords = tokenise(description)\n\n const candidates: {\n entry: IntentEntry\n score: number\n density: number\n components: string[]\n }[] = []\n let bestSingle: (IntentMatch & { density: number }) | null = null\n\n for (const entry of entries) {\n const { score, density } = scoreEntry(entry, queryWords)\n if (score >= LAYER1_THRESHOLD) {\n const components = extractComponents(entry.emmet)\n candidates.push({ entry, score, density, components })\n\n const isBetter =\n !bestSingle ||\n score > bestSingle.score ||\n (score === bestSingle.score && density > bestSingle.density)\n if (isBetter) {\n bestSingle = {\n name: entry.name,\n emmet: entry.emmet,\n score,\n density,\n source: 'intent-table'\n }\n }\n }\n }\n\n if (bestSingle && bestSingle.score >= 18) {\n if (!isStitchRequested || bestSingle.score >= 25) {\n return bestSingle\n }\n }\n\n if (isStitchRequested && candidates.length >= 2) {\n candidates.sort((a, b) => b.score - a.score || b.density - a.density)\n\n const selected: typeof candidates = []\n const usedComponents = new Set<string>()\n\n for (const c of candidates) {\n const hasOverlap = c.components.some((comp) => usedComponents.has(comp))\n if (!hasOverlap) {\n selected.push(c)\n c.components.forEach((comp) => usedComponents.add(comp))\n }\n }\n\n if (selected.length >= 2) {\n selected.sort((a, b) => {\n const indexA = description\n .toLowerCase()\n .indexOf(tokenise(a.entry.name)[0])\n const indexB = description\n .toLowerCase()\n .indexOf(tokenise(b.entry.name)[0])\n return indexA - indexB\n })\n\n const combinedEmmet = selected.map((s) => s.entry.emmet).join('+')\n const totalScore = selected.reduce((sum, s) => sum + s.score, 0)\n\n return {\n name: selected.map((s) => s.entry.name).join(' and '),\n emmet: combinedEmmet,\n score: totalScore,\n source: 'intent-table'\n }\n }\n }\n\n if (bestSingle && bestSingle.score >= 18) {\n if (!isStitchRequested || bestSingle.score >= 25) {\n return bestSingle\n }\n }\n return null\n}\n\n\nfunction searchVectorLayer(description: string): IntentMatch | null {\n const results = searchIndex(description)\n if (results.length === 0) return null\n\n const isStitchRequested =\n /\\b(and|plus|\\+)\\b/i.test(description) || description.includes(',')\n\n if (isStitchRequested && results.length >= 2) {\n const top = results[0]\n const second = results[1]\n if (top.name !== second.name && top.score >= 2.0 && second.score >= 2.0) {\n const indexA = description.toLowerCase().indexOf(top.name.toLowerCase())\n const indexB = description.toLowerCase().indexOf(second.name.toLowerCase())\n const firstItem = indexA < indexB ? top : second\n const secondItem = indexA < indexB ? second : top\n return {\n name: `${firstItem.name} and ${secondItem.name}`,\n emmet: `${firstItem.emmet}+${secondItem.emmet}`,\n score: (top.score + second.score) / 2,\n source: 'vector-index'\n }\n }\n }\n\n const top = results[0]\n return {\n name: top.name,\n emmet: top.emmet,\n score: top.score,\n source: 'vector-index'\n }\n}\n\n\nexport async function howToBuild(description: string): Promise<MCPResponse> {\n let cleanDesc = description.trim()\n if (cleanDesc.startsWith('{') && cleanDesc.endsWith('}')) {\n try {\n const parsed = JSON.parse(cleanDesc)\n if (parsed && typeof parsed.description === 'string') {\n cleanDesc = parsed.description\n } else if (parsed && typeof parsed.text === 'string') {\n cleanDesc = parsed.text\n }\n } catch {\n // Ignore parsing errors, keep original string\n }\n }\n\n // Layer 1 - fast, deterministic, hand-crafted intent table\n let match = searchIntentTable(cleanDesc)\n\n // Layer 2 - vector index fallback for novel / unknown queries\n if (!match) {\n match = searchVectorLayer(cleanDesc)\n }\n\n if (!match) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n emmet: '',\n html: '',\n components_used: [],\n confidence: 0,\n tokens: 0,\n tokens_used: 15,\n source: 'no-match',\n suggestion:\n 'Call list_components() to see all available components, or try a different description.'\n })\n }\n ]\n }\n }\n\n // Apply dynamic interpolation to customize labels, types, and colors on the fly\n const emmet = interpolateEmmet(match.emmet, cleanDesc)\n const components_used = extractComponents(emmet)\n\n const confidence = Math.min(1, match.score / 40)\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n emmet,\n html: expandEmmet(emmet),\n components_used,\n confidence: Number(confidence.toFixed(2)),\n tokens: getTokenCount(emmet),\n tokens_used: 15,\n source: match.source // tells caller which layer matched\n })\n }\n ]\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { chromium, webkit } from 'playwright'\nimport { readFileSync, existsSync } from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\nimport { expandEmmet } from '../utils/emmet-helpers.js'\nimport type { MCPResponse } from '../types.js'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\nexport type PreviewOptions = {\n width?: number\n theme?: string\n scale?: number\n}\n\nexport type PreviewArgs = {\n input: string\n options?: PreviewOptions\n}\n\nexport async function preview(args: PreviewArgs): Promise<MCPResponse> {\n const start = Date.now()\n const { input, options = {} } = args\n const { width = 400, scale = 2, theme } = options\n\n // Sanitize width and scale to prevent emulation protocol crashes on non-positive values\n const sanitizedWidth = typeof width === 'number' && width > 0 ? width : 400\n const sanitizedScale = typeof scale === 'number' && scale > 0 ? scale : 2\n\n // Expand Emmet to HTML if it doesn't look like standard HTML\n const html = input.trim().startsWith('<') ? input : expandEmmet(input)\n\n // Resolve CSS path by searching upwards for workspace root directory\n let currentDir = __dirname\n let rootDir = ''\n for (let i = 0; i < 6; i++) {\n if (\n existsSync(path.join(currentDir, 'pnpm-workspace.yaml')) ||\n (existsSync(path.join(currentDir, 'package.json')) &&\n existsSync(path.join(currentDir, 'packages')))\n ) {\n rootDir = currentDir\n break\n }\n const parent = path.dirname(currentDir)\n if (parent === currentDir) break\n currentDir = parent\n }\n\n let cssPath = ''\n if (rootDir) {\n cssPath = path.join(rootDir, 'packages/core/dist/ignix-lite.min.css')\n }\n\n // Fallback options\n if (!cssPath || !existsSync(cssPath)) {\n cssPath = path.resolve(\n process.cwd(),\n 'packages/core/dist/ignix-lite.min.css'\n )\n }\n if (!existsSync(cssPath)) {\n cssPath = path.resolve(process.cwd(), '../core/dist/ignix-lite.min.css')\n }\n if (!existsSync(cssPath)) {\n cssPath = path.resolve(__dirname, '../../../core/dist/ignix-lite.min.css')\n }\n\n let cssContent = ''\n if (existsSync(cssPath)) {\n cssContent = readFileSync(cssPath, 'utf8')\n } else {\n console.warn(`[preview] CSS file not found at: ${cssPath}`)\n }\n\n let browser\n try {\n browser = await webkit.launch({\n headless: true\n })\n\n const context = await browser.newContext({\n javaScriptEnabled: false,\n viewport: {\n width: sanitizedWidth,\n height: 600\n },\n deviceScaleFactor: sanitizedScale,\n colorScheme: (theme === 'dark' || theme === 'light') ? theme : undefined\n })\n\n const page = await context.newPage()\n\n // Route interception (SSRF Mitigation & Sandbox Hardening)\n // Only allow data URIs and about:blank. Block all outgoing HTTP/HTTPS traffic.\n await page.route('**/*', (route) => {\n const url = route.request().url()\n if (url.startsWith('data:') || url === 'about:blank') {\n route.continue()\n } else {\n route.abort()\n }\n })\n\n // Set page content with Ignix-Lite styles injected\n const pageContent = `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; style-src 'unsafe-inline'; img-src data:;\">\n <style>\n body {\n margin: 0;\n padding: 16px;\n background-color: var(--ix-surface, #f9fafb);\n font-family: var(--ix-font, sans-serif);\n }\n #preview-container {\n display: flex;\n justify-content: center;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n width: 100%;\n box-sizing: border-box;\n }\n ${cssContent}\n </style>\n </head>\n <body>\n <div id=\"preview-container\">${html}</div>\n </body>\n </html>\n `\n await page.setContent(pageContent, { waitUntil: 'load' })\n\n // Take screenshot of container\n const container = page.locator('#preview-container')\n let base64Png = ''\n try {\n const buffer = await container.screenshot()\n base64Png = buffer.toString('base64')\n } catch (error) {\n // Fallback to taking a full page screenshot if container has 0 size or fails\n const buffer = await page.screenshot()\n base64Png = buffer.toString('base64')\n }\n\n const duration = Date.now() - start\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n png: `data:image/png;base64,${base64Png}`,\n width: sanitizedWidth,\n render_ms: duration,\n tokens_used: 5\n })\n }\n ]\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error('[preview] Render failed:', error)\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: `Preview render failed: ${errorMessage}`,\n tokens_used: 5\n })\n }\n ]\n }\n } finally {\n if (browser) {\n await browser.close()\n }\n }\n}\n","import { parse, type HTMLElement } from 'node-html-parser'\nimport { expandEmmet } from '../utils/emmet-helpers.js'\nimport { getTokenCount } from '../utils/tokenizer.js'\nimport type { MCPResponse } from '../types.js'\n\nexport interface HandoffComponent {\n selector: string\n emmet: string\n state: Record<string, string>\n tokens: number\n}\n\nexport interface HandoffEnvelope {\n schema: 'ignix-lite-handoff'\n version: '1.0'\n id: string\n timestamp: number\n html: string\n components: HandoffComponent[]\n total_tokens: number\n metadata?: Record<string, unknown>\n}\n\nconst MAX_HANDOFFS = 100\nconst handoffs = new Map<string, HandoffEnvelope>()\n\nfunction saveHandoff(id: string, envelope: HandoffEnvelope): void {\n if (handoffs.size >= MAX_HANDOFFS) {\n const oldestKey = handoffs.keys().next().value\n if (oldestKey !== undefined) {\n handoffs.delete(oldestKey)\n }\n }\n handoffs.set(id, envelope)\n}\n\nfunction generateHandoffId(): string {\n return 'hndff_' + Math.random().toString(36).substring(2, 15)\n}\n\nfunction extractState(element: HTMLElement): Record<string, string> {\n const state: Record<string, string> = {}\n const attrs = [\n 'data-intent',\n 'disabled',\n 'checked',\n 'open',\n 'aria-busy',\n 'aria-invalid',\n 'aria-selected',\n 'aria-expanded'\n ]\n for (const attr of attrs) {\n const val = element.getAttribute(attr)\n if (val !== undefined && val !== null) {\n state[attr] = val === '' ? 'true' : val\n }\n }\n return state\n}\n\nfunction getElementSelector(el: HTMLElement, root: HTMLElement): string {\n const elementId = el.getAttribute('id')\n if (elementId) {\n return `#${elementId}`\n }\n\n const tag = el.tagName.toLowerCase()\n const parent = el.parentNode as HTMLElement | null\n\n if (!parent || parent === root || !parent.tagName) {\n const siblings = (root.childNodes || []).filter(\n (node): node is HTMLElement => node.nodeType === 1\n )\n const sameTagSiblings = siblings.filter(\n (node) => node.tagName && node.tagName.toLowerCase() === tag\n )\n const index = Math.max(1, sameTagSiblings.indexOf(el) + 1)\n return `${tag}:nth-of-type(${index})`\n }\n\n const siblings = (parent.childNodes || []).filter(\n (node): node is HTMLElement => node.nodeType === 1\n )\n const sameTagSiblings = siblings.filter(\n (node) => node.tagName && node.tagName.toLowerCase() === tag\n )\n const index = Math.max(1, sameTagSiblings.indexOf(el) + 1)\n\n const parentSelector = getElementSelector(parent, root)\n return `${parentSelector} > ${tag}:nth-of-type(${index})`\n}\n\nexport function createHandoff(args: {\n rendered_html: string\n metadata?: Record<string, unknown>\n}): MCPResponse {\n const { rendered_html, metadata } = args\n const root = parse(rendered_html)\n\n const id = generateHandoffId()\n const timestamp = Date.now()\n const components: HandoffComponent[] = []\n\n const componentTags = [\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'aside',\n 'mark',\n 'article',\n 'dialog',\n 'details',\n 'progress',\n 'meter',\n 'nav',\n 'hr',\n 'pre',\n 'table',\n 'ix-tabs',\n 'ix-dropdown',\n 'ix-combobox',\n 'ix-tooltip',\n 'ix-toast'\n ]\n\n const elements = root.querySelectorAll('*')\n for (const el of elements) {\n const tag = el.tagName.toLowerCase()\n if (componentTags.includes(tag) || el.getAttribute('data-intent')) {\n const selector = getElementSelector(el, root)\n\n const outerHtml = el.outerHTML\n const tokens = getTokenCount(outerHtml)\n const state = extractState(el)\n\n components.push({\n selector,\n emmet: outerHtml,\n state,\n tokens\n })\n }\n }\n\n const envelope: HandoffEnvelope = {\n schema: 'ignix-lite-handoff',\n version: '1.0',\n id,\n timestamp,\n html: rendered_html,\n components,\n total_tokens: getTokenCount(rendered_html),\n metadata\n }\n\n saveHandoff(id, envelope)\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n handoff_id: id,\n snapshot: {\n schema: envelope.schema,\n version: envelope.version,\n id: envelope.id,\n timestamp: envelope.timestamp,\n components: envelope.components.map((c) => ({\n selector: c.selector,\n emmet: c.emmet,\n state: c.state,\n tokens: c.tokens\n })),\n total_tokens: envelope.total_tokens,\n metadata: envelope.metadata\n },\n tokens_used: 10\n })\n }\n ]\n }\n}\n\nexport interface HandoffChange {\n selector: string\n action: 'update' | 'add' | 'remove'\n emmet?: string\n html?: string\n}\n\nexport function applyHandoff(args: {\n handoff_id: string\n changes: HandoffChange[]\n}): MCPResponse {\n const { handoff_id, changes } = args\n const envelope = handoffs.get(handoff_id)\n\n if (!envelope) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: `Handoff snapshot not found: ${handoff_id}`,\n tokens_used: 5\n })\n }\n ]\n }\n }\n\n // Assert that change.html or change.emmet is present for add and update actions\n for (const change of changes) {\n if (change.action === 'update' || change.action === 'add') {\n const hasHtml = change.html !== undefined && change.html !== null && change.html.trim() !== ''\n const hasEmmet = change.emmet !== undefined && change.emmet !== null && change.emmet.trim() !== ''\n if (!hasHtml && !hasEmmet) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: `Validation error: change for selector \"${change.selector}\" with action \"${change.action}\" must provide a non-empty \"html\" or \"emmet\" payload.`,\n tokens_used: 5\n })\n }\n ]\n }\n }\n }\n }\n\n const root = parse(envelope.html)\n let diffTokens = 0\n const failedSelectors: string[] = []\n const errors: string[] = []\n\n const sortedChanges = [...changes].sort((a, b) => {\n if (a.action === 'remove' && b.action !== 'remove') return 1\n if (a.action !== 'remove' && b.action === 'remove') return -1\n return 0\n })\n\n for (const change of sortedChanges) {\n try {\n const target = root.querySelector(change.selector)\n if (!target) {\n failedSelectors.push(change.selector)\n continue\n }\n\n const changeContent =\n change.html || (change.emmet ? expandEmmet(change.emmet) : '')\n diffTokens += getTokenCount(changeContent || change.selector)\n\n if (change.action === 'update') {\n const newNode = parse(changeContent)\n target.replaceWith(newNode)\n } else if (change.action === 'add') {\n const newNode = parse(changeContent)\n target.appendChild(newNode)\n } else if (change.action === 'remove') {\n target.remove()\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err)\n errors.push(\n `Failed to apply change on selector \"${change.selector}\": ${message}`\n )\n }\n }\n\n const updatedHtml = root.toString()\n const fullTokens = getTokenCount(updatedHtml)\n const savingsPct =\n fullTokens > 0 ? Math.round((1 - diffTokens / fullTokens) * 100) : 0\n\n envelope.html = updatedHtml\n envelope.total_tokens = fullTokens\n saveHandoff(handoff_id, envelope)\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n updated_html: updatedHtml,\n diff_tokens: diffTokens,\n full_tokens: fullTokens,\n savings_pct: Math.max(0, savingsPct),\n failed_selectors:\n failedSelectors.length > 0 ? failedSelectors : undefined,\n errors: errors.length > 0 ? errors : undefined,\n tokens_used: 15\n })\n }\n ]\n }\n}\n","import { z } from 'zod'\nimport type { MCPResponse } from '../types.js'\nimport { resolveTokens, buildCss } from './theme-tokens.js'\n\nconst schema = z.object({ prompt: z.string().min(1) })\n\nexport function generateTheme(args: unknown): MCPResponse {\n const parsed = schema.safeParse(args)\n\n if (!parsed.success) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: 'Invalid input',\n suggestion: 'Expected { prompt: string }',\n tokens_used: 2\n })\n }\n ]\n }\n }\n\n const { prompt } = parsed.data\n const tokens = resolveTokens(prompt.toLowerCase().trim())\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n prompt,\n primary: tokens.resolvedPrimary,\n isDark: tokens.isDark,\n css: buildCss(tokens),\n tokens_used: 10\n })\n }\n ]\n }\n}\n","import { z } from 'zod'\nimport { manifests } from '../manifests/index.js'\nimport type { MCPResponse } from '../types.js'\n\nconst schema = z.object({\n name: z.string()\n})\n\nexport function getEmmet(args: unknown): MCPResponse {\n const parsed = schema.safeParse(args)\n\n if (!parsed.success) {\n return {\n content: [\n {\n type: 'text',\n\n text: JSON.stringify({\n error: 'Invalid input',\n\n suggestion: 'Expected { name: string }',\n\n tokens_used: 2\n })\n }\n ]\n }\n }\n\n const { name } = parsed.data\n\n const manifest = manifests[name]\n\n if (!manifest) {\n return {\n content: [\n {\n type: 'text',\n\n text: JSON.stringify({\n error: `Unknown component: ${name}`,\n suggestion: 'Call list_components() first',\n tokens_used: 2\n })\n }\n ]\n }\n }\n\n return {\n content: [\n {\n type: 'text',\n\n text: JSON.stringify({\n component: manifest.component,\n emmet: manifest.emmet,\n tokens: manifest.tokens,\n tokens_used: 3\n })\n }\n ]\n }\n}\n","import { z } from 'zod'\nimport { manifests } from '../manifests/index.js'\nimport type { MCPResponse } from '../types.js'\n\nconst schema = z.object({\n name: z.string()\n})\n\nexport function getManifest(args: unknown): MCPResponse {\n const parsed = schema.safeParse(args)\n\n if (!parsed.success) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: 'Invalid input',\n suggestion: 'Expected { name: string }',\n tokens_used: 2\n })\n }\n ]\n }\n }\n\n const { name } = parsed.data\n\n const manifest = manifests[name]\n\n if (!manifest) {\n return {\n content: [\n {\n type: 'text',\n\n text: JSON.stringify({\n error: `Unknown component: ${name}`,\n suggestion: 'Call list_components() first',\n tokens_used: 2\n })\n }\n ]\n }\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(manifest)\n }\n ]\n }\n}\n","import { manifests } from '../manifests/index.js'\n\nimport type { MCPResponse } from '../types.js'\n\nexport function listComponents(): MCPResponse {\n const components = Object.keys(manifests).sort()\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n components,\n count: components.length,\n tokens_used: components.length\n })\n }\n ]\n }\n}\n","import type { MCPResponse } from '../types.js'\n\nexport type CallRecord = {\n tool: string\n tokens_used: number\n timestamp: number\n}\n\nlet totalTokensUsed = 0\nconst calls: CallRecord[] = []\nconst sessionId = Math.random().toString(36).substring(2, 15)\n\nconst MAX_CALL_HISTORY = 1000\n\nexport function recordCall(toolName: string, tokensUsed: number): void {\n const parsedTokens = Number(tokensUsed)\n const validTokens =\n isNaN(parsedTokens) || parsedTokens < 0 || !isFinite(parsedTokens)\n ? 0\n : parsedTokens\n\n if (calls.length >= MAX_CALL_HISTORY) {\n calls.shift()\n }\n calls.push({\n tool: toolName,\n tokens_used: validTokens,\n timestamp: Date.now()\n })\n totalTokensUsed += validTokens\n}\n\nexport function getTokenSummary(\n args: { context_window?: number } = {}\n): MCPResponse {\n const contextWindowInput = args.context_window || 128000\n const parsedWindow = Number(contextWindowInput)\n const contextWindow =\n isNaN(parsedWindow) || parsedWindow <= 0 || !isFinite(parsedWindow)\n ? 128000\n : parsedWindow\n\n const pct = Number(((totalTokensUsed / contextWindow) * 100).toFixed(4))\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n session_id: sessionId,\n calls,\n total_tokens_used: totalTokensUsed,\n estimated_context_pct: pct,\n tokens_used: 20\n })\n }\n ]\n }\n}\n"],"mappings":"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","names":["parse","id","parse","path","readFileSync","existsSync","fileURLToPath","__filename","fileURLToPath","__dirname","path","existsSync","readFileSync","readFileSync","existsSync","path","fileURLToPath","emmet","path","fileURLToPath","path2","path3","existsSync","readFileSync","top","emmet","readFileSync","existsSync","path","fileURLToPath","__filename","fileURLToPath","__dirname","path","existsSync","readFileSync","parse","siblings","sameTagSiblings","index","parse","z","schema","z","z","schema","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindfiredigital/ignix-lite-engine",
3
- "version": "1.4.2",
3
+ "version": "1.4.3",
4
4
  "description": "Core rules engine, validator, theming, and preview rendering for Ignix-Lite",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -26,8 +26,8 @@
26
26
  "typescript": "^5.4.5"
27
27
  },
28
28
  "scripts": {
29
- "build": "tsup && copyfiles -u 2 src/manifests/*.json dist/manifests && pnpm build:index",
29
+ "build": "tsup && copyfiles -u 2 src/manifests/*.json dist/manifests && copyfiles -f ../../api-full.txt dist && pnpm build:index",
30
30
  "build:index": "tsx src/tools/build-index.ts",
31
- "dev": "tsup --watch --onSuccess \"copyfiles -u 2 src/manifests/*.json dist/manifests && pnpm build:index\""
31
+ "dev": "tsup --watch --onSuccess \"copyfiles -u 2 src/manifests/*.json dist/manifests && copyfiles -f ../../api-full.txt dist && pnpm build:index\""
32
32
  }
33
33
  }
@@ -68,18 +68,20 @@ function parseIntents(raw: string): IntentEntry[] {
68
68
  return entries
69
69
  }
70
70
 
71
- // ---- Resolve the api-full.txt path relative to this package root ----
72
71
  function loadIntents(): IntentEntry[] {
73
72
  try {
74
73
  const currentDir = path.dirname(fileURLToPath(import.meta.url))
75
74
 
76
75
  // Try relative paths from current file structure (packages/mcp/src/utils/ or dist/utils/)
76
+ const pathDist = path.resolve(currentDir, './api-full.txt')
77
77
  const path1 = path.resolve(currentDir, '../../../api-full.txt')
78
78
  const path2 = path.resolve(currentDir, '../../api-full.txt')
79
79
  const path3 = path.resolve(currentDir, '../../../../api-full.txt')
80
80
 
81
- let txtPath = path1
82
- if (existsSync(path1)) {
81
+ let txtPath = pathDist
82
+ if (existsSync(pathDist)) {
83
+ txtPath = pathDist
84
+ } else if (existsSync(path1)) {
83
85
  txtPath = path1
84
86
  } else if (existsSync(path2)) {
85
87
  txtPath = path2