praxis-kit 4.0.3 → 4.1.1

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,171 @@ 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) => {
1851
+ if (!isObject(child) || !("type" in child)) return false;
1852
+ const tag = getTag(child);
1853
+ return tag === void 0 || !set2.has(tag);
1854
+ };
1855
+ }
1856
+ var METADATA_TAGS = ["script", "template"];
1857
+ var metadataMatch = isTag(...METADATA_TAGS);
1858
+ function metadata(name = "metadata") {
1859
+ return { name, match: metadataMatch };
1860
+ }
1861
+ function firstOptional(name, tag) {
1862
+ return { name, match: isTag(tag), cardinality: { max: 1 }, position: "first" };
1863
+ }
1864
+ function contract(children) {
1865
+ return { diagnostics: warnDiagnostics, children };
1866
+ }
1867
+ function ariaContract(aria) {
1868
+ return { diagnostics: warnDiagnostics, aria };
1869
+ }
1870
+ function firstChildContract(name, tag) {
1871
+ return contract([firstOptional(name, tag), { name: "content", match: isOpenContent(tag) }]);
1872
+ }
1873
+ var VOID_TAGS = [
1874
+ "area",
1875
+ "base",
1876
+ "br",
1877
+ "col",
1878
+ "embed",
1879
+ "hr",
1880
+ "img",
1881
+ "input",
1882
+ "link",
1883
+ "meta",
1884
+ "param",
1885
+ "source",
1886
+ "track",
1887
+ "wbr"
1888
+ ];
1889
+ var TEXT_ONLY_TAGS = ["option", "script", "style", "textarea", "title"];
1890
+ var LANDMARK_TAGS = ["article", "aside", "footer", "header", "main", "nav"];
1891
+ var listContract = contract([{ name: "list-item", match: isTag("li", ...METADATA_TAGS) }]);
1892
+ var tableContract = contract([
1893
+ firstOptional("caption", "caption"),
1894
+ { name: "colgroup", match: isTag("colgroup") },
1895
+ { name: "thead", match: isTag("thead"), cardinality: { max: 1 } },
1896
+ { name: "tbody", match: isTag("tbody") },
1897
+ { name: "tfoot", match: isTag("tfoot"), cardinality: { max: 1 } },
1898
+ { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
1899
+ ]);
1900
+ var tableBodyContract = contract([
1901
+ { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
1902
+ ]);
1903
+ var tableRowContract = contract([
1904
+ { name: "table-cell", match: isTag("td", "th", ...METADATA_TAGS) }
1905
+ ]);
1906
+ var colgroupContract = contract([{ name: "column", match: isTag("col", "template") }]);
1907
+ var dlContract = contract([
1908
+ { name: "term", match: isTag("dt") },
1909
+ { name: "description", match: isTag("dd") },
1910
+ { name: "group", match: isTag("div") },
1911
+ metadata()
1912
+ ]);
1913
+ var selectContract = contract([
1914
+ { name: "option", match: isTag("option", "optgroup", "hr", ...METADATA_TAGS) }
1915
+ ]);
1916
+ var optgroupContract = contract([
1917
+ { name: "option", match: isTag("option", ...METADATA_TAGS) }
1918
+ ]);
1919
+ var datalistContract = contract([
1920
+ { name: "option", match: isTag("option", ...METADATA_TAGS) }
1921
+ ]);
1922
+ var pictureContract = contract([
1923
+ { name: "source", match: isTag("source", ...METADATA_TAGS) },
1924
+ { name: "image", match: isTag("img"), cardinality: { min: 1, max: 1 }, position: "last" }
1925
+ ]);
1926
+ var figureContract = contract([
1927
+ { name: "caption", match: isTag("figcaption"), cardinality: { max: 1 } },
1928
+ { name: "content", match: isOpenContent("figcaption") }
1929
+ ]);
1930
+ var detailsContract = firstChildContract("summary", "summary");
1931
+ var fieldsetContract = firstChildContract("legend", "legend");
1932
+ var mediaContract = contract([
1933
+ { name: "source", match: isTag("source") },
1934
+ { name: "track", match: isTag("track") },
1935
+ metadata(),
1936
+ { name: "content", match: isOpenContent("source", "track", ...METADATA_TAGS) }
1937
+ ]);
1938
+ var headContract = contract([
1939
+ {
1940
+ name: "metadata",
1941
+ match: isTag("base", "link", "meta", "noscript", "script", "style", "template", "title")
1942
+ }
1943
+ ]);
1944
+ var htmlContract = contract([
1945
+ { name: "head", match: isTag("head"), cardinality: { min: 1, max: 1 }, position: "first" },
1946
+ { name: "body", match: isTag("body"), cardinality: { min: 1, max: 1 } }
1947
+ ]);
1948
+ var voidContract = contract([]);
1949
+ var textOnlyContract = contract([
1950
+ {
1951
+ name: "text",
1952
+ match: (child) => isString(child) || isNumber(child)
1953
+ }
1954
+ ]);
1955
+ var landmarkContract = ariaContract([landmarkRoleRule, landmarkNameAdvisory]);
1956
+ var dialogContract = ariaContract([requireAccessibleName]);
1957
+ var menuContract = ariaContract([requireAccessibleName]);
1958
+ var menubarContract = ariaContract([requireAccessibleName]);
1959
+ var treeContract = ariaContract([requireAccessibleName]);
1960
+ var gridContract = ariaContract([requireAccessibleName]);
1961
+ var listboxContract = ariaContract([requireAccessibleName]);
1962
+ var tablistContract = ariaContract([requireAccessibleName]);
1963
+ var radiogroupContract = ariaContract([requireAccessibleName]);
1964
+ var CONTRACT_GROUPS = [
1965
+ [VOID_TAGS, voidContract],
1966
+ [TEXT_ONLY_TAGS, textOnlyContract],
1967
+ [LANDMARK_TAGS, landmarkContract],
1968
+ [["ul", "ol", "menu"], listContract],
1969
+ [["audio", "video"], mediaContract],
1970
+ [["thead", "tbody", "tfoot"], tableBodyContract]
1971
+ ];
1972
+ function contractMap(groups) {
1973
+ return Object.fromEntries(
1974
+ groups.flatMap(([tags, enforcement]) => tags.map((tag) => [tag, enforcement]))
1975
+ );
1976
+ }
1977
+ var htmlContracts = {
1978
+ ...contractMap(CONTRACT_GROUPS),
1979
+ table: tableContract,
1980
+ tr: tableRowContract,
1981
+ colgroup: colgroupContract,
1982
+ dl: dlContract,
1983
+ select: selectContract,
1984
+ optgroup: optgroupContract,
1985
+ datalist: datalistContract,
1986
+ picture: pictureContract,
1987
+ figure: figureContract,
1988
+ details: detailsContract,
1989
+ fieldset: fieldsetContract,
1990
+ dialog: dialogContract,
1991
+ head: headContract,
1992
+ html: htmlContract
1993
+ };
1994
+
1995
+ // ../core/src/html/evaluators.ts
1996
+ var htmlDiagnostics = warnDiagnostics2;
1997
+ function buildEvaluatorMap() {
1998
+ const map2 = /* @__PURE__ */ new Map();
1999
+ iterate.forEachEntry(htmlContracts, (tag, { children }) => {
2000
+ if (children?.length) {
2001
+ map2.set(tag, new ChildrenEvaluator(children, htmlDiagnostics, `<${tag}>`));
2002
+ }
2003
+ });
2004
+ return map2;
2005
+ }
2006
+ var HTML_EVALUATORS = buildEvaluatorMap();
2007
+ function getHtmlChildrenEvaluator(tag) {
2008
+ return typeof tag === "string" ? HTML_EVALUATORS.get(tag) : void 0;
2009
+ }
2010
+
1814
2011
  // ../core/src/html/prop-normalizers.ts
1815
2012
  var HTML_FORM_NORMALIZERS = /* @__PURE__ */ new Map([
1816
2013
  ["button", [disabledProps]],
@@ -1998,6 +2195,19 @@ function createClassPipeline(resolved) {
1998
2195
  };
1999
2196
  }
2000
2197
 
2198
+ // ../../lib/pipeline-kit/src/factory/define-pipeline.ts
2199
+ function definePipeline(factory) {
2200
+ const cache = /* @__PURE__ */ new WeakMap();
2201
+ return (resolved) => {
2202
+ let pipeline = cache.get(resolved);
2203
+ if (!pipeline) {
2204
+ pipeline = factory(resolved);
2205
+ cache.set(resolved, pipeline);
2206
+ }
2207
+ return pipeline;
2208
+ };
2209
+ }
2210
+
2001
2211
  // ../core/src/options/resolve-factory-options.ts
2002
2212
  import { silentDiagnostics } from "../_shared/diagnostics.js";
2003
2213
  var EMPTY_VARIANT_KEYS = /* @__PURE__ */ new Set();
@@ -2133,89 +2343,82 @@ function guardPipeline(pipeline) {
2133
2343
  };
2134
2344
  }
2135
2345
 
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
- }
2346
+ // ../core/src/factory/create-polymorphic2.ts
2347
+ var createTagPipeline = (resolved) => makeResolveTag(resolved.defaultTag);
2348
+ var createPropsPipeline = (resolved) => (props) => mergeProps(resolved.defaultProps, props);
2349
+ var createHtmlPropNormalizersPipeline = () => getHtmlPropNormalizers;
2350
+ var createHtmlChildrenEvaluatorPipeline = () => getHtmlChildrenEvaluator;
2351
+ var createStylingClassPipeline = (resolved) => createClassPipeline(resolved);
2352
+ function resolveAriaRules(resolved) {
2353
+ return [.../* @__PURE__ */ new Set([...HTML_ARIA_RULES, ...resolved.ariaRules ?? []])];
2354
+ }
2355
+ var createAriaPipeline = (resolved) => {
2356
+ const rules = resolveAriaRules(resolved);
2357
+ const engine = new AriaPolicyEngine(resolved.diagnostics, rules.length ? { rules } : void 0);
2358
+ return (tag, props) => engine.validate(tag, props);
2359
+ };
2360
+ var memoizedTagPipeline = definePipeline(createTagPipeline);
2361
+ var memoizedPropsPipeline = definePipeline(createPropsPipeline);
2362
+ var memoizedHtmlPropNormalizersPipeline = definePipeline(createHtmlPropNormalizersPipeline);
2363
+ var memoizedHtmlChildrenEvaluatorPipeline = definePipeline(createHtmlChildrenEvaluatorPipeline);
2364
+ var memoizedClassPipeline = definePipeline(createStylingClassPipeline);
2365
+ var memoizedAriaPipeline = definePipeline(createAriaPipeline);
2366
+ function resolveAriaPassthrough(_tag, props) {
2367
+ return { props };
2368
+ }
2369
+ function resolveClassPlugin(factory, resolved, diagnostics) {
2370
+ if (!factory) return { pluginResult: void 0, classPipeline: memoizedClassPipeline(resolved) };
2145
2371
  const pluginResult = factory(resolved, diagnostics);
2146
2372
  assertPluginShape(pluginResult);
2147
- const classPipeline = guardPipeline(pluginResult.pipeline);
2148
- return { pluginResult, classPipeline };
2373
+ return { pluginResult, classPipeline: guardPipeline(pluginResult.pipeline) };
2149
2374
  }
2150
- function createRuntimeMethods(resolved, classPipeline, engine, renderDiagnostics) {
2151
- return {
2152
- resolveTag: makeResolveTag(resolved.defaultTag),
2153
- resolveProps(props) {
2154
- return mergeProps(resolved.defaultProps, props);
2155
- },
2375
+ function createPolymorphic2(options = {}) {
2376
+ const baseResolved = resolveFactoryOptions(options);
2377
+ const anyBaseResolved = baseResolved;
2378
+ const resolved = Object.freeze({
2379
+ ...baseResolved,
2380
+ htmlPropNormalizersFn: memoizedHtmlPropNormalizersPipeline(anyBaseResolved),
2381
+ htmlChildrenEvaluatorFn: memoizedHtmlChildrenEvaluatorPipeline(anyBaseResolved)
2382
+ });
2383
+ const anyResolved = resolved;
2384
+ if (process.env.NODE_ENV !== "production") {
2385
+ validateFactoryOptions(resolved, resolved.diagnostics);
2386
+ }
2387
+ const { pluginResult, classPipeline } = resolveClassPlugin(
2388
+ options.styling?.plugin,
2389
+ anyResolved,
2390
+ resolved.diagnostics
2391
+ );
2392
+ const resolveTag2 = memoizedTagPipeline(anyResolved);
2393
+ const resolveProps = memoizedPropsPipeline(anyResolved);
2394
+ const resolveAriaFn = options.enforcement !== void 0 ? memoizedAriaPipeline(anyResolved) : resolveAriaPassthrough;
2395
+ const methods = {
2396
+ resolveTag: resolveTag2,
2397
+ resolveProps,
2156
2398
  resolveClasses(tag, props, className, recipe) {
2157
2399
  if (process.env.NODE_ENV !== "production") {
2158
- validateRenderProps(renderDiagnostics, resolved, props, recipe);
2400
+ validateRenderProps(resolved.diagnostics, resolved, props, recipe);
2159
2401
  }
2160
2402
  return classPipeline(tag, props, className, recipe);
2161
2403
  },
2162
2404
  resolveAria(tag, props) {
2163
- if (!engine) return { props };
2164
- const result = engine.validate(tag, props);
2165
- return { props: result.props };
2405
+ return resolveAriaFn(tag, props);
2166
2406
  }
2167
2407
  };
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);
2408
+ const runtimeObject = pluginResult ? { ...methods, options: resolved, hasStyling: true, classPlugin: pluginResult } : { ...methods, options: resolved };
2409
+ return runtimeObject;
2211
2410
  }
2212
2411
 
2213
- // ../../lib/adapter-utils/src/define-component.ts
2214
- function defineContractComponent(options) {
2215
- return (factory) => factory(options);
2412
+ // ../core/src/resolver/resolver.ts
2413
+ import { silentDiagnostics as silentDiagnostics2 } from "../_shared/diagnostics.js";
2414
+ function enforceAllowedAs(tag, allowedAs, diagnostics, displayName) {
2415
+ if (allowedAs.includes(tag)) return;
2416
+ if (!diagnostics) return;
2417
+ const component = displayName ?? String(tag);
2418
+ diagnostics.error(ContractDiagnostics.allowedAsViolation(String(tag), allowedAs, component));
2216
2419
  }
2217
2420
 
2218
- // ../../lib/adapter-utils/src/build-core-runtime.ts
2421
+ // ../../lib/adapter-utils/src/runtime/build-core-runtime.ts
2219
2422
  var EMPTY_SET = /* @__PURE__ */ new Set();
2220
2423
  function buildCoreRuntime(normalized) {
2221
2424
  const runtime = createPolymorphic2(normalized);
@@ -2223,22 +2426,13 @@ function buildCoreRuntime(normalized) {
2223
2426
  return { runtime, ownedKeys };
2224
2427
  }
2225
2428
 
2226
- // ../../lib/adapter-utils/src/build-engines.ts
2429
+ // ../../lib/adapter-utils/src/runtime/build-engines.ts
2227
2430
  function buildEngines(diagnostics, childRules, context) {
2228
2431
  return childRules?.length ? { childrenEvaluator: new ChildrenEvaluator(childRules, diagnostics, context) } : {};
2229
2432
  }
2230
2433
 
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";
2434
+ // ../../lib/adapter-utils/src/runtime/resolve-adapter-common-options.ts
2435
+ import { throwDiagnostics as throwDiagnostics2, silentDiagnostics as silentDiagnostics3 } from "../_shared/diagnostics.js";
2242
2436
  function resolveAdapterCommonOptions(options, defaultName = "PolymorphicComponent", defaultDiagnostics = throwDiagnostics2) {
2243
2437
  return {
2244
2438
  name: options.name ?? defaultName,
@@ -2246,36 +2440,27 @@ function resolveAdapterCommonOptions(options, defaultName = "PolymorphicComponen
2246
2440
  };
2247
2441
  }
2248
2442
 
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
- };
2443
+ // ../../lib/adapter-utils/src/props/apply-filter.ts
2444
+ function applyFilter(props, filterProps, variantKeys) {
2445
+ const out = {};
2446
+ iterate.forEachEntry(props, (k) => {
2447
+ if (!Object.hasOwn(props, k)) return;
2448
+ if (filterProps(k, variantKeys)) return;
2449
+ out[k] = props[k];
2450
+ });
2451
+ return out;
2272
2452
  }
2273
2453
 
2274
- // ../../adapters/lit/src/render-to-string.ts
2275
- var ssrRegistry = /* @__PURE__ */ new WeakMap();
2276
- function registerForSsr(cls, bundle) {
2277
- ssrRegistry.set(cls, { bundle });
2454
+ // ../../lib/adapter-utils/src/props/compose-filter.ts
2455
+ function composeFilter(ownedKeys, filterProps) {
2456
+ const defaultFilter = (key, variantKeys) => variantKeys.has(key) || ownedKeys.has(key);
2457
+ if (!filterProps) {
2458
+ return defaultFilter;
2459
+ }
2460
+ return (key, variantKeys) => defaultFilter(key, variantKeys) || filterProps(key, variantKeys);
2278
2461
  }
2462
+
2463
+ // ../../lib/adapter-utils/src/render/render-to-string.ts
2279
2464
  function escapeAttr(value) {
2280
2465
  return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
2281
2466
  }
@@ -2289,51 +2474,51 @@ function buildAttrString(attributes) {
2289
2474
  parts.push(`${key}="${escapeAttr(String(value))}"`);
2290
2475
  }
2291
2476
  });
2292
- return parts.length > 0 ? " " + parts.join(" ") : "";
2477
+ return parts.length > 0 ? ` ${parts.join(" ")}` : "";
2293
2478
  }
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;
2479
+ function renderBundleToString(bundle, props = {}, innerHTML = "") {
2480
+ const {
2481
+ filterProps,
2482
+ runtime: { options, resolveAria, resolveClasses, resolveProps, resolveTag: resolveTag2 }
2483
+ } = bundle;
2303
2484
  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(
2485
+ const tag = resolveTag2(as);
2486
+ if (options.allowedAs !== void 0) {
2487
+ enforceAllowedAs(tag, options.allowedAs, options.diagnostics, options.displayName);
2488
+ }
2489
+ const mergedProps = resolveProps(rest);
2490
+ const normalizedProps = typeof options.normalizeFn === "function" ? options.normalizeFn(mergedProps) : mergedProps;
2491
+ const htmlNormalizers = options.htmlPropNormalizersFn?.(tag);
2492
+ const finalProps = { ...normalizedProps };
2493
+ if (htmlNormalizers) {
2494
+ for (const normalize of htmlNormalizers) {
2495
+ Object.assign(finalProps, normalize(finalProps));
2496
+ }
2497
+ }
2498
+ const resolvedClass = resolveClasses(
2307
2499
  tag,
2308
- mergedProps,
2500
+ finalProps,
2309
2501
  // Accept both React-style className and HTML-native class
2310
2502
  className ?? classAttr,
2311
2503
  recipe
2312
2504
  );
2313
- const ariaResult = bundle.runtime.resolveAria(tag, mergedProps);
2314
- const filtered = applyFilter(
2315
- ariaResult.props,
2316
- bundle.filterProps,
2317
- bundle.runtime.options.variantKeys
2318
- );
2505
+ const ariaResult = resolveAria(tag, finalProps);
2506
+ const filtered = applyFilter(ariaResult.props, filterProps, options.variantKeys);
2319
2507
  const attrs = { ...filtered, class: resolvedClass || void 0 };
2320
2508
  const attrStr = buildAttrString(attrs);
2321
2509
  return `<${tag}${attrStr}>${innerHTML}</${tag}>`;
2322
2510
  }
2323
2511
 
2324
- // ../../adapters/lit/src/create-contract-component.ts
2325
- function isObject2(value) {
2326
- return typeof value === "object" && value !== null;
2327
- }
2512
+ // ../../lib/adapter-utils/src/render/host-state.ts
2328
2513
  function isLooseBundle(arg) {
2329
- if (!isObject2(arg)) return false;
2514
+ if (!isObject(arg)) return false;
2330
2515
  const { runtime, filterProps, childrenEvaluator } = arg;
2331
- if (!isObject2(runtime)) return false;
2332
- if (!isObject2(runtime["options"])) return false;
2516
+ if (!isObject(runtime)) return false;
2517
+ if (!isObject(runtime["options"])) return false;
2333
2518
  if (typeof runtime["resolveTag"] !== "function" || typeof runtime["resolveProps"] !== "function" || typeof runtime["resolveClasses"] !== "function" || typeof runtime["resolveAria"] !== "function")
2334
2519
  return false;
2335
2520
  if (typeof filterProps !== "function") return false;
2336
- if (childrenEvaluator !== void 0 && (!isObject2(childrenEvaluator) || typeof childrenEvaluator["evaluate"] !== "function"))
2521
+ if (childrenEvaluator !== void 0 && (!isObject(childrenEvaluator) || typeof childrenEvaluator["evaluate"] !== "function"))
2337
2522
  return false;
2338
2523
  return true;
2339
2524
  }
@@ -2345,41 +2530,46 @@ function toLooseBundle(bundle) {
2345
2530
  }
2346
2531
  function resolveHostState(bundle, props) {
2347
2532
  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(
2533
+ const { options, resolveAria, resolveClasses, resolveProps, resolveTag: resolveTag2 } = bundle.runtime;
2534
+ const tag = resolveTag2(as);
2535
+ if (options.allowedAs !== void 0) {
2536
+ enforceAllowedAs(tag, options.allowedAs, options.diagnostics, options.displayName);
2537
+ }
2538
+ const mergedProps = resolveProps(rest);
2539
+ const normalizedProps = typeof options.normalizeFn === "function" ? options.normalizeFn(mergedProps) : mergedProps;
2540
+ const htmlNormalizers = options.htmlPropNormalizersFn?.(tag);
2541
+ const finalProps = { ...normalizedProps };
2542
+ if (htmlNormalizers) {
2543
+ for (const normalize of htmlNormalizers) {
2544
+ Object.assign(finalProps, normalize(finalProps));
2545
+ }
2546
+ }
2547
+ const resolvedClass = resolveClasses(
2354
2548
  tag,
2355
- normalizedProps,
2549
+ finalProps,
2356
2550
  className,
2357
2551
  recipe
2358
2552
  );
2359
- const ariaResult = bundle.runtime.resolveAria(tag, normalizedProps);
2360
- const attributes = applyFilter(
2361
- ariaResult.props,
2362
- bundle.filterProps,
2363
- bundle.runtime.options.variantKeys
2364
- );
2553
+ const ariaResult = resolveAria(tag, finalProps);
2554
+ const attributes = applyFilter(ariaResult.props, bundle.filterProps, options.variantKeys);
2365
2555
  return { className: resolvedClass, attributes };
2366
2556
  }
2367
- function applyHostState(host, state, prevPipelineAttrs, incomingProps) {
2557
+ function diffAndApplyAttributes(host, state, prevPipelineAttrs, incomingProps) {
2558
+ const hasOwn2 = Object.hasOwn;
2559
+ const attrs = state.attributes;
2368
2560
  host.className = state.className;
2369
- iterate.forEachSet(prevPipelineAttrs, (key) => {
2370
- if (!Object.hasOwn(state.attributes, key)) {
2371
- host.removeAttribute(key);
2372
- }
2373
- });
2561
+ for (const key of prevPipelineAttrs) {
2562
+ if (!hasOwn2(attrs, key)) host.removeAttribute(key);
2563
+ }
2374
2564
  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];
2565
+ for (const key in incomingProps) {
2566
+ if (!hasOwn2(incomingProps, key)) continue;
2567
+ if (!key.startsWith("aria-") && key !== "role") continue;
2568
+ if (!hasOwn2(attrs, key)) host.removeAttribute(key);
2569
+ }
2570
+ for (const key in attrs) {
2571
+ if (!hasOwn2(attrs, key)) continue;
2572
+ const value = attrs[key];
2383
2573
  if (value === void 0 || value === null || value === false) {
2384
2574
  host.removeAttribute(key);
2385
2575
  } else if (value === true) {
@@ -2389,8 +2579,54 @@ function applyHostState(host, state, prevPipelineAttrs, incomingProps) {
2389
2579
  host.setAttribute(key, String(value));
2390
2580
  prevPipelineAttrs.add(key);
2391
2581
  }
2392
- });
2582
+ }
2583
+ }
2584
+
2585
+ // ../../adapters/lit/src/create-contract-component.ts
2586
+ import { LitElement, html } from "lit";
2587
+
2588
+ // ../../adapters/lit/src/build-runtime.ts
2589
+ import { silentDiagnostics as silentDiagnostics4 } from "../_shared/diagnostics.js";
2590
+ function normalizeOptions(options) {
2591
+ return {
2592
+ ...options,
2593
+ ...resolveAdapterCommonOptions(options, "PolymorphicElement", silentDiagnostics4)
2594
+ };
2595
+ }
2596
+ function buildRuntime(options) {
2597
+ const { filterProps: customFilter, enforcement } = options;
2598
+ const normalized = normalizeOptions(options);
2599
+ const { runtime, ownedKeys } = buildCoreRuntime(normalized);
2600
+ const { childrenEvaluator } = buildEngines(
2601
+ normalized.diagnostics,
2602
+ enforcement?.children,
2603
+ normalized.name
2604
+ );
2605
+ const filterProps = composeFilter(ownedKeys, customFilter);
2606
+ return {
2607
+ runtime,
2608
+ filterProps,
2609
+ ...childrenEvaluator !== void 0 && { childrenEvaluator }
2610
+ };
2611
+ }
2612
+
2613
+ // ../../adapters/lit/src/render-to-string.ts
2614
+ var ssrRegistry = /* @__PURE__ */ new WeakMap();
2615
+ function registerForSsr(cls, bundle) {
2616
+ ssrRegistry.set(cls, { bundle });
2617
+ }
2618
+ function renderToString(component, props = {}, innerHTML = "") {
2619
+ const entry = ssrRegistry.get(component);
2620
+ if (!entry) {
2621
+ const name = component.name ?? "AnonymousComponent";
2622
+ throw new Error(
2623
+ `[renderToString] ${name} was not registered for SSR. Ensure it was created with createContractComponent from @praxis-kit/lit.`
2624
+ );
2625
+ }
2626
+ return renderBundleToString(entry.bundle, props, innerHTML);
2393
2627
  }
2628
+
2629
+ // ../../adapters/lit/src/create-contract-component.ts
2394
2630
  function createContractComponent(options) {
2395
2631
  const bundle = buildRuntime(options);
2396
2632
  const looseBundle = toLooseBundle(bundle);
@@ -2458,7 +2694,8 @@ function createContractComponent(options) {
2458
2694
  const self = this._self;
2459
2695
  const props = {};
2460
2696
  iterate.forEach(iterate.items(this.attributes), (attr) => {
2461
- if (attr.name !== "class") props[attr.name] = attr.value;
2697
+ if (attr.name === "class") return;
2698
+ props[attr.name] = attr.name === "disabled" ? true : attr.value;
2462
2699
  });
2463
2700
  props["as"] = self.as;
2464
2701
  props["recipe"] = self.recipe;
@@ -2467,12 +2704,15 @@ function createContractComponent(options) {
2467
2704
  const val = self[key];
2468
2705
  if (val != null) props[key] = val;
2469
2706
  });
2470
- applyHostState(this, resolveHostState(looseBundle, props), this._pipelineAttrs, props);
2707
+ diffAndApplyAttributes(this, resolveHostState(looseBundle, props), this._pipelineAttrs, props);
2471
2708
  }
2472
2709
  render() {
2710
+ const children = Array.from(this.childNodes);
2473
2711
  if (bundle.childrenEvaluator) {
2474
- bundle.childrenEvaluator.evaluate(Array.from(this.childNodes));
2712
+ bundle.childrenEvaluator.evaluate(children);
2475
2713
  }
2714
+ const tag = bundle.runtime.resolveTag(this._self.as);
2715
+ bundle.runtime.options.htmlChildrenEvaluatorFn?.(tag)?.evaluate(children);
2476
2716
  return html`<slot></slot>`;
2477
2717
  }
2478
2718
  }