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