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.
@@ -2285,6 +2285,93 @@ var readonlyProps = ({
2285
2285
  // ../core/src/html/evaluators.ts
2286
2286
  import { warnDiagnostics as warnDiagnostics2 } from "../_shared/diagnostics.js";
2287
2287
 
2288
+ // ../core/src/html/contracts/categories.ts
2289
+ var METADATA_TAGS = ["script", "template"];
2290
+ var VOID_TAGS = [
2291
+ "area",
2292
+ "base",
2293
+ "br",
2294
+ "col",
2295
+ "embed",
2296
+ "hr",
2297
+ "img",
2298
+ "input",
2299
+ "link",
2300
+ "meta",
2301
+ "param",
2302
+ "source",
2303
+ "track",
2304
+ "wbr"
2305
+ ];
2306
+ var TEXT_ONLY_TAGS = [
2307
+ "option",
2308
+ "script",
2309
+ "style",
2310
+ "textarea",
2311
+ "title"
2312
+ ];
2313
+ var LANDMARK_TAGS = [
2314
+ "article",
2315
+ "aside",
2316
+ "footer",
2317
+ "header",
2318
+ "main",
2319
+ "nav"
2320
+ ];
2321
+ var INTERACTIVE_CONTENT_TAGS = [
2322
+ "a",
2323
+ "button",
2324
+ "input",
2325
+ "select",
2326
+ "textarea",
2327
+ "label"
2328
+ ];
2329
+ var LABELABLE_TAGS = [
2330
+ "button",
2331
+ "input",
2332
+ "meter",
2333
+ "output",
2334
+ "progress",
2335
+ "select",
2336
+ "textarea"
2337
+ ];
2338
+ var OTHER_INTERACTIVE_TAGS = [
2339
+ "a",
2340
+ "details",
2341
+ "embed",
2342
+ "iframe"
2343
+ ];
2344
+ var P_BLOCKED_TAGS = [
2345
+ "address",
2346
+ "article",
2347
+ "aside",
2348
+ "blockquote",
2349
+ "details",
2350
+ "dialog",
2351
+ "div",
2352
+ "dl",
2353
+ "fieldset",
2354
+ "figure",
2355
+ "footer",
2356
+ "form",
2357
+ "h1",
2358
+ "h2",
2359
+ "h3",
2360
+ "h4",
2361
+ "h5",
2362
+ "h6",
2363
+ "header",
2364
+ "hr",
2365
+ "main",
2366
+ "nav",
2367
+ "ol",
2368
+ "p",
2369
+ "pre",
2370
+ "section",
2371
+ "table",
2372
+ "ul"
2373
+ ];
2374
+
2288
2375
  // ../core/src/html/spec/vocabulary/input.ts
2289
2376
  var TEXT_INPUT_TYPES = ["text", "search", "url", "tel", "email", "password"];
2290
2377
  var NUMERIC_INPUT_TYPES = [
@@ -2664,7 +2751,11 @@ var ALLOWED_ROLES = {
2664
2751
  "treeitem"
2665
2752
  ],
2666
2753
  dialog: ["alertdialog"],
2667
- fieldset: ["none", "presentation", "radiogroup"]
2754
+ fieldset: ["none", "presentation", "radiogroup"],
2755
+ // `<label>` has no implicit role and no documented alternates — its native labeling
2756
+ // semantics (control association, accessible-name contribution) aren't reproducible via
2757
+ // ARIA, so any explicit `role` should be avoided rather than substituted.
2758
+ label: []
2668
2759
  };
2669
2760
  var ELEMENT_SPECS = {
2670
2761
  input: inputElementSpec,
@@ -2705,7 +2796,10 @@ var roleNotPermittedRule = Object.assign(
2705
2796
  );
2706
2797
 
2707
2798
  // ../core/src/html/aria-rules.ts
2708
- var LANDMARK_TAG_SET = /* @__PURE__ */ new Set(["article", "aside", "footer", "header", "main", "nav"]);
2799
+ function defineAriaRule(tags, rule) {
2800
+ return Object.assign(rule, { tags });
2801
+ }
2802
+ var LANDMARK_TAG_SET = new Set(LANDMARK_TAGS);
2709
2803
  var removeLandmarkRoleOverride = {
2710
2804
  kind: "removeRole",
2711
2805
  apply: ({ props }) => {
@@ -2714,10 +2808,11 @@ var removeLandmarkRoleOverride = {
2714
2808
  return { applied: true, next: rest, previous: props };
2715
2809
  }
2716
2810
  };
2717
- var landmarkRoleRule = Object.assign(
2811
+ var landmarkRoleRule = defineAriaRule(
2812
+ LANDMARK_TAGS,
2718
2813
  ({ tag, props, implicitRole }) => {
2719
2814
  if (!LANDMARK_TAG_SET.has(tag) || !implicitRole) return [];
2720
- const role = props.role;
2815
+ const { role } = props;
2721
2816
  if (!role || role === implicitRole) return [];
2722
2817
  const diagnostic = HtmlDiagnostics.landmarkRoleOverride(tag, implicitRole, role);
2723
2818
  return [
@@ -2729,8 +2824,7 @@ var landmarkRoleRule = Object.assign(
2729
2824
  diagnostic
2730
2825
  }
2731
2826
  ];
2732
- },
2733
- { tags: [...LANDMARK_TAG_SET] }
2827
+ }
2734
2828
  );
2735
2829
  function requireAccessibleName({ tag, props }) {
2736
2830
  if ("aria-label" in props || "aria-labelledby" in props) return [];
@@ -2743,38 +2837,44 @@ function requireAccessibleName({ tag, props }) {
2743
2837
  }
2744
2838
  ];
2745
2839
  }
2746
- var NAMED_LANDMARK_TAGS = /* @__PURE__ */ new Set(["nav", "aside"]);
2747
- var landmarkNameAdvisory = Object.assign(
2840
+ var NAMED_LANDMARK_TAGS = ["nav", "aside"];
2841
+ var NAMED_LANDMARK_TAG_SET = new Set(NAMED_LANDMARK_TAGS);
2842
+ var landmarkAccessibleNameRule = defineAriaRule(
2843
+ NAMED_LANDMARK_TAGS,
2748
2844
  (ctx) => {
2749
- if (!ctx.implicitRole || !NAMED_LANDMARK_TAGS.has(ctx.tag)) return [];
2845
+ if (!ctx.implicitRole || !NAMED_LANDMARK_TAG_SET.has(ctx.tag)) return [];
2750
2846
  return requireAccessibleName(ctx);
2751
- },
2752
- { tags: [...NAMED_LANDMARK_TAGS] }
2847
+ }
2753
2848
  );
2754
2849
  var HTML_ARIA_RULES = [
2755
2850
  landmarkRoleRule,
2756
- landmarkNameAdvisory,
2851
+ landmarkAccessibleNameRule,
2757
2852
  roleNotPermittedRule,
2758
2853
  ...INPUT_RULES
2759
2854
  ];
2760
2855
 
2761
- // ../core/src/html/contracts.ts
2856
+ // ../core/src/html/contracts/helpers.ts
2762
2857
  import { warnDiagnostics } from "../_shared/diagnostics.js";
2858
+ function isVNodeLike(child) {
2859
+ return isObject(child) && "type" in child;
2860
+ }
2763
2861
  function isOpenContent(...blockedTags) {
2764
2862
  const set2 = new Set(blockedTags);
2765
2863
  return (child) => {
2766
- if (!isObject(child) || !("type" in child)) return false;
2864
+ if (!isVNodeLike(child)) return false;
2767
2865
  const tag = getTag(child);
2768
2866
  return tag === void 0 || !set2.has(tag);
2769
2867
  };
2770
2868
  }
2771
- var METADATA_TAGS = ["script", "template"];
2772
2869
  var metadataMatch = isTag(...METADATA_TAGS);
2773
2870
  function metadata(name = "metadata") {
2774
2871
  return { name, match: metadataMatch };
2775
2872
  }
2873
+ function optional(name, tag) {
2874
+ return { name, match: isTag(tag), cardinality: { max: 1 } };
2875
+ }
2776
2876
  function firstOptional(name, tag) {
2777
- return { name, match: isTag(tag), cardinality: { max: 1 }, position: "first" };
2877
+ return { ...optional(name, tag), position: "first" };
2778
2878
  }
2779
2879
  function contract(children, options) {
2780
2880
  return { diagnostics: warnDiagnostics, children, ...options };
@@ -2788,50 +2888,41 @@ function ariaContract(aria) {
2788
2888
  function firstChildContract(name, tag) {
2789
2889
  return contract([firstOptional(name, tag), { name: "content", match: isOpenContent(tag) }]);
2790
2890
  }
2791
- var VOID_TAGS = [
2792
- "area",
2793
- "base",
2794
- "br",
2795
- "col",
2796
- "embed",
2797
- "hr",
2798
- "img",
2799
- "input",
2800
- "link",
2801
- "meta",
2802
- "param",
2803
- "source",
2804
- "track",
2805
- "wbr"
2806
- ];
2807
- var TEXT_ONLY_TAGS = ["option", "script", "style", "textarea", "title"];
2808
- var LANDMARK_TAGS = ["article", "aside", "footer", "header", "main", "nav"];
2809
- var listContract = closedContract([
2810
- { name: "list-item", match: isTag("li", ...METADATA_TAGS) }
2811
- ]);
2812
- var tableContract = closedContract([
2813
- firstOptional("caption", "caption"),
2814
- { name: "colgroup", match: isTag("colgroup") },
2815
- { name: "thead", match: isTag("thead"), cardinality: { max: 1 } },
2816
- { name: "tbody", match: isTag("tbody") },
2817
- { name: "tfoot", match: isTag("tfoot"), cardinality: { max: 1 } },
2818
- { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2819
- ]);
2820
- var tableBodyContract = closedContract([
2821
- { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2822
- ]);
2823
- var tableRowContract = closedContract([
2824
- { name: "table-cell", match: isTag("td", "th", ...METADATA_TAGS) }
2825
- ]);
2826
- var colgroupContract = closedContract([
2827
- { name: "column", match: isTag("col", "template") }
2891
+ function getChildProp(child, key) {
2892
+ if (!isVNodeLike(child)) return void 0;
2893
+ const { props } = child;
2894
+ if (!isObject(props)) return void 0;
2895
+ return props[key];
2896
+ }
2897
+
2898
+ // ../core/src/html/contracts/aria/landmarks.ts
2899
+ var landmarkContract = ariaContract([landmarkRoleRule, landmarkAccessibleNameRule]);
2900
+
2901
+ // ../core/src/html/contracts/aria/widgets.ts
2902
+ var dialogContract = ariaContract([requireAccessibleName]);
2903
+ var menuContract = ariaContract([requireAccessibleName]);
2904
+ var menubarContract = ariaContract([requireAccessibleName]);
2905
+ var treeContract = ariaContract([requireAccessibleName]);
2906
+ var gridContract = ariaContract([requireAccessibleName]);
2907
+ var listboxContract = ariaContract([requireAccessibleName]);
2908
+ var tablistContract = ariaContract([requireAccessibleName]);
2909
+ var radiogroupContract = ariaContract([requireAccessibleName]);
2910
+
2911
+ // ../core/src/html/contracts/html/document.ts
2912
+ var headContract = closedContract([
2913
+ {
2914
+ name: "metadata",
2915
+ match: isTag("base", "link", "meta", "noscript", "script", "style", "template", "title")
2916
+ }
2828
2917
  ]);
2829
- var dlContract = closedContract([
2830
- { name: "term", match: isTag("dt") },
2831
- { name: "description", match: isTag("dd") },
2832
- { name: "group", match: isTag("div") },
2833
- metadata()
2918
+ var htmlContract = closedContract([
2919
+ { name: "head", match: isTag("head"), cardinality: { min: 1, max: 1 }, position: "first" },
2920
+ { name: "body", match: isTag("body"), cardinality: { min: 1, max: 1 } }
2834
2921
  ]);
2922
+ var voidContract = contract([], { exclusiveChildren: true, allowText: false });
2923
+ var textOnlyContract = contract([], { exclusiveChildren: true });
2924
+
2925
+ // ../core/src/html/contracts/html/forms.ts
2835
2926
  var selectContract = closedContract([
2836
2927
  { name: "option", match: isTag("option", "optgroup", "hr", ...METADATA_TAGS) }
2837
2928
  ]);
@@ -2841,6 +2932,45 @@ var optgroupContract = closedContract([
2841
2932
  var datalistContract = closedContract([
2842
2933
  { name: "option", match: isTag("option", ...METADATA_TAGS) }
2843
2934
  ]);
2935
+ var buttonContract = closedContract([
2936
+ { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2937
+ ]);
2938
+ var anchorContract = closedContract([
2939
+ { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2940
+ ]);
2941
+ var labelableTagMatch = isTag(...LABELABLE_TAGS);
2942
+ function isLabelableControl(child) {
2943
+ if (!labelableTagMatch(child)) return false;
2944
+ if (getTag(child) !== "input") return true;
2945
+ const type = getChildProp(child, "type");
2946
+ return !isString(type) || type !== "hidden";
2947
+ }
2948
+ var labelContract = contract([
2949
+ { name: "control", match: isLabelableControl, cardinality: { max: 1 } },
2950
+ { name: "nested-label", match: isTag("label"), cardinality: { max: 0 } },
2951
+ {
2952
+ name: "other-interactive-content",
2953
+ match: isTag(...OTHER_INTERACTIVE_TAGS),
2954
+ cardinality: { max: 0 }
2955
+ }
2956
+ ]);
2957
+
2958
+ // ../core/src/html/contracts/html/grouping.ts
2959
+ var detailsContract = firstChildContract("summary", "summary");
2960
+ var fieldsetContract = firstChildContract("legend", "legend");
2961
+
2962
+ // ../core/src/html/contracts/html/lists.ts
2963
+ var listContract = closedContract([
2964
+ { name: "list-item", match: isTag("li", ...METADATA_TAGS) }
2965
+ ]);
2966
+ var dlContract = closedContract([
2967
+ { name: "term", match: isTag("dt") },
2968
+ { name: "description", match: isTag("dd") },
2969
+ { name: "group", match: isTag("div") },
2970
+ metadata()
2971
+ ]);
2972
+
2973
+ // ../core/src/html/contracts/html/media.ts
2844
2974
  var pictureContract = closedContract([
2845
2975
  { name: "source", match: isTag("source", ...METADATA_TAGS) },
2846
2976
  { name: "image", match: isTag("img"), cardinality: { min: 1, max: 1 }, position: "last" }
@@ -2849,91 +2979,49 @@ var figureContract = contract([
2849
2979
  { name: "caption", match: isTag("figcaption"), cardinality: { max: 1 } },
2850
2980
  { name: "content", match: isOpenContent("figcaption") }
2851
2981
  ]);
2852
- var detailsContract = firstChildContract("summary", "summary");
2853
- var fieldsetContract = firstChildContract("legend", "legend");
2854
2982
  var objectContract = contract([
2855
2983
  { name: "param", match: isTag("param") },
2856
2984
  { name: "content", match: isOpenContent("param") }
2857
2985
  ]);
2858
- var INTERACTIVE_CONTENT_TAGS = ["a", "button", "input", "select", "textarea", "label"];
2859
- var buttonContract = closedContract([
2860
- { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2861
- ]);
2862
- var anchorContract = closedContract([
2863
- { name: "content", match: isOpenContent(...INTERACTIVE_CONTENT_TAGS) }
2864
- ]);
2865
- var LABELABLE_TAGS = [
2866
- "button",
2867
- "input",
2868
- "meter",
2869
- "output",
2870
- "progress",
2871
- "select",
2872
- "textarea"
2873
- ];
2874
- var labelContract = contract([
2875
- { name: "control", match: isTag(...LABELABLE_TAGS), cardinality: { max: 1 } }
2876
- ]);
2877
- var P_BLOCKED_TAGS = [
2878
- "address",
2879
- "article",
2880
- "aside",
2881
- "blockquote",
2882
- "details",
2883
- "dialog",
2884
- "div",
2885
- "dl",
2886
- "fieldset",
2887
- "figure",
2888
- "footer",
2889
- "form",
2890
- "h1",
2891
- "h2",
2892
- "h3",
2893
- "h4",
2894
- "h5",
2895
- "h6",
2896
- "header",
2897
- "hr",
2898
- "main",
2899
- "nav",
2900
- "ol",
2901
- "p",
2902
- "pre",
2903
- "section",
2904
- "table",
2905
- "ul"
2906
- ];
2907
- var pContract = closedContract([
2908
- { name: "content", match: isOpenContent(...P_BLOCKED_TAGS) }
2909
- ]);
2910
2986
  var mediaContract = contract([
2911
2987
  { name: "source", match: isTag("source") },
2912
2988
  { name: "track", match: isTag("track") },
2913
2989
  metadata(),
2914
2990
  { name: "content", match: isOpenContent("source", "track", ...METADATA_TAGS) }
2915
2991
  ]);
2916
- var headContract = closedContract([
2917
- {
2918
- name: "metadata",
2919
- match: isTag("base", "link", "meta", "noscript", "script", "style", "template", "title")
2920
- }
2992
+
2993
+ // ../core/src/html/contracts/html/tables.ts
2994
+ var tableContract = closedContract([
2995
+ firstOptional("caption", "caption"),
2996
+ { name: "colgroup", match: isTag("colgroup") },
2997
+ { name: "thead", match: isTag("thead"), cardinality: { max: 1 } },
2998
+ { name: "tbody", match: isTag("tbody") },
2999
+ { name: "tfoot", match: isTag("tfoot"), cardinality: { max: 1 } },
3000
+ { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2921
3001
  ]);
2922
- var htmlContract = closedContract([
2923
- { name: "head", match: isTag("head"), cardinality: { min: 1, max: 1 }, position: "first" },
2924
- { name: "body", match: isTag("body"), cardinality: { min: 1, max: 1 } }
3002
+ var tableBodyContract = closedContract([
3003
+ { name: "table-row", match: isTag("tr", ...METADATA_TAGS) }
2925
3004
  ]);
2926
- var voidContract = contract([], { exclusiveChildren: true, allowText: false });
2927
- var textOnlyContract = contract([], { exclusiveChildren: true });
2928
- var landmarkContract = ariaContract([landmarkRoleRule, landmarkNameAdvisory]);
2929
- var dialogContract = ariaContract([requireAccessibleName]);
2930
- var menuContract = ariaContract([requireAccessibleName]);
2931
- var menubarContract = ariaContract([requireAccessibleName]);
2932
- var treeContract = ariaContract([requireAccessibleName]);
2933
- var gridContract = ariaContract([requireAccessibleName]);
2934
- var listboxContract = ariaContract([requireAccessibleName]);
2935
- var tablistContract = ariaContract([requireAccessibleName]);
2936
- var radiogroupContract = ariaContract([requireAccessibleName]);
3005
+ var tableRowContract = closedContract([
3006
+ { name: "table-cell", match: isTag("td", "th", ...METADATA_TAGS) }
3007
+ ]);
3008
+ var colgroupContract = closedContract([
3009
+ { name: "column", match: isTag("col", "template") }
3010
+ ]);
3011
+
3012
+ // ../core/src/html/contracts/html/text.ts
3013
+ var pContract = closedContract([
3014
+ { name: "content", match: isOpenContent(...P_BLOCKED_TAGS) }
3015
+ ]);
3016
+
3017
+ // ../core/src/html/contracts/build-map.ts
3018
+ function buildMap(groups) {
3019
+ return Object.fromEntries(
3020
+ groups.flatMap(([keys2, value]) => keys2.map((key) => [key, value]))
3021
+ );
3022
+ }
3023
+
3024
+ // ../core/src/html/contracts/maps.ts
2937
3025
  var CONTRACT_GROUPS = [
2938
3026
  [VOID_TAGS, voidContract],
2939
3027
  [TEXT_ONLY_TAGS, textOnlyContract],
@@ -2942,13 +3030,8 @@ var CONTRACT_GROUPS = [
2942
3030
  [["audio", "video"], mediaContract],
2943
3031
  [["thead", "tbody", "tfoot"], tableBodyContract]
2944
3032
  ];
2945
- function contractMap(groups) {
2946
- return Object.fromEntries(
2947
- groups.flatMap(([tags, enforcement]) => tags.map((tag) => [tag, enforcement]))
2948
- );
2949
- }
2950
3033
  var htmlContracts = {
2951
- ...contractMap(CONTRACT_GROUPS),
3034
+ ...buildMap(CONTRACT_GROUPS),
2952
3035
  table: tableContract,
2953
3036
  tr: tableRowContract,
2954
3037
  colgroup: colgroupContract,
@@ -12,7 +12,7 @@ import {
12
12
  makeCloneSlotChild,
13
13
  mergeRefs,
14
14
  render
15
- } from "../chunk-OCG5VM4H.js";
15
+ } from "../chunk-6JILZ6GQ.js";
16
16
 
17
17
  // ../../adapters/react/src/current/slot/composeRefs.ts
18
18
  function getChildRef(element) {
@@ -13,7 +13,7 @@ import {
13
13
  makeCloneSlotChild,
14
14
  mergeRefs,
15
15
  render
16
- } from "../chunk-OCG5VM4H.js";
16
+ } from "../chunk-6JILZ6GQ.js";
17
17
 
18
18
  // ../../adapters/react/src/legacy/create-contract-component.ts
19
19
  import { forwardRef as forwardRef2 } from "react";