@getmicdrop/svelte-components 2.2.0 → 2.4.0

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 (84) hide show
  1. package/dist/components/Accordion/Accordion.svelte +44 -0
  2. package/dist/components/Accordion/Accordion.svelte.d.ts +42 -0
  3. package/dist/components/Accordion/Accordion.svelte.d.ts.map +1 -0
  4. package/dist/components/Accordion/AccordionItem.svelte +141 -0
  5. package/dist/components/Accordion/AccordionItem.svelte.d.ts +50 -0
  6. package/dist/components/Accordion/AccordionItem.svelte.d.ts.map +1 -0
  7. package/dist/components/Badges/Badge.svelte +129 -3
  8. package/dist/components/Badges/Badge.svelte.d.ts +8 -2
  9. package/dist/components/Badges/Badge.svelte.d.ts.map +1 -1
  10. package/dist/components/Breadcrumb/Breadcrumb.svelte +65 -36
  11. package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts +16 -2
  12. package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts.map +1 -1
  13. package/dist/components/Button/Button.svelte +1 -0
  14. package/dist/components/Checkbox/Checkbox.svelte +116 -0
  15. package/dist/components/Checkbox/Checkbox.svelte.d.ts +52 -0
  16. package/dist/components/Checkbox/Checkbox.svelte.d.ts.map +1 -0
  17. package/dist/components/Drawer/Drawer.svelte +207 -0
  18. package/dist/components/Drawer/Drawer.svelte.d.ts +74 -0
  19. package/dist/components/Drawer/Drawer.svelte.d.ts.map +1 -0
  20. package/dist/components/Dropdown/Dropdown.svelte +129 -0
  21. package/dist/components/Dropdown/Dropdown.svelte.d.ts +48 -0
  22. package/dist/components/Dropdown/Dropdown.svelte.d.ts.map +1 -0
  23. package/dist/components/Dropdown/DropdownItem.svelte +111 -0
  24. package/dist/components/Dropdown/DropdownItem.svelte.d.ts +48 -0
  25. package/dist/components/Dropdown/DropdownItem.svelte.d.ts.map +1 -0
  26. package/dist/components/Input/Input.svelte.d.ts +6 -6
  27. package/dist/components/Input/MultiSelect.svelte +4 -5
  28. package/dist/components/Input/MultiSelect.svelte.d.ts +6 -6
  29. package/dist/components/Input/MultiSelect.svelte.d.ts.map +1 -1
  30. package/dist/components/Input/Search.svelte +173 -0
  31. package/dist/components/Input/Search.svelte.d.ts +68 -0
  32. package/dist/components/Input/Search.svelte.d.ts.map +1 -0
  33. package/dist/components/Input/Select.svelte +4 -5
  34. package/dist/components/Input/Select.svelte.d.ts +6 -6
  35. package/dist/components/Input/Select.svelte.d.ts.map +1 -1
  36. package/dist/components/Input/Textarea.svelte +160 -0
  37. package/dist/components/Input/Textarea.svelte.d.ts +69 -0
  38. package/dist/components/Input/Textarea.svelte.d.ts.map +1 -0
  39. package/dist/components/Label/Label.svelte +60 -0
  40. package/dist/components/Label/Label.svelte.d.ts +48 -0
  41. package/dist/components/Label/Label.svelte.d.ts.map +1 -0
  42. package/dist/components/Layout/Header.svelte +14 -4
  43. package/dist/components/Modal/ConfirmationModal.svelte +69 -17
  44. package/dist/components/Modal/ConfirmationModal.svelte.d.ts +22 -0
  45. package/dist/components/Modal/ConfirmationModal.svelte.d.ts.map +1 -1
  46. package/dist/components/Modal/InputModal.svelte +180 -0
  47. package/dist/components/Modal/InputModal.svelte.d.ts +77 -0
  48. package/dist/components/Modal/InputModal.svelte.d.ts.map +1 -0
  49. package/dist/components/Modal/Modal.svelte +34 -8
  50. package/dist/components/Modal/Modal.svelte.d.ts +2 -0
  51. package/dist/components/Modal/Modal.svelte.d.ts.map +1 -1
  52. package/dist/components/Modal/StatusModal.svelte +221 -0
  53. package/dist/components/Modal/StatusModal.svelte.d.ts +59 -0
  54. package/dist/components/Modal/StatusModal.svelte.d.ts.map +1 -0
  55. package/dist/components/OrderSummary/OrderSummary.svelte +2 -2
  56. package/dist/components/OrderSummary/OrderSummary.svelte.d.ts.map +1 -1
  57. package/dist/components/Pagination/Pagination.svelte +197 -0
  58. package/dist/components/Pagination/Pagination.svelte.d.ts +53 -0
  59. package/dist/components/Pagination/Pagination.svelte.d.ts.map +1 -0
  60. package/dist/components/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte.d.ts +2 -2
  61. package/dist/components/Radio/Radio.svelte +119 -0
  62. package/dist/components/Radio/Radio.svelte.d.ts +54 -0
  63. package/dist/components/Radio/Radio.svelte.d.ts.map +1 -0
  64. package/dist/components/Skeleton/Skeleton.svelte +68 -0
  65. package/dist/components/Skeleton/Skeleton.svelte.d.ts +37 -0
  66. package/dist/components/Skeleton/Skeleton.svelte.d.ts.map +1 -0
  67. package/dist/components/Tabs/TabItem.svelte +39 -0
  68. package/dist/components/Tabs/TabItem.svelte.d.ts +52 -0
  69. package/dist/components/Tabs/TabItem.svelte.d.ts.map +1 -0
  70. package/dist/components/Tabs/Tabs.svelte +181 -0
  71. package/dist/components/Tabs/Tabs.svelte.d.ts +46 -0
  72. package/dist/components/Tabs/Tabs.svelte.d.ts.map +1 -0
  73. package/dist/components/pages/performers/ShowItemCard.svelte.d.ts +2 -2
  74. package/dist/components/pages/performers/SwitchOption.svelte.d.ts +2 -2
  75. package/dist/components/pages/performers/VenueInfo.svelte.d.ts +2 -2
  76. package/dist/components/pages/performers/VenueItemCard.svelte +2 -2
  77. package/dist/components/pages/performers/VenueItemCard.svelte.d.ts +2 -2
  78. package/dist/components/pages/profile/profile-form.svelte +1 -1
  79. package/dist/constants/formOptions.d.ts +5 -2
  80. package/dist/constants/formOptions.d.ts.map +1 -1
  81. package/dist/constants/formOptions.js +2 -1
  82. package/dist/index.d.ts +16 -0
  83. package/dist/index.js +18 -0
  84. package/package.json +1 -1
@@ -0,0 +1,160 @@
1
+ <script>
2
+ import { createEventDispatcher } from "svelte";
3
+
4
+ const dispatch = createEventDispatcher();
5
+
6
+ // API compatible with flowbite-svelte Textarea
7
+ export let value = "";
8
+ export let placeholder = "";
9
+ export let rows = 4;
10
+ export let disabled = false;
11
+ export let required = false;
12
+ export let readonly = false;
13
+ export let id = "";
14
+ export let name = "";
15
+ export let label = "";
16
+ export let error = "";
17
+ export let maxlength = null;
18
+ export let minlength = null;
19
+
20
+ // Additional props
21
+ let className = "";
22
+ export { className as class };
23
+
24
+ function handleInput(event) {
25
+ value = event.target.value;
26
+ dispatch("input", { value });
27
+ }
28
+
29
+ function handleChange(event) {
30
+ dispatch("change", { value: event.target.value });
31
+ }
32
+
33
+ function handleBlur(event) {
34
+ dispatch("blur", event);
35
+ }
36
+
37
+ function handleFocus(event) {
38
+ dispatch("focus", event);
39
+ }
40
+ </script>
41
+
42
+ <div class="textarea-wrapper">
43
+ {#if label}
44
+ <label for={id || name} class="textarea-label">
45
+ {label}{#if required}<span class="textarea-required">*</span>{/if}
46
+ </label>
47
+ {/if}
48
+
49
+ <textarea
50
+ {id}
51
+ {name}
52
+ {placeholder}
53
+ {rows}
54
+ {disabled}
55
+ {readonly}
56
+ {maxlength}
57
+ {minlength}
58
+ class="textarea-field {error ? 'textarea-error' : ''} {className}"
59
+ bind:value
60
+ on:input={handleInput}
61
+ on:change={handleChange}
62
+ on:blur={handleBlur}
63
+ on:focus={handleFocus}
64
+ on:keydown
65
+ on:keyup
66
+ on:keypress
67
+ aria-required={required}
68
+ aria-invalid={!!error}
69
+ {...$$restProps}
70
+ ></textarea>
71
+
72
+ {#if error}
73
+ <p class="textarea-error-text">{error}</p>
74
+ {/if}
75
+ </div>
76
+
77
+ <style>
78
+ .textarea-wrapper {
79
+ --textarea-bg: #f9fafb;
80
+ --textarea-text: #0d1526;
81
+ --textarea-text-placeholder: #6b7280;
82
+ --textarea-border: #e5e7eb;
83
+ --textarea-border-error: #ff6666;
84
+ --textarea-focus-ring: #3b82f6;
85
+ --textarea-label-text: #0d1526;
86
+ width: 100%;
87
+ display: flex;
88
+ flex-direction: column;
89
+ gap: 0.5rem;
90
+ }
91
+
92
+ .textarea-label {
93
+ color: var(--textarea-label-text);
94
+ font-size: 0.875rem;
95
+ font-weight: 500;
96
+ line-height: 1.25;
97
+ }
98
+
99
+ .textarea-required {
100
+ color: var(--textarea-border-error);
101
+ font-weight: 500;
102
+ font-size: 0.875rem;
103
+ margin-left: 0.125rem;
104
+ }
105
+
106
+ .textarea-field {
107
+ width: 100%;
108
+ padding: 0.625rem 0.75rem;
109
+ background-color: var(--textarea-bg);
110
+ color: var(--textarea-text);
111
+ font-size: 0.875rem;
112
+ line-height: 1.5;
113
+ border: 1px solid var(--textarea-border);
114
+ border-radius: 0.5rem;
115
+ resize: vertical;
116
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
117
+ }
118
+
119
+ .textarea-field:focus {
120
+ outline: none;
121
+ box-shadow: 0 0 0 2px var(--textarea-focus-ring);
122
+ border-color: var(--textarea-focus-ring);
123
+ }
124
+
125
+ .textarea-field:hover:not(:focus):not(:disabled) {
126
+ border-color: var(--textarea-focus-ring);
127
+ }
128
+
129
+ .textarea-field:disabled {
130
+ opacity: 0.5;
131
+ cursor: not-allowed;
132
+ }
133
+
134
+ .textarea-field::-moz-placeholder {
135
+ color: var(--textarea-text-placeholder);
136
+ }
137
+
138
+ .textarea-field::placeholder {
139
+ color: var(--textarea-text-placeholder);
140
+ }
141
+
142
+ .textarea-field.textarea-error {
143
+ border-color: var(--textarea-border-error);
144
+ }
145
+
146
+ .textarea-error-text {
147
+ margin: 0;
148
+ color: var(--textarea-border-error);
149
+ font-size: 0.875rem;
150
+ }
151
+
152
+ /* Dark mode overrides */
153
+ :global(.dark) .textarea-wrapper {
154
+ --textarea-bg: #111827;
155
+ --textarea-text: #f7f7f8;
156
+ --textarea-text-placeholder: #9ca3af;
157
+ --textarea-border: #374151;
158
+ --textarea-label-text: #f7f7f8;
159
+ }
160
+ </style>
@@ -0,0 +1,69 @@
1
+ export default Textarea;
2
+ type Textarea = SvelteComponent<{
3
+ [x: string]: any;
4
+ class?: string | undefined;
5
+ error?: string | undefined;
6
+ disabled?: boolean | undefined;
7
+ value?: string | undefined;
8
+ name?: string | undefined;
9
+ label?: string | undefined;
10
+ id?: string | undefined;
11
+ required?: boolean | undefined;
12
+ maxlength?: null | undefined;
13
+ minlength?: null | undefined;
14
+ placeholder?: string | undefined;
15
+ readonly?: boolean | undefined;
16
+ rows?: number | undefined;
17
+ }, {
18
+ keydown: KeyboardEvent;
19
+ keyup: KeyboardEvent;
20
+ keypress: KeyboardEvent;
21
+ input: CustomEvent<any>;
22
+ change: CustomEvent<any>;
23
+ blur: CustomEvent<any>;
24
+ focus: CustomEvent<any>;
25
+ } & {
26
+ [evt: string]: CustomEvent<any>;
27
+ }, {}> & {
28
+ $$bindings?: string | undefined;
29
+ };
30
+ declare const Textarea: $$__sveltets_2_IsomorphicComponent<{
31
+ [x: string]: any;
32
+ class?: string | undefined;
33
+ error?: string | undefined;
34
+ disabled?: boolean | undefined;
35
+ value?: string | undefined;
36
+ name?: string | undefined;
37
+ label?: string | undefined;
38
+ id?: string | undefined;
39
+ required?: boolean | undefined;
40
+ maxlength?: null | undefined;
41
+ minlength?: null | undefined;
42
+ placeholder?: string | undefined;
43
+ readonly?: boolean | undefined;
44
+ rows?: number | undefined;
45
+ }, {
46
+ keydown: KeyboardEvent;
47
+ keyup: KeyboardEvent;
48
+ keypress: KeyboardEvent;
49
+ input: CustomEvent<any>;
50
+ change: CustomEvent<any>;
51
+ blur: CustomEvent<any>;
52
+ focus: CustomEvent<any>;
53
+ } & {
54
+ [evt: string]: CustomEvent<any>;
55
+ }, {}, {}, string>;
56
+ 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> {
57
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
58
+ $$bindings?: Bindings;
59
+ } & Exports;
60
+ (internal: unknown, props: Props & {
61
+ $$events?: Events;
62
+ $$slots?: Slots;
63
+ }): Exports & {
64
+ $set?: any;
65
+ $on?: any;
66
+ };
67
+ z_$$bindings?: Bindings;
68
+ }
69
+ //# sourceMappingURL=Textarea.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Textarea.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Input/Textarea.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyEA;;;;;;;;;;;;;;;;;;;;;;;;;mBAA0P;6CAT7M,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,60 @@
1
+ <script>
2
+ // API compatible with flowbite-svelte Label
3
+ export let color = "gray";
4
+ export let defaultClass = "text-sm rtl:text-right font-medium block";
5
+ export let show = true;
6
+
7
+ // Additional props for convenience
8
+ let className = "";
9
+ export { className as class };
10
+
11
+ const colorClasses = {
12
+ gray: "label-gray",
13
+ green: "label-green",
14
+ red: "label-red",
15
+ disabled: "label-disabled"
16
+ };
17
+
18
+ $: labelClass = `label-wrapper ${defaultClass} ${colorClasses[color] || colorClasses.gray} ${className}`;
19
+ </script>
20
+
21
+ {#if show}
22
+ <!-- svelte-ignore a11y-label-has-associated-control -->
23
+ <label {...$$restProps} class={labelClass}><slot /></label>
24
+ {:else}
25
+ <slot />
26
+ {/if}
27
+
28
+ <style>
29
+ .label-wrapper {
30
+ --label-text-gray: #111827;
31
+ --label-text-green: #047857;
32
+ --label-text-red: #dc2626;
33
+ --label-text-disabled: #9ca3af;
34
+ }
35
+
36
+ .label-gray {
37
+ color: var(--label-text-gray);
38
+ }
39
+
40
+ .label-green {
41
+ color: var(--label-text-green);
42
+ }
43
+
44
+ .label-red {
45
+ color: var(--label-text-red);
46
+ }
47
+
48
+ .label-disabled {
49
+ color: var(--label-text-disabled);
50
+ filter: grayscale(1) contrast(0.5);
51
+ }
52
+
53
+ /* Dark mode overrides */
54
+ :global(.dark) .label-wrapper {
55
+ --label-text-gray: #d1d5db;
56
+ --label-text-green: #34d399;
57
+ --label-text-red: #f87171;
58
+ --label-text-disabled: #6b7280;
59
+ }
60
+ </style>
@@ -0,0 +1,48 @@
1
+ export default Label;
2
+ type Label = SvelteComponent<$$__sveltets_2_PropsWithChildren<{
3
+ [x: string]: any;
4
+ class?: string | undefined;
5
+ color?: string | undefined;
6
+ show?: boolean | undefined;
7
+ defaultClass?: string | undefined;
8
+ }, {
9
+ default: {};
10
+ }>, {
11
+ [evt: string]: CustomEvent<any>;
12
+ }, {
13
+ default: {};
14
+ }> & {
15
+ $$bindings?: string | undefined;
16
+ };
17
+ declare const Label: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
18
+ [x: string]: any;
19
+ class?: string | undefined;
20
+ color?: string | undefined;
21
+ show?: boolean | undefined;
22
+ defaultClass?: string | undefined;
23
+ }, {
24
+ default: {};
25
+ }>, {
26
+ [evt: string]: CustomEvent<any>;
27
+ }, {
28
+ default: {};
29
+ }, {}, string>;
30
+ type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
31
+ default: any;
32
+ } ? Props extends Record<string, never> ? any : {
33
+ children?: any;
34
+ } : {});
35
+ 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> {
36
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
37
+ $$bindings?: Bindings;
38
+ } & Exports;
39
+ (internal: unknown, props: Props & {
40
+ $$events?: Events;
41
+ $$slots?: Slots;
42
+ }): Exports & {
43
+ $set?: any;
44
+ $on?: any;
45
+ };
46
+ z_$$bindings?: Bindings;
47
+ }
48
+ //# sourceMappingURL=Label.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Label.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Label/Label.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAgDA;;;;;;;;;;;;eAAyK;sCATnI,KAAK,EAAE,KAAK;;;;;6CALL,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"}
@@ -79,7 +79,7 @@
79
79
  class="avatar-button"
80
80
  on:click={() => showDesktopDropdown = !showDesktopDropdown}
81
81
  >
82
- <Avatar src={avatar} dot={{ color: "green" }} rounded size="sm" />
82
+ <Avatar src={avatar} rounded size="md" />
83
83
  </button>
84
84
 
85
85
  {#if showDesktopDropdown}
@@ -137,7 +137,7 @@
137
137
  <div class="header-avatar-wrapper">
138
138
  <!-- Mobile: triggers bottom sheet -->
139
139
  <button class="avatar-button avatar-button--mobile" on:click={() => showMobileSheet = true}>
140
- <Avatar src={avatar} dot={{ color: "green" }} rounded size="sm" />
140
+ <Avatar src={avatar} rounded size="md" />
141
141
  </button>
142
142
 
143
143
  <!-- Desktop: triggers dropdown -->
@@ -145,7 +145,7 @@
145
145
  class="avatar-button avatar-button--desktop"
146
146
  on:click={() => showDesktopDropdown = !showDesktopDropdown}
147
147
  >
148
- <Avatar src={avatar} dot={{ color: "green" }} rounded size="sm" />
148
+ <Avatar src={avatar} rounded size="md" />
149
149
  </button>
150
150
 
151
151
  <!-- Desktop dropdown -->
@@ -294,13 +294,23 @@
294
294
  margin-left: 0.25rem;
295
295
  }
296
296
 
297
+ /* Fix avatar image aspect ratio and border radius */
298
+ :global(.avatar-button img) {
299
+ -o-object-fit: cover !important;
300
+ object-fit: cover !important;
301
+ aspect-ratio: 1 / 1 !important;
302
+ border-radius: 0.5rem !important;
303
+ }
304
+
297
305
  .avatar-button {
298
306
  background: none;
299
307
  border: none;
300
308
  padding: 0;
301
309
  cursor: pointer;
302
- border-radius: 9999px;
310
+ border-radius: 0.5rem;
303
311
  transition: opacity 0.15s;
312
+ min-width: 40px;
313
+ min-height: 40px;
304
314
  }
305
315
 
306
316
  .avatar-button:hover {
@@ -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"}