@getmicdrop/svelte-components 5.17.1 → 5.17.4

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 (199) hide show
  1. package/dist/calendar/Calendar/MiniMonthCalendar.svelte +5 -7
  2. package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -1
  3. package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +2 -3
  4. package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte.d.ts.map +1 -1
  5. package/dist/calendar/PublicCard/PublicCard.svelte +23 -14
  6. package/dist/calendar/PublicCard/PublicCard.svelte.d.ts.map +1 -1
  7. package/dist/calendar/ShowCard/ShowCard.spec.js +1 -7
  8. package/dist/calendar/ShowCard/ShowCard.svelte +10 -1
  9. package/dist/calendar/ShowCard/ShowCard.svelte.d.ts.map +1 -1
  10. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +11 -0
  11. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts +2 -0
  12. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts.map +1 -1
  13. package/dist/components/Heading.spec.d.ts +2 -0
  14. package/dist/components/Heading.spec.d.ts.map +1 -0
  15. package/dist/components/Heading.spec.js +89 -0
  16. package/dist/components/Layout/__tests__/AppShell.test.js +140 -0
  17. package/dist/components/Text.spec.d.ts +2 -0
  18. package/dist/components/Text.spec.d.ts.map +1 -0
  19. package/dist/components/Text.spec.js +89 -0
  20. package/dist/config.d.ts +102 -0
  21. package/dist/config.js +147 -1
  22. package/dist/datetime/README.md +323 -0
  23. package/dist/forms/createFormStore.svelte.spec.d.ts +2 -0
  24. package/dist/forms/createFormStore.svelte.spec.d.ts.map +1 -0
  25. package/dist/forms/createFormStore.svelte.spec.js +387 -0
  26. package/dist/messages.d.ts +43 -0
  27. package/dist/messages.d.ts.map +1 -0
  28. package/dist/messages.js +57 -0
  29. package/dist/patterns/chat/ChatActivityNotice.spec.d.ts +2 -0
  30. package/dist/patterns/chat/ChatActivityNotice.spec.d.ts.map +1 -0
  31. package/dist/patterns/chat/ChatActivityNotice.spec.js +59 -0
  32. package/dist/patterns/chat/ChatBubble.spec.d.ts +2 -0
  33. package/dist/patterns/chat/ChatBubble.spec.d.ts.map +1 -0
  34. package/dist/patterns/chat/ChatBubble.spec.js +91 -0
  35. package/dist/patterns/chat/ChatContainer.spec.d.ts +2 -0
  36. package/dist/patterns/chat/ChatContainer.spec.d.ts.map +1 -0
  37. package/dist/patterns/chat/ChatContainer.spec.js +30 -0
  38. package/dist/patterns/chat/ChatDateDivider.spec.d.ts +2 -0
  39. package/dist/patterns/chat/ChatDateDivider.spec.d.ts.map +1 -0
  40. package/dist/patterns/chat/ChatDateDivider.spec.js +30 -0
  41. package/dist/patterns/chat/ChatInvitationBubble.spec.d.ts +2 -0
  42. package/dist/patterns/chat/ChatInvitationBubble.spec.d.ts.map +1 -0
  43. package/dist/patterns/chat/ChatInvitationBubble.spec.js +46 -0
  44. package/dist/patterns/chat/ChatInvitationNotice.spec.d.ts +2 -0
  45. package/dist/patterns/chat/ChatInvitationNotice.spec.d.ts.map +1 -0
  46. package/dist/patterns/chat/ChatInvitationNotice.spec.js +32 -0
  47. package/dist/patterns/chat/ChatMessageGroup.spec.d.ts +2 -0
  48. package/dist/patterns/chat/ChatMessageGroup.spec.d.ts.map +1 -0
  49. package/dist/patterns/chat/ChatMessageGroup.spec.js +58 -0
  50. package/dist/patterns/chat/ChatSlotUpdate.spec.d.ts +2 -0
  51. package/dist/patterns/chat/ChatSlotUpdate.spec.d.ts.map +1 -0
  52. package/dist/patterns/chat/ChatSlotUpdate.spec.js +65 -0
  53. package/dist/patterns/chat/ChatStatusBadge.spec.d.ts +2 -0
  54. package/dist/patterns/chat/ChatStatusBadge.spec.d.ts.map +1 -0
  55. package/dist/patterns/chat/ChatStatusBadge.spec.js +79 -0
  56. package/dist/patterns/chat/ChatStatusTransition.spec.d.ts +2 -0
  57. package/dist/patterns/chat/ChatStatusTransition.spec.d.ts.map +1 -0
  58. package/dist/patterns/chat/ChatStatusTransition.spec.js +81 -0
  59. package/dist/patterns/chat/ChatTextBubble.spec.d.ts +2 -0
  60. package/dist/patterns/chat/ChatTextBubble.spec.d.ts.map +1 -0
  61. package/dist/patterns/chat/ChatTextBubble.spec.js +35 -0
  62. package/dist/patterns/data/DataTable.spec.js +61 -0
  63. package/dist/patterns/forms/FormGrid.spec.js +34 -0
  64. package/dist/patterns/layout/Sidebar.spec.js +240 -1
  65. package/dist/patterns/layout/SidebarTestWrapper.svelte +34 -0
  66. package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts +23 -0
  67. package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts.map +1 -0
  68. package/dist/patterns/navigation/Header.spec.js +123 -0
  69. package/dist/primitives/Accordion/Accordion.spec.js +112 -2
  70. package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte +28 -0
  71. package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte.d.ts +7 -0
  72. package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte.d.ts.map +1 -0
  73. package/dist/primitives/Avatar/Avatar.spec.js +23 -0
  74. package/dist/primitives/BottomSheet/BottomSheet.spec.js +102 -0
  75. package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte +20 -0
  76. package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte.d.ts +10 -0
  77. package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte.d.ts.map +1 -0
  78. package/dist/primitives/Button/ButtonGroup.spec.d.ts +2 -0
  79. package/dist/primitives/Button/ButtonGroup.spec.d.ts.map +1 -0
  80. package/dist/primitives/Button/ButtonGroup.spec.js +44 -0
  81. package/dist/primitives/Checkbox/Checkbox.spec.js +32 -0
  82. package/dist/primitives/Drawer/Drawer.spec.js +437 -0
  83. package/dist/primitives/Drawer/DrawerTestWrapper.svelte +86 -0
  84. package/dist/primitives/Drawer/DrawerTestWrapper.svelte.d.ts +26 -0
  85. package/dist/primitives/Drawer/DrawerTestWrapper.svelte.d.ts.map +1 -0
  86. package/dist/primitives/Dropdown/Dropdown.spec.js +116 -0
  87. package/dist/primitives/Dropdown/DropdownDivider.spec.d.ts +2 -0
  88. package/dist/primitives/Dropdown/DropdownDivider.spec.d.ts.map +1 -0
  89. package/dist/primitives/Dropdown/DropdownDivider.spec.js +30 -0
  90. package/dist/primitives/Dropdown/DropdownItem.spec.js +155 -1
  91. package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte +43 -0
  92. package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte.d.ts +17 -0
  93. package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte.d.ts.map +1 -0
  94. package/dist/primitives/Helper/Helper.spec.d.ts +2 -0
  95. package/dist/primitives/Helper/Helper.spec.d.ts.map +1 -0
  96. package/dist/primitives/Helper/Helper.spec.js +57 -0
  97. package/dist/primitives/Input/Input.spec.js +664 -0
  98. package/dist/primitives/Input/Input.svelte +18 -10
  99. package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
  100. package/dist/primitives/Input/Select.spec.js +414 -0
  101. package/dist/primitives/Label/Label.spec.js +9 -0
  102. package/dist/primitives/LandingButton/LandingButton.spec.d.ts +2 -0
  103. package/dist/primitives/LandingButton/LandingButton.spec.d.ts.map +1 -0
  104. package/dist/primitives/LandingButton/LandingButton.spec.js +61 -0
  105. package/dist/primitives/MenuItem/MenuItem.spec.d.ts +2 -0
  106. package/dist/primitives/MenuItem/MenuItem.spec.d.ts.map +1 -0
  107. package/dist/primitives/MenuItem/MenuItem.spec.js +130 -0
  108. package/dist/primitives/Modal/Modal.spec.js +215 -0
  109. package/dist/primitives/NavItem/NavItem.spec.d.ts +2 -0
  110. package/dist/primitives/NavItem/NavItem.spec.d.ts.map +1 -0
  111. package/dist/primitives/NavItem/NavItem.spec.js +97 -0
  112. package/dist/primitives/SearchResultItem/SearchResultItem.spec.d.ts +2 -0
  113. package/dist/primitives/SearchResultItem/SearchResultItem.spec.d.ts.map +1 -0
  114. package/dist/primitives/SearchResultItem/SearchResultItem.spec.js +78 -0
  115. package/dist/primitives/SidebarToggle/SidebarToggle.spec.d.ts +2 -0
  116. package/dist/primitives/SidebarToggle/SidebarToggle.spec.d.ts.map +1 -0
  117. package/dist/primitives/SidebarToggle/SidebarToggle.spec.js +61 -0
  118. package/dist/primitives/Spinner/Spinner.spec.js +13 -0
  119. package/dist/primitives/Toggle.spec.js +75 -0
  120. package/dist/primitives/ToggleTestWrapper.svelte +30 -0
  121. package/dist/primitives/ToggleTestWrapper.svelte.d.ts +29 -0
  122. package/dist/primitives/ToggleTestWrapper.svelte.d.ts.map +1 -0
  123. package/dist/primitives/Tooltip/Tooltip.spec.d.ts +2 -0
  124. package/dist/primitives/Tooltip/Tooltip.spec.d.ts.map +1 -0
  125. package/dist/primitives/Tooltip/Tooltip.spec.js +126 -0
  126. package/dist/recipes/inputs/Search.spec.js +66 -2
  127. package/dist/recipes/modals/ConfirmationModal.spec.js +190 -0
  128. package/dist/schemas/__tests__/auth.test.d.ts +2 -0
  129. package/dist/schemas/__tests__/auth.test.d.ts.map +1 -0
  130. package/dist/schemas/__tests__/auth.test.js +210 -0
  131. package/dist/schemas/__tests__/common.test.d.ts +2 -0
  132. package/dist/schemas/__tests__/common.test.d.ts.map +1 -0
  133. package/dist/schemas/__tests__/common.test.js +340 -0
  134. package/dist/schemas/__tests__/domain.test.d.ts +2 -0
  135. package/dist/schemas/__tests__/domain.test.d.ts.map +1 -0
  136. package/dist/schemas/__tests__/domain.test.js +293 -0
  137. package/dist/schemas/__tests__/order.test.d.ts +2 -0
  138. package/dist/schemas/__tests__/order.test.d.ts.map +1 -0
  139. package/dist/schemas/__tests__/order.test.js +349 -0
  140. package/dist/schemas/__tests__/user.test.d.ts +2 -0
  141. package/dist/schemas/__tests__/user.test.d.ts.map +1 -0
  142. package/dist/schemas/__tests__/user.test.js +325 -0
  143. package/dist/schemas/auth.d.ts +41 -0
  144. package/dist/schemas/auth.d.ts.map +1 -0
  145. package/dist/schemas/auth.js +69 -0
  146. package/dist/schemas/common.d.ts +43 -0
  147. package/dist/schemas/common.d.ts.map +1 -0
  148. package/dist/schemas/common.js +157 -0
  149. package/dist/schemas/event.d.ts +82 -0
  150. package/dist/schemas/event.d.ts.map +1 -0
  151. package/dist/schemas/event.js +58 -0
  152. package/dist/schemas/index.d.ts +10 -0
  153. package/dist/schemas/index.d.ts.map +1 -0
  154. package/dist/schemas/index.js +9 -0
  155. package/dist/schemas/order.d.ts +111 -0
  156. package/dist/schemas/order.d.ts.map +1 -0
  157. package/dist/schemas/order.js +73 -0
  158. package/dist/schemas/performer.d.ts +133 -0
  159. package/dist/schemas/performer.d.ts.map +1 -0
  160. package/dist/schemas/performer.js +73 -0
  161. package/dist/schemas/promo.d.ts +87 -0
  162. package/dist/schemas/promo.d.ts.map +1 -0
  163. package/dist/schemas/promo.js +98 -0
  164. package/dist/schemas/ticket.d.ts +104 -0
  165. package/dist/schemas/ticket.d.ts.map +1 -0
  166. package/dist/schemas/ticket.js +82 -0
  167. package/dist/schemas/user.d.ts +92 -0
  168. package/dist/schemas/user.d.ts.map +1 -0
  169. package/dist/schemas/user.js +53 -0
  170. package/dist/schemas/venue.d.ts +95 -0
  171. package/dist/schemas/venue.d.ts.map +1 -0
  172. package/dist/schemas/venue.js +52 -0
  173. package/dist/stores/auth.svelte.spec.d.ts +2 -0
  174. package/dist/stores/auth.svelte.spec.d.ts.map +1 -0
  175. package/dist/stores/auth.svelte.spec.js +112 -0
  176. package/dist/stores/formDataStore.svelte.spec.d.ts +2 -0
  177. package/dist/stores/formDataStore.svelte.spec.d.ts.map +1 -0
  178. package/dist/stores/formDataStore.svelte.spec.js +150 -0
  179. package/dist/stores/formSave.svelte.spec.d.ts +2 -0
  180. package/dist/stores/formSave.svelte.spec.d.ts.map +1 -0
  181. package/dist/stores/formSave.svelte.spec.js +196 -0
  182. package/dist/stores/navigation.spec.d.ts +2 -0
  183. package/dist/stores/navigation.spec.d.ts.map +1 -0
  184. package/dist/stores/navigation.spec.js +53 -0
  185. package/dist/telemetry.spec.js +5 -0
  186. package/dist/tokens/__tests__/sizing.test.js +2 -2
  187. package/dist/tokens/sizing.d.ts +5 -0
  188. package/dist/tokens/sizing.d.ts.map +1 -1
  189. package/dist/tokens/sizing.js +6 -0
  190. package/dist/utils/haptic.spec.d.ts +2 -0
  191. package/dist/utils/haptic.spec.d.ts.map +1 -0
  192. package/dist/utils/haptic.spec.js +153 -0
  193. package/dist/utils/imageOptimizer.spec.d.ts +2 -0
  194. package/dist/utils/imageOptimizer.spec.d.ts.map +1 -0
  195. package/dist/utils/imageOptimizer.spec.js +201 -0
  196. package/dist/utils/logger.spec.d.ts +2 -0
  197. package/dist/utils/logger.spec.d.ts.map +1 -0
  198. package/dist/utils/logger.spec.js +95 -0
  199. package/package.json +1 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownDivider.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Dropdown/DropdownDivider.spec.js"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { render } from '@testing-library/svelte';
2
+ import { expect, describe, test } from 'vitest';
3
+ import DropdownDivider from './DropdownDivider.svelte';
4
+
5
+ describe('DropdownDivider', () => {
6
+ test('renders a list item', () => {
7
+ const { container } = render(DropdownDivider);
8
+ expect(container.querySelector('li')).toBeInTheDocument();
9
+ });
10
+
11
+ test('has role="separator"', () => {
12
+ const { container } = render(DropdownDivider);
13
+ expect(container.querySelector('[role="separator"]')).toBeInTheDocument();
14
+ });
15
+
16
+ test('has aria-hidden="true"', () => {
17
+ const { container } = render(DropdownDivider);
18
+ expect(container.querySelector('[aria-hidden="true"]')).toBeInTheDocument();
19
+ });
20
+
21
+ test('has border styling', () => {
22
+ const { container } = render(DropdownDivider);
23
+ expect(container.querySelector('[class*="border"]')).toBeInTheDocument();
24
+ });
25
+
26
+ test('applies custom className', () => {
27
+ const { container } = render(DropdownDivider, { props: { class: 'my-divider' } });
28
+ expect(container.querySelector('.my-divider')).toBeInTheDocument();
29
+ });
30
+ });
@@ -1,7 +1,8 @@
1
- import { render, screen } from '@testing-library/svelte';
1
+ import { render, screen, fireEvent } from '@testing-library/svelte';
2
2
  import userEvent from '@testing-library/user-event';
3
3
  import { expect, describe, test, vi } from 'vitest';
4
4
  import DropdownItem from './DropdownItem.svelte';
5
+ import DropdownItemTestWrapper from './DropdownItemTestWrapper.svelte';
5
6
 
6
7
  describe('DropdownItem Component', () => {
7
8
  test('renders as button by default (no href)', () => {
@@ -180,3 +181,156 @@ describe('DropdownItem Button Type', () => {
180
181
  expect(button).toHaveAttribute('type', 'button');
181
182
  });
182
183
  });
184
+
185
+ describe('DropdownItem Disabled Click on Link (line 32)', () => {
186
+ test('preventDefault is called when clicking a disabled link item', async () => {
187
+ const user = userEvent.setup();
188
+ const onclick = vi.fn();
189
+ const { container } = render(DropdownItemTestWrapper, {
190
+ props: { href: '/test', disabled: true, onclick, label: 'Disabled Link' }
191
+ });
192
+
193
+ const anchor = container.querySelector('a');
194
+ expect(anchor).toBeInTheDocument();
195
+ // Click the disabled link - handleClick should call preventDefault and return early
196
+ await user.click(anchor);
197
+ expect(onclick).not.toHaveBeenCalled();
198
+ });
199
+
200
+ test('preventDefault is called via fireEvent on disabled link', async () => {
201
+ const { container } = render(DropdownItemTestWrapper, {
202
+ props: { href: '/somewhere', disabled: true, label: 'Disabled' }
203
+ });
204
+
205
+ const anchor = container.querySelector('a');
206
+ const clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true });
207
+ const spy = vi.spyOn(clickEvent, 'preventDefault');
208
+ anchor.dispatchEvent(clickEvent);
209
+ expect(spy).toHaveBeenCalled();
210
+ });
211
+ });
212
+
213
+ describe('DropdownItem Context Close (line 37)', () => {
214
+ test('calls context.close() when non-link item is clicked with context', async () => {
215
+ const user = userEvent.setup();
216
+ const closeFn = vi.fn();
217
+ const { container } = render(DropdownItemTestWrapper, {
218
+ props: {
219
+ withContext: true,
220
+ contextClose: closeFn,
221
+ label: 'Close Item'
222
+ }
223
+ });
224
+
225
+ const button = container.querySelector('button');
226
+ await user.click(button);
227
+ expect(closeFn).toHaveBeenCalled();
228
+ });
229
+
230
+ test('does not call context.close() when item has href', async () => {
231
+ const user = userEvent.setup();
232
+ const closeFn = vi.fn();
233
+ const { container } = render(DropdownItemTestWrapper, {
234
+ props: {
235
+ href: '/test',
236
+ withContext: true,
237
+ contextClose: closeFn,
238
+ label: 'Link Item'
239
+ }
240
+ });
241
+
242
+ const anchor = container.querySelector('a');
243
+ await user.click(anchor);
244
+ // context.close() should NOT be called for link items (href is truthy)
245
+ expect(closeFn).not.toHaveBeenCalled();
246
+ });
247
+ });
248
+
249
+ describe('DropdownItem Keydown Handling (lines 41-44)', () => {
250
+ test('Enter key triggers handleClick on button item', async () => {
251
+ const onclick = vi.fn();
252
+ const { container } = render(DropdownItemTestWrapper, {
253
+ props: { onclick, label: 'Keyboard Item' }
254
+ });
255
+
256
+ const button = container.querySelector('button');
257
+ await fireEvent.keyDown(button, { key: 'Enter' });
258
+ expect(onclick).toHaveBeenCalled();
259
+ });
260
+
261
+ test('Space key triggers handleClick on button item', async () => {
262
+ const onclick = vi.fn();
263
+ const { container } = render(DropdownItemTestWrapper, {
264
+ props: { onclick, label: 'Keyboard Item' }
265
+ });
266
+
267
+ const button = container.querySelector('button');
268
+ await fireEvent.keyDown(button, { key: ' ' });
269
+ expect(onclick).toHaveBeenCalled();
270
+ });
271
+
272
+ test('Enter key triggers handleClick on link item', async () => {
273
+ const onclick = vi.fn();
274
+ const { container } = render(DropdownItemTestWrapper, {
275
+ props: { href: '/test', onclick, label: 'Keyboard Link' }
276
+ });
277
+
278
+ const anchor = container.querySelector('a');
279
+ await fireEvent.keyDown(anchor, { key: 'Enter' });
280
+ expect(onclick).toHaveBeenCalled();
281
+ });
282
+
283
+ test('other keys do not trigger handleClick', async () => {
284
+ const onclick = vi.fn();
285
+ const { container } = render(DropdownItemTestWrapper, {
286
+ props: { onclick, label: 'Keyboard Item' }
287
+ });
288
+
289
+ const button = container.querySelector('button');
290
+ await fireEvent.keyDown(button, { key: 'Tab' });
291
+ expect(onclick).not.toHaveBeenCalled();
292
+ });
293
+
294
+ test('Enter key on disabled item calls preventDefault', async () => {
295
+ const onclick = vi.fn();
296
+ const { container } = render(DropdownItemTestWrapper, {
297
+ props: { disabled: true, onclick, label: 'Disabled' }
298
+ });
299
+
300
+ const button = container.querySelector('button');
301
+ await fireEvent.keyDown(button, { key: 'Enter' });
302
+ expect(onclick).not.toHaveBeenCalled();
303
+ });
304
+ });
305
+
306
+ describe('DropdownItem Active URL Styling', () => {
307
+ test('applies active classes when activeUrl matches href', () => {
308
+ const { container } = render(DropdownItemTestWrapper, {
309
+ props: {
310
+ href: '/dashboard',
311
+ withContext: true,
312
+ contextActiveUrl: '/dashboard',
313
+ label: 'Dashboard'
314
+ }
315
+ });
316
+
317
+ const anchor = container.querySelector('a');
318
+ expect(anchor).toHaveClass('bg-blue-50');
319
+ expect(anchor).toHaveClass('text-blue-700');
320
+ });
321
+
322
+ test('applies default classes when activeUrl does not match href', () => {
323
+ const { container } = render(DropdownItemTestWrapper, {
324
+ props: {
325
+ href: '/settings',
326
+ withContext: true,
327
+ contextActiveUrl: '/dashboard',
328
+ label: 'Settings'
329
+ }
330
+ });
331
+
332
+ const anchor = container.querySelector('a');
333
+ expect(anchor).toHaveClass('text-gray-700');
334
+ expect(anchor).not.toHaveClass('bg-blue-50');
335
+ });
336
+ });
@@ -0,0 +1,43 @@
1
+ <script lang="ts">
2
+ import { setContext } from "svelte";
3
+ import DropdownItem from "./DropdownItem.svelte";
4
+
5
+ interface Props {
6
+ href?: string;
7
+ disabled?: boolean;
8
+ class?: string;
9
+ onclick?: (event: MouseEvent | KeyboardEvent) => void;
10
+ /** Context values */
11
+ contextActiveUrl?: string;
12
+ contextClose?: (() => void) | undefined;
13
+ /** Whether to set dropdown context at all */
14
+ withContext?: boolean;
15
+ /** Label text for the item */
16
+ label?: string;
17
+ }
18
+
19
+ let {
20
+ href = undefined,
21
+ disabled = false,
22
+ class: className = '',
23
+ onclick,
24
+ contextActiveUrl = '',
25
+ contextClose = undefined,
26
+ withContext = false,
27
+ label = 'Item'
28
+ }: Props = $props();
29
+
30
+ // Context is set once at component init with initial prop values.
31
+ // The Svelte warning about capturing initial values is expected here
32
+ // since setContext must be called synchronously during component creation.
33
+ if (withContext) {
34
+ setContext("dropdown", {
35
+ get activeUrl() { return contextActiveUrl; },
36
+ close: contextClose
37
+ });
38
+ }
39
+ </script>
40
+
41
+ <DropdownItem {href} {disabled} class={className} {onclick}>
42
+ {label}
43
+ </DropdownItem>
@@ -0,0 +1,17 @@
1
+ interface Props {
2
+ href?: string;
3
+ disabled?: boolean;
4
+ class?: string;
5
+ onclick?: (event: MouseEvent | KeyboardEvent) => void;
6
+ /** Context values */
7
+ contextActiveUrl?: string;
8
+ contextClose?: (() => void) | undefined;
9
+ /** Whether to set dropdown context at all */
10
+ withContext?: boolean;
11
+ /** Label text for the item */
12
+ label?: string;
13
+ }
14
+ declare const DropdownItemTestWrapper: import("svelte").Component<Props, {}, "">;
15
+ type DropdownItemTestWrapper = ReturnType<typeof DropdownItemTestWrapper>;
16
+ export default DropdownItemTestWrapper;
17
+ //# sourceMappingURL=DropdownItemTestWrapper.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownItemTestWrapper.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Dropdown/DropdownItemTestWrapper.svelte.ts"],"names":[],"mappings":"AAOE,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,KAAK,IAAI,CAAC;IACtD,qBAAqB;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACxC,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkCH,QAAA,MAAM,uBAAuB,2CAAwC,CAAC;AACtE,KAAK,uBAAuB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC1E,eAAe,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Helper.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Helper.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Helper/Helper.spec.js"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ import { render } from '@testing-library/svelte';
2
+ import { createRawSnippet } from 'svelte';
3
+ import { expect, describe, test } from 'vitest';
4
+ import Helper from './Helper.svelte';
5
+
6
+ function textSnippet(text) {
7
+ return createRawSnippet(() => ({
8
+ render: () => `<span>${text}</span>`
9
+ }));
10
+ }
11
+
12
+ describe('Helper', () => {
13
+ test('renders a paragraph element', () => {
14
+ const { container } = render(Helper);
15
+ expect(container.querySelector('p')).toBeInTheDocument();
16
+ });
17
+
18
+ test('default color has gray text', () => {
19
+ const { container } = render(Helper);
20
+ expect(container.querySelector('[class*="gray"]')).toBeInTheDocument();
21
+ });
22
+
23
+ test('red color has red text', () => {
24
+ const { container } = render(Helper, { props: { color: 'red' } });
25
+ expect(container.querySelector('[class*="red"]')).toBeInTheDocument();
26
+ });
27
+
28
+ test('green color has green text', () => {
29
+ const { container } = render(Helper, { props: { color: 'green' } });
30
+ expect(container.querySelector('[class*="green"]')).toBeInTheDocument();
31
+ });
32
+
33
+ test('applies custom className', () => {
34
+ const { container } = render(Helper, { props: { class: 'my-helper' } });
35
+ expect(container.querySelector('.my-helper')).toBeInTheDocument();
36
+ });
37
+
38
+ test('renders children content when provided', () => {
39
+ const { container } = render(Helper, {
40
+ props: { children: textSnippet('Helper text content') }
41
+ });
42
+ expect(container.querySelector('p').textContent).toBe('Helper text content');
43
+ });
44
+
45
+ test('renders empty paragraph when no children provided', () => {
46
+ const { container } = render(Helper);
47
+ expect(container.querySelector('p').textContent).toBe('');
48
+ });
49
+
50
+ test('handles unknown color gracefully', () => {
51
+ const { container } = render(Helper, { props: { color: 'unknown' } });
52
+ const p = container.querySelector('p');
53
+ expect(p).toBeInTheDocument();
54
+ // Unknown color falls back to empty string via null-coalescing
55
+ expect(p.className).toContain('mt-1');
56
+ });
57
+ });