praxis-kit 4.0.3 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lit/index.js CHANGED
@@ -1,11 +1,16 @@
1
- // ../../adapters/lit/src/create-contract-component.ts
2
- import { LitElement, html } from "lit";
1
+ // ../../lib/adapter-utils/src/runtime/define-component.ts
2
+ function defineContractComponent(options) {
3
+ return (factory) => factory(options);
4
+ }
3
5
 
4
- // ../../lib/primitive/src/tag/resolve-tag.ts
5
- function makeResolveTag(defaultTag) {
6
- return function tag(as) {
7
- return as ?? defaultTag;
8
- };
6
+ // ../../lib/primitive/src/guards/foundational/is-defined.ts
7
+ function isUndefined(value) {
8
+ return value === void 0;
9
+ }
10
+
11
+ // ../../lib/primitive/src/guards/foundational/is-null.ts
12
+ function isNull(value) {
13
+ return value === null;
9
14
  }
10
15
 
11
16
  // ../../lib/primitive/src/utils/is-object.ts
@@ -20,195 +25,6 @@ function isNumber(value) {
20
25
  return typeof value === "number";
21
26
  }
22
27
 
23
- // ../../lib/primitive/src/utils/assert-never.ts
24
- function assertNever(value) {
25
- throw new Error(`Unexpected value: ${String(value)}`);
26
- }
27
-
28
- // ../../lib/primitive/src/utils/cn.ts
29
- import { clsx } from "clsx";
30
- function cn(...inputs) {
31
- return clsx(...inputs);
32
- }
33
-
34
- // ../../lib/primitive/src/utils/iterate.ts
35
- function find(iterable, callback) {
36
- for (const value of iterable) {
37
- const result = callback(value);
38
- if (result != null) {
39
- return result;
40
- }
41
- }
42
- return null;
43
- }
44
- function some(iterable, predicate) {
45
- for (const value of iterable) {
46
- if (predicate(value)) return true;
47
- }
48
- return false;
49
- }
50
- function every(iterable, predicate) {
51
- let index = 0;
52
- for (const value of iterable) {
53
- if (!predicate(value, index++)) {
54
- return false;
55
- }
56
- }
57
- return true;
58
- }
59
- function* filter(iterable, predicate) {
60
- let index = 0;
61
- for (const value of iterable) {
62
- if (predicate(value, index++)) {
63
- yield value;
64
- }
65
- }
66
- }
67
- function* map(iterable, callback) {
68
- let index = 0;
69
- for (const value of iterable) {
70
- yield callback(value, index++);
71
- }
72
- }
73
- function forEach(iterable, callback) {
74
- let index = 0;
75
- for (const value of iterable) {
76
- callback(value, index++);
77
- }
78
- }
79
- function reduce(iterable, initial, callback) {
80
- let accumulator = initial;
81
- let index = 0;
82
- for (const value of iterable) {
83
- accumulator = callback(accumulator, value, index++);
84
- }
85
- return accumulator;
86
- }
87
- function collect(iterable, callback) {
88
- const result = {};
89
- let index = 0;
90
- for (const value of iterable) {
91
- const entry = callback(value, index++);
92
- if (entry === null) {
93
- return null;
94
- }
95
- result[entry[0]] = entry[1];
96
- }
97
- return result;
98
- }
99
- function findLast(value, callback) {
100
- for (let index = value.length - 1; index >= 0; index--) {
101
- const result = callback(value[index], index);
102
- if (result != null) {
103
- return result;
104
- }
105
- }
106
- return null;
107
- }
108
- function* items(collection) {
109
- for (let i = 0; i < collection.length; i++) {
110
- const item = collection.item(i);
111
- if (item !== null) {
112
- yield item;
113
- }
114
- }
115
- }
116
- function nodeList(list) {
117
- return {
118
- *[Symbol.iterator]() {
119
- for (let i = 0; i < list.length; i++) {
120
- const node = list.item(i);
121
- if (node !== null) {
122
- yield node;
123
- }
124
- }
125
- }
126
- };
127
- }
128
- function mapEntries(m) {
129
- return m.entries();
130
- }
131
- function set(s) {
132
- return s.values();
133
- }
134
- function hasOwn(object, key) {
135
- return Object.hasOwn(object, key);
136
- }
137
- function* entries(object) {
138
- for (const key in object) {
139
- if (!hasOwn(object, key)) continue;
140
- yield [key, object[key]];
141
- }
142
- }
143
- function* keys(object) {
144
- for (const [key] of entries(object)) {
145
- yield key;
146
- }
147
- }
148
- function* values(object) {
149
- for (const [, value] of entries(object)) {
150
- yield value;
151
- }
152
- }
153
- function mapValues(object, callback) {
154
- const result = {};
155
- for (const [key, value] of entries(object)) {
156
- result[key] = callback(value, key);
157
- }
158
- return result;
159
- }
160
- function forEachEntry(object, callback) {
161
- for (const [key, value] of entries(object)) {
162
- callback(key, value);
163
- }
164
- }
165
- function forEachKey(object, callback) {
166
- for (const key of keys(object)) {
167
- callback(key);
168
- }
169
- }
170
- function forEachValue(object, callback) {
171
- for (const value of values(object)) {
172
- callback(value);
173
- }
174
- }
175
- function forEachSet(s, callback) {
176
- for (const value of s) {
177
- callback(value);
178
- }
179
- }
180
- var iterate = Object.freeze({
181
- entries,
182
- filter,
183
- find,
184
- findLast,
185
- forEach,
186
- forEachEntry,
187
- forEachKey,
188
- forEachSet,
189
- forEachValue,
190
- items,
191
- keys,
192
- map,
193
- mapEntries,
194
- mapValues,
195
- nodeList,
196
- reduce,
197
- collect,
198
- set,
199
- some,
200
- every,
201
- values
202
- });
203
-
204
- // ../../lib/primitive/src/utils/merge-props.ts
205
- function mergeProps(defaultProps, props) {
206
- return {
207
- ...defaultProps ?? {},
208
- ...props
209
- };
210
- }
211
-
212
28
  // ../../lib/primitive/src/constants/aria/global-aria-attributes.ts
213
29
  var GLOBAL_ARIA_ATTRIBUTES = /* @__PURE__ */ new Set([
214
30
  "aria-atomic",
@@ -231,7 +47,7 @@ var GLOBAL_ARIA_ATTRIBUTES = /* @__PURE__ */ new Set([
231
47
  ]);
232
48
 
233
49
  // ../../lib/primitive/src/constants/aria/implicit-role-record.ts
234
- var IMPLICIT_ROLE_RECORD = {
50
+ var IMPLICIT_ROLE_RECORD = Object.freeze({
235
51
  // Landmarks
236
52
  article: "article",
237
53
  aside: "complementary",
@@ -267,8 +83,8 @@ var IMPLICIT_ROLE_RECORD = {
267
83
  meter: "meter",
268
84
  output: "status",
269
85
  progress: "progressbar"
270
- };
271
- var INPUT_TYPE_ROLE_MAP = {
86
+ });
87
+ var INPUT_TYPE_ROLE_MAP = Object.freeze({
272
88
  checkbox: "checkbox",
273
89
  radio: "radio",
274
90
  range: "slider",
@@ -282,15 +98,17 @@ var INPUT_TYPE_ROLE_MAP = {
282
98
  submit: "button",
283
99
  reset: "button",
284
100
  image: "button"
285
- };
286
- var STRONG_ROLES = [
101
+ });
102
+ var STRONG_ROLES = Object.freeze([
287
103
  "main",
288
104
  "navigation",
289
105
  "complementary",
290
106
  "contentinfo",
291
107
  "banner"
292
- ];
293
- var STANDALONE_ROLES = ["article"];
108
+ ]);
109
+ var STANDALONE_ROLES = Object.freeze([
110
+ "article"
111
+ ]);
294
112
  var STRONG_ROLES_SET = new Set(STRONG_ROLES);
295
113
  var STANDALONE_ROLES_SET = new Set(STANDALONE_ROLES);
296
114
 
@@ -445,16 +263,6 @@ var ROLE_RESTRICTED_ATTRIBUTES = /* @__PURE__ */ new Map([
445
263
  ]
446
264
  ]);
447
265
 
448
- // ../../lib/primitive/src/guards/foundational/is-defined.ts
449
- function isUndefined(value) {
450
- return value === void 0;
451
- }
452
-
453
- // ../../lib/primitive/src/guards/foundational/is-null.ts
454
- function isNull(value) {
455
- return value === null;
456
- }
457
-
458
266
  // ../../lib/primitive/src/guards/aria/is-aria-attribute.ts
459
267
  function isGlobalAriaAttribute(attr) {
460
268
  return GLOBAL_ARIA_ATTRIBUTES.has(attr);
@@ -465,49 +273,270 @@ function isAriaAttributeValidForRole(attr, role) {
465
273
  if (isUndefined(role)) return false;
466
274
  return allowedRoles.has(role);
467
275
  }
468
-
469
- // ../../lib/primitive/src/guards/aria/is-aria-role.ts
470
- function isStrongImplicitRole(tag) {
471
- if (!(tag in IMPLICIT_ROLE_RECORD)) return false;
472
- return STRONG_ROLES_SET.has(IMPLICIT_ROLE_RECORD[tag]);
276
+
277
+ // ../../lib/primitive/src/guards/aria/is-aria-role.ts
278
+ function isStrongImplicitRole(tag) {
279
+ if (!(tag in IMPLICIT_ROLE_RECORD)) return false;
280
+ return STRONG_ROLES_SET.has(IMPLICIT_ROLE_RECORD[tag]);
281
+ }
282
+ function isStandaloneTag(tag) {
283
+ if (!(tag in IMPLICIT_ROLE_RECORD)) return false;
284
+ return STANDALONE_ROLES_SET.has(IMPLICIT_ROLE_RECORD[tag]);
285
+ }
286
+ function getInputImplicitRole(type) {
287
+ if (!isString(type) || !(type in INPUT_TYPE_ROLE_MAP)) return void 0;
288
+ return INPUT_TYPE_ROLE_MAP[type];
289
+ }
290
+ function getConditionalImplicitRole(tag, ariaLabel, ariaLabelledBy) {
291
+ const isNamed = isString(ariaLabel) || isString(ariaLabelledBy);
292
+ if (!isNamed) return void 0;
293
+ if (tag === "section") return "region";
294
+ if (tag === "form") return "form";
295
+ return void 0;
296
+ }
297
+
298
+ // ../../lib/contract/src/aria/aria-role-policy.ts
299
+ function getImplicitRole(tag, props) {
300
+ if (tag in IMPLICIT_ROLE_RECORD) return IMPLICIT_ROLE_RECORD[tag];
301
+ if (tag === "input") return getInputImplicitRole(props?.type);
302
+ if (tag === "img") return props?.alt === "" ? "none" : "img";
303
+ if (tag === "section" || tag === "form") {
304
+ return getConditionalImplicitRole(tag, props?.["aria-label"], props?.["aria-labelledby"]);
305
+ }
306
+ return void 0;
307
+ }
308
+
309
+ // ../../lib/primitive/src/tag/resolve-tag.ts
310
+ function makeResolveTag(defaultTag) {
311
+ return function tag(as) {
312
+ return as ?? defaultTag;
313
+ };
314
+ }
315
+
316
+ // ../../lib/primitive/src/utils/assert-never.ts
317
+ function assertNever(value) {
318
+ throw new Error(`Unexpected value: ${String(value)}`);
319
+ }
320
+
321
+ // ../../lib/primitive/src/utils/cn.ts
322
+ import { clsx } from "clsx";
323
+ function cn(...inputs) {
324
+ return clsx(...inputs);
325
+ }
326
+
327
+ // ../../lib/primitive/src/utils/iterate.ts
328
+ function find(iterable, callback) {
329
+ for (const value of iterable) {
330
+ const result = callback(value);
331
+ if (result != null) {
332
+ return result;
333
+ }
334
+ }
335
+ return null;
336
+ }
337
+ function some(iterable, predicate) {
338
+ for (const value of iterable) {
339
+ if (predicate(value)) return true;
340
+ }
341
+ return false;
342
+ }
343
+ function every(iterable, predicate) {
344
+ let index = 0;
345
+ for (const value of iterable) {
346
+ if (!predicate(value, index++)) {
347
+ return false;
348
+ }
349
+ }
350
+ return true;
351
+ }
352
+ function* filter(iterable, predicate) {
353
+ let index = 0;
354
+ for (const value of iterable) {
355
+ if (predicate(value, index++)) {
356
+ yield value;
357
+ }
358
+ }
359
+ }
360
+ function* map(iterable, callback) {
361
+ let index = 0;
362
+ for (const value of iterable) {
363
+ yield callback(value, index++);
364
+ }
365
+ }
366
+ function forEach(iterable, callback) {
367
+ let index = 0;
368
+ for (const value of iterable) {
369
+ callback(value, index++);
370
+ }
371
+ }
372
+ function reduce(iterable, initial, callback) {
373
+ let accumulator = initial;
374
+ let index = 0;
375
+ for (const value of iterable) {
376
+ accumulator = callback(accumulator, value, index++);
377
+ }
378
+ return accumulator;
379
+ }
380
+ function collect(iterable, callback) {
381
+ const result = {};
382
+ let index = 0;
383
+ for (const value of iterable) {
384
+ const entry = callback(value, index++);
385
+ if (entry === null) {
386
+ return null;
387
+ }
388
+ result[entry[0]] = entry[1];
389
+ }
390
+ return result;
391
+ }
392
+ function findLast(value, callback) {
393
+ for (let index = value.length - 1; index >= 0; index--) {
394
+ const result = callback(value[index], index);
395
+ if (result != null) {
396
+ return result;
397
+ }
398
+ }
399
+ return null;
400
+ }
401
+ function* items(collection) {
402
+ for (let i = 0; i < collection.length; i++) {
403
+ const item = collection.item(i);
404
+ if (item !== null) {
405
+ yield item;
406
+ }
407
+ }
408
+ }
409
+ function nodeList(list) {
410
+ return {
411
+ *[Symbol.iterator]() {
412
+ for (let i = 0; i < list.length; i++) {
413
+ const node = list.item(i);
414
+ if (node !== null) {
415
+ yield node;
416
+ }
417
+ }
418
+ }
419
+ };
420
+ }
421
+ function mapEntries(m) {
422
+ return m.entries();
423
+ }
424
+ function set(s) {
425
+ return s.values();
426
+ }
427
+ function hasOwn(object, key) {
428
+ return Object.hasOwn(object, key);
429
+ }
430
+ function* entries(object) {
431
+ for (const key in object) {
432
+ if (!hasOwn(object, key)) continue;
433
+ yield [key, object[key]];
434
+ }
435
+ }
436
+ function* keys(object) {
437
+ for (const [key] of entries(object)) {
438
+ yield key;
439
+ }
440
+ }
441
+ function* values(object) {
442
+ for (const [, value] of entries(object)) {
443
+ yield value;
444
+ }
445
+ }
446
+ function mapValues(object, callback) {
447
+ const result = {};
448
+ for (const [key, value] of entries(object)) {
449
+ result[key] = callback(value, key);
450
+ }
451
+ return result;
452
+ }
453
+ function forEachEntry(object, callback) {
454
+ for (const [key, value] of entries(object)) {
455
+ callback(key, value);
456
+ }
473
457
  }
474
- function isStandaloneTag(tag) {
475
- if (!(tag in IMPLICIT_ROLE_RECORD)) return false;
476
- return STANDALONE_ROLES_SET.has(IMPLICIT_ROLE_RECORD[tag]);
458
+ function forEachKey(object, callback) {
459
+ for (const key of keys(object)) {
460
+ callback(key);
461
+ }
477
462
  }
478
- function getInputImplicitRole(type) {
479
- if (type == null || !(type in INPUT_TYPE_ROLE_MAP)) return void 0;
480
- return INPUT_TYPE_ROLE_MAP[type];
463
+ function forEachValue(object, callback) {
464
+ for (const value of values(object)) {
465
+ callback(value);
466
+ }
481
467
  }
482
- function getConditionalImplicitRole(tag, ariaLabel, ariaLabelledBy) {
483
- const isNamed = typeof ariaLabel === "string" || typeof ariaLabelledBy === "string";
484
- if (!isNamed) return void 0;
485
- if (tag === "section") return "region";
486
- if (tag === "form") return "form";
487
- return void 0;
468
+ function forEachSet(s, callback) {
469
+ for (const value of s) {
470
+ callback(value);
471
+ }
488
472
  }
473
+ var iterate = Object.freeze({
474
+ entries,
475
+ filter,
476
+ find,
477
+ findLast,
478
+ forEach,
479
+ forEachEntry,
480
+ forEachKey,
481
+ forEachSet,
482
+ forEachValue,
483
+ items,
484
+ keys,
485
+ map,
486
+ mapEntries,
487
+ mapValues,
488
+ nodeList,
489
+ reduce,
490
+ collect,
491
+ set,
492
+ some,
493
+ every,
494
+ values
495
+ });
489
496
 
490
- // ../../lib/adapter-utils/src/apply-filter.ts
491
- function applyFilter(props, filterProps, variantKeys) {
492
- const out = {};
493
- iterate.forEachEntry(props, (k) => {
494
- if (!Object.hasOwn(props, k)) return;
495
- if (filterProps(k, variantKeys)) return;
496
- out[k] = props[k];
497
- });
498
- return out;
497
+ // ../../lib/primitive/src/utils/merge-props.ts
498
+ function mergeProps(defaultProps, props) {
499
+ return {
500
+ ...defaultProps ?? {},
501
+ ...props
502
+ };
499
503
  }
500
504
 
501
- // ../../lib/contract/src/aria/aria-role-policy.ts
502
- function getImplicitRole(tag, props) {
503
- if (tag in IMPLICIT_ROLE_RECORD) return IMPLICIT_ROLE_RECORD[tag];
504
- if (tag === "input") return getInputImplicitRole(props?.type);
505
- if (tag === "img") return props?.alt === "" ? "none" : "img";
506
- if (tag === "section" || tag === "form") {
507
- return getConditionalImplicitRole(tag, props?.["aria-label"], props?.["aria-labelledby"]);
505
+ // ../../lib/primitive/src/guards/children/component-id.ts
506
+ var COMPONENT_DEFAULT_TAG = /* @__PURE__ */ Symbol.for("praxis.component-default-tag");
507
+
508
+ // ../../lib/primitive/src/guards/children/is-tag.ts
509
+ function getAsProp(child) {
510
+ if (!isObject(child) || !("props" in child)) return void 0;
511
+ const props = child.props;
512
+ if (!isObject(props)) return void 0;
513
+ const as = props.as;
514
+ return isString(as) && as !== "" ? as : void 0;
515
+ }
516
+ function getTag(child) {
517
+ if (!isObject(child) || !("type" in child)) return void 0;
518
+ const t = child.type;
519
+ if (isString(t)) return t;
520
+ if (typeof t === "function" || isObject(t)) {
521
+ const defaultTag = t[COMPONENT_DEFAULT_TAG];
522
+ if (!isString(defaultTag)) return void 0;
523
+ return getAsProp(child) ?? defaultTag;
508
524
  }
509
525
  return void 0;
510
526
  }
527
+ function isTag(...args) {
528
+ if (isString(args[0])) {
529
+ const set3 = new Set(args);
530
+ return (child2) => {
531
+ const tag2 = getTag(child2);
532
+ return tag2 !== void 0 && set3.has(tag2);
533
+ };
534
+ }
535
+ const [child, ...tags] = args;
536
+ const set2 = new Set(tags);
537
+ const tag = getTag(child);
538
+ return tag !== void 0 && set2.has(tag);
539
+ }
511
540
 
512
541
  // ../../lib/contract/src/strict/invariant-base.ts
513
542
  var InvariantBase = class {
@@ -1518,7 +1547,7 @@ function getTypeName(value) {
1518
1547
  return primitive;
1519
1548
  }
1520
1549
  const name = value.constructor?.name;
1521
- return typeof name === "string" && name !== "Object" ? name : "object";
1550
+ return isString(name) && name !== "Object" ? name : "object";
1522
1551
  }
1523
1552
 
1524
1553
  // ../../lib/contract/src/children/normalize-child-rule.ts
@@ -1769,6 +1798,9 @@ var readonlyProps = ({
1769
1798
  };
1770
1799
  };
1771
1800
 
1801
+ // ../core/src/html/evaluators.ts
1802
+ import { warnDiagnostics as warnDiagnostics2 } from "../_shared/diagnostics.js";
1803
+
1772
1804
  // ../core/src/html/aria-rules.ts
1773
1805
  var LANDMARK_TAG_SET = /* @__PURE__ */ new Set(["article", "aside", "footer", "header", "main", "nav"]);
1774
1806
  var removeLandmarkRoleOverride = {
@@ -1811,6 +1843,167 @@ function landmarkNameAdvisory(ctx) {
1811
1843
  }
1812
1844
  var HTML_ARIA_RULES = [landmarkRoleRule, landmarkNameAdvisory];
1813
1845
 
1846
+ // ../core/src/html/contracts.ts
1847
+ import { warnDiagnostics } from "../_shared/diagnostics.js";
1848
+ function isOpenContent(...blockedTags) {
1849
+ const set2 = new Set(blockedTags);
1850
+ return (child) => isObject(child) && "type" in child && (!isString(child.type) || !set2.has(child.type));
1851
+ }
1852
+ var METADATA_TAGS = ["script", "template"];
1853
+ var metadataMatch = isTag(...METADATA_TAGS);
1854
+ function metadata(name = "metadata") {
1855
+ return { name, match: metadataMatch };
1856
+ }
1857
+ function firstOptional(name, tag) {
1858
+ return { name, match: isTag(tag), cardinality: { max: 1 }, position: "first" };
1859
+ }
1860
+ function contract(children) {
1861
+ return { diagnostics: warnDiagnostics, children };
1862
+ }
1863
+ function ariaContract(aria) {
1864
+ return { diagnostics: warnDiagnostics, aria };
1865
+ }
1866
+ function firstChildContract(name, tag) {
1867
+ return contract([firstOptional(name, tag), { name: "content", match: isOpenContent(tag) }]);
1868
+ }
1869
+ var VOID_TAGS = [
1870
+ "area",
1871
+ "base",
1872
+ "br",
1873
+ "col",
1874
+ "embed",
1875
+ "hr",
1876
+ "img",
1877
+ "input",
1878
+ "link",
1879
+ "meta",
1880
+ "param",
1881
+ "source",
1882
+ "track",
1883
+ "wbr"
1884
+ ];
1885
+ var TEXT_ONLY_TAGS = ["option", "script", "style", "textarea", "title"];
1886
+ var LANDMARK_TAGS = ["article", "aside", "footer", "header", "main", "nav"];
1887
+ var listContract = contract([{ name: "list-item", match: isTag("li", ...METADATA_TAGS) }]);
1888
+ var tableContract = contract([
1889
+ firstOptional("caption", "caption"),
1890
+ { name: "colgroup", match: isTag("colgroup") },
1891
+ { name: "thead", match: isTag("thead"), cardinality: { max: 1 } },
1892
+ { name: "tbody", match: isTag("tbody") },
1893
+ { name: "tfoot", match: isTag("tfoot"), cardinality: { max: 1 } },
1894
+ { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
1895
+ ]);
1896
+ var tableBodyContract = contract([
1897
+ { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
1898
+ ]);
1899
+ var tableRowContract = contract([
1900
+ { name: "table-cell", match: isTag("td", "th", ...METADATA_TAGS) }
1901
+ ]);
1902
+ var colgroupContract = contract([{ name: "column", match: isTag("col", "template") }]);
1903
+ var dlContract = contract([
1904
+ { name: "term", match: isTag("dt") },
1905
+ { name: "description", match: isTag("dd") },
1906
+ { name: "group", match: isTag("div") },
1907
+ metadata()
1908
+ ]);
1909
+ var selectContract = contract([
1910
+ { name: "option", match: isTag("option", "optgroup", "hr", ...METADATA_TAGS) }
1911
+ ]);
1912
+ var optgroupContract = contract([
1913
+ { name: "option", match: isTag("option", ...METADATA_TAGS) }
1914
+ ]);
1915
+ var datalistContract = contract([
1916
+ { name: "option", match: isTag("option", ...METADATA_TAGS) }
1917
+ ]);
1918
+ var pictureContract = contract([
1919
+ { name: "source", match: isTag("source", ...METADATA_TAGS) },
1920
+ { name: "image", match: isTag("img"), cardinality: { min: 1, max: 1 }, position: "last" }
1921
+ ]);
1922
+ var figureContract = contract([
1923
+ { name: "caption", match: isTag("figcaption"), cardinality: { max: 1 } },
1924
+ { name: "content", match: isOpenContent("figcaption") }
1925
+ ]);
1926
+ var detailsContract = firstChildContract("summary", "summary");
1927
+ var fieldsetContract = firstChildContract("legend", "legend");
1928
+ var mediaContract = contract([
1929
+ { name: "source", match: isTag("source") },
1930
+ { name: "track", match: isTag("track") },
1931
+ metadata(),
1932
+ { name: "content", match: isOpenContent("source", "track", ...METADATA_TAGS) }
1933
+ ]);
1934
+ var headContract = contract([
1935
+ {
1936
+ name: "metadata",
1937
+ match: isTag("base", "link", "meta", "noscript", "script", "style", "template", "title")
1938
+ }
1939
+ ]);
1940
+ var htmlContract = contract([
1941
+ { name: "head", match: isTag("head"), cardinality: { min: 1, max: 1 }, position: "first" },
1942
+ { name: "body", match: isTag("body"), cardinality: { min: 1, max: 1 } }
1943
+ ]);
1944
+ var voidContract = contract([]);
1945
+ var textOnlyContract = contract([
1946
+ {
1947
+ name: "text",
1948
+ match: (child) => isString(child) || isNumber(child)
1949
+ }
1950
+ ]);
1951
+ var landmarkContract = ariaContract([landmarkRoleRule, landmarkNameAdvisory]);
1952
+ var dialogContract = ariaContract([requireAccessibleName]);
1953
+ var menuContract = ariaContract([requireAccessibleName]);
1954
+ var menubarContract = ariaContract([requireAccessibleName]);
1955
+ var treeContract = ariaContract([requireAccessibleName]);
1956
+ var gridContract = ariaContract([requireAccessibleName]);
1957
+ var listboxContract = ariaContract([requireAccessibleName]);
1958
+ var tablistContract = ariaContract([requireAccessibleName]);
1959
+ var radiogroupContract = ariaContract([requireAccessibleName]);
1960
+ var CONTRACT_GROUPS = [
1961
+ [VOID_TAGS, voidContract],
1962
+ [TEXT_ONLY_TAGS, textOnlyContract],
1963
+ [LANDMARK_TAGS, landmarkContract],
1964
+ [["ul", "ol", "menu"], listContract],
1965
+ [["audio", "video"], mediaContract],
1966
+ [["thead", "tbody", "tfoot"], tableBodyContract]
1967
+ ];
1968
+ function contractMap(groups) {
1969
+ return Object.fromEntries(
1970
+ groups.flatMap(([tags, enforcement]) => tags.map((tag) => [tag, enforcement]))
1971
+ );
1972
+ }
1973
+ var htmlContracts = {
1974
+ ...contractMap(CONTRACT_GROUPS),
1975
+ table: tableContract,
1976
+ tr: tableRowContract,
1977
+ colgroup: colgroupContract,
1978
+ dl: dlContract,
1979
+ select: selectContract,
1980
+ optgroup: optgroupContract,
1981
+ datalist: datalistContract,
1982
+ picture: pictureContract,
1983
+ figure: figureContract,
1984
+ details: detailsContract,
1985
+ fieldset: fieldsetContract,
1986
+ dialog: dialogContract,
1987
+ head: headContract,
1988
+ html: htmlContract
1989
+ };
1990
+
1991
+ // ../core/src/html/evaluators.ts
1992
+ var htmlDiagnostics = warnDiagnostics2;
1993
+ function buildEvaluatorMap() {
1994
+ const map2 = /* @__PURE__ */ new Map();
1995
+ iterate.forEachEntry(htmlContracts, (tag, { children }) => {
1996
+ if (children?.length) {
1997
+ map2.set(tag, new ChildrenEvaluator(children, htmlDiagnostics, `<${tag}>`));
1998
+ }
1999
+ });
2000
+ return map2;
2001
+ }
2002
+ var HTML_EVALUATORS = buildEvaluatorMap();
2003
+ function getHtmlChildrenEvaluator(tag) {
2004
+ return typeof tag === "string" ? HTML_EVALUATORS.get(tag) : void 0;
2005
+ }
2006
+
1814
2007
  // ../core/src/html/prop-normalizers.ts
1815
2008
  var HTML_FORM_NORMALIZERS = /* @__PURE__ */ new Map([
1816
2009
  ["button", [disabledProps]],
@@ -1998,6 +2191,19 @@ function createClassPipeline(resolved) {
1998
2191
  };
1999
2192
  }
2000
2193
 
2194
+ // ../../lib/pipeline-kit/src/factory/define-pipeline.ts
2195
+ function definePipeline(factory) {
2196
+ const cache = /* @__PURE__ */ new WeakMap();
2197
+ return (resolved) => {
2198
+ let pipeline = cache.get(resolved);
2199
+ if (!pipeline) {
2200
+ pipeline = factory(resolved);
2201
+ cache.set(resolved, pipeline);
2202
+ }
2203
+ return pipeline;
2204
+ };
2205
+ }
2206
+
2001
2207
  // ../core/src/options/resolve-factory-options.ts
2002
2208
  import { silentDiagnostics } from "../_shared/diagnostics.js";
2003
2209
  var EMPTY_VARIANT_KEYS = /* @__PURE__ */ new Set();
@@ -2133,89 +2339,82 @@ function guardPipeline(pipeline) {
2133
2339
  };
2134
2340
  }
2135
2341
 
2136
- // ../core/src/factory/create-polymorphic.ts
2137
- var NOOP_CLASS_PIPELINE = (_tag, _props, className) => Array.isArray(className) ? className.join(" ") : className ?? "";
2138
- function resolveClassPipeline(options, resolved, diagnostics, capabilities) {
2139
- const factory = options.styling?.plugin;
2140
- if (!factory) {
2141
- const createClassPipeline2 = capabilities?.createClassPipeline;
2142
- const classPipeline2 = createClassPipeline2 ? createClassPipeline2(resolved) : NOOP_CLASS_PIPELINE;
2143
- return { pluginResult: void 0, classPipeline: classPipeline2 };
2144
- }
2342
+ // ../core/src/factory/create-polymorphic2.ts
2343
+ var createTagPipeline = (resolved) => makeResolveTag(resolved.defaultTag);
2344
+ var createPropsPipeline = (resolved) => (props) => mergeProps(resolved.defaultProps, props);
2345
+ var createHtmlPropNormalizersPipeline = () => getHtmlPropNormalizers;
2346
+ var createHtmlChildrenEvaluatorPipeline = () => getHtmlChildrenEvaluator;
2347
+ var createStylingClassPipeline = (resolved) => createClassPipeline(resolved);
2348
+ function resolveAriaRules(resolved) {
2349
+ return [.../* @__PURE__ */ new Set([...HTML_ARIA_RULES, ...resolved.ariaRules ?? []])];
2350
+ }
2351
+ var createAriaPipeline = (resolved) => {
2352
+ const rules = resolveAriaRules(resolved);
2353
+ const engine = new AriaPolicyEngine(resolved.diagnostics, rules.length ? { rules } : void 0);
2354
+ return (tag, props) => engine.validate(tag, props);
2355
+ };
2356
+ var memoizedTagPipeline = definePipeline(createTagPipeline);
2357
+ var memoizedPropsPipeline = definePipeline(createPropsPipeline);
2358
+ var memoizedHtmlPropNormalizersPipeline = definePipeline(createHtmlPropNormalizersPipeline);
2359
+ var memoizedHtmlChildrenEvaluatorPipeline = definePipeline(createHtmlChildrenEvaluatorPipeline);
2360
+ var memoizedClassPipeline = definePipeline(createStylingClassPipeline);
2361
+ var memoizedAriaPipeline = definePipeline(createAriaPipeline);
2362
+ function resolveAriaPassthrough(_tag, props) {
2363
+ return { props };
2364
+ }
2365
+ function resolveClassPlugin(factory, resolved, diagnostics) {
2366
+ if (!factory) return { pluginResult: void 0, classPipeline: memoizedClassPipeline(resolved) };
2145
2367
  const pluginResult = factory(resolved, diagnostics);
2146
2368
  assertPluginShape(pluginResult);
2147
- const classPipeline = guardPipeline(pluginResult.pipeline);
2148
- return { pluginResult, classPipeline };
2369
+ return { pluginResult, classPipeline: guardPipeline(pluginResult.pipeline) };
2149
2370
  }
2150
- function createRuntimeMethods(resolved, classPipeline, engine, renderDiagnostics) {
2151
- return {
2152
- resolveTag: makeResolveTag(resolved.defaultTag),
2153
- resolveProps(props) {
2154
- return mergeProps(resolved.defaultProps, props);
2155
- },
2371
+ function createPolymorphic2(options = {}) {
2372
+ const baseResolved = resolveFactoryOptions(options);
2373
+ const anyBaseResolved = baseResolved;
2374
+ const resolved = Object.freeze({
2375
+ ...baseResolved,
2376
+ htmlPropNormalizersFn: memoizedHtmlPropNormalizersPipeline(anyBaseResolved),
2377
+ htmlChildrenEvaluatorFn: memoizedHtmlChildrenEvaluatorPipeline(anyBaseResolved)
2378
+ });
2379
+ const anyResolved = resolved;
2380
+ if (process.env.NODE_ENV !== "production") {
2381
+ validateFactoryOptions(resolved, resolved.diagnostics);
2382
+ }
2383
+ const { pluginResult, classPipeline } = resolveClassPlugin(
2384
+ options.styling?.plugin,
2385
+ anyResolved,
2386
+ resolved.diagnostics
2387
+ );
2388
+ const resolveTag2 = memoizedTagPipeline(anyResolved);
2389
+ const resolveProps = memoizedPropsPipeline(anyResolved);
2390
+ const resolveAriaFn = options.enforcement !== void 0 ? memoizedAriaPipeline(anyResolved) : resolveAriaPassthrough;
2391
+ const methods = {
2392
+ resolveTag: resolveTag2,
2393
+ resolveProps,
2156
2394
  resolveClasses(tag, props, className, recipe) {
2157
2395
  if (process.env.NODE_ENV !== "production") {
2158
- validateRenderProps(renderDiagnostics, resolved, props, recipe);
2396
+ validateRenderProps(resolved.diagnostics, resolved, props, recipe);
2159
2397
  }
2160
2398
  return classPipeline(tag, props, className, recipe);
2161
2399
  },
2162
2400
  resolveAria(tag, props) {
2163
- if (!engine) return { props };
2164
- const result = engine.validate(tag, props);
2165
- return { props: result.props };
2401
+ return resolveAriaFn(tag, props);
2166
2402
  }
2167
2403
  };
2168
- }
2169
- function createRuntimeObject(methods, resolved, pluginResult) {
2170
- return pluginResult ? { ...methods, options: resolved, hasStyling: true, classPlugin: pluginResult } : { ...methods, options: resolved };
2171
- }
2172
- function createPolymorphic(options = {}, capabilities) {
2173
- const baseResolved = resolveFactoryOptions(options);
2174
- const resolved = capabilities?.htmlPropNormalizersFn !== void 0 ? Object.freeze({
2175
- ...baseResolved,
2176
- htmlPropNormalizersFn: capabilities.htmlPropNormalizersFn
2177
- }) : baseResolved;
2178
- if (process.env.NODE_ENV !== "production") {
2179
- validateFactoryOptions(resolved, resolved.diagnostics);
2180
- }
2181
- const { pluginResult, classPipeline } = resolveClassPipeline(
2182
- options,
2183
- resolved,
2184
- resolved.diagnostics,
2185
- capabilities
2186
- );
2187
- const allAriaRules = [
2188
- .../* @__PURE__ */ new Set([...capabilities?.htmlAriaRules ?? [], ...resolved.ariaRules ?? []])
2189
- ];
2190
- const engine = options.enforcement !== void 0 && capabilities?.AriaEngine ? new capabilities.AriaEngine(
2191
- resolved.diagnostics,
2192
- allAriaRules.length ? { rules: allAriaRules } : void 0
2193
- ) : null;
2194
- const methods = createRuntimeMethods(resolved, classPipeline, engine, resolved.diagnostics);
2195
- return createRuntimeObject(
2196
- methods,
2197
- resolved,
2198
- pluginResult
2199
- );
2200
- }
2201
-
2202
- // ../core/src/factory/create-polymorphic-full.ts
2203
- var FULL_CAPABILITIES = {
2204
- createClassPipeline,
2205
- AriaEngine: AriaPolicyEngine,
2206
- htmlAriaRules: HTML_ARIA_RULES,
2207
- htmlPropNormalizersFn: getHtmlPropNormalizers
2208
- };
2209
- function createPolymorphic2(options = {}) {
2210
- return createPolymorphic(options, FULL_CAPABILITIES);
2404
+ const runtimeObject = pluginResult ? { ...methods, options: resolved, hasStyling: true, classPlugin: pluginResult } : { ...methods, options: resolved };
2405
+ return runtimeObject;
2211
2406
  }
2212
2407
 
2213
- // ../../lib/adapter-utils/src/define-component.ts
2214
- function defineContractComponent(options) {
2215
- return (factory) => factory(options);
2408
+ // ../core/src/resolver/resolver.ts
2409
+ import { silentDiagnostics as silentDiagnostics2 } from "../_shared/diagnostics.js";
2410
+ function enforceAllowedAs(tag, allowedAs, diagnostics, displayName) {
2411
+ if (allowedAs.includes(tag)) return;
2412
+ if (!diagnostics) return;
2413
+ const component = displayName ?? String(tag);
2414
+ diagnostics.error(ContractDiagnostics.allowedAsViolation(String(tag), allowedAs, component));
2216
2415
  }
2217
2416
 
2218
- // ../../lib/adapter-utils/src/build-core-runtime.ts
2417
+ // ../../lib/adapter-utils/src/runtime/build-core-runtime.ts
2219
2418
  var EMPTY_SET = /* @__PURE__ */ new Set();
2220
2419
  function buildCoreRuntime(normalized) {
2221
2420
  const runtime = createPolymorphic2(normalized);
@@ -2223,22 +2422,13 @@ function buildCoreRuntime(normalized) {
2223
2422
  return { runtime, ownedKeys };
2224
2423
  }
2225
2424
 
2226
- // ../../lib/adapter-utils/src/build-engines.ts
2425
+ // ../../lib/adapter-utils/src/runtime/build-engines.ts
2227
2426
  function buildEngines(diagnostics, childRules, context) {
2228
2427
  return childRules?.length ? { childrenEvaluator: new ChildrenEvaluator(childRules, diagnostics, context) } : {};
2229
2428
  }
2230
2429
 
2231
- // ../../lib/adapter-utils/src/compose-filter.ts
2232
- function composeFilter(ownedKeys, filterProps) {
2233
- const defaultFilter = (key, variantKeys) => variantKeys.has(key) || ownedKeys.has(key);
2234
- if (!filterProps) {
2235
- return defaultFilter;
2236
- }
2237
- return (key, variantKeys) => defaultFilter(key, variantKeys) || filterProps(key, variantKeys);
2238
- }
2239
-
2240
- // ../../lib/adapter-utils/src/resolve-adapter-common-options.ts
2241
- import { throwDiagnostics as throwDiagnostics2, silentDiagnostics as silentDiagnostics2 } from "../_shared/diagnostics.js";
2430
+ // ../../lib/adapter-utils/src/runtime/resolve-adapter-common-options.ts
2431
+ import { throwDiagnostics as throwDiagnostics2, silentDiagnostics as silentDiagnostics3 } from "../_shared/diagnostics.js";
2242
2432
  function resolveAdapterCommonOptions(options, defaultName = "PolymorphicComponent", defaultDiagnostics = throwDiagnostics2) {
2243
2433
  return {
2244
2434
  name: options.name ?? defaultName,
@@ -2246,36 +2436,27 @@ function resolveAdapterCommonOptions(options, defaultName = "PolymorphicComponen
2246
2436
  };
2247
2437
  }
2248
2438
 
2249
- // ../../adapters/lit/src/build-runtime.ts
2250
- import { silentDiagnostics as silentDiagnostics3 } from "../_shared/diagnostics.js";
2251
- function normalizeOptions(options) {
2252
- return {
2253
- ...options,
2254
- ...resolveAdapterCommonOptions(options, "PolymorphicElement", silentDiagnostics3)
2255
- };
2256
- }
2257
- function buildRuntime(options) {
2258
- const { filterProps: customFilter, enforcement } = options;
2259
- const normalized = normalizeOptions(options);
2260
- const { runtime, ownedKeys } = buildCoreRuntime(normalized);
2261
- const { childrenEvaluator } = buildEngines(
2262
- normalized.diagnostics,
2263
- enforcement?.children,
2264
- normalized.name
2265
- );
2266
- const filterProps = composeFilter(ownedKeys, customFilter);
2267
- return {
2268
- runtime,
2269
- filterProps,
2270
- ...childrenEvaluator !== void 0 && { childrenEvaluator }
2271
- };
2439
+ // ../../lib/adapter-utils/src/props/apply-filter.ts
2440
+ function applyFilter(props, filterProps, variantKeys) {
2441
+ const out = {};
2442
+ iterate.forEachEntry(props, (k) => {
2443
+ if (!Object.hasOwn(props, k)) return;
2444
+ if (filterProps(k, variantKeys)) return;
2445
+ out[k] = props[k];
2446
+ });
2447
+ return out;
2272
2448
  }
2273
2449
 
2274
- // ../../adapters/lit/src/render-to-string.ts
2275
- var ssrRegistry = /* @__PURE__ */ new WeakMap();
2276
- function registerForSsr(cls, bundle) {
2277
- ssrRegistry.set(cls, { bundle });
2450
+ // ../../lib/adapter-utils/src/props/compose-filter.ts
2451
+ function composeFilter(ownedKeys, filterProps) {
2452
+ const defaultFilter = (key, variantKeys) => variantKeys.has(key) || ownedKeys.has(key);
2453
+ if (!filterProps) {
2454
+ return defaultFilter;
2455
+ }
2456
+ return (key, variantKeys) => defaultFilter(key, variantKeys) || filterProps(key, variantKeys);
2278
2457
  }
2458
+
2459
+ // ../../lib/adapter-utils/src/render/render-to-string.ts
2279
2460
  function escapeAttr(value) {
2280
2461
  return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
2281
2462
  }
@@ -2289,51 +2470,51 @@ function buildAttrString(attributes) {
2289
2470
  parts.push(`${key}="${escapeAttr(String(value))}"`);
2290
2471
  }
2291
2472
  });
2292
- return parts.length > 0 ? " " + parts.join(" ") : "";
2473
+ return parts.length > 0 ? ` ${parts.join(" ")}` : "";
2293
2474
  }
2294
- function renderToString(component, props = {}, innerHTML = "") {
2295
- const entry = ssrRegistry.get(component);
2296
- if (!entry) {
2297
- const name = component.name ?? "AnonymousComponent";
2298
- throw new Error(
2299
- `[renderToString] ${name} was not registered for SSR. Ensure it was created with createContractComponent from @praxis-kit/lit.`
2300
- );
2301
- }
2302
- const { bundle } = entry;
2475
+ function renderBundleToString(bundle, props = {}, innerHTML = "") {
2476
+ const {
2477
+ filterProps,
2478
+ runtime: { options, resolveAria, resolveClasses, resolveProps, resolveTag: resolveTag2 }
2479
+ } = bundle;
2303
2480
  const { as, className, recipe, class: classAttr, ...rest } = props;
2304
- const tag = bundle.runtime.resolveTag(as);
2305
- const mergedProps = bundle.runtime.resolveProps(rest);
2306
- const resolvedClass = bundle.runtime.resolveClasses(
2481
+ const tag = resolveTag2(as);
2482
+ if (options.allowedAs !== void 0) {
2483
+ enforceAllowedAs(tag, options.allowedAs, options.diagnostics, options.displayName);
2484
+ }
2485
+ const mergedProps = resolveProps(rest);
2486
+ const normalizedProps = typeof options.normalizeFn === "function" ? options.normalizeFn(mergedProps) : mergedProps;
2487
+ const htmlNormalizers = options.htmlPropNormalizersFn?.(tag);
2488
+ const finalProps = { ...normalizedProps };
2489
+ if (htmlNormalizers) {
2490
+ for (const normalize of htmlNormalizers) {
2491
+ Object.assign(finalProps, normalize(finalProps));
2492
+ }
2493
+ }
2494
+ const resolvedClass = resolveClasses(
2307
2495
  tag,
2308
- mergedProps,
2496
+ finalProps,
2309
2497
  // Accept both React-style className and HTML-native class
2310
2498
  className ?? classAttr,
2311
2499
  recipe
2312
2500
  );
2313
- const ariaResult = bundle.runtime.resolveAria(tag, mergedProps);
2314
- const filtered = applyFilter(
2315
- ariaResult.props,
2316
- bundle.filterProps,
2317
- bundle.runtime.options.variantKeys
2318
- );
2501
+ const ariaResult = resolveAria(tag, finalProps);
2502
+ const filtered = applyFilter(ariaResult.props, filterProps, options.variantKeys);
2319
2503
  const attrs = { ...filtered, class: resolvedClass || void 0 };
2320
2504
  const attrStr = buildAttrString(attrs);
2321
2505
  return `<${tag}${attrStr}>${innerHTML}</${tag}>`;
2322
2506
  }
2323
2507
 
2324
- // ../../adapters/lit/src/create-contract-component.ts
2325
- function isObject2(value) {
2326
- return typeof value === "object" && value !== null;
2327
- }
2508
+ // ../../lib/adapter-utils/src/render/host-state.ts
2328
2509
  function isLooseBundle(arg) {
2329
- if (!isObject2(arg)) return false;
2510
+ if (!isObject(arg)) return false;
2330
2511
  const { runtime, filterProps, childrenEvaluator } = arg;
2331
- if (!isObject2(runtime)) return false;
2332
- if (!isObject2(runtime["options"])) return false;
2512
+ if (!isObject(runtime)) return false;
2513
+ if (!isObject(runtime["options"])) return false;
2333
2514
  if (typeof runtime["resolveTag"] !== "function" || typeof runtime["resolveProps"] !== "function" || typeof runtime["resolveClasses"] !== "function" || typeof runtime["resolveAria"] !== "function")
2334
2515
  return false;
2335
2516
  if (typeof filterProps !== "function") return false;
2336
- if (childrenEvaluator !== void 0 && (!isObject2(childrenEvaluator) || typeof childrenEvaluator["evaluate"] !== "function"))
2517
+ if (childrenEvaluator !== void 0 && (!isObject(childrenEvaluator) || typeof childrenEvaluator["evaluate"] !== "function"))
2337
2518
  return false;
2338
2519
  return true;
2339
2520
  }
@@ -2345,41 +2526,46 @@ function toLooseBundle(bundle) {
2345
2526
  }
2346
2527
  function resolveHostState(bundle, props) {
2347
2528
  const { as, className, recipe, ...rest } = props;
2348
- const tag = bundle.runtime.resolveTag(as);
2349
- const mergedProps = bundle.runtime.resolveProps(rest);
2350
- const baseProps = bundle.runtime.options.normalizeFn ? bundle.runtime.options.normalizeFn(mergedProps) : mergedProps;
2351
- const htmlNormalizers = bundle.runtime.options.htmlPropNormalizersFn?.(tag);
2352
- const normalizedProps = htmlNormalizers?.length ? htmlNormalizers.reduce((acc, fn) => ({ ...acc, ...fn(acc) }), baseProps) : baseProps;
2353
- const resolvedClass = bundle.runtime.resolveClasses(
2529
+ const { options, resolveAria, resolveClasses, resolveProps, resolveTag: resolveTag2 } = bundle.runtime;
2530
+ const tag = resolveTag2(as);
2531
+ if (options.allowedAs !== void 0) {
2532
+ enforceAllowedAs(tag, options.allowedAs, options.diagnostics, options.displayName);
2533
+ }
2534
+ const mergedProps = resolveProps(rest);
2535
+ const normalizedProps = typeof options.normalizeFn === "function" ? options.normalizeFn(mergedProps) : mergedProps;
2536
+ const htmlNormalizers = options.htmlPropNormalizersFn?.(tag);
2537
+ const finalProps = { ...normalizedProps };
2538
+ if (htmlNormalizers) {
2539
+ for (const normalize of htmlNormalizers) {
2540
+ Object.assign(finalProps, normalize(finalProps));
2541
+ }
2542
+ }
2543
+ const resolvedClass = resolveClasses(
2354
2544
  tag,
2355
- normalizedProps,
2545
+ finalProps,
2356
2546
  className,
2357
2547
  recipe
2358
2548
  );
2359
- const ariaResult = bundle.runtime.resolveAria(tag, normalizedProps);
2360
- const attributes = applyFilter(
2361
- ariaResult.props,
2362
- bundle.filterProps,
2363
- bundle.runtime.options.variantKeys
2364
- );
2549
+ const ariaResult = resolveAria(tag, finalProps);
2550
+ const attributes = applyFilter(ariaResult.props, bundle.filterProps, options.variantKeys);
2365
2551
  return { className: resolvedClass, attributes };
2366
2552
  }
2367
- function applyHostState(host, state, prevPipelineAttrs, incomingProps) {
2553
+ function diffAndApplyAttributes(host, state, prevPipelineAttrs, incomingProps) {
2554
+ const hasOwn2 = Object.hasOwn;
2555
+ const attrs = state.attributes;
2368
2556
  host.className = state.className;
2369
- iterate.forEachSet(prevPipelineAttrs, (key) => {
2370
- if (!Object.hasOwn(state.attributes, key)) {
2371
- host.removeAttribute(key);
2372
- }
2373
- });
2557
+ for (const key of prevPipelineAttrs) {
2558
+ if (!hasOwn2(attrs, key)) host.removeAttribute(key);
2559
+ }
2374
2560
  prevPipelineAttrs.clear();
2375
- iterate.forEachKey(incomingProps, (key) => {
2376
- if (!Object.hasOwn(incomingProps, key)) return;
2377
- if (!key.startsWith("aria-") && key !== "role") return;
2378
- if (!Object.hasOwn(state.attributes, key)) host.removeAttribute(key);
2379
- });
2380
- iterate.forEachKey(state.attributes, (key) => {
2381
- if (!Object.hasOwn(state.attributes, key)) return;
2382
- const value = state.attributes[key];
2561
+ for (const key in incomingProps) {
2562
+ if (!hasOwn2(incomingProps, key)) continue;
2563
+ if (!key.startsWith("aria-") && key !== "role") continue;
2564
+ if (!hasOwn2(attrs, key)) host.removeAttribute(key);
2565
+ }
2566
+ for (const key in attrs) {
2567
+ if (!hasOwn2(attrs, key)) continue;
2568
+ const value = attrs[key];
2383
2569
  if (value === void 0 || value === null || value === false) {
2384
2570
  host.removeAttribute(key);
2385
2571
  } else if (value === true) {
@@ -2389,8 +2575,54 @@ function applyHostState(host, state, prevPipelineAttrs, incomingProps) {
2389
2575
  host.setAttribute(key, String(value));
2390
2576
  prevPipelineAttrs.add(key);
2391
2577
  }
2392
- });
2578
+ }
2579
+ }
2580
+
2581
+ // ../../adapters/lit/src/create-contract-component.ts
2582
+ import { LitElement, html } from "lit";
2583
+
2584
+ // ../../adapters/lit/src/build-runtime.ts
2585
+ import { silentDiagnostics as silentDiagnostics4 } from "../_shared/diagnostics.js";
2586
+ function normalizeOptions(options) {
2587
+ return {
2588
+ ...options,
2589
+ ...resolveAdapterCommonOptions(options, "PolymorphicElement", silentDiagnostics4)
2590
+ };
2591
+ }
2592
+ function buildRuntime(options) {
2593
+ const { filterProps: customFilter, enforcement } = options;
2594
+ const normalized = normalizeOptions(options);
2595
+ const { runtime, ownedKeys } = buildCoreRuntime(normalized);
2596
+ const { childrenEvaluator } = buildEngines(
2597
+ normalized.diagnostics,
2598
+ enforcement?.children,
2599
+ normalized.name
2600
+ );
2601
+ const filterProps = composeFilter(ownedKeys, customFilter);
2602
+ return {
2603
+ runtime,
2604
+ filterProps,
2605
+ ...childrenEvaluator !== void 0 && { childrenEvaluator }
2606
+ };
2607
+ }
2608
+
2609
+ // ../../adapters/lit/src/render-to-string.ts
2610
+ var ssrRegistry = /* @__PURE__ */ new WeakMap();
2611
+ function registerForSsr(cls, bundle) {
2612
+ ssrRegistry.set(cls, { bundle });
2613
+ }
2614
+ function renderToString(component, props = {}, innerHTML = "") {
2615
+ const entry = ssrRegistry.get(component);
2616
+ if (!entry) {
2617
+ const name = component.name ?? "AnonymousComponent";
2618
+ throw new Error(
2619
+ `[renderToString] ${name} was not registered for SSR. Ensure it was created with createContractComponent from @praxis-kit/lit.`
2620
+ );
2621
+ }
2622
+ return renderBundleToString(entry.bundle, props, innerHTML);
2393
2623
  }
2624
+
2625
+ // ../../adapters/lit/src/create-contract-component.ts
2394
2626
  function createContractComponent(options) {
2395
2627
  const bundle = buildRuntime(options);
2396
2628
  const looseBundle = toLooseBundle(bundle);
@@ -2458,7 +2690,8 @@ function createContractComponent(options) {
2458
2690
  const self = this._self;
2459
2691
  const props = {};
2460
2692
  iterate.forEach(iterate.items(this.attributes), (attr) => {
2461
- if (attr.name !== "class") props[attr.name] = attr.value;
2693
+ if (attr.name === "class") return;
2694
+ props[attr.name] = attr.name === "disabled" ? true : attr.value;
2462
2695
  });
2463
2696
  props["as"] = self.as;
2464
2697
  props["recipe"] = self.recipe;
@@ -2467,12 +2700,15 @@ function createContractComponent(options) {
2467
2700
  const val = self[key];
2468
2701
  if (val != null) props[key] = val;
2469
2702
  });
2470
- applyHostState(this, resolveHostState(looseBundle, props), this._pipelineAttrs, props);
2703
+ diffAndApplyAttributes(this, resolveHostState(looseBundle, props), this._pipelineAttrs, props);
2471
2704
  }
2472
2705
  render() {
2706
+ const children = Array.from(this.childNodes);
2473
2707
  if (bundle.childrenEvaluator) {
2474
- bundle.childrenEvaluator.evaluate(Array.from(this.childNodes));
2708
+ bundle.childrenEvaluator.evaluate(children);
2475
2709
  }
2710
+ const tag = bundle.runtime.resolveTag(this._self.as);
2711
+ bundle.runtime.options.htmlChildrenEvaluatorFn?.(tag)?.evaluate(children);
2476
2712
  return html`<slot></slot>`;
2477
2713
  }
2478
2714
  }