@octanejs/aria 0.0.4 → 0.0.6

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 (210) hide show
  1. package/package.json +7 -5
  2. package/src/autocomplete/useAutocomplete.ts +656 -0
  3. package/src/collections/BaseCollection.ts +374 -0
  4. package/src/collections/CollectionBuilder.ts +343 -0
  5. package/src/collections/Document.ts +451 -0
  6. package/src/collections/Hidden.ts +84 -0
  7. package/src/collections/useCachedChildren.ts +103 -0
  8. package/src/components/Autocomplete.ts +124 -0
  9. package/src/components/Breadcrumbs.ts +170 -0
  10. package/src/components/Button.ts +209 -0
  11. package/src/components/Checkbox.ts +593 -0
  12. package/src/components/Collection.ts +301 -0
  13. package/src/components/ComboBox.ts +477 -0
  14. package/src/components/Dialog.ts +195 -0
  15. package/src/components/Disclosure.ts +322 -0
  16. package/src/components/DragAndDrop.ts +177 -0
  17. package/src/components/FieldError.ts +79 -0
  18. package/src/components/Form.ts +65 -0
  19. package/src/components/GridList.ts +1099 -0
  20. package/src/components/Group.ts +146 -0
  21. package/src/components/Header.ts +32 -0
  22. package/src/components/Heading.ts +45 -0
  23. package/src/components/Input.ts +139 -0
  24. package/src/components/Keyboard.ts +23 -0
  25. package/src/components/Label.ts +30 -0
  26. package/src/components/Link.ts +137 -0
  27. package/src/components/ListBox.ts +886 -0
  28. package/src/components/Menu.ts +685 -0
  29. package/src/components/Meter.ts +100 -0
  30. package/src/components/Modal.ts +352 -0
  31. package/src/components/NumberField.ts +221 -0
  32. package/src/components/OverlayArrow.ts +117 -0
  33. package/src/components/Popover.ts +385 -0
  34. package/src/components/ProgressBar.ts +112 -0
  35. package/src/components/RadioGroup.ts +542 -0
  36. package/src/components/SearchField.ts +208 -0
  37. package/src/components/Select.ts +505 -0
  38. package/src/components/SelectionIndicator.ts +52 -0
  39. package/src/components/Separator.ts +97 -0
  40. package/src/components/SharedElementTransition.ts +209 -0
  41. package/src/components/Slider.ts +472 -0
  42. package/src/components/Switch.ts +449 -0
  43. package/src/components/Table.ts +2618 -0
  44. package/src/components/Tabs.ts +675 -0
  45. package/src/components/TagGroup.ts +443 -0
  46. package/src/components/Text.ts +27 -0
  47. package/src/components/TextArea.ts +92 -0
  48. package/src/components/TextField.ts +200 -0
  49. package/src/components/ToggleButton.ts +147 -0
  50. package/src/components/ToggleButtonGroup.ts +106 -0
  51. package/src/components/Toolbar.ts +74 -0
  52. package/src/components/Tooltip.ts +249 -0
  53. package/src/components/Tree.ts +1450 -0
  54. package/src/components/TreeDropTargetDelegate.ts +363 -0
  55. package/src/components/index.ts +359 -0
  56. package/src/components/useDragAndDrop.ts +164 -0
  57. package/src/components/utils.ts +521 -0
  58. package/src/grid/GridKeyboardDelegate.ts +514 -0
  59. package/src/grid/useGrid.ts +263 -0
  60. package/src/grid/useGridCell.ts +346 -0
  61. package/src/grid/useGridRow.ts +108 -0
  62. package/src/grid/useGridRowGroup.ts +29 -0
  63. package/src/grid/utils.ts +24 -0
  64. package/src/index.ts +38 -0
  65. package/src/intl/autocomplete/ar-AE.json +3 -0
  66. package/src/intl/autocomplete/bg-BG.json +3 -0
  67. package/src/intl/autocomplete/cs-CZ.json +3 -0
  68. package/src/intl/autocomplete/da-DK.json +3 -0
  69. package/src/intl/autocomplete/de-DE.json +3 -0
  70. package/src/intl/autocomplete/el-GR.json +3 -0
  71. package/src/intl/autocomplete/en-US.json +3 -0
  72. package/src/intl/autocomplete/es-ES.json +3 -0
  73. package/src/intl/autocomplete/et-EE.json +3 -0
  74. package/src/intl/autocomplete/fi-FI.json +3 -0
  75. package/src/intl/autocomplete/fr-FR.json +3 -0
  76. package/src/intl/autocomplete/he-IL.json +3 -0
  77. package/src/intl/autocomplete/hr-HR.json +3 -0
  78. package/src/intl/autocomplete/hu-HU.json +3 -0
  79. package/src/intl/autocomplete/index.ts +82 -0
  80. package/src/intl/autocomplete/it-IT.json +3 -0
  81. package/src/intl/autocomplete/ja-JP.json +3 -0
  82. package/src/intl/autocomplete/ko-KR.json +3 -0
  83. package/src/intl/autocomplete/lt-LT.json +3 -0
  84. package/src/intl/autocomplete/lv-LV.json +3 -0
  85. package/src/intl/autocomplete/nb-NO.json +3 -0
  86. package/src/intl/autocomplete/nl-NL.json +3 -0
  87. package/src/intl/autocomplete/pl-PL.json +3 -0
  88. package/src/intl/autocomplete/pt-BR.json +3 -0
  89. package/src/intl/autocomplete/pt-PT.json +3 -0
  90. package/src/intl/autocomplete/ro-RO.json +3 -0
  91. package/src/intl/autocomplete/ru-RU.json +3 -0
  92. package/src/intl/autocomplete/sk-SK.json +3 -0
  93. package/src/intl/autocomplete/sl-SI.json +3 -0
  94. package/src/intl/autocomplete/sr-SP.json +3 -0
  95. package/src/intl/autocomplete/sv-SE.json +3 -0
  96. package/src/intl/autocomplete/tr-TR.json +3 -0
  97. package/src/intl/autocomplete/uk-UA.json +3 -0
  98. package/src/intl/autocomplete/zh-CN.json +3 -0
  99. package/src/intl/autocomplete/zh-TW.json +3 -0
  100. package/src/intl/breadcrumbs/index.ts +9 -2
  101. package/src/intl/combobox/index.ts +9 -2
  102. package/src/intl/compileMessages.ts +356 -0
  103. package/src/intl/grid/index.ts +9 -2
  104. package/src/intl/gridlist/index.ts +9 -2
  105. package/src/intl/menu/index.ts +9 -2
  106. package/src/intl/numberfield/index.ts +9 -2
  107. package/src/intl/overlays/index.ts +9 -2
  108. package/src/intl/searchfield/index.ts +9 -2
  109. package/src/intl/spinbutton/index.ts +9 -2
  110. package/src/intl/table/ar-AE.json +13 -0
  111. package/src/intl/table/bg-BG.json +13 -0
  112. package/src/intl/table/cs-CZ.json +13 -0
  113. package/src/intl/table/da-DK.json +13 -0
  114. package/src/intl/table/de-DE.json +13 -0
  115. package/src/intl/table/el-GR.json +13 -0
  116. package/src/intl/table/en-US.json +13 -0
  117. package/src/intl/table/es-ES.json +13 -0
  118. package/src/intl/table/et-EE.json +13 -0
  119. package/src/intl/table/fi-FI.json +13 -0
  120. package/src/intl/table/fr-FR.json +13 -0
  121. package/src/intl/table/he-IL.json +13 -0
  122. package/src/intl/table/hr-HR.json +13 -0
  123. package/src/intl/table/hu-HU.json +13 -0
  124. package/src/intl/table/index.ts +82 -0
  125. package/src/intl/table/it-IT.json +13 -0
  126. package/src/intl/table/ja-JP.json +13 -0
  127. package/src/intl/table/ko-KR.json +13 -0
  128. package/src/intl/table/lt-LT.json +13 -0
  129. package/src/intl/table/lv-LV.json +13 -0
  130. package/src/intl/table/nb-NO.json +13 -0
  131. package/src/intl/table/nl-NL.json +13 -0
  132. package/src/intl/table/pl-PL.json +13 -0
  133. package/src/intl/table/pt-BR.json +13 -0
  134. package/src/intl/table/pt-PT.json +13 -0
  135. package/src/intl/table/ro-RO.json +13 -0
  136. package/src/intl/table/ru-RU.json +13 -0
  137. package/src/intl/table/sk-SK.json +13 -0
  138. package/src/intl/table/sl-SI.json +13 -0
  139. package/src/intl/table/sr-SP.json +13 -0
  140. package/src/intl/table/sv-SE.json +13 -0
  141. package/src/intl/table/tr-TR.json +13 -0
  142. package/src/intl/table/uk-UA.json +13 -0
  143. package/src/intl/table/zh-CN.json +13 -0
  144. package/src/intl/table/zh-TW.json +13 -0
  145. package/src/intl/tag/index.ts +9 -2
  146. package/src/intl/tree/ar-AE.json +4 -0
  147. package/src/intl/tree/bg-BG.json +4 -0
  148. package/src/intl/tree/cs-CZ.json +4 -0
  149. package/src/intl/tree/da-DK.json +4 -0
  150. package/src/intl/tree/de-DE.json +4 -0
  151. package/src/intl/tree/el-GR.json +4 -0
  152. package/src/intl/tree/en-US.json +4 -0
  153. package/src/intl/tree/es-ES.json +4 -0
  154. package/src/intl/tree/et-EE.json +4 -0
  155. package/src/intl/tree/fi-FI.json +4 -0
  156. package/src/intl/tree/fr-FR.json +4 -0
  157. package/src/intl/tree/he-IL.json +4 -0
  158. package/src/intl/tree/hr-HR.json +4 -0
  159. package/src/intl/tree/hu-HU.json +4 -0
  160. package/src/intl/tree/index.ts +82 -0
  161. package/src/intl/tree/it-IT.json +4 -0
  162. package/src/intl/tree/ja-JP.json +4 -0
  163. package/src/intl/tree/ko-KR.json +4 -0
  164. package/src/intl/tree/lt-LT.json +4 -0
  165. package/src/intl/tree/lv-LV.json +4 -0
  166. package/src/intl/tree/nb-NO.json +4 -0
  167. package/src/intl/tree/nl-NL.json +4 -0
  168. package/src/intl/tree/pl-PL.json +4 -0
  169. package/src/intl/tree/pt-BR.json +4 -0
  170. package/src/intl/tree/pt-PT.json +4 -0
  171. package/src/intl/tree/ro-RO.json +4 -0
  172. package/src/intl/tree/ru-RU.json +4 -0
  173. package/src/intl/tree/sk-SK.json +4 -0
  174. package/src/intl/tree/sl-SI.json +4 -0
  175. package/src/intl/tree/sr-SP.json +4 -0
  176. package/src/intl/tree/sv-SE.json +4 -0
  177. package/src/intl/tree/tr-TR.json +4 -0
  178. package/src/intl/tree/uk-UA.json +4 -0
  179. package/src/intl/tree/zh-CN.json +4 -0
  180. package/src/intl/tree/zh-TW.json +4 -0
  181. package/src/stately/autocomplete/useAutocompleteState.ts +85 -0
  182. package/src/stately/grid/GridCollection.ts +200 -0
  183. package/src/stately/grid/useGridState.ts +160 -0
  184. package/src/stately/index.ts +43 -0
  185. package/src/stately/table/Cell.ts +49 -0
  186. package/src/stately/table/Column.ts +121 -0
  187. package/src/stately/table/Row.ts +145 -0
  188. package/src/stately/table/TableBody.ts +66 -0
  189. package/src/stately/table/TableCollection.ts +390 -0
  190. package/src/stately/table/TableColumnLayout.ts +148 -0
  191. package/src/stately/table/TableHeader.ts +65 -0
  192. package/src/stately/table/TableUtils.ts +269 -0
  193. package/src/stately/table/useTableColumnResizeState.ts +202 -0
  194. package/src/stately/table/useTableState.ts +235 -0
  195. package/src/stately/table/useTreeGridState.ts +248 -0
  196. package/src/table/TableKeyboardDelegate.ts +205 -0
  197. package/src/table/useTable.ts +175 -0
  198. package/src/table/useTableCell.ts +81 -0
  199. package/src/table/useTableColumnHeader.ts +155 -0
  200. package/src/table/useTableColumnResize.ts +374 -0
  201. package/src/table/useTableHeaderRow.ts +57 -0
  202. package/src/table/useTableRow.ts +198 -0
  203. package/src/table/useTableRowGroup.ts +13 -0
  204. package/src/table/useTableSelectionCheckbox.ts +105 -0
  205. package/src/table/utils.ts +42 -0
  206. package/src/tree/useTree.ts +76 -0
  207. package/src/tree/useTreeItem.ts +109 -0
  208. package/src/utils/animation.ts +149 -0
  209. package/src/utils/useLoadMoreSentinel.ts +78 -0
  210. package/src/utils/useViewportSize.ts +123 -0
@@ -0,0 +1,78 @@
1
+ // Ported from react-aria (source: .react-spectrum/packages/react-aria/src/utils/useLoadMoreSentinel.ts
2
+ // — react-aria's private `useLoadMoreSentinel` util, exposed to RAC as
3
+ // 'react-aria/private/utils/useLoadMoreSentinel'). First landed module-locally in
4
+ // ./components/ListBox.ts; hoisted here verbatim once GridList became the second
5
+ // consumer. octane adaptations: private-util slot threading (the trailing `slot`
6
+ // parameter — callers pass their derived sub-slot); explicit dep arrays are
7
+ // preserved verbatim.
8
+ import type { AsyncLoadable, Collection as ICollection, Node } from '@react-types/shared';
9
+
10
+ import { useRef } from 'octane';
11
+
12
+ import { subSlot } from '../internal';
13
+ import { getScrollParent } from './getScrollParent';
14
+ import { useEffectEvent } from './useEffectEvent';
15
+ import { useLayoutEffect } from './useLayoutEffect';
16
+
17
+ type RefObject<T> = { current: T };
18
+
19
+ export interface LoadMoreSentinelProps extends Omit<AsyncLoadable, 'isLoading'> {
20
+ collection: ICollection<Node<any>>;
21
+ /**
22
+ * The amount of offset from the bottom of your scrollable region that should trigger load more.
23
+ * Uses a percentage value relative to the scroll body's client height. Load more is then
24
+ * triggered when your current scroll position's distance from the bottom of the currently loaded
25
+ * list of items is less than or equal to the provided value. (e.g. 1 = 100% of the scroll
26
+ * region's height).
27
+ *
28
+ * @default 1
29
+ */
30
+ scrollOffset?: number;
31
+ }
32
+
33
+ export function useLoadMoreSentinel(
34
+ props: LoadMoreSentinelProps,
35
+ ref: RefObject<HTMLElement | null>,
36
+ slot: symbol | undefined,
37
+ ): void {
38
+ let { collection, onLoadMore, scrollOffset = 1 } = props;
39
+
40
+ let sentinelObserver = useRef<IntersectionObserver | null>(null, subSlot(slot, 'observer'));
41
+
42
+ let triggerLoadMore = useEffectEvent(
43
+ (entries: IntersectionObserverEntry[]) => {
44
+ // Use "isIntersecting" over an equality check of 0 since it seems like there is cases where
45
+ // a intersection ratio of 0 can be reported when isIntersecting is actually true
46
+ for (let entry of entries) {
47
+ // Note that this will be called if the collection changes, even if onLoadMore was already called and is being processed.
48
+ // Up to user discretion as to how to handle these multiple onLoadMore calls
49
+ if (entry.isIntersecting && onLoadMore) {
50
+ onLoadMore();
51
+ }
52
+ }
53
+ },
54
+ subSlot(slot, 'trigger'),
55
+ );
56
+
57
+ useLayoutEffect(
58
+ () => {
59
+ if (ref.current) {
60
+ // Tear down and set up a new IntersectionObserver when the collection changes so that we can properly trigger additional loadMores if there is room for more items
61
+ // Need to do this tear down and set up since using a large rootMargin will mean the observer's callback isn't called even when scrolling the item into view beause its visibility hasn't actually changed
62
+ sentinelObserver.current = new IntersectionObserver(triggerLoadMore, {
63
+ root: getScrollParent(ref?.current) as HTMLElement,
64
+ rootMargin: `0px ${100 * scrollOffset}% ${100 * scrollOffset}% ${100 * scrollOffset}%`,
65
+ });
66
+ sentinelObserver.current.observe(ref.current);
67
+ }
68
+
69
+ return () => {
70
+ if (sentinelObserver.current) {
71
+ sentinelObserver.current.disconnect();
72
+ }
73
+ };
74
+ },
75
+ [collection, ref, scrollOffset],
76
+ subSlot(slot, 'observe'),
77
+ );
78
+ }
@@ -0,0 +1,123 @@
1
+ // Ported from react-aria (source: .react-spectrum/packages/react-aria/src/utils/useViewportSize.ts).
2
+ // octane adaptations: hooks come from 'octane'; the public hook gets the binding's slot
3
+ // threading (splitSlot/subSlot); the explicit `[]` dep array on the listener effect is
4
+ // preserved verbatim.
5
+ import { useEffect, useState } from 'octane';
6
+
7
+ import { getActiveElement, getEventTarget } from './shadowdom/DOMFunctions';
8
+ import { isIOS } from './platform';
9
+ import { S, splitSlot, subSlot } from '../internal';
10
+ import { useIsSSR } from '../ssr/SSRProvider';
11
+ import { willOpenKeyboard } from './keyboard';
12
+
13
+ interface ViewportSize {
14
+ width: number;
15
+ height: number;
16
+ }
17
+
18
+ let visualViewport = typeof document !== 'undefined' && window.visualViewport;
19
+
20
+ export function useViewportSize(): ViewportSize;
21
+ // Slot-threading form: sibling ported hooks pass their derived sub-slot as the trailing arg.
22
+ export function useViewportSize(slot: symbol | undefined): ViewportSize;
23
+ export function useViewportSize(...args: any[]): ViewportSize {
24
+ const [, slotArg] = splitSlot(args);
25
+ const slot = slotArg ?? S('useViewportSize');
26
+
27
+ let isSSR = useIsSSR(subSlot(slot, 'ssr'));
28
+ let [size, setSize] = useState(
29
+ () => (isSSR ? { width: 0, height: 0 } : getViewportSize()),
30
+ subSlot(slot, 'size'),
31
+ );
32
+
33
+ useEffect(
34
+ () => {
35
+ let updateSize = (newSize: ViewportSize) => {
36
+ setSize((size: ViewportSize) => {
37
+ if (newSize.width === size.width && newSize.height === size.height) {
38
+ return size;
39
+ }
40
+ return newSize;
41
+ });
42
+ };
43
+
44
+ // Use visualViewport api to track available height even on iOS virtual keyboard opening
45
+ let onResize = () => {
46
+ // Ignore updates when zoomed.
47
+ if (visualViewport && visualViewport.scale > 1) {
48
+ return;
49
+ }
50
+
51
+ updateSize(getViewportSize());
52
+ };
53
+
54
+ // When closing the keyboard, iOS does not fire the visual viewport resize event until the animation is complete.
55
+ // We can anticipate this and resize early by handling the blur event and using the layout size.
56
+ let frame: number;
57
+ let onBlur = (e: FocusEvent) => {
58
+ if (visualViewport && visualViewport.scale > 1) {
59
+ return;
60
+ }
61
+
62
+ if (willOpenKeyboard(getEventTarget(e) as Element)) {
63
+ // Wait one frame to see if a new element gets focused.
64
+ frame = requestAnimationFrame(() => {
65
+ let activeElement = getActiveElement();
66
+ if (!activeElement || !willOpenKeyboard(activeElement)) {
67
+ updateSize({
68
+ width: document.documentElement.clientWidth,
69
+ height: document.documentElement.clientHeight,
70
+ });
71
+ }
72
+ });
73
+ }
74
+ };
75
+
76
+ updateSize(getViewportSize());
77
+
78
+ if (isIOS()) {
79
+ window.addEventListener('blur', onBlur, true);
80
+ }
81
+
82
+ if (!visualViewport) {
83
+ window.addEventListener('resize', onResize);
84
+ } else {
85
+ visualViewport.addEventListener('resize', onResize);
86
+ }
87
+
88
+ return () => {
89
+ cancelAnimationFrame(frame);
90
+ if (isIOS()) {
91
+ window.removeEventListener('blur', onBlur, true);
92
+ }
93
+ if (!visualViewport) {
94
+ window.removeEventListener('resize', onResize);
95
+ } else {
96
+ visualViewport.removeEventListener('resize', onResize);
97
+ }
98
+ };
99
+ },
100
+ [],
101
+ subSlot(slot, 'listen'),
102
+ );
103
+
104
+ return size;
105
+ }
106
+
107
+ /**
108
+ * Get the viewport size without the scrollbar.
109
+ */
110
+ function getViewportSize(): ViewportSize {
111
+ return {
112
+ // Multiply by the visualViewport scale to get the "natural" size, unaffected by pinch zooming.
113
+ width: visualViewport
114
+ ? // The visual viewport width may include the scrollbar gutter. We should use the minimum width between
115
+ // the visual viewport and the document element to ensure that the scrollbar width is always excluded.
116
+ // See: https://github.com/w3c/csswg-drafts/issues/8099
117
+ Math.min(visualViewport.width * visualViewport.scale, document.documentElement.clientWidth)
118
+ : document.documentElement.clientWidth,
119
+ height: visualViewport
120
+ ? visualViewport.height * visualViewport.scale
121
+ : document.documentElement.clientHeight,
122
+ };
123
+ }