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.
@@ -2244,6 +2244,93 @@ var readonlyProps = ({
2244
2244
  // ../core/src/html/evaluators.ts
2245
2245
  import { warnDiagnostics as warnDiagnostics2 } from "../_shared/diagnostics.js";
2246
2246
 
2247
+ // ../core/src/html/contracts/categories.ts
2248
+ var METADATA_TAGS = ["script", "template"];
2249
+ var VOID_TAGS = [
2250
+ "area",
2251
+ "base",
2252
+ "br",
2253
+ "col",
2254
+ "embed",
2255
+ "hr",
2256
+ "img",
2257
+ "input",
2258
+ "link",
2259
+ "meta",
2260
+ "param",
2261
+ "source",
2262
+ "track",
2263
+ "wbr"
2264
+ ];
2265
+ var TEXT_ONLY_TAGS = [
2266
+ "option",
2267
+ "script",
2268
+ "style",
2269
+ "textarea",
2270
+ "title"
2271
+ ];
2272
+ var LANDMARK_TAGS = [
2273
+ "article",
2274
+ "aside",
2275
+ "footer",
2276
+ "header",
2277
+ "main",
2278
+ "nav"
2279
+ ];
2280
+ var INTERACTIVE_CONTENT_TAGS = [
2281
+ "a",
2282
+ "button",
2283
+ "input",
2284
+ "select",
2285
+ "textarea",
2286
+ "label"
2287
+ ];
2288
+ var LABELABLE_TAGS = [
2289
+ "button",
2290
+ "input",
2291
+ "meter",
2292
+ "output",
2293
+ "progress",
2294
+ "select",
2295
+ "textarea"
2296
+ ];
2297
+ var OTHER_INTERACTIVE_TAGS = [
2298
+ "a",
2299
+ "details",
2300
+ "embed",
2301
+ "iframe"
2302
+ ];
2303
+ var P_BLOCKED_TAGS = [
2304
+ "address",
2305
+ "article",
2306
+ "aside",
2307
+ "blockquote",
2308
+ "details",
2309
+ "dialog",
2310
+ "div",
2311
+ "dl",
2312
+ "fieldset",
2313
+ "figure",
2314
+ "footer",
2315
+ "form",
2316
+ "h1",
2317
+ "h2",
2318
+ "h3",
2319
+ "h4",
2320
+ "h5",
2321
+ "h6",
2322
+ "header",
2323
+ "hr",
2324
+ "main",
2325
+ "nav",
2326
+ "ol",
2327
+ "p",
2328
+ "pre",
2329
+ "section",
2330
+ "table",
2331
+ "ul"
2332
+ ];
2333
+
2247
2334
  // ../core/src/html/spec/vocabulary/input.ts
2248
2335
  var TEXT_INPUT_TYPES = ["text", "search", "url", "tel", "email", "password"];
2249
2336
  var NUMERIC_INPUT_TYPES = [
@@ -2623,7 +2710,11 @@ var ALLOWED_ROLES = {
2623
2710
  "treeitem"
2624
2711
  ],
2625
2712
  dialog: ["alertdialog"],
2626
- fieldset: ["none", "presentation", "radiogroup"]
2713
+ fieldset: ["none", "presentation", "radiogroup"],
2714
+ // `<label>` has no implicit role and no documented alternates — its native labeling
2715
+ // semantics (control association, accessible-name contribution) aren't reproducible via
2716
+ // ARIA, so any explicit `role` should be avoided rather than substituted.
2717
+ label: []
2627
2718
  };
2628
2719
  var ELEMENT_SPECS = {
2629
2720
  input: inputElementSpec,
@@ -2664,7 +2755,10 @@ var roleNotPermittedRule = Object.assign(
2664
2755
  );
2665
2756
 
2666
2757
  // ../core/src/html/aria-rules.ts
2667
- var LANDMARK_TAG_SET = /* @__PURE__ */ new Set(["article", "aside", "footer", "header", "main", "nav"]);
2758
+ function defineAriaRule(tags, rule) {
2759
+ return Object.assign(rule, { tags });
2760
+ }
2761
+ var LANDMARK_TAG_SET = new Set(LANDMARK_TAGS);
2668
2762
  var removeLandmarkRoleOverride = {
2669
2763
  kind: "removeRole",
2670
2764
  apply: ({ props }) => {
@@ -2673,10 +2767,11 @@ var removeLandmarkRoleOverride = {
2673
2767
  return { applied: true, next: rest, previous: props };
2674
2768
  }
2675
2769
  };
2676
- var landmarkRoleRule = Object.assign(
2770
+ var landmarkRoleRule = defineAriaRule(
2771
+ LANDMARK_TAGS,
2677
2772
  ({ tag, props, implicitRole }) => {
2678
2773
  if (!LANDMARK_TAG_SET.has(tag) || !implicitRole) return [];
2679
- const role = props.role;
2774
+ const { role } = props;
2680
2775
  if (!role || role === implicitRole) return [];
2681
2776
  const diagnostic = HtmlDiagnostics.landmarkRoleOverride(tag, implicitRole, role);
2682
2777
  return [
@@ -2688,8 +2783,7 @@ var landmarkRoleRule = Object.assign(
2688
2783
  diagnostic
2689
2784
  }
2690
2785
  ];
2691
- },
2692
- { tags: [...LANDMARK_TAG_SET] }
2786
+ }
2693
2787
  );
2694
2788
  function requireAccessibleName({ tag, props }) {
2695
2789
  if ("aria-label" in props || "aria-labelledby" in props) return [];
@@ -2702,38 +2796,44 @@ function requireAccessibleName({ tag, props }) {
2702
2796
  }
2703
2797
  ];
2704
2798
  }
2705
- var NAMED_LANDMARK_TAGS = /* @__PURE__ */ new Set(["nav", "aside"]);
2706
- var landmarkNameAdvisory = Object.assign(
2799
+ var NAMED_LANDMARK_TAGS = ["nav", "aside"];
2800
+ var NAMED_LANDMARK_TAG_SET = new Set(NAMED_LANDMARK_TAGS);
2801
+ var landmarkAccessibleNameRule = defineAriaRule(
2802
+ NAMED_LANDMARK_TAGS,
2707
2803
  (ctx) => {
2708
- if (!ctx.implicitRole || !NAMED_LANDMARK_TAGS.has(ctx.tag)) return [];
2804
+ if (!ctx.implicitRole || !NAMED_LANDMARK_TAG_SET.has(ctx.tag)) return [];
2709
2805
  return requireAccessibleName(ctx);
2710
- },
2711
- { tags: [...NAMED_LANDMARK_TAGS] }
2806
+ }
2712
2807
  );
2713
2808
  var HTML_ARIA_RULES = [
2714
2809
  landmarkRoleRule,
2715
- landmarkNameAdvisory,
2810
+ landmarkAccessibleNameRule,
2716
2811
  roleNotPermittedRule,
2717
2812
  ...INPUT_RULES
2718
2813
  ];
2719
2814
 
2720
- // ../core/src/html/contracts.ts
2815
+ // ../core/src/html/contracts/helpers.ts
2721
2816
  import { warnDiagnostics } from "../_shared/diagnostics.js";
2817
+ function isVNodeLike(child) {
2818
+ return isObject(child) && "type" in child;
2819
+ }
2722
2820
  function isOpenContent(...blockedTags) {
2723
2821
  const set2 = new Set(blockedTags);
2724
2822
  return (child) => {
2725
- if (!isObject(child) || !("type" in child)) return false;
2823
+ if (!isVNodeLike(child)) return false;
2726
2824
  const tag = getTag(child);
2727
2825
  return tag === void 0 || !set2.has(tag);
2728
2826
  };
2729
2827
  }
2730
- var METADATA_TAGS = ["script", "template"];
2731
2828
  var metadataMatch = isTag(...METADATA_TAGS);
2732
2829
  function metadata(name = "metadata") {
2733
2830
  return { name, match: metadataMatch };
2734
2831
  }
2832
+ function optional(name, tag) {
2833
+ return { name, match: isTag(tag), cardinality: { max: 1 } };
2834
+ }
2735
2835
  function firstOptional(name, tag) {
2736
- return { name, match: isTag(tag), cardinality: { max: 1 }, position: "first" };
2836
+ return { ...optional(name, tag), position: "first" };
2737
2837
  }
2738
2838
  function contract(children, options) {
2739
2839
  return { diagnostics: warnDiagnostics, children, ...options };
@@ -2747,50 +2847,41 @@ function ariaContract(aria) {
2747
2847
  function firstChildContract(name, tag) {
2748
2848
  return contract([firstOptional(name, tag), { name: "content", match: isOpenContent(tag) }]);
2749
2849
  }
2750
- var VOID_TAGS = [
2751
- "area",
2752
- "base",
2753
- "br",
2754
- "col",
2755
- "embed",
2756
- "hr",
2757
- "img",
2758
- "input",
2759
- "link",
2760
- "meta",
2761
- "param",
2762
- "source",
2763
- "track",
2764
- "wbr"
2765
- ];
2766
- var TEXT_ONLY_TAGS = ["option", "script", "style", "textarea", "title"];
2767
- var LANDMARK_TAGS = ["article", "aside", "footer", "header", "main", "nav"];
2768
- var listContract = closedContract([
2769
- { name: "list-item", match: isTag("li", ...METADATA_TAGS) }
2770
- ]);
2771
- var tableContract = closedContract([
2772
- firstOptional("caption", "caption"),
2773
- { name: "colgroup", match: isTag("colgroup") },
2774
- { name: "thead", match: isTag("thead"), cardinality: { max: 1 } },
2775
- { name: "tbody", match: isTag("tbody") },
2776
- { name: "tfoot", match: isTag("tfoot"), cardinality: { max: 1 } },
2777
- { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2778
- ]);
2779
- var tableBodyContract = closedContract([
2780
- { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2781
- ]);
2782
- var tableRowContract = closedContract([
2783
- { name: "table-cell", match: isTag("td", "th", ...METADATA_TAGS) }
2784
- ]);
2785
- var colgroupContract = closedContract([
2786
- { name: "column", match: isTag("col", "template") }
2850
+ function getChildProp(child, key) {
2851
+ if (!isVNodeLike(child)) return void 0;
2852
+ const { props } = child;
2853
+ if (!isObject(props)) return void 0;
2854
+ return props[key];
2855
+ }
2856
+
2857
+ // ../core/src/html/contracts/aria/landmarks.ts
2858
+ var landmarkContract = ariaContract([landmarkRoleRule, landmarkAccessibleNameRule]);
2859
+
2860
+ // ../core/src/html/contracts/aria/widgets.ts
2861
+ var dialogContract = ariaContract([requireAccessibleName]);
2862
+ var menuContract = ariaContract([requireAccessibleName]);
2863
+ var menubarContract = ariaContract([requireAccessibleName]);
2864
+ var treeContract = ariaContract([requireAccessibleName]);
2865
+ var gridContract = ariaContract([requireAccessibleName]);
2866
+ var listboxContract = ariaContract([requireAccessibleName]);
2867
+ var tablistContract = ariaContract([requireAccessibleName]);
2868
+ var radiogroupContract = ariaContract([requireAccessibleName]);
2869
+
2870
+ // ../core/src/html/contracts/html/document.ts
2871
+ var headContract = closedContract([
2872
+ {
2873
+ name: "metadata",
2874
+ match: isTag("base", "link", "meta", "noscript", "script", "style", "template", "title")
2875
+ }
2787
2876
  ]);
2788
- var dlContract = closedContract([
2789
- { name: "term", match: isTag("dt") },
2790
- { name: "description", match: isTag("dd") },
2791
- { name: "group", match: isTag("div") },
2792
- metadata()
2877
+ var htmlContract = closedContract([
2878
+ { name: "head", match: isTag("head"), cardinality: { min: 1, max: 1 }, position: "first" },
2879
+ { name: "body", match: isTag("body"), cardinality: { min: 1, max: 1 } }
2793
2880
  ]);
2881
+ var voidContract = contract([], { exclusiveChildren: true, allowText: false });
2882
+ var textOnlyContract = contract([], { exclusiveChildren: true });
2883
+
2884
+ // ../core/src/html/contracts/html/forms.ts
2794
2885
  var selectContract = closedContract([
2795
2886
  { name: "option", match: isTag("option", "optgroup", "hr", ...METADATA_TAGS) }
2796
2887
  ]);
@@ -2800,6 +2891,45 @@ var optgroupContract = closedContract([
2800
2891
  var datalistContract = closedContract([
2801
2892
  { name: "option", match: isTag("option", ...METADATA_TAGS) }
2802
2893
  ]);
2894
+ var buttonContract = closedContract([
2895
+ { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2896
+ ]);
2897
+ var anchorContract = closedContract([
2898
+ { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2899
+ ]);
2900
+ var labelableTagMatch = isTag(...LABELABLE_TAGS);
2901
+ function isLabelableControl(child) {
2902
+ if (!labelableTagMatch(child)) return false;
2903
+ if (getTag(child) !== "input") return true;
2904
+ const type = getChildProp(child, "type");
2905
+ return !isString(type) || type !== "hidden";
2906
+ }
2907
+ var labelContract = contract([
2908
+ { name: "control", match: isLabelableControl, cardinality: { max: 1 } },
2909
+ { name: "nested-label", match: isTag("label"), cardinality: { max: 0 } },
2910
+ {
2911
+ name: "other-interactive-content",
2912
+ match: isTag(...OTHER_INTERACTIVE_TAGS),
2913
+ cardinality: { max: 0 }
2914
+ }
2915
+ ]);
2916
+
2917
+ // ../core/src/html/contracts/html/grouping.ts
2918
+ var detailsContract = firstChildContract("summary", "summary");
2919
+ var fieldsetContract = firstChildContract("legend", "legend");
2920
+
2921
+ // ../core/src/html/contracts/html/lists.ts
2922
+ var listContract = closedContract([
2923
+ { name: "list-item", match: isTag("li", ...METADATA_TAGS) }
2924
+ ]);
2925
+ var dlContract = closedContract([
2926
+ { name: "term", match: isTag("dt") },
2927
+ { name: "description", match: isTag("dd") },
2928
+ { name: "group", match: isTag("div") },
2929
+ metadata()
2930
+ ]);
2931
+
2932
+ // ../core/src/html/contracts/html/media.ts
2803
2933
  var pictureContract = closedContract([
2804
2934
  { name: "source", match: isTag("source", ...METADATA_TAGS) },
2805
2935
  { name: "image", match: isTag("img"), cardinality: { min: 1, max: 1 }, position: "last" }
@@ -2808,91 +2938,49 @@ var figureContract = contract([
2808
2938
  { name: "caption", match: isTag("figcaption"), cardinality: { max: 1 } },
2809
2939
  { name: "content", match: isOpenContent("figcaption") }
2810
2940
  ]);
2811
- var detailsContract = firstChildContract("summary", "summary");
2812
- var fieldsetContract = firstChildContract("legend", "legend");
2813
2941
  var objectContract = contract([
2814
2942
  { name: "param", match: isTag("param") },
2815
2943
  { name: "content", match: isOpenContent("param") }
2816
2944
  ]);
2817
- var INTERACTIVE_CONTENT_TAGS = ["a", "button", "input", "select", "textarea", "label"];
2818
- var buttonContract = closedContract([
2819
- { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2820
- ]);
2821
- var anchorContract = closedContract([
2822
- { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2823
- ]);
2824
- var LABELABLE_TAGS = [
2825
- "button",
2826
- "input",
2827
- "meter",
2828
- "output",
2829
- "progress",
2830
- "select",
2831
- "textarea"
2832
- ];
2833
- var labelContract = contract([
2834
- { name: "control", match: isTag(...LABELABLE_TAGS), cardinality: { max: 1 } }
2835
- ]);
2836
- var P_BLOCKED_TAGS = [
2837
- "address",
2838
- "article",
2839
- "aside",
2840
- "blockquote",
2841
- "details",
2842
- "dialog",
2843
- "div",
2844
- "dl",
2845
- "fieldset",
2846
- "figure",
2847
- "footer",
2848
- "form",
2849
- "h1",
2850
- "h2",
2851
- "h3",
2852
- "h4",
2853
- "h5",
2854
- "h6",
2855
- "header",
2856
- "hr",
2857
- "main",
2858
- "nav",
2859
- "ol",
2860
- "p",
2861
- "pre",
2862
- "section",
2863
- "table",
2864
- "ul"
2865
- ];
2866
- var pContract = closedContract([
2867
- { name: "content", match: isOpenContent(...P_BLOCKED_TAGS) }
2868
- ]);
2869
2945
  var mediaContract = contract([
2870
2946
  { name: "source", match: isTag("source") },
2871
2947
  { name: "track", match: isTag("track") },
2872
2948
  metadata(),
2873
2949
  { name: "content", match: isOpenContent("source", "track", ...METADATA_TAGS) }
2874
2950
  ]);
2875
- var headContract = closedContract([
2876
- {
2877
- name: "metadata",
2878
- match: isTag("base", "link", "meta", "noscript", "script", "style", "template", "title")
2879
- }
2951
+
2952
+ // ../core/src/html/contracts/html/tables.ts
2953
+ var tableContract = closedContract([
2954
+ firstOptional("caption", "caption"),
2955
+ { name: "colgroup", match: isTag("colgroup") },
2956
+ { name: "thead", match: isTag("thead"), cardinality: { max: 1 } },
2957
+ { name: "tbody", match: isTag("tbody") },
2958
+ { name: "tfoot", match: isTag("tfoot"), cardinality: { max: 1 } },
2959
+ { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2880
2960
  ]);
2881
- var htmlContract = closedContract([
2882
- { name: "head", match: isTag("head"), cardinality: { min: 1, max: 1 }, position: "first" },
2883
- { name: "body", match: isTag("body"), cardinality: { min: 1, max: 1 } }
2961
+ var tableBodyContract = closedContract([
2962
+ { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2884
2963
  ]);
2885
- var voidContract = contract([], { exclusiveChildren: true, allowText: false });
2886
- var textOnlyContract = contract([], { exclusiveChildren: true });
2887
- var landmarkContract = ariaContract([landmarkRoleRule, landmarkNameAdvisory]);
2888
- var dialogContract = ariaContract([requireAccessibleName]);
2889
- var menuContract = ariaContract([requireAccessibleName]);
2890
- var menubarContract = ariaContract([requireAccessibleName]);
2891
- var treeContract = ariaContract([requireAccessibleName]);
2892
- var gridContract = ariaContract([requireAccessibleName]);
2893
- var listboxContract = ariaContract([requireAccessibleName]);
2894
- var tablistContract = ariaContract([requireAccessibleName]);
2895
- var radiogroupContract = ariaContract([requireAccessibleName]);
2964
+ var tableRowContract = closedContract([
2965
+ { name: "table-cell", match: isTag("td", "th", ...METADATA_TAGS) }
2966
+ ]);
2967
+ var colgroupContract = closedContract([
2968
+ { name: "column", match: isTag("col", "template") }
2969
+ ]);
2970
+
2971
+ // ../core/src/html/contracts/html/text.ts
2972
+ var pContract = closedContract([
2973
+ { name: "content", match: isOpenContent(...P_BLOCKED_TAGS) }
2974
+ ]);
2975
+
2976
+ // ../core/src/html/contracts/build-map.ts
2977
+ function buildMap(groups) {
2978
+ return Object.fromEntries(
2979
+ groups.flatMap(([keys2, value]) => keys2.map((key) => [key, value]))
2980
+ );
2981
+ }
2982
+
2983
+ // ../core/src/html/contracts/maps.ts
2896
2984
  var CONTRACT_GROUPS = [
2897
2985
  [VOID_TAGS, voidContract],
2898
2986
  [TEXT_ONLY_TAGS, textOnlyContract],
@@ -2901,13 +2989,8 @@ var CONTRACT_GROUPS = [
2901
2989
  [["audio", "video"], mediaContract],
2902
2990
  [["thead", "tbody", "tfoot"], tableBodyContract]
2903
2991
  ];
2904
- function contractMap(groups) {
2905
- return Object.fromEntries(
2906
- groups.flatMap(([tags, enforcement]) => tags.map((tag) => [tag, enforcement]))
2907
- );
2908
- }
2909
2992
  var htmlContracts = {
2910
- ...contractMap(CONTRACT_GROUPS),
2993
+ ...buildMap(CONTRACT_GROUPS),
2911
2994
  table: tableContract,
2912
2995
  tr: tableRowContract,
2913
2996
  colgroup: colgroupContract,