@placeholderco/placeholder-ui 1.0.12 → 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 +86 -135
- package/dist/form/Autocomplete.svelte.d.ts +6 -8
- package/dist/form/AutocompleteMulti.svelte +385 -227
- package/dist/form/AutocompleteMulti.svelte.d.ts +59 -10
- package/dist/form/Checkbox.svelte +59 -54
- package/dist/form/Checkbox.svelte.d.ts +14 -5
- package/dist/form/Chips.svelte +29 -13
- package/dist/form/Chips.svelte.d.ts +16 -2
- 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 +148 -195
- package/dist/form/DateRangePicker.svelte +101 -98
- package/dist/form/DateTimePicker.svelte +167 -208
- 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 +70 -47
- package/dist/form/Number.svelte.d.ts +36 -6
- package/dist/form/Radio.svelte +18 -18
- package/dist/form/RadioGroup.svelte +23 -12
- package/dist/form/RadioGroup.svelte.d.ts +13 -2
- package/dist/form/SegmentedControl.svelte +76 -56
- package/dist/form/SegmentedControl.svelte.d.ts +9 -4
- package/dist/form/Select.svelte +150 -233
- package/dist/form/Select.svelte.d.ts +29 -5
- package/dist/form/SelectMulti.svelte +163 -277
- package/dist/form/SelectMulti.svelte.d.ts +36 -7
- package/dist/form/Slider.svelte +183 -269
- package/dist/form/Slider.svelte.d.ts +32 -17
- 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 +49 -29
- package/dist/form/TextArea.svelte.d.ts +23 -3
- package/dist/form/Textbox.svelte +69 -68
- package/dist/form/Textbox.svelte.d.ts +32 -4
- 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/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 -151
- package/dist/icon/index.js +166 -152
- package/dist/icon/logo-placeholder.svg +6 -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/index.d.ts +87 -26
- package/dist/index.js +25 -28
- 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 +161 -129
- package/dist/layout/Navbar.svelte.d.ts +29 -15
- 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 +163 -171
- package/dist/ui/Badge.svelte.d.ts +13 -5
- 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 -111
- package/dist/ui/Dialog.svelte.d.ts +21 -4
- 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 +15 -9
- 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 +28 -30
- package/dist/ui/ProgressBarVariant.d.ts +7 -1
- 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 +383 -80
- package/dist/ui/Table.svelte.d.ts +43 -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/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 -253
- package/dist/form/PasswordInput.svelte.d.ts +0 -34
- 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
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Node, mergeAttributes } from '@tiptap/core';
|
|
2
|
+
export const Span = Node.create({
|
|
3
|
+
name: 'span',
|
|
4
|
+
priority: 100,
|
|
5
|
+
group: 'block',
|
|
6
|
+
content: 'inline*',
|
|
7
|
+
isolating: false,
|
|
8
|
+
defining: false,
|
|
9
|
+
addOptions() {
|
|
10
|
+
return {
|
|
11
|
+
HTMLAttributes: {},
|
|
12
|
+
};
|
|
13
|
+
},
|
|
14
|
+
parseHTML() {
|
|
15
|
+
return [
|
|
16
|
+
{
|
|
17
|
+
tag: 'span',
|
|
18
|
+
priority: 50,
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
},
|
|
22
|
+
renderHTML({ HTMLAttributes }) {
|
|
23
|
+
return ['span', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];
|
|
24
|
+
},
|
|
25
|
+
addAttributes() {
|
|
26
|
+
return {
|
|
27
|
+
class: {
|
|
28
|
+
default: null,
|
|
29
|
+
parseHTML: element => element.getAttribute('class'),
|
|
30
|
+
renderHTML: attributes => {
|
|
31
|
+
if (!attributes.class)
|
|
32
|
+
return {};
|
|
33
|
+
return { class: attributes.class };
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
style: {
|
|
37
|
+
default: null,
|
|
38
|
+
parseHTML: element => element.getAttribute('style'),
|
|
39
|
+
renderHTML: attributes => {
|
|
40
|
+
if (!attributes.style)
|
|
41
|
+
return {};
|
|
42
|
+
return { style: attributes.style };
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
id: {
|
|
46
|
+
default: null,
|
|
47
|
+
parseHTML: element => element.getAttribute('id'),
|
|
48
|
+
renderHTML: attributes => {
|
|
49
|
+
if (!attributes.id)
|
|
50
|
+
return {};
|
|
51
|
+
return { id: attributes.id };
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
});
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/* Styles for the CodeBlockEditor TipTap extension (CodeMirror-powered code blocks).
|
|
2
|
+
Syntax colors target the stable tok-* classes emitted by @lezer/highlight's
|
|
3
|
+
classHighlighter: light palette follows CodeMirror's default highlight style,
|
|
4
|
+
dark palette follows One Dark. Dark mode uses the library's `.dark` root class. */
|
|
5
|
+
|
|
6
|
+
.code-block-editor {
|
|
7
|
+
position: relative;
|
|
8
|
+
margin: 0 0 1em 0;
|
|
9
|
+
border: 1px solid var(--border-color, #dddddd);
|
|
10
|
+
border-radius: 6px;
|
|
11
|
+
background: var(--page-bg, #f7f7f8);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.code-block-editor.ProseMirror-selectednode {
|
|
15
|
+
border-color: var(--ui-tertiary, #40c5b5);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.code-block-editor .cm-editor {
|
|
19
|
+
background: transparent;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.code-block-editor .cm-editor.cm-focused {
|
|
23
|
+
outline: none;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.code-block-editor .cm-editor .cm-scroller {
|
|
27
|
+
font-family: 'Monaco', 'Courier New', monospace;
|
|
28
|
+
font-size: 0.875em;
|
|
29
|
+
line-height: 1.5;
|
|
30
|
+
border-radius: 6px;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.code-block-editor .cm-editor .cm-content {
|
|
34
|
+
padding: 12px 14px;
|
|
35
|
+
caret-color: var(--text-color, #1a1a1a);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.dark .code-block-editor .cm-editor .cm-cursor {
|
|
39
|
+
border-left-color: #e6e6e6;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.dark .code-block-editor .cm-editor .cm-selectionBackground {
|
|
43
|
+
background: rgba(115, 135, 175, 0.35);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.dark .code-block-editor .cm-editor.cm-focused .cm-selectionBackground {
|
|
47
|
+
background: rgba(115, 135, 175, 0.45);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.dark .code-block-editor .cm-editor .cm-matchingBracket {
|
|
51
|
+
background: rgba(255, 255, 255, 0.12);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Language picker */
|
|
55
|
+
.code-block-editor .code-block-language {
|
|
56
|
+
position: absolute;
|
|
57
|
+
top: 6px;
|
|
58
|
+
right: 6px;
|
|
59
|
+
z-index: 2;
|
|
60
|
+
max-width: 40%;
|
|
61
|
+
padding: 2px 6px;
|
|
62
|
+
font-size: 12px;
|
|
63
|
+
border: 1px solid var(--border-color, #dddddd);
|
|
64
|
+
border-radius: 4px;
|
|
65
|
+
background: var(--paper-body-bg, #ffffff);
|
|
66
|
+
color: var(--text-color, #1a1a1a);
|
|
67
|
+
opacity: 0.4;
|
|
68
|
+
transition: opacity 0.15s ease;
|
|
69
|
+
cursor: pointer;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.code-block-editor:hover .code-block-language,
|
|
73
|
+
.code-block-editor .code-block-language:focus {
|
|
74
|
+
opacity: 1;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.code-block-editor .code-block-language:disabled {
|
|
78
|
+
cursor: default;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* Autocomplete tooltip */
|
|
82
|
+
.code-block-editor .cm-tooltip {
|
|
83
|
+
border: 1px solid var(--border-color, #dddddd);
|
|
84
|
+
background: var(--paper-body-bg, #ffffff);
|
|
85
|
+
color: var(--text-color, #1a1a1a);
|
|
86
|
+
border-radius: 4px;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.code-block-editor .cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected] {
|
|
90
|
+
background: var(--ui-tertiary, #40c5b5);
|
|
91
|
+
color: #ffffff;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* Syntax palette — light */
|
|
95
|
+
.code-block-editor .cm-editor .tok-keyword {
|
|
96
|
+
color: #770088;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.code-block-editor .cm-editor .tok-atom,
|
|
100
|
+
.code-block-editor .cm-editor .tok-bool,
|
|
101
|
+
.code-block-editor .cm-editor .tok-url,
|
|
102
|
+
.code-block-editor .cm-editor .tok-labelName {
|
|
103
|
+
color: #221199;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.code-block-editor .cm-editor .tok-literal,
|
|
107
|
+
.code-block-editor .cm-editor .tok-number,
|
|
108
|
+
.code-block-editor .cm-editor .tok-inserted {
|
|
109
|
+
color: #116644;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.code-block-editor .cm-editor .tok-string,
|
|
113
|
+
.code-block-editor .cm-editor .tok-deleted {
|
|
114
|
+
color: #aa1111;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.code-block-editor .cm-editor .tok-string2 {
|
|
118
|
+
color: #ee4400;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.code-block-editor .cm-editor .tok-variableName.tok-definition {
|
|
122
|
+
color: #0000ff;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.code-block-editor .cm-editor .tok-variableName.tok-local {
|
|
126
|
+
color: #3300aa;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.code-block-editor .cm-editor .tok-typeName,
|
|
130
|
+
.code-block-editor .cm-editor .tok-namespace {
|
|
131
|
+
color: #008855;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.code-block-editor .cm-editor .tok-className {
|
|
135
|
+
color: #116677;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.code-block-editor .cm-editor .tok-variableName2,
|
|
139
|
+
.code-block-editor .cm-editor .tok-macroName {
|
|
140
|
+
color: #225566;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.code-block-editor .cm-editor .tok-propertyName {
|
|
144
|
+
color: #0055aa;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.code-block-editor .cm-editor .tok-propertyName.tok-definition {
|
|
148
|
+
color: #0000cc;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.code-block-editor .cm-editor .tok-comment {
|
|
152
|
+
color: #994400;
|
|
153
|
+
font-style: italic;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.code-block-editor .cm-editor .tok-meta {
|
|
157
|
+
color: #7a757a;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.code-block-editor .cm-editor .tok-invalid {
|
|
161
|
+
color: #ff0000;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.code-block-editor .cm-editor .tok-heading {
|
|
165
|
+
font-weight: 700;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.code-block-editor .cm-editor .tok-emphasis {
|
|
169
|
+
font-style: italic;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.code-block-editor .cm-editor .tok-strong {
|
|
173
|
+
font-weight: 700;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.code-block-editor .cm-editor .tok-link {
|
|
177
|
+
text-decoration: underline;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* Syntax palette — dark (One Dark) */
|
|
181
|
+
.dark .code-block-editor .cm-editor .tok-keyword {
|
|
182
|
+
color: #c678dd;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.dark .code-block-editor .cm-editor .tok-atom,
|
|
186
|
+
.dark .code-block-editor .cm-editor .tok-bool,
|
|
187
|
+
.dark .code-block-editor .cm-editor .tok-url,
|
|
188
|
+
.dark .code-block-editor .cm-editor .tok-labelName,
|
|
189
|
+
.dark .code-block-editor .cm-editor .tok-literal,
|
|
190
|
+
.dark .code-block-editor .cm-editor .tok-number {
|
|
191
|
+
color: #d19a66;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.dark .code-block-editor .cm-editor .tok-string,
|
|
195
|
+
.dark .code-block-editor .cm-editor .tok-inserted {
|
|
196
|
+
color: #98c379;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.dark .code-block-editor .cm-editor .tok-string2,
|
|
200
|
+
.dark .code-block-editor .cm-editor .tok-operator {
|
|
201
|
+
color: #56b6c2;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.dark .code-block-editor .cm-editor .tok-deleted {
|
|
205
|
+
color: #e06c75;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.dark .code-block-editor .cm-editor .tok-variableName.tok-definition,
|
|
209
|
+
.dark .code-block-editor .cm-editor .tok-variableName.tok-local,
|
|
210
|
+
.dark .code-block-editor .cm-editor .tok-propertyName.tok-definition {
|
|
211
|
+
color: #61afef;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.dark .code-block-editor .cm-editor .tok-typeName,
|
|
215
|
+
.dark .code-block-editor .cm-editor .tok-namespace,
|
|
216
|
+
.dark .code-block-editor .cm-editor .tok-className {
|
|
217
|
+
color: #e5c07b;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.dark .code-block-editor .cm-editor .tok-variableName2,
|
|
221
|
+
.dark .code-block-editor .cm-editor .tok-macroName,
|
|
222
|
+
.dark .code-block-editor .cm-editor .tok-propertyName {
|
|
223
|
+
color: #e06c75;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.dark .code-block-editor .cm-editor .tok-comment {
|
|
227
|
+
color: #7f848e;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.dark .code-block-editor .cm-editor .tok-meta {
|
|
231
|
+
color: #abb2bf;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.dark .code-block-editor .cm-editor .tok-invalid {
|
|
235
|
+
color: #ff5c57;
|
|
236
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Extension } from '@codemirror/state';
|
|
2
|
+
/** Language identifiers supported by the rich code block editor */
|
|
3
|
+
export type CodeBlockLanguageId = 'plaintext' | 'javascript' | 'typescript' | 'html' | 'css' | 'json' | 'markdown' | 'sql' | 'csharp' | 'powershell';
|
|
4
|
+
export interface CodeBlockLanguageDef {
|
|
5
|
+
/** Value stored in the code block's language attribute and `language-` CSS class */
|
|
6
|
+
id: CodeBlockLanguageId;
|
|
7
|
+
/** Human-readable name shown in the language picker */
|
|
8
|
+
label: string;
|
|
9
|
+
/** Alternative names recognised when parsing existing content (e.g. 'cs' for csharp) */
|
|
10
|
+
aliases: string[];
|
|
11
|
+
/** Factory for the CodeMirror language support (highlighting + completions) */
|
|
12
|
+
load: () => Extension;
|
|
13
|
+
}
|
|
14
|
+
/** All languages available to rich code blocks */
|
|
15
|
+
export declare const codeBlockLanguages: CodeBlockLanguageDef[];
|
|
16
|
+
/** Look up a language definition by id or alias (case-insensitive) */
|
|
17
|
+
export declare function resolveCodeBlockLanguage(language: string | null | undefined): CodeBlockLanguageDef | undefined;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { javascript } from '@codemirror/lang-javascript';
|
|
2
|
+
import { html } from '@codemirror/lang-html';
|
|
3
|
+
import { css } from '@codemirror/lang-css';
|
|
4
|
+
import { json } from '@codemirror/lang-json';
|
|
5
|
+
import { markdown } from '@codemirror/lang-markdown';
|
|
6
|
+
import { sql, MSSQL } from '@codemirror/lang-sql';
|
|
7
|
+
import { LanguageSupport, StreamLanguage } from '@codemirror/language';
|
|
8
|
+
import { completeAnyWord, completeFromList } from '@codemirror/autocomplete';
|
|
9
|
+
import { csharp } from '@codemirror/legacy-modes/mode/clike';
|
|
10
|
+
import { powerShell } from '@codemirror/legacy-modes/mode/powershell';
|
|
11
|
+
// C# and PowerShell have no native CodeMirror 6 packages, so they use legacy stream
|
|
12
|
+
// parsers. Those provide highlighting only, so keyword/cmdlet lists plus word matching
|
|
13
|
+
// stand in for the scope-aware completions the native language packages ship with.
|
|
14
|
+
const CSHARP_KEYWORDS = ('abstract as async await base bool break byte case catch char checked class const continue ' +
|
|
15
|
+
'decimal default delegate do double dynamic else enum event explicit extern false finally fixed ' +
|
|
16
|
+
'float for foreach get global goto if implicit in init int interface internal is lock long ' +
|
|
17
|
+
'nameof namespace new null object operator out override params partial private protected public ' +
|
|
18
|
+
'readonly record ref required return sbyte sealed set short sizeof stackalloc static string ' +
|
|
19
|
+
'struct switch this throw true try typeof uint ulong unchecked unsafe ushort using value var ' +
|
|
20
|
+
'virtual void volatile when where while yield').split(' ');
|
|
21
|
+
const CSHARP_COMMON_TYPES = ('Console Convert DateTime Dictionary Exception Guid IEnumerable IList List Math Nullable ' +
|
|
22
|
+
'Object StringBuilder Task TimeSpan').split(' ');
|
|
23
|
+
const POWERSHELL_KEYWORDS = ('begin break catch class continue data do dynamicparam else elseif end enum exit filter ' +
|
|
24
|
+
'finally for foreach from function hidden if in param process return static switch throw trap ' +
|
|
25
|
+
'try until using var while workflow').split(' ');
|
|
26
|
+
const POWERSHELL_CMDLETS = ('Add-Content Add-Member Clear-Content Clear-Variable Compare-Object ConvertFrom-Json ' +
|
|
27
|
+
'ConvertTo-Json Copy-Item Export-Csv ForEach-Object Format-List Format-Table Get-ChildItem ' +
|
|
28
|
+
'Get-Command Get-Content Get-Date Get-Help Get-Item Get-ItemProperty Get-Location Get-Member ' +
|
|
29
|
+
'Get-Module Get-Process Get-Random Get-Service Get-Variable Group-Object Import-Csv ' +
|
|
30
|
+
'Import-Module Install-Module Invoke-Command Invoke-Expression Invoke-RestMethod ' +
|
|
31
|
+
'Invoke-WebRequest Join-Path Measure-Object Move-Item New-Item New-Object Out-File Out-Null ' +
|
|
32
|
+
'Read-Host Remove-Item Remove-Variable Rename-Item Resolve-Path Restart-Service Select-Object ' +
|
|
33
|
+
'Select-String Set-Content Set-ExecutionPolicy Set-Item Set-Location Set-Variable Sort-Object ' +
|
|
34
|
+
'Split-Path Start-Process Start-Service Start-Sleep Stop-Process Stop-Service Tee-Object ' +
|
|
35
|
+
'Test-Connection Test-Path Wait-Process Where-Object Write-Debug Write-Error Write-Host ' +
|
|
36
|
+
'Write-Output Write-Verbose Write-Warning').split(' ');
|
|
37
|
+
function toCompletions(words, type) {
|
|
38
|
+
return words.map((label) => ({ label, type }));
|
|
39
|
+
}
|
|
40
|
+
function legacySupport(parser, completions) {
|
|
41
|
+
const language = StreamLanguage.define(parser);
|
|
42
|
+
return new LanguageSupport(language, [
|
|
43
|
+
language.data.of({ autocomplete: completeFromList(completions) }),
|
|
44
|
+
language.data.of({ autocomplete: completeAnyWord })
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
47
|
+
/** All languages available to rich code blocks */
|
|
48
|
+
export const codeBlockLanguages = [
|
|
49
|
+
{
|
|
50
|
+
id: 'plaintext',
|
|
51
|
+
label: 'Plain text',
|
|
52
|
+
aliases: ['text', 'plain', 'txt', 'none'],
|
|
53
|
+
load: () => []
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: 'javascript',
|
|
57
|
+
label: 'JavaScript',
|
|
58
|
+
aliases: ['js', 'jsx', 'mjs', 'node'],
|
|
59
|
+
load: () => javascript({ jsx: true })
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'typescript',
|
|
63
|
+
label: 'TypeScript',
|
|
64
|
+
aliases: ['ts', 'tsx'],
|
|
65
|
+
load: () => javascript({ typescript: true, jsx: true })
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: 'html',
|
|
69
|
+
label: 'HTML',
|
|
70
|
+
aliases: ['xml', 'svg', 'markup', 'xhtml'],
|
|
71
|
+
load: () => html()
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'css',
|
|
75
|
+
label: 'CSS',
|
|
76
|
+
aliases: ['scss', 'less'],
|
|
77
|
+
load: () => css()
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: 'json',
|
|
81
|
+
label: 'JSON',
|
|
82
|
+
aliases: ['jsonc'],
|
|
83
|
+
load: () => json()
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: 'markdown',
|
|
87
|
+
label: 'Markdown',
|
|
88
|
+
aliases: ['md'],
|
|
89
|
+
load: () => markdown()
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: 'sql',
|
|
93
|
+
label: 'SQL',
|
|
94
|
+
aliases: ['tsql', 'mssql', 'sqlserver', 'mysql', 'postgres', 'postgresql', 'sqlite', 'plsql'],
|
|
95
|
+
// T-SQL dialect: covers standard SQL plus SQL Server extras
|
|
96
|
+
// ([bracketed] identifiers, @variables, TOP, NVARCHAR, ...)
|
|
97
|
+
load: () => sql({ dialect: MSSQL, upperCaseKeywords: true })
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
id: 'csharp',
|
|
101
|
+
label: 'C#',
|
|
102
|
+
aliases: ['cs', 'c#', 'dotnet'],
|
|
103
|
+
load: () => legacySupport(csharp, [
|
|
104
|
+
...toCompletions(CSHARP_KEYWORDS, 'keyword'),
|
|
105
|
+
...toCompletions(CSHARP_COMMON_TYPES, 'class')
|
|
106
|
+
])
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
id: 'powershell',
|
|
110
|
+
label: 'PowerShell',
|
|
111
|
+
aliases: ['ps', 'ps1', 'pwsh', 'posh'],
|
|
112
|
+
load: () => legacySupport(powerShell, [
|
|
113
|
+
...toCompletions(POWERSHELL_KEYWORDS, 'keyword'),
|
|
114
|
+
...toCompletions(POWERSHELL_CMDLETS, 'function')
|
|
115
|
+
])
|
|
116
|
+
}
|
|
117
|
+
];
|
|
118
|
+
/** Look up a language definition by id or alias (case-insensitive) */
|
|
119
|
+
export function resolveCodeBlockLanguage(language) {
|
|
120
|
+
if (!language)
|
|
121
|
+
return undefined;
|
|
122
|
+
const normalized = language.toLowerCase();
|
|
123
|
+
return codeBlockLanguages.find((def) => def.id === normalized || def.aliases.includes(normalized));
|
|
124
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { Alert } from './Alert.js';
|
|
2
|
+
export { Div } from './Div.js';
|
|
3
|
+
export { Span } from './Span.js';
|
|
4
|
+
export { CodeBlockEditor } from './CodeBlockEditor.js';
|
|
5
|
+
export type { CodeBlockEditorOptions, CodeBlocksOptions } from './CodeBlockEditor.js';
|
|
6
|
+
export { codeBlockLanguages, resolveCodeBlockLanguage } from './codeBlockLanguages.js';
|
|
7
|
+
export type { CodeBlockLanguageDef, CodeBlockLanguageId } from './codeBlockLanguages.js';
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Editor } from '@tiptap/core'
|
|
3
|
+
import ToolbarButton from './ToolbarButton.svelte'
|
|
4
|
+
import { iconAlertTriangle } from '../../../icon/index.js'
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
editor: Editor
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
let { editor }: Props = $props()
|
|
11
|
+
|
|
12
|
+
let showDialog = $state(false)
|
|
13
|
+
let dialogElement: HTMLDivElement | undefined = $state()
|
|
14
|
+
let titleInputElement: HTMLInputElement | undefined = $state()
|
|
15
|
+
let selectedVariant = $state('default')
|
|
16
|
+
let alertTitle = $state('Alert')
|
|
17
|
+
|
|
18
|
+
const variants = [
|
|
19
|
+
{ value: 'default', label: 'Default', color: 'var(--ui-accent)' },
|
|
20
|
+
{ value: 'warning', label: 'Warning', color: '#ffc107' },
|
|
21
|
+
{ value: 'danger', label: 'Danger', color: '#dc3545' }
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
const toggleDialog = () => {
|
|
25
|
+
showDialog = !showDialog
|
|
26
|
+
if (showDialog) {
|
|
27
|
+
// Focus and select the title input when dialog opens
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
titleInputElement?.focus()
|
|
30
|
+
titleInputElement?.select()
|
|
31
|
+
}, 0)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const insertAlert = () => {
|
|
36
|
+
editor
|
|
37
|
+
.chain()
|
|
38
|
+
.focus()
|
|
39
|
+
.setAlert({
|
|
40
|
+
variant: selectedVariant,
|
|
41
|
+
title: alertTitle || 'Alert'
|
|
42
|
+
})
|
|
43
|
+
.run()
|
|
44
|
+
|
|
45
|
+
showDialog = false
|
|
46
|
+
// Reset to defaults
|
|
47
|
+
selectedVariant = 'default'
|
|
48
|
+
alertTitle = 'Alert'
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const closeDialog = () => {
|
|
52
|
+
showDialog = false
|
|
53
|
+
selectedVariant = 'default'
|
|
54
|
+
alertTitle = 'Alert'
|
|
55
|
+
}
|
|
56
|
+
</script>
|
|
57
|
+
|
|
58
|
+
<div style="position: relative; display: inline-block;">
|
|
59
|
+
<ToolbarButton
|
|
60
|
+
icon={iconAlertTriangle}
|
|
61
|
+
title="Insert Alert"
|
|
62
|
+
active={showDialog}
|
|
63
|
+
onclick={toggleDialog}
|
|
64
|
+
/>
|
|
65
|
+
|
|
66
|
+
{#if showDialog}
|
|
67
|
+
<div class="alert-dialog" bind:this={dialogElement}>
|
|
68
|
+
<div class="dialog-header">
|
|
69
|
+
<h4>Insert Alert</h4>
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<div class="dialog-body">
|
|
73
|
+
<div class="form-group">
|
|
74
|
+
<label for="alert-title">Title</label>
|
|
75
|
+
<input
|
|
76
|
+
id="alert-title"
|
|
77
|
+
type="text"
|
|
78
|
+
bind:this={titleInputElement}
|
|
79
|
+
bind:value={alertTitle}
|
|
80
|
+
placeholder="Enter alert title"
|
|
81
|
+
class="form-input"
|
|
82
|
+
/>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
<div class="form-group">
|
|
86
|
+
<label for="alert-variants">Variant</label>
|
|
87
|
+
<div id="alert-variants" class="variant-grid" role="group" aria-label="Alert variant selection">
|
|
88
|
+
{#each variants as variant}
|
|
89
|
+
<button
|
|
90
|
+
class="variant-button"
|
|
91
|
+
class:active={selectedVariant === variant.value}
|
|
92
|
+
style="border-left: 4px solid {variant.color}"
|
|
93
|
+
onclick={() => (selectedVariant = variant.value)}
|
|
94
|
+
type="button"
|
|
95
|
+
>
|
|
96
|
+
{variant.label}
|
|
97
|
+
</button>
|
|
98
|
+
{/each}
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
|
|
103
|
+
<div class="dialog-footer">
|
|
104
|
+
<button class="btn btn-secondary" onclick={closeDialog} type="button">
|
|
105
|
+
Cancel
|
|
106
|
+
</button>
|
|
107
|
+
<button class="btn btn-primary" onclick={insertAlert} type="button">
|
|
108
|
+
Insert
|
|
109
|
+
</button>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
{/if}
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
<style>
|
|
116
|
+
.alert-dialog {
|
|
117
|
+
position: absolute;
|
|
118
|
+
top: 100%;
|
|
119
|
+
right: 0;
|
|
120
|
+
margin-top: 4px;
|
|
121
|
+
display: flex;
|
|
122
|
+
flex-direction: column;
|
|
123
|
+
background: var(--paper-body-bg);
|
|
124
|
+
border: 1px solid var(--border-color);
|
|
125
|
+
border-radius: 6px;
|
|
126
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
127
|
+
z-index: 1000;
|
|
128
|
+
min-width: 300px;
|
|
129
|
+
max-width: 350px;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
:global(.dark) .alert-dialog {
|
|
133
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.dialog-header {
|
|
137
|
+
padding: 12px 16px;
|
|
138
|
+
border-bottom: 1px solid var(--border-color);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.dialog-header h4 {
|
|
142
|
+
margin: 0;
|
|
143
|
+
font-size: 14px;
|
|
144
|
+
font-weight: 600;
|
|
145
|
+
color: var(--text-color);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.dialog-body {
|
|
149
|
+
padding: 16px;
|
|
150
|
+
display: flex;
|
|
151
|
+
flex-direction: column;
|
|
152
|
+
gap: 16px;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.form-group {
|
|
156
|
+
display: flex;
|
|
157
|
+
flex-direction: column;
|
|
158
|
+
gap: 8px;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.form-group label {
|
|
162
|
+
font-size: 12px;
|
|
163
|
+
font-weight: 600;
|
|
164
|
+
color: var(--text-color);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.form-input {
|
|
168
|
+
padding: 8px 12px;
|
|
169
|
+
border: 1px solid var(--border-color);
|
|
170
|
+
border-radius: 4px;
|
|
171
|
+
background: var(--input-bg);
|
|
172
|
+
color: var(--text-color);
|
|
173
|
+
font-size: 13px;
|
|
174
|
+
font-family: inherit;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.form-input:focus {
|
|
178
|
+
outline: none;
|
|
179
|
+
border-color: var(--ui-primary);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
:global(.dark) .form-input:focus {
|
|
183
|
+
border-color: var(--ui-accent);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.variant-grid {
|
|
187
|
+
display: flex;
|
|
188
|
+
flex-direction: column;
|
|
189
|
+
gap: 8px;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.variant-button {
|
|
193
|
+
width: 100%;
|
|
194
|
+
padding: 10px 12px;
|
|
195
|
+
border: 1px solid var(--border-color);
|
|
196
|
+
border-radius: 4px;
|
|
197
|
+
background: var(--paper-body-bg);
|
|
198
|
+
color: var(--text-color);
|
|
199
|
+
font-size: 13px;
|
|
200
|
+
font-weight: 500;
|
|
201
|
+
cursor: pointer;
|
|
202
|
+
transition: all 0.15s ease;
|
|
203
|
+
text-align: left;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.variant-button:hover {
|
|
207
|
+
background: var(--page-bg);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.variant-button.active {
|
|
211
|
+
background: var(--page-bg);
|
|
212
|
+
border-color: var(--ui-primary);
|
|
213
|
+
font-weight: 600;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
:global(.dark) .variant-button.active {
|
|
217
|
+
border-color: var(--ui-accent);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.dialog-footer {
|
|
221
|
+
padding: 12px 16px;
|
|
222
|
+
border-top: 1px solid var(--border-color);
|
|
223
|
+
display: flex;
|
|
224
|
+
gap: 8px;
|
|
225
|
+
justify-content: flex-end;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.btn {
|
|
229
|
+
padding: 6px 16px;
|
|
230
|
+
border: none;
|
|
231
|
+
border-radius: 4px;
|
|
232
|
+
font-size: 13px;
|
|
233
|
+
font-weight: 500;
|
|
234
|
+
cursor: pointer;
|
|
235
|
+
transition: all 0.15s ease;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.btn-secondary {
|
|
239
|
+
background: var(--page-bg);
|
|
240
|
+
color: var(--text-color);
|
|
241
|
+
border: 1px solid var(--border-color);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.btn-secondary:hover {
|
|
245
|
+
background: var(--border-color);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.btn-primary {
|
|
249
|
+
background: var(--ui-primary);
|
|
250
|
+
color: var(--off-white);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.btn-primary:hover {
|
|
254
|
+
opacity: 0.9;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
:global(.dark) .btn-primary {
|
|
258
|
+
background: var(--ui-accent);
|
|
259
|
+
color: var(--ui-primary);
|
|
260
|
+
}
|
|
261
|
+
</style>
|