@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,52 @@
1
+ import { z } from 'zod';
2
+ import { CAPACITY, STRING_LIMITS } from '../config';
3
+ import { VALIDATION_MESSAGES } from '../messages';
4
+ import { addressSchema, emailSchema, imageSchema, optionalString, phoneSchema, positiveIntSchema, requiredString, socialLinksSchema, timezoneSchema, urlSchema, } from './common';
5
+ export const venueSchema = z.object({
6
+ name: requiredString(STRING_LIMITS.VENUE_NAME_MAX, 'Venue name'),
7
+ description: optionalString(STRING_LIMITS.VENUE_DESCRIPTION_MAX, 'Description'),
8
+ address: addressSchema,
9
+ phone: phoneSchema,
10
+ email: emailSchema.optional().or(z.literal('')),
11
+ website: urlSchema,
12
+ timezone: timezoneSchema,
13
+ capacity: positiveIntSchema
14
+ .max(CAPACITY.MAX_CAPACITY, VALIDATION_MESSAGES.tooLarge('Capacity', CAPACITY.MAX_CAPACITY))
15
+ .optional(),
16
+ imageUrl: imageSchema,
17
+ logoUrl: imageSchema,
18
+ socialLinks: socialLinksSchema.optional(),
19
+ isActive: z.boolean().default(true),
20
+ });
21
+ export const venueUpdateSchema = venueSchema.partial();
22
+ export const stageSchema = z.object({
23
+ name: requiredString(100, 'Stage name'),
24
+ description: optionalString(500, 'Description'),
25
+ capacity: positiveIntSchema.optional(),
26
+ sortOrder: z.number().int().min(0).default(0),
27
+ isActive: z.boolean().default(true),
28
+ });
29
+ export const venueSettingsSchema = z.object({
30
+ serviceFeePercentage: z.number().min(0).max(0.15).default(0.03),
31
+ serviceFeeFixed: z.number().min(0).max(10).default(1.29),
32
+ absorbServiceFee: z.boolean().default(false),
33
+ allowRefunds: z.boolean().default(true),
34
+ refundCutoffDays: z.number().int().min(0).max(30).default(7),
35
+ requireApproval: z.boolean().default(false),
36
+ ticketTransfersEnabled: z.boolean().default(true),
37
+ waitlistEnabled: z.boolean().default(false),
38
+ });
39
+ export const venueFaqSchema = z.object({
40
+ question: requiredString(200, 'Question'),
41
+ answer: requiredString(2000, 'Answer'),
42
+ sortOrder: z.number().int().min(0).default(0),
43
+ isActive: z.boolean().default(true),
44
+ });
45
+ export const venueFilterSchema = z.object({
46
+ search: z.string().optional(),
47
+ isActive: z.boolean().optional(),
48
+ city: z.string().optional(),
49
+ state: z.string().optional(),
50
+ limit: z.number().int().positive().optional(),
51
+ offset: z.number().int().min(0).optional(),
52
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth.svelte.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.svelte.spec.d.ts","sourceRoot":"","sources":["../../src/lib/stores/auth.svelte.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,112 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { auth, setAuthState, clearAuthState, initializeAuthState } from './auth.svelte';
3
+ describe('auth store', () => {
4
+ beforeEach(() => {
5
+ clearAuthState();
6
+ });
7
+ describe('default state', () => {
8
+ it('starts not authenticated', () => {
9
+ expect(auth.isAuthenticated).toBe(false);
10
+ });
11
+ it('starts with null token', () => {
12
+ expect(auth.token).toBeNull();
13
+ });
14
+ it('starts with null userDetails', () => {
15
+ expect(auth.userDetails).toBeNull();
16
+ });
17
+ it('value returns the full state', () => {
18
+ expect(auth.value).toEqual({
19
+ isAuthenticated: false,
20
+ token: null,
21
+ userDetails: null,
22
+ });
23
+ });
24
+ });
25
+ describe('setAuthState', () => {
26
+ it('updates authentication state', () => {
27
+ const state = {
28
+ isAuthenticated: true,
29
+ token: 'test-token',
30
+ userDetails: { email: 'test@example.com' },
31
+ };
32
+ setAuthState(state);
33
+ expect(auth.isAuthenticated).toBe(true);
34
+ expect(auth.token).toBe('test-token');
35
+ expect(auth.userDetails).toEqual({ email: 'test@example.com' });
36
+ });
37
+ it('updates value getter', () => {
38
+ const state = {
39
+ isAuthenticated: true,
40
+ token: 'abc',
41
+ userDetails: null,
42
+ };
43
+ setAuthState(state);
44
+ expect(auth.value).toEqual(state);
45
+ });
46
+ });
47
+ describe('clearAuthState', () => {
48
+ it('resets to default state', () => {
49
+ setAuthState({
50
+ isAuthenticated: true,
51
+ token: 'token',
52
+ userDetails: { email: 'test@test.com' },
53
+ });
54
+ clearAuthState();
55
+ expect(auth.isAuthenticated).toBe(false);
56
+ expect(auth.token).toBeNull();
57
+ expect(auth.userDetails).toBeNull();
58
+ });
59
+ });
60
+ describe('initializeAuthState', () => {
61
+ const originalDocument = globalThis.document;
62
+ it('returns early when document is undefined (SSR)', () => {
63
+ const docDescriptor = Object.getOwnPropertyDescriptor(globalThis, 'document');
64
+ // @ts-expect-error simulating server
65
+ Object.defineProperty(globalThis, 'document', { value: undefined, writable: true, configurable: true });
66
+ initializeAuthState();
67
+ expect(auth.isAuthenticated).toBe(false);
68
+ // Restore
69
+ if (docDescriptor) {
70
+ Object.defineProperty(globalThis, 'document', docDescriptor);
71
+ }
72
+ });
73
+ it('sets auth state from performer_token cookie', () => {
74
+ Object.defineProperty(document, 'cookie', {
75
+ get: () => 'performer_token=my-jwt-token',
76
+ configurable: true,
77
+ });
78
+ initializeAuthState();
79
+ expect(auth.isAuthenticated).toBe(true);
80
+ expect(auth.token).toBe('my-jwt-token');
81
+ expect(auth.userDetails).toBeNull();
82
+ });
83
+ it('parses userDetails cookie as JSON', () => {
84
+ const userDetails = { email: 'user@test.com', firstName: 'John' };
85
+ Object.defineProperty(document, 'cookie', {
86
+ get: () => `performer_token=token123; userDetails=${encodeURIComponent(JSON.stringify(userDetails))}`,
87
+ configurable: true,
88
+ });
89
+ initializeAuthState();
90
+ expect(auth.isAuthenticated).toBe(true);
91
+ expect(auth.token).toBe('token123');
92
+ expect(auth.userDetails).toEqual(userDetails);
93
+ });
94
+ it('does not set auth when no performer_token cookie', () => {
95
+ Object.defineProperty(document, 'cookie', {
96
+ get: () => 'other_cookie=value',
97
+ configurable: true,
98
+ });
99
+ initializeAuthState();
100
+ expect(auth.isAuthenticated).toBe(false);
101
+ expect(auth.token).toBeNull();
102
+ });
103
+ it('handles empty cookie string', () => {
104
+ Object.defineProperty(document, 'cookie', {
105
+ get: () => '',
106
+ configurable: true,
107
+ });
108
+ initializeAuthState();
109
+ expect(auth.isAuthenticated).toBe(false);
110
+ });
111
+ });
112
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=formDataStore.svelte.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formDataStore.svelte.spec.d.ts","sourceRoot":"","sources":["../../src/lib/stores/formDataStore.svelte.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,150 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { profileFormData, initialFormData, hasChanges } from './formDataStore.svelte';
3
+ describe('formDataStore', () => {
4
+ beforeEach(() => {
5
+ profileFormData.reset();
6
+ initialFormData.reset();
7
+ });
8
+ describe('profileFormData', () => {
9
+ it('starts with default empty values', () => {
10
+ const data = profileFormData.value;
11
+ expect(data.basicInfo.firstName).toBe('');
12
+ expect(data.basicInfo.lastName).toBe('');
13
+ expect(data.basicInfo.email).toBe('');
14
+ expect(data.basicInfo.phone).toBe('');
15
+ expect(data.basicInfo.stageName).toBe('');
16
+ expect(data.basicInfo.location).toBe('');
17
+ expect(data.socialMedia.videoLink).toBe('');
18
+ expect(data.extraDetails).toEqual({});
19
+ });
20
+ it('can set value', () => {
21
+ profileFormData.value = {
22
+ basicInfo: {
23
+ firstName: 'John',
24
+ lastName: 'Doe',
25
+ email: 'john@test.com',
26
+ phone: '1234567890',
27
+ stageName: 'JD',
28
+ location: 'NYC',
29
+ },
30
+ socialMedia: { videoLink: 'https://youtube.com' },
31
+ extraDetails: { bio: 'Hello' },
32
+ };
33
+ expect(profileFormData.value.basicInfo.firstName).toBe('John');
34
+ expect(profileFormData.value.socialMedia.videoLink).toBe('https://youtube.com');
35
+ expect(profileFormData.value.extraDetails).toEqual({ bio: 'Hello' });
36
+ });
37
+ it('can get and set basicInfo', () => {
38
+ const info = {
39
+ firstName: 'Jane',
40
+ lastName: 'Smith',
41
+ email: 'jane@test.com',
42
+ phone: '555-1234',
43
+ stageName: 'JS',
44
+ location: 'LA',
45
+ };
46
+ profileFormData.basicInfo = info;
47
+ expect(profileFormData.basicInfo).toEqual(info);
48
+ });
49
+ it('can get and set socialMedia', () => {
50
+ profileFormData.socialMedia = { videoLink: 'https://vimeo.com' };
51
+ expect(profileFormData.socialMedia.videoLink).toBe('https://vimeo.com');
52
+ });
53
+ it('can get and set extraDetails', () => {
54
+ profileFormData.extraDetails = { genre: 'rock', bio: 'musician' };
55
+ expect(profileFormData.extraDetails).toEqual({ genre: 'rock', bio: 'musician' });
56
+ });
57
+ it('update applies a function to the data', () => {
58
+ profileFormData.update((data) => ({
59
+ ...data,
60
+ basicInfo: { ...data.basicInfo, firstName: 'Updated' },
61
+ }));
62
+ expect(profileFormData.basicInfo.firstName).toBe('Updated');
63
+ });
64
+ it('reset restores to default values', () => {
65
+ profileFormData.basicInfo = {
66
+ firstName: 'Modified',
67
+ lastName: 'User',
68
+ email: 'mod@test.com',
69
+ phone: '000',
70
+ stageName: 'MU',
71
+ location: 'SF',
72
+ };
73
+ profileFormData.reset();
74
+ expect(profileFormData.basicInfo.firstName).toBe('');
75
+ expect(profileFormData.basicInfo.lastName).toBe('');
76
+ });
77
+ });
78
+ describe('initialFormData', () => {
79
+ it('starts as null', () => {
80
+ expect(initialFormData.value).toBeNull();
81
+ });
82
+ it('can set value', () => {
83
+ const data = {
84
+ basicInfo: {
85
+ firstName: 'A',
86
+ lastName: 'B',
87
+ email: 'a@b.com',
88
+ phone: '1',
89
+ stageName: 'AB',
90
+ location: 'X',
91
+ },
92
+ socialMedia: { videoLink: '' },
93
+ extraDetails: {},
94
+ };
95
+ initialFormData.value = data;
96
+ expect(initialFormData.value).toEqual(data);
97
+ });
98
+ it('can set value matching current profile data', () => {
99
+ profileFormData.basicInfo = {
100
+ firstName: 'Current',
101
+ lastName: 'State',
102
+ email: 'c@s.com',
103
+ phone: '1',
104
+ stageName: 'CS',
105
+ location: 'Y',
106
+ };
107
+ // Use JSON clone to avoid structuredClone proxy issues in test
108
+ initialFormData.value = JSON.parse(JSON.stringify(profileFormData.value));
109
+ expect(initialFormData.value).not.toBeNull();
110
+ expect(initialFormData.value.basicInfo.firstName).toBe('Current');
111
+ // Should be a clone, not a reference
112
+ profileFormData.basicInfo = { ...profileFormData.basicInfo, firstName: 'Changed' };
113
+ expect(initialFormData.value.basicInfo.firstName).toBe('Current');
114
+ });
115
+ it('reset sets value to null', () => {
116
+ initialFormData.value = {
117
+ basicInfo: { firstName: '', lastName: '', email: '', phone: '', stageName: '', location: '' },
118
+ socialMedia: { videoLink: '' },
119
+ extraDetails: {},
120
+ };
121
+ initialFormData.reset();
122
+ expect(initialFormData.value).toBeNull();
123
+ });
124
+ });
125
+ describe('hasChanges', () => {
126
+ it('returns false when initialFormData is null', () => {
127
+ expect(hasChanges.value).toBe(false);
128
+ });
129
+ it('returns false when data matches initial', () => {
130
+ // Use value assignment instead of setFromCurrent to avoid structuredClone proxy issues
131
+ initialFormData.value = JSON.parse(JSON.stringify(profileFormData.value));
132
+ expect(hasChanges.value).toBe(false);
133
+ });
134
+ it('returns true when data differs from initial', () => {
135
+ initialFormData.value = JSON.parse(JSON.stringify(profileFormData.value));
136
+ profileFormData.basicInfo = {
137
+ ...profileFormData.basicInfo,
138
+ firstName: 'Changed',
139
+ };
140
+ expect(hasChanges.value).toBe(true);
141
+ });
142
+ it('returns false again after resetting data to match initial', () => {
143
+ initialFormData.value = JSON.parse(JSON.stringify(profileFormData.value));
144
+ profileFormData.basicInfo = { ...profileFormData.basicInfo, firstName: 'Changed' };
145
+ expect(hasChanges.value).toBe(true);
146
+ profileFormData.basicInfo = { ...profileFormData.basicInfo, firstName: '' };
147
+ expect(hasChanges.value).toBe(false);
148
+ });
149
+ });
150
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=formSave.svelte.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formSave.svelte.spec.d.ts","sourceRoot":"","sources":["../../src/lib/stores/formSave.svelte.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,196 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ // Mock svelte-sonner before importing
3
+ vi.mock('svelte-sonner', () => ({
4
+ toast: {
5
+ success: vi.fn(),
6
+ error: vi.fn(),
7
+ message: vi.fn(),
8
+ },
9
+ }));
10
+ import { createFormSave, createDirtyTracker } from './formSave.svelte';
11
+ describe('createFormSave', () => {
12
+ beforeEach(() => {
13
+ vi.clearAllMocks();
14
+ // Reset global fetch mock
15
+ vi.stubGlobal('fetch', vi.fn());
16
+ });
17
+ afterEach(() => {
18
+ vi.restoreAllMocks();
19
+ });
20
+ it('returns an object with expected properties', () => {
21
+ const formSave = createFormSave();
22
+ expect(formSave).toHaveProperty('isLoading');
23
+ expect(formSave).toHaveProperty('isSuccess');
24
+ expect(formSave).toHaveProperty('error');
25
+ expect(formSave).toHaveProperty('save');
26
+ expect(formSave).toHaveProperty('resetSuccess');
27
+ expect(formSave).toHaveProperty('reset');
28
+ });
29
+ it('starts with default state', () => {
30
+ const formSave = createFormSave();
31
+ expect(formSave.isLoading).toBe(false);
32
+ expect(formSave.isSuccess).toBe(false);
33
+ expect(formSave.error).toBeNull();
34
+ });
35
+ it('returns false and logs error when no endpoint provided', async () => {
36
+ const spy = vi.spyOn(console, 'error').mockImplementation(() => { });
37
+ const formSave = createFormSave();
38
+ const result = await formSave.save({ name: 'test' });
39
+ expect(result).toBe(false);
40
+ expect(spy).toHaveBeenCalledWith('No endpoint specified for form save');
41
+ spy.mockRestore();
42
+ });
43
+ it('saves successfully to configured endpoint', async () => {
44
+ const onSuccess = vi.fn();
45
+ vi.mocked(fetch).mockResolvedValue({
46
+ ok: true,
47
+ json: () => Promise.resolve({}),
48
+ });
49
+ const formSave = createFormSave({
50
+ endpoint: '/api/save',
51
+ successMessage: 'Saved!',
52
+ onSuccess,
53
+ });
54
+ const result = await formSave.save({ name: 'test' });
55
+ expect(result).toBe(true);
56
+ expect(formSave.isSuccess).toBe(true);
57
+ expect(formSave.isLoading).toBe(false);
58
+ expect(formSave.error).toBeNull();
59
+ expect(onSuccess).toHaveBeenCalled();
60
+ expect(fetch).toHaveBeenCalledWith('/api/save', {
61
+ method: 'POST',
62
+ headers: { 'Content-Type': 'application/json' },
63
+ body: JSON.stringify({ name: 'test' }),
64
+ });
65
+ });
66
+ it('uses custom endpoint over configured one', async () => {
67
+ vi.mocked(fetch).mockResolvedValue({ ok: true, json: () => Promise.resolve({}) });
68
+ const formSave = createFormSave({ endpoint: '/api/default' });
69
+ await formSave.save({ data: 1 }, '/api/custom');
70
+ expect(fetch).toHaveBeenCalledWith('/api/custom', expect.any(Object));
71
+ });
72
+ it('handles server error response', async () => {
73
+ const onError = vi.fn();
74
+ vi.mocked(fetch).mockResolvedValue({
75
+ ok: false,
76
+ json: () => Promise.resolve({ message: 'Validation failed' }),
77
+ });
78
+ const formSave = createFormSave({
79
+ endpoint: '/api/save',
80
+ errorMessage: 'Default error',
81
+ onError,
82
+ });
83
+ const result = await formSave.save({ name: '' });
84
+ expect(result).toBe(false);
85
+ expect(formSave.isSuccess).toBe(false);
86
+ expect(formSave.error).toBe('Validation failed');
87
+ expect(onError).toHaveBeenCalledWith('Validation failed');
88
+ });
89
+ it('uses default error message when server returns no message', async () => {
90
+ vi.mocked(fetch).mockResolvedValue({
91
+ ok: false,
92
+ json: () => Promise.resolve({}),
93
+ });
94
+ const formSave = createFormSave({
95
+ endpoint: '/api/save',
96
+ errorMessage: 'Save failed',
97
+ });
98
+ const result = await formSave.save({ name: '' });
99
+ expect(result).toBe(false);
100
+ expect(formSave.error).toBe('Save failed');
101
+ });
102
+ it('handles non-JSON error response', async () => {
103
+ vi.mocked(fetch).mockResolvedValue({
104
+ ok: false,
105
+ json: () => Promise.reject(new Error('not json')),
106
+ });
107
+ const formSave = createFormSave({
108
+ endpoint: '/api/save',
109
+ errorMessage: 'Default error',
110
+ });
111
+ const result = await formSave.save({ data: 1 });
112
+ expect(result).toBe(false);
113
+ expect(formSave.error).toBe('Default error');
114
+ });
115
+ it('handles network errors', async () => {
116
+ const onError = vi.fn();
117
+ vi.mocked(fetch).mockRejectedValue(new Error('Network error'));
118
+ const formSave = createFormSave({
119
+ endpoint: '/api/save',
120
+ onError,
121
+ });
122
+ const result = await formSave.save({ data: 1 });
123
+ expect(result).toBe(false);
124
+ expect(formSave.error).toBe('Network error');
125
+ expect(formSave.isLoading).toBe(false);
126
+ expect(onError).toHaveBeenCalledWith('Network error');
127
+ });
128
+ it('handles non-Error exceptions', async () => {
129
+ vi.mocked(fetch).mockRejectedValue('string error');
130
+ const formSave = createFormSave({ endpoint: '/api/save' });
131
+ const result = await formSave.save({ data: 1 });
132
+ expect(result).toBe(false);
133
+ expect(formSave.error).toBe('Something went wrong');
134
+ });
135
+ it('does not show toast when successMessage is empty', async () => {
136
+ const { toast } = await import('svelte-sonner');
137
+ vi.mocked(fetch).mockResolvedValue({ ok: true, json: () => Promise.resolve({}) });
138
+ const formSave = createFormSave({
139
+ endpoint: '/api/save',
140
+ successMessage: '',
141
+ });
142
+ await formSave.save({ data: 1 });
143
+ expect(toast.success).not.toHaveBeenCalled();
144
+ });
145
+ it('resetSuccess clears success state', async () => {
146
+ vi.mocked(fetch).mockResolvedValue({ ok: true, json: () => Promise.resolve({}) });
147
+ const formSave = createFormSave({ endpoint: '/api/save' });
148
+ await formSave.save({ data: 1 });
149
+ expect(formSave.isSuccess).toBe(true);
150
+ formSave.resetSuccess();
151
+ expect(formSave.isSuccess).toBe(false);
152
+ });
153
+ it('reset clears all states', async () => {
154
+ vi.mocked(fetch).mockRejectedValue(new Error('err'));
155
+ const formSave = createFormSave({ endpoint: '/api/save' });
156
+ await formSave.save({ data: 1 });
157
+ expect(formSave.error).toBe('err');
158
+ formSave.reset();
159
+ expect(formSave.isLoading).toBe(false);
160
+ expect(formSave.isSuccess).toBe(false);
161
+ expect(formSave.error).toBeNull();
162
+ });
163
+ });
164
+ describe('createDirtyTracker', () => {
165
+ it('starts as not dirty', () => {
166
+ const tracker = createDirtyTracker({ name: 'John' });
167
+ expect(tracker.isDirty).toBe(false);
168
+ });
169
+ it('detects changes', () => {
170
+ const tracker = createDirtyTracker({ name: 'John' });
171
+ const result = tracker.check({ name: 'Jane' });
172
+ expect(result).toBe(true);
173
+ expect(tracker.isDirty).toBe(true);
174
+ });
175
+ it('detects no changes', () => {
176
+ const tracker = createDirtyTracker({ name: 'John' });
177
+ const result = tracker.check({ name: 'John' });
178
+ expect(result).toBe(false);
179
+ expect(tracker.isDirty).toBe(false);
180
+ });
181
+ it('reset updates initial data and clears dirty state', () => {
182
+ const tracker = createDirtyTracker({ name: 'John' });
183
+ tracker.check({ name: 'Jane' });
184
+ expect(tracker.isDirty).toBe(true);
185
+ tracker.reset({ name: 'Jane' });
186
+ expect(tracker.isDirty).toBe(false);
187
+ // Now checking against new initial data
188
+ const result = tracker.check({ name: 'Jane' });
189
+ expect(result).toBe(false);
190
+ });
191
+ it('handles nested objects', () => {
192
+ const tracker = createDirtyTracker({ user: { name: 'John', age: 30 } });
193
+ expect(tracker.check({ user: { name: 'John', age: 30 } })).toBe(false);
194
+ expect(tracker.check({ user: { name: 'John', age: 31 } })).toBe(true);
195
+ });
196
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=navigation.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.spec.d.ts","sourceRoot":"","sources":["../../src/lib/stores/navigation.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { get } from 'svelte/store';
3
+ import { isSubPage, hideHeaderBackButton, selectedVenueData, isAnimatedNavigation, } from './navigation.svelte';
4
+ describe('navigation stores', () => {
5
+ describe('isSubPage', () => {
6
+ it('defaults to false', () => {
7
+ expect(get(isSubPage)).toBe(false);
8
+ });
9
+ it('can be set to true', () => {
10
+ isSubPage.set(true);
11
+ expect(get(isSubPage)).toBe(true);
12
+ isSubPage.set(false); // reset
13
+ });
14
+ });
15
+ describe('hideHeaderBackButton', () => {
16
+ it('defaults to false', () => {
17
+ expect(get(hideHeaderBackButton)).toBe(false);
18
+ });
19
+ it('can be set to true', () => {
20
+ hideHeaderBackButton.set(true);
21
+ expect(get(hideHeaderBackButton)).toBe(true);
22
+ hideHeaderBackButton.set(false); // reset
23
+ });
24
+ });
25
+ describe('selectedVenueData', () => {
26
+ it('defaults to null', () => {
27
+ expect(get(selectedVenueData)).toBeNull();
28
+ });
29
+ it('can be set to an object', () => {
30
+ const data = { id: 1, name: 'Test Venue' };
31
+ selectedVenueData.set(data);
32
+ expect(get(selectedVenueData)).toEqual(data);
33
+ selectedVenueData.set(null); // reset
34
+ });
35
+ it('can be updated', () => {
36
+ selectedVenueData.set({ id: 1 });
37
+ selectedVenueData.update(current => ({ ...current, name: 'Updated' }));
38
+ expect(get(selectedVenueData)).toEqual({ id: 1, name: 'Updated' });
39
+ selectedVenueData.set(null); // reset
40
+ });
41
+ });
42
+ describe('isAnimatedNavigation', () => {
43
+ it('defaults to false', () => {
44
+ expect(get(isAnimatedNavigation)).toBe(false);
45
+ });
46
+ it('can be toggled', () => {
47
+ isAnimatedNavigation.set(true);
48
+ expect(get(isAnimatedNavigation)).toBe(true);
49
+ isAnimatedNavigation.set(false);
50
+ expect(get(isAnimatedNavigation)).toBe(false);
51
+ });
52
+ });
53
+ });
@@ -73,6 +73,11 @@ vi.mock('@opentelemetry/instrumentation-user-interaction', () => ({
73
73
  },
74
74
  }));
75
75
 
76
+ vi.mock('@opentelemetry/instrumentation', () => ({
77
+ registerInstrumentations: vi.fn(),
78
+ }));
79
+
80
+
76
81
  vi.mock('@opentelemetry/context-zone', () => ({
77
82
  ZoneContextManager: class MockZoneContextManager {},
78
83
  }));
@@ -184,8 +184,8 @@ describe('sizing tokens', () => {
184
184
  it('half variant includes w-1/2', () => {
185
185
  expect(buttonSizes.half).toContain('w-1/2');
186
186
  });
187
- it('has exactly 10 size variants', () => {
188
- expect(Object.keys(buttonSizes)).toHaveLength(10);
187
+ it('has exactly 13 size variants', () => {
188
+ expect(Object.keys(buttonSizes)).toHaveLength(13);
189
189
  });
190
190
  it('landing variant has responsive height and text', () => {
191
191
  expect(buttonSizes.landing).toContain('h-12');
@@ -76,10 +76,15 @@ export declare const buttonSizes: {
76
76
  readonly full: "w-full h-11 px-5 text-sm";
77
77
  readonly 'full-md-auto': "w-full h-11 px-5 text-sm md:w-auto";
78
78
  readonly half: "w-1/2 h-10 px-4 text-sm";
79
+ readonly 'icon-sm': "w-9 h-9 p-0";
80
+ readonly 'icon-md': "w-10 h-10 p-0";
81
+ readonly 'icon-lg': "w-11 h-11 p-0";
79
82
  readonly landing: "h-12 sm:h-14 px-6 sm:px-8 text-base sm:text-lg";
80
83
  };
81
84
  /**
82
85
  * Icon-only button sizes - padding only, no text.
86
+ * For variant="icon" (transparent). For other variants with icon-only,
87
+ * use the square sizes in buttonSizes (icon-sm, icon-md, icon-lg).
83
88
  */
84
89
  export declare const buttonIconSizes: {
85
90
  readonly xs: "p-1.5";
@@ -1 +1 @@
1
- {"version":3,"file":"sizing.d.ts","sourceRoot":"","sources":["../../src/lib/tokens/sizing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,cAAc,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAM5D;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;;;CAMZ,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,SAAS,CAAC;AAM9C;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,UAAU,CAItE,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,UAAU,CAAC;AAChD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAM3D;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,aAAa,CAAC;AAMtD;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;CAYd,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;CAKlB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,WAAW,CAAC;AAClD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAClE,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC"}
1
+ {"version":3,"file":"sizing.d.ts","sourceRoot":"","sources":["../../src/lib/tokens/sizing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,cAAc,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAM5D;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;;;CAMZ,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,SAAS,CAAC;AAM9C;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,UAAU,CAItE,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,UAAU,CAAC;AAChD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAM3D;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,aAAa,CAAC;AAMtD;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;CAgBd,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;CAKlB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,WAAW,CAAC;AAClD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAClE,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC"}
@@ -89,11 +89,17 @@ export const buttonSizes = {
89
89
  full: 'w-full h-11 px-5 text-sm',
90
90
  'full-md-auto': 'w-full h-11 px-5 text-sm md:w-auto',
91
91
  half: 'w-1/2 h-10 px-4 text-sm',
92
+ // Square icon-only sizes — for any variant used as an icon button (e.g. +/- controls)
93
+ 'icon-sm': 'w-9 h-9 p-0',
94
+ 'icon-md': 'w-10 h-10 p-0',
95
+ 'icon-lg': 'w-11 h-11 p-0',
92
96
  // Landing page hero buttons - taller with larger text
93
97
  landing: 'h-12 sm:h-14 px-6 sm:px-8 text-base sm:text-lg',
94
98
  };
95
99
  /**
96
100
  * Icon-only button sizes - padding only, no text.
101
+ * For variant="icon" (transparent). For other variants with icon-only,
102
+ * use the square sizes in buttonSizes (icon-sm, icon-md, icon-lg).
97
103
  */
98
104
  export const buttonIconSizes = {
99
105
  xs: 'p-1.5',
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=haptic.spec.d.ts.map