@placeholderco/placeholder-ui 1.0.11 → 2.0.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.
- package/LICENSE +1 -1
- package/README.md +134 -130
- package/dist/app.css +178 -0
- package/dist/bootstrap.min.css +3600 -0
- package/dist/cards/GitCard.svelte +115 -0
- package/dist/cards/GitCard.svelte.d.ts +22 -0
- package/dist/display/Avatar.svelte +29 -17
- package/dist/display/Avatar.svelte.d.ts +12 -2
- package/dist/display/LinkCollection.svelte +40 -18
- package/dist/display/LinkCollection.svelte.d.ts +9 -2
- package/dist/display/Paper.svelte +31 -19
- package/dist/display/Paper.svelte.d.ts +12 -3
- package/dist/display/alert/Alert.svelte +129 -0
- package/dist/display/alert/Alert.svelte.d.ts +15 -0
- package/dist/display/alert/AlertVariant.d.ts +1 -0
- package/dist/display/alert/AlertVariant.js +1 -0
- package/dist/display/filetree/FileTree.svelte +259 -0
- package/dist/display/filetree/FileTree.svelte.d.ts +76 -0
- package/dist/display/filetree/FileTreeItem.svelte +396 -0
- package/dist/display/filetree/FileTreeItem.svelte.d.ts +40 -0
- package/dist/display/filetree/FileTreeNode.d.ts +46 -0
- package/dist/display/filetree/FileTreeNode.js +115 -0
- package/dist/display/filetree/index.d.ts +5 -0
- package/dist/display/filetree/index.js +3 -0
- package/dist/editors/CodeMirror.svelte +306 -0
- package/dist/editors/CodeMirror.svelte.d.ts +31 -0
- package/dist/editors/tiptap/LinkActionMenu.svelte +307 -0
- package/dist/editors/tiptap/LinkActionMenu.svelte.d.ts +8 -0
- package/dist/editors/tiptap/TipTap.svelte +856 -0
- package/dist/editors/tiptap/TipTap.svelte.d.ts +54 -0
- package/dist/editors/tiptap/TipTapBubble.svelte +790 -0
- package/dist/editors/tiptap/TipTapBubble.svelte.d.ts +44 -0
- package/dist/editors/tiptap/collaboration.d.ts +55 -0
- package/dist/editors/tiptap/collaboration.js +1 -0
- package/dist/editors/tiptap/extensions/Alert.d.ts +18 -0
- package/dist/editors/tiptap/extensions/Alert.js +72 -0
- package/dist/editors/tiptap/extensions/CodeBlockEditor.d.ts +21 -0
- package/dist/editors/tiptap/extensions/CodeBlockEditor.js +326 -0
- package/dist/editors/tiptap/extensions/Div.d.ts +19 -0
- package/dist/editors/tiptap/extensions/Div.js +89 -0
- package/dist/editors/tiptap/extensions/Span.d.ts +5 -0
- package/dist/editors/tiptap/extensions/Span.js +56 -0
- package/dist/editors/tiptap/extensions/codeBlockEditor.css +236 -0
- package/dist/editors/tiptap/extensions/codeBlockLanguages.d.ts +17 -0
- package/dist/editors/tiptap/extensions/codeBlockLanguages.js +124 -0
- package/dist/editors/tiptap/extensions/index.d.ts +7 -0
- package/dist/editors/tiptap/extensions/index.js +5 -0
- package/dist/editors/tiptap/toolbar/AlertButton.svelte +261 -0
- package/dist/editors/tiptap/toolbar/AlertButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignRightButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignRightButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/BoldButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/BoldButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/BulletListButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/BulletListButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/CodeButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/CodeButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/ColorButton.svelte +299 -0
- package/dist/editors/tiptap/toolbar/ColorButton.svelte.d.ts +20 -0
- package/dist/editors/tiptap/toolbar/DocumentButton.svelte +58 -0
- package/dist/editors/tiptap/toolbar/DocumentButton.svelte.d.ts +9 -0
- package/dist/editors/tiptap/toolbar/HeadingButton.svelte +30 -0
- package/dist/editors/tiptap/toolbar/HeadingButton.svelte.d.ts +8 -0
- package/dist/editors/tiptap/toolbar/HtmlButton.svelte +68 -0
- package/dist/editors/tiptap/toolbar/HtmlButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/ImageButton.svelte +54 -0
- package/dist/editors/tiptap/toolbar/ImageButton.svelte.d.ts +8 -0
- package/dist/editors/tiptap/toolbar/ItalicButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/ItalicButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/LinkButton.svelte +257 -0
- package/dist/editors/tiptap/toolbar/LinkButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/OrderedListButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/OrderedListButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/RedoButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/RedoButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/SubscriptButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/SubscriptButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/TableButton.svelte +258 -0
- package/dist/editors/tiptap/toolbar/TableButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/ToolbarButton.svelte +84 -0
- package/dist/editors/tiptap/toolbar/ToolbarButton.svelte.d.ts +10 -0
- package/dist/editors/tiptap/toolbar/UnderlineButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/UnderlineButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/UndoButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/UndoButton.svelte.d.ts +7 -0
- package/dist/form/Autocomplete.svelte +270 -137
- package/dist/form/Autocomplete.svelte.d.ts +58 -10
- package/dist/form/AutocompleteMulti.svelte +385 -227
- package/dist/form/AutocompleteMulti.svelte.d.ts +59 -10
- package/dist/form/Checkbox.svelte +124 -43
- package/dist/form/Checkbox.svelte.d.ts +26 -2
- package/dist/form/Chips.svelte +47 -17
- package/dist/form/Chips.svelte.d.ts +24 -3
- package/dist/form/ComboBox.svelte +30 -20
- package/dist/form/ComboBox.svelte.d.ts +1 -1
- package/dist/form/ComboBoxItemBuilder.svelte +161 -188
- package/dist/form/ComboBoxItemBuilder.svelte.d.ts +19 -2
- package/dist/form/ComboBoxMulti.svelte +38 -24
- package/dist/form/ComboBoxMulti.svelte.d.ts +1 -1
- package/dist/form/CronBuilder.svelte +84 -67
- package/dist/form/CronBuilder.svelte.d.ts +16 -3
- package/dist/form/DatePicker.svelte +177 -191
- package/dist/form/DatePicker.svelte.d.ts +17 -2
- package/dist/form/DateRangePicker.svelte +775 -0
- package/dist/form/DateRangePicker.svelte.d.ts +23 -0
- package/dist/form/DateTimePicker.svelte +168 -209
- package/dist/form/DateTimePicker.svelte.d.ts +10 -2
- package/dist/form/FormGroup.svelte +33 -10
- package/dist/form/FormGroup.svelte.d.ts +12 -2
- package/dist/form/Number.svelte +71 -29
- package/dist/form/Number.svelte.d.ts +39 -6
- package/dist/form/Radio.svelte +174 -0
- package/dist/form/Radio.svelte.d.ts +21 -0
- package/dist/form/RadioGroup.svelte +52 -138
- package/dist/form/RadioGroup.svelte.d.ts +19 -2
- package/dist/form/SegmentedControl.svelte +103 -57
- package/dist/form/SegmentedControl.svelte.d.ts +12 -2
- package/dist/form/Select.svelte +160 -229
- package/dist/form/Select.svelte.d.ts +35 -6
- package/dist/form/SelectMulti.svelte +166 -277
- package/dist/form/SelectMulti.svelte.d.ts +37 -6
- package/dist/form/Slider.svelte +185 -268
- package/dist/form/Slider.svelte.d.ts +33 -16
- package/dist/form/StringArrayBuilder.svelte +249 -0
- package/dist/form/StringArrayBuilder.svelte.d.ts +15 -0
- package/dist/form/Switch.svelte +164 -106
- package/dist/form/Switch.svelte.d.ts +22 -3
- package/dist/form/TextArea.svelte +80 -45
- package/dist/form/TextArea.svelte.d.ts +35 -10
- package/dist/form/Textbox.svelte +80 -47
- package/dist/form/Textbox.svelte.d.ts +41 -8
- package/dist/form/TimePicker.svelte +42 -47
- package/dist/form/TimePicker.svelte.d.ts +12 -2
- package/dist/form/comboBoxCore.svelte.d.ts +99 -0
- package/dist/form/comboBoxCore.svelte.js +243 -0
- package/dist/icon/Icon.svelte +8 -3
- package/dist/icon/Icon.svelte.d.ts +8 -3
- package/dist/icon/cube-send.svg +1 -0
- package/dist/icon/file-type-bmp.svg +1 -0
- package/dist/icon/file-type-csv.svg +1 -0
- package/dist/icon/file-type-doc.svg +1 -0
- package/dist/icon/file-type-docx.svg +1 -0
- package/dist/icon/file-type-jpg.svg +1 -0
- package/dist/icon/file-type-pdf.svg +1 -0
- package/dist/icon/file-type-png.svg +1 -0
- package/dist/icon/file-type-ppt.svg +1 -0
- package/dist/icon/file-type-svg.svg +1 -0
- package/dist/icon/file-type-txt.svg +1 -0
- package/dist/icon/file-type-xls.svg +1 -0
- package/dist/icon/file-type-zip.svg +1 -0
- package/dist/icon/index.d.ts +166 -145
- package/dist/icon/index.js +166 -146
- package/dist/icon/layout-sidebar-left-collapse.svg +1 -0
- package/dist/icon/layout-sidebar-left-expand.svg +1 -0
- package/dist/icon/logo-placeholder.svg +6 -0
- package/dist/icon/paperclip.svg +1 -0
- package/dist/icon/source-code.svg +1 -0
- package/dist/icon/sun-moon.svg +1 -0
- package/dist/icon/table.svg +6 -0
- package/dist/icon/thumb-down.svg +1 -0
- package/dist/icon/thumb-up.svg +1 -0
- package/dist/index.d.ts +93 -22
- package/dist/index.js +28 -27
- package/dist/layout/AppShell.svelte +12 -162
- package/dist/layout/AppShell.svelte.d.ts +6 -27
- package/dist/layout/CustomNavbar.svelte +9 -7
- package/dist/layout/CustomNavbar.svelte.d.ts +4 -2
- package/dist/layout/Navbar.svelte +158 -110
- package/dist/layout/Navbar.svelte.d.ts +26 -12
- package/dist/layout/NavbarItemDisplay.svelte +2 -2
- package/dist/layout/NavbarItemView.svelte +182 -0
- package/dist/layout/NavbarItemView.svelte.d.ts +10 -0
- package/dist/layout/Sidenav.svelte +280 -341
- package/dist/layout/Sidenav.svelte.d.ts +36 -4
- package/dist/models/ComboBoxItem.d.ts +2 -0
- package/dist/models/Employee.d.ts +53 -0
- package/dist/models/Employee.js +23 -0
- package/dist/models/Hyperlink.d.ts +3 -1
- package/dist/models/LinkCollectionItem.d.ts +3 -1
- package/dist/models/NavbarItem.d.ts +6 -2
- package/dist/theme.svelte.d.ts +0 -1
- package/dist/theme.svelte.js +46 -58
- package/dist/ui/Accordion.svelte +81 -242
- package/dist/ui/Accordion.svelte.d.ts +37 -14
- package/dist/ui/AccordionItem.svelte +303 -0
- package/dist/ui/AccordionItem.svelte.d.ts +21 -0
- package/dist/ui/ActionIcon.svelte +25 -21
- package/dist/ui/ActionIcon.svelte.d.ts +15 -2
- package/dist/ui/Badge.svelte +170 -161
- package/dist/ui/Badge.svelte.d.ts +16 -4
- package/dist/ui/Button.svelte +178 -205
- package/dist/ui/Button.svelte.d.ts +19 -2
- package/dist/ui/ButtonVariant.d.ts +15 -1
- package/dist/ui/ContextMenu.svelte +146 -0
- package/dist/ui/ContextMenu.svelte.d.ts +37 -0
- package/dist/ui/ContextMenuList.svelte +188 -0
- package/dist/ui/ContextMenuList.svelte.d.ts +12 -0
- package/dist/ui/Dialog.svelte +183 -104
- package/dist/ui/Dialog.svelte.d.ts +21 -2
- package/dist/ui/Drawer.svelte +237 -184
- package/dist/ui/Drawer.svelte.d.ts +20 -2
- package/dist/ui/Dropdown.svelte +24 -14
- package/dist/ui/Dropdown.svelte.d.ts +11 -2
- package/dist/ui/Dropzone.svelte +159 -57
- package/dist/ui/Dropzone.svelte.d.ts +29 -2
- package/dist/ui/Link.svelte +12 -4
- package/dist/ui/Link.svelte.d.ts +8 -2
- package/dist/ui/Loader.svelte +23 -18
- package/dist/ui/Loader.svelte.d.ts +5 -2
- package/dist/ui/Logo.svelte +37 -0
- package/dist/ui/Logo.svelte.d.ts +16 -0
- package/dist/ui/MultiSortable.svelte +287 -0
- package/dist/ui/MultiSortable.svelte.d.ts +50 -0
- package/dist/ui/Pagination.svelte +12 -6
- package/dist/ui/Pagination.svelte.d.ts +6 -2
- package/dist/ui/Popover.svelte +43 -65
- package/dist/ui/Popover.svelte.d.ts +14 -5
- package/dist/ui/ProgressBar.svelte +169 -0
- package/dist/ui/ProgressBar.svelte.d.ts +30 -0
- package/dist/ui/ProgressBarVariant.d.ts +7 -0
- package/dist/ui/ProgressBarVariant.js +1 -0
- package/dist/ui/SegmentedControl.svelte +0 -0
- package/dist/ui/SegmentedControl.svelte.d.ts +26 -0
- package/dist/ui/Sortable.svelte +163 -0
- package/dist/ui/Sortable.svelte.d.ts +47 -0
- package/dist/ui/Table.svelte +497 -56
- package/dist/ui/Table.svelte.d.ts +64 -2
- package/dist/ui/Tabs.svelte +22 -18
- package/dist/ui/Tabs.svelte.d.ts +6 -2
- package/dist/ui/ThemeSwitcher.svelte +26 -7
- package/dist/ui/ThemeSwitcher.svelte.d.ts +4 -2
- package/dist/ui/Tooltip.svelte +312 -180
- package/dist/ui/Tooltip.svelte.d.ts +4 -3
- package/dist/uiTheme.svelte.d.ts +86 -0
- package/dist/uiTheme.svelte.js +214 -0
- package/dist/util/DateFunctions.js +1 -1
- package/dist/util/DragDrop.d.ts +50 -0
- package/dist/util/DragDrop.js +154 -0
- package/dist/util/NavigateTo.js +2 -2
- package/dist/util/dayjs.d.ts +4 -0
- package/dist/util/dayjs.js +15 -0
- package/dist/util/interceptLinkClick.d.ts +13 -0
- package/dist/util/interceptLinkClick.js +33 -0
- package/package.json +66 -26
- package/dist/display/Alert.svelte +0 -179
- package/dist/display/Alert.svelte.d.ts +0 -13
- package/dist/form/FileInput.svelte +0 -235
- package/dist/form/FileInput.svelte.d.ts +0 -23
- package/dist/form/PasswordInput.svelte +0 -252
- package/dist/form/PasswordInput.svelte.d.ts +0 -33
- package/dist/form/Rating.svelte +0 -235
- package/dist/form/Rating.svelte.d.ts +0 -21
- package/dist/styles/components.css +0 -199
- package/dist/styles/dark.css +0 -146
- package/dist/styles/index.css +0 -116
- package/dist/styles/reset.css +0 -110
- package/dist/styles/semantic.css +0 -86
- package/dist/styles/tokens.css +0 -203
- package/dist/styles/utilities.css +0 -523
- package/dist/ui/Breadcrumbs.svelte +0 -131
- package/dist/ui/Breadcrumbs.svelte.d.ts +0 -16
- package/dist/ui/LoadingOverlay.svelte +0 -53
- package/dist/ui/LoadingOverlay.svelte.d.ts +0 -11
- package/dist/ui/Progress.svelte +0 -191
- package/dist/ui/Progress.svelte.d.ts +0 -15
- package/dist/ui/RingProgress.svelte +0 -141
- package/dist/ui/RingProgress.svelte.d.ts +0 -18
- package/dist/ui/Skeleton.svelte +0 -85
- package/dist/ui/Skeleton.svelte.d.ts +0 -12
- package/dist/ui/Stepper.svelte +0 -355
- package/dist/ui/Stepper.svelte.d.ts +0 -24
- package/dist/ui/Timeline.svelte +0 -225
- package/dist/ui/Timeline.svelte.d.ts +0 -23
- /package/dist/{actions → util}/ClickOutside.d.ts +0 -0
- /package/dist/{actions → util}/ClickOutside.js +0 -0
- /package/dist/{transitions → util}/Transitions.d.ts +0 -0
- /package/dist/{transitions → util}/Transitions.js +0 -0
package/dist/ui/Dialog.svelte
CHANGED
|
@@ -3,17 +3,37 @@
|
|
|
3
3
|
import { iconX } from '../icon/index.js';
|
|
4
4
|
import type { Snippet } from 'svelte';
|
|
5
5
|
import ActionIcon from './ActionIcon.svelte';
|
|
6
|
-
import { setContext } from 'svelte';
|
|
6
|
+
import { setContext, untrack } from 'svelte';
|
|
7
|
+
|
|
8
|
+
export interface DialogContext {
|
|
9
|
+
/** Whether the dialog is currently open (reactive) */
|
|
10
|
+
readonly isOpen: boolean;
|
|
11
|
+
/** Register a callback invoked each time the dialog opens */
|
|
12
|
+
onOpen: (callback: () => void) => void;
|
|
13
|
+
/** Register a callback invoked each time the dialog closes */
|
|
14
|
+
onClose: (callback: () => void) => void;
|
|
15
|
+
/** Register a callback invoked only the first time the dialog opens */
|
|
16
|
+
onFirstOpen: (callback: () => void) => void;
|
|
17
|
+
}
|
|
7
18
|
|
|
8
|
-
interface
|
|
19
|
+
export interface DialogProps {
|
|
20
|
+
/** Whether the dialog is visible (bindable) */
|
|
9
21
|
show: boolean;
|
|
22
|
+
/** Allow closing by clicking backdrop or pressing Escape */
|
|
10
23
|
allowImplicitClose?: boolean;
|
|
24
|
+
/** Dialog title displayed in the header */
|
|
11
25
|
title?: string | undefined;
|
|
26
|
+
/** Render without the Paper wrapper component */
|
|
12
27
|
noPaper?: boolean;
|
|
28
|
+
/** Prevent content from overflowing the dialog bounds */
|
|
13
29
|
preventOverflow?: boolean;
|
|
30
|
+
/** Size preset for the dialog width */
|
|
14
31
|
size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
32
|
+
/** Additional CSS classes */
|
|
15
33
|
class?: string;
|
|
34
|
+
/** Footer content (typically action buttons) */
|
|
16
35
|
footer?: Snippet;
|
|
36
|
+
/** Main dialog content */
|
|
17
37
|
children?: Snippet;
|
|
18
38
|
}
|
|
19
39
|
|
|
@@ -27,83 +47,102 @@
|
|
|
27
47
|
class: classes = '',
|
|
28
48
|
footer,
|
|
29
49
|
children
|
|
30
|
-
}:
|
|
50
|
+
}: DialogProps = $props();
|
|
51
|
+
|
|
52
|
+
const uid = $props.id();
|
|
53
|
+
const titleId = `${uid}-title`;
|
|
31
54
|
|
|
32
55
|
let dialogElement: HTMLDialogElement | undefined = $state(undefined);
|
|
33
|
-
|
|
34
|
-
// Create context for dialog events
|
|
35
|
-
let hasOpenedBefore = $state(false);
|
|
36
|
-
let dialogContext = $state({
|
|
37
|
-
isOpen: show,
|
|
38
|
-
onOpen: () => {},
|
|
39
|
-
onClose: () => {},
|
|
40
|
-
onFirstOpen: () => {}
|
|
41
|
-
});
|
|
42
56
|
|
|
43
|
-
|
|
44
|
-
|
|
57
|
+
// Context so child components can react to dialog state
|
|
58
|
+
const openCallbacks: (() => void)[] = [];
|
|
59
|
+
const closeCallbacks: (() => void)[] = [];
|
|
60
|
+
const firstOpenCallbacks: (() => void)[] = [];
|
|
61
|
+
|
|
62
|
+
setContext<DialogContext>('dialog', {
|
|
63
|
+
get isOpen() {
|
|
64
|
+
return show;
|
|
65
|
+
},
|
|
66
|
+
onOpen: (callback) => openCallbacks.push(callback),
|
|
67
|
+
onClose: (callback) => closeCallbacks.push(callback),
|
|
68
|
+
onFirstOpen: (callback) => firstOpenCallbacks.push(callback)
|
|
45
69
|
});
|
|
46
70
|
|
|
47
|
-
//
|
|
48
|
-
|
|
71
|
+
// Plain (untracked) flags — only the `show` transition should re-run the effect
|
|
72
|
+
let wasOpen = false;
|
|
73
|
+
let hasOpenedBefore = false;
|
|
49
74
|
|
|
50
75
|
$effect(() => {
|
|
51
|
-
if (dialogElement)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
76
|
+
if (!dialogElement) return;
|
|
77
|
+
|
|
78
|
+
if (show && !wasOpen) {
|
|
79
|
+
wasOpen = true;
|
|
80
|
+
dialogElement.showModal();
|
|
81
|
+
untrack(() => {
|
|
82
|
+
for (const callback of openCallbacks) callback();
|
|
55
83
|
if (!hasOpenedBefore) {
|
|
56
84
|
hasOpenedBefore = true;
|
|
57
|
-
|
|
85
|
+
for (const callback of firstOpenCallbacks) callback();
|
|
58
86
|
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
87
|
+
});
|
|
88
|
+
} else if (!show && wasOpen) {
|
|
89
|
+
wasOpen = false;
|
|
90
|
+
dialogElement.close();
|
|
91
|
+
untrack(() => {
|
|
92
|
+
for (const callback of closeCallbacks) callback();
|
|
93
|
+
});
|
|
63
94
|
}
|
|
64
95
|
});
|
|
65
96
|
|
|
97
|
+
// Lock body scroll while open; effects only run in the browser, so this is SSR-safe
|
|
66
98
|
$effect(() => {
|
|
67
|
-
if (!body) return;
|
|
68
|
-
|
|
69
99
|
if (show) {
|
|
70
|
-
body.style.overflow = 'hidden';
|
|
71
|
-
|
|
72
|
-
|
|
100
|
+
document.body.style.overflow = 'hidden';
|
|
101
|
+
return () => {
|
|
102
|
+
document.body.style.overflow = '';
|
|
103
|
+
};
|
|
73
104
|
}
|
|
74
105
|
});
|
|
75
106
|
|
|
76
|
-
|
|
107
|
+
function onCancel(e: Event) {
|
|
108
|
+
// Escape closes the native dialog before `close` fires; block it here,
|
|
109
|
+
// otherwise the dialog closes while `show` stays true
|
|
110
|
+
if (!allowImplicitClose) e.preventDefault();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function onNativeClose() {
|
|
114
|
+
// The dialog has already closed natively (Escape, form method="dialog");
|
|
115
|
+
// sync `show` unconditionally so it can be reopened
|
|
116
|
+
show = false;
|
|
117
|
+
}
|
|
77
118
|
|
|
78
|
-
function
|
|
119
|
+
function onBackdropMousedown() {
|
|
79
120
|
if (allowImplicitClose) show = false;
|
|
80
121
|
}
|
|
81
122
|
|
|
82
|
-
function
|
|
83
|
-
|
|
123
|
+
function stopMousedown(e: Event) {
|
|
124
|
+
// Keep mousedowns inside the dialog from reaching the backdrop handler
|
|
125
|
+
e.stopPropagation();
|
|
84
126
|
}
|
|
85
127
|
</script>
|
|
86
128
|
|
|
87
129
|
{#snippet DialogInner()}
|
|
88
130
|
{#if title}
|
|
89
131
|
<div class="dialog-title">
|
|
90
|
-
<span class="font-bold">{title}</span>
|
|
132
|
+
<span id={titleId} class="font-bold">{title}</span>
|
|
91
133
|
{#if allowImplicitClose}
|
|
92
134
|
<ActionIcon
|
|
93
|
-
onclick={
|
|
135
|
+
onclick={() => (show = false)}
|
|
94
136
|
variant="secondary-subtle"
|
|
95
137
|
class="flex !p-[0.3rem] mr-1 !leading-0"
|
|
96
138
|
svg={iconX}
|
|
97
139
|
size="1rem"
|
|
140
|
+
ariaLabel="Close dialog"
|
|
98
141
|
/>
|
|
99
142
|
{/if}
|
|
100
143
|
</div>
|
|
101
144
|
{/if}
|
|
102
|
-
<div
|
|
103
|
-
class="dialog-body
|
|
104
|
-
{preventOverflow ? 'overflow-y-auto' : 'overflow-visible'}
|
|
105
|
-
{!footer && 'no-footer'}"
|
|
106
|
-
>
|
|
145
|
+
<div class="dialog-body {preventOverflow ? 'overflow-y-auto' : 'overflow-visible'}">
|
|
107
146
|
{@render children?.()}
|
|
108
147
|
</div>
|
|
109
148
|
{#if footer}
|
|
@@ -113,64 +152,71 @@
|
|
|
113
152
|
{/if}
|
|
114
153
|
{/snippet}
|
|
115
154
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
155
|
+
<!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
|
|
156
|
+
<dialog
|
|
157
|
+
bind:this={dialogElement}
|
|
158
|
+
oncancel={onCancel}
|
|
159
|
+
onclose={onNativeClose}
|
|
160
|
+
onmousedown={onBackdropMousedown}
|
|
161
|
+
class={`dialog ${size}`}
|
|
162
|
+
aria-labelledby={title ? titleId : undefined}
|
|
163
|
+
>
|
|
164
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
165
|
+
<div
|
|
166
|
+
class="dialog-inner {noPaper ? `${classes} dialog-no-paper` : ''}"
|
|
167
|
+
onmousedown={stopMousedown}
|
|
123
168
|
>
|
|
124
|
-
|
|
125
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
126
|
-
<div
|
|
127
|
-
class="dialog-inner {classes} dialog-no-paper"
|
|
128
|
-
onclick={cancel}
|
|
129
|
-
onmousedown={cancel}
|
|
130
|
-
onmouseup={cancel}
|
|
131
|
-
>
|
|
169
|
+
{#if noPaper}
|
|
132
170
|
{@render DialogInner()}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
{:else}
|
|
136
|
-
<!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
|
|
137
|
-
<dialog
|
|
138
|
-
bind:this={dialogElement}
|
|
139
|
-
onclose={onClose}
|
|
140
|
-
onmousedown={onClose}
|
|
141
|
-
class={`dialog ${size}`}
|
|
142
|
-
>
|
|
143
|
-
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
144
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
145
|
-
<div class="dialog-inner" onclick={cancel} onmousedown={cancel} onmouseup={cancel}>
|
|
146
|
-
<div class="dialog-paper {preventOverflow ? 'overflow-y-auto' : 'overflow-visible'} ">
|
|
171
|
+
{:else}
|
|
172
|
+
<div class="dialog-paper {preventOverflow ? 'overflow-y-auto' : 'overflow-visible'}">
|
|
147
173
|
<Paper containerClass={classes}>
|
|
148
174
|
{@render DialogInner()}
|
|
149
175
|
</Paper>
|
|
150
176
|
</div>
|
|
151
|
-
|
|
152
|
-
</
|
|
153
|
-
|
|
177
|
+
{/if}
|
|
178
|
+
</div>
|
|
179
|
+
</dialog>
|
|
154
180
|
|
|
155
181
|
<style>
|
|
182
|
+
/* Animate transform, not margin — the native dialog centers itself via
|
|
183
|
+
`margin: auto`, and a margin animation with `forwards` fill would
|
|
184
|
+
permanently override it and pin the dialog to the top of the viewport */
|
|
156
185
|
@keyframes fadeIn {
|
|
157
186
|
from {
|
|
158
187
|
opacity: 0;
|
|
159
|
-
transform: translateY(-
|
|
188
|
+
transform: translateY(-0.5rem);
|
|
160
189
|
}
|
|
161
190
|
to {
|
|
162
191
|
opacity: 1;
|
|
163
|
-
transform: translateY(
|
|
192
|
+
transform: translateY(0);
|
|
164
193
|
}
|
|
165
194
|
}
|
|
166
195
|
@keyframes fadeOut {
|
|
167
196
|
from {
|
|
168
197
|
opacity: 1;
|
|
169
|
-
transform: translateY(
|
|
198
|
+
transform: translateY(0);
|
|
199
|
+
}
|
|
200
|
+
to {
|
|
201
|
+
opacity: 0;
|
|
202
|
+
transform: translateY(-0.5rem);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
@keyframes fadeInFull {
|
|
207
|
+
from {
|
|
208
|
+
opacity: 0;
|
|
209
|
+
}
|
|
210
|
+
to {
|
|
211
|
+
opacity: 1;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
@keyframes fadeOutFull {
|
|
215
|
+
from {
|
|
216
|
+
opacity: 1;
|
|
170
217
|
}
|
|
171
218
|
to {
|
|
172
219
|
opacity: 0;
|
|
173
|
-
transform: translateY(-1em);
|
|
174
220
|
}
|
|
175
221
|
}
|
|
176
222
|
|
|
@@ -193,54 +239,79 @@
|
|
|
193
239
|
}
|
|
194
240
|
|
|
195
241
|
dialog {
|
|
196
|
-
color: var(--
|
|
242
|
+
color: var(--text-color);
|
|
197
243
|
border: none;
|
|
244
|
+
/* The dialog element itself is focused by showModal(); don't draw a
|
|
245
|
+
focus ring around the whole dialog */
|
|
246
|
+
outline: none;
|
|
198
247
|
background-color: transparent;
|
|
199
248
|
overflow: visible;
|
|
200
249
|
margin: auto;
|
|
201
|
-
|
|
202
|
-
|
|
250
|
+
max-width: min(calc(100vw - 2rem), calc(100% - 6px));
|
|
251
|
+
/* Cap to the visible viewport with equal margins; the flex chain below
|
|
252
|
+
(dialog > inner > paper > body, each min-height: 0) passes this limit
|
|
253
|
+
down so the body shrinks instead of spilling past the bottom edge.
|
|
254
|
+
dvh tracks the visible viewport on iOS Safari (100vh includes the
|
|
255
|
+
area behind the collapsible URL bar); vh is the older-browser fallback */
|
|
256
|
+
max-height: calc(100vh - 2rem);
|
|
257
|
+
max-height: calc(100dvh - 2rem);
|
|
258
|
+
|
|
259
|
+
animation: fadeOut 0.2s forwards;
|
|
203
260
|
transition:
|
|
204
|
-
display
|
|
205
|
-
overlay
|
|
261
|
+
display 0.2s allow-discrete,
|
|
262
|
+
overlay 0.2s allow-discrete;
|
|
206
263
|
&::backdrop {
|
|
207
|
-
animation: backdropFadeOut
|
|
264
|
+
animation: backdropFadeOut 0.2s forwards;
|
|
208
265
|
}
|
|
209
266
|
&[open] {
|
|
210
|
-
|
|
267
|
+
/* Only when [open] — an unconditional author display would override
|
|
268
|
+
the UA's display: none on closed dialogs and make them visible */
|
|
269
|
+
display: flex;
|
|
270
|
+
flex-direction: column;
|
|
271
|
+
animation: fadeIn 0.2s forwards;
|
|
211
272
|
&::backdrop {
|
|
212
|
-
animation: backdropFadeIn
|
|
273
|
+
animation: backdropFadeIn 0.2s forwards;
|
|
213
274
|
}
|
|
214
275
|
}
|
|
215
276
|
}
|
|
216
277
|
|
|
278
|
+
.dialog-inner {
|
|
279
|
+
display: flex;
|
|
280
|
+
flex-direction: column;
|
|
281
|
+
min-height: 0;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/* Paper sits inside the height chain; .paper-body already has an inline
|
|
285
|
+
min-height: 0, so only .paper needs the shrink link */
|
|
286
|
+
.dialog :global(.paper) {
|
|
287
|
+
min-height: 0;
|
|
288
|
+
}
|
|
289
|
+
|
|
217
290
|
.dialog-title {
|
|
218
291
|
display: flex;
|
|
219
292
|
justify-content: space-between;
|
|
220
|
-
margin-bottom:
|
|
221
|
-
padding-bottom:
|
|
222
|
-
border-bottom: 1px solid var(--
|
|
223
|
-
font-weight:
|
|
293
|
+
margin-bottom: 0.5rem;
|
|
294
|
+
padding-bottom: 0.25rem;
|
|
295
|
+
border-bottom: 1px solid var(--border-color);
|
|
296
|
+
font-weight: 600;
|
|
297
|
+
flex-shrink: 0;
|
|
224
298
|
}
|
|
225
299
|
|
|
226
300
|
.dialog-body {
|
|
227
301
|
display: flex;
|
|
228
302
|
flex-direction: column;
|
|
229
303
|
min-width: 0;
|
|
304
|
+
min-height: 0;
|
|
230
305
|
flex-shrink: 1;
|
|
231
|
-
max-height: calc(100vh - 167px);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
.dialog-body.no-footer {
|
|
235
|
-
max-height: calc(100vh - 107px);
|
|
236
306
|
}
|
|
237
307
|
|
|
238
308
|
.dialog-footer {
|
|
239
309
|
display: flex;
|
|
240
|
-
justify-content:
|
|
241
|
-
padding:
|
|
242
|
-
border-top: 1px solid var(--
|
|
243
|
-
gap:
|
|
310
|
+
justify-content: space-between;
|
|
311
|
+
padding-top: 0.5rem;
|
|
312
|
+
border-top: 1px solid var(--border-color);
|
|
313
|
+
gap: 0.5rem;
|
|
314
|
+
flex-shrink: 0;
|
|
244
315
|
}
|
|
245
316
|
|
|
246
317
|
.overflow-visible {
|
|
@@ -252,7 +323,7 @@
|
|
|
252
323
|
}
|
|
253
324
|
|
|
254
325
|
.dialog-no-paper {
|
|
255
|
-
padding:
|
|
326
|
+
padding: 1rem;
|
|
256
327
|
}
|
|
257
328
|
|
|
258
329
|
.dialog-paper,
|
|
@@ -260,17 +331,18 @@
|
|
|
260
331
|
display: flex;
|
|
261
332
|
flex-direction: column;
|
|
262
333
|
box-sizing: border-box;
|
|
263
|
-
border-radius:
|
|
264
|
-
background:
|
|
334
|
+
border-radius: 0.25rem;
|
|
335
|
+
background: #f1f3f5;
|
|
336
|
+
min-height: 0;
|
|
265
337
|
}
|
|
266
338
|
|
|
267
339
|
:global(.dark .dialog-paper),
|
|
268
340
|
:global(.dark .dialog-no-paper) {
|
|
269
|
-
background-color:
|
|
341
|
+
background-color: rgb(33, 34, 38);
|
|
270
342
|
}
|
|
271
343
|
|
|
272
344
|
dialog::backdrop {
|
|
273
|
-
background-color:
|
|
345
|
+
background-color: #0008;
|
|
274
346
|
}
|
|
275
347
|
|
|
276
348
|
.dialog.sm {
|
|
@@ -291,13 +363,20 @@
|
|
|
291
363
|
|
|
292
364
|
.dialog.full {
|
|
293
365
|
width: 100%;
|
|
366
|
+
max-width: 100%;
|
|
367
|
+
max-height: 100%;
|
|
294
368
|
margin-top: auto;
|
|
369
|
+
animation: fadeOutFull 0.2s forwards;
|
|
370
|
+
|
|
371
|
+
&[open] {
|
|
372
|
+
animation: fadeInFull 0.2s forwards;
|
|
373
|
+
}
|
|
295
374
|
}
|
|
296
375
|
|
|
297
376
|
.dialog.full,
|
|
298
377
|
.dialog.full .dialog-inner,
|
|
299
378
|
.dialog.full :global(.paper),
|
|
300
|
-
.dialog.full
|
|
379
|
+
.dialog.full .dialog-paper {
|
|
301
380
|
height: 100%;
|
|
302
381
|
}
|
|
303
382
|
|
|
@@ -1,15 +1,34 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
|
-
interface
|
|
2
|
+
export interface DialogContext {
|
|
3
|
+
/** Whether the dialog is currently open (reactive) */
|
|
4
|
+
readonly isOpen: boolean;
|
|
5
|
+
/** Register a callback invoked each time the dialog opens */
|
|
6
|
+
onOpen: (callback: () => void) => void;
|
|
7
|
+
/** Register a callback invoked each time the dialog closes */
|
|
8
|
+
onClose: (callback: () => void) => void;
|
|
9
|
+
/** Register a callback invoked only the first time the dialog opens */
|
|
10
|
+
onFirstOpen: (callback: () => void) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface DialogProps {
|
|
13
|
+
/** Whether the dialog is visible (bindable) */
|
|
3
14
|
show: boolean;
|
|
15
|
+
/** Allow closing by clicking backdrop or pressing Escape */
|
|
4
16
|
allowImplicitClose?: boolean;
|
|
17
|
+
/** Dialog title displayed in the header */
|
|
5
18
|
title?: string | undefined;
|
|
19
|
+
/** Render without the Paper wrapper component */
|
|
6
20
|
noPaper?: boolean;
|
|
21
|
+
/** Prevent content from overflowing the dialog bounds */
|
|
7
22
|
preventOverflow?: boolean;
|
|
23
|
+
/** Size preset for the dialog width */
|
|
8
24
|
size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
25
|
+
/** Additional CSS classes */
|
|
9
26
|
class?: string;
|
|
27
|
+
/** Footer content (typically action buttons) */
|
|
10
28
|
footer?: Snippet;
|
|
29
|
+
/** Main dialog content */
|
|
11
30
|
children?: Snippet;
|
|
12
31
|
}
|
|
13
|
-
declare const Dialog: import("svelte").Component<
|
|
32
|
+
declare const Dialog: import("svelte").Component<DialogProps, {}, "show">;
|
|
14
33
|
type Dialog = ReturnType<typeof Dialog>;
|
|
15
34
|
export default Dialog;
|