@astryxdesign/core 0.7.3 → 0.7.4-canary.3f6ea7d

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 (116) hide show
  1. package/dist/BottomSheet/BottomSheet.d.ts +18 -6
  2. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  3. package/dist/BottomSheet/BottomSheet.js +268 -58
  4. package/dist/BottomSheet/BottomSheetSwitcher.d.ts +41 -12
  5. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  6. package/dist/BottomSheet/BottomSheetSwitcher.js +294 -165
  7. package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts +51 -1
  8. package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts.map +1 -1
  9. package/dist/BottomSheet/BottomSheetSwitcherContext.js +13 -1
  10. package/dist/Carousel/Carousel.d.ts.map +1 -1
  11. package/dist/Carousel/Carousel.js +7 -11
  12. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  13. package/dist/Chat/useTriggerMenu.js +46 -7
  14. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  15. package/dist/ComplexSelector/ComplexSelector.js +6 -1
  16. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  17. package/dist/ContextMenu/ContextMenu.js +12 -0
  18. package/dist/DateInput/DateInput.d.ts.map +1 -1
  19. package/dist/DateInput/DateInput.js +6 -1
  20. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  21. package/dist/DateInput/NativeDateField.js +6 -1
  22. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  23. package/dist/DateInput/TouchDateField.js +9 -1
  24. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  25. package/dist/DateRangeInput/DateRangeInput.js +6 -1
  26. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  27. package/dist/DateTimeInput/DateTimeInput.js +6 -1
  28. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  29. package/dist/DateTimeInput/TouchDateTimeField.js +9 -1
  30. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  31. package/dist/MultiSelector/MultiSelector.js +6 -1
  32. package/dist/Selector/Selector.d.ts.map +1 -1
  33. package/dist/Selector/Selector.js +6 -1
  34. package/dist/TextArea/TextArea.d.ts.map +1 -1
  35. package/dist/TextArea/TextArea.js +6 -1
  36. package/dist/TextInput/TextInput.d.ts.map +1 -1
  37. package/dist/TextInput/TextInput.js +6 -1
  38. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  39. package/dist/TimeInput/TimeInput.js +6 -1
  40. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  41. package/dist/TimeInput/TouchTimeField.js +9 -1
  42. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  43. package/dist/Tokenizer/Tokenizer.js +9 -1
  44. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  45. package/dist/Typeahead/BaseTypeahead.js +7 -1
  46. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  47. package/dist/Typeahead/Typeahead.js +9 -1
  48. package/dist/astryx.css +2 -0
  49. package/dist/hooks/useBusyAnnouncement.d.ts +22 -0
  50. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -0
  51. package/dist/hooks/useBusyAnnouncement.js +87 -0
  52. package/dist/hooks/useMenuPress.d.ts +2 -2
  53. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  54. package/dist/hooks/useMenuPress.js +5 -1
  55. package/dist/hooks/useTypeahead.d.ts.map +1 -1
  56. package/dist/hooks/useTypeahead.js +7 -2
  57. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  58. package/dist/i18n/generated-locales/en.generated.js +1 -0
  59. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  60. package/dist/i18n/generated-locales/pseudo.generated.js +1 -0
  61. package/locales/en.json +6 -2
  62. package/locales/pseudo.json +3 -0
  63. package/package.json +4 -4
  64. package/src/BottomSheet/BottomSheet.doc.mjs +2 -2
  65. package/src/BottomSheet/BottomSheet.spec.md +2 -5
  66. package/src/BottomSheet/BottomSheet.tsx +260 -47
  67. package/src/BottomSheet/BottomSheetEdgeTint.test.tsx +4 -2
  68. package/src/BottomSheet/BottomSheetSwitcher.doc.mjs +11 -10
  69. package/src/BottomSheet/BottomSheetSwitcher.spec.md +28 -35
  70. package/src/BottomSheet/BottomSheetSwitcher.test.tsx +830 -48
  71. package/src/BottomSheet/BottomSheetSwitcher.tsx +396 -215
  72. package/src/BottomSheet/BottomSheetSwitcherContext.ts +57 -2
  73. package/src/Carousel/Carousel.test.tsx +8 -12
  74. package/src/Carousel/Carousel.tsx +6 -13
  75. package/src/Chat/ChatComposerInput.test.tsx +167 -1
  76. package/src/Chat/useTriggerMenu.tsx +55 -6
  77. package/src/ComplexSelector/ComplexSelector.tsx +5 -1
  78. package/src/ContextMenu/ContextMenu.test.tsx +34 -0
  79. package/src/ContextMenu/ContextMenu.tsx +13 -1
  80. package/src/DateInput/DateInput.tsx +5 -1
  81. package/src/DateInput/DateInputTouch.test.tsx +45 -0
  82. package/src/DateInput/NativeDateField.test.tsx +10 -2
  83. package/src/DateInput/NativeDateField.tsx +5 -1
  84. package/src/DateInput/TouchDateField.tsx +14 -2
  85. package/src/DateRangeInput/DateRangeInput.tsx +5 -1
  86. package/src/DateTimeInput/DateTimeInput.tsx +5 -1
  87. package/src/DateTimeInput/TouchDateTimeField.tsx +14 -2
  88. package/src/MultiSelector/MultiSelector.test.tsx +18 -4
  89. package/src/MultiSelector/MultiSelector.tsx +5 -1
  90. package/src/ProgressBar/ProgressBar.test.tsx +4 -21
  91. package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +114 -0
  92. package/src/ProgressBar/__tests__/ProgressBar.a11y.known-failures.ts +12 -0
  93. package/src/ProgressBar/__tests__/ProgressBar.a11y.renders.tsx +38 -0
  94. package/src/ProgressBar/__tests__/ProgressBar.a11y.states.ts +123 -0
  95. package/src/ProgressBar/__tests__/ProgressBar.a11y.test.tsx +107 -0
  96. package/src/Selector/Selector.test.tsx +22 -5
  97. package/src/Selector/Selector.tsx +5 -1
  98. package/src/TextArea/TextArea.test.tsx +9 -1
  99. package/src/TextArea/TextArea.tsx +5 -1
  100. package/src/TextInput/TextInput.tsx +5 -1
  101. package/src/TimeInput/TimeInput.tsx +5 -1
  102. package/src/TimeInput/TouchTimeField.tsx +12 -2
  103. package/src/Tokenizer/Tokenizer.test.tsx +17 -12
  104. package/src/Tokenizer/Tokenizer.tsx +10 -1
  105. package/src/Typeahead/BaseTypeahead.tsx +14 -1
  106. package/src/Typeahead/Typeahead.test.tsx +32 -41
  107. package/src/Typeahead/Typeahead.tsx +10 -1
  108. package/src/__tests__/BusyOwnerAnnouncement.test.tsx +470 -0
  109. package/src/hooks/__tests__/MenuPressShadowRoot.a11y.chromium.spec.ts +50 -0
  110. package/src/hooks/useBusyAnnouncement.ts +100 -0
  111. package/src/hooks/useMenuPress.test.tsx +27 -1
  112. package/src/hooks/useMenuPress.ts +12 -3
  113. package/src/hooks/useTypeahead.test.tsx +42 -1
  114. package/src/hooks/useTypeahead.ts +7 -2
  115. package/src/i18n/generated-locales/en.generated.ts +1 -0
  116. package/src/i18n/generated-locales/pseudo.generated.ts +1 -0
@@ -10,7 +10,8 @@
10
10
  */
11
11
 
12
12
  import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
13
- import {renderHook} from '@testing-library/react';
13
+ import {Activity, type ReactNode} from 'react';
14
+ import {render, renderHook} from '@testing-library/react';
14
15
  import {useTypeahead} from './useTypeahead';
15
16
 
16
17
  const LABELS = ['Apple', 'Apricot', 'Banana', 'Cherry'] as const;
@@ -86,6 +87,46 @@ describe('useTypeahead', () => {
86
87
  expect(onMatch).toHaveBeenLastCalledWith(2);
87
88
  });
88
89
 
90
+ it('clears the pending buffer reset when the component unmounts', () => {
91
+ const {result, unmount} = renderHook(() =>
92
+ useTypeahead({getItemLabels: () => LABELS, onMatch: vi.fn()}),
93
+ );
94
+ result.current.onKeyDown(key('a'));
95
+ expect(vi.getTimerCount()).toBe(1);
96
+ unmount();
97
+ expect(vi.getTimerCount()).toBe(0);
98
+ });
99
+
100
+ it('empties the buffer when an Activity boundary hides the collection', () => {
101
+ const latest: {api: ReturnType<typeof useTypeahead> | null} = {api: null};
102
+ function Probe(): ReactNode {
103
+ latest.api = useTypeahead({
104
+ getItemLabels: () => LABELS,
105
+ onMatch: vi.fn(),
106
+ });
107
+ return null;
108
+ }
109
+ const {rerender} = render(
110
+ <Activity mode="visible">
111
+ <Probe />
112
+ </Activity>,
113
+ );
114
+ latest.api?.onKeyDown(key('a'));
115
+ rerender(
116
+ <Activity mode="hidden">
117
+ <Probe />
118
+ </Activity>,
119
+ );
120
+ expect(vi.getTimerCount()).toBe(0);
121
+ rerender(
122
+ <Activity mode="visible">
123
+ <Probe />
124
+ </Activity>,
125
+ );
126
+ // The typed prefix went with the hide, so a bare Space is not typeahead.
127
+ expect(latest.api?.onKeyDown(key(' '))).toBe(false);
128
+ });
129
+
89
130
  it('skips disabled items', () => {
90
131
  const {onMatch, api} = setup({disabledIndices: [0]}); // Apple disabled
91
132
  api.onKeyDown(key('a'));
@@ -4,7 +4,7 @@
4
4
 
5
5
  /**
6
6
  * @file useTypeahead.ts
7
- * @input Uses React useCallback/useRef
7
+ * @input Uses React useCallback/useEffect/useRef
8
8
  * @output Exports useTypeahead hook for first-character (type-to-focus) search
9
9
  * @position Core hook; adds APG typeahead to menus, listboxes, and other
10
10
  * collections. Composes with useListFocus/useGridFocus (or any collection)
@@ -14,7 +14,7 @@
14
14
  * - /packages/core/src/hooks/index.ts
15
15
  */
16
16
 
17
- import {useCallback, useRef} from 'react';
17
+ import {useCallback, useEffect, useRef} from 'react';
18
18
 
19
19
  export interface UseTypeaheadOptions {
20
20
  /**
@@ -135,6 +135,11 @@ export function useTypeahead(options: UseTypeaheadOptions): UseTypeaheadReturn {
135
135
  }
136
136
  }, []);
137
137
 
138
+ // A collection that unmounts, or that an `<Activity>` boundary hides,
139
+ // mid-typing leaves no reset timer running and comes back with an empty
140
+ // buffer, as the reset would have left it.
141
+ useEffect(() => reset, [reset]);
142
+
138
143
  const scheduleReset = useCallback(() => {
139
144
  if (timeoutRef.current) {
140
145
  clearTimeout(timeoutRef.current);
@@ -340,6 +340,7 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
340
340
  '@astryx.chatToolCalls.status.complete': 'Complete',
341
341
  '@astryx.chatToolCalls.status.error': 'Failed',
342
342
  '@astryx.chatToolCalls.groupLabel': '{count} tool calls',
343
+ '@astryx.chatTriggerMenu.searching': 'Searching…',
343
344
  '@astryx.chatTriggerMenu.suggestions': 'Suggestions',
344
345
  '@astryx.citation.label': 'Citation {number}: {title}',
345
346
  '@astryx.codeBlock.copied': 'Copied',
@@ -347,6 +347,7 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
347
347
  '@astryx.chatToolCalls.status.complete': '⟦Çóɱþłéţé⟧',
348
348
  '@astryx.chatToolCalls.status.error': '⟦Ƒàíłéð⟧',
349
349
  '@astryx.chatToolCalls.groupLabel': '⟦{count} ţóół çàłłš⟧',
350
+ '@astryx.chatTriggerMenu.searching': '⟦Šéàřçĥíñĝ…⟧',
350
351
  '@astryx.chatTriggerMenu.suggestions': '⟦Šúĝĝéšţíóñš⟧',
351
352
  '@astryx.citation.label': '⟦Çíţàţíóñ {number}: {title}⟧',
352
353
  '@astryx.codeBlock.copied': '⟦Çóþíéð⟧',