@widgetic/design-system 0.5.22 → 0.5.24
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/README.md +2 -0
- package/dist/components/CopyableHeader.svelte +260 -448
- package/dist/components/CopyableHeader.svelte.d.ts +8 -5
- package/dist/components/EmptyState.svelte +100 -128
- package/dist/components/EmptyState.svelte.d.ts +16 -19
- package/dist/components/GenerateLoader.svelte +17 -10
- package/dist/components/PasswordInput.svelte +41 -44
- package/dist/components/PasswordInput.svelte.d.ts +2 -0
- package/dist/components/ThumbHashImage.svelte +117 -119
- package/dist/components/WScrollArea.svelte +47 -41
- package/dist/components/chat/ActivityRow.svelte +115 -0
- package/dist/components/chat/ActivityRow.svelte.d.ts +18 -0
- package/dist/components/chat/ChatHeader.svelte +114 -0
- package/dist/components/chat/ChatHeader.svelte.d.ts +26 -0
- package/dist/components/chat/Composer.svelte +172 -0
- package/dist/components/chat/Composer.svelte.d.ts +27 -0
- package/dist/components/chat/Message.svelte +158 -0
- package/dist/components/chat/Message.svelte.d.ts +28 -0
- package/dist/components/chat/OptionRow.svelte +59 -0
- package/dist/components/chat/OptionRow.svelte.d.ts +14 -0
- package/dist/components/chat/PlanCard.svelte +220 -0
- package/dist/components/chat/PlanCard.svelte.d.ts +34 -0
- package/dist/components/chat/QuestionCard.svelte +265 -0
- package/dist/components/chat/QuestionCard.svelte.d.ts +38 -0
- package/dist/components/chat/ScrollToBottom.svelte +51 -0
- package/dist/components/chat/ScrollToBottom.svelte.d.ts +11 -0
- package/dist/components/chat/SuggestionCard.svelte +79 -0
- package/dist/components/chat/SuggestionCard.svelte.d.ts +20 -0
- package/dist/components/chat/TaskRow.svelte +59 -0
- package/dist/components/chat/TaskRow.svelte.d.ts +11 -0
- package/dist/components/chat/composerLogic.d.ts +16 -0
- package/dist/components/chat/composerLogic.js +29 -0
- package/dist/components/chat/index.d.ts +16 -0
- package/dist/components/chat/index.js +16 -0
- package/dist/components/chat/questionCardLogic.d.ts +11 -0
- package/dist/components/chat/questionCardLogic.js +39 -0
- package/dist/components/index.d.ts +10 -1
- package/dist/components/index.js +10 -0
- package/dist/components/modals/ActionModal.svelte +186 -180
- package/dist/components/modals/BaseModal.svelte +495 -401
- package/dist/components/modals/BaseModal.svelte.d.ts +4 -0
- package/dist/components/modals/NewItemDialog.svelte +198 -243
- package/dist/components/modals/Portal.svelte +109 -105
- package/dist/components/modals/README.md +16 -2
- package/dist/components/modals/RenameDialog.svelte +232 -292
- package/dist/components/modals/modalStore.d.ts +9 -1
- package/dist/components/modals/modalStore.js +44 -11
- package/dist/components/navigation/Breadcrumbs.svelte +421 -377
- package/dist/components/navigation/Breadcrumbs.svelte.d.ts +3 -2
- package/dist/components/navigation/breadcrumbsAvailableWidth.d.ts +10 -0
- package/dist/components/navigation/breadcrumbsAvailableWidth.js +10 -0
- package/dist/components/navigation/types.d.ts +2 -0
- package/dist/components/pdf/PDFViewer.svelte +1 -1
- package/dist/components/search-input/SearchInput.svelte +63 -104
- package/dist/components/search-input/SearchInput.svelte.d.ts +13 -27
- package/dist/components/search-input/index2.d.ts +14 -9
- package/dist/components/shad-editor/editor.css +1 -1
- package/dist/components/shad-editor/i18n/messages.d.ts +1 -1
- package/dist/components/shad-editor/i18n/messages.js +1 -1
- package/dist/components/shell/AppShell.svelte +52 -0
- package/dist/components/shell/AppShell.svelte.d.ts +13 -0
- package/dist/components/shell/Banner.svelte +90 -0
- package/dist/components/shell/Banner.svelte.d.ts +61 -0
- package/dist/components/shell/ErrorState.svelte +60 -0
- package/dist/components/shell/ErrorState.svelte.d.ts +13 -0
- package/dist/components/shell/Link.svelte +63 -0
- package/dist/components/shell/Link.svelte.d.ts +53 -0
- package/dist/components/shell/NavDrawer.svelte +117 -0
- package/dist/components/shell/NavDrawer.svelte.d.ts +10 -0
- package/dist/components/shell/NavRow.svelte +128 -0
- package/dist/components/shell/NavRow.svelte.d.ts +65 -0
- package/dist/components/shell/NavSectionLabel.svelte +27 -0
- package/dist/components/shell/NavSectionLabel.svelte.d.ts +9 -0
- package/dist/components/shell/NotificationRow.svelte +76 -0
- package/dist/components/shell/NotificationRow.svelte.d.ts +16 -0
- package/dist/components/shell/PageHeader.svelte +42 -0
- package/dist/components/shell/PageHeader.svelte.d.ts +12 -0
- package/dist/components/shell/ProfileRow.svelte +95 -0
- package/dist/components/shell/ProfileRow.svelte.d.ts +54 -0
- package/dist/components/shell/SettingsDialog.svelte +163 -0
- package/dist/components/shell/SettingsDialog.svelte.d.ts +19 -0
- package/dist/components/shell/SettingsNav.svelte +46 -0
- package/dist/components/shell/SettingsNav.svelte.d.ts +11 -0
- package/dist/components/shell/Sidebar.svelte +82 -0
- package/dist/components/shell/Sidebar.svelte.d.ts +25 -0
- package/dist/components/shell/Stat.svelte +63 -0
- package/dist/components/shell/Stat.svelte.d.ts +58 -0
- package/dist/components/shell/TopBar.svelte +37 -0
- package/dist/components/shell/TopBar.svelte.d.ts +11 -0
- package/dist/components/shell/WidgetRow.svelte +126 -0
- package/dist/components/shell/WidgetRow.svelte.d.ts +78 -0
- package/dist/components/shell/error-state-messages.d.ts +7 -0
- package/dist/components/shell/error-state-messages.js +9 -0
- package/dist/components/shell/index.d.ts +22 -0
- package/dist/components/shell/index.js +25 -0
- package/dist/components/shell/link-external.d.ts +2 -0
- package/dist/components/shell/link-external.js +7 -0
- package/dist/components/shell/messages.d.ts +7 -0
- package/dist/components/shell/messages.js +5 -0
- package/dist/components/shell/nested-modal-guard.d.ts +25 -0
- package/dist/components/shell/nested-modal-guard.js +33 -0
- package/dist/components/shell/settings-nav-types.d.ts +12 -0
- package/dist/components/shell/settings-nav-types.js +3 -0
- package/dist/components/shell/shell-utils.d.ts +7 -0
- package/dist/components/shell/shell-utils.js +27 -0
- package/dist/components/shell/stat-tone.d.ts +3 -0
- package/dist/components/shell/stat-tone.js +11 -0
- package/dist/components/toast/ToasterModal.svelte +102 -168
- package/dist/components/toast/ToasterModal.svelte.d.ts +2 -12
- package/dist/components/ui/accordion/accordion-content.svelte +3 -2
- package/dist/components/ui/accordion/accordion-item.svelte +10 -1
- package/dist/components/ui/accordion/accordion-trigger.svelte +4 -3
- package/dist/components/ui/alert/alert-description.svelte +5 -1
- package/dist/components/ui/alert/alert-title.svelte +2 -1
- package/dist/components/ui/alert/index.d.ts +13 -11
- package/dist/components/ui/alert/index.js +4 -4
- package/dist/components/ui/avatar/avatar-utils.d.ts +2 -0
- package/dist/components/ui/avatar/avatar-utils.js +9 -0
- package/dist/components/ui/avatar/avatar.svelte +63 -0
- package/dist/components/ui/avatar/avatar.svelte.d.ts +80 -0
- package/dist/components/ui/avatar/index.d.ts +4 -0
- package/dist/components/ui/avatar/index.js +4 -0
- package/dist/components/ui/badge/badge.svelte +22 -10
- package/dist/components/ui/badge/badge.svelte.d.ts +14 -15
- package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte +2 -2
- package/dist/components/ui/breadcrumb/breadcrumb-link.svelte +1 -1
- package/dist/components/ui/breadcrumb/breadcrumb-page.svelte +1 -1
- package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte +2 -2
- package/dist/components/ui/button/button-padding.d.ts +9 -0
- package/dist/components/ui/button/button-padding.js +15 -0
- package/dist/components/ui/button/button.svelte +81 -31
- package/dist/components/ui/button/button.svelte.d.ts +48 -29
- package/dist/components/ui/calendar/calendar-cell.svelte +1 -1
- package/dist/components/ui/calendar/calendar-head-cell.svelte +1 -1
- package/dist/components/ui/calendar/calendar-next-button.svelte +2 -2
- package/dist/components/ui/calendar/calendar-prev-button.svelte +2 -2
- package/dist/components/ui/calendar/calendar.svelte.d.ts +1 -1
- package/dist/components/ui/card/card-description.svelte +1 -1
- package/dist/components/ui/card/card-title.svelte +1 -1
- package/dist/components/ui/card/card.svelte +1 -1
- package/dist/components/ui/checkbox/checkbox.svelte +9 -5
- package/dist/components/ui/chip/chip.svelte +48 -0
- package/dist/components/ui/chip/chip.svelte.d.ts +13 -0
- package/dist/components/ui/chip/index.d.ts +2 -0
- package/dist/components/ui/chip/index.js +2 -0
- package/dist/components/ui/command/command-dialog.svelte +1 -1
- package/dist/components/ui/command/command-input.svelte +4 -4
- package/dist/components/ui/command/command-item.svelte +1 -1
- package/dist/components/ui/command/command-link-item.svelte +1 -1
- package/dist/components/ui/command/command.svelte +1 -1
- package/dist/components/ui/dialog/dialog-content.svelte +11 -4
- package/dist/components/ui/dialog/dialog-description.svelte +1 -1
- package/dist/components/ui/dialog/dialog-overlay.svelte +8 -1
- package/dist/components/ui/dialog/dialog-title.svelte +1 -1
- package/dist/components/ui/drawer/drawer-content.svelte +1 -1
- package/dist/components/ui/drawer/drawer-overlay.svelte +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +5 -5
- package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +20 -2
- package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte.d.ts +4 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte +5 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +3 -3
- package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte +2 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +3 -3
- package/dist/components/ui/field/field-ids.d.ts +7 -0
- package/dist/components/ui/field/field-ids.js +15 -0
- package/dist/components/ui/field/field.svelte +62 -0
- package/dist/components/ui/field/field.svelte.d.ts +21 -0
- package/dist/components/ui/field/index.d.ts +3 -0
- package/dist/components/ui/field/index.js +3 -0
- package/dist/components/ui/hover-card/hover-card-content.svelte +1 -1
- package/dist/components/ui/icon-button/icon-button.svelte +72 -0
- package/dist/components/ui/icon-button/icon-button.svelte.d.ts +90 -0
- package/dist/components/ui/icon-button/index.d.ts +2 -0
- package/dist/components/ui/icon-button/index.js +4 -0
- package/dist/components/ui/input/index.d.ts +1 -0
- package/dist/components/ui/input/input.svelte +11 -4
- package/dist/components/ui/input/input.svelte.d.ts +4 -1
- package/dist/components/ui/input-otp/input-otp-separator.svelte +2 -2
- package/dist/components/ui/input-otp/input-otp-slot.svelte +5 -4
- package/dist/components/ui/input-otp/input-otp-slot.svelte.d.ts +1 -1
- package/dist/components/ui/input-otp/input-otp.svelte +1 -1
- package/dist/components/ui/label/label.svelte +3 -2
- package/dist/components/ui/popover/popover-content.svelte +1 -1
- package/dist/components/ui/progress/progress.svelte +19 -5
- package/dist/components/ui/progress/progress.svelte.d.ts +4 -2
- package/dist/components/ui/radio-group/radio-group-item.svelte +4 -4
- package/dist/components/ui/range-calendar/range-calendar-head-cell.svelte +1 -1
- package/dist/components/ui/range-calendar/range-calendar-next-button.svelte +2 -2
- package/dist/components/ui/range-calendar/range-calendar-prev-button.svelte +2 -2
- package/dist/components/ui/range-calendar/range-calendar.svelte.d.ts +1 -1
- package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte +4 -1
- package/dist/components/ui/scroll-area/scroll-area.svelte +1 -1
- package/dist/components/ui/select/select-content.svelte +1 -3
- package/dist/components/ui/select/select-item.svelte +5 -4
- package/dist/components/ui/select/select-scroll-down-button.svelte +2 -2
- package/dist/components/ui/select/select-scroll-up-button.svelte +2 -2
- package/dist/components/ui/select/select-trigger.svelte +4 -3
- package/dist/components/ui/skeleton/index.d.ts +2 -0
- package/dist/components/ui/skeleton/index.js +2 -0
- package/dist/components/ui/skeleton/skeleton.svelte +24 -0
- package/dist/components/ui/skeleton/skeleton.svelte.d.ts +8 -0
- package/dist/components/ui/slider/slider.svelte +5 -10
- package/dist/components/ui/sonner/sonner.svelte +19 -13
- package/dist/components/ui/stepper-button/index.d.ts +3 -0
- package/dist/components/ui/stepper-button/index.js +2 -0
- package/dist/components/ui/stepper-button/stepper-button.svelte +37 -0
- package/dist/components/ui/stepper-button/stepper-button.svelte.d.ts +9 -0
- package/dist/components/ui/switch/switch.svelte +8 -3
- package/dist/components/ui/table/table-cell.svelte +1 -1
- package/dist/components/ui/table/table-head.svelte +1 -1
- package/dist/components/ui/table/table-row.svelte +1 -1
- package/dist/components/ui/tabs/tabs-list.svelte +1 -1
- package/dist/components/ui/tabs/tabs-trigger.svelte +1 -1
- package/dist/components/ui/tag/index.d.ts +2 -0
- package/dist/components/ui/tag/index.js +2 -0
- package/dist/components/ui/tag/tag.svelte +42 -0
- package/dist/components/ui/tag/tag.svelte.d.ts +11 -0
- package/dist/components/ui/textarea/textarea.svelte +4 -3
- package/dist/components/ui/textarea/textarea.svelte.d.ts +2 -2
- package/dist/components/ui/toggle/toggle.svelte +9 -9
- package/dist/components/ui/toggle/toggle.svelte.d.ts +14 -21
- package/dist/components/ui/tooltip/tooltip-content.svelte +1 -1
- package/dist/fonts/Inter/Inter-Black.woff2 +0 -0
- package/dist/fonts/Inter/Inter-BlackItalic.woff2 +0 -0
- package/dist/fonts/Inter/Inter-Bold.woff2 +0 -0
- package/dist/fonts/Inter/Inter-BoldItalic.woff2 +0 -0
- package/dist/fonts/Inter/Inter-ExtraBold.woff2 +0 -0
- package/dist/fonts/Inter/Inter-ExtraBoldItalic.woff2 +0 -0
- package/dist/fonts/Inter/Inter-ExtraLight-BETA.woff2 +0 -0
- package/dist/fonts/Inter/Inter-ExtraLightItalic-BETA.woff2 +0 -0
- package/dist/fonts/Inter/Inter-Italic.woff2 +0 -0
- package/dist/fonts/Inter/Inter-Light-BETA.woff2 +0 -0
- package/dist/fonts/Inter/Inter-LightItalic-BETA.woff2 +0 -0
- package/dist/fonts/Inter/Inter-Medium.woff2 +0 -0
- package/dist/fonts/Inter/Inter-MediumItalic.woff2 +0 -0
- package/dist/fonts/Inter/Inter-Regular.woff2 +0 -0
- package/dist/fonts/Inter/Inter-SemiBold.woff2 +0 -0
- package/dist/fonts/Inter/Inter-SemiBoldItalic.woff2 +0 -0
- package/dist/fonts/Inter/Inter-Thin-BETA.woff2 +0 -0
- package/dist/fonts/Inter/Inter-ThinItalic-BETA.woff2 +0 -0
- package/dist/fonts/Inter/Inter-italic.var.woff2 +0 -0
- package/dist/fonts/Inter/Inter-upright.var.woff2 +0 -0
- package/dist/fonts/Inter/Inter.var.woff2 +0 -0
- package/dist/fonts/JetBrainsMono/JetBrainsMono-Regular.woff2 +0 -0
- package/dist/i18n/audit/designSystemWords.d.ts +1 -1
- package/dist/i18n/audit/designSystemWords.js +1 -1
- package/dist/styles/fonts.css +18 -14
- package/dist/styles/global.css +10 -21
- package/dist/styles/tokens.css +332 -0
- package/dist/utils/overlayMotion.d.ts +49 -0
- package/dist/utils/overlayMotion.js +71 -0
- package/dist/utils.d.ts +27 -0
- package/dist/utils.js +33 -2
- package/package.json +2 -1
- package/tailwind.config.ts +7 -47
|
@@ -1,297 +1,237 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
2
|
+
// Svelte imports
|
|
3
|
+
import { createEventDispatcher, tick } from 'svelte';
|
|
4
|
+
|
|
5
|
+
// Local imports
|
|
6
|
+
import { Button } from '../ui/button';
|
|
7
|
+
import { Input } from '../ui/input';
|
|
8
|
+
import { showToast } from '../toast';
|
|
9
|
+
import BaseModal from './BaseModal.svelte';
|
|
10
|
+
// Words of the dialog and the helper that puts values into them
|
|
11
|
+
import type { RenameDialogMessages } from './messages';
|
|
12
|
+
import { fillMessage } from '../../utils/fillMessage';
|
|
13
|
+
|
|
14
|
+
// Props
|
|
15
|
+
let className = '';
|
|
16
|
+
export { className as class };
|
|
17
|
+
export let style: string = '';
|
|
18
|
+
//
|
|
19
|
+
export let isOpen = false;
|
|
20
|
+
export let itemName = '';
|
|
21
|
+
export let itemType = 'item'; // 'item', 'folder', 'file', 'key', etc.
|
|
22
|
+
export let itemId = '';
|
|
23
|
+
export let title = '';
|
|
24
|
+
export let placeholder = '';
|
|
25
|
+
export let confirmLabel = 'Rename';
|
|
26
|
+
export let cancelLabel = 'Cancel';
|
|
27
|
+
// The words a screen reader says for the close button (see BaseModal)
|
|
28
|
+
export let closeLabel = 'Close modal';
|
|
29
|
+
// The words of the errors and toasts; a key that is left out keeps its English text (see ./messages)
|
|
30
|
+
export let messages: Partial<RenameDialogMessages> = {};
|
|
31
|
+
export let width = '400px';
|
|
32
|
+
export let height = 'auto';
|
|
33
|
+
export let target: string = 'rename-dialog'; // target for Portal
|
|
34
|
+
export let maxLength = 50; // Reduced for better UX
|
|
35
|
+
export let shouldUseCustomRenameFunction = false; // If true, parent component handles the rename
|
|
36
|
+
|
|
37
|
+
// For backwards compatibility with specific implementations
|
|
38
|
+
export let modalType: string = 'rename';
|
|
39
|
+
export let modalData: any = null;
|
|
40
|
+
|
|
41
|
+
let inputValue = '';
|
|
42
|
+
// The Input binds its element to this: it starts as null (an undefined value cannot be bound)
|
|
43
|
+
let inputElement: HTMLInputElement | null = null;
|
|
44
|
+
let hasAttemptedSubmit = false; // Track if user has attempted to submit
|
|
45
|
+
let isValid = false; // Track if input is valid
|
|
46
|
+
|
|
47
|
+
// Initialize modalData with our current props if not provided externally
|
|
48
|
+
$: if (modalData === null) {
|
|
49
|
+
modalData = {
|
|
50
|
+
itemName,
|
|
51
|
+
itemType,
|
|
52
|
+
itemId,
|
|
53
|
+
title,
|
|
54
|
+
placeholder,
|
|
55
|
+
confirmLabel,
|
|
56
|
+
cancelLabel
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Update validation state whenever inputValue changes
|
|
61
|
+
$: {
|
|
62
|
+
isValid =
|
|
63
|
+
inputValue.trim().length > 0 && inputValue.length <= maxLength && inputValue !== itemName;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Computed placeholder based on itemType
|
|
67
|
+
$: computedPlaceholder = placeholder || `${itemType} name…`;
|
|
68
|
+
|
|
69
|
+
// The words of the errors and toasts: the page's own, or English
|
|
70
|
+
$: text = {
|
|
71
|
+
invalidTitle: messages.invalidTitle ?? 'Invalid name',
|
|
72
|
+
enterName: messages.enterName ?? 'Please enter a name',
|
|
73
|
+
enterDifferentName: messages.enterDifferentName ?? 'Please enter a different name',
|
|
74
|
+
enterValidName: messages.enterValidName ?? 'Please enter a valid name',
|
|
75
|
+
tooShort: messages.tooShort ?? 'Name must be at least 1 character long',
|
|
76
|
+
tooLong: fillMessage(messages.tooLong ?? 'Name must be {max} characters or less', {
|
|
77
|
+
max: maxLength
|
|
78
|
+
}),
|
|
79
|
+
renamed: messages.renamed ?? 'Successfully renamed to {name}',
|
|
80
|
+
failed: messages.failed ?? 'Failed to rename item'
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// Function to focus and select the input text
|
|
84
|
+
async function focusAndSelectInput() {
|
|
85
|
+
// Wait for the DOM to update
|
|
86
|
+
await tick();
|
|
87
|
+
|
|
88
|
+
if (!inputElement) return;
|
|
89
|
+
|
|
90
|
+
// Focus the input
|
|
91
|
+
inputElement.focus();
|
|
92
|
+
|
|
93
|
+
// Select all text
|
|
94
|
+
inputElement.setSelectionRange(0, inputElement.value.length);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Simple function to handle input initialization
|
|
98
|
+
function handleInput(event: Event) {
|
|
99
|
+
const input = event.target as HTMLInputElement;
|
|
100
|
+
inputValue = input.value.slice(0, maxLength);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// When the modal opens, set the input value and focus the input
|
|
104
|
+
$: if (isOpen) {
|
|
105
|
+
inputValue = itemName;
|
|
106
|
+
hasAttemptedSubmit = false; // Reset submission state
|
|
107
|
+
// Schedule focus after a short delay
|
|
108
|
+
setTimeout(focusAndSelectInput, 50);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const dispatch = createEventDispatcher();
|
|
112
|
+
|
|
113
|
+
async function handleRename() {
|
|
114
|
+
hasAttemptedSubmit = true;
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
// Validate input
|
|
118
|
+
if (!inputValue.trim() || inputValue.length < 1) {
|
|
119
|
+
showToast('error', text.invalidTitle, { description: text.tooShort });
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (inputValue.length > maxLength) {
|
|
124
|
+
showToast('error', text.invalidTitle, { description: text.tooLong });
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (inputValue === itemName) {
|
|
129
|
+
showToast('error', text.invalidTitle, { description: text.enterDifferentName });
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// If parent component handles rename, dispatch event
|
|
134
|
+
if (shouldUseCustomRenameFunction) {
|
|
135
|
+
dispatch('rename', { itemId, newName: inputValue, oldName: itemName });
|
|
136
|
+
isOpen = false;
|
|
137
|
+
} else {
|
|
138
|
+
try {
|
|
139
|
+
showToast('success', fillMessage(text.renamed, { name: inputValue }));
|
|
140
|
+
dispatch('rename', { itemId, newName: inputValue, oldName: itemName });
|
|
141
|
+
isOpen = false;
|
|
142
|
+
} catch (error) {
|
|
143
|
+
console.error('Error during rename:', error);
|
|
144
|
+
showToast('error', text.failed);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
} catch (error) {
|
|
148
|
+
console.error('Error during rename:', error);
|
|
149
|
+
showToast('error', text.failed);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function handleClose() {
|
|
154
|
+
isOpen = false;
|
|
155
|
+
hasAttemptedSubmit = false;
|
|
156
|
+
dispatch('cancel');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Support for restoring modal state
|
|
160
|
+
function handleRestore(event: CustomEvent) {
|
|
161
|
+
if (event.detail) {
|
|
162
|
+
itemName = event.detail.itemName || '';
|
|
163
|
+
itemType = event.detail.itemType || 'item';
|
|
164
|
+
itemId = event.detail.itemId || '';
|
|
165
|
+
if (event.detail.title) title = event.detail.title;
|
|
166
|
+
if (event.detail.placeholder) placeholder = event.detail.placeholder;
|
|
167
|
+
if (event.detail.confirmLabel) confirmLabel = event.detail.confirmLabel;
|
|
168
|
+
if (event.detail.cancelLabel) cancelLabel = event.detail.cancelLabel;
|
|
169
|
+
|
|
170
|
+
inputValue = itemName;
|
|
171
|
+
setTimeout(focusAndSelectInput, 50);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
$: displayTitle = title || 'Rename';
|
|
176
|
+
$: validationMessage =
|
|
177
|
+
!isValid && hasAttemptedSubmit
|
|
178
|
+
? inputValue.trim().length === 0
|
|
179
|
+
? text.enterName
|
|
180
|
+
: inputValue === itemName
|
|
181
|
+
? text.enterDifferentName
|
|
182
|
+
: text.enterValidName
|
|
183
|
+
: '';
|
|
184
184
|
</script>
|
|
185
185
|
|
|
186
|
-
<BaseModal
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
on:restore={handleRestore}
|
|
186
|
+
<BaseModal
|
|
187
|
+
bind:open={isOpen}
|
|
188
|
+
on:close={handleClose}
|
|
189
|
+
{target}
|
|
190
|
+
title={displayTitle}
|
|
191
|
+
{width}
|
|
192
|
+
{height}
|
|
193
|
+
{closeLabel}
|
|
194
|
+
{modalType}
|
|
195
|
+
{modalData}
|
|
196
|
+
on:restore={handleRestore}
|
|
198
197
|
>
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
placeholder:text-[24px] placeholder:text-[hsl(var(--grey3))]
|
|
239
|
-
text-ellipsis-input
|
|
240
|
-
{!isValid && hasAttemptedSubmit ? 'input-error' : ''}"
|
|
241
|
-
maxlength={maxLength}
|
|
242
|
-
data-min-length="1"
|
|
243
|
-
placeholder={computedPlaceholder}
|
|
244
|
-
/>
|
|
245
|
-
{#if !isValid && hasAttemptedSubmit}
|
|
246
|
-
<div class="text-xs text-[hsl(var(--error))] mt-1">
|
|
247
|
-
{inputValue.trim().length === 0 ? text.enterName :
|
|
248
|
-
inputValue === itemName ? text.enterDifferentName :
|
|
249
|
-
text.enterValidName}
|
|
250
|
-
</div>
|
|
251
|
-
{/if}
|
|
252
|
-
</div>
|
|
253
|
-
|
|
254
|
-
<!-- Buttons Container -->
|
|
255
|
-
<div class="buttons-container flex justify-center gap-4">
|
|
256
|
-
<!-- Cancel Button -->
|
|
257
|
-
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
|
258
|
-
<Button
|
|
259
|
-
class="modal-btn-secondary !h-[34px]"
|
|
260
|
-
onclick={handleClose}
|
|
261
|
-
>
|
|
262
|
-
{cancelLabel}
|
|
263
|
-
</Button>
|
|
264
|
-
|
|
265
|
-
<!-- Confirm Button -->
|
|
266
|
-
<Button
|
|
267
|
-
class="modal-btn-primary !h-[34px]"
|
|
268
|
-
onclick={handleRename}
|
|
269
|
-
disabled={!isValid}
|
|
270
|
-
>
|
|
271
|
-
{confirmLabel}
|
|
272
|
-
</Button>
|
|
273
|
-
</div>
|
|
274
|
-
</div>
|
|
198
|
+
<div
|
|
199
|
+
class="{className ? `${className} ` : ''}rename-dialog-container flex flex-col gap-4"
|
|
200
|
+
{style}
|
|
201
|
+
>
|
|
202
|
+
<div class="flex flex-col gap-1.5">
|
|
203
|
+
<Input
|
|
204
|
+
bind:ref={inputElement}
|
|
205
|
+
bind:value={inputValue}
|
|
206
|
+
placeholder={computedPlaceholder}
|
|
207
|
+
maxlength={maxLength}
|
|
208
|
+
aria-invalid={Boolean(validationMessage)}
|
|
209
|
+
class={validationMessage ? 'border-destructive' : ''}
|
|
210
|
+
oninput={handleInput}
|
|
211
|
+
onkeydown={(e) => {
|
|
212
|
+
if (e.key !== 'Escape') {
|
|
213
|
+
e.stopPropagation();
|
|
214
|
+
}
|
|
215
|
+
if (e.key === 'Enter') {
|
|
216
|
+
e.preventDefault();
|
|
217
|
+
handleRename();
|
|
218
|
+
}
|
|
219
|
+
}}
|
|
220
|
+
onfocus={(e) => {
|
|
221
|
+
const target = e.currentTarget;
|
|
222
|
+
setTimeout(() => {
|
|
223
|
+
target.setSelectionRange(0, target.value.length);
|
|
224
|
+
}, 0);
|
|
225
|
+
}}
|
|
226
|
+
/>
|
|
227
|
+
{#if validationMessage}
|
|
228
|
+
<p class="text-caption text-destructive">{validationMessage}</p>
|
|
229
|
+
{/if}
|
|
230
|
+
</div>
|
|
231
|
+
|
|
232
|
+
<div class="flex justify-end gap-2">
|
|
233
|
+
<Button variant="outline" onclick={handleClose}>{cancelLabel}</Button>
|
|
234
|
+
<Button onclick={handleRename} disabled={!isValid}>{confirmLabel}</Button>
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
275
237
|
</BaseModal>
|
|
276
|
-
|
|
277
|
-
<style>
|
|
278
|
-
:global(.input-error) {
|
|
279
|
-
animation: shake 0.4s ease-in-out;
|
|
280
|
-
border-bottom: 1px solid hsl(var(--error)) !important;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
:global(.text-ellipsis-input) {
|
|
284
|
-
overflow: hidden;
|
|
285
|
-
text-overflow: ellipsis;
|
|
286
|
-
white-space: nowrap;
|
|
287
|
-
max-width: 100%;
|
|
288
|
-
padding: 0 16px; /* Add padding to prevent text from touching edges */
|
|
289
|
-
box-sizing: border-box;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
@keyframes shake {
|
|
293
|
-
0%, 100% { transform: translateX(0); }
|
|
294
|
-
25% { transform: translateX(-5px); }
|
|
295
|
-
75% { transform: translateX(5px); }
|
|
296
|
-
}
|
|
297
|
-
</style>
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
interface ModalState {
|
|
2
2
|
isOpen: boolean;
|
|
3
|
+
/** Top-most open modal generation; used with `openModal` / `closeModal` for restore and global `modalState`. */
|
|
4
|
+
generation?: number;
|
|
3
5
|
modalType?: string;
|
|
4
6
|
data?: any;
|
|
5
7
|
}
|
|
6
8
|
export declare const modalState: import("svelte/store").Writable<ModalState>;
|
|
7
9
|
export declare const isModalOpen: import("svelte/store").Writable<boolean>;
|
|
8
|
-
export declare function openModal(modalType?: string, data?: any):
|
|
10
|
+
export declare function openModal(modalType?: string, data?: any): number;
|
|
9
11
|
export declare function closeModal(): void;
|
|
12
|
+
/** Call when a BaseModal instance opens — returns an opaque token used with `isTopModalInstance` / `unregisterModalInstance`. */
|
|
13
|
+
export declare function registerModalInstance(): symbol;
|
|
14
|
+
/** Remove this instance from the stack (e.g. closed or destroyed). Safe if already removed. */
|
|
15
|
+
export declare function unregisterModalInstance(token: symbol): void;
|
|
16
|
+
/** True when this instance should handle backdrop / Escape while several modals are stacked. */
|
|
17
|
+
export declare function isTopModalInstance(token: symbol): boolean;
|
|
10
18
|
export {};
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import { writable } from 'svelte/store';
|
|
2
|
-
// import { browser } from '$app/environment';
|
|
3
|
-
// Determine if running in browser (avoids reference errors during SSR)
|
|
4
|
-
const browser = typeof window !== 'undefined';
|
|
5
2
|
// Debug flag – set to true when you need to trace modal behaviour
|
|
6
3
|
const showLogs = false;
|
|
7
4
|
/*
|
|
@@ -12,26 +9,62 @@ const showLogs = false;
|
|
|
12
9
|
* clean slate after any refresh.
|
|
13
10
|
*/
|
|
14
11
|
// Always start with a closed modal on fresh page loads
|
|
15
|
-
const getInitialState = () => ({ isOpen: false });
|
|
12
|
+
const getInitialState = () => ({ isOpen: false, generation: 0 });
|
|
16
13
|
// Central writable store for runtime modal state
|
|
17
14
|
export const modalState = writable(getInitialState());
|
|
18
15
|
// Backwards-compatibility helper – exposes only the boolean flag
|
|
19
16
|
export const isModalOpen = writable(getInitialState().isOpen);
|
|
20
17
|
// Keep `isModalOpen` in sync (without persisting to localStorage)
|
|
21
|
-
modalState.subscribe(state => {
|
|
18
|
+
modalState.subscribe((state) => {
|
|
22
19
|
// if (showLogs) console.log('Modal state updated:', state);
|
|
23
20
|
isModalOpen.set(state.isOpen);
|
|
24
21
|
});
|
|
22
|
+
let generationCounter = 0;
|
|
23
|
+
const openStack = [];
|
|
24
|
+
/** Which BaseModal instance is top-most for backdrop + Escape (independent of `generation` timing). */
|
|
25
|
+
const modalInstanceStack = [];
|
|
26
|
+
function syncStoreFromStack() {
|
|
27
|
+
const top = openStack[openStack.length - 1];
|
|
28
|
+
if (!top) {
|
|
29
|
+
modalState.set(getInitialState());
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
modalState.set({
|
|
33
|
+
isOpen: true,
|
|
34
|
+
generation: top.generation,
|
|
35
|
+
modalType: top.modalType,
|
|
36
|
+
data: top.data
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
25
40
|
// Helper functions to manage modal state
|
|
26
41
|
export function openModal(modalType, data) {
|
|
27
42
|
// if (showLogs) console.log('Opening modal:', { modalType, data });
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
43
|
+
generationCounter += 1;
|
|
44
|
+
const entry = { generation: generationCounter, modalType, data };
|
|
45
|
+
openStack.push(entry);
|
|
46
|
+
syncStoreFromStack();
|
|
47
|
+
return entry.generation;
|
|
33
48
|
}
|
|
34
49
|
export function closeModal() {
|
|
35
50
|
// if (showLogs) console.log('Closing modal');
|
|
36
|
-
|
|
51
|
+
openStack.pop();
|
|
52
|
+
syncStoreFromStack();
|
|
53
|
+
}
|
|
54
|
+
/** Call when a BaseModal instance opens — returns an opaque token used with `isTopModalInstance` / `unregisterModalInstance`. */
|
|
55
|
+
export function registerModalInstance() {
|
|
56
|
+
const token = Symbol('base-modal-instance');
|
|
57
|
+
modalInstanceStack.push(token);
|
|
58
|
+
return token;
|
|
59
|
+
}
|
|
60
|
+
/** Remove this instance from the stack (e.g. closed or destroyed). Safe if already removed. */
|
|
61
|
+
export function unregisterModalInstance(token) {
|
|
62
|
+
const idx = modalInstanceStack.lastIndexOf(token);
|
|
63
|
+
if (idx >= 0)
|
|
64
|
+
modalInstanceStack.splice(idx, 1);
|
|
65
|
+
}
|
|
66
|
+
/** True when this instance should handle backdrop / Escape while several modals are stacked. */
|
|
67
|
+
export function isTopModalInstance(token) {
|
|
68
|
+
const n = modalInstanceStack.length;
|
|
69
|
+
return n > 0 && modalInstanceStack[n - 1] === token;
|
|
37
70
|
}
|