ui-svelte 0.2.10 → 0.2.12
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/dist/charts/ArcChart.svelte +9 -13
- package/dist/charts/ArcChart.svelte.d.ts +3 -3
- package/dist/charts/AreaChart.svelte +347 -118
- package/dist/charts/AreaChart.svelte.d.ts +33 -4
- package/dist/charts/BarChart.svelte +288 -66
- package/dist/charts/BarChart.svelte.d.ts +26 -1
- package/dist/charts/Candlestick.svelte +53 -50
- package/dist/charts/Candlestick.svelte.d.ts +8 -8
- package/dist/charts/LineChart.svelte +391 -91
- package/dist/charts/LineChart.svelte.d.ts +26 -3
- package/dist/charts/PieChart.svelte +333 -92
- package/dist/charts/PieChart.svelte.d.ts +33 -5
- package/dist/charts/css/arc-chart.css +3 -3
- package/dist/charts/css/area-chart.css +127 -29
- package/dist/charts/css/bar-chart.css +114 -8
- package/dist/charts/css/candlestick.css +2 -0
- package/dist/charts/css/line-chart.css +111 -13
- package/dist/charts/css/pie-chart.css +92 -20
- package/dist/control/Audio.svelte +86 -44
- package/dist/control/Audio.svelte.d.ts +4 -1
- package/dist/control/Button.svelte +18 -27
- package/dist/control/Button.svelte.d.ts +3 -2
- package/dist/control/IconButton.svelte +17 -27
- package/dist/control/IconButton.svelte.d.ts +3 -3
- package/dist/control/Image.svelte +123 -0
- package/dist/control/Image.svelte.d.ts +13 -0
- package/dist/control/Record.svelte +144 -98
- package/dist/control/Record.svelte.d.ts +2 -1
- package/dist/control/ToggleGroup.svelte +22 -8
- package/dist/control/ToggleGroup.svelte.d.ts +2 -1
- package/dist/control/ToggleTheme.svelte +13 -11
- package/dist/control/ToggleTheme.svelte.d.ts +3 -2
- package/dist/control/Video.svelte +55 -29
- package/dist/control/Video.svelte.d.ts +1 -0
- package/dist/control/css/btn.css +200 -152
- package/dist/control/css/image.css +56 -0
- package/dist/control/css/media.css +95 -30
- package/dist/control/css/toggle-group.css +269 -84
- package/dist/control/css/video.css +1 -14
- package/dist/css/animations.css +427 -2
- package/dist/css/base.css +13 -347
- package/dist/css/decorations.css +402 -0
- package/dist/css/rich-text.css +485 -0
- package/dist/css/transitions.css +158 -0
- package/dist/css/typography.css +291 -0
- package/dist/display/Accordion.svelte +28 -4
- package/dist/display/Accordion.svelte.d.ts +2 -1
- package/dist/display/Alert.svelte +32 -12
- package/dist/display/Alert.svelte.d.ts +2 -3
- package/dist/display/Avatar.svelte +54 -26
- package/dist/display/Avatar.svelte.d.ts +7 -1
- package/dist/display/AvatarGroup.svelte +26 -18
- package/dist/display/AvatarGroup.svelte.d.ts +9 -3
- package/dist/display/Badge.svelte +11 -4
- package/dist/display/Badge.svelte.d.ts +2 -1
- package/dist/display/Card.svelte +15 -14
- package/dist/display/Card.svelte.d.ts +2 -3
- package/dist/display/Carousel.svelte +130 -99
- package/dist/display/Carousel.svelte.d.ts +6 -4
- package/dist/display/ChatBox.svelte +245 -106
- package/dist/display/ChatBox.svelte.d.ts +32 -5
- package/dist/display/Chip.svelte +31 -17
- package/dist/display/Chip.svelte.d.ts +3 -2
- package/dist/display/Code.svelte +6 -3
- package/dist/display/Code.svelte.d.ts +1 -0
- package/dist/display/Collapsible.svelte +30 -4
- package/dist/display/Collapsible.svelte.d.ts +2 -1
- package/dist/display/Empty.svelte +37 -3
- package/dist/display/Empty.svelte.d.ts +3 -0
- package/dist/display/Item.svelte +31 -18
- package/dist/display/Item.svelte.d.ts +2 -2
- package/dist/display/Map.svelte +488 -0
- package/dist/display/Map.svelte.d.ts +44 -0
- package/dist/display/Section.svelte +14 -12
- package/dist/display/Section.svelte.d.ts +2 -3
- package/dist/display/Skeleton.svelte +32 -0
- package/dist/display/Skeleton.svelte.d.ts +10 -0
- package/dist/display/Table.svelte +94 -132
- package/dist/display/Table.svelte.d.ts +10 -1
- package/dist/display/css/accordion.css +349 -52
- package/dist/display/css/alert.css +18 -25
- package/dist/display/css/avatar-group.css +38 -44
- package/dist/display/css/avatar.css +152 -123
- package/dist/display/css/badge.css +50 -27
- package/dist/display/css/card.css +51 -71
- package/dist/display/css/carousel.css +25 -5
- package/dist/display/css/chat-box.css +158 -26
- package/dist/display/css/chip.css +142 -68
- package/dist/display/css/code.css +2 -6
- package/dist/display/css/collapsible.css +349 -45
- package/dist/display/css/divider.css +8 -6
- package/dist/display/css/empty.css +7 -0
- package/dist/display/css/item.css +311 -89
- package/dist/display/css/map.css +164 -0
- package/dist/display/css/section.css +78 -33
- package/dist/display/css/skeleton.css +58 -0
- package/dist/display/css/table.css +320 -189
- package/dist/form/Checkbox.svelte +11 -5
- package/dist/form/Checkbox.svelte.d.ts +2 -1
- package/dist/form/ColorField.svelte +543 -0
- package/dist/form/ColorField.svelte.d.ts +29 -0
- package/dist/form/ComboBox.svelte +24 -9
- package/dist/form/ComboBox.svelte.d.ts +2 -2
- package/dist/form/CsvField.svelte +62 -136
- package/dist/form/CsvField.svelte.d.ts +2 -2
- package/dist/form/DateField.svelte +33 -15
- package/dist/form/DateField.svelte.d.ts +2 -1
- package/dist/form/DateRange.svelte +436 -0
- package/dist/form/DateRange.svelte.d.ts +24 -0
- package/dist/form/DragDrop.svelte +348 -0
- package/dist/form/DragDrop.svelte.d.ts +32 -0
- package/dist/form/Dropzone.svelte +28 -8
- package/dist/form/Dropzone.svelte.d.ts +2 -2
- package/dist/form/Editor.svelte +626 -0
- package/dist/form/Editor.svelte.d.ts +50 -0
- package/dist/form/ImageCropper.svelte +291 -61
- package/dist/form/ImageCropper.svelte.d.ts +15 -1
- package/dist/form/PasswordField.svelte +120 -75
- package/dist/form/PasswordField.svelte.d.ts +9 -10
- package/dist/form/PhoneField.svelte +34 -16
- package/dist/form/PhoneField.svelte.d.ts +4 -3
- package/dist/form/PinField.svelte +39 -31
- package/dist/form/PinField.svelte.d.ts +3 -3
- package/dist/form/RadioGroup.svelte +4 -4
- package/dist/form/RadioGroup.svelte.d.ts +1 -1
- package/dist/form/Select.svelte +20 -19
- package/dist/form/Select.svelte.d.ts +2 -2
- package/dist/form/Slider.svelte +4 -2
- package/dist/form/Slider.svelte.d.ts +1 -0
- package/dist/form/TextField.svelte +16 -7
- package/dist/form/TextField.svelte.d.ts +2 -2
- package/dist/form/Textarea.svelte +15 -6
- package/dist/form/Textarea.svelte.d.ts +2 -2
- package/dist/form/Toggle.svelte +11 -1
- package/dist/form/Toggle.svelte.d.ts +2 -0
- package/dist/form/css/checkbox.css +18 -2
- package/dist/form/css/color-field.css +141 -0
- package/dist/form/css/control.css +193 -82
- package/dist/form/css/csv-field.css +226 -0
- package/dist/form/css/date-range.css +122 -0
- package/dist/form/css/date.css +24 -2
- package/dist/form/css/drag-drop.css +271 -0
- package/dist/form/css/dropzone.css +153 -34
- package/dist/form/css/editor.css +367 -0
- package/dist/form/css/field.css +4 -0
- package/dist/form/css/image-cropper.css +223 -22
- package/dist/form/css/password.css +1 -1
- package/dist/form/css/radio-group.css +1 -1
- package/dist/form/css/select.css +2 -2
- package/dist/form/css/slider.css +1 -0
- package/dist/form/css/textarea.css +178 -75
- package/dist/form/css/toggle.css +11 -2
- package/dist/hooks/use-table.svelte.d.ts +1 -0
- package/dist/hooks/use-table.svelte.js +6 -0
- package/dist/icons/index.d.ts +38 -2
- package/dist/icons/index.js +40 -4
- package/dist/index.css +16 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.js +10 -2
- package/dist/layout/AppBar.svelte +22 -14
- package/dist/layout/AppBar.svelte.d.ts +2 -1
- package/dist/layout/Footer.svelte +19 -11
- package/dist/layout/Footer.svelte.d.ts +2 -1
- package/dist/layout/Provider.svelte +27 -4
- package/dist/layout/Provider.svelte.d.ts +3 -1
- package/dist/layout/css/app-bar.css +63 -66
- package/dist/layout/css/footer.css +62 -65
- package/dist/navigation/BottomNav.svelte +41 -13
- package/dist/navigation/FooterGroup.svelte +1 -1
- package/dist/navigation/NavMenu.svelte +47 -23
- package/dist/navigation/NavMenu.svelte.d.ts +29 -0
- package/dist/navigation/Pagination.svelte +158 -0
- package/dist/navigation/Pagination.svelte.d.ts +18 -0
- package/dist/navigation/SideNav.svelte +30 -25
- package/dist/navigation/SideNav.svelte.d.ts +2 -3
- package/dist/navigation/Tabs.svelte +17 -7
- package/dist/navigation/Tabs.svelte.d.ts +2 -2
- package/dist/navigation/css/bottom-nav.css +279 -257
- package/dist/navigation/css/footer-group.css +1 -1
- package/dist/navigation/css/footer-nav.css +1 -1
- package/dist/navigation/css/nav-menu.css +332 -106
- package/dist/navigation/css/pagination.css +74 -0
- package/dist/navigation/css/side-nav.css +515 -75
- package/dist/navigation/css/tabs.css +246 -52
- package/dist/overlay/Command.svelte +340 -0
- package/dist/overlay/Command.svelte.d.ts +24 -25
- package/dist/overlay/Drawer.svelte +49 -21
- package/dist/overlay/Drawer.svelte.d.ts +2 -2
- package/dist/overlay/Dropdown.svelte +4 -5
- package/dist/overlay/Modal.svelte +51 -16
- package/dist/overlay/Modal.svelte.d.ts +3 -3
- package/dist/overlay/Toast.svelte +41 -17
- package/dist/overlay/Toast.svelte.d.ts +1 -1
- package/dist/overlay/Tooltip.svelte +40 -26
- package/dist/overlay/Tooltip.svelte.d.ts +2 -2
- package/dist/overlay/css/command.css +80 -0
- package/dist/overlay/css/drawer.css +63 -24
- package/dist/overlay/css/dropdown.css +1 -1
- package/dist/overlay/css/hovercard.css +1 -1
- package/dist/overlay/css/modal.css +27 -27
- package/dist/overlay/css/toast.css +17 -29
- package/dist/overlay/css/tooltip.css +83 -66
- package/dist/stores/theme.svelte.js +26 -1
- package/dist/stores/toast.svelte.d.ts +4 -4
- package/dist/stores/toast.svelte.js +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,626 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../utils/class-names.js';
|
|
3
|
+
import { Icon, IconButton, type IconData } from '../index.js';
|
|
4
|
+
|
|
5
|
+
const BoldIcon: IconData = {
|
|
6
|
+
body: '<path fill="currentColor" d="M6.8 4h4.9c1.2 0 2.3.4 3.2 1.2c.9.8 1.4 2 1.4 3.2c0 1.1-.4 2.1-1.1 2.9c1 .8 1.6 2.1 1.6 3.4c0 1.4-.5 2.6-1.5 3.5c-1 .9-2.3 1.4-3.6 1.4H6.8c-.3 0-.5-.1-.7-.3c-.2-.2-.3-.4-.3-.7V4.7c0-.3.1-.5.3-.7c.2-.2.4-.3.7-.3zm.7 6.3h4.2c.9 0 1.6-.3 2.2-.8c.5-.5.8-1.2.8-1.9c0-.8-.3-1.5-.8-2c-.6-.5-1.4-.8-2.2-.8H7.5v5.5zm0 1.3v5.5h5c.9 0 1.7-.3 2.4-.9c.6-.5 1-1.3 1-2.1c0-.8-.3-1.6-.9-2.1c-.7-.6-1.6-.9-2.5-.9h-5z"/>',
|
|
7
|
+
viewbox: '0 0 24 24'
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const ItalicIcon: IconData = {
|
|
11
|
+
body: '<path fill="currentColor" d="M10 4.75a.75.75 0 0 1 .75-.75h8.5a.75.75 0 0 1 0 1.5H15.3l-4.6 13h3.55a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5h3.95l4.6-13H10.75a.75.75 0 0 1-.75-.75z"/>',
|
|
12
|
+
viewbox: '0 0 24 24'
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const UnderlineIcon: IconData = {
|
|
16
|
+
body: '<path fill="currentColor" d="M6 4.75a.75.75 0 0 1 1.5 0v6.5a4.5 4.5 0 1 0 9 0v-6.5a.75.75 0 0 1 1.5 0v6.5a6 6 0 0 1-12 0v-6.5zM4.75 19a.75.75 0 0 0 0 1.5h14.5a.75.75 0 0 0 0-1.5H4.75z"/>',
|
|
17
|
+
viewbox: '0 0 24 24'
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const StrikethroughIcon: IconData = {
|
|
21
|
+
body: '<path fill="currentColor" d="M12 3c-2.5 0-4.5 1.5-5.25 3.75a.75.75 0 0 0 1.42.5C8.7 5.65 10.15 4.5 12 4.5c1.6 0 3 .85 3.7 2.15a.75.75 0 0 0 1.32-.7C16.05 4.25 14.15 3 12 3zM3.75 11a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75zm4.78 4.55a.75.75 0 0 0-1.06 1.06c1.17 1.17 2.7 1.89 4.53 1.89c2.5 0 4.5-1.5 5.25-3.75a.75.75 0 0 0-1.42-.5c-.53 1.6-1.98 2.75-3.83 2.75c-1.35 0-2.5-.5-3.47-1.45z"/>',
|
|
22
|
+
viewbox: '0 0 24 24'
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const AlignLeftIcon: IconData = {
|
|
26
|
+
body: '<path fill="currentColor" d="M3.75 4a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75zm0 5a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5H3.75zm0 5a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75zm0 5a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5H3.75z"/>',
|
|
27
|
+
viewbox: '0 0 24 24'
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const AlignCenterIcon: IconData = {
|
|
31
|
+
body: '<path fill="currentColor" d="M3.75 4a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75zm3 5a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5H6.75zm-3 5a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75zm3 5a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5H6.75z"/>',
|
|
32
|
+
viewbox: '0 0 24 24'
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const AlignRightIcon: IconData = {
|
|
36
|
+
body: '<path fill="currentColor" d="M3.75 4a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75zm6 5a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5H9.75zm-6 5a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75zm6 5a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5H9.75z"/>',
|
|
37
|
+
viewbox: '0 0 24 24'
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const AlignJustifyIcon: IconData = {
|
|
41
|
+
body: '<path fill="currentColor" d="M3.75 4a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75zm0 5a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75zm0 5a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75zm0 5a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75z"/>',
|
|
42
|
+
viewbox: '0 0 24 24'
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const ListOrderedIcon: IconData = {
|
|
46
|
+
body: '<path fill="currentColor" d="M3 4.5a.5.5 0 0 0 1 0V3h.5a.5.5 0 0 0 0-1h-1a.5.5 0 0 0-.5.5v2zm5.25-1a.75.75 0 0 0 0 1.5h12a.75.75 0 0 0 0-1.5h-12zM3 8a.5.5 0 0 1 .4-.49l.1-.01h1a.5.5 0 0 1 .09.99l-.09.01h-.55l.6.75a.5.5 0 0 1 .04.54l-.04.06l-.6.75h.55a.5.5 0 0 1 .09.99l-.09.01h-1a.5.5 0 0 1-.4-.8l.7-.87l-.7-.87A.5.5 0 0 1 3 8zm5.25 3.5a.75.75 0 0 0 0 1.5h12a.75.75 0 0 0 0-1.5h-12zM3 16.5a.5.5 0 0 0 1 0V15h.5a.5.5 0 0 0 0-1h-1a.5.5 0 0 0-.5.5v.75h-.25a.5.5 0 0 0 0 1H3v.25zm5.25 3a.75.75 0 0 0 0 1.5h12a.75.75 0 0 0 0-1.5h-12z"/>',
|
|
47
|
+
viewbox: '0 0 24 24'
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const ListUnorderedIcon: IconData = {
|
|
51
|
+
body: '<path fill="currentColor" d="M4 4a1 1 0 1 0 0 2a1 1 0 0 0 0-2zm4.25-.5a.75.75 0 0 0 0 1.5h12a.75.75 0 0 0 0-1.5h-12zM4 11a1 1 0 1 0 0 2a1 1 0 0 0 0-2zm4.25-.5a.75.75 0 0 0 0 1.5h12a.75.75 0 0 0 0-1.5h-12zM4 18a1 1 0 1 0 0 2a1 1 0 0 0 0-2zm4.25-.5a.75.75 0 0 0 0 1.5h12a.75.75 0 0 0 0-1.5h-12z"/>',
|
|
52
|
+
viewbox: '0 0 24 24'
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const Heading1Icon: IconData = {
|
|
56
|
+
body: '<path fill="currentColor" d="M4.75 4a.75.75 0 0 1 .75.75v5.5h6v-5.5a.75.75 0 0 1 1.5 0v13.5a.75.75 0 0 1-1.5 0v-6.5h-6v6.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 4.75 4zm11 3a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-1.5 0v-9.2l-1.17.78a.75.75 0 1 1-.83-1.25l2.25-1.5a.75.75 0 0 1 .5-.08z"/>',
|
|
57
|
+
viewbox: '0 0 24 24'
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const Heading2Icon: IconData = {
|
|
61
|
+
body: '<path fill="currentColor" d="M4.75 4a.75.75 0 0 1 .75.75v5.5h6v-5.5a.75.75 0 0 1 1.5 0v13.5a.75.75 0 0 1-1.5 0v-6.5h-6v6.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 4.75 4zm10.5 3a2.75 2.75 0 0 1 2.75 2.75a.75.75 0 0 1-1.5 0c0-.69-.56-1.25-1.25-1.25s-1.25.56-1.25 1.25c0 .5.22.9.6 1.3l.17.16l3.58 3.19c.57.5.9 1.23.9 2c0 1.52-1.23 2.85-2.75 2.85h-2.25a.75.75 0 0 1 0-1.5h2.25c.69 0 1.25-.59 1.25-1.35c0-.37-.15-.7-.4-.93l-3.58-3.19A3.14 3.14 0 0 1 12.5 9.75A2.75 2.75 0 0 1 15.25 7z"/>',
|
|
62
|
+
viewbox: '0 0 24 24'
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const Heading3Icon: IconData = {
|
|
66
|
+
body: '<path fill="currentColor" d="M4.75 4a.75.75 0 0 1 .75.75v5.5h6v-5.5a.75.75 0 0 1 1.5 0v13.5a.75.75 0 0 1-1.5 0v-6.5h-6v6.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 4.75 4zM15.5 7a2.5 2.5 0 0 1 2.5 2.5a.75.75 0 0 1-1.5 0a1 1 0 0 0-2 0c0 .28.11.53.3.71l.12.1l1.08.69a.75.75 0 0 1-.4 1.38l-.1.01h-.68l.15.1c.22.2.53.51.53 1.01a1 1 0 0 0 2 0a.75.75 0 0 1 1.5 0a2.5 2.5 0 0 1-5 0c0-.52.2-1 .52-1.35l.12-.12l-.08-.05a2.5 2.5 0 0 1-.56-3.42A2.5 2.5 0 0 1 15.5 7z"/>',
|
|
67
|
+
viewbox: '0 0 24 24'
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const LinkIcon: IconData = {
|
|
71
|
+
body: '<path fill="currentColor" d="M9.25 7a.75.75 0 0 1 .11 1.492l-.11.008H7a3.5 3.5 0 0 0-.206 6.994L7 15.5h2.25a.75.75 0 0 1 .11 1.492L9.25 17H7a5 5 0 0 1-.25-9.994L7 7h2.25zM17 7a5 5 0 0 1 .25 9.994L17 17h-2.25a.75.75 0 0 1-.11-1.492l.11-.008H17a3.5 3.5 0 0 0 .206-6.994L17 8.5h-2.25a.75.75 0 0 1-.11-1.492L14.75 7H17zM7 11.25h10a.75.75 0 0 1 .102 1.493L17 12.75H7a.75.75 0 0 1-.102-1.493L7 11.25z"/>',
|
|
72
|
+
viewbox: '0 0 24 24'
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const ImageIcon: IconData = {
|
|
76
|
+
body: '<path fill="currentColor" d="M18.75 3A3.25 3.25 0 0 1 22 6.25v11.5A3.25 3.25 0 0 1 18.75 21H5.25A3.25 3.25 0 0 1 2 17.75V6.25A3.25 3.25 0 0 1 5.25 3h13.5zm0 1.5H5.25A1.75 1.75 0 0 0 3.5 6.25v11.5c0 .208.036.408.103.594l5.823-5.701a1.75 1.75 0 0 1 2.33-.103l.118.103l5.822 5.701c.067-.186.103-.386.103-.594V6.25a1.75 1.75 0 0 0-1.75-1.75zm-4.75 3a2.5 2.5 0 1 1 0 5a2.5 2.5 0 0 1 0-5zm0 1.5a1 1 0 1 0 0 2a1 1 0 0 0 0-2z"/>',
|
|
77
|
+
viewbox: '0 0 24 24'
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const QuoteIcon: IconData = {
|
|
81
|
+
body: '<path fill="currentColor" d="M7.5 6A3.5 3.5 0 0 0 4 9.5v.5h1.5a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2h-2a2 2 0 0 1-2-2v-4.5A5 5 0 0 1 6.5 4.5L7 4.3a.75.75 0 0 1 .5 1.41l-.5.17A3.5 3.5 0 0 0 7.5 6zm10 0A3.5 3.5 0 0 0 14 9.5v.5h1.5a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2h-2a2 2 0 0 1-2-2v-4.5a5 5 0 0 1 5-5l.5-.2a.75.75 0 1 1 .5 1.41l-.5.17A3.5 3.5 0 0 0 17.5 6z"/>',
|
|
82
|
+
viewbox: '0 0 24 24'
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const HorizontalRuleIcon: IconData = {
|
|
86
|
+
body: '<path fill="currentColor" d="M3.75 11.25a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75z"/>',
|
|
87
|
+
viewbox: '0 0 24 24'
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const UndoIcon: IconData = {
|
|
91
|
+
body: '<path fill="currentColor" d="M7.25 3.5a.75.75 0 0 0-1.228-.577l-5.25 4.25a.75.75 0 0 0 0 1.154l5.25 4.25a.75.75 0 0 0 1.228-.577V9.5h8a4.5 4.5 0 1 1 0 9h-4.5a.75.75 0 0 0 0 1.5h4.5a6 6 0 0 0 0-12h-8V3.5z"/>',
|
|
92
|
+
viewbox: '0 0 24 24'
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const RedoIcon: IconData = {
|
|
96
|
+
body: '<path fill="currentColor" d="M16.75 3.5a.75.75 0 0 1 1.228-.577l5.25 4.25a.75.75 0 0 1 0 1.154l-5.25 4.25a.75.75 0 0 1-1.228-.577V9.5h-8a4.5 4.5 0 1 0 0 9h4.5a.75.75 0 0 1 0 1.5h-4.5a6 6 0 0 1 0-12h8V3.5z"/>',
|
|
97
|
+
viewbox: '0 0 24 24'
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const ClearFormattingIcon: IconData = {
|
|
101
|
+
body: '<path fill="currentColor" d="M3.28 2.22a.75.75 0 0 0-1.06 1.06l18.5 18.5a.75.75 0 1 0 1.06-1.06L3.28 2.22zM8.5 4h7.75a.75.75 0 0 1 0 1.5h-3.16l-1.23 2.87l1.14 1.14l1.23-2.87l2.12 1.06l.89-.45L8.5 4zM7.25 19H10l-.64-1.5H7.25a.75.75 0 0 1 0-1.5h.61l-2-2H7.25l2.84 2.84L11.5 14.5h1.61l.64 1.5h1.5L13 12.19l-1.72 1.72L7.25 19z"/>',
|
|
102
|
+
viewbox: '0 0 24 24'
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const CodeIcon: IconData = {
|
|
106
|
+
body: '<path fill="currentColor" d="M8.066 5.152a.75.75 0 0 1 .282 1.022l-5.001 9a.75.75 0 1 1-1.312-.728l5.001-9a.75.75 0 0 1 1.03-.294m7.87-.002a.75.75 0 0 1 1.03.294l5 9a.75.75 0 1 1-1.312.728l-5-9a.75.75 0 0 1 .282-1.022m-6.186.472a.75.75 0 0 1 .528.918l-3 11a.75.75 0 0 1-1.446-.394l3-11a.75.75 0 0 1 .918-.524"/>',
|
|
107
|
+
viewbox: '0 0 24 24'
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
type EditorLabels = {
|
|
111
|
+
bold?: string;
|
|
112
|
+
italic?: string;
|
|
113
|
+
underline?: string;
|
|
114
|
+
strikethrough?: string;
|
|
115
|
+
alignLeft?: string;
|
|
116
|
+
alignCenter?: string;
|
|
117
|
+
alignRight?: string;
|
|
118
|
+
justify?: string;
|
|
119
|
+
orderedList?: string;
|
|
120
|
+
unorderedList?: string;
|
|
121
|
+
heading1?: string;
|
|
122
|
+
heading2?: string;
|
|
123
|
+
heading3?: string;
|
|
124
|
+
insertLink?: string;
|
|
125
|
+
insertImage?: string;
|
|
126
|
+
quote?: string;
|
|
127
|
+
code?: string;
|
|
128
|
+
horizontalRule?: string;
|
|
129
|
+
undo?: string;
|
|
130
|
+
redo?: string;
|
|
131
|
+
clearFormatting?: string;
|
|
132
|
+
linkPrompt?: string;
|
|
133
|
+
imagePrompt?: string;
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
const defaultLabels: EditorLabels = {
|
|
137
|
+
bold: 'Bold (Ctrl+B)',
|
|
138
|
+
italic: 'Italic (Ctrl+I)',
|
|
139
|
+
underline: 'Underline (Ctrl+U)',
|
|
140
|
+
strikethrough: 'Strikethrough',
|
|
141
|
+
alignLeft: 'Align left',
|
|
142
|
+
alignCenter: 'Align center',
|
|
143
|
+
alignRight: 'Align right',
|
|
144
|
+
justify: 'Justify',
|
|
145
|
+
orderedList: 'Ordered list',
|
|
146
|
+
unorderedList: 'Unordered list',
|
|
147
|
+
heading1: 'Heading 1',
|
|
148
|
+
heading2: 'Heading 2',
|
|
149
|
+
heading3: 'Heading 3',
|
|
150
|
+
insertLink: 'Insert link',
|
|
151
|
+
insertImage: 'Insert image',
|
|
152
|
+
quote: 'Quote',
|
|
153
|
+
code: 'Code',
|
|
154
|
+
horizontalRule: 'Horizontal rule',
|
|
155
|
+
undo: 'Undo (Ctrl+Z)',
|
|
156
|
+
redo: 'Redo (Ctrl+Shift+Z)',
|
|
157
|
+
clearFormatting: 'Clear formatting',
|
|
158
|
+
linkPrompt: 'Enter the link URL:',
|
|
159
|
+
imagePrompt: 'Enter the image URL:'
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
type Props = {
|
|
163
|
+
el?: HTMLDivElement;
|
|
164
|
+
value?: string;
|
|
165
|
+
placeholder?: string;
|
|
166
|
+
class?: string;
|
|
167
|
+
controlClass?: string;
|
|
168
|
+
onchange?: (value: string) => void;
|
|
169
|
+
oninput?: (value: string) => void;
|
|
170
|
+
color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
|
|
171
|
+
variant?: 'soft' | 'solid' | 'outlined' | 'line';
|
|
172
|
+
size?: 'sm' | 'md' | 'lg';
|
|
173
|
+
name?: string;
|
|
174
|
+
label?: string;
|
|
175
|
+
islabelActive?: boolean;
|
|
176
|
+
helpText?: string;
|
|
177
|
+
errorText?: string;
|
|
178
|
+
minHeight?: string;
|
|
179
|
+
isDisabled?: boolean;
|
|
180
|
+
isReadonly?: boolean;
|
|
181
|
+
hideToolbar?: boolean;
|
|
182
|
+
labels?: EditorLabels;
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
let {
|
|
186
|
+
el = $bindable(),
|
|
187
|
+
value = $bindable(''),
|
|
188
|
+
placeholder = '',
|
|
189
|
+
class: className,
|
|
190
|
+
controlClass,
|
|
191
|
+
onchange,
|
|
192
|
+
oninput,
|
|
193
|
+
variant = 'outlined',
|
|
194
|
+
color = 'muted',
|
|
195
|
+
size = 'md',
|
|
196
|
+
name,
|
|
197
|
+
label,
|
|
198
|
+
islabelActive,
|
|
199
|
+
helpText,
|
|
200
|
+
errorText,
|
|
201
|
+
minHeight = '200px',
|
|
202
|
+
isDisabled = false,
|
|
203
|
+
isReadonly = false,
|
|
204
|
+
hideToolbar = false,
|
|
205
|
+
labels: userLabels = {}
|
|
206
|
+
}: Props = $props();
|
|
207
|
+
|
|
208
|
+
const labels = $derived({ ...defaultLabels, ...userLabels });
|
|
209
|
+
|
|
210
|
+
const uid = $props.id();
|
|
211
|
+
|
|
212
|
+
let contentEl: HTMLDivElement;
|
|
213
|
+
let isActive = $state(false);
|
|
214
|
+
let isFocused = $state(false);
|
|
215
|
+
let activeFormats = $state<Set<string>>(new Set());
|
|
216
|
+
|
|
217
|
+
const colors = {
|
|
218
|
+
primary: 'is-primary',
|
|
219
|
+
secondary: 'is-secondary',
|
|
220
|
+
muted: 'is-muted',
|
|
221
|
+
success: 'is-success',
|
|
222
|
+
info: 'is-info',
|
|
223
|
+
danger: 'is-danger',
|
|
224
|
+
warning: 'is-warning'
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
const variants = {
|
|
228
|
+
soft: 'is-soft',
|
|
229
|
+
solid: 'is-solid',
|
|
230
|
+
outlined: 'is-outlined',
|
|
231
|
+
line: 'is-line'
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
const sizeClasses = {
|
|
235
|
+
sm: 'is-sm',
|
|
236
|
+
md: 'is-md',
|
|
237
|
+
lg: 'is-lg'
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
function execCommand(command: string, value?: string) {
|
|
241
|
+
document.execCommand(command, false, value);
|
|
242
|
+
contentEl?.focus();
|
|
243
|
+
updateActiveFormats();
|
|
244
|
+
handleInput();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function handleBold() {
|
|
248
|
+
execCommand('bold');
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function handleItalic() {
|
|
252
|
+
execCommand('italic');
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function handleUnderline() {
|
|
256
|
+
execCommand('underline');
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function handleStrikethrough() {
|
|
260
|
+
execCommand('strikeThrough');
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function handleAlignLeft() {
|
|
264
|
+
execCommand('justifyLeft');
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function handleAlignCenter() {
|
|
268
|
+
execCommand('justifyCenter');
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function handleAlignRight() {
|
|
272
|
+
execCommand('justifyRight');
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function handleAlignJustify() {
|
|
276
|
+
execCommand('justifyFull');
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function handleOrderedList() {
|
|
280
|
+
execCommand('insertOrderedList');
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
function handleUnorderedList() {
|
|
284
|
+
execCommand('insertUnorderedList');
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function handleHeading(level: number) {
|
|
288
|
+
execCommand('formatBlock', `h${level}`);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function handleLink() {
|
|
292
|
+
const url = prompt(labels.linkPrompt);
|
|
293
|
+
if (url) {
|
|
294
|
+
execCommand('createLink', url);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function handleImage() {
|
|
299
|
+
const url = prompt(labels.imagePrompt);
|
|
300
|
+
if (url) {
|
|
301
|
+
execCommand('insertImage', url);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function handleQuote() {
|
|
306
|
+
execCommand('formatBlock', 'blockquote');
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function handleHorizontalRule() {
|
|
310
|
+
execCommand('insertHorizontalRule');
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function handleCode() {
|
|
314
|
+
execCommand('formatBlock', 'pre');
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function handleUndo() {
|
|
318
|
+
execCommand('undo');
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function handleRedo() {
|
|
322
|
+
execCommand('redo');
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function handleClearFormatting() {
|
|
326
|
+
execCommand('removeFormat');
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
function updateActiveFormats() {
|
|
330
|
+
const formats = new Set<string>();
|
|
331
|
+
|
|
332
|
+
if (document.queryCommandState('bold')) formats.add('bold');
|
|
333
|
+
if (document.queryCommandState('italic')) formats.add('italic');
|
|
334
|
+
if (document.queryCommandState('underline')) formats.add('underline');
|
|
335
|
+
if (document.queryCommandState('strikeThrough')) formats.add('strikethrough');
|
|
336
|
+
if (document.queryCommandState('insertOrderedList')) formats.add('orderedList');
|
|
337
|
+
if (document.queryCommandState('insertUnorderedList')) formats.add('unorderedList');
|
|
338
|
+
|
|
339
|
+
activeFormats = formats;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function handleInput() {
|
|
343
|
+
if (contentEl) {
|
|
344
|
+
value = contentEl.innerHTML;
|
|
345
|
+
oninput?.(value);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function handleChange() {
|
|
350
|
+
if (contentEl) {
|
|
351
|
+
value = contentEl.innerHTML;
|
|
352
|
+
onchange?.(value);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function handleKeydown(e: KeyboardEvent) {
|
|
357
|
+
if (e.ctrlKey || e.metaKey) {
|
|
358
|
+
switch (e.key.toLowerCase()) {
|
|
359
|
+
case 'b':
|
|
360
|
+
e.preventDefault();
|
|
361
|
+
handleBold();
|
|
362
|
+
break;
|
|
363
|
+
case 'i':
|
|
364
|
+
e.preventDefault();
|
|
365
|
+
handleItalic();
|
|
366
|
+
break;
|
|
367
|
+
case 'u':
|
|
368
|
+
e.preventDefault();
|
|
369
|
+
handleUnderline();
|
|
370
|
+
break;
|
|
371
|
+
case 'z':
|
|
372
|
+
if (e.shiftKey) {
|
|
373
|
+
e.preventDefault();
|
|
374
|
+
handleRedo();
|
|
375
|
+
} else {
|
|
376
|
+
e.preventDefault();
|
|
377
|
+
handleUndo();
|
|
378
|
+
}
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
function handlePaste(e: ClipboardEvent) {
|
|
385
|
+
e.preventDefault();
|
|
386
|
+
const text = e.clipboardData?.getData('text/plain') || '';
|
|
387
|
+
document.execCommand('insertText', false, text);
|
|
388
|
+
handleInput();
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
$effect(() => {
|
|
392
|
+
if (contentEl && value !== contentEl.innerHTML) {
|
|
393
|
+
contentEl.innerHTML = value;
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
type ToolbarButton = {
|
|
398
|
+
icon: IconData;
|
|
399
|
+
action: () => void;
|
|
400
|
+
title: string;
|
|
401
|
+
formatKey?: string;
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
const formattingButtons = $derived<ToolbarButton[]>([
|
|
405
|
+
{ icon: BoldIcon, action: handleBold, title: labels.bold!, formatKey: 'bold' },
|
|
406
|
+
{ icon: ItalicIcon, action: handleItalic, title: labels.italic!, formatKey: 'italic' },
|
|
407
|
+
{
|
|
408
|
+
icon: UnderlineIcon,
|
|
409
|
+
action: handleUnderline,
|
|
410
|
+
title: labels.underline!,
|
|
411
|
+
formatKey: 'underline'
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
icon: StrikethroughIcon,
|
|
415
|
+
action: handleStrikethrough,
|
|
416
|
+
title: labels.strikethrough!,
|
|
417
|
+
formatKey: 'strikethrough'
|
|
418
|
+
}
|
|
419
|
+
]);
|
|
420
|
+
|
|
421
|
+
const alignmentButtons = $derived<ToolbarButton[]>([
|
|
422
|
+
{ icon: AlignLeftIcon, action: handleAlignLeft, title: labels.alignLeft! },
|
|
423
|
+
{ icon: AlignCenterIcon, action: handleAlignCenter, title: labels.alignCenter! },
|
|
424
|
+
{ icon: AlignRightIcon, action: handleAlignRight, title: labels.alignRight! },
|
|
425
|
+
{ icon: AlignJustifyIcon, action: handleAlignJustify, title: labels.justify! }
|
|
426
|
+
]);
|
|
427
|
+
|
|
428
|
+
const listButtons = $derived<ToolbarButton[]>([
|
|
429
|
+
{
|
|
430
|
+
icon: ListOrderedIcon,
|
|
431
|
+
action: handleOrderedList,
|
|
432
|
+
title: labels.orderedList!,
|
|
433
|
+
formatKey: 'orderedList'
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
icon: ListUnorderedIcon,
|
|
437
|
+
action: handleUnorderedList,
|
|
438
|
+
title: labels.unorderedList!,
|
|
439
|
+
formatKey: 'unorderedList'
|
|
440
|
+
}
|
|
441
|
+
]);
|
|
442
|
+
|
|
443
|
+
const headingButtons = $derived<ToolbarButton[]>([
|
|
444
|
+
{ icon: Heading1Icon, action: () => handleHeading(1), title: labels.heading1! },
|
|
445
|
+
{ icon: Heading2Icon, action: () => handleHeading(2), title: labels.heading2! },
|
|
446
|
+
{ icon: Heading3Icon, action: () => handleHeading(3), title: labels.heading3! }
|
|
447
|
+
]);
|
|
448
|
+
|
|
449
|
+
const insertButtons = $derived<ToolbarButton[]>([
|
|
450
|
+
{ icon: LinkIcon, action: handleLink, title: labels.insertLink! },
|
|
451
|
+
{ icon: ImageIcon, action: handleImage, title: labels.insertImage! },
|
|
452
|
+
{ icon: QuoteIcon, action: handleQuote, title: labels.quote! },
|
|
453
|
+
{ icon: CodeIcon, action: handleCode, title: labels.code! },
|
|
454
|
+
{ icon: HorizontalRuleIcon, action: handleHorizontalRule, title: labels.horizontalRule! }
|
|
455
|
+
]);
|
|
456
|
+
|
|
457
|
+
const historyButtons = $derived<ToolbarButton[]>([
|
|
458
|
+
{ icon: UndoIcon, action: handleUndo, title: labels.undo! },
|
|
459
|
+
{ icon: RedoIcon, action: handleRedo, title: labels.redo! },
|
|
460
|
+
{ icon: ClearFormattingIcon, action: handleClearFormatting, title: labels.clearFormatting! }
|
|
461
|
+
]);
|
|
462
|
+
|
|
463
|
+
const showPlaceholder = $derived(!value || value === '' || value === '<br>');
|
|
464
|
+
</script>
|
|
465
|
+
|
|
466
|
+
<div class={cn('field', className)}>
|
|
467
|
+
{#if label}
|
|
468
|
+
<span class="field-label">{label}</span>
|
|
469
|
+
{/if}
|
|
470
|
+
|
|
471
|
+
<div
|
|
472
|
+
bind:this={el}
|
|
473
|
+
role="group"
|
|
474
|
+
class={cn(
|
|
475
|
+
'editor',
|
|
476
|
+
colors[color],
|
|
477
|
+
variants[variant],
|
|
478
|
+
sizeClasses[size],
|
|
479
|
+
(isActive || isFocused) && 'is-active',
|
|
480
|
+
isDisabled && 'is-disabled',
|
|
481
|
+
isReadonly && 'is-readonly',
|
|
482
|
+
controlClass
|
|
483
|
+
)}
|
|
484
|
+
class:is-error={errorText}
|
|
485
|
+
onmouseenter={() => (isActive = true)}
|
|
486
|
+
onmouseleave={() => (isActive = false)}
|
|
487
|
+
>
|
|
488
|
+
{#if !hideToolbar && !isReadonly}
|
|
489
|
+
<div class="editor-toolbar">
|
|
490
|
+
<div class="editor-toolbar-group">
|
|
491
|
+
{#each formattingButtons as btn}
|
|
492
|
+
<button
|
|
493
|
+
type="button"
|
|
494
|
+
class={cn(
|
|
495
|
+
'editor-toolbar-btn',
|
|
496
|
+
activeFormats.has(btn.formatKey || '') && 'is-active'
|
|
497
|
+
)}
|
|
498
|
+
onclick={btn.action}
|
|
499
|
+
title={btn.title}
|
|
500
|
+
disabled={isDisabled}
|
|
501
|
+
>
|
|
502
|
+
<Icon icon={btn.icon} />
|
|
503
|
+
</button>
|
|
504
|
+
{/each}
|
|
505
|
+
</div>
|
|
506
|
+
|
|
507
|
+
<div class="editor-toolbar-divider"></div>
|
|
508
|
+
|
|
509
|
+
<div class="editor-toolbar-group">
|
|
510
|
+
{#each alignmentButtons as btn}
|
|
511
|
+
<button
|
|
512
|
+
type="button"
|
|
513
|
+
class="editor-toolbar-btn"
|
|
514
|
+
onclick={btn.action}
|
|
515
|
+
title={btn.title}
|
|
516
|
+
disabled={isDisabled}
|
|
517
|
+
>
|
|
518
|
+
<Icon icon={btn.icon} />
|
|
519
|
+
</button>
|
|
520
|
+
{/each}
|
|
521
|
+
</div>
|
|
522
|
+
|
|
523
|
+
<div class="editor-toolbar-divider"></div>
|
|
524
|
+
|
|
525
|
+
<div class="editor-toolbar-group">
|
|
526
|
+
{#each listButtons as btn}
|
|
527
|
+
<button
|
|
528
|
+
type="button"
|
|
529
|
+
class={cn(
|
|
530
|
+
'editor-toolbar-btn',
|
|
531
|
+
activeFormats.has(btn.formatKey || '') && 'is-active'
|
|
532
|
+
)}
|
|
533
|
+
onclick={btn.action}
|
|
534
|
+
title={btn.title}
|
|
535
|
+
disabled={isDisabled}
|
|
536
|
+
>
|
|
537
|
+
<Icon icon={btn.icon} />
|
|
538
|
+
</button>
|
|
539
|
+
{/each}
|
|
540
|
+
</div>
|
|
541
|
+
|
|
542
|
+
<div class="editor-toolbar-divider"></div>
|
|
543
|
+
|
|
544
|
+
<div class="editor-toolbar-group">
|
|
545
|
+
{#each headingButtons as btn}
|
|
546
|
+
<button
|
|
547
|
+
type="button"
|
|
548
|
+
class="editor-toolbar-btn"
|
|
549
|
+
onclick={btn.action}
|
|
550
|
+
title={btn.title}
|
|
551
|
+
disabled={isDisabled}
|
|
552
|
+
>
|
|
553
|
+
<Icon icon={btn.icon} />
|
|
554
|
+
</button>
|
|
555
|
+
{/each}
|
|
556
|
+
</div>
|
|
557
|
+
|
|
558
|
+
<div class="editor-toolbar-divider"></div>
|
|
559
|
+
|
|
560
|
+
<div class="editor-toolbar-group">
|
|
561
|
+
{#each insertButtons as btn}
|
|
562
|
+
<button
|
|
563
|
+
type="button"
|
|
564
|
+
class="editor-toolbar-btn"
|
|
565
|
+
onclick={btn.action}
|
|
566
|
+
title={btn.title}
|
|
567
|
+
disabled={isDisabled}
|
|
568
|
+
>
|
|
569
|
+
<Icon icon={btn.icon} />
|
|
570
|
+
</button>
|
|
571
|
+
{/each}
|
|
572
|
+
</div>
|
|
573
|
+
|
|
574
|
+
<div class="editor-toolbar-divider"></div>
|
|
575
|
+
|
|
576
|
+
<div class="editor-toolbar-group">
|
|
577
|
+
{#each historyButtons as btn}
|
|
578
|
+
<button
|
|
579
|
+
type="button"
|
|
580
|
+
class="editor-toolbar-btn"
|
|
581
|
+
onclick={btn.action}
|
|
582
|
+
title={btn.title}
|
|
583
|
+
disabled={isDisabled}
|
|
584
|
+
>
|
|
585
|
+
<Icon icon={btn.icon} />
|
|
586
|
+
</button>
|
|
587
|
+
{/each}
|
|
588
|
+
</div>
|
|
589
|
+
</div>
|
|
590
|
+
{/if}
|
|
591
|
+
|
|
592
|
+
<div class="editor-content-wrapper">
|
|
593
|
+
{#if showPlaceholder && placeholder}
|
|
594
|
+
<div class="editor-placeholder">{placeholder}</div>
|
|
595
|
+
{/if}
|
|
596
|
+
<div
|
|
597
|
+
bind:this={contentEl}
|
|
598
|
+
id={`${uid}-${name}`}
|
|
599
|
+
class="editor-content"
|
|
600
|
+
style:min-height={minHeight}
|
|
601
|
+
contenteditable={!isDisabled && !isReadonly}
|
|
602
|
+
tabindex="0"
|
|
603
|
+
role="textbox"
|
|
604
|
+
aria-multiline="true"
|
|
605
|
+
aria-placeholder={placeholder}
|
|
606
|
+
oninput={handleInput}
|
|
607
|
+
onblur={handleChange}
|
|
608
|
+
onfocusin={() => {
|
|
609
|
+
isFocused = true;
|
|
610
|
+
updateActiveFormats();
|
|
611
|
+
}}
|
|
612
|
+
onfocusout={() => (isFocused = false)}
|
|
613
|
+
onkeydown={handleKeydown}
|
|
614
|
+
onkeyup={updateActiveFormats}
|
|
615
|
+
onmouseup={updateActiveFormats}
|
|
616
|
+
onpaste={handlePaste}
|
|
617
|
+
></div>
|
|
618
|
+
</div>
|
|
619
|
+
</div>
|
|
620
|
+
|
|
621
|
+
{#if errorText || helpText}
|
|
622
|
+
<div class={cn('field-help', errorText && 'is-danger')}>
|
|
623
|
+
{errorText || helpText}
|
|
624
|
+
</div>
|
|
625
|
+
{/if}
|
|
626
|
+
</div>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
type EditorLabels = {
|
|
2
|
+
bold?: string;
|
|
3
|
+
italic?: string;
|
|
4
|
+
underline?: string;
|
|
5
|
+
strikethrough?: string;
|
|
6
|
+
alignLeft?: string;
|
|
7
|
+
alignCenter?: string;
|
|
8
|
+
alignRight?: string;
|
|
9
|
+
justify?: string;
|
|
10
|
+
orderedList?: string;
|
|
11
|
+
unorderedList?: string;
|
|
12
|
+
heading1?: string;
|
|
13
|
+
heading2?: string;
|
|
14
|
+
heading3?: string;
|
|
15
|
+
insertLink?: string;
|
|
16
|
+
insertImage?: string;
|
|
17
|
+
quote?: string;
|
|
18
|
+
code?: string;
|
|
19
|
+
horizontalRule?: string;
|
|
20
|
+
undo?: string;
|
|
21
|
+
redo?: string;
|
|
22
|
+
clearFormatting?: string;
|
|
23
|
+
linkPrompt?: string;
|
|
24
|
+
imagePrompt?: string;
|
|
25
|
+
};
|
|
26
|
+
type Props = {
|
|
27
|
+
el?: HTMLDivElement;
|
|
28
|
+
value?: string;
|
|
29
|
+
placeholder?: string;
|
|
30
|
+
class?: string;
|
|
31
|
+
controlClass?: string;
|
|
32
|
+
onchange?: (value: string) => void;
|
|
33
|
+
oninput?: (value: string) => void;
|
|
34
|
+
color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
|
|
35
|
+
variant?: 'soft' | 'solid' | 'outlined' | 'line';
|
|
36
|
+
size?: 'sm' | 'md' | 'lg';
|
|
37
|
+
name?: string;
|
|
38
|
+
label?: string;
|
|
39
|
+
islabelActive?: boolean;
|
|
40
|
+
helpText?: string;
|
|
41
|
+
errorText?: string;
|
|
42
|
+
minHeight?: string;
|
|
43
|
+
isDisabled?: boolean;
|
|
44
|
+
isReadonly?: boolean;
|
|
45
|
+
hideToolbar?: boolean;
|
|
46
|
+
labels?: EditorLabels;
|
|
47
|
+
};
|
|
48
|
+
declare const Editor: import("svelte").Component<Props, {}, "value" | "el">;
|
|
49
|
+
type Editor = ReturnType<typeof Editor>;
|
|
50
|
+
export default Editor;
|