@proyecto-viviana/solidaria 0.2.5 → 0.2.8

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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/dist/actiongroup/createActionGroup.d.ts +29 -0
  3. package/dist/actiongroup/createActionGroup.d.ts.map +1 -0
  4. package/dist/actiongroup/index.d.ts +2 -0
  5. package/dist/actiongroup/index.d.ts.map +1 -0
  6. package/dist/autocomplete/createAutocomplete.d.ts +6 -2
  7. package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
  8. package/dist/breadcrumbs/createBreadcrumbs.d.ts +2 -0
  9. package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
  10. package/dist/button/createToggleButtonGroup.d.ts +32 -0
  11. package/dist/button/createToggleButtonGroup.d.ts.map +1 -0
  12. package/dist/button/index.d.ts +2 -0
  13. package/dist/button/index.d.ts.map +1 -1
  14. package/dist/calendar/createCalendarCell.d.ts +2 -0
  15. package/dist/calendar/createCalendarCell.d.ts.map +1 -1
  16. package/dist/calendar/createCalendarGrid.d.ts.map +1 -1
  17. package/dist/calendar/createRangeCalendarCell.d.ts +3 -1
  18. package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
  19. package/dist/checkbox/createCheckboxGroup.d.ts +5 -1
  20. package/dist/checkbox/createCheckboxGroup.d.ts.map +1 -1
  21. package/dist/collections/index.d.ts +56 -0
  22. package/dist/collections/index.d.ts.map +1 -0
  23. package/dist/color/createColorArea.d.ts.map +1 -1
  24. package/dist/color/createColorSlider.d.ts.map +1 -1
  25. package/dist/color/createColorWheel.d.ts.map +1 -1
  26. package/dist/combobox/createComboBox.d.ts +6 -0
  27. package/dist/combobox/createComboBox.d.ts.map +1 -1
  28. package/dist/datepicker/createDatePicker.d.ts +6 -0
  29. package/dist/datepicker/createDatePicker.d.ts.map +1 -1
  30. package/dist/datepicker/createDateRangePicker.d.ts +40 -0
  31. package/dist/datepicker/createDateRangePicker.d.ts.map +1 -0
  32. package/dist/datepicker/createDateSegment.d.ts +1 -1
  33. package/dist/datepicker/createDateSegment.d.ts.map +1 -1
  34. package/dist/datepicker/createTimeSegment.d.ts +29 -0
  35. package/dist/datepicker/createTimeSegment.d.ts.map +1 -0
  36. package/dist/datepicker/index.d.ts +2 -0
  37. package/dist/datepicker/index.d.ts.map +1 -1
  38. package/dist/disclosure/createDisclosureGroup.d.ts +2 -1
  39. package/dist/disclosure/createDisclosureGroup.d.ts.map +1 -1
  40. package/dist/dnd/createDrag.d.ts.map +1 -1
  41. package/dist/dnd/createDraggableCollection.d.ts +4 -0
  42. package/dist/dnd/createDraggableCollection.d.ts.map +1 -1
  43. package/dist/dnd/createDraggableItem.d.ts.map +1 -1
  44. package/dist/dnd/createDrop.d.ts.map +1 -1
  45. package/dist/dnd/createDroppableCollection.d.ts +32 -1
  46. package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
  47. package/dist/dnd/createDroppableItem.d.ts.map +1 -1
  48. package/dist/dnd/index.d.ts +1 -1
  49. package/dist/dnd/index.d.ts.map +1 -1
  50. package/dist/grid/createGrid.d.ts.map +1 -1
  51. package/dist/gridlist/createGridList.d.ts.map +1 -1
  52. package/dist/index.d.ts +6 -4
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +4659 -3452
  55. package/dist/index.js.map +1 -7
  56. package/dist/index.ssr.js +4659 -3452
  57. package/dist/index.ssr.js.map +1 -7
  58. package/dist/interactions/createFocus.d.ts.map +1 -1
  59. package/dist/interactions/createFocusWithin.d.ts.map +1 -1
  60. package/dist/link/createLink.d.ts +10 -0
  61. package/dist/link/createLink.d.ts.map +1 -1
  62. package/dist/listbox/createListBox.d.ts +1 -0
  63. package/dist/listbox/createListBox.d.ts.map +1 -1
  64. package/dist/listbox/createOption.d.ts.map +1 -1
  65. package/dist/menu/createMenu.d.ts +1 -0
  66. package/dist/menu/createMenu.d.ts.map +1 -1
  67. package/dist/meter/createMeter.d.ts.map +1 -1
  68. package/dist/numberfield/createNumberField.d.ts +18 -0
  69. package/dist/numberfield/createNumberField.d.ts.map +1 -1
  70. package/dist/overlays/createModal.d.ts +16 -0
  71. package/dist/overlays/createModal.d.ts.map +1 -1
  72. package/dist/overlays/createOverlay.d.ts.map +1 -1
  73. package/dist/overlays/index.d.ts +1 -1
  74. package/dist/overlays/index.d.ts.map +1 -1
  75. package/dist/popover/createOverlayPosition.d.ts.map +1 -1
  76. package/dist/popover/createPopover.d.ts.map +1 -1
  77. package/dist/progress/createProgressBar.d.ts.map +1 -1
  78. package/dist/radio/createRadioGroup.d.ts +2 -2
  79. package/dist/radio/createRadioGroup.d.ts.map +1 -1
  80. package/dist/searchfield/createSearchField.d.ts.map +1 -1
  81. package/dist/select/createHiddenSelect.d.ts.map +1 -1
  82. package/dist/select/createSelect.d.ts.map +1 -1
  83. package/dist/slider/createSlider.d.ts.map +1 -1
  84. package/dist/table/createTable.d.ts.map +1 -1
  85. package/dist/tabs/createTabs.d.ts +1 -1
  86. package/dist/tabs/createTabs.d.ts.map +1 -1
  87. package/dist/tag/createTag.d.ts.map +1 -1
  88. package/dist/tag/createTagGroup.d.ts.map +1 -1
  89. package/dist/toast/createToast.d.ts +4 -0
  90. package/dist/toast/createToast.d.ts.map +1 -1
  91. package/dist/toast/createToastRegion.d.ts.map +1 -1
  92. package/dist/toolbar/createToolbar.d.ts.map +1 -1
  93. package/dist/tooltip/createTooltipTrigger.d.ts.map +1 -1
  94. package/dist/tree/createTree.d.ts.map +1 -1
  95. package/dist/tree/createTreeItem.d.ts.map +1 -1
  96. package/dist/tree/types.d.ts +4 -0
  97. package/dist/tree/types.d.ts.map +1 -1
  98. package/dist/utils/env.d.ts +1 -1
  99. package/dist/utils/env.d.ts.map +1 -1
  100. package/dist/utils/platform.d.ts.map +1 -1
  101. package/dist/visually-hidden/createVisuallyHidden.d.ts.map +1 -1
  102. package/package.json +8 -6
  103. package/src/actiongroup/createActionGroup.ts +324 -0
  104. package/src/actiongroup/index.ts +8 -0
  105. package/src/autocomplete/createAutocomplete.ts +32 -9
  106. package/src/breadcrumbs/createBreadcrumbs.ts +10 -15
  107. package/src/button/createButton.ts +1 -1
  108. package/src/button/createToggleButtonGroup.ts +128 -0
  109. package/src/button/index.ts +9 -0
  110. package/src/calendar/createCalendarCell.ts +6 -4
  111. package/src/calendar/createCalendarGrid.ts +27 -18
  112. package/src/calendar/createRangeCalendarCell.ts +26 -9
  113. package/src/checkbox/createCheckboxGroup.ts +21 -4
  114. package/src/collections/index.ts +242 -0
  115. package/src/color/createColorArea.ts +380 -314
  116. package/src/color/createColorField.ts +137 -137
  117. package/src/color/createColorSlider.ts +286 -197
  118. package/src/color/createColorSwatch.ts +40 -40
  119. package/src/color/createColorWheel.ts +218 -208
  120. package/src/color/index.ts +24 -24
  121. package/src/color/types.ts +116 -116
  122. package/src/combobox/createComboBox.ts +670 -647
  123. package/src/combobox/index.ts +6 -6
  124. package/src/datepicker/createDatePicker.ts +54 -16
  125. package/src/datepicker/createDateRangePicker.ts +246 -0
  126. package/src/datepicker/createDateSegment.ts +185 -31
  127. package/src/datepicker/createTimeSegment.ts +370 -0
  128. package/src/datepicker/index.ts +14 -0
  129. package/src/dialog/createDialog.ts +120 -120
  130. package/src/dialog/index.ts +2 -2
  131. package/src/dialog/types.ts +19 -19
  132. package/src/disclosure/createDisclosureGroup.ts +5 -2
  133. package/src/dnd/createDrag.ts +224 -209
  134. package/src/dnd/createDraggableCollection.ts +96 -63
  135. package/src/dnd/createDraggableItem.ts +259 -243
  136. package/src/dnd/createDrop.ts +322 -321
  137. package/src/dnd/createDroppableCollection.ts +682 -293
  138. package/src/dnd/createDroppableItem.ts +215 -213
  139. package/src/dnd/index.ts +55 -47
  140. package/src/dnd/types.ts +89 -89
  141. package/src/dnd/utils.ts +294 -294
  142. package/src/focus/createAutoFocus.ts +321 -321
  143. package/src/focus/createFocusRestore.ts +313 -313
  144. package/src/focus/createVirtualFocus.ts +396 -396
  145. package/src/form/createFormValidation.ts +224 -224
  146. package/src/form/index.ts +11 -11
  147. package/src/grid/createGrid.ts +3 -1
  148. package/src/gridlist/createGridList.ts +16 -0
  149. package/src/gridlist/createGridListItem.ts +1 -1
  150. package/src/i18n/NumberFormatter.ts +266 -266
  151. package/src/i18n/createCollator.ts +79 -79
  152. package/src/i18n/createDateFormatter.ts +83 -83
  153. package/src/i18n/createFilter.ts +131 -131
  154. package/src/i18n/createNumberFormatter.ts +52 -52
  155. package/src/i18n/index.ts +40 -40
  156. package/src/i18n/locale.tsx +188 -188
  157. package/src/i18n/utils.ts +99 -99
  158. package/src/index.ts +51 -0
  159. package/src/interactions/createFocus.ts +6 -5
  160. package/src/interactions/createFocusWithin.ts +6 -5
  161. package/src/interactions/createLongPress.ts +174 -174
  162. package/src/interactions/createMove.ts +289 -289
  163. package/src/interactions/createPress.ts +5 -5
  164. package/src/landmark/createLandmark.ts +377 -377
  165. package/src/landmark/index.ts +8 -8
  166. package/src/link/createLink.ts +23 -8
  167. package/src/listbox/createListBox.ts +308 -269
  168. package/src/listbox/createOption.ts +162 -151
  169. package/src/listbox/index.ts +12 -12
  170. package/src/live-announcer/announce.ts +322 -322
  171. package/src/live-announcer/index.ts +9 -9
  172. package/src/menu/createMenu.ts +405 -396
  173. package/src/menu/createMenuItem.ts +149 -149
  174. package/src/menu/createMenuTrigger.ts +88 -88
  175. package/src/menu/index.ts +18 -18
  176. package/src/meter/createMeter.ts +1 -6
  177. package/src/numberfield/createNumberField.ts +311 -268
  178. package/src/numberfield/index.ts +5 -5
  179. package/src/overlays/ariaHideOutside.ts +219 -219
  180. package/src/overlays/createInteractOutside.ts +149 -149
  181. package/src/overlays/createModal.tsx +238 -202
  182. package/src/overlays/createOverlay.ts +165 -155
  183. package/src/overlays/createOverlayTrigger.ts +85 -85
  184. package/src/overlays/createPreventScroll.ts +266 -266
  185. package/src/overlays/index.ts +48 -44
  186. package/src/popover/calculatePosition.ts +6 -6
  187. package/src/popover/createOverlayPosition.ts +7 -4
  188. package/src/popover/createPopover.ts +21 -7
  189. package/src/progress/createProgressBar.ts +6 -1
  190. package/src/radio/createRadioGroup.ts +88 -14
  191. package/src/searchfield/createSearchField.ts +241 -186
  192. package/src/searchfield/index.ts +2 -2
  193. package/src/select/createHiddenSelect.tsx +263 -236
  194. package/src/select/createSelect.ts +373 -395
  195. package/src/select/index.ts +14 -14
  196. package/src/slider/createSlider.ts +364 -349
  197. package/src/slider/index.ts +2 -2
  198. package/src/ssr/index.tsx +370 -370
  199. package/src/table/createTable.ts +3 -1
  200. package/src/table/createTableColumnHeader.ts +1 -1
  201. package/src/table/createTableRow.ts +1 -1
  202. package/src/tabs/createTabs.ts +80 -51
  203. package/src/tag/createTag.ts +135 -6
  204. package/src/tag/createTagGroup.ts +7 -2
  205. package/src/toast/createToast.ts +8 -2
  206. package/src/toast/createToastRegion.ts +0 -1
  207. package/src/toolbar/createToolbar.ts +75 -1
  208. package/src/tooltip/createTooltip.ts +79 -79
  209. package/src/tooltip/createTooltipTrigger.ts +226 -222
  210. package/src/tooltip/index.ts +6 -6
  211. package/src/tree/createTree.ts +261 -246
  212. package/src/tree/createTreeItem.ts +282 -233
  213. package/src/tree/createTreeSelectionCheckbox.ts +68 -68
  214. package/src/tree/index.ts +16 -16
  215. package/src/tree/types.ts +91 -87
  216. package/src/utils/env.ts +55 -54
  217. package/src/utils/platform.ts +16 -6
  218. package/src/visually-hidden/createVisuallyHidden.ts +139 -124
  219. package/src/visually-hidden/index.ts +6 -6
package/src/i18n/utils.ts CHANGED
@@ -1,99 +1,99 @@
1
- /**
2
- * i18n utilities for solidaria
3
- *
4
- * RTL detection and locale utilities.
5
- *
6
- * Port of @react-aria/i18n utils.
7
- */
8
-
9
- // https://en.wikipedia.org/wiki/Right-to-left
10
- const RTL_SCRIPTS = new Set([
11
- 'Arab',
12
- 'Syrc',
13
- 'Samr',
14
- 'Mand',
15
- 'Thaa',
16
- 'Mend',
17
- 'Nkoo',
18
- 'Adlm',
19
- 'Rohg',
20
- 'Hebr',
21
- ]);
22
-
23
- const RTL_LANGS = new Set([
24
- 'ae',
25
- 'ar',
26
- 'arc',
27
- 'bcc',
28
- 'bqi',
29
- 'ckb',
30
- 'dv',
31
- 'fa',
32
- 'glk',
33
- 'he',
34
- 'ku',
35
- 'mzn',
36
- 'nqo',
37
- 'pnb',
38
- 'ps',
39
- 'sd',
40
- 'ug',
41
- 'ur',
42
- 'yi',
43
- ]);
44
-
45
- /**
46
- * Determines if a locale is read right to left.
47
- * Uses Intl.Locale API when available for accurate detection.
48
- */
49
- export function isRTL(localeString: string): boolean {
50
- // If the Intl.Locale API is available, use it to get the locale's text direction.
51
- if (typeof Intl !== 'undefined' && Intl.Locale) {
52
- try {
53
- const locale = new Intl.Locale(localeString).maximize();
54
-
55
- // Use the text info object to get the direction if possible.
56
- // getTextInfo() was implemented as a property by some browsers before it was standardized as a function.
57
- const localeAny = locale as unknown as {
58
- getTextInfo?: () => { direction: string };
59
- textInfo?: { direction: string };
60
- };
61
- const textInfo = typeof localeAny.getTextInfo === 'function'
62
- ? localeAny.getTextInfo()
63
- : localeAny.textInfo;
64
-
65
- if (textInfo) {
66
- return textInfo.direction === 'rtl';
67
- }
68
-
69
- // Fallback: guess using the script.
70
- if (locale.script) {
71
- return RTL_SCRIPTS.has(locale.script);
72
- }
73
- } catch {
74
- // Fall through to language-based detection
75
- }
76
- }
77
-
78
- // If not, just guess by the language (first part of the locale)
79
- const lang = localeString.split('-')[0];
80
- return RTL_LANGS.has(lang);
81
- }
82
-
83
- /**
84
- * Creates a cache key for formatter options.
85
- */
86
- export function createCacheKey(
87
- locale: string,
88
- options?: Record<string, unknown>
89
- ): string {
90
- if (!options) {
91
- return locale;
92
- }
93
- return (
94
- locale +
95
- Object.entries(options)
96
- .sort((a, b) => (a[0] < b[0] ? -1 : 1))
97
- .join()
98
- );
99
- }
1
+ /**
2
+ * i18n utilities for solidaria
3
+ *
4
+ * RTL detection and locale utilities.
5
+ *
6
+ * Port of @react-aria/i18n utils.
7
+ */
8
+
9
+ // https://en.wikipedia.org/wiki/Right-to-left
10
+ const RTL_SCRIPTS = new Set([
11
+ 'Arab',
12
+ 'Syrc',
13
+ 'Samr',
14
+ 'Mand',
15
+ 'Thaa',
16
+ 'Mend',
17
+ 'Nkoo',
18
+ 'Adlm',
19
+ 'Rohg',
20
+ 'Hebr',
21
+ ]);
22
+
23
+ const RTL_LANGS = new Set([
24
+ 'ae',
25
+ 'ar',
26
+ 'arc',
27
+ 'bcc',
28
+ 'bqi',
29
+ 'ckb',
30
+ 'dv',
31
+ 'fa',
32
+ 'glk',
33
+ 'he',
34
+ 'ku',
35
+ 'mzn',
36
+ 'nqo',
37
+ 'pnb',
38
+ 'ps',
39
+ 'sd',
40
+ 'ug',
41
+ 'ur',
42
+ 'yi',
43
+ ]);
44
+
45
+ /**
46
+ * Determines if a locale is read right to left.
47
+ * Uses Intl.Locale API when available for accurate detection.
48
+ */
49
+ export function isRTL(localeString: string): boolean {
50
+ // If the Intl.Locale API is available, use it to get the locale's text direction.
51
+ if (typeof Intl !== 'undefined' && Intl.Locale) {
52
+ try {
53
+ const locale = new Intl.Locale(localeString).maximize();
54
+
55
+ // Use the text info object to get the direction if possible.
56
+ // getTextInfo() was implemented as a property by some browsers before it was standardized as a function.
57
+ const localeAny = locale as unknown as {
58
+ getTextInfo?: () => { direction: string };
59
+ textInfo?: { direction: string };
60
+ };
61
+ const textInfo = typeof localeAny.getTextInfo === 'function'
62
+ ? localeAny.getTextInfo()
63
+ : localeAny.textInfo;
64
+
65
+ if (textInfo) {
66
+ return textInfo.direction === 'rtl';
67
+ }
68
+
69
+ // Fallback: guess using the script.
70
+ if (locale.script) {
71
+ return RTL_SCRIPTS.has(locale.script);
72
+ }
73
+ } catch {
74
+ // Fall through to language-based detection
75
+ }
76
+ }
77
+
78
+ // If not, just guess by the language (first part of the locale)
79
+ const lang = localeString.split('-')[0];
80
+ return RTL_LANGS.has(lang);
81
+ }
82
+
83
+ /**
84
+ * Creates a cache key for formatter options.
85
+ */
86
+ export function createCacheKey(
87
+ locale: string,
88
+ options?: Record<string, unknown>
89
+ ): string {
90
+ if (!options) {
91
+ return locale;
92
+ }
93
+ return (
94
+ locale +
95
+ Object.entries(options)
96
+ .sort((a, b) => (a[0] < b[0] ? -1 : 1))
97
+ .join()
98
+ );
99
+ }
package/src/index.ts CHANGED
@@ -2,12 +2,48 @@
2
2
  export {
3
3
  createButton,
4
4
  createToggleButton,
5
+ createToggleButtonGroup,
6
+ createToggleButtonGroupItem,
5
7
  type AriaButtonProps,
6
8
  type ButtonAria,
7
9
  type AriaToggleButtonProps,
8
10
  type ToggleButtonAria,
11
+ type AriaToggleButtonGroupProps,
12
+ type ToggleButtonGroupAria,
13
+ type AriaToggleButtonGroupItemProps,
9
14
  } from './button';
10
15
 
16
+ // ActionGroup
17
+ export {
18
+ createActionGroup,
19
+ createActionGroupItem,
20
+ type AriaActionGroupProps,
21
+ type ActionGroupAria,
22
+ type AriaActionGroupItemProps,
23
+ type ActionGroupItemAria,
24
+ } from './actiongroup';
25
+
26
+ // Collections
27
+ export {
28
+ CollectionBuilder,
29
+ Collection,
30
+ createLeafComponent,
31
+ createBranchComponent,
32
+ createHideableComponent,
33
+ useIsHidden,
34
+ useCachedChildren,
35
+ BaseCollection,
36
+ type CollectionBuilderProps,
37
+ type CollectionProps,
38
+ type CachedChildrenOptions,
39
+ type CollectionNode,
40
+ type ItemNode,
41
+ type SectionNode,
42
+ type FilterableNode,
43
+ type LoaderNode,
44
+ type HeaderNode,
45
+ } from './collections';
46
+
11
47
  // Checkbox
12
48
  export {
13
49
  createCheckbox,
@@ -204,11 +240,15 @@ export {
204
240
  ModalProvider,
205
241
  OverlayProvider,
206
242
  OverlayContainer,
243
+ UNSAFE_PortalProvider,
207
244
  useModalProvider,
245
+ useUNSAFE_PortalContext,
208
246
  createModal,
209
247
  type ModalProviderProps,
210
248
  type ModalProviderAria,
211
249
  type OverlayContainerProps,
250
+ type PortalProviderProps,
251
+ type PortalProviderContextValue,
212
252
  type AriaModalOptions,
213
253
  type ModalAria,
214
254
  } from './overlays';
@@ -443,11 +483,18 @@ export {
443
483
  createTimeField,
444
484
  type AriaTimeFieldProps,
445
485
  type TimeFieldAria,
486
+ // Time Segment
487
+ createTimeSegment,
488
+ type AriaTimeSegmentProps,
489
+ type TimeSegmentAria,
446
490
  // Date Picker
447
491
  createDatePicker,
492
+ createDateRangePicker,
448
493
  type AriaDatePickerProps,
449
494
  type DatePickerAria,
450
495
  type DatePickerState,
496
+ type AriaDateRangePickerProps,
497
+ type DateRangePickerAria,
451
498
  } from './datepicker';
452
499
 
453
500
  // Grid
@@ -555,6 +602,10 @@ export {
555
602
  // Global state
556
603
  setGlobalDraggingCollectionRef,
557
604
  getGlobalDraggingCollectionRef,
605
+ setGlobalDraggingKeys,
606
+ getGlobalDraggingKeys,
607
+ setGlobalDraggingTypes,
608
+ getGlobalDraggingTypes,
558
609
  setGlobalDropCollectionRef,
559
610
  getGlobalDropCollectionRef,
560
611
  // Types
@@ -40,9 +40,7 @@ export interface FocusResult {
40
40
  * Most browsers fire a native focusout event in this case, except for Firefox.
41
41
  * We use a MutationObserver to watch for the disabled attribute.
42
42
  */
43
- function createSyntheticBlurHandler(
44
- onBlur: ((e: FocusEvent) => void) | undefined
45
- ): (_e: FocusEvent, target: Element) => (() => void) | undefined {
43
+ function createSyntheticBlurHandler(): (_e: FocusEvent, target: Element) => (() => void) | undefined {
46
44
  let isFocused = false;
47
45
  let observer: MutationObserver | null = null;
48
46
 
@@ -68,8 +66,11 @@ function createSyntheticBlurHandler(
68
66
 
69
67
  observer = new MutationObserver(() => {
70
68
  if (isFocused && (target as HTMLButtonElement).disabled) {
69
+ isFocused = false;
71
70
  observer?.disconnect();
72
- const relatedTarget = target === document.activeElement ? null : document.activeElement;
71
+ observer = null;
72
+ const ownerDocument = target.ownerDocument;
73
+ const relatedTarget = target === ownerDocument.activeElement ? null : ownerDocument.activeElement;
73
74
  target.dispatchEvent(new FocusEvent('blur', { relatedTarget }));
74
75
  target.dispatchEvent(new FocusEvent('focusout', { bubbles: true, relatedTarget }));
75
76
  }
@@ -100,7 +101,7 @@ export function createFocus(props: CreateFocusProps = {}): FocusResult {
100
101
  const { isDisabled, onFocus: onFocusProp, onBlur: onBlurProp, onFocusChange } = props;
101
102
 
102
103
  let cleanupRef: (() => void) | undefined;
103
- const syntheticBlurHandler = createSyntheticBlurHandler(onBlurProp);
104
+ const syntheticBlurHandler = createSyntheticBlurHandler();
104
105
 
105
106
  // Cleanup on unmount
106
107
  onCleanup(() => {
@@ -32,9 +32,7 @@ function getActiveElement(doc: Document): Element | null {
32
32
  return activeElement;
33
33
  }
34
34
 
35
- function createSyntheticBlurHandler(
36
- onBlurWithin: ((e: FocusEvent) => void) | undefined
37
- ): (_e: FocusEvent, target: Element) => (() => void) | undefined {
35
+ function createSyntheticBlurHandler(): (_e: FocusEvent, target: Element) => (() => void) | undefined {
38
36
  let isFocused = false;
39
37
  let observer: MutationObserver | null = null;
40
38
 
@@ -60,8 +58,11 @@ function createSyntheticBlurHandler(
60
58
 
61
59
  observer = new MutationObserver(() => {
62
60
  if (isFocused && (target as HTMLButtonElement).disabled) {
61
+ isFocused = false;
63
62
  observer?.disconnect();
64
- const relatedTarget = target === document.activeElement ? null : document.activeElement;
63
+ observer = null;
64
+ const ownerDocument = target.ownerDocument;
65
+ const relatedTarget = target === ownerDocument.activeElement ? null : ownerDocument.activeElement;
65
66
  target.dispatchEvent(new FocusEvent('blur', { relatedTarget }));
66
67
  target.dispatchEvent(new FocusEvent('focusout', { bubbles: true, relatedTarget }));
67
68
  }
@@ -94,7 +95,7 @@ export function createFocusWithin(props: FocusWithinProps = {}): FocusWithinResu
94
95
 
95
96
  // Global listeners manager
96
97
  const { addGlobalListener, removeAllGlobalListeners } = createGlobalListeners();
97
- const syntheticBlurHandler = createSyntheticBlurHandler(onBlurWithin);
98
+ const syntheticBlurHandler = createSyntheticBlurHandler();
98
99
  let cleanupRef: (() => void) | undefined;
99
100
 
100
101
  // Cleanup on unmount