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.
@@ -2148,6 +2148,93 @@ var readonlyProps = ({
2148
2148
  // ../core/src/html/evaluators.ts
2149
2149
  import { warnDiagnostics as warnDiagnostics2 } from "../_shared/diagnostics.js";
2150
2150
 
2151
+ // ../core/src/html/contracts/categories.ts
2152
+ var METADATA_TAGS = ["script", "template"];
2153
+ var VOID_TAGS = [
2154
+ "area",
2155
+ "base",
2156
+ "br",
2157
+ "col",
2158
+ "embed",
2159
+ "hr",
2160
+ "img",
2161
+ "input",
2162
+ "link",
2163
+ "meta",
2164
+ "param",
2165
+ "source",
2166
+ "track",
2167
+ "wbr"
2168
+ ];
2169
+ var TEXT_ONLY_TAGS = [
2170
+ "option",
2171
+ "script",
2172
+ "style",
2173
+ "textarea",
2174
+ "title"
2175
+ ];
2176
+ var LANDMARK_TAGS = [
2177
+ "article",
2178
+ "aside",
2179
+ "footer",
2180
+ "header",
2181
+ "main",
2182
+ "nav"
2183
+ ];
2184
+ var INTERACTIVE_CONTENT_TAGS = [
2185
+ "a",
2186
+ "button",
2187
+ "input",
2188
+ "select",
2189
+ "textarea",
2190
+ "label"
2191
+ ];
2192
+ var LABELABLE_TAGS = [
2193
+ "button",
2194
+ "input",
2195
+ "meter",
2196
+ "output",
2197
+ "progress",
2198
+ "select",
2199
+ "textarea"
2200
+ ];
2201
+ var OTHER_INTERACTIVE_TAGS = [
2202
+ "a",
2203
+ "details",
2204
+ "embed",
2205
+ "iframe"
2206
+ ];
2207
+ var P_BLOCKED_TAGS = [
2208
+ "address",
2209
+ "article",
2210
+ "aside",
2211
+ "blockquote",
2212
+ "details",
2213
+ "dialog",
2214
+ "div",
2215
+ "dl",
2216
+ "fieldset",
2217
+ "figure",
2218
+ "footer",
2219
+ "form",
2220
+ "h1",
2221
+ "h2",
2222
+ "h3",
2223
+ "h4",
2224
+ "h5",
2225
+ "h6",
2226
+ "header",
2227
+ "hr",
2228
+ "main",
2229
+ "nav",
2230
+ "ol",
2231
+ "p",
2232
+ "pre",
2233
+ "section",
2234
+ "table",
2235
+ "ul"
2236
+ ];
2237
+
2151
2238
  // ../core/src/html/spec/vocabulary/input.ts
2152
2239
  var TEXT_INPUT_TYPES = ["text", "search", "url", "tel", "email", "password"];
2153
2240
  var NUMERIC_INPUT_TYPES = [
@@ -2527,7 +2614,11 @@ var ALLOWED_ROLES = {
2527
2614
  "treeitem"
2528
2615
  ],
2529
2616
  dialog: ["alertdialog"],
2530
- fieldset: ["none", "presentation", "radiogroup"]
2617
+ fieldset: ["none", "presentation", "radiogroup"],
2618
+ // `<label>` has no implicit role and no documented alternates — its native labeling
2619
+ // semantics (control association, accessible-name contribution) aren't reproducible via
2620
+ // ARIA, so any explicit `role` should be avoided rather than substituted.
2621
+ label: []
2531
2622
  };
2532
2623
  var ELEMENT_SPECS = {
2533
2624
  input: inputElementSpec,
@@ -2568,7 +2659,10 @@ var roleNotPermittedRule = Object.assign(
2568
2659
  );
2569
2660
 
2570
2661
  // ../core/src/html/aria-rules.ts
2571
- var LANDMARK_TAG_SET = /* @__PURE__ */ new Set(["article", "aside", "footer", "header", "main", "nav"]);
2662
+ function defineAriaRule(tags, rule) {
2663
+ return Object.assign(rule, { tags });
2664
+ }
2665
+ var LANDMARK_TAG_SET = new Set(LANDMARK_TAGS);
2572
2666
  var removeLandmarkRoleOverride = {
2573
2667
  kind: "removeRole",
2574
2668
  apply: ({ props }) => {
@@ -2577,10 +2671,11 @@ var removeLandmarkRoleOverride = {
2577
2671
  return { applied: true, next: rest, previous: props };
2578
2672
  }
2579
2673
  };
2580
- var landmarkRoleRule = Object.assign(
2674
+ var landmarkRoleRule = defineAriaRule(
2675
+ LANDMARK_TAGS,
2581
2676
  ({ tag, props, implicitRole }) => {
2582
2677
  if (!LANDMARK_TAG_SET.has(tag) || !implicitRole) return [];
2583
- const role = props.role;
2678
+ const { role } = props;
2584
2679
  if (!role || role === implicitRole) return [];
2585
2680
  const diagnostic = HtmlDiagnostics.landmarkRoleOverride(tag, implicitRole, role);
2586
2681
  return [
@@ -2592,8 +2687,7 @@ var landmarkRoleRule = Object.assign(
2592
2687
  diagnostic
2593
2688
  }
2594
2689
  ];
2595
- },
2596
- { tags: [...LANDMARK_TAG_SET] }
2690
+ }
2597
2691
  );
2598
2692
  function requireAccessibleName({ tag, props }) {
2599
2693
  if ("aria-label" in props || "aria-labelledby" in props) return [];
@@ -2606,38 +2700,44 @@ function requireAccessibleName({ tag, props }) {
2606
2700
  }
2607
2701
  ];
2608
2702
  }
2609
- var NAMED_LANDMARK_TAGS = /* @__PURE__ */ new Set(["nav", "aside"]);
2610
- var landmarkNameAdvisory = Object.assign(
2703
+ var NAMED_LANDMARK_TAGS = ["nav", "aside"];
2704
+ var NAMED_LANDMARK_TAG_SET = new Set(NAMED_LANDMARK_TAGS);
2705
+ var landmarkAccessibleNameRule = defineAriaRule(
2706
+ NAMED_LANDMARK_TAGS,
2611
2707
  (ctx) => {
2612
- if (!ctx.implicitRole || !NAMED_LANDMARK_TAGS.has(ctx.tag)) return [];
2708
+ if (!ctx.implicitRole || !NAMED_LANDMARK_TAG_SET.has(ctx.tag)) return [];
2613
2709
  return requireAccessibleName(ctx);
2614
- },
2615
- { tags: [...NAMED_LANDMARK_TAGS] }
2710
+ }
2616
2711
  );
2617
2712
  var HTML_ARIA_RULES = [
2618
2713
  landmarkRoleRule,
2619
- landmarkNameAdvisory,
2714
+ landmarkAccessibleNameRule,
2620
2715
  roleNotPermittedRule,
2621
2716
  ...INPUT_RULES
2622
2717
  ];
2623
2718
 
2624
- // ../core/src/html/contracts.ts
2719
+ // ../core/src/html/contracts/helpers.ts
2625
2720
  import { warnDiagnostics } from "../_shared/diagnostics.js";
2721
+ function isVNodeLike(child) {
2722
+ return isObject(child) && "type" in child;
2723
+ }
2626
2724
  function isOpenContent(...blockedTags) {
2627
2725
  const set2 = new Set(blockedTags);
2628
2726
  return (child) => {
2629
- if (!isObject(child) || !("type" in child)) return false;
2727
+ if (!isVNodeLike(child)) return false;
2630
2728
  const tag = getTag(child);
2631
2729
  return tag === void 0 || !set2.has(tag);
2632
2730
  };
2633
2731
  }
2634
- var METADATA_TAGS = ["script", "template"];
2635
2732
  var metadataMatch = isTag(...METADATA_TAGS);
2636
2733
  function metadata(name = "metadata") {
2637
2734
  return { name, match: metadataMatch };
2638
2735
  }
2736
+ function optional(name, tag) {
2737
+ return { name, match: isTag(tag), cardinality: { max: 1 } };
2738
+ }
2639
2739
  function firstOptional(name, tag) {
2640
- return { name, match: isTag(tag), cardinality: { max: 1 }, position: "first" };
2740
+ return { ...optional(name, tag), position: "first" };
2641
2741
  }
2642
2742
  function contract(children, options) {
2643
2743
  return { diagnostics: warnDiagnostics, children, ...options };
@@ -2651,50 +2751,41 @@ function ariaContract(aria) {
2651
2751
  function firstChildContract(name, tag) {
2652
2752
  return contract([firstOptional(name, tag), { name: "content", match: isOpenContent(tag) }]);
2653
2753
  }
2654
- var VOID_TAGS = [
2655
- "area",
2656
- "base",
2657
- "br",
2658
- "col",
2659
- "embed",
2660
- "hr",
2661
- "img",
2662
- "input",
2663
- "link",
2664
- "meta",
2665
- "param",
2666
- "source",
2667
- "track",
2668
- "wbr"
2669
- ];
2670
- var TEXT_ONLY_TAGS = ["option", "script", "style", "textarea", "title"];
2671
- var LANDMARK_TAGS = ["article", "aside", "footer", "header", "main", "nav"];
2672
- var listContract = closedContract([
2673
- { name: "list-item", match: isTag("li", ...METADATA_TAGS) }
2674
- ]);
2675
- var tableContract = closedContract([
2676
- firstOptional("caption", "caption"),
2677
- { name: "colgroup", match: isTag("colgroup") },
2678
- { name: "thead", match: isTag("thead"), cardinality: { max: 1 } },
2679
- { name: "tbody", match: isTag("tbody") },
2680
- { name: "tfoot", match: isTag("tfoot"), cardinality: { max: 1 } },
2681
- { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2682
- ]);
2683
- var tableBodyContract = closedContract([
2684
- { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2685
- ]);
2686
- var tableRowContract = closedContract([
2687
- { name: "table-cell", match: isTag("td", "th", ...METADATA_TAGS) }
2688
- ]);
2689
- var colgroupContract = closedContract([
2690
- { name: "column", match: isTag("col", "template") }
2754
+ function getChildProp(child, key) {
2755
+ if (!isVNodeLike(child)) return void 0;
2756
+ const { props } = child;
2757
+ if (!isObject(props)) return void 0;
2758
+ return props[key];
2759
+ }
2760
+
2761
+ // ../core/src/html/contracts/aria/landmarks.ts
2762
+ var landmarkContract = ariaContract([landmarkRoleRule, landmarkAccessibleNameRule]);
2763
+
2764
+ // ../core/src/html/contracts/aria/widgets.ts
2765
+ var dialogContract = ariaContract([requireAccessibleName]);
2766
+ var menuContract = ariaContract([requireAccessibleName]);
2767
+ var menubarContract = ariaContract([requireAccessibleName]);
2768
+ var treeContract = ariaContract([requireAccessibleName]);
2769
+ var gridContract = ariaContract([requireAccessibleName]);
2770
+ var listboxContract = ariaContract([requireAccessibleName]);
2771
+ var tablistContract = ariaContract([requireAccessibleName]);
2772
+ var radiogroupContract = ariaContract([requireAccessibleName]);
2773
+
2774
+ // ../core/src/html/contracts/html/document.ts
2775
+ var headContract = closedContract([
2776
+ {
2777
+ name: "metadata",
2778
+ match: isTag("base", "link", "meta", "noscript", "script", "style", "template", "title")
2779
+ }
2691
2780
  ]);
2692
- var dlContract = closedContract([
2693
- { name: "term", match: isTag("dt") },
2694
- { name: "description", match: isTag("dd") },
2695
- { name: "group", match: isTag("div") },
2696
- metadata()
2781
+ var htmlContract = closedContract([
2782
+ { name: "head", match: isTag("head"), cardinality: { min: 1, max: 1 }, position: "first" },
2783
+ { name: "body", match: isTag("body"), cardinality: { min: 1, max: 1 } }
2697
2784
  ]);
2785
+ var voidContract = contract([], { exclusiveChildren: true, allowText: false });
2786
+ var textOnlyContract = contract([], { exclusiveChildren: true });
2787
+
2788
+ // ../core/src/html/contracts/html/forms.ts
2698
2789
  var selectContract = closedContract([
2699
2790
  { name: "option", match: isTag("option", "optgroup", "hr", ...METADATA_TAGS) }
2700
2791
  ]);
@@ -2704,6 +2795,45 @@ var optgroupContract = closedContract([
2704
2795
  var datalistContract = closedContract([
2705
2796
  { name: "option", match: isTag("option", ...METADATA_TAGS) }
2706
2797
  ]);
2798
+ var buttonContract = closedContract([
2799
+ { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2800
+ ]);
2801
+ var anchorContract = closedContract([
2802
+ { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2803
+ ]);
2804
+ var labelableTagMatch = isTag(...LABELABLE_TAGS);
2805
+ function isLabelableControl(child) {
2806
+ if (!labelableTagMatch(child)) return false;
2807
+ if (getTag(child) !== "input") return true;
2808
+ const type = getChildProp(child, "type");
2809
+ return !isString(type) || type !== "hidden";
2810
+ }
2811
+ var labelContract = contract([
2812
+ { name: "control", match: isLabelableControl, cardinality: { max: 1 } },
2813
+ { name: "nested-label", match: isTag("label"), cardinality: { max: 0 } },
2814
+ {
2815
+ name: "other-interactive-content",
2816
+ match: isTag(...OTHER_INTERACTIVE_TAGS),
2817
+ cardinality: { max: 0 }
2818
+ }
2819
+ ]);
2820
+
2821
+ // ../core/src/html/contracts/html/grouping.ts
2822
+ var detailsContract = firstChildContract("summary", "summary");
2823
+ var fieldsetContract = firstChildContract("legend", "legend");
2824
+
2825
+ // ../core/src/html/contracts/html/lists.ts
2826
+ var listContract = closedContract([
2827
+ { name: "list-item", match: isTag("li", ...METADATA_TAGS) }
2828
+ ]);
2829
+ var dlContract = closedContract([
2830
+ { name: "term", match: isTag("dt") },
2831
+ { name: "description", match: isTag("dd") },
2832
+ { name: "group", match: isTag("div") },
2833
+ metadata()
2834
+ ]);
2835
+
2836
+ // ../core/src/html/contracts/html/media.ts
2707
2837
  var pictureContract = closedContract([
2708
2838
  { name: "source", match: isTag("source", ...METADATA_TAGS) },
2709
2839
  { name: "image", match: isTag("img"), cardinality: { min: 1, max: 1 }, position: "last" }
@@ -2712,91 +2842,49 @@ var figureContract = contract([
2712
2842
  { name: "caption", match: isTag("figcaption"), cardinality: { max: 1 } },
2713
2843
  { name: "content", match: isOpenContent("figcaption") }
2714
2844
  ]);
2715
- var detailsContract = firstChildContract("summary", "summary");
2716
- var fieldsetContract = firstChildContract("legend", "legend");
2717
2845
  var objectContract = contract([
2718
2846
  { name: "param", match: isTag("param") },
2719
2847
  { name: "content", match: isOpenContent("param") }
2720
2848
  ]);
2721
- var INTERACTIVE_CONTENT_TAGS = ["a", "button", "input", "select", "textarea", "label"];
2722
- var buttonContract = closedContract([
2723
- { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2724
- ]);
2725
- var anchorContract = closedContract([
2726
- { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2727
- ]);
2728
- var LABELABLE_TAGS = [
2729
- "button",
2730
- "input",
2731
- "meter",
2732
- "output",
2733
- "progress",
2734
- "select",
2735
- "textarea"
2736
- ];
2737
- var labelContract = contract([
2738
- { name: "control", match: isTag(...LABELABLE_TAGS), cardinality: { max: 1 } }
2739
- ]);
2740
- var P_BLOCKED_TAGS = [
2741
- "address",
2742
- "article",
2743
- "aside",
2744
- "blockquote",
2745
- "details",
2746
- "dialog",
2747
- "div",
2748
- "dl",
2749
- "fieldset",
2750
- "figure",
2751
- "footer",
2752
- "form",
2753
- "h1",
2754
- "h2",
2755
- "h3",
2756
- "h4",
2757
- "h5",
2758
- "h6",
2759
- "header",
2760
- "hr",
2761
- "main",
2762
- "nav",
2763
- "ol",
2764
- "p",
2765
- "pre",
2766
- "section",
2767
- "table",
2768
- "ul"
2769
- ];
2770
- var pContract = closedContract([
2771
- { name: "content", match: isOpenContent(...P_BLOCKED_TAGS) }
2772
- ]);
2773
2849
  var mediaContract = contract([
2774
2850
  { name: "source", match: isTag("source") },
2775
2851
  { name: "track", match: isTag("track") },
2776
2852
  metadata(),
2777
2853
  { name: "content", match: isOpenContent("source", "track", ...METADATA_TAGS) }
2778
2854
  ]);
2779
- var headContract = closedContract([
2780
- {
2781
- name: "metadata",
2782
- match: isTag("base", "link", "meta", "noscript", "script", "style", "template", "title")
2783
- }
2855
+
2856
+ // ../core/src/html/contracts/html/tables.ts
2857
+ var tableContract = closedContract([
2858
+ firstOptional("caption", "caption"),
2859
+ { name: "colgroup", match: isTag("colgroup") },
2860
+ { name: "thead", match: isTag("thead"), cardinality: { max: 1 } },
2861
+ { name: "tbody", match: isTag("tbody") },
2862
+ { name: "tfoot", match: isTag("tfoot"), cardinality: { max: 1 } },
2863
+ { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2784
2864
  ]);
2785
- var htmlContract = closedContract([
2786
- { name: "head", match: isTag("head"), cardinality: { min: 1, max: 1 }, position: "first" },
2787
- { name: "body", match: isTag("body"), cardinality: { min: 1, max: 1 } }
2865
+ var tableBodyContract = closedContract([
2866
+ { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2788
2867
  ]);
2789
- var voidContract = contract([], { exclusiveChildren: true, allowText: false });
2790
- var textOnlyContract = contract([], { exclusiveChildren: true });
2791
- var landmarkContract = ariaContract([landmarkRoleRule, landmarkNameAdvisory]);
2792
- var dialogContract = ariaContract([requireAccessibleName]);
2793
- var menuContract = ariaContract([requireAccessibleName]);
2794
- var menubarContract = ariaContract([requireAccessibleName]);
2795
- var treeContract = ariaContract([requireAccessibleName]);
2796
- var gridContract = ariaContract([requireAccessibleName]);
2797
- var listboxContract = ariaContract([requireAccessibleName]);
2798
- var tablistContract = ariaContract([requireAccessibleName]);
2799
- var radiogroupContract = ariaContract([requireAccessibleName]);
2868
+ var tableRowContract = closedContract([
2869
+ { name: "table-cell", match: isTag("td", "th", ...METADATA_TAGS) }
2870
+ ]);
2871
+ var colgroupContract = closedContract([
2872
+ { name: "column", match: isTag("col", "template") }
2873
+ ]);
2874
+
2875
+ // ../core/src/html/contracts/html/text.ts
2876
+ var pContract = closedContract([
2877
+ { name: "content", match: isOpenContent(...P_BLOCKED_TAGS) }
2878
+ ]);
2879
+
2880
+ // ../core/src/html/contracts/build-map.ts
2881
+ function buildMap(groups) {
2882
+ return Object.fromEntries(
2883
+ groups.flatMap(([keys2, value]) => keys2.map((key) => [key, value]))
2884
+ );
2885
+ }
2886
+
2887
+ // ../core/src/html/contracts/maps.ts
2800
2888
  var CONTRACT_GROUPS = [
2801
2889
  [VOID_TAGS, voidContract],
2802
2890
  [TEXT_ONLY_TAGS, textOnlyContract],
@@ -2805,13 +2893,8 @@ var CONTRACT_GROUPS = [
2805
2893
  [["audio", "video"], mediaContract],
2806
2894
  [["thead", "tbody", "tfoot"], tableBodyContract]
2807
2895
  ];
2808
- function contractMap(groups) {
2809
- return Object.fromEntries(
2810
- groups.flatMap(([tags, enforcement]) => tags.map((tag) => [tag, enforcement]))
2811
- );
2812
- }
2813
2896
  var htmlContracts = {
2814
- ...contractMap(CONTRACT_GROUPS),
2897
+ ...buildMap(CONTRACT_GROUPS),
2815
2898
  table: tableContract,
2816
2899
  tr: tableRowContract,
2817
2900
  colgroup: colgroupContract,