@getmicdrop/svelte-components 5.6.0 → 5.6.1

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 (77) hide show
  1. package/dist/components/Layout/__tests__/AppShell.test.d.ts +2 -0
  2. package/dist/components/Layout/__tests__/AppShell.test.d.ts.map +1 -0
  3. package/dist/components/Layout/__tests__/AppShell.test.js +95 -0
  4. package/dist/components/Layout/__tests__/ContentSection.test.d.ts +2 -0
  5. package/dist/components/Layout/__tests__/ContentSection.test.d.ts.map +1 -0
  6. package/dist/components/Layout/__tests__/ContentSection.test.js +112 -0
  7. package/dist/components/Layout/__tests__/PageContainer.test.d.ts +2 -0
  8. package/dist/components/Layout/__tests__/PageContainer.test.d.ts.map +1 -0
  9. package/dist/components/Layout/__tests__/PageContainer.test.js +133 -0
  10. package/dist/components/Layout/__tests__/Responsive.test.d.ts +2 -0
  11. package/dist/components/Layout/__tests__/Responsive.test.d.ts.map +1 -0
  12. package/dist/components/Layout/__tests__/Responsive.test.js +123 -0
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.js +41 -40
  15. package/dist/patterns/navigation/BottomNav.svelte +18 -8
  16. package/dist/patterns/navigation/BottomNav.svelte.d.ts.map +1 -1
  17. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte +107 -107
  18. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte.d.ts +2 -2
  19. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte.d.ts.map +1 -1
  20. package/dist/primitives/Checkbox/Checkbox.svelte +3 -3
  21. package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -0
  22. package/dist/primitives/Dropdown/DropdownDivider.svelte.d.ts +7 -0
  23. package/dist/primitives/Dropdown/DropdownDivider.svelte.d.ts.map +1 -0
  24. package/dist/primitives/Helper/Helper.svelte +33 -0
  25. package/dist/primitives/Helper/Helper.svelte.d.ts +18 -0
  26. package/dist/primitives/Helper/Helper.svelte.d.ts.map +1 -0
  27. package/dist/primitives/Input/Input.svelte +416 -417
  28. package/dist/primitives/Input/Input.svelte.d.ts +2 -4
  29. package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
  30. package/dist/primitives/Modal/Modal.svelte +157 -158
  31. package/dist/primitives/Modal/Modal.svelte.d.ts +6 -8
  32. package/dist/primitives/Modal/Modal.svelte.d.ts.map +1 -1
  33. package/dist/primitives/NumberInput/NumberInput.svelte +105 -106
  34. package/dist/primitives/NumberInput/NumberInput.svelte.d.ts +0 -2
  35. package/dist/primitives/NumberInput/NumberInput.svelte.d.ts.map +1 -1
  36. package/dist/primitives/Toggle.svelte +70 -71
  37. package/dist/primitives/Toggle.svelte.d.ts +2 -4
  38. package/dist/primitives/Toggle.svelte.d.ts.map +1 -1
  39. package/dist/primitives/Tooltip/Tooltip.svelte +83 -0
  40. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +15 -0
  41. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts.map +1 -0
  42. package/dist/primitives/index.d.ts +3 -0
  43. package/dist/primitives/index.js +7 -0
  44. package/dist/recipes/ImageUploader/ImageUploader.spec.js +6 -5
  45. package/dist/recipes/inputs/MultiSelect.svelte +277 -256
  46. package/dist/recipes/inputs/MultiSelect.svelte.d.ts +54 -21
  47. package/dist/recipes/inputs/MultiSelect.svelte.d.ts.map +1 -1
  48. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +9 -4
  49. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +332 -327
  50. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts +12 -1
  51. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts.map +1 -1
  52. package/dist/stores/auth.js +8 -0
  53. package/dist/stores/auth.svelte.d.ts +39 -0
  54. package/dist/stores/auth.svelte.d.ts.map +1 -0
  55. package/dist/stores/auth.svelte.js +60 -0
  56. package/dist/stores/formDataStore.d.ts.map +1 -1
  57. package/dist/stores/formDataStore.js +8 -0
  58. package/dist/stores/formDataStore.svelte.d.ts +47 -0
  59. package/dist/stores/formDataStore.svelte.d.ts.map +1 -0
  60. package/dist/stores/formDataStore.svelte.js +84 -0
  61. package/dist/stores/formSave.d.ts.map +1 -1
  62. package/dist/stores/formSave.js +8 -0
  63. package/dist/stores/formSave.svelte.d.ts +33 -0
  64. package/dist/stores/formSave.svelte.d.ts.map +1 -0
  65. package/dist/stores/formSave.svelte.js +113 -0
  66. package/dist/stores/navigation.d.ts.map +1 -1
  67. package/dist/stores/navigation.js +8 -0
  68. package/dist/stores/navigation.svelte.d.ts +35 -0
  69. package/dist/stores/navigation.svelte.d.ts.map +1 -0
  70. package/dist/stores/navigation.svelte.js +69 -0
  71. package/dist/telemetry.server.spec.js +11 -8
  72. package/dist/telemetry.spec.js +75 -50
  73. package/dist/utils/imageValidation.spec.js +62 -59
  74. package/dist/utils/logger.d.ts +19 -0
  75. package/dist/utils/logger.d.ts.map +1 -0
  76. package/dist/utils/logger.js +47 -0
  77. package/package.json +296 -292
@@ -1,3 +1,14 @@
1
+ /** Google Places API address component */ interface AddressComponent {
2
+ longText: string;
3
+ shortText: string;
4
+ types: string[];
5
+ }
6
+ /** Google Places API response data */ interface PlaceData {
7
+ formattedAddress?: string;
8
+ addressComponents?: AddressComponent[];
9
+ text?: string;
10
+ [key: string]: unknown;
11
+ }
1
12
  interface Props {
2
13
  fetchFields?: string[];
3
14
  placeholder?: string;
@@ -5,7 +16,7 @@ interface Props {
5
16
  region?: string;
6
17
  autocomplete?: string;
7
18
  initialValue?: string;
8
- onResponse?: (data: any) => void;
19
+ onResponse?: (data: PlaceData) => void;
9
20
  onError?: (error: string) => void;
10
21
  mode?: 'full' | 'cityState';
11
22
  animateFocus?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"PlaceAutocomplete.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.ts"],"names":[],"mappings":"AASE,UAAU,KAAK;IACb,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA8SH,QAAA,MAAM,iBAAiB,sDAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"PlaceAutocomplete.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.ts"],"names":[],"mappings":"AAQA,0CAA0C,CAAE,UAAU,gBAAgB;IAAM,QAAQ,EAAE,MAAM,CAAC;IAAI,SAAS,EAAE,MAAM,CAAC;IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;CAAG;AACzI,sCAAsC,CAAE,UAAU,SAAS;IAAM,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAI,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAAI,IAAI,CAAC,EAAE,MAAM,CAAC;IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAAG;AAMrL,UAAU,KAAK;IACb,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAqTH,QAAA,MAAM,iBAAiB,sDAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -1,5 +1,13 @@
1
+ /**
2
+ * @deprecated Use the Svelte 5 runes version from './auth.svelte.ts' instead.
3
+ * This file is maintained for backwards compatibility with Svelte 4 components.
4
+ */
1
5
  import { writable } from "svelte/store";
2
6
 
7
+ console.warn(
8
+ "[DEPRECATED] auth.js is deprecated. Use auth.svelte.ts for Svelte 5 runes."
9
+ );
10
+
3
11
  // Store to manage authentication state
4
12
  export const auth = writable({
5
13
  isAuthenticated: false,
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Authentication store using Svelte 5 runes
3
+ * Manages authentication state for the components library
4
+ */
5
+ interface UserDetails {
6
+ email?: string;
7
+ firstName?: string;
8
+ lastName?: string;
9
+ [key: string]: unknown;
10
+ }
11
+ interface AuthState {
12
+ isAuthenticated: boolean;
13
+ token: string | null;
14
+ userDetails: UserDetails | null;
15
+ }
16
+ /**
17
+ * Authentication store
18
+ */
19
+ export declare const auth: {
20
+ readonly value: AuthState;
21
+ readonly isAuthenticated: boolean;
22
+ readonly token: string | null;
23
+ readonly userDetails: UserDetails | null;
24
+ };
25
+ /**
26
+ * Set the authentication state
27
+ */
28
+ export declare function setAuthState(state: AuthState): void;
29
+ /**
30
+ * Clear the authentication state
31
+ */
32
+ export declare function clearAuthState(): void;
33
+ /**
34
+ * Initialize the store from cookies
35
+ * Should only be called in browser environment
36
+ */
37
+ export declare function initializeAuthState(): void;
38
+ export type { AuthState, UserDetails };
39
+ //# sourceMappingURL=auth.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/stores/auth.svelte.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,SAAS;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;CACjC;AAWD;;GAEG;AACH,eAAO,MAAM,IAAI;;;;;CAahB,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAEnD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAkB1C;AAGD,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Authentication store using Svelte 5 runes
3
+ * Manages authentication state for the components library
4
+ */
5
+ const defaultAuthState = {
6
+ isAuthenticated: false,
7
+ token: null,
8
+ userDetails: null,
9
+ };
10
+ // State using Svelte 5 runes
11
+ let authState = $state(structuredClone(defaultAuthState));
12
+ /**
13
+ * Authentication store
14
+ */
15
+ export const auth = {
16
+ get value() {
17
+ return authState;
18
+ },
19
+ get isAuthenticated() {
20
+ return authState.isAuthenticated;
21
+ },
22
+ get token() {
23
+ return authState.token;
24
+ },
25
+ get userDetails() {
26
+ return authState.userDetails;
27
+ },
28
+ };
29
+ /**
30
+ * Set the authentication state
31
+ */
32
+ export function setAuthState(state) {
33
+ authState = state;
34
+ }
35
+ /**
36
+ * Clear the authentication state
37
+ */
38
+ export function clearAuthState() {
39
+ authState = structuredClone(defaultAuthState);
40
+ }
41
+ /**
42
+ * Initialize the store from cookies
43
+ * Should only be called in browser environment
44
+ */
45
+ export function initializeAuthState() {
46
+ if (typeof document === "undefined")
47
+ return;
48
+ const cookies = Object.fromEntries(document.cookie
49
+ .split("; ")
50
+ .filter((c) => c)
51
+ .map((c) => c.split("="))
52
+ .map(([k, v]) => [k, decodeURIComponent(v || "")]));
53
+ if (cookies.performer_token) {
54
+ setAuthState({
55
+ isAuthenticated: true,
56
+ token: cookies.performer_token,
57
+ userDetails: cookies.userDetails ? JSON.parse(cookies.userDetails) : null,
58
+ });
59
+ }
60
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"formDataStore.d.ts","sourceRoot":"","sources":["../../src/lib/stores/formDataStore.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAEH,oEAA8C;AAE9C,kEAKE"}
1
+ {"version":3,"file":"formDataStore.d.ts","sourceRoot":"","sources":["../../src/lib/stores/formDataStore.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;GAaG;AAEH,oEAA8C;AAE9C,kEAKE"}
@@ -1,5 +1,13 @@
1
+ /**
2
+ * @deprecated Use the Svelte 5 runes version from './formDataStore.svelte.ts' instead.
3
+ * This file is maintained for backwards compatibility with Svelte 4 components.
4
+ */
1
5
  import { writable, derived } from "svelte/store";
2
6
 
7
+ console.warn(
8
+ "[DEPRECATED] formDataStore.js is deprecated. Use formDataStore.svelte.ts for Svelte 5 runes."
9
+ );
10
+
3
11
  export const profileFormData = writable({
4
12
  basicInfo: {
5
13
  firstName: "",
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Form data store using Svelte 5 runes
3
+ * Tracks profile form data and change detection
4
+ */
5
+ interface BasicInfo {
6
+ firstName: string;
7
+ lastName: string;
8
+ email: string;
9
+ phone: string;
10
+ stageName: string;
11
+ location: string;
12
+ }
13
+ interface SocialMedia {
14
+ videoLink: string;
15
+ }
16
+ interface ProfileFormData {
17
+ basicInfo: BasicInfo;
18
+ socialMedia: SocialMedia;
19
+ extraDetails: Record<string, unknown>;
20
+ }
21
+ /**
22
+ * Profile form data store
23
+ */
24
+ export declare const profileFormData: {
25
+ value: ProfileFormData;
26
+ basicInfo: BasicInfo;
27
+ socialMedia: SocialMedia;
28
+ extraDetails: Record<string, unknown>;
29
+ update(updater: (data: ProfileFormData) => ProfileFormData): void;
30
+ reset(): void;
31
+ };
32
+ /**
33
+ * Initial form data store (for comparison)
34
+ */
35
+ export declare const initialFormData: {
36
+ value: ProfileFormData | null;
37
+ setFromCurrent(): void;
38
+ reset(): void;
39
+ };
40
+ /**
41
+ * Derived store indicating if form has unsaved changes
42
+ */
43
+ export declare const hasChanges: {
44
+ readonly value: boolean;
45
+ };
46
+ export type { ProfileFormData, BasicInfo, SocialMedia };
47
+ //# sourceMappingURL=formDataStore.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formDataStore.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/stores/formDataStore.svelte.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,SAAS;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AA2BD;;GAEG;AACH,eAAO,MAAM,eAAe;WAIV,eAAe;eAMX,SAAS;iBAMN,WAAW;kBAMR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBAGjC,CAAC,IAAI,EAAE,eAAe,KAAK,eAAe;;CAM3D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe;WAIV,eAAe,GAAG,IAAI;;;CASvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU;;CAItB,CAAC;AAGF,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Form data store using Svelte 5 runes
3
+ * Tracks profile form data and change detection
4
+ */
5
+ const defaultFormData = {
6
+ basicInfo: {
7
+ firstName: "",
8
+ lastName: "",
9
+ email: "",
10
+ phone: "",
11
+ stageName: "",
12
+ location: "",
13
+ },
14
+ socialMedia: {
15
+ videoLink: "",
16
+ },
17
+ extraDetails: {},
18
+ };
19
+ // State using Svelte 5 runes
20
+ let profileFormDataState = $state(structuredClone(defaultFormData));
21
+ let initialFormDataState = $state(null);
22
+ // Derived state for change detection
23
+ const hasChangesValue = $derived(initialFormDataState !== null &&
24
+ JSON.stringify(profileFormDataState) !== JSON.stringify(initialFormDataState));
25
+ /**
26
+ * Profile form data store
27
+ */
28
+ export const profileFormData = {
29
+ get value() {
30
+ return profileFormDataState;
31
+ },
32
+ set value(data) {
33
+ profileFormDataState = data;
34
+ },
35
+ get basicInfo() {
36
+ return profileFormDataState.basicInfo;
37
+ },
38
+ set basicInfo(info) {
39
+ profileFormDataState.basicInfo = info;
40
+ },
41
+ get socialMedia() {
42
+ return profileFormDataState.socialMedia;
43
+ },
44
+ set socialMedia(media) {
45
+ profileFormDataState.socialMedia = media;
46
+ },
47
+ get extraDetails() {
48
+ return profileFormDataState.extraDetails;
49
+ },
50
+ set extraDetails(details) {
51
+ profileFormDataState.extraDetails = details;
52
+ },
53
+ update(updater) {
54
+ profileFormDataState = updater(profileFormDataState);
55
+ },
56
+ reset() {
57
+ profileFormDataState = structuredClone(defaultFormData);
58
+ },
59
+ };
60
+ /**
61
+ * Initial form data store (for comparison)
62
+ */
63
+ export const initialFormData = {
64
+ get value() {
65
+ return initialFormDataState;
66
+ },
67
+ set value(data) {
68
+ initialFormDataState = data;
69
+ },
70
+ setFromCurrent() {
71
+ initialFormDataState = structuredClone(profileFormDataState);
72
+ },
73
+ reset() {
74
+ initialFormDataState = null;
75
+ },
76
+ };
77
+ /**
78
+ * Derived store indicating if form has unsaved changes
79
+ */
80
+ export const hasChanges = {
81
+ get value() {
82
+ return hasChangesValue;
83
+ },
84
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"formSave.d.ts","sourceRoot":"","sources":["../../src/lib/stores/formSave.js"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,yCAPG;IAAwB,QAAQ,EAAxB,MAAM;IACU,cAAc,EAA9B,MAAM;IACU,YAAY,EAA5B,MAAM;IACY,SAAS;IACT,OAAO;CACjC,GAAU,MAAM,CA6FlB;AAED;;;;GAIG;AACH,gDAHW,MAAM,GACJ,MAAM,CAsBlB"}
1
+ {"version":3,"file":"formSave.d.ts","sourceRoot":"","sources":["../../src/lib/stores/formSave.js"],"names":[],"mappings":"AAWA;;;;;;;;;GASG;AACH,yCAPG;IAAwB,QAAQ,EAAxB,MAAM;IACU,cAAc,EAA9B,MAAM;IACU,YAAY,EAA5B,MAAM;IACY,SAAS;IACT,OAAO;CACjC,GAAU,MAAM,CA6FlB;AAED;;;;GAIG;AACH,gDAHW,MAAM,GACJ,MAAM,CAsBlB"}
@@ -1,6 +1,14 @@
1
+ /**
2
+ * @deprecated Use the Svelte 5 runes version from './formSave.svelte.ts' instead.
3
+ * This file is maintained for backwards compatibility with Svelte 4 components.
4
+ */
1
5
  import { writable, get } from "svelte/store";
2
6
  import { showToast } from "./toaster";
3
7
 
8
+ console.warn(
9
+ "[DEPRECATED] formSave.js is deprecated. Use formSave.svelte.ts for Svelte 5 runes."
10
+ );
11
+
4
12
  /**
5
13
  * Creates a form save handler with loading and success states
6
14
  * @param {Object} options - Configuration options
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Form save utilities using Svelte 5 runes
3
+ * Handles form submission with loading and success states
4
+ */
5
+ interface FormSaveOptions {
6
+ endpoint?: string;
7
+ successMessage?: string;
8
+ errorMessage?: string;
9
+ onSuccess?: () => void;
10
+ onError?: (error: string) => void;
11
+ }
12
+ /**
13
+ * Creates a form save handler with loading and success states
14
+ * Uses Svelte 5 runes for reactive state
15
+ */
16
+ export declare function createFormSave(options?: FormSaveOptions): {
17
+ readonly isLoading: boolean;
18
+ readonly isSuccess: boolean;
19
+ readonly error: string | null;
20
+ save: (data: Record<string, unknown>, customEndpoint?: string | null) => Promise<boolean>;
21
+ resetSuccess: () => void;
22
+ reset: () => void;
23
+ };
24
+ /**
25
+ * Creates a simple dirty state tracker for forms
26
+ */
27
+ export declare function createDirtyTracker(initialData: Record<string, unknown>): {
28
+ readonly isDirty: boolean;
29
+ check: (currentData: Record<string, unknown>) => boolean;
30
+ reset: (newInitialData: Record<string, unknown>) => void;
31
+ };
32
+ export {};
33
+ //# sourceMappingURL=formSave.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formSave.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/stores/formSave.svelte.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,UAAU,eAAe;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAQD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB;;;;iBAyBlD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,mBACb,MAAM,GAAG,IAAI,KAC5B,OAAO,CAAC,OAAO,CAAC;wBAVM,IAAI;iBA0DX,IAAI;EAoBvB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;yBAIzC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO;4BAM9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAAI;EAY9D"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Form save utilities using Svelte 5 runes
3
+ * Handles form submission with loading and success states
4
+ */
5
+ import { showToast } from "./toaster";
6
+ /**
7
+ * Creates a form save handler with loading and success states
8
+ * Uses Svelte 5 runes for reactive state
9
+ */
10
+ export function createFormSave(options = {}) {
11
+ const { endpoint = "", successMessage = "Changes saved successfully", errorMessage = "Failed to save changes", onSuccess, onError, } = options;
12
+ // State using Svelte 5 runes
13
+ let isLoadingState = $state(false);
14
+ let isSuccessState = $state(false);
15
+ let errorState = $state(null);
16
+ /**
17
+ * Reset success state (call when form becomes dirty)
18
+ */
19
+ function resetSuccess() {
20
+ isSuccessState = false;
21
+ }
22
+ /**
23
+ * Save form data to the endpoint
24
+ */
25
+ async function save(data, customEndpoint = null) {
26
+ const targetEndpoint = customEndpoint || endpoint;
27
+ if (!targetEndpoint) {
28
+ console.error("No endpoint specified for form save");
29
+ return false;
30
+ }
31
+ isLoadingState = true;
32
+ isSuccessState = false;
33
+ errorState = null;
34
+ try {
35
+ const res = await fetch(targetEndpoint, {
36
+ method: "POST",
37
+ headers: { "Content-Type": "application/json" },
38
+ body: JSON.stringify(data),
39
+ });
40
+ if (res.ok) {
41
+ isSuccessState = true;
42
+ if (successMessage) {
43
+ showToast(successMessage, "success");
44
+ }
45
+ onSuccess?.();
46
+ return true;
47
+ }
48
+ else {
49
+ const errorData = await res.json().catch(() => ({}));
50
+ const errorMsg = errorData.message || errorMessage;
51
+ errorState = errorMsg;
52
+ showToast(errorMsg, "error");
53
+ onError?.(errorMsg);
54
+ return false;
55
+ }
56
+ }
57
+ catch (err) {
58
+ const errorMsg = err instanceof Error ? err.message : "Something went wrong";
59
+ errorState = errorMsg;
60
+ showToast(errorMsg, "error");
61
+ onError?.(errorMsg);
62
+ return false;
63
+ }
64
+ finally {
65
+ isLoadingState = false;
66
+ }
67
+ }
68
+ /**
69
+ * Reset all states
70
+ */
71
+ function reset() {
72
+ isLoadingState = false;
73
+ isSuccessState = false;
74
+ errorState = null;
75
+ }
76
+ return {
77
+ get isLoading() {
78
+ return isLoadingState;
79
+ },
80
+ get isSuccess() {
81
+ return isSuccessState;
82
+ },
83
+ get error() {
84
+ return errorState;
85
+ },
86
+ save,
87
+ resetSuccess,
88
+ reset,
89
+ };
90
+ }
91
+ /**
92
+ * Creates a simple dirty state tracker for forms
93
+ */
94
+ export function createDirtyTracker(initialData) {
95
+ let isDirtyState = $state(false);
96
+ let initial = JSON.stringify(initialData);
97
+ function check(currentData) {
98
+ const dirty = JSON.stringify(currentData) !== initial;
99
+ isDirtyState = dirty;
100
+ return dirty;
101
+ }
102
+ function reset(newInitialData) {
103
+ initial = JSON.stringify(newInitialData);
104
+ isDirtyState = false;
105
+ }
106
+ return {
107
+ get isDirty() {
108
+ return isDirtyState;
109
+ },
110
+ check,
111
+ reset,
112
+ };
113
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/lib/stores/navigation.js"],"names":[],"mappings":"AAEA,iEAAyC;AAGzC,4EAAoD;AAGpD,sEAAgD;AAGhD,4EAAoD"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/lib/stores/navigation.js"],"names":[],"mappings":"AAUA,iEAAyC;AAGzC,4EAAoD;AAGpD,sEAAgD;AAGhD,4EAAoD"}
@@ -1,5 +1,13 @@
1
+ /**
2
+ * @deprecated Use the Svelte 5 runes version from './navigation.svelte.ts' instead.
3
+ * This file is maintained for backwards compatibility with Svelte 4 components.
4
+ */
1
5
  import { writable } from "svelte/store";
2
6
 
7
+ console.warn(
8
+ "[DEPRECATED] navigation.js is deprecated. Use navigation.svelte.ts for Svelte 5 runes."
9
+ );
10
+
3
11
  export const isSubPage = writable(false);
4
12
 
5
13
  // Pages can set this to true to hide the header back button (e.g., when they have their own)
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Navigation store using Svelte 5 runes
3
+ * Tracks navigation state and page context
4
+ */
5
+ /**
6
+ * Whether the current page is a sub-page (for header back button display)
7
+ */
8
+ export declare const isSubPage: {
9
+ value: boolean;
10
+ set(val: boolean): void;
11
+ };
12
+ /**
13
+ * Pages can set this to true to hide the header back button
14
+ * (e.g., when they have their own)
15
+ */
16
+ export declare const hideHeaderBackButton: {
17
+ value: boolean;
18
+ set(val: boolean): void;
19
+ };
20
+ /**
21
+ * Store venue data when navigating to calendar to avoid re-fetching
22
+ */
23
+ export declare const selectedVenueData: {
24
+ value: Record<string, unknown> | null;
25
+ set(data: Record<string, unknown> | null): void;
26
+ reset(): void;
27
+ };
28
+ /**
29
+ * Flag to indicate we're doing an animated navigation (not a refresh/direct load)
30
+ */
31
+ export declare const isAnimatedNavigation: {
32
+ value: boolean;
33
+ set(val: boolean): void;
34
+ };
35
+ //# sourceMappingURL=navigation.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/stores/navigation.svelte.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;GAEG;AACH,eAAO,MAAM,SAAS;WAIL,OAAO;aAGb,OAAO;CAGjB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB;WAIhB,OAAO;aAGb,OAAO;CAGjB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB;WAIZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;cAGpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;;CAMzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB;WAIhB,OAAO;aAGb,OAAO;CAGjB,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Navigation store using Svelte 5 runes
3
+ * Tracks navigation state and page context
4
+ */
5
+ // State using Svelte 5 runes
6
+ let isSubPageState = $state(false);
7
+ let hideHeaderBackButtonState = $state(false);
8
+ let selectedVenueDataState = $state(null);
9
+ let isAnimatedNavigationState = $state(false);
10
+ /**
11
+ * Whether the current page is a sub-page (for header back button display)
12
+ */
13
+ export const isSubPage = {
14
+ get value() {
15
+ return isSubPageState;
16
+ },
17
+ set value(val) {
18
+ isSubPageState = val;
19
+ },
20
+ set(val) {
21
+ isSubPageState = val;
22
+ },
23
+ };
24
+ /**
25
+ * Pages can set this to true to hide the header back button
26
+ * (e.g., when they have their own)
27
+ */
28
+ export const hideHeaderBackButton = {
29
+ get value() {
30
+ return hideHeaderBackButtonState;
31
+ },
32
+ set value(val) {
33
+ hideHeaderBackButtonState = val;
34
+ },
35
+ set(val) {
36
+ hideHeaderBackButtonState = val;
37
+ },
38
+ };
39
+ /**
40
+ * Store venue data when navigating to calendar to avoid re-fetching
41
+ */
42
+ export const selectedVenueData = {
43
+ get value() {
44
+ return selectedVenueDataState;
45
+ },
46
+ set value(data) {
47
+ selectedVenueDataState = data;
48
+ },
49
+ set(data) {
50
+ selectedVenueDataState = data;
51
+ },
52
+ reset() {
53
+ selectedVenueDataState = null;
54
+ },
55
+ };
56
+ /**
57
+ * Flag to indicate we're doing an animated navigation (not a refresh/direct load)
58
+ */
59
+ export const isAnimatedNavigation = {
60
+ get value() {
61
+ return isAnimatedNavigationState;
62
+ },
63
+ set value(val) {
64
+ isAnimatedNavigationState = val;
65
+ },
66
+ set(val) {
67
+ isAnimatedNavigationState = val;
68
+ },
69
+ };
@@ -1,24 +1,27 @@
1
1
  // @ts-nocheck
2
2
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
3
3
 
4
+ // Vitest 4.x requires class syntax for constructor mocks
4
5
  // Mock all OpenTelemetry modules
5
6
  vi.mock('@opentelemetry/instrumentation', () => ({
6
7
  registerInstrumentations: vi.fn(),
7
8
  }));
8
9
 
9
10
  vi.mock('@opentelemetry/sdk-node', () => ({
10
- NodeSDK: vi.fn(() => ({
11
- start: vi.fn(),
12
- shutdown: vi.fn(() => Promise.resolve()),
13
- })),
11
+ NodeSDK: class MockNodeSDK {
12
+ constructor() {
13
+ this.start = vi.fn();
14
+ this.shutdown = vi.fn(() => Promise.resolve());
15
+ }
16
+ },
14
17
  }));
15
18
 
16
19
  vi.mock('@opentelemetry/exporter-trace-otlp-http', () => ({
17
- OTLPTraceExporter: vi.fn(),
20
+ OTLPTraceExporter: class MockOTLPTraceExporter {},
18
21
  }));
19
22
 
20
23
  vi.mock('@opentelemetry/resources', () => ({
21
- Resource: vi.fn(),
24
+ Resource: class MockResource {},
22
25
  }));
23
26
 
24
27
  vi.mock('@opentelemetry/semantic-conventions', () => ({
@@ -28,11 +31,11 @@ vi.mock('@opentelemetry/semantic-conventions', () => ({
28
31
  }));
29
32
 
30
33
  vi.mock('@opentelemetry/instrumentation-http', () => ({
31
- HttpInstrumentation: vi.fn(() => ({})),
34
+ HttpInstrumentation: class MockHttpInstrumentation {},
32
35
  }));
33
36
 
34
37
  vi.mock('@opentelemetry/instrumentation-fetch', () => ({
35
- FetchInstrumentation: vi.fn(() => ({})),
38
+ FetchInstrumentation: class MockFetchInstrumentation {},
36
39
  }));
37
40
 
38
41
  vi.mock('@opentelemetry/auto-instrumentations-node', () => ({