@happyvertical/smrt-ui 0.53.1 → 0.53.3

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 (205) hide show
  1. package/package.json +3 -3
  2. package/dist/actions/__tests__/ripple.test.js +0 -82
  3. package/dist/actions/__tests__/swipe-dismiss.test.js +0 -69
  4. package/dist/components/calendar/__tests__/CalendarView.test.js +0 -226
  5. package/dist/components/calendar/__tests__/calendar-model.test.js +0 -138
  6. package/dist/components/chat/__tests__/chat-primitives.test.js +0 -118
  7. package/dist/components/data/__tests__/CollectionList.test.js +0 -37
  8. package/dist/components/data/__tests__/DataTable.test.js +0 -807
  9. package/dist/components/data/__tests__/DataTableConformance.test.js +0 -212
  10. package/dist/components/data/__tests__/DataTableController.test.js +0 -371
  11. package/dist/components/data/__tests__/DataTableIdentity.test.js +0 -29
  12. package/dist/components/data/__tests__/DataTableLayout.test.js +0 -195
  13. package/dist/components/data/__tests__/DataTablePerformance.test.js +0 -21
  14. package/dist/components/data/__tests__/DataTableResponsive.test.js +0 -80
  15. package/dist/components/data/__tests__/DataTableVirtualization.test.js +0 -80
  16. package/dist/components/data/__tests__/DataTableVirtualizationComponent.test.js +0 -255
  17. package/dist/components/data/__tests__/SortableHeader.test.js +0 -101
  18. package/dist/components/data/__tests__/data-surface.test.js +0 -746
  19. package/dist/components/data/__tests__/data-table-helpers.test.js +0 -36
  20. package/dist/components/data/__tests__/data-table-surface.test.js +0 -49
  21. package/dist/components/data/__tests__/link-step-surface.test.js +0 -172
  22. package/dist/components/data/__tests__/list-sort-state.svelte.test.js +0 -71
  23. package/dist/components/data/__tests__/list-sort.test.js +0 -91
  24. package/dist/components/data/__tests__/mounted-data-surface.test.js +0 -794
  25. package/dist/components/data/__tests__/responsive-table.fixture.svelte +0 -29
  26. package/dist/components/data/__tests__/responsive-table.fixture.svelte.d.ts +0 -7
  27. package/dist/components/data/__tests__/responsive-table.fixture.svelte.d.ts.map +0 -1
  28. package/dist/components/data/__tests__/surface-navigation.test.js +0 -121
  29. package/dist/components/display/__tests__/ConfidenceBadge.test.js +0 -109
  30. package/dist/components/display/__tests__/CurrencyDisplay.test.js +0 -304
  31. package/dist/components/display/__tests__/CurrencyDisplayI18nHarness.svelte +0 -20
  32. package/dist/components/display/__tests__/CurrencyDisplayI18nHarness.svelte.d.ts +0 -19
  33. package/dist/components/display/__tests__/CurrencyDisplayI18nHarness.svelte.d.ts.map +0 -1
  34. package/dist/components/display/__tests__/CurrencyDisplaySsrHarness.svelte +0 -7
  35. package/dist/components/display/__tests__/CurrencyDisplaySsrHarness.svelte.d.ts +0 -19
  36. package/dist/components/display/__tests__/CurrencyDisplaySsrHarness.svelte.d.ts.map +0 -1
  37. package/dist/components/display/__tests__/DateDisplay.test.js +0 -195
  38. package/dist/components/display/__tests__/Icon.test.js +0 -223
  39. package/dist/components/display/__tests__/StatusBadge.test.js +0 -191
  40. package/dist/components/feedback/__tests__/ConfirmDialog.test.js +0 -181
  41. package/dist/components/feedback/__tests__/LoadingOverlay.test.js +0 -113
  42. package/dist/components/feedback/__tests__/Modal.test.js +0 -72
  43. package/dist/components/feedback/__tests__/PhoneSheet.test.js +0 -101
  44. package/dist/components/feedback/__tests__/ProgressBar.test.js +0 -89
  45. package/dist/components/feedback/__tests__/WorkingStrip.test.js +0 -172
  46. package/dist/components/feedback/__tests__/confirm-message.fixture.svelte +0 -9
  47. package/dist/components/feedback/__tests__/confirm-message.fixture.svelte.d.ts +0 -19
  48. package/dist/components/feedback/__tests__/confirm-message.fixture.svelte.d.ts.map +0 -1
  49. package/dist/components/feedback/__tests__/toast.test.js +0 -190
  50. package/dist/components/forms/__tests__/CameraCapture.test.js +0 -504
  51. package/dist/components/forms/__tests__/Combobox.test.js +0 -354
  52. package/dist/components/forms/__tests__/ControlHitArea.test.js +0 -73
  53. package/dist/components/forms/__tests__/DictationButton.test.js +0 -176
  54. package/dist/components/forms/__tests__/Fieldset.test.js +0 -37
  55. package/dist/components/forms/__tests__/Form.test.js +0 -201
  56. package/dist/components/forms/__tests__/FormActionBar.test.js +0 -22
  57. package/dist/components/forms/__tests__/FormGroup.test.js +0 -48
  58. package/dist/components/forms/__tests__/Input.test.js +0 -49
  59. package/dist/components/forms/__tests__/Listbox.test.js +0 -303
  60. package/dist/components/forms/__tests__/MultiSelect.test.js +0 -281
  61. package/dist/components/forms/__tests__/SearchInput.test.js +0 -92
  62. package/dist/components/forms/__tests__/Select.test.js +0 -37
  63. package/dist/components/forms/__tests__/SignaturePad.test.js +0 -338
  64. package/dist/components/forms/__tests__/StagedControlReview.test.js +0 -702
  65. package/dist/components/forms/__tests__/Textarea.test.js +0 -39
  66. package/dist/components/forms/__tests__/Toggle.test.js +0 -87
  67. package/dist/components/forms/__tests__/camera-capture-session.test.js +0 -207
  68. package/dist/components/forms/__tests__/capture-form-retry.test.js +0 -166
  69. package/dist/components/forms/__tests__/capture-form.fixture.svelte +0 -38
  70. package/dist/components/forms/__tests__/capture-form.fixture.svelte.d.ts +0 -10
  71. package/dist/components/forms/__tests__/capture-form.fixture.svelte.d.ts.map +0 -1
  72. package/dist/components/forms/__tests__/capture-test-env.d.ts +0 -70
  73. package/dist/components/forms/__tests__/capture-test-env.d.ts.map +0 -1
  74. package/dist/components/forms/__tests__/capture-test-env.js +0 -122
  75. package/dist/components/forms/__tests__/capture-touch.fixture.svelte +0 -15
  76. package/dist/components/forms/__tests__/capture-touch.fixture.svelte.d.ts +0 -8
  77. package/dist/components/forms/__tests__/capture-touch.fixture.svelte.d.ts.map +0 -1
  78. package/dist/components/forms/__tests__/combobox-form.fixture.svelte +0 -29
  79. package/dist/components/forms/__tests__/combobox-form.fixture.svelte.d.ts +0 -14
  80. package/dist/components/forms/__tests__/combobox-form.fixture.svelte.d.ts.map +0 -1
  81. package/dist/components/forms/__tests__/combobox-labels.fixture.svelte +0 -19
  82. package/dist/components/forms/__tests__/combobox-labels.fixture.svelte.d.ts +0 -11
  83. package/dist/components/forms/__tests__/combobox-labels.fixture.svelte.d.ts.map +0 -1
  84. package/dist/components/forms/__tests__/composite-controls.fixture.svelte +0 -47
  85. package/dist/components/forms/__tests__/composite-controls.fixture.svelte.d.ts +0 -12
  86. package/dist/components/forms/__tests__/composite-controls.fixture.svelte.d.ts.map +0 -1
  87. package/dist/components/forms/__tests__/composite-controls.test.js +0 -128
  88. package/dist/components/forms/__tests__/composite-registration.fixture.svelte +0 -29
  89. package/dist/components/forms/__tests__/composite-registration.fixture.svelte.d.ts +0 -8
  90. package/dist/components/forms/__tests__/composite-registration.fixture.svelte.d.ts.map +0 -1
  91. package/dist/components/forms/__tests__/composite-user-edit.fixture.svelte +0 -41
  92. package/dist/components/forms/__tests__/composite-user-edit.fixture.svelte.d.ts +0 -13
  93. package/dist/components/forms/__tests__/composite-user-edit.fixture.svelte.d.ts.map +0 -1
  94. package/dist/components/forms/__tests__/control-interaction.test.js +0 -3421
  95. package/dist/components/forms/__tests__/control-proposals.test.js +0 -63
  96. package/dist/components/forms/__tests__/core-controls.fixture.svelte +0 -50
  97. package/dist/components/forms/__tests__/core-controls.fixture.svelte.d.ts +0 -9
  98. package/dist/components/forms/__tests__/core-controls.fixture.svelte.d.ts.map +0 -1
  99. package/dist/components/forms/__tests__/core-controls.test.js +0 -311
  100. package/dist/components/forms/__tests__/decimal-sliders.fixture.svelte +0 -25
  101. package/dist/components/forms/__tests__/decimal-sliders.fixture.svelte.d.ts +0 -8
  102. package/dist/components/forms/__tests__/decimal-sliders.fixture.svelte.d.ts.map +0 -1
  103. package/dist/components/forms/__tests__/dictation-recording.test.js +0 -582
  104. package/dist/components/forms/__tests__/dictation.test.js +0 -486
  105. package/dist/components/forms/__tests__/form-attachment.fixture.svelte +0 -28
  106. package/dist/components/forms/__tests__/form-attachment.fixture.svelte.d.ts +0 -11
  107. package/dist/components/forms/__tests__/form-attachment.fixture.svelte.d.ts.map +0 -1
  108. package/dist/components/forms/__tests__/form-group-input.fixture.svelte +0 -16
  109. package/dist/components/forms/__tests__/form-group-input.fixture.svelte.d.ts +0 -9
  110. package/dist/components/forms/__tests__/form-group-input.fixture.svelte.d.ts.map +0 -1
  111. package/dist/components/forms/__tests__/form-retry-form.fixture.svelte +0 -31
  112. package/dist/components/forms/__tests__/form-retry-form.fixture.svelte.d.ts +0 -13
  113. package/dist/components/forms/__tests__/form-retry-form.fixture.svelte.d.ts.map +0 -1
  114. package/dist/components/forms/__tests__/form-retry-form.test.js +0 -107
  115. package/dist/components/forms/__tests__/hidden-controls-form-retry.test.js +0 -69
  116. package/dist/components/forms/__tests__/hidden-controls-form.fixture.svelte +0 -29
  117. package/dist/components/forms/__tests__/hidden-controls-form.fixture.svelte.d.ts +0 -9
  118. package/dist/components/forms/__tests__/hidden-controls-form.fixture.svelte.d.ts.map +0 -1
  119. package/dist/components/forms/__tests__/listbox-form.fixture.svelte +0 -27
  120. package/dist/components/forms/__tests__/listbox-form.fixture.svelte.d.ts +0 -13
  121. package/dist/components/forms/__tests__/listbox-form.fixture.svelte.d.ts.map +0 -1
  122. package/dist/components/forms/__tests__/long-press.test.js +0 -175
  123. package/dist/components/forms/__tests__/multiselect-form.fixture.svelte +0 -27
  124. package/dist/components/forms/__tests__/multiselect-form.fixture.svelte.d.ts +0 -13
  125. package/dist/components/forms/__tests__/multiselect-form.fixture.svelte.d.ts.map +0 -1
  126. package/dist/components/forms/__tests__/native-file-field.test.js +0 -177
  127. package/dist/components/forms/__tests__/place-picker.fixture.svelte +0 -33
  128. package/dist/components/forms/__tests__/place-picker.fixture.svelte.d.ts +0 -12
  129. package/dist/components/forms/__tests__/place-picker.fixture.svelte.d.ts.map +0 -1
  130. package/dist/components/forms/__tests__/segmented-posting.fixture.svelte +0 -28
  131. package/dist/components/forms/__tests__/segmented-posting.fixture.svelte.d.ts +0 -12
  132. package/dist/components/forms/__tests__/segmented-posting.fixture.svelte.d.ts.map +0 -1
  133. package/dist/components/forms/__tests__/segmented-posting.test.js +0 -92
  134. package/dist/components/forms/__tests__/select-interaction.fixture.svelte +0 -25
  135. package/dist/components/forms/__tests__/select-interaction.fixture.svelte.d.ts +0 -9
  136. package/dist/components/forms/__tests__/select-interaction.fixture.svelte.d.ts.map +0 -1
  137. package/dist/components/forms/__tests__/signature-pad-logic.test.js +0 -54
  138. package/dist/components/forms/__tests__/staged-review-fieldset.fixture.svelte +0 -21
  139. package/dist/components/forms/__tests__/staged-review-fieldset.fixture.svelte.d.ts +0 -8
  140. package/dist/components/forms/__tests__/staged-review-fieldset.fixture.svelte.d.ts.map +0 -1
  141. package/dist/components/forms/__tests__/staged-review-outer-fieldset.fixture.svelte +0 -23
  142. package/dist/components/forms/__tests__/staged-review-outer-fieldset.fixture.svelte.d.ts +0 -8
  143. package/dist/components/forms/__tests__/staged-review-outer-fieldset.fixture.svelte.d.ts.map +0 -1
  144. package/dist/components/forms/__tests__/staged-review.fixture.svelte +0 -56
  145. package/dist/components/forms/__tests__/staged-review.fixture.svelte.d.ts +0 -12
  146. package/dist/components/forms/__tests__/staged-review.fixture.svelte.d.ts.map +0 -1
  147. package/dist/components/forms/__tests__/touch-density.fixture.svelte +0 -34
  148. package/dist/components/forms/__tests__/touch-density.fixture.svelte.d.ts +0 -8
  149. package/dist/components/forms/__tests__/touch-density.fixture.svelte.d.ts.map +0 -1
  150. package/dist/components/forms/__tests__/touch-density.test.js +0 -66
  151. package/dist/components/forms/form-retry/__tests__/boundaries.test.js +0 -23
  152. package/dist/components/forms/form-retry/__tests__/content-digest.test.js +0 -70
  153. package/dist/components/forms/form-retry/__tests__/controller.test.js +0 -802
  154. package/dist/components/forms/form-retry/__tests__/fake-kit.d.ts +0 -82
  155. package/dist/components/forms/form-retry/__tests__/fake-kit.d.ts.map +0 -1
  156. package/dist/components/forms/form-retry/__tests__/fake-kit.js +0 -180
  157. package/dist/components/forms/form-retry/__tests__/form-draft.test.js +0 -169
  158. package/dist/components/forms/form-retry/__tests__/ssr.test.js +0 -37
  159. package/dist/components/forms/form-retry/__tests__/storage.d.ts +0 -26
  160. package/dist/components/forms/form-retry/__tests__/storage.d.ts.map +0 -1
  161. package/dist/components/forms/form-retry/__tests__/storage.js +0 -63
  162. package/dist/components/forms/form-retry/__tests__/submission-key.test.js +0 -236
  163. package/dist/components/forms/form-retry/__tests__/submitted-draft.test.js +0 -334
  164. package/dist/components/layout/__tests__/Container.test.js +0 -62
  165. package/dist/components/layout/__tests__/EmptyState.test.js +0 -83
  166. package/dist/components/layout/__tests__/Footer.test.js +0 -50
  167. package/dist/components/layout/__tests__/Grid.test.js +0 -121
  168. package/dist/components/layout/__tests__/Header.test.js +0 -48
  169. package/dist/components/layout/__tests__/Masthead.test.js +0 -93
  170. package/dist/components/layout/__tests__/PageHeader.test.js +0 -166
  171. package/dist/components/layout/__tests__/SummaryCard.test.js +0 -104
  172. package/dist/components/nav/__tests__/FilterChips.test.js +0 -94
  173. package/dist/components/nav/__tests__/LinkTabs.test.js +0 -117
  174. package/dist/components/nav/__tests__/Tabs.test.js +0 -128
  175. package/dist/components/roles/__tests__/RoleSelector.test.js +0 -134
  176. package/dist/components/ui/__tests__/Badge.test.js +0 -76
  177. package/dist/components/ui/__tests__/Button.test.js +0 -166
  178. package/dist/components/ui/__tests__/Card.test.js +0 -103
  179. package/dist/components/ui/__tests__/IconToggle.test.js +0 -59
  180. package/dist/components/ui/__tests__/IconToggleGroup.test.js +0 -30
  181. package/dist/components/ui/__tests__/Pagination.test.js +0 -113
  182. package/dist/components/ui/__tests__/Popover.test.js +0 -44
  183. package/dist/components/ui/__tests__/dropdown-popover-icon.test.js +0 -125
  184. package/dist/components/ui/__tests__/gap-primitives-interactive.test.js +0 -112
  185. package/dist/components/ui/__tests__/gap-primitives.test.js +0 -84
  186. package/dist/components/ui/__tests__/interaction-primitives.fixture.svelte +0 -13
  187. package/dist/components/ui/__tests__/interaction-primitives.fixture.svelte.d.ts +0 -19
  188. package/dist/components/ui/__tests__/interaction-primitives.fixture.svelte.d.ts.map +0 -1
  189. package/dist/components/ui/__tests__/interaction-primitives.test.js +0 -31
  190. package/dist/components/ui/__tests__/phone-touch-targets.test.js +0 -39
  191. package/dist/i18n/__tests__/i18n.test.js +0 -74
  192. package/dist/i18n/__tests__/render-parity.spec.js +0 -37
  193. package/dist/svelte/__tests__/playground.test.js +0 -20
  194. package/dist/themes/__tests__/control-boundary-contrast.test.js +0 -112
  195. package/dist/themes/__tests__/create-theme.test.js +0 -79
  196. package/dist/themes/__tests__/css-generator.test.js +0 -129
  197. package/dist/themes/__tests__/happyvertical-theme.test.js +0 -231
  198. package/dist/themes/__tests__/registry.test.js +0 -43
  199. package/dist/themes/__tests__/styles-lockstep.test.js +0 -32
  200. package/dist/themes/__tests__/theme-provider.test.js +0 -147
  201. package/dist/themes/__tests__/theme-script.test.js +0 -130
  202. package/dist/themes/__tests__/token-aliases.test.js +0 -178
  203. package/dist/utils/forms/__tests__/formatters.test.js +0 -27
  204. package/dist/utils/theme/__tests__/color.test.js +0 -89
  205. package/dist/utils/theme/__tests__/typography.test.js +0 -11
@@ -1,172 +0,0 @@
1
- import { render, screen } from '@testing-library/svelte';
2
- import userEvent from '@testing-library/user-event';
3
- import { describe, expect, it, vi } from 'vitest';
4
- import WorkingStrip from '../WorkingStrip.svelte';
5
- describe('WorkingStrip', () => {
6
- it('renders nothing but an empty live region while idle', () => {
7
- const { container } = render(WorkingStrip, {
8
- props: { status: { phase: 'idle', label: null } },
9
- });
10
- expect(screen.queryByTestId('working-strip')).toBeNull();
11
- const live = container.querySelector('[aria-live="polite"]');
12
- expect(live?.textContent?.trim()).toBe('');
13
- });
14
- it('announces the status and reopens the surface from the strip', async () => {
15
- const onopen = vi.fn();
16
- const onstop = vi.fn();
17
- const { container } = render(WorkingStrip, {
18
- props: {
19
- status: { phase: 'working', label: 'Writing the summary' },
20
- canStop: true,
21
- onopen,
22
- onstop,
23
- openLabel: 'Open the assistant',
24
- },
25
- });
26
- expect(container.querySelector('[aria-live="polite"]')?.textContent).toContain('Writing the summary');
27
- await userEvent.click(screen.getByRole('button', {
28
- name: 'Writing the summary. Open the assistant',
29
- }));
30
- expect(onopen).toHaveBeenCalledTimes(1);
31
- await userEvent.click(screen.getByRole('button', { name: 'Stop' }));
32
- expect(onstop).toHaveBeenCalledTimes(1);
33
- });
34
- it('falls back to default labels and hides Stop unless it can stop', () => {
35
- render(WorkingStrip, {
36
- props: { status: { phase: 'working', label: null } },
37
- });
38
- expect(screen.getByTestId('working-strip').textContent).toContain('Working…');
39
- expect(screen.queryByRole('button', { name: 'Stop' })).toBeNull();
40
- });
41
- it('shows Done without a spinner or Stop', () => {
42
- const { container } = render(WorkingStrip, {
43
- props: {
44
- status: { phase: 'done', label: null },
45
- canStop: true,
46
- variant: 'inline',
47
- },
48
- });
49
- const strip = screen.getByTestId('working-strip');
50
- expect(strip).toHaveAttribute('data-phase', 'done');
51
- expect(strip.textContent).toContain('Done');
52
- expect(container.querySelector('.working-strip__spinner')).toBeNull();
53
- expect(screen.queryByRole('button', { name: 'Stop' })).toBeNull();
54
- });
55
- it('goes green with a check once done, red with a cross once failed', () => {
56
- const { rerender } = render(WorkingStrip, {
57
- props: {
58
- status: { phase: 'done', label: null, goal: 'Show me meetings' },
59
- variant: 'floating',
60
- },
61
- });
62
- const strip = screen.getByTestId('working-strip');
63
- expect(strip).toHaveAttribute('data-phase', 'done');
64
- expect(strip.textContent).toContain('Show me meetings');
65
- expect(strip.textContent).toContain('✓');
66
- rerender({
67
- status: { phase: 'failed', label: null, goal: 'Show me meetings' },
68
- variant: 'floating',
69
- });
70
- expect(screen.getByTestId('working-strip')).toHaveAttribute('data-phase', 'failed');
71
- expect(screen.getByTestId('working-strip').textContent).toContain("Couldn't finish");
72
- });
73
- it('offers Pause while working, Continue while paused, and Esc pauses', async () => {
74
- const onpause = vi.fn();
75
- const onresume = vi.fn();
76
- const onstop = vi.fn();
77
- const { rerender } = render(WorkingStrip, {
78
- props: {
79
- status: { phase: 'working', label: 'Opening Events' },
80
- variant: 'floating',
81
- canStop: true,
82
- onpause,
83
- onresume,
84
- onstop,
85
- },
86
- });
87
- await userEvent.click(screen.getByRole('button', { name: 'Pause' }));
88
- expect(onpause).toHaveBeenCalledTimes(1);
89
- screen.getByRole('button', { name: 'Pause' }).focus();
90
- await userEvent.keyboard('{Escape}');
91
- expect(onpause).toHaveBeenCalledTimes(2);
92
- rerender({
93
- status: { phase: 'paused', label: null },
94
- variant: 'floating',
95
- canStop: true,
96
- onpause,
97
- onresume,
98
- onstop,
99
- });
100
- expect(screen.queryByRole('button', { name: 'Pause' })).toBeNull();
101
- await userEvent.click(screen.getByRole('button', { name: 'Continue' }));
102
- expect(onresume).toHaveBeenCalledTimes(1);
103
- await userEvent.click(screen.getByRole('button', { name: 'Stop' }));
104
- expect(onstop).toHaveBeenCalledTimes(1);
105
- });
106
- it('asks for the person assertively while waiting, with Review', async () => {
107
- const onreview = vi.fn();
108
- const { container } = render(WorkingStrip, {
109
- props: {
110
- status: {
111
- phase: 'waiting',
112
- label: 'A change is ready for you',
113
- goal: 'Fill the event form',
114
- },
115
- variant: 'floating',
116
- onreview,
117
- },
118
- });
119
- expect(container.querySelector('[aria-live="assertive"]')?.textContent).toContain('A change is ready for you');
120
- expect(container.querySelector('[aria-live="polite"]')?.textContent?.trim()).toBe('');
121
- await userEvent.click(screen.getByRole('button', { name: 'Review' }));
122
- expect(onreview).toHaveBeenCalledTimes(1);
123
- });
124
- it('never takes focus by itself', async () => {
125
- const outside = document.createElement('button');
126
- document.body.append(outside);
127
- outside.focus();
128
- const { rerender } = render(WorkingStrip, {
129
- props: {
130
- status: { phase: 'working', label: 'Step one' },
131
- variant: 'floating',
132
- onpause: vi.fn(),
133
- onopen: vi.fn(),
134
- },
135
- });
136
- rerender({
137
- status: { phase: 'waiting', label: 'Your turn' },
138
- variant: 'floating',
139
- onreview: vi.fn(),
140
- onopen: vi.fn(),
141
- });
142
- expect(document.activeElement).toBe(outside);
143
- outside.remove();
144
- });
145
- it('throttles polite step announcements', async () => {
146
- vi.useFakeTimers();
147
- try {
148
- const { container, rerender } = render(WorkingStrip, {
149
- props: {
150
- status: { phase: 'working', label: 'Step one' },
151
- announceIntervalMs: 2000,
152
- },
153
- });
154
- const live = () => container.querySelector('[aria-live="polite"]')?.textContent?.trim();
155
- expect(live()).toBe('Step one');
156
- await rerender({
157
- status: { phase: 'working', label: 'Step two' },
158
- announceIntervalMs: 2000,
159
- });
160
- await rerender({
161
- status: { phase: 'working', label: 'Step three' },
162
- announceIntervalMs: 2000,
163
- });
164
- expect(live()).toBe('Step one');
165
- await vi.advanceTimersByTimeAsync(2000);
166
- expect(live()).toBe('Step three');
167
- }
168
- finally {
169
- vi.useRealTimers();
170
- }
171
- });
172
- });
@@ -1,9 +0,0 @@
1
- <script lang="ts">
2
- import ConfirmDialog from '../ConfirmDialog.svelte';
3
- </script>
4
-
5
- {#snippet message()}
6
- Remove <strong>Record name</strong>?
7
- <ul><li>Notes</li><li>Attachments</li></ul>
8
- {/snippet}
9
- <ConfirmDialog open title="Rich confirmation" {message} />
@@ -1,19 +0,0 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const ConfirmMessage: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
- [evt: string]: CustomEvent<any>;
16
- }, {}, {}, string>;
17
- type ConfirmMessage = InstanceType<typeof ConfirmMessage>;
18
- export default ConfirmMessage;
19
- //# sourceMappingURL=confirm-message.fixture.svelte.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"confirm-message.fixture.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/__tests__/confirm-message.fixture.svelte.ts"],"names":[],"mappings":"AAgBA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,cAAc;;kBAA+E,CAAC;AAClF,KAAK,cAAc,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,CAAC;AAC5D,eAAe,cAAc,CAAC"}
@@ -1,190 +0,0 @@
1
- import { act, fireEvent, render, screen } from '@testing-library/svelte';
2
- import userEvent from '@testing-library/user-event';
3
- import { describe, expect, it, vi } from 'vitest';
4
- import ToastViewport from '../ToastViewport.svelte';
5
- import { createToaster } from '../toast.js';
6
- describe('toast', () => {
7
- it('publishes, acts on, and dismisses notifications', async () => {
8
- const toaster = createToaster();
9
- const action = vi.fn();
10
- render(ToastViewport, { props: { toaster } });
11
- toaster.show({
12
- message: 'Draft restored',
13
- duration: 0,
14
- action: { label: 'Undo', run: action },
15
- });
16
- expect(await screen.findByText('Draft restored')).toBeInTheDocument();
17
- await userEvent.click(screen.getByRole('button', { name: 'Undo' }));
18
- expect(action).toHaveBeenCalledTimes(1);
19
- expect(screen.queryByText('Draft restored')).not.toBeInTheDocument();
20
- });
21
- it('provides success and error conveniences', () => {
22
- const toaster = createToaster();
23
- const seen = [];
24
- toaster.subscribe((toasts) => seen.push(...toasts.map((toast) => toast.variant)));
25
- toaster.success('Saved', { duration: 0 });
26
- toaster.error('Failed', { duration: 0 });
27
- expect(seen).toEqual(expect.arrayContaining(['success', 'error']));
28
- });
29
- it('restarts dismissal timing when a toast id is reused', () => {
30
- vi.useFakeTimers();
31
- try {
32
- const toaster = createToaster();
33
- let visibleIds = [];
34
- toaster.subscribe((toasts) => {
35
- visibleIds = toasts.map((toast) => toast.id);
36
- });
37
- toaster.show({ id: 'saving', message: 'Saving', duration: 1000 });
38
- vi.advanceTimersByTime(500);
39
- toaster.show({ id: 'saving', message: 'Still saving', duration: 1000 });
40
- vi.advanceTimersByTime(500);
41
- expect(visibleIds).toEqual(['saving']);
42
- vi.advanceTimersByTime(500);
43
- expect(visibleIds).toEqual([]);
44
- }
45
- finally {
46
- vi.useRealTimers();
47
- }
48
- });
49
- });
50
- describe('toast dismissal interactions', () => {
51
- it('preserves the remaining duration until every pause reason clears', () => {
52
- vi.useFakeTimers();
53
- try {
54
- const toaster = createToaster();
55
- let visible = 0;
56
- toaster.subscribe((toasts) => {
57
- visible = toasts.length;
58
- });
59
- const id = toaster.show({ message: 'Saved', duration: 1000 });
60
- vi.advanceTimersByTime(300);
61
- toaster.pause?.(id, 'hover');
62
- toaster.pause?.(id, 'focus');
63
- vi.advanceTimersByTime(5000);
64
- expect(visible).toBe(1);
65
- toaster.resume?.(id, 'hover');
66
- vi.advanceTimersByTime(5000);
67
- expect(visible).toBe(1);
68
- toaster.resume?.(id, 'focus');
69
- toaster.resume?.(id, 'focus');
70
- vi.advanceTimersByTime(699);
71
- expect(visible).toBe(1);
72
- vi.advanceTimersByTime(1);
73
- expect(visible).toBe(0);
74
- }
75
- finally {
76
- vi.useRealTimers();
77
- }
78
- });
79
- it('replacing a paused id resets its duration without losing interaction pause', () => {
80
- vi.useFakeTimers();
81
- try {
82
- const toaster = createToaster();
83
- let message = '';
84
- toaster.subscribe((toasts) => {
85
- message = toasts[0]?.message ?? '';
86
- });
87
- toaster.show({ id: 'save', message: 'Saving', duration: 1000 });
88
- toaster.pause?.('save', 'hover');
89
- toaster.show({ id: 'save', message: 'Saved', duration: 2000 });
90
- vi.advanceTimersByTime(5000);
91
- expect(message).toBe('Saved');
92
- toaster.resume?.('save', 'hover');
93
- vi.advanceTimersByTime(1999);
94
- expect(message).toBe('Saved');
95
- vi.advanceTimersByTime(1);
96
- expect(message).toBe('');
97
- }
98
- finally {
99
- vi.useRealTimers();
100
- }
101
- });
102
- it('can keep success notifications persistent while other notifications expire', () => {
103
- vi.useFakeTimers();
104
- try {
105
- const toaster = createToaster({ successDuration: 0, duration: 1000 });
106
- let messages = [];
107
- toaster.subscribe((toasts) => {
108
- messages = toasts.map((toast) => toast.message);
109
- });
110
- const id = toaster.success('Only record of approval');
111
- toaster.show('Temporary');
112
- toaster.success('Explicit duration wins', { duration: 500 });
113
- vi.advanceTimersByTime(10000);
114
- expect(messages).toEqual(['Only record of approval']);
115
- toaster.dismiss(id);
116
- expect(messages).toEqual([]);
117
- toaster.show('Cleared');
118
- toaster.clear();
119
- expect(vi.getTimerCount()).toBe(0);
120
- }
121
- finally {
122
- vi.useRealTimers();
123
- }
124
- });
125
- it('viewport hover and focus pause independently, including focus movement within a toast', async () => {
126
- vi.useFakeTimers();
127
- try {
128
- const toaster = createToaster();
129
- render(ToastViewport, { props: { toaster } });
130
- await act(() => {
131
- toaster.show({
132
- message: 'Stay visible',
133
- duration: 1000,
134
- action: { label: 'Undo', run: () => { } },
135
- });
136
- });
137
- const group = screen.getByRole('group', { name: 'Notification' });
138
- await fireEvent.mouseEnter(group);
139
- await fireEvent.focusIn(screen.getByRole('button', { name: 'Undo' }));
140
- await fireEvent.mouseLeave(group);
141
- await fireEvent.focusOut(screen.getByRole('button', { name: 'Undo' }), {
142
- relatedTarget: screen.getByRole('button', { name: 'Dismiss' }),
143
- });
144
- await act(() => vi.advanceTimersByTime(5000));
145
- expect(screen.getByText('Stay visible')).toBeInTheDocument();
146
- await fireEvent.focusOut(group, { relatedTarget: document.body });
147
- await act(() => vi.advanceTimersByTime(1000));
148
- expect(screen.queryByText('Stay visible')).not.toBeInTheDocument();
149
- }
150
- finally {
151
- vi.useRealTimers();
152
- }
153
- });
154
- it('releases its interaction pauses when the viewport unmounts', async () => {
155
- vi.useFakeTimers();
156
- try {
157
- const toaster = createToaster();
158
- let count = 0;
159
- toaster.subscribe((toasts) => {
160
- count = toasts.length;
161
- });
162
- const { unmount } = render(ToastViewport, { props: { toaster } });
163
- await act(() => {
164
- toaster.show({ message: 'Paused', duration: 1000 });
165
- });
166
- await fireEvent.mouseEnter(screen.getByRole('group', { name: 'Notification' }));
167
- await act(() => vi.advanceTimersByTime(5000));
168
- expect(count).toBe(1);
169
- await unmount();
170
- vi.advanceTimersByTime(1000);
171
- expect(count).toBe(0);
172
- expect(document.querySelector('.viewport')).toBeNull();
173
- }
174
- finally {
175
- vi.useRealTimers();
176
- }
177
- });
178
- it('retains compatibility with injected toasters without pause/resume methods', async () => {
179
- const legacy = { ...createToaster(), pause: undefined, resume: undefined };
180
- const { unmount } = render(ToastViewport, { props: { toaster: legacy } });
181
- legacy.success('Legacy', { duration: 0 });
182
- const group = await screen.findByRole('group', { name: 'Notification' });
183
- await fireEvent.mouseEnter(group);
184
- await fireEvent.mouseLeave(group);
185
- await userEvent.click(screen.getByRole('button', { name: 'Dismiss' }));
186
- expect(screen.queryByText('Legacy')).not.toBeInTheDocument();
187
- await unmount();
188
- expect(document.querySelector('.viewport')).toBeNull();
189
- });
190
- });