@getmicdrop/svelte-components 2.6.4 → 2.8.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 (165) hide show
  1. package/dist/__LIB_STORES__.js +30 -2
  2. package/dist/components/AboutShow/AboutShow.svelte +278 -0
  3. package/dist/components/AboutShow/AboutShow.svelte.d.ts +43 -0
  4. package/dist/components/AboutShow/AboutShow.svelte.d.ts.map +1 -0
  5. package/dist/components/Accordion/Accordion.svelte +44 -0
  6. package/dist/components/Accordion/Accordion.svelte.d.ts +42 -0
  7. package/dist/components/Accordion/Accordion.svelte.d.ts.map +1 -0
  8. package/dist/components/Accordion/AccordionItem.svelte +141 -0
  9. package/dist/components/Accordion/AccordionItem.svelte.d.ts +50 -0
  10. package/dist/components/Accordion/AccordionItem.svelte.d.ts.map +1 -0
  11. package/dist/components/Badges/Badge.svelte +268 -17
  12. package/dist/components/Badges/Badge.svelte.d.ts +18 -2
  13. package/dist/components/Badges/Badge.svelte.d.ts.map +1 -1
  14. package/dist/components/Breadcrumb/Breadcrumb.svelte +65 -36
  15. package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts +16 -2
  16. package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts.map +1 -1
  17. package/dist/components/Button/Button.svelte +136 -3
  18. package/dist/components/Button/Button.svelte.d.ts +2 -0
  19. package/dist/components/Button/Button.svelte.d.ts.map +1 -1
  20. package/dist/components/Calendar/MiniMonthCalendar.svelte +1446 -0
  21. package/dist/components/Calendar/{Calendar.svelte.d.ts → MiniMonthCalendar.svelte.d.ts} +20 -21
  22. package/dist/components/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -0
  23. package/dist/components/Card.svelte +2 -2
  24. package/dist/components/Card.svelte.d.ts +2 -2
  25. package/dist/components/Card.svelte.d.ts.map +1 -1
  26. package/dist/components/Checkbox/Checkbox.svelte +90 -0
  27. package/dist/components/Checkbox/Checkbox.svelte.d.ts +64 -0
  28. package/dist/components/Checkbox/Checkbox.svelte.d.ts.map +1 -0
  29. package/dist/components/DarkModeToggle.svelte +41 -52
  30. package/dist/components/DarkModeToggle.svelte.d.ts +0 -2
  31. package/dist/components/DarkModeToggle.svelte.d.ts.map +1 -1
  32. package/dist/components/Drawer/Drawer.svelte +207 -0
  33. package/dist/components/Drawer/Drawer.svelte.d.ts +74 -0
  34. package/dist/components/Drawer/Drawer.svelte.d.ts.map +1 -0
  35. package/dist/components/Dropdown/Dropdown.svelte +193 -0
  36. package/dist/components/Dropdown/Dropdown.svelte.d.ts +50 -0
  37. package/dist/components/Dropdown/Dropdown.svelte.d.ts.map +1 -0
  38. package/dist/components/Dropdown/DropdownItem.svelte +111 -0
  39. package/dist/components/Dropdown/DropdownItem.svelte.d.ts +48 -0
  40. package/dist/components/Dropdown/DropdownItem.svelte.d.ts.map +1 -0
  41. package/dist/components/Dropdown/SelectDropdown.svelte +301 -0
  42. package/dist/components/Dropdown/SelectDropdown.svelte.d.ts +51 -0
  43. package/dist/components/Dropdown/SelectDropdown.svelte.d.ts.map +1 -0
  44. package/dist/components/EmptyState/EmptyState.svelte +80 -0
  45. package/dist/components/{Calendar/QuarterView.stories.svelte.d.ts → EmptyState/EmptyState.svelte.d.ts} +17 -21
  46. package/dist/components/EmptyState/EmptyState.svelte.d.ts.map +1 -0
  47. package/dist/components/ErrorDisplay.svelte.d.ts +2 -2
  48. package/dist/components/FAQs/FAQs.svelte +49 -0
  49. package/dist/components/{Calendar/QuarterView.svelte.d.ts → FAQs/FAQs.svelte.d.ts} +10 -10
  50. package/dist/components/FAQs/FAQs.svelte.d.ts.map +1 -0
  51. package/dist/components/Input/Input.svelte +107 -12
  52. package/dist/components/Input/Input.svelte.d.ts +28 -12
  53. package/dist/components/Input/Input.svelte.d.ts.map +1 -1
  54. package/dist/components/Input/MultiSelect.svelte +4 -5
  55. package/dist/components/Input/MultiSelect.svelte.d.ts +8 -8
  56. package/dist/components/Input/MultiSelect.svelte.d.ts.map +1 -1
  57. package/dist/components/Input/OTPInput.svelte +1 -1
  58. package/dist/components/Input/Search.svelte +173 -0
  59. package/dist/components/Input/Search.svelte.d.ts +68 -0
  60. package/dist/components/Input/Search.svelte.d.ts.map +1 -0
  61. package/dist/components/Input/Select.svelte +42 -12
  62. package/dist/components/Input/Select.svelte.d.ts +8 -8
  63. package/dist/components/Input/Select.svelte.d.ts.map +1 -1
  64. package/dist/components/Input/Textarea.svelte +160 -0
  65. package/dist/components/Input/Textarea.svelte.d.ts +69 -0
  66. package/dist/components/Input/Textarea.svelte.d.ts.map +1 -0
  67. package/dist/components/Label/Label.svelte +60 -0
  68. package/dist/components/Label/Label.svelte.d.ts +48 -0
  69. package/dist/components/Label/Label.svelte.d.ts.map +1 -0
  70. package/dist/components/Layout/Header.svelte +14 -4
  71. package/dist/components/Layout/PageLayout.svelte +64 -0
  72. package/dist/components/Layout/PageLayout.svelte.d.ts +58 -0
  73. package/dist/components/Layout/PageLayout.svelte.d.ts.map +1 -0
  74. package/dist/components/Modal/ConfirmationModal.svelte +69 -17
  75. package/dist/components/Modal/ConfirmationModal.svelte.d.ts +22 -0
  76. package/dist/components/Modal/ConfirmationModal.svelte.d.ts.map +1 -1
  77. package/dist/components/Modal/InputModal.svelte +180 -0
  78. package/dist/components/Modal/InputModal.svelte.d.ts +77 -0
  79. package/dist/components/Modal/InputModal.svelte.d.ts.map +1 -0
  80. package/dist/components/Modal/Modal.svelte +41 -9
  81. package/dist/components/Modal/Modal.svelte.d.ts +2 -0
  82. package/dist/components/Modal/Modal.svelte.d.ts.map +1 -1
  83. package/dist/components/Modal/StatusModal.svelte +221 -0
  84. package/dist/components/Modal/StatusModal.svelte.d.ts +59 -0
  85. package/dist/components/Modal/StatusModal.svelte.d.ts.map +1 -0
  86. package/dist/components/MonthSwitcher/MonthSwitcher.svelte +206 -0
  87. package/dist/components/MonthSwitcher/MonthSwitcher.svelte.d.ts +37 -0
  88. package/dist/components/MonthSwitcher/MonthSwitcher.svelte.d.ts.map +1 -0
  89. package/dist/components/OrderSummary/OrderSummary.svelte +553 -0
  90. package/dist/components/OrderSummary/OrderSummary.svelte.d.ts +65 -0
  91. package/dist/components/OrderSummary/OrderSummary.svelte.d.ts.map +1 -0
  92. package/dist/components/Pagination/Pagination.svelte +197 -0
  93. package/dist/components/Pagination/Pagination.svelte.d.ts +53 -0
  94. package/dist/components/Pagination/Pagination.svelte.d.ts.map +1 -0
  95. package/dist/components/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte.d.ts +2 -2
  96. package/dist/components/PublicCard/PublicCard.svelte +267 -0
  97. package/dist/components/{pages/performers/AvailabilityCalendarModal.svelte.d.ts → PublicCard/PublicCard.svelte.d.ts} +12 -14
  98. package/dist/components/PublicCard/PublicCard.svelte.d.ts.map +1 -0
  99. package/dist/components/Radio/Radio.svelte +119 -0
  100. package/dist/components/Radio/Radio.svelte.d.ts +54 -0
  101. package/dist/components/Radio/Radio.svelte.d.ts.map +1 -0
  102. package/dist/components/ShowCard/ShowCard.svelte +240 -0
  103. package/dist/components/ShowCard/ShowCard.svelte.d.ts +39 -0
  104. package/dist/components/ShowCard/ShowCard.svelte.d.ts.map +1 -0
  105. package/dist/components/ShowTimeCard/ShowTimeCard.svelte +92 -0
  106. package/dist/components/ShowTimeCard/ShowTimeCard.svelte.d.ts +37 -0
  107. package/dist/components/ShowTimeCard/ShowTimeCard.svelte.d.ts.map +1 -0
  108. package/dist/components/Skeleton/Skeleton.svelte +68 -0
  109. package/dist/components/Skeleton/Skeleton.svelte.d.ts +37 -0
  110. package/dist/components/{Calendar/QuarterView.svelte.d.ts.map → Skeleton/Skeleton.svelte.d.ts.map} +1 -1
  111. package/dist/components/Spinner/Spinner.svelte +73 -17
  112. package/dist/components/Spinner/Spinner.svelte.d.ts +5 -3
  113. package/dist/components/Spinner/Spinner.svelte.d.ts.map +1 -1
  114. package/dist/components/SuperLogin/SuperLogin.svelte +1282 -0
  115. package/dist/components/SuperLogin/SuperLogin.svelte.d.ts +44 -0
  116. package/dist/components/SuperLogin/SuperLogin.svelte.d.ts.map +1 -0
  117. package/dist/components/SuperLogin/index.d.ts +2 -0
  118. package/dist/components/SuperLogin/index.d.ts.map +1 -0
  119. package/dist/components/SuperLogin/index.js +1 -0
  120. package/dist/components/Tabs/TabItem.svelte +39 -0
  121. package/dist/components/Tabs/TabItem.svelte.d.ts +52 -0
  122. package/dist/components/Tabs/TabItem.svelte.d.ts.map +1 -0
  123. package/dist/components/Tabs/Tabs.svelte +181 -0
  124. package/dist/components/Tabs/Tabs.svelte.d.ts +46 -0
  125. package/dist/components/Tabs/Tabs.svelte.d.ts.map +1 -0
  126. package/dist/components/Typography/Typography.svelte +50 -0
  127. package/dist/components/Typography/Typography.svelte.d.ts +48 -0
  128. package/dist/components/Typography/Typography.svelte.d.ts.map +1 -0
  129. package/dist/components/pages/performers/ShowDetails.svelte.d.ts +4 -4
  130. package/dist/components/pages/performers/ShowItemCard.svelte.d.ts +8 -8
  131. package/dist/components/pages/performers/SwitchOption.svelte.d.ts +2 -2
  132. package/dist/components/pages/performers/VenueInfo.svelte.d.ts +2 -2
  133. package/dist/components/pages/performers/VenueItemCard.svelte +2 -2
  134. package/dist/components/pages/performers/VenueItemCard.svelte.d.ts +4 -4
  135. package/dist/components/pages/profile/profile-form.svelte +1 -1
  136. package/dist/components/pages/settings/tabs/CustomImageDropzone.svelte.d.ts +2 -2
  137. package/dist/components/pages/shows/TabNavigation.svelte +7 -8
  138. package/dist/constants/formOptions.d.ts +5 -2
  139. package/dist/constants/formOptions.d.ts.map +1 -1
  140. package/dist/constants/formOptions.js +2 -1
  141. package/dist/constants/validation.d.ts +55 -0
  142. package/dist/constants/validation.d.ts.map +1 -0
  143. package/dist/constants/validation.js +91 -0
  144. package/dist/constants/validation.spec.d.ts +2 -0
  145. package/dist/constants/validation.spec.d.ts.map +1 -0
  146. package/dist/constants/validation.spec.js +64 -0
  147. package/dist/index.d.ts +30 -4
  148. package/dist/index.js +37 -30
  149. package/dist/services/EventService.js +75 -75
  150. package/dist/services/EventService.spec.js +217 -217
  151. package/dist/services/ShowService.spec.js +342 -342
  152. package/package.json +160 -160
  153. package/dist/components/Calendar/Calendar.spec.d.ts +0 -2
  154. package/dist/components/Calendar/Calendar.spec.d.ts.map +0 -1
  155. package/dist/components/Calendar/Calendar.spec.js +0 -131
  156. package/dist/components/Calendar/Calendar.svelte +0 -1115
  157. package/dist/components/Calendar/Calendar.svelte.d.ts.map +0 -1
  158. package/dist/components/Calendar/QuarterView.spec.d.ts +0 -2
  159. package/dist/components/Calendar/QuarterView.spec.d.ts.map +0 -1
  160. package/dist/components/Calendar/QuarterView.spec.js +0 -394
  161. package/dist/components/Calendar/QuarterView.stories.svelte +0 -134
  162. package/dist/components/Calendar/QuarterView.stories.svelte.d.ts.map +0 -1
  163. package/dist/components/Calendar/QuarterView.svelte +0 -736
  164. package/dist/components/pages/performers/AvailabilityCalendarModal.svelte +0 -632
  165. package/dist/components/pages/performers/AvailabilityCalendarModal.svelte.d.ts.map +0 -1
@@ -5,21 +5,68 @@
5
5
  import Modal from "./Modal.svelte";
6
6
 
7
7
  export let show = false;
8
+ export let size = "default"; // "small" | "default" | "large"
8
9
  export let title = "";
9
10
  export let description = "";
10
11
  export let warningText = "";
11
12
  export let actions = [];
12
13
  export let icon = null;
14
+ export let customIcon = null; // Alias for icon (used by some wrappers)
13
15
  export let closeBtn = false; // To show close button
14
16
 
17
+ // Simple props-based API (alternative to actions array)
18
+ export let primaryButtonText = "";
19
+ export let secondaryButtonText = "";
20
+ export let variant = "default"; // "default" | "danger"
21
+
22
+ // Loading/disabled state
23
+ export let loading = false;
24
+ export let disabled = false;
25
+
15
26
  const dispatch = createEventDispatcher();
16
27
 
28
+ // Resolve icon (support both prop names)
29
+ $: resolvedIcon = customIcon || icon;
30
+
31
+ // Build actions from simple props if actions array is empty
32
+ $: resolvedActions = actions.length > 0 ? actions : buildActionsFromProps();
33
+
34
+ function buildActionsFromProps() {
35
+ const result = [];
36
+
37
+ if (secondaryButtonText) {
38
+ result.push({
39
+ label: secondaryButtonText,
40
+ variant: "gray-outline",
41
+ onClick: () => dispatch("cancel")
42
+ });
43
+ }
44
+
45
+ if (primaryButtonText) {
46
+ result.push({
47
+ label: primaryButtonText,
48
+ variant: variant === "danger" ? "red-solid" : "blue-solid",
49
+ onClick: () => dispatch("confirm"),
50
+ primary: true
51
+ });
52
+ }
53
+
54
+ return result;
55
+ }
56
+
17
57
  const handleAction = (action) => {
18
- action.onClick();
58
+ if (disabled || loading) return;
59
+ action.onClick?.();
19
60
  dispatch(action.label.toLowerCase());
20
61
  show = false;
21
62
  };
22
63
 
64
+ const handleClose = () => {
65
+ if (disabled || loading) return;
66
+ dispatch("close");
67
+ show = false;
68
+ };
69
+
23
70
  const getVariant = (action) => {
24
71
  // If variant is already specified, use it
25
72
  if (action.variant) return action.variant;
@@ -48,54 +95,59 @@
48
95
  onClick,
49
96
  beforeIcon,
50
97
  afterIcon,
98
+ primary,
51
99
  ...rest
52
100
  } = action;
53
101
  return rest;
54
102
  };
55
103
  </script>
56
104
 
57
- <Modal bind:show>
58
- <div slot="header" class="flex flex-col gap-6 text-center">
105
+ <Modal bind:show {size}>
106
+ <div slot="header" class="text-center">
59
107
  {#if closeBtn}
60
- <div class="flex justify-end">
61
- <button class="focus:outline-none" on:click={() => (show = false)}>
62
- <img src={Cancel} alt="Close Icon" />
108
+ <div class="flex justify-end -mt-2 -mr-2 mb-2">
109
+ <button
110
+ class="p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none transition-colors"
111
+ on:click={handleClose}
112
+ {disabled}
113
+ >
114
+ <img src={Cancel} alt="Close" class="w-5 h-5" />
63
115
  </button>
64
116
  </div>
65
117
  {/if}
66
- {#if icon}
67
- <div class="flex justify-center items-center">
68
- <img src={icon} alt="Icon here" />
118
+ {#if resolvedIcon}
119
+ <div class="flex justify-center mb-4">
120
+ <img src={resolvedIcon} alt="" class="w-12 h-12" />
69
121
  </div>
70
122
  {/if}
71
123
  {#if title}
72
- <h2 class="text-xl text-Text-Primary leading-5 font-normal">{title}</h2>
124
+ <h2 class="text-xl font-medium text-gray-900 dark:text-white">{title}</h2>
73
125
  {/if}
74
126
  </div>
75
127
 
76
- <div slot="body" class="flex flex-col gap-6 text-center mt-6">
128
+ <div slot="body" class="text-center mt-4">
77
129
  {#if description}
78
- <p class="text-Text-Tartiary text-sm leading-[22px] font-normal">
130
+ <p class="text-sm text-gray-500 dark:text-gray-400 leading-relaxed">
79
131
  {description}
80
132
  </p>
81
133
  {/if}
82
134
  {#if warningText}
83
- <p
84
- class="text-accent-Danger text-center text-sm leading-[22px] font-bold"
85
- >
135
+ <p class="mt-3 text-sm font-medium text-red-600 dark:text-red-400">
86
136
  {warningText}
87
137
  </p>
88
138
  {/if}
89
139
  </div>
90
140
 
91
- <div slot="footer" class="flex justify-around gap-3 mt-6">
92
- {#each actions as action}
141
+ <div slot="footer" class="flex gap-3">
142
+ {#each resolvedActions as action}
93
143
  <Button
94
144
  size="full"
95
145
  variant={getVariant(action)}
96
146
  {...cleanActionProps(action)}
97
147
  beforeIcon={action.beforeIcon}
98
148
  afterIcon={action.afterIcon}
149
+ disabled={disabled || action.disabled}
150
+ loading={action.primary && loading}
99
151
  on:click={() => handleAction(action)}
100
152
  >
101
153
  {action.label}
@@ -1,26 +1,48 @@
1
1
  export default ConfirmationModal;
2
2
  type ConfirmationModal = SvelteComponent<{
3
3
  title?: string | undefined;
4
+ size?: string | undefined;
5
+ variant?: string | undefined;
4
6
  actions?: any[] | undefined;
5
7
  show?: boolean | undefined;
8
+ disabled?: boolean | undefined;
9
+ loading?: boolean | undefined;
6
10
  icon?: null | undefined;
7
11
  description?: string | undefined;
8
12
  warningText?: string | undefined;
13
+ customIcon?: null | undefined;
9
14
  closeBtn?: boolean | undefined;
15
+ primaryButtonText?: string | undefined;
16
+ secondaryButtonText?: string | undefined;
10
17
  }, {
18
+ cancel: CustomEvent<any>;
19
+ confirm: CustomEvent<any>;
20
+ close: CustomEvent<any>;
21
+ } & {
11
22
  [evt: string]: CustomEvent<any>;
12
23
  }, {}> & {
13
24
  $$bindings?: string | undefined;
14
25
  };
15
26
  declare const ConfirmationModal: $$__sveltets_2_IsomorphicComponent<{
16
27
  title?: string | undefined;
28
+ size?: string | undefined;
29
+ variant?: string | undefined;
17
30
  actions?: any[] | undefined;
18
31
  show?: boolean | undefined;
32
+ disabled?: boolean | undefined;
33
+ loading?: boolean | undefined;
19
34
  icon?: null | undefined;
20
35
  description?: string | undefined;
21
36
  warningText?: string | undefined;
37
+ customIcon?: null | undefined;
22
38
  closeBtn?: boolean | undefined;
39
+ primaryButtonText?: string | undefined;
40
+ secondaryButtonText?: string | undefined;
23
41
  }, {
42
+ cancel: CustomEvent<any>;
43
+ confirm: CustomEvent<any>;
44
+ close: CustomEvent<any>;
45
+ } & {
24
46
  [evt: string]: CustomEvent<any>;
25
47
  }, {}, {}, string>;
26
48
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmationModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Modal/ConfirmationModal.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;AAoHA;;;;;;;;;;mBAAuM;6CAT1J,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"ConfirmationModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Modal/ConfirmationModal.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAoKA;;;;;;;;;;;;;;;;;;;;;mBAAoS;6CATvP,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,180 @@
1
+ <script>
2
+ import { createEventDispatcher } from "svelte";
3
+ import Button from "../Button/Button.svelte";
4
+ import Cancel from "../../assets/svg/cancel.svg";
5
+ import Modal from "./Modal.svelte";
6
+
7
+ export let show = false;
8
+ export let size = "default"; // "small" | "default" | "large"
9
+ export let title = "";
10
+ export let description = "";
11
+ export let closeBtn = false; // To show close button
12
+ export let persistent = false; // When true, prevents closing by clicking backdrop or pressing Escape
13
+
14
+ // Input configuration
15
+ export let inputLabel = "";
16
+ export let inputPlaceholder = "";
17
+ export let inputType = "text"; // text | email | password | textarea
18
+ export let inputValue = "";
19
+ export let inputRequired = false;
20
+ export let inputRows = 4; // For textarea
21
+ export let inputIcon = null; // SVG component for input prefix icon
22
+ export let helpText = ""; // Helper text below input
23
+
24
+ // Validation
25
+ export let errorMessage = "";
26
+ export let showError = false;
27
+ export let validateEmail = false; // Auto-validate email format
28
+
29
+ // Buttons
30
+ export let primaryButtonText = "Confirm";
31
+ export let secondaryButtonText = "Cancel";
32
+ export let primaryButtonVariant = "blue-solid"; // blue-solid | red-solid
33
+
34
+ // State
35
+ export let disabled = false;
36
+ export let loading = false;
37
+
38
+ const dispatch = createEventDispatcher();
39
+
40
+ // Email validation
41
+ const isValidEmail = (email) => {
42
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
43
+ return emailRegex.test(email);
44
+ };
45
+
46
+ $: emailError = validateEmail && inputValue && !isValidEmail(inputValue);
47
+ $: isEmpty = inputRequired && (!inputValue || inputValue.trim() === "");
48
+ $: hasError = showError || emailError;
49
+ $: isDisabled = disabled || loading || isEmpty || emailError;
50
+
51
+ const handlePrimaryAction = () => {
52
+ if (!isDisabled) {
53
+ dispatch("confirm", { value: inputValue });
54
+ }
55
+ };
56
+
57
+ const handleSecondaryAction = () => {
58
+ if (!disabled && !loading) {
59
+ dispatch("cancel");
60
+ closeModal();
61
+ }
62
+ };
63
+
64
+ const closeModal = () => {
65
+ show = false;
66
+ dispatch("close");
67
+ };
68
+
69
+ const handleClose = () => {
70
+ if (disabled || loading) return;
71
+ closeModal();
72
+ };
73
+
74
+ // Reset input when modal closes
75
+ $: if (!show) {
76
+ // Optionally reset - controlled externally via inputValue prop
77
+ }
78
+ </script>
79
+
80
+ <Modal bind:show {size} {persistent}>
81
+ <div slot="header" class="text-left">
82
+ {#if closeBtn}
83
+ <div class="flex justify-end -mt-2 -mr-2 mb-2">
84
+ <button
85
+ class="p-1 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none transition-colors"
86
+ on:click={handleClose}
87
+ {disabled}
88
+ >
89
+ <img src={Cancel} alt="Close" class="w-5 h-5" />
90
+ </button>
91
+ </div>
92
+ {/if}
93
+ {#if title}
94
+ <h3 class="text-xl font-medium text-gray-900 dark:text-white">{title}</h3>
95
+ {/if}
96
+ </div>
97
+
98
+ <div slot="body" class="text-left mt-4">
99
+ {#if description}
100
+ <p class="text-sm text-gray-500 dark:text-gray-400 leading-relaxed mb-4">
101
+ {description}
102
+ </p>
103
+ {/if}
104
+
105
+ <div>
106
+ {#if inputLabel}
107
+ <label
108
+ for="modal-input"
109
+ class="block text-sm font-medium text-gray-900 dark:text-white mb-2"
110
+ >
111
+ {inputLabel}
112
+ </label>
113
+ {/if}
114
+
115
+ {#if inputType === "textarea"}
116
+ <textarea
117
+ id="modal-input"
118
+ bind:value={inputValue}
119
+ placeholder={inputPlaceholder}
120
+ rows={inputRows}
121
+ class="w-full px-3 py-2 border {hasError ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'} bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none"
122
+ disabled={disabled || loading}
123
+ ></textarea>
124
+ {:else}
125
+ <div class="relative">
126
+ {#if inputIcon}
127
+ <div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
128
+ <svelte:component this={inputIcon} class="w-5 h-5 text-gray-500 dark:text-gray-400" />
129
+ </div>
130
+ {/if}
131
+ <input
132
+ id="modal-input"
133
+ type={inputType}
134
+ bind:value={inputValue}
135
+ placeholder={inputPlaceholder}
136
+ required={inputRequired}
137
+ disabled={disabled || loading}
138
+ class="w-full {inputIcon ? 'pl-10' : 'px-3'} py-2 border {hasError ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'} rounded-lg text-gray-900 dark:text-white bg-white dark:bg-gray-700 focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:opacity-50 disabled:cursor-not-allowed"
139
+ />
140
+ </div>
141
+ {/if}
142
+
143
+ {#if hasError && (errorMessage || emailError)}
144
+ <p class="mt-2 text-sm text-red-600 dark:text-red-400 font-medium flex items-center gap-1">
145
+ <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
146
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
147
+ </svg>
148
+ {emailError ? "Please enter a valid email address" : errorMessage}
149
+ </p>
150
+ {:else if helpText && !hasError}
151
+ <p class="text-xs font-normal text-gray-500 dark:text-gray-400 pt-2">
152
+ {helpText}
153
+ </p>
154
+ {/if}
155
+ </div>
156
+ </div>
157
+
158
+ <div slot="footer" class="flex gap-3">
159
+ {#if secondaryButtonText}
160
+ <Button
161
+ size="full"
162
+ variant="gray-outline"
163
+ on:click={handleSecondaryAction}
164
+ disabled={disabled || loading}
165
+ >
166
+ {secondaryButtonText}
167
+ </Button>
168
+ {/if}
169
+
170
+ <Button
171
+ size="full"
172
+ variant={primaryButtonVariant}
173
+ on:click={handlePrimaryAction}
174
+ disabled={isDisabled}
175
+ {loading}
176
+ >
177
+ {primaryButtonText}
178
+ </Button>
179
+ </div>
180
+ </Modal>
@@ -0,0 +1,77 @@
1
+ export default InputModal;
2
+ type InputModal = SvelteComponent<{
3
+ title?: string | undefined;
4
+ size?: string | undefined;
5
+ show?: boolean | undefined;
6
+ disabled?: boolean | undefined;
7
+ loading?: boolean | undefined;
8
+ persistent?: boolean | undefined;
9
+ description?: string | undefined;
10
+ closeBtn?: boolean | undefined;
11
+ primaryButtonText?: string | undefined;
12
+ secondaryButtonText?: string | undefined;
13
+ inputLabel?: string | undefined;
14
+ inputPlaceholder?: string | undefined;
15
+ inputType?: string | undefined;
16
+ inputValue?: string | undefined;
17
+ inputRequired?: boolean | undefined;
18
+ inputRows?: number | undefined;
19
+ inputIcon?: null | undefined;
20
+ helpText?: string | undefined;
21
+ errorMessage?: string | undefined;
22
+ showError?: boolean | undefined;
23
+ validateEmail?: boolean | undefined;
24
+ primaryButtonVariant?: string | undefined;
25
+ }, {
26
+ confirm: CustomEvent<any>;
27
+ cancel: CustomEvent<any>;
28
+ close: CustomEvent<any>;
29
+ } & {
30
+ [evt: string]: CustomEvent<any>;
31
+ }, {}> & {
32
+ $$bindings?: string | undefined;
33
+ };
34
+ declare const InputModal: $$__sveltets_2_IsomorphicComponent<{
35
+ title?: string | undefined;
36
+ size?: string | undefined;
37
+ show?: boolean | undefined;
38
+ disabled?: boolean | undefined;
39
+ loading?: boolean | undefined;
40
+ persistent?: boolean | undefined;
41
+ description?: string | undefined;
42
+ closeBtn?: boolean | undefined;
43
+ primaryButtonText?: string | undefined;
44
+ secondaryButtonText?: string | undefined;
45
+ inputLabel?: string | undefined;
46
+ inputPlaceholder?: string | undefined;
47
+ inputType?: string | undefined;
48
+ inputValue?: string | undefined;
49
+ inputRequired?: boolean | undefined;
50
+ inputRows?: number | undefined;
51
+ inputIcon?: null | undefined;
52
+ helpText?: string | undefined;
53
+ errorMessage?: string | undefined;
54
+ showError?: boolean | undefined;
55
+ validateEmail?: boolean | undefined;
56
+ primaryButtonVariant?: string | undefined;
57
+ }, {
58
+ confirm: CustomEvent<any>;
59
+ cancel: CustomEvent<any>;
60
+ close: CustomEvent<any>;
61
+ } & {
62
+ [evt: string]: CustomEvent<any>;
63
+ }, {}, {}, string>;
64
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
65
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
66
+ $$bindings?: Bindings;
67
+ } & Exports;
68
+ (internal: unknown, props: Props & {
69
+ $$events?: Events;
70
+ $$slots?: Slots;
71
+ }): Exports & {
72
+ $set?: any;
73
+ $on?: any;
74
+ };
75
+ z_$$bindings?: Bindings;
76
+ }
77
+ //# sourceMappingURL=InputModal.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Modal/InputModal.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAAka;6CATrX,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,eAAe,QAAQ,CAAC"}
@@ -7,7 +7,8 @@
7
7
  export let show = false;
8
8
  export let isProcessing = false;
9
9
  export let isSuccess = false;
10
- export let size = "default"; // "default" | "small" | "large"
10
+ export let size = "default"; // "default" | "small" | "large" | "xlarge"
11
+ export let persistent = false; // When true, prevents closing by clicking backdrop or pressing Escape
11
12
 
12
13
  const dispatch = createEventDispatcher();
13
14
 
@@ -16,7 +17,7 @@
16
17
 
17
18
  // Handle escape key
18
19
  function handleKeydown(event) {
19
- if (event.key === "Escape" && show) {
20
+ if (event.key === "Escape" && show && !persistent) {
20
21
  resetModal();
21
22
  }
22
23
  }
@@ -72,7 +73,7 @@
72
73
  <!-- svelte-ignore a11y-no-static-element-interactions -->
73
74
  <div
74
75
  class="modal-backdrop"
75
- on:click={resetModal}
76
+ on:click={persistent ? null : resetModal}
76
77
  transition:fade={{ duration: 300 }}
77
78
  role="dialog"
78
79
  aria-modal="true"
@@ -85,6 +86,7 @@
85
86
  class="modal-sheet"
86
87
  class:small={sizeClass === "small"}
87
88
  class:large={sizeClass === "large"}
89
+ class:xlarge={sizeClass === "xlarge"}
88
90
  on:click|stopPropagation
89
91
  transition:fly={{ y: 300, duration: 300, easing: cubicOut }}
90
92
  >
@@ -109,6 +111,7 @@
109
111
  class="modal-centered"
110
112
  class:small={sizeClass === "small"}
111
113
  class:large={sizeClass === "large"}
114
+ class:xlarge={sizeClass === "xlarge"}
112
115
  on:click|stopPropagation
113
116
  transition:fly={{ y: 20, duration: 200 }}
114
117
  >
@@ -122,12 +125,17 @@
122
125
  {/if}
123
126
 
124
127
  <style>
128
+ /*
129
+ * Modal uses Tailwind-compatible colors with dark mode support.
130
+ * Works across projects without requiring CSS variable synchronization.
131
+ */
132
+
125
133
  .modal-backdrop {
126
134
  position: fixed;
127
135
  inset: 0;
128
136
  display: flex;
129
137
  background-color: rgba(0, 0, 0, 0.5);
130
- z-index: var(--z-modal, 50);
138
+ z-index: 50;
131
139
 
132
140
  /* iOS scroll lock - prevent scroll bleed-through */
133
141
  touch-action: none;
@@ -149,7 +157,7 @@
149
157
 
150
158
  /* Mobile: Bottom sheet style */
151
159
  .modal-sheet {
152
- background-color: hsl(var(--BG-Primary));
160
+ background-color: #ffffff;
153
161
  border-radius: 1.5rem 1.5rem 0 0;
154
162
  width: 100%;
155
163
  max-height: 90vh;
@@ -164,6 +172,10 @@
164
172
  overscroll-behavior: contain;
165
173
  }
166
174
 
175
+ :global(.dark) .modal-sheet {
176
+ background-color: #1f2937; /* gray-800 */
177
+ }
178
+
167
179
  /* Hide sheet on desktop */
168
180
  @media (min-width: 768px) {
169
181
  .modal-sheet {
@@ -181,13 +193,18 @@
181
193
  .sheet-handle {
182
194
  width: 2.5rem;
183
195
  height: 0.25rem;
184
- background-color: hsl(var(--Stroke-Primary));
196
+ background-color: #d1d5db; /* gray-300 */
185
197
  border-radius: 0.125rem;
186
198
  }
187
199
 
200
+ :global(.dark) .sheet-handle {
201
+ background-color: #4b5563; /* gray-600 */
202
+ }
203
+
188
204
  .modal-inner {
189
- padding: 0.5rem 1.5rem 1.5rem;
190
- padding-bottom: calc(1.5rem + var(--safe-bottom, 0px));
205
+ padding: 1.5rem;
206
+ /* Account for bottom nav bars (~70px) plus safe area */
207
+ padding-bottom: calc(5rem + env(safe-area-inset-bottom, 0px));
191
208
  overflow-y: auto;
192
209
  flex: 1;
193
210
  }
@@ -195,13 +212,18 @@
195
212
  /* Desktop: Centered modal style */
196
213
  .modal-centered {
197
214
  display: none;
198
- background-color: hsl(var(--BG-Primary));
215
+ background-color: #ffffff;
199
216
  padding: 1.5rem;
200
217
  border-radius: 1rem;
201
218
  max-width: 420px;
202
219
  width: 100%;
203
220
  max-height: calc(100vh - 4rem);
204
221
  overflow-y: auto;
222
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
223
+ }
224
+
225
+ :global(.dark) .modal-centered {
226
+ background-color: #1f2937; /* gray-800 */
205
227
  }
206
228
 
207
229
  @media (min-width: 768px) {
@@ -218,11 +240,21 @@
218
240
  max-width: 560px;
219
241
  }
220
242
 
243
+ .modal-centered.xlarge {
244
+ max-width: 700px;
245
+ }
246
+
221
247
  .modal-footer {
222
248
  width: 100%;
223
249
  display: flex;
224
250
  flex-direction: column;
225
251
  gap: 0.75rem;
252
+ margin-top: 1.5rem; /* 24px - consistent gap before buttons */
253
+ }
254
+
255
+ .modal-footer:empty {
256
+ display: none;
257
+ margin-top: 0;
226
258
  }
227
259
 
228
260
  @media (min-width: 768px) {
@@ -4,6 +4,7 @@ type Modal = SvelteComponent<{
4
4
  show?: boolean | undefined;
5
5
  isSuccess?: boolean | undefined;
6
6
  isProcessing?: boolean | undefined;
7
+ persistent?: boolean | undefined;
7
8
  }, {
8
9
  click: PointerEvent;
9
10
  cancel: CustomEvent<any>;
@@ -21,6 +22,7 @@ declare const Modal: $$__sveltets_2_IsomorphicComponent<{
21
22
  show?: boolean | undefined;
22
23
  isSuccess?: boolean | undefined;
23
24
  isProcessing?: boolean | undefined;
25
+ persistent?: boolean | undefined;
24
26
  }, {
25
27
  click: PointerEvent;
26
28
  cancel: CustomEvent<any>;
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Modal/Modal.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAkIA;;;;;;;;;;;;;;eAAmK;6CAdtH,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"Modal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Modal/Modal.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAmIA;;;;;;;;;;;;;;;eAAgL;6CAdnI,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,eAAe,QAAQ,CAAC"}