@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.
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +5 -7
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -1
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +2 -3
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte.d.ts.map +1 -1
- package/dist/calendar/PublicCard/PublicCard.svelte +23 -14
- package/dist/calendar/PublicCard/PublicCard.svelte.d.ts.map +1 -1
- package/dist/calendar/ShowCard/ShowCard.spec.js +1 -7
- package/dist/calendar/ShowCard/ShowCard.svelte +10 -1
- package/dist/calendar/ShowCard/ShowCard.svelte.d.ts.map +1 -1
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +11 -0
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts +2 -0
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts.map +1 -1
- package/dist/components/Heading.spec.d.ts +2 -0
- package/dist/components/Heading.spec.d.ts.map +1 -0
- package/dist/components/Heading.spec.js +89 -0
- package/dist/components/Layout/__tests__/AppShell.test.js +140 -0
- package/dist/components/Text.spec.d.ts +2 -0
- package/dist/components/Text.spec.d.ts.map +1 -0
- package/dist/components/Text.spec.js +89 -0
- package/dist/config.d.ts +102 -0
- package/dist/config.js +147 -1
- package/dist/datetime/README.md +323 -0
- package/dist/forms/createFormStore.svelte.spec.d.ts +2 -0
- package/dist/forms/createFormStore.svelte.spec.d.ts.map +1 -0
- package/dist/forms/createFormStore.svelte.spec.js +387 -0
- package/dist/messages.d.ts +43 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +57 -0
- package/dist/patterns/chat/ChatActivityNotice.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatActivityNotice.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatActivityNotice.spec.js +59 -0
- package/dist/patterns/chat/ChatBubble.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatBubble.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatBubble.spec.js +91 -0
- package/dist/patterns/chat/ChatContainer.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatContainer.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatContainer.spec.js +30 -0
- package/dist/patterns/chat/ChatDateDivider.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatDateDivider.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatDateDivider.spec.js +30 -0
- package/dist/patterns/chat/ChatInvitationBubble.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatInvitationBubble.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatInvitationBubble.spec.js +46 -0
- package/dist/patterns/chat/ChatInvitationNotice.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatInvitationNotice.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatInvitationNotice.spec.js +32 -0
- package/dist/patterns/chat/ChatMessageGroup.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatMessageGroup.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatMessageGroup.spec.js +58 -0
- package/dist/patterns/chat/ChatSlotUpdate.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatSlotUpdate.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatSlotUpdate.spec.js +65 -0
- package/dist/patterns/chat/ChatStatusBadge.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatStatusBadge.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatStatusBadge.spec.js +79 -0
- package/dist/patterns/chat/ChatStatusTransition.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatStatusTransition.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatStatusTransition.spec.js +81 -0
- package/dist/patterns/chat/ChatTextBubble.spec.d.ts +2 -0
- package/dist/patterns/chat/ChatTextBubble.spec.d.ts.map +1 -0
- package/dist/patterns/chat/ChatTextBubble.spec.js +35 -0
- package/dist/patterns/data/DataTable.spec.js +61 -0
- package/dist/patterns/forms/FormGrid.spec.js +34 -0
- package/dist/patterns/layout/Sidebar.spec.js +240 -1
- package/dist/patterns/layout/SidebarTestWrapper.svelte +34 -0
- package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts +23 -0
- package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts.map +1 -0
- package/dist/patterns/navigation/Header.spec.js +123 -0
- package/dist/primitives/Accordion/Accordion.spec.js +112 -2
- package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte +28 -0
- package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte.d.ts +7 -0
- package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte.d.ts.map +1 -0
- package/dist/primitives/Avatar/Avatar.spec.js +23 -0
- package/dist/primitives/BottomSheet/BottomSheet.spec.js +102 -0
- package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte +20 -0
- package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte.d.ts +10 -0
- package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte.d.ts.map +1 -0
- package/dist/primitives/Button/ButtonGroup.spec.d.ts +2 -0
- package/dist/primitives/Button/ButtonGroup.spec.d.ts.map +1 -0
- package/dist/primitives/Button/ButtonGroup.spec.js +44 -0
- package/dist/primitives/Checkbox/Checkbox.spec.js +32 -0
- package/dist/primitives/Drawer/Drawer.spec.js +437 -0
- package/dist/primitives/Drawer/DrawerTestWrapper.svelte +86 -0
- package/dist/primitives/Drawer/DrawerTestWrapper.svelte.d.ts +26 -0
- package/dist/primitives/Drawer/DrawerTestWrapper.svelte.d.ts.map +1 -0
- package/dist/primitives/Dropdown/Dropdown.spec.js +116 -0
- package/dist/primitives/Dropdown/DropdownDivider.spec.d.ts +2 -0
- package/dist/primitives/Dropdown/DropdownDivider.spec.d.ts.map +1 -0
- package/dist/primitives/Dropdown/DropdownDivider.spec.js +30 -0
- package/dist/primitives/Dropdown/DropdownItem.spec.js +155 -1
- package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte +43 -0
- package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte.d.ts +17 -0
- package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte.d.ts.map +1 -0
- package/dist/primitives/Helper/Helper.spec.d.ts +2 -0
- package/dist/primitives/Helper/Helper.spec.d.ts.map +1 -0
- package/dist/primitives/Helper/Helper.spec.js +57 -0
- package/dist/primitives/Input/Input.spec.js +664 -0
- package/dist/primitives/Input/Input.svelte +18 -10
- package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
- package/dist/primitives/Input/Select.spec.js +414 -0
- package/dist/primitives/Label/Label.spec.js +9 -0
- package/dist/primitives/LandingButton/LandingButton.spec.d.ts +2 -0
- package/dist/primitives/LandingButton/LandingButton.spec.d.ts.map +1 -0
- package/dist/primitives/LandingButton/LandingButton.spec.js +61 -0
- package/dist/primitives/MenuItem/MenuItem.spec.d.ts +2 -0
- package/dist/primitives/MenuItem/MenuItem.spec.d.ts.map +1 -0
- package/dist/primitives/MenuItem/MenuItem.spec.js +130 -0
- package/dist/primitives/Modal/Modal.spec.js +215 -0
- package/dist/primitives/NavItem/NavItem.spec.d.ts +2 -0
- package/dist/primitives/NavItem/NavItem.spec.d.ts.map +1 -0
- package/dist/primitives/NavItem/NavItem.spec.js +97 -0
- package/dist/primitives/SearchResultItem/SearchResultItem.spec.d.ts +2 -0
- package/dist/primitives/SearchResultItem/SearchResultItem.spec.d.ts.map +1 -0
- package/dist/primitives/SearchResultItem/SearchResultItem.spec.js +78 -0
- package/dist/primitives/SidebarToggle/SidebarToggle.spec.d.ts +2 -0
- package/dist/primitives/SidebarToggle/SidebarToggle.spec.d.ts.map +1 -0
- package/dist/primitives/SidebarToggle/SidebarToggle.spec.js +61 -0
- package/dist/primitives/Spinner/Spinner.spec.js +13 -0
- package/dist/primitives/Toggle.spec.js +75 -0
- package/dist/primitives/ToggleTestWrapper.svelte +30 -0
- package/dist/primitives/ToggleTestWrapper.svelte.d.ts +29 -0
- package/dist/primitives/ToggleTestWrapper.svelte.d.ts.map +1 -0
- package/dist/primitives/Tooltip/Tooltip.spec.d.ts +2 -0
- package/dist/primitives/Tooltip/Tooltip.spec.d.ts.map +1 -0
- package/dist/primitives/Tooltip/Tooltip.spec.js +126 -0
- package/dist/recipes/inputs/Search.spec.js +66 -2
- package/dist/recipes/modals/ConfirmationModal.spec.js +190 -0
- package/dist/schemas/__tests__/auth.test.d.ts +2 -0
- package/dist/schemas/__tests__/auth.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/auth.test.js +210 -0
- package/dist/schemas/__tests__/common.test.d.ts +2 -0
- package/dist/schemas/__tests__/common.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/common.test.js +340 -0
- package/dist/schemas/__tests__/domain.test.d.ts +2 -0
- package/dist/schemas/__tests__/domain.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/domain.test.js +293 -0
- package/dist/schemas/__tests__/order.test.d.ts +2 -0
- package/dist/schemas/__tests__/order.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/order.test.js +349 -0
- package/dist/schemas/__tests__/user.test.d.ts +2 -0
- package/dist/schemas/__tests__/user.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/user.test.js +325 -0
- package/dist/schemas/auth.d.ts +41 -0
- package/dist/schemas/auth.d.ts.map +1 -0
- package/dist/schemas/auth.js +69 -0
- package/dist/schemas/common.d.ts +43 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +157 -0
- package/dist/schemas/event.d.ts +82 -0
- package/dist/schemas/event.d.ts.map +1 -0
- package/dist/schemas/event.js +58 -0
- package/dist/schemas/index.d.ts +10 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +9 -0
- package/dist/schemas/order.d.ts +111 -0
- package/dist/schemas/order.d.ts.map +1 -0
- package/dist/schemas/order.js +73 -0
- package/dist/schemas/performer.d.ts +133 -0
- package/dist/schemas/performer.d.ts.map +1 -0
- package/dist/schemas/performer.js +73 -0
- package/dist/schemas/promo.d.ts +87 -0
- package/dist/schemas/promo.d.ts.map +1 -0
- package/dist/schemas/promo.js +98 -0
- package/dist/schemas/ticket.d.ts +104 -0
- package/dist/schemas/ticket.d.ts.map +1 -0
- package/dist/schemas/ticket.js +82 -0
- package/dist/schemas/user.d.ts +92 -0
- package/dist/schemas/user.d.ts.map +1 -0
- package/dist/schemas/user.js +53 -0
- package/dist/schemas/venue.d.ts +95 -0
- package/dist/schemas/venue.d.ts.map +1 -0
- package/dist/schemas/venue.js +52 -0
- package/dist/stores/auth.svelte.spec.d.ts +2 -0
- package/dist/stores/auth.svelte.spec.d.ts.map +1 -0
- package/dist/stores/auth.svelte.spec.js +112 -0
- package/dist/stores/formDataStore.svelte.spec.d.ts +2 -0
- package/dist/stores/formDataStore.svelte.spec.d.ts.map +1 -0
- package/dist/stores/formDataStore.svelte.spec.js +150 -0
- package/dist/stores/formSave.svelte.spec.d.ts +2 -0
- package/dist/stores/formSave.svelte.spec.d.ts.map +1 -0
- package/dist/stores/formSave.svelte.spec.js +196 -0
- package/dist/stores/navigation.spec.d.ts +2 -0
- package/dist/stores/navigation.spec.d.ts.map +1 -0
- package/dist/stores/navigation.spec.js +53 -0
- package/dist/telemetry.spec.js +5 -0
- package/dist/tokens/__tests__/sizing.test.js +2 -2
- package/dist/tokens/sizing.d.ts +5 -0
- package/dist/tokens/sizing.d.ts.map +1 -1
- package/dist/tokens/sizing.js +6 -0
- package/dist/utils/haptic.spec.d.ts +2 -0
- package/dist/utils/haptic.spec.d.ts.map +1 -0
- package/dist/utils/haptic.spec.js +153 -0
- package/dist/utils/imageOptimizer.spec.d.ts +2 -0
- package/dist/utils/imageOptimizer.spec.d.ts.map +1 -0
- package/dist/utils/imageOptimizer.spec.js +201 -0
- package/dist/utils/logger.spec.d.ts +2 -0
- package/dist/utils/logger.spec.d.ts.map +1 -0
- package/dist/utils/logger.spec.js +95 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
+
});
|
package/dist/telemetry.spec.js
CHANGED
|
@@ -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
|
|
188
|
-
expect(Object.keys(buttonSizes)).toHaveLength(
|
|
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');
|
package/dist/tokens/sizing.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/tokens/sizing.js
CHANGED
|
@@ -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',
|