@aloudata/aloudata-design 3.1.0 → 3.1.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.
Files changed (186) hide show
  1. package/dist/AProgress/index.js +10 -0
  2. package/dist/AProgress/index.js.map +1 -1
  3. package/dist/Alert/index.js +3 -1
  4. package/dist/Alert/index.js.map +1 -1
  5. package/dist/Badge/index.js +37 -11
  6. package/dist/Badge/index.js.map +1 -1
  7. package/dist/Breadcrumb/index.js +12 -2
  8. package/dist/Breadcrumb/index.js.map +1 -1
  9. package/dist/Button/index.d.ts +1 -1
  10. package/dist/Button/index.js +20 -6
  11. package/dist/Button/index.js.map +1 -1
  12. package/dist/Card/index.js +1 -1
  13. package/dist/Card/index.js.map +1 -1
  14. package/dist/Carousel/index.js +9 -1
  15. package/dist/Carousel/index.js.map +1 -1
  16. package/dist/Checkbox/index.js +17 -2
  17. package/dist/Checkbox/index.js.map +1 -1
  18. package/dist/Checkbox/type.d.ts +10 -2
  19. package/dist/ColorPicker/index.js +112 -46
  20. package/dist/ColorPicker/index.js.map +1 -1
  21. package/dist/DataPreviewTable/components/Body/Cell.d.ts +2 -0
  22. package/dist/DataPreviewTable/components/Body/Cell.js +9 -1
  23. package/dist/DataPreviewTable/components/Body/Cell.js.map +1 -1
  24. package/dist/DataPreviewTable/components/Body/index.d.ts +1 -0
  25. package/dist/DataPreviewTable/components/Body/index.js +35 -23
  26. package/dist/DataPreviewTable/components/Body/index.js.map +1 -1
  27. package/dist/DataPreviewTable/components/Header/index.d.ts +1 -0
  28. package/dist/DataPreviewTable/components/Header/index.js +36 -28
  29. package/dist/DataPreviewTable/components/Header/index.js.map +1 -1
  30. package/dist/DataPreviewTable/index.js +19 -2
  31. package/dist/DataPreviewTable/index.js.map +1 -1
  32. package/dist/Drawer/index.d.ts +4 -0
  33. package/dist/Drawer/index.js +91 -78
  34. package/dist/Drawer/index.js.map +1 -1
  35. package/dist/Dropdown/index.d.ts +1 -1
  36. package/dist/Dropdown/index.js +64 -13
  37. package/dist/Dropdown/index.js.map +1 -1
  38. package/dist/Form/FormItemContext.d.ts +1 -1
  39. package/dist/Form/FormItemContext.js.map +1 -1
  40. package/dist/Form/index.js +50 -7
  41. package/dist/Form/index.js.map +1 -1
  42. package/dist/IconButton/index.d.ts +2 -2
  43. package/dist/IconButton/index.js +9 -3
  44. package/dist/IconButton/index.js.map +1 -1
  45. package/dist/Input/components/Input/index.js +18 -8
  46. package/dist/Input/components/Input/index.js.map +1 -1
  47. package/dist/Input/components/TextArea/index.js +18 -7
  48. package/dist/Input/components/TextArea/index.js.map +1 -1
  49. package/dist/Input/privateSemanticOwner.d.ts +2 -0
  50. package/dist/Input/privateSemanticOwner.js +1 -0
  51. package/dist/InputNumber/index.js +16 -9
  52. package/dist/InputNumber/index.js.map +1 -1
  53. package/dist/InputNumber/type.d.ts +2 -2
  54. package/dist/LogicTree/components/LogicItem/index.d.ts +2 -1
  55. package/dist/LogicTree/components/LogicItem/index.js +13 -2
  56. package/dist/LogicTree/components/LogicItem/index.js.map +1 -1
  57. package/dist/LogicTree/index.js +2 -0
  58. package/dist/LogicTree/index.js.map +1 -1
  59. package/dist/MemberPicker/components/MemberSelection.d.ts +1 -0
  60. package/dist/MemberPicker/components/MemberSelection.js +83 -94
  61. package/dist/MemberPicker/components/MemberSelection.js.map +1 -1
  62. package/dist/MemberPicker/components/MultipleOption.js +12 -0
  63. package/dist/MemberPicker/components/MultipleOption.js.map +1 -1
  64. package/dist/MemberPicker/components/Panel.d.ts +1 -0
  65. package/dist/MemberPicker/components/Panel.js +4 -1
  66. package/dist/MemberPicker/components/Panel.js.map +1 -1
  67. package/dist/MemberPicker/components/SelectedMemberTags.js +14 -6
  68. package/dist/MemberPicker/components/SelectedMemberTags.js.map +1 -1
  69. package/dist/MemberPicker/components/SingleOption.js +12 -0
  70. package/dist/MemberPicker/components/SingleOption.js.map +1 -1
  71. package/dist/MemberPicker/components/UserGroupSelection.d.ts +2 -1
  72. package/dist/MemberPicker/components/UserGroupSelection.js +61 -48
  73. package/dist/MemberPicker/components/UserGroupSelection.js.map +1 -1
  74. package/dist/MemberPicker/index.js +134 -108
  75. package/dist/MemberPicker/index.js.map +1 -1
  76. package/dist/Menu/index.d.ts +8 -0
  77. package/dist/Menu/index.js +33 -3
  78. package/dist/Menu/index.js.map +1 -1
  79. package/dist/Modal/index.d.ts +4 -0
  80. package/dist/Modal/index.js +55 -66
  81. package/dist/Modal/index.js.map +1 -1
  82. package/dist/OverflowCount/index.js +10 -0
  83. package/dist/OverflowCount/index.js.map +1 -1
  84. package/dist/Pagination/index.js +1 -0
  85. package/dist/Pagination/index.js.map +1 -1
  86. package/dist/Popconfirm/index.js +9 -1
  87. package/dist/Popconfirm/index.js.map +1 -1
  88. package/dist/Popover/index.js +52 -1
  89. package/dist/Popover/index.js.map +1 -1
  90. package/dist/Progress/index.js +4 -0
  91. package/dist/Progress/index.js.map +1 -1
  92. package/dist/Radio/components/Group/index.d.ts +5 -1
  93. package/dist/Radio/components/Group/index.js +7 -2
  94. package/dist/Radio/components/Group/index.js.map +1 -1
  95. package/dist/Radio/components/Radio/index.js +26 -0
  96. package/dist/Radio/components/Radio/index.js.map +1 -1
  97. package/dist/Radio/interface/radio.d.ts +7 -0
  98. package/dist/Radio/interface/radioGroup.d.ts +2 -0
  99. package/dist/RenameInput/index.js +11 -0
  100. package/dist/RenameInput/index.js.map +1 -1
  101. package/dist/Select/BaseSelect.d.ts +3 -0
  102. package/dist/Select/BaseSelect.js +229 -32
  103. package/dist/Select/BaseSelect.js.map +1 -1
  104. package/dist/Select/SelectTrigger.d.ts +2 -0
  105. package/dist/Select/SelectTrigger.js +13 -5
  106. package/dist/Select/SelectTrigger.js.map +1 -1
  107. package/dist/Select/components/OptionCollection.d.ts +41 -0
  108. package/dist/Select/components/OptionCollection.js +124 -0
  109. package/dist/Select/components/OptionCollection.js.map +1 -0
  110. package/dist/Select/index.js +45 -3
  111. package/dist/Select/index.js.map +1 -1
  112. package/dist/Select/interface.d.ts +1 -1
  113. package/dist/Skeleton/index.js +1 -1
  114. package/dist/Skeleton/index.js.map +1 -1
  115. package/dist/Spin/index.d.ts +1 -1
  116. package/dist/Spin/index.js +22 -7
  117. package/dist/Spin/index.js.map +1 -1
  118. package/dist/Switch/index.d.ts +5 -0
  119. package/dist/Switch/index.js +15 -5
  120. package/dist/Switch/index.js.map +1 -1
  121. package/dist/Table/components/Header.js +0 -1
  122. package/dist/Table/components/Header.js.map +1 -1
  123. package/dist/Table/index.js +42 -27
  124. package/dist/Table/index.js.map +1 -1
  125. package/dist/Tabs/index.js +1 -0
  126. package/dist/Tabs/index.js.map +1 -1
  127. package/dist/Tag/index.js +20 -1
  128. package/dist/Tag/index.js.map +1 -1
  129. package/dist/Tooltip/index.js +34 -5
  130. package/dist/Tooltip/index.js.map +1 -1
  131. package/dist/Tour/index.js +13 -1
  132. package/dist/Tour/index.js.map +1 -1
  133. package/dist/Tree/Tree2.js +2 -0
  134. package/dist/Tree/Tree2.js.map +1 -1
  135. package/dist/_utils/dialogAccessibility.d.ts +17 -0
  136. package/dist/_utils/dialogAccessibility.js +110 -0
  137. package/dist/_utils/dialogAccessibility.js.map +1 -0
  138. package/dist/_utils/formControlSemanticOwner.d.ts +3 -0
  139. package/dist/_utils/formControlSemanticOwner.js +17 -0
  140. package/dist/_utils/formControlSemanticOwner.js.map +1 -0
  141. package/dist/_utils/overlayCoordinator.js +1 -11
  142. package/dist/_utils/overlayCoordinator.js.map +1 -1
  143. package/dist/aloudata-design.css +1 -1
  144. package/dist/theme/contract/baselineResolvedTokenValueManifest.d.ts +1 -1
  145. package/dist/theme/contract/darkResolvedTokenValueManifest.d.ts +1 -1
  146. package/dist/theme/generator/acceptedColorValues.d.ts +2 -1
  147. package/dist/theme/generator/baselineTokenValueDelivery.d.ts +9 -1
  148. package/dist/theme/generator/minimalAcceptedColorValues.d.ts +2 -2
  149. package/dist/theme/generator/neutralSourceResolver.d.ts +28 -0
  150. package/dist/theme/generator/neutralSourceResolver.js +2 -0
  151. package/dist/theme/generator/neutralSourceValues.d.ts +27 -0
  152. package/dist/theme/generator/neutralSourceValues.js +2 -0
  153. package/dist/theme/index.d.ts +2 -0
  154. package/dist/theme/index.js +1 -0
  155. package/dist/theme/neutralSourceContract.d.ts +3 -0
  156. package/dist/theme/neutralSourceContract.js +11 -0
  157. package/dist/theme/neutralSourceContract.js.map +1 -0
  158. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.d.ts +1 -1
  159. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js +45 -45
  160. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js.map +1 -1
  161. package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.d.ts +3 -0
  162. package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.js +2 -0
  163. package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.d.ts +3 -0
  164. package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.js +2 -0
  165. package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.d.ts +3 -0
  166. package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.js +2 -0
  167. package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.d.ts +3 -0
  168. package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.js +2 -0
  169. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.d.ts +1 -1
  170. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js +41 -41
  171. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js.map +1 -1
  172. package/dist/theme/runtime/colorValueMode/index.js +2 -12
  173. package/dist/theme/runtime/colorValueMode/index.js.map +1 -1
  174. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.d.ts +2 -0
  175. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js +48 -0
  176. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js.map +1 -0
  177. package/dist/theme/runtime/colorValueMode/registry.d.ts +1 -1
  178. package/dist/theme/runtime/colorValueMode/registry.js +2 -1
  179. package/dist/theme/runtime/colorValueMode/registry.js.map +1 -1
  180. package/dist/theme/runtime/initAldTheme.js +1 -3
  181. package/dist/theme/runtime/initAldTheme.js.map +1 -1
  182. package/dist/theme/runtime/neutralSource/index.d.ts +6 -0
  183. package/dist/theme/runtime/neutralSource/index.js +11 -0
  184. package/dist/theme/runtime/neutralSource/index.js.map +1 -0
  185. package/dist/theme/runtime/neutralSource.d.ts +2 -0
  186. package/package.json +1 -1
@@ -0,0 +1,110 @@
1
+ import { useEffect, useLayoutEffect, useRef } from "react";
2
+ //#region src/_utils/dialogAccessibility.ts
3
+ var FOCUSABLE_SELECTOR = "a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"]):not([disabled])";
4
+ var dialogEscapeEvents = /* @__PURE__ */ new WeakSet();
5
+ function markDialogEscapeEvent(event) {
6
+ dialogEscapeEvents.add(event);
7
+ }
8
+ function shouldDismissDialogEscape(event) {
9
+ return !event.cancelBubble && (!event.defaultPrevented || dialogEscapeEvents.has(event));
10
+ }
11
+ function getDialogFocusableElements(container) {
12
+ return Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR)).filter((element) => {
13
+ if (element.closest("[inert]")) return false;
14
+ if (element.getAttribute("aria-hidden") === "true") return false;
15
+ if (element.getAttribute("aria-disabled") === "true") return false;
16
+ return element.tabIndex >= 0;
17
+ });
18
+ }
19
+ function isDialogChildOverlayActive(container) {
20
+ const activeElement = document.activeElement;
21
+ if (!(activeElement instanceof HTMLElement)) return false;
22
+ const activeOverlay = activeElement.closest("[role=\"dialog\"], [role=\"alertdialog\"], [role=\"menu\"], [role=\"listbox\"]");
23
+ return !!activeOverlay && activeOverlay !== container;
24
+ }
25
+ function focusInitialDialogTarget(container) {
26
+ const activeElement = document.activeElement;
27
+ const activeOverlay = activeElement instanceof HTMLElement ? activeElement.closest("[role=\"dialog\"], [role=\"alertdialog\"], [role=\"menu\"], [role=\"listbox\"]") : null;
28
+ if (activeOverlay && activeOverlay !== container && activeOverlay.getAttribute("role") !== "dialog" && activeOverlay.getAttribute("role") !== "alertdialog") return;
29
+ (getDialogFocusableElements(container).find((element) => element.dataset.overlayClose !== "true") ?? null ?? container).focus({ preventScroll: true });
30
+ }
31
+ function restoreDialogFocus(target) {
32
+ queueMicrotask(() => {
33
+ if (target?.isConnected && target.tabIndex !== -1) {
34
+ target.focus({ preventScroll: true });
35
+ return;
36
+ }
37
+ Array.from(document.querySelectorAll(FOCUSABLE_SELECTOR)).find((element) => {
38
+ if (element.closest("[role=\"dialog\"], [role=\"alertdialog\"]")) return false;
39
+ if (element.closest("[inert]")) return false;
40
+ if (element.getAttribute("aria-disabled") === "true") return false;
41
+ return element.tabIndex >= 0;
42
+ })?.focus({ preventScroll: true });
43
+ });
44
+ }
45
+ function useDialogAccessibility({ open, isTop, keyboard, containerRef, onEscape }) {
46
+ const focusRestoreTargetRef = useRef(null);
47
+ const prevOpenRef = useRef(false);
48
+ useLayoutEffect(() => {
49
+ const wasOpen = prevOpenRef.current;
50
+ if (open && !wasOpen) focusRestoreTargetRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
51
+ if (!open && wasOpen) {
52
+ restoreDialogFocus(focusRestoreTargetRef.current);
53
+ focusRestoreTargetRef.current = null;
54
+ }
55
+ prevOpenRef.current = open;
56
+ }, [open]);
57
+ useEffect(() => {
58
+ if (!open || !isTop || !containerRef.current) return;
59
+ const container = containerRef.current;
60
+ const handleKeyDown = (event) => {
61
+ if (event.key !== "Tab") return;
62
+ if (isDialogChildOverlayActive(container)) return;
63
+ const focusable = getDialogFocusableElements(container);
64
+ if (focusable.length === 0) {
65
+ if (document.activeElement !== container) {
66
+ event.preventDefault();
67
+ container.focus({ preventScroll: true });
68
+ }
69
+ return;
70
+ }
71
+ const first = focusable[0];
72
+ const last = focusable[focusable.length - 1];
73
+ if (event.shiftKey) {
74
+ if (document.activeElement === first || !container.contains(document.activeElement)) {
75
+ event.preventDefault();
76
+ last.focus({ preventScroll: true });
77
+ }
78
+ } else if (document.activeElement === last || !container.contains(document.activeElement)) {
79
+ event.preventDefault();
80
+ first.focus({ preventScroll: true });
81
+ }
82
+ };
83
+ document.addEventListener("keydown", handleKeyDown);
84
+ return () => document.removeEventListener("keydown", handleKeyDown);
85
+ }, [
86
+ containerRef,
87
+ isTop,
88
+ open
89
+ ]);
90
+ useEffect(() => {
91
+ if (!open || !isTop || !keyboard) return;
92
+ const handleEscape = (event) => {
93
+ if (event.key !== "Escape") return;
94
+ queueMicrotask(() => {
95
+ if (shouldDismissDialogEscape(event)) onEscape(event);
96
+ });
97
+ };
98
+ window.addEventListener("keydown", handleEscape, true);
99
+ return () => window.removeEventListener("keydown", handleEscape, true);
100
+ }, [
101
+ isTop,
102
+ keyboard,
103
+ onEscape,
104
+ open
105
+ ]);
106
+ }
107
+ //#endregion
108
+ export { focusInitialDialogTarget, markDialogEscapeEvent, restoreDialogFocus, useDialogAccessibility };
109
+
110
+ //# sourceMappingURL=dialogAccessibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogAccessibility.js","names":[],"sources":["../../src/_utils/dialogAccessibility.ts"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef } from 'react';\n\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"]):not([disabled])';\n\nconst dialogEscapeEvents = new WeakSet<KeyboardEvent>();\n\nexport function markDialogEscapeEvent(event: KeyboardEvent) {\n dialogEscapeEvents.add(event);\n}\n\nexport function shouldDismissDialogEscape(event: KeyboardEvent) {\n return (\n !event.cancelBubble &&\n (!event.defaultPrevented || dialogEscapeEvents.has(event))\n );\n}\n\nexport function getDialogFocusableElements(container: HTMLElement) {\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((element) => {\n if (element.closest('[inert]')) return false;\n if (element.getAttribute('aria-hidden') === 'true') return false;\n if (element.getAttribute('aria-disabled') === 'true') return false;\n return element.tabIndex >= 0;\n });\n}\n\nexport function isDialogChildOverlayActive(container: HTMLElement) {\n const activeElement = document.activeElement;\n if (!(activeElement instanceof HTMLElement)) return false;\n const activeOverlay = activeElement.closest<HTMLElement>(\n '[role=\"dialog\"], [role=\"alertdialog\"], [role=\"menu\"], [role=\"listbox\"]',\n );\n\n return !!activeOverlay && activeOverlay !== container;\n}\n\nexport function focusInitialDialogTarget(container: HTMLElement) {\n const activeElement = document.activeElement;\n const activeOverlay =\n activeElement instanceof HTMLElement\n ? activeElement.closest<HTMLElement>(\n '[role=\"dialog\"], [role=\"alertdialog\"], [role=\"menu\"], [role=\"listbox\"]',\n )\n : null;\n\n if (\n activeOverlay &&\n activeOverlay !== container &&\n activeOverlay.getAttribute('role') !== 'dialog' &&\n activeOverlay.getAttribute('role') !== 'alertdialog'\n ) {\n return;\n }\n\n const focusable = getDialogFocusableElements(container);\n const preferred =\n focusable.find((element) => element.dataset.overlayClose !== 'true') ??\n null;\n\n (preferred ?? container).focus({ preventScroll: true });\n}\n\nexport function restoreDialogFocus(target: HTMLElement | null) {\n queueMicrotask(() => {\n if (target?.isConnected && target.tabIndex !== -1) {\n target.focus({ preventScroll: true });\n return;\n }\n\n const fallback = Array.from(\n document.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).find((element) => {\n if (element.closest('[role=\"dialog\"], [role=\"alertdialog\"]')) {\n return false;\n }\n if (element.closest('[inert]')) return false;\n if (element.getAttribute('aria-disabled') === 'true') return false;\n return element.tabIndex >= 0;\n });\n\n fallback?.focus({ preventScroll: true });\n });\n}\n\ninterface DialogAccessibilityOptions {\n open: boolean;\n isTop: boolean;\n keyboard: boolean;\n containerRef: { current: HTMLElement | null };\n onEscape: (event: KeyboardEvent) => void;\n}\n\nexport function useDialogAccessibility({\n open,\n isTop,\n keyboard,\n containerRef,\n onEscape,\n}: DialogAccessibilityOptions) {\n const focusRestoreTargetRef = useRef<HTMLElement | null>(null);\n const prevOpenRef = useRef(false);\n\n useLayoutEffect(() => {\n const wasOpen = prevOpenRef.current;\n if (open && !wasOpen) {\n focusRestoreTargetRef.current =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n }\n if (!open && wasOpen) {\n restoreDialogFocus(focusRestoreTargetRef.current);\n focusRestoreTargetRef.current = null;\n }\n prevOpenRef.current = open;\n }, [open]);\n\n useEffect(() => {\n if (!open || !isTop || !containerRef.current) return;\n const container = containerRef.current;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n if (isDialogChildOverlayActive(container)) return;\n\n const focusable = getDialogFocusableElements(container);\n if (focusable.length === 0) {\n if (document.activeElement !== container) {\n event.preventDefault();\n container.focus({ preventScroll: true });\n }\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (event.shiftKey) {\n if (\n document.activeElement === first ||\n !container.contains(document.activeElement)\n ) {\n event.preventDefault();\n last.focus({ preventScroll: true });\n }\n } else if (\n document.activeElement === last ||\n !container.contains(document.activeElement)\n ) {\n event.preventDefault();\n first.focus({ preventScroll: true });\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [containerRef, isTop, open]);\n\n useEffect(() => {\n if (!open || !isTop || !keyboard) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n queueMicrotask(() => {\n if (shouldDismissDialogEscape(event)) {\n onEscape(event);\n }\n });\n };\n\n window.addEventListener('keydown', handleEscape, true);\n return () => window.removeEventListener('keydown', handleEscape, true);\n }, [isTop, keyboard, onEscape, open]);\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+ export type SemanticOwnerAriaProps = Pick<React.AriaAttributes, 'aria-label' | 'aria-labelledby' | 'aria-describedby' | 'aria-invalid' | 'aria-required' | 'aria-busy' | 'aria-disabled' | 'aria-readonly'>;
3
+ export declare function getSemanticOwnerAriaProps(props: SemanticOwnerAriaProps): SemanticOwnerAriaProps;
@@ -0,0 +1,17 @@
1
+ //#region src/_utils/formControlSemanticOwner.ts
2
+ function getSemanticOwnerAriaProps(props) {
3
+ return {
4
+ "aria-label": props["aria-label"] || void 0,
5
+ "aria-labelledby": props["aria-labelledby"] || void 0,
6
+ "aria-describedby": props["aria-describedby"] || void 0,
7
+ "aria-invalid": props["aria-invalid"],
8
+ "aria-required": props["aria-required"],
9
+ "aria-busy": props["aria-busy"],
10
+ "aria-disabled": props["aria-disabled"],
11
+ "aria-readonly": props["aria-readonly"]
12
+ };
13
+ }
14
+ //#endregion
15
+ export { getSemanticOwnerAriaProps };
16
+
17
+ //# sourceMappingURL=formControlSemanticOwner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formControlSemanticOwner.js","names":[],"sources":["../../src/_utils/formControlSemanticOwner.ts"],"sourcesContent":["import React from 'react';\n\nexport type SemanticOwnerAriaProps = Pick<\n React.AriaAttributes,\n | 'aria-label'\n | 'aria-labelledby'\n | 'aria-describedby'\n | 'aria-invalid'\n | 'aria-required'\n | 'aria-busy'\n | 'aria-disabled'\n | 'aria-readonly'\n>;\n\nexport function getSemanticOwnerAriaProps(\n props: SemanticOwnerAriaProps,\n): SemanticOwnerAriaProps {\n return {\n 'aria-label': props['aria-label'] || undefined,\n 'aria-labelledby': props['aria-labelledby'] || undefined,\n 'aria-describedby': props['aria-describedby'] || undefined,\n 'aria-invalid': props['aria-invalid'],\n 'aria-required': props['aria-required'],\n 'aria-busy': props['aria-busy'],\n 'aria-disabled': props['aria-disabled'],\n 'aria-readonly': props['aria-readonly'],\n };\n}\n"],"mappings":";AAcA,SAAgB,0BACd,OACwB;AACxB,QAAO;EACL,cAAc,MAAM,iBAAiB;EACrC,mBAAmB,MAAM,sBAAsB;EAC/C,oBAAoB,MAAM,uBAAuB;EACjD,gBAAgB,MAAM;EACtB,iBAAiB,MAAM;EACvB,aAAa,MAAM;EACnB,iBAAiB,MAAM;EACvB,iBAAiB,MAAM;EACxB"}
@@ -129,16 +129,6 @@ function useTopModalContentZIndex() {
129
129
  const ordered = getOrderedEntries();
130
130
  return ordered[ordered.length - 1]?.contentZIndex;
131
131
  }
132
- function useBodyScrollLock(locked) {
133
- const ownerRef = useRef();
134
- if (!ownerRef.current) ownerRef.current = Symbol("body-scroll-lock");
135
- useLayoutEffect(() => {
136
- if (!locked) return;
137
- const owner = ownerRef.current;
138
- acquireBodyScrollLock(owner);
139
- return () => releaseBodyScrollLock(owner);
140
- }, [locked]);
141
- }
142
132
  function ModalLayerProvider({ id, children }) {
143
133
  return /* @__PURE__ */ jsx(ModalLayerContext.Provider, {
144
134
  value: id,
@@ -146,6 +136,6 @@ function ModalLayerProvider({ id, children }) {
146
136
  });
147
137
  }
148
138
  //#endregion
149
- export { ModalLayerProvider, useBodyScrollLock, useModalLayer, useTopModalContentZIndex };
139
+ export { ModalLayerProvider, useModalLayer, useTopModalContentZIndex };
150
140
 
151
141
  //# sourceMappingURL=overlayCoordinator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlayCoordinator.js","names":[],"sources":["../../src/_utils/overlayCoordinator.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useLayoutEffect,\n useRef,\n useSyncExternalStore,\n} from 'react';\nimport {\n FLOATING_LAYER_BASE_Z_INDEX,\n FLOATING_LAYER_STEP,\n} from './floatingLayer';\n\ninterface ModalLayerEntry {\n id: number;\n parentId?: number;\n requestedZIndex: number;\n openedAt: number;\n maskZIndex: number;\n contentZIndex: number;\n}\n\nexport interface ModalLayer {\n id: number;\n maskZIndex: number;\n contentZIndex: number;\n isTop: boolean;\n}\n\nconst ModalLayerContext = createContext<number | undefined>(undefined);\nconst entries = new Map<number, ModalLayerEntry>();\nconst listeners = new Set<() => void>();\nconst bodyScrollLockOwners = new Set<unknown>();\nlet nextId = 0;\nlet nextOpenedAt = 0;\nlet version = 0;\nlet bodyScrollLocked = false;\nlet previousBodyOverflow = '';\n\nfunction getOrderedEntries() {\n const orderedByOpen = Array.from(entries.values()).sort(\n (left, right) => left.openedAt - right.openedAt,\n );\n const ordered: ModalLayerEntry[] = [];\n const visited = new Set<number>();\n\n const visit = (entry: ModalLayerEntry) => {\n if (visited.has(entry.id)) return;\n const parent = entry.parentId ? entries.get(entry.parentId) : undefined;\n if (parent) visit(parent);\n visited.add(entry.id);\n ordered.push(entry);\n };\n\n orderedByOpen.forEach(visit);\n return ordered;\n}\n\nfunction notify() {\n version += 1;\n listeners.forEach((listener) => listener());\n}\n\nfunction updateLayers() {\n let nextZIndex = FLOATING_LAYER_BASE_Z_INDEX;\n getOrderedEntries().forEach((entry) => {\n entry.maskZIndex = Math.max(entry.requestedZIndex, nextZIndex);\n entry.contentZIndex = entry.maskZIndex + 1;\n nextZIndex = entry.maskZIndex + FLOATING_LAYER_STEP;\n });\n notify();\n}\n\nfunction acquireBodyScrollLock(owner: unknown) {\n if (typeof document === 'undefined') return;\n if (bodyScrollLockOwners.has(owner)) return;\n if (!bodyScrollLocked) {\n previousBodyOverflow = document.body.style.overflow;\n bodyScrollLocked = true;\n }\n bodyScrollLockOwners.add(owner);\n document.body.style.overflow = 'hidden';\n}\n\nfunction releaseBodyScrollLock(owner: unknown) {\n if (typeof document === 'undefined') return;\n bodyScrollLockOwners.delete(owner);\n if (bodyScrollLocked && bodyScrollLockOwners.size === 0) {\n document.body.style.overflow = previousBodyOverflow;\n bodyScrollLocked = false;\n }\n}\n\nfunction registerModal(id: number, requestedZIndex: number, parentId?: number) {\n entries.set(id, {\n id,\n parentId,\n requestedZIndex,\n openedAt: ++nextOpenedAt,\n maskZIndex: requestedZIndex,\n contentZIndex: requestedZIndex + 1,\n });\n acquireBodyScrollLock(id);\n updateLayers();\n}\n\nfunction unregisterModal(id: number) {\n if (!entries.delete(id)) return;\n releaseBodyScrollLock(id);\n updateLayers();\n}\n\nfunction updateModal(id: number, requestedZIndex: number, parentId?: number) {\n const entry = entries.get(id);\n if (\n !entry ||\n (entry.requestedZIndex === requestedZIndex && entry.parentId === parentId)\n )\n return;\n entry.requestedZIndex = requestedZIndex;\n entry.parentId = parentId;\n updateLayers();\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nfunction getVersion() {\n return version;\n}\n\nexport function useModalLayer(\n open: boolean,\n requestedZIndex = FLOATING_LAYER_BASE_Z_INDEX,\n): ModalLayer {\n const parentId = useContext(ModalLayerContext);\n const idRef = useRef<number>();\n const layerOptionsRef = useRef({ parentId, requestedZIndex });\n layerOptionsRef.current = { parentId, requestedZIndex };\n if (!idRef.current) idRef.current = ++nextId;\n const id = idRef.current;\n\n useSyncExternalStore(subscribe, getVersion, getVersion);\n\n useLayoutEffect(() => {\n if (!open) return;\n registerModal(\n id,\n layerOptionsRef.current.requestedZIndex,\n layerOptionsRef.current.parentId,\n );\n return () => unregisterModal(id);\n }, [id, open]);\n\n useLayoutEffect(() => {\n if (open) updateModal(id, requestedZIndex, parentId);\n }, [id, open, parentId, requestedZIndex]);\n\n const entry = entries.get(id);\n const ordered = getOrderedEntries();\n const topEntry = ordered[ordered.length - 1];\n\n return {\n id,\n maskZIndex: entry?.maskZIndex ?? requestedZIndex,\n contentZIndex: entry?.contentZIndex ?? requestedZIndex + 1,\n isTop: entry ? topEntry?.id === id : true,\n };\n}\n\nexport function useTopModalContentZIndex() {\n useSyncExternalStore(subscribe, getVersion, getVersion);\n const ordered = getOrderedEntries();\n return ordered[ordered.length - 1]?.contentZIndex;\n}\n\nexport function useBodyScrollLock(locked: boolean) {\n const ownerRef = useRef<symbol>();\n if (!ownerRef.current) ownerRef.current = Symbol('body-scroll-lock');\n\n useLayoutEffect(() => {\n if (!locked) return;\n const owner = ownerRef.current!;\n acquireBodyScrollLock(owner);\n return () => releaseBodyScrollLock(owner);\n }, [locked]);\n}\n\nexport function ModalLayerProvider({\n id,\n children,\n}: {\n id: number;\n children: React.ReactNode;\n}) {\n return (\n <ModalLayerContext.Provider value={id}>\n {children}\n </ModalLayerContext.Provider>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"overlayCoordinator.js","names":[],"sources":["../../src/_utils/overlayCoordinator.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useLayoutEffect,\n useRef,\n useSyncExternalStore,\n} from 'react';\nimport {\n FLOATING_LAYER_BASE_Z_INDEX,\n FLOATING_LAYER_STEP,\n} from './floatingLayer';\n\ninterface ModalLayerEntry {\n id: number;\n parentId?: number;\n requestedZIndex: number;\n openedAt: number;\n maskZIndex: number;\n contentZIndex: number;\n}\n\nexport interface ModalLayer {\n id: number;\n maskZIndex: number;\n contentZIndex: number;\n isTop: boolean;\n}\n\nconst ModalLayerContext = createContext<number | undefined>(undefined);\nconst entries = new Map<number, ModalLayerEntry>();\nconst listeners = new Set<() => void>();\nconst bodyScrollLockOwners = new Set<unknown>();\nlet nextId = 0;\nlet nextOpenedAt = 0;\nlet version = 0;\nlet bodyScrollLocked = false;\nlet previousBodyOverflow = '';\n\nfunction getOrderedEntries() {\n const orderedByOpen = Array.from(entries.values()).sort(\n (left, right) => left.openedAt - right.openedAt,\n );\n const ordered: ModalLayerEntry[] = [];\n const visited = new Set<number>();\n\n const visit = (entry: ModalLayerEntry) => {\n if (visited.has(entry.id)) return;\n const parent = entry.parentId ? entries.get(entry.parentId) : undefined;\n if (parent) visit(parent);\n visited.add(entry.id);\n ordered.push(entry);\n };\n\n orderedByOpen.forEach(visit);\n return ordered;\n}\n\nfunction notify() {\n version += 1;\n listeners.forEach((listener) => listener());\n}\n\nfunction updateLayers() {\n let nextZIndex = FLOATING_LAYER_BASE_Z_INDEX;\n getOrderedEntries().forEach((entry) => {\n entry.maskZIndex = Math.max(entry.requestedZIndex, nextZIndex);\n entry.contentZIndex = entry.maskZIndex + 1;\n nextZIndex = entry.maskZIndex + FLOATING_LAYER_STEP;\n });\n notify();\n}\n\nfunction acquireBodyScrollLock(owner: unknown) {\n if (typeof document === 'undefined') return;\n if (bodyScrollLockOwners.has(owner)) return;\n if (!bodyScrollLocked) {\n previousBodyOverflow = document.body.style.overflow;\n bodyScrollLocked = true;\n }\n bodyScrollLockOwners.add(owner);\n document.body.style.overflow = 'hidden';\n}\n\nfunction releaseBodyScrollLock(owner: unknown) {\n if (typeof document === 'undefined') return;\n bodyScrollLockOwners.delete(owner);\n if (bodyScrollLocked && bodyScrollLockOwners.size === 0) {\n document.body.style.overflow = previousBodyOverflow;\n bodyScrollLocked = false;\n }\n}\n\nfunction registerModal(id: number, requestedZIndex: number, parentId?: number) {\n entries.set(id, {\n id,\n parentId,\n requestedZIndex,\n openedAt: ++nextOpenedAt,\n maskZIndex: requestedZIndex,\n contentZIndex: requestedZIndex + 1,\n });\n acquireBodyScrollLock(id);\n updateLayers();\n}\n\nfunction unregisterModal(id: number) {\n if (!entries.delete(id)) return;\n releaseBodyScrollLock(id);\n updateLayers();\n}\n\nfunction updateModal(id: number, requestedZIndex: number, parentId?: number) {\n const entry = entries.get(id);\n if (\n !entry ||\n (entry.requestedZIndex === requestedZIndex && entry.parentId === parentId)\n )\n return;\n entry.requestedZIndex = requestedZIndex;\n entry.parentId = parentId;\n updateLayers();\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nfunction getVersion() {\n return version;\n}\n\nexport function useModalLayer(\n open: boolean,\n requestedZIndex = FLOATING_LAYER_BASE_Z_INDEX,\n): ModalLayer {\n const parentId = useContext(ModalLayerContext);\n const idRef = useRef<number>();\n const layerOptionsRef = useRef({ parentId, requestedZIndex });\n layerOptionsRef.current = { parentId, requestedZIndex };\n if (!idRef.current) idRef.current = ++nextId;\n const id = idRef.current;\n\n useSyncExternalStore(subscribe, getVersion, getVersion);\n\n useLayoutEffect(() => {\n if (!open) return;\n registerModal(\n id,\n layerOptionsRef.current.requestedZIndex,\n layerOptionsRef.current.parentId,\n );\n return () => unregisterModal(id);\n }, [id, open]);\n\n useLayoutEffect(() => {\n if (open) updateModal(id, requestedZIndex, parentId);\n }, [id, open, parentId, requestedZIndex]);\n\n const entry = entries.get(id);\n const ordered = getOrderedEntries();\n const topEntry = ordered[ordered.length - 1];\n\n return {\n id,\n maskZIndex: entry?.maskZIndex ?? requestedZIndex,\n contentZIndex: entry?.contentZIndex ?? requestedZIndex + 1,\n isTop: entry ? topEntry?.id === id : true,\n };\n}\n\nexport function useTopModalContentZIndex() {\n useSyncExternalStore(subscribe, getVersion, getVersion);\n const ordered = getOrderedEntries();\n return ordered[ordered.length - 1]?.contentZIndex;\n}\n\nexport function useBodyScrollLock(locked: boolean) {\n const ownerRef = useRef<symbol>();\n if (!ownerRef.current) ownerRef.current = Symbol('body-scroll-lock');\n\n useLayoutEffect(() => {\n if (!locked) return;\n const owner = ownerRef.current!;\n acquireBodyScrollLock(owner);\n return () => releaseBodyScrollLock(owner);\n }, [locked]);\n}\n\nexport function ModalLayerProvider({\n id,\n children,\n}: {\n id: number;\n children: React.ReactNode;\n}) {\n return (\n <ModalLayerContext.Provider value={id}>\n {children}\n </ModalLayerContext.Provider>\n );\n}\n"],"mappings":"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"}