praxis-kit 6.6.0 → 6.6.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
@@ -2102,6 +2102,93 @@ var readonlyProps = ({
2102
2102
  // ../core/src/html/evaluators.ts
2103
2103
  import { warnDiagnostics as warnDiagnostics2 } from "../_shared/diagnostics.js";
2104
2104
 
2105
+ // ../core/src/html/contracts/categories.ts
2106
+ var METADATA_TAGS = ["script", "template"];
2107
+ var VOID_TAGS = [
2108
+ "area",
2109
+ "base",
2110
+ "br",
2111
+ "col",
2112
+ "embed",
2113
+ "hr",
2114
+ "img",
2115
+ "input",
2116
+ "link",
2117
+ "meta",
2118
+ "param",
2119
+ "source",
2120
+ "track",
2121
+ "wbr"
2122
+ ];
2123
+ var TEXT_ONLY_TAGS = [
2124
+ "option",
2125
+ "script",
2126
+ "style",
2127
+ "textarea",
2128
+ "title"
2129
+ ];
2130
+ var LANDMARK_TAGS = [
2131
+ "article",
2132
+ "aside",
2133
+ "footer",
2134
+ "header",
2135
+ "main",
2136
+ "nav"
2137
+ ];
2138
+ var INTERACTIVE_CONTENT_TAGS = [
2139
+ "a",
2140
+ "button",
2141
+ "input",
2142
+ "select",
2143
+ "textarea",
2144
+ "label"
2145
+ ];
2146
+ var LABELABLE_TAGS = [
2147
+ "button",
2148
+ "input",
2149
+ "meter",
2150
+ "output",
2151
+ "progress",
2152
+ "select",
2153
+ "textarea"
2154
+ ];
2155
+ var OTHER_INTERACTIVE_TAGS = [
2156
+ "a",
2157
+ "details",
2158
+ "embed",
2159
+ "iframe"
2160
+ ];
2161
+ var P_BLOCKED_TAGS = [
2162
+ "address",
2163
+ "article",
2164
+ "aside",
2165
+ "blockquote",
2166
+ "details",
2167
+ "dialog",
2168
+ "div",
2169
+ "dl",
2170
+ "fieldset",
2171
+ "figure",
2172
+ "footer",
2173
+ "form",
2174
+ "h1",
2175
+ "h2",
2176
+ "h3",
2177
+ "h4",
2178
+ "h5",
2179
+ "h6",
2180
+ "header",
2181
+ "hr",
2182
+ "main",
2183
+ "nav",
2184
+ "ol",
2185
+ "p",
2186
+ "pre",
2187
+ "section",
2188
+ "table",
2189
+ "ul"
2190
+ ];
2191
+
2105
2192
  // ../core/src/html/spec/vocabulary/input.ts
2106
2193
  var TEXT_INPUT_TYPES = ["text", "search", "url", "tel", "email", "password"];
2107
2194
  var NUMERIC_INPUT_TYPES = [
@@ -2481,7 +2568,11 @@ var ALLOWED_ROLES = {
2481
2568
  "treeitem"
2482
2569
  ],
2483
2570
  dialog: ["alertdialog"],
2484
- fieldset: ["none", "presentation", "radiogroup"]
2571
+ fieldset: ["none", "presentation", "radiogroup"],
2572
+ // `<label>` has no implicit role and no documented alternates — its native labeling
2573
+ // semantics (control association, accessible-name contribution) aren't reproducible via
2574
+ // ARIA, so any explicit `role` should be avoided rather than substituted.
2575
+ label: []
2485
2576
  };
2486
2577
  var ELEMENT_SPECS = {
2487
2578
  input: inputElementSpec,
@@ -2522,7 +2613,10 @@ var roleNotPermittedRule = Object.assign(
2522
2613
  );
2523
2614
 
2524
2615
  // ../core/src/html/aria-rules.ts
2525
- var LANDMARK_TAG_SET = /* @__PURE__ */ new Set(["article", "aside", "footer", "header", "main", "nav"]);
2616
+ function defineAriaRule(tags, rule) {
2617
+ return Object.assign(rule, { tags });
2618
+ }
2619
+ var LANDMARK_TAG_SET = new Set(LANDMARK_TAGS);
2526
2620
  var removeLandmarkRoleOverride = {
2527
2621
  kind: "removeRole",
2528
2622
  apply: ({ props }) => {
@@ -2531,10 +2625,11 @@ var removeLandmarkRoleOverride = {
2531
2625
  return { applied: true, next: rest, previous: props };
2532
2626
  }
2533
2627
  };
2534
- var landmarkRoleRule = Object.assign(
2628
+ var landmarkRoleRule = defineAriaRule(
2629
+ LANDMARK_TAGS,
2535
2630
  ({ tag, props, implicitRole }) => {
2536
2631
  if (!LANDMARK_TAG_SET.has(tag) || !implicitRole) return [];
2537
- const role = props.role;
2632
+ const { role } = props;
2538
2633
  if (!role || role === implicitRole) return [];
2539
2634
  const diagnostic = HtmlDiagnostics.landmarkRoleOverride(tag, implicitRole, role);
2540
2635
  return [
@@ -2546,8 +2641,7 @@ var landmarkRoleRule = Object.assign(
2546
2641
  diagnostic
2547
2642
  }
2548
2643
  ];
2549
- },
2550
- { tags: [...LANDMARK_TAG_SET] }
2644
+ }
2551
2645
  );
2552
2646
  function requireAccessibleName({ tag, props }) {
2553
2647
  if ("aria-label" in props || "aria-labelledby" in props) return [];
@@ -2560,38 +2654,44 @@ function requireAccessibleName({ tag, props }) {
2560
2654
  }
2561
2655
  ];
2562
2656
  }
2563
- var NAMED_LANDMARK_TAGS = /* @__PURE__ */ new Set(["nav", "aside"]);
2564
- var landmarkNameAdvisory = Object.assign(
2657
+ var NAMED_LANDMARK_TAGS = ["nav", "aside"];
2658
+ var NAMED_LANDMARK_TAG_SET = new Set(NAMED_LANDMARK_TAGS);
2659
+ var landmarkAccessibleNameRule = defineAriaRule(
2660
+ NAMED_LANDMARK_TAGS,
2565
2661
  (ctx) => {
2566
- if (!ctx.implicitRole || !NAMED_LANDMARK_TAGS.has(ctx.tag)) return [];
2662
+ if (!ctx.implicitRole || !NAMED_LANDMARK_TAG_SET.has(ctx.tag)) return [];
2567
2663
  return requireAccessibleName(ctx);
2568
- },
2569
- { tags: [...NAMED_LANDMARK_TAGS] }
2664
+ }
2570
2665
  );
2571
2666
  var HTML_ARIA_RULES = [
2572
2667
  landmarkRoleRule,
2573
- landmarkNameAdvisory,
2668
+ landmarkAccessibleNameRule,
2574
2669
  roleNotPermittedRule,
2575
2670
  ...INPUT_RULES
2576
2671
  ];
2577
2672
 
2578
- // ../core/src/html/contracts.ts
2673
+ // ../core/src/html/contracts/helpers.ts
2579
2674
  import { warnDiagnostics } from "../_shared/diagnostics.js";
2675
+ function isVNodeLike(child) {
2676
+ return isObject(child) && "type" in child;
2677
+ }
2580
2678
  function isOpenContent(...blockedTags) {
2581
2679
  const set2 = new Set(blockedTags);
2582
2680
  return (child) => {
2583
- if (!isObject(child) || !("type" in child)) return false;
2681
+ if (!isVNodeLike(child)) return false;
2584
2682
  const tag = getTag(child);
2585
2683
  return tag === void 0 || !set2.has(tag);
2586
2684
  };
2587
2685
  }
2588
- var METADATA_TAGS = ["script", "template"];
2589
2686
  var metadataMatch = isTag(...METADATA_TAGS);
2590
2687
  function metadata(name = "metadata") {
2591
2688
  return { name, match: metadataMatch };
2592
2689
  }
2690
+ function optional(name, tag) {
2691
+ return { name, match: isTag(tag), cardinality: { max: 1 } };
2692
+ }
2593
2693
  function firstOptional(name, tag) {
2594
- return { name, match: isTag(tag), cardinality: { max: 1 }, position: "first" };
2694
+ return { ...optional(name, tag), position: "first" };
2595
2695
  }
2596
2696
  function contract(children, options) {
2597
2697
  return { diagnostics: warnDiagnostics, children, ...options };
@@ -2605,50 +2705,41 @@ function ariaContract(aria) {
2605
2705
  function firstChildContract(name, tag) {
2606
2706
  return contract([firstOptional(name, tag), { name: "content", match: isOpenContent(tag) }]);
2607
2707
  }
2608
- var VOID_TAGS = [
2609
- "area",
2610
- "base",
2611
- "br",
2612
- "col",
2613
- "embed",
2614
- "hr",
2615
- "img",
2616
- "input",
2617
- "link",
2618
- "meta",
2619
- "param",
2620
- "source",
2621
- "track",
2622
- "wbr"
2623
- ];
2624
- var TEXT_ONLY_TAGS = ["option", "script", "style", "textarea", "title"];
2625
- var LANDMARK_TAGS = ["article", "aside", "footer", "header", "main", "nav"];
2626
- var listContract = closedContract([
2627
- { name: "list-item", match: isTag("li", ...METADATA_TAGS) }
2628
- ]);
2629
- var tableContract = closedContract([
2630
- firstOptional("caption", "caption"),
2631
- { name: "colgroup", match: isTag("colgroup") },
2632
- { name: "thead", match: isTag("thead"), cardinality: { max: 1 } },
2633
- { name: "tbody", match: isTag("tbody") },
2634
- { name: "tfoot", match: isTag("tfoot"), cardinality: { max: 1 } },
2635
- { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2636
- ]);
2637
- var tableBodyContract = closedContract([
2638
- { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2639
- ]);
2640
- var tableRowContract = closedContract([
2641
- { name: "table-cell", match: isTag("td", "th", ...METADATA_TAGS) }
2642
- ]);
2643
- var colgroupContract = closedContract([
2644
- { name: "column", match: isTag("col", "template") }
2708
+ function getChildProp(child, key) {
2709
+ if (!isVNodeLike(child)) return void 0;
2710
+ const { props } = child;
2711
+ if (!isObject(props)) return void 0;
2712
+ return props[key];
2713
+ }
2714
+
2715
+ // ../core/src/html/contracts/aria/landmarks.ts
2716
+ var landmarkContract = ariaContract([landmarkRoleRule, landmarkAccessibleNameRule]);
2717
+
2718
+ // ../core/src/html/contracts/aria/widgets.ts
2719
+ var dialogContract = ariaContract([requireAccessibleName]);
2720
+ var menuContract = ariaContract([requireAccessibleName]);
2721
+ var menubarContract = ariaContract([requireAccessibleName]);
2722
+ var treeContract = ariaContract([requireAccessibleName]);
2723
+ var gridContract = ariaContract([requireAccessibleName]);
2724
+ var listboxContract = ariaContract([requireAccessibleName]);
2725
+ var tablistContract = ariaContract([requireAccessibleName]);
2726
+ var radiogroupContract = ariaContract([requireAccessibleName]);
2727
+
2728
+ // ../core/src/html/contracts/html/document.ts
2729
+ var headContract = closedContract([
2730
+ {
2731
+ name: "metadata",
2732
+ match: isTag("base", "link", "meta", "noscript", "script", "style", "template", "title")
2733
+ }
2645
2734
  ]);
2646
- var dlContract = closedContract([
2647
- { name: "term", match: isTag("dt") },
2648
- { name: "description", match: isTag("dd") },
2649
- { name: "group", match: isTag("div") },
2650
- metadata()
2735
+ var htmlContract = closedContract([
2736
+ { name: "head", match: isTag("head"), cardinality: { min: 1, max: 1 }, position: "first" },
2737
+ { name: "body", match: isTag("body"), cardinality: { min: 1, max: 1 } }
2651
2738
  ]);
2739
+ var voidContract = contract([], { exclusiveChildren: true, allowText: false });
2740
+ var textOnlyContract = contract([], { exclusiveChildren: true });
2741
+
2742
+ // ../core/src/html/contracts/html/forms.ts
2652
2743
  var selectContract = closedContract([
2653
2744
  { name: "option", match: isTag("option", "optgroup", "hr", ...METADATA_TAGS) }
2654
2745
  ]);
@@ -2658,6 +2749,45 @@ var optgroupContract = closedContract([
2658
2749
  var datalistContract = closedContract([
2659
2750
  { name: "option", match: isTag("option", ...METADATA_TAGS) }
2660
2751
  ]);
2752
+ var buttonContract = closedContract([
2753
+ { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2754
+ ]);
2755
+ var anchorContract = closedContract([
2756
+ { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2757
+ ]);
2758
+ var labelableTagMatch = isTag(...LABELABLE_TAGS);
2759
+ function isLabelableControl(child) {
2760
+ if (!labelableTagMatch(child)) return false;
2761
+ if (getTag(child) !== "input") return true;
2762
+ const type = getChildProp(child, "type");
2763
+ return !isString(type) || type !== "hidden";
2764
+ }
2765
+ var labelContract = contract([
2766
+ { name: "control", match: isLabelableControl, cardinality: { max: 1 } },
2767
+ { name: "nested-label", match: isTag("label"), cardinality: { max: 0 } },
2768
+ {
2769
+ name: "other-interactive-content",
2770
+ match: isTag(...OTHER_INTERACTIVE_TAGS),
2771
+ cardinality: { max: 0 }
2772
+ }
2773
+ ]);
2774
+
2775
+ // ../core/src/html/contracts/html/grouping.ts
2776
+ var detailsContract = firstChildContract("summary", "summary");
2777
+ var fieldsetContract = firstChildContract("legend", "legend");
2778
+
2779
+ // ../core/src/html/contracts/html/lists.ts
2780
+ var listContract = closedContract([
2781
+ { name: "list-item", match: isTag("li", ...METADATA_TAGS) }
2782
+ ]);
2783
+ var dlContract = closedContract([
2784
+ { name: "term", match: isTag("dt") },
2785
+ { name: "description", match: isTag("dd") },
2786
+ { name: "group", match: isTag("div") },
2787
+ metadata()
2788
+ ]);
2789
+
2790
+ // ../core/src/html/contracts/html/media.ts
2661
2791
  var pictureContract = closedContract([
2662
2792
  { name: "source", match: isTag("source", ...METADATA_TAGS) },
2663
2793
  { name: "image", match: isTag("img"), cardinality: { min: 1, max: 1 }, position: "last" }
@@ -2666,91 +2796,49 @@ var figureContract = contract([
2666
2796
  { name: "caption", match: isTag("figcaption"), cardinality: { max: 1 } },
2667
2797
  { name: "content", match: isOpenContent("figcaption") }
2668
2798
  ]);
2669
- var detailsContract = firstChildContract("summary", "summary");
2670
- var fieldsetContract = firstChildContract("legend", "legend");
2671
2799
  var objectContract = contract([
2672
2800
  { name: "param", match: isTag("param") },
2673
2801
  { name: "content", match: isOpenContent("param") }
2674
2802
  ]);
2675
- var INTERACTIVE_CONTENT_TAGS = ["a", "button", "input", "select", "textarea", "label"];
2676
- var buttonContract = closedContract([
2677
- { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2678
- ]);
2679
- var anchorContract = closedContract([
2680
- { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2681
- ]);
2682
- var LABELABLE_TAGS = [
2683
- "button",
2684
- "input",
2685
- "meter",
2686
- "output",
2687
- "progress",
2688
- "select",
2689
- "textarea"
2690
- ];
2691
- var labelContract = contract([
2692
- { name: "control", match: isTag(...LABELABLE_TAGS), cardinality: { max: 1 } }
2693
- ]);
2694
- var P_BLOCKED_TAGS = [
2695
- "address",
2696
- "article",
2697
- "aside",
2698
- "blockquote",
2699
- "details",
2700
- "dialog",
2701
- "div",
2702
- "dl",
2703
- "fieldset",
2704
- "figure",
2705
- "footer",
2706
- "form",
2707
- "h1",
2708
- "h2",
2709
- "h3",
2710
- "h4",
2711
- "h5",
2712
- "h6",
2713
- "header",
2714
- "hr",
2715
- "main",
2716
- "nav",
2717
- "ol",
2718
- "p",
2719
- "pre",
2720
- "section",
2721
- "table",
2722
- "ul"
2723
- ];
2724
- var pContract = closedContract([
2725
- { name: "content", match: isOpenContent(...P_BLOCKED_TAGS) }
2726
- ]);
2727
2803
  var mediaContract = contract([
2728
2804
  { name: "source", match: isTag("source") },
2729
2805
  { name: "track", match: isTag("track") },
2730
2806
  metadata(),
2731
2807
  { name: "content", match: isOpenContent("source", "track", ...METADATA_TAGS) }
2732
2808
  ]);
2733
- var headContract = closedContract([
2734
- {
2735
- name: "metadata",
2736
- match: isTag("base", "link", "meta", "noscript", "script", "style", "template", "title")
2737
- }
2809
+
2810
+ // ../core/src/html/contracts/html/tables.ts
2811
+ var tableContract = closedContract([
2812
+ firstOptional("caption", "caption"),
2813
+ { name: "colgroup", match: isTag("colgroup") },
2814
+ { name: "thead", match: isTag("thead"), cardinality: { max: 1 } },
2815
+ { name: "tbody", match: isTag("tbody") },
2816
+ { name: "tfoot", match: isTag("tfoot"), cardinality: { max: 1 } },
2817
+ { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2738
2818
  ]);
2739
- var htmlContract = closedContract([
2740
- { name: "head", match: isTag("head"), cardinality: { min: 1, max: 1 }, position: "first" },
2741
- { name: "body", match: isTag("body"), cardinality: { min: 1, max: 1 } }
2819
+ var tableBodyContract = closedContract([
2820
+ { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2742
2821
  ]);
2743
- var voidContract = contract([], { exclusiveChildren: true, allowText: false });
2744
- var textOnlyContract = contract([], { exclusiveChildren: true });
2745
- var landmarkContract = ariaContract([landmarkRoleRule, landmarkNameAdvisory]);
2746
- var dialogContract = ariaContract([requireAccessibleName]);
2747
- var menuContract = ariaContract([requireAccessibleName]);
2748
- var menubarContract = ariaContract([requireAccessibleName]);
2749
- var treeContract = ariaContract([requireAccessibleName]);
2750
- var gridContract = ariaContract([requireAccessibleName]);
2751
- var listboxContract = ariaContract([requireAccessibleName]);
2752
- var tablistContract = ariaContract([requireAccessibleName]);
2753
- var radiogroupContract = ariaContract([requireAccessibleName]);
2822
+ var tableRowContract = closedContract([
2823
+ { name: "table-cell", match: isTag("td", "th", ...METADATA_TAGS) }
2824
+ ]);
2825
+ var colgroupContract = closedContract([
2826
+ { name: "column", match: isTag("col", "template") }
2827
+ ]);
2828
+
2829
+ // ../core/src/html/contracts/html/text.ts
2830
+ var pContract = closedContract([
2831
+ { name: "content", match: isOpenContent(...P_BLOCKED_TAGS) }
2832
+ ]);
2833
+
2834
+ // ../core/src/html/contracts/build-map.ts
2835
+ function buildMap(groups) {
2836
+ return Object.fromEntries(
2837
+ groups.flatMap(([keys2, value]) => keys2.map((key) => [key, value]))
2838
+ );
2839
+ }
2840
+
2841
+ // ../core/src/html/contracts/maps.ts
2754
2842
  var CONTRACT_GROUPS = [
2755
2843
  [VOID_TAGS, voidContract],
2756
2844
  [TEXT_ONLY_TAGS, textOnlyContract],
@@ -2759,13 +2847,8 @@ var CONTRACT_GROUPS = [
2759
2847
  [["audio", "video"], mediaContract],
2760
2848
  [["thead", "tbody", "tfoot"], tableBodyContract]
2761
2849
  ];
2762
- function contractMap(groups) {
2763
- return Object.fromEntries(
2764
- groups.flatMap(([tags, enforcement]) => tags.map((tag) => [tag, enforcement]))
2765
- );
2766
- }
2767
2850
  var htmlContracts = {
2768
- ...contractMap(CONTRACT_GROUPS),
2851
+ ...buildMap(CONTRACT_GROUPS),
2769
2852
  table: tableContract,
2770
2853
  tr: tableRowContract,
2771
2854
  colgroup: colgroupContract,