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.
Files changed (206) hide show
  1. package/dist/charts/ArcChart.svelte +9 -13
  2. package/dist/charts/ArcChart.svelte.d.ts +3 -3
  3. package/dist/charts/AreaChart.svelte +347 -118
  4. package/dist/charts/AreaChart.svelte.d.ts +33 -4
  5. package/dist/charts/BarChart.svelte +288 -66
  6. package/dist/charts/BarChart.svelte.d.ts +26 -1
  7. package/dist/charts/Candlestick.svelte +53 -50
  8. package/dist/charts/Candlestick.svelte.d.ts +8 -8
  9. package/dist/charts/LineChart.svelte +391 -91
  10. package/dist/charts/LineChart.svelte.d.ts +26 -3
  11. package/dist/charts/PieChart.svelte +333 -92
  12. package/dist/charts/PieChart.svelte.d.ts +33 -5
  13. package/dist/charts/css/arc-chart.css +3 -3
  14. package/dist/charts/css/area-chart.css +127 -29
  15. package/dist/charts/css/bar-chart.css +114 -8
  16. package/dist/charts/css/candlestick.css +2 -0
  17. package/dist/charts/css/line-chart.css +111 -13
  18. package/dist/charts/css/pie-chart.css +92 -20
  19. package/dist/control/Audio.svelte +86 -44
  20. package/dist/control/Audio.svelte.d.ts +4 -1
  21. package/dist/control/Button.svelte +18 -27
  22. package/dist/control/Button.svelte.d.ts +3 -2
  23. package/dist/control/IconButton.svelte +17 -27
  24. package/dist/control/IconButton.svelte.d.ts +3 -3
  25. package/dist/control/Image.svelte +123 -0
  26. package/dist/control/Image.svelte.d.ts +13 -0
  27. package/dist/control/Record.svelte +144 -98
  28. package/dist/control/Record.svelte.d.ts +2 -1
  29. package/dist/control/ToggleGroup.svelte +22 -8
  30. package/dist/control/ToggleGroup.svelte.d.ts +2 -1
  31. package/dist/control/ToggleTheme.svelte +13 -11
  32. package/dist/control/ToggleTheme.svelte.d.ts +3 -2
  33. package/dist/control/Video.svelte +55 -29
  34. package/dist/control/Video.svelte.d.ts +1 -0
  35. package/dist/control/css/btn.css +200 -152
  36. package/dist/control/css/image.css +56 -0
  37. package/dist/control/css/media.css +95 -30
  38. package/dist/control/css/toggle-group.css +269 -84
  39. package/dist/control/css/video.css +1 -14
  40. package/dist/css/animations.css +427 -2
  41. package/dist/css/base.css +13 -347
  42. package/dist/css/decorations.css +402 -0
  43. package/dist/css/rich-text.css +485 -0
  44. package/dist/css/transitions.css +158 -0
  45. package/dist/css/typography.css +291 -0
  46. package/dist/display/Accordion.svelte +28 -4
  47. package/dist/display/Accordion.svelte.d.ts +2 -1
  48. package/dist/display/Alert.svelte +32 -12
  49. package/dist/display/Alert.svelte.d.ts +2 -3
  50. package/dist/display/Avatar.svelte +54 -26
  51. package/dist/display/Avatar.svelte.d.ts +7 -1
  52. package/dist/display/AvatarGroup.svelte +26 -18
  53. package/dist/display/AvatarGroup.svelte.d.ts +9 -3
  54. package/dist/display/Badge.svelte +11 -4
  55. package/dist/display/Badge.svelte.d.ts +2 -1
  56. package/dist/display/Card.svelte +15 -14
  57. package/dist/display/Card.svelte.d.ts +2 -3
  58. package/dist/display/Carousel.svelte +130 -99
  59. package/dist/display/Carousel.svelte.d.ts +6 -4
  60. package/dist/display/ChatBox.svelte +245 -106
  61. package/dist/display/ChatBox.svelte.d.ts +32 -5
  62. package/dist/display/Chip.svelte +31 -17
  63. package/dist/display/Chip.svelte.d.ts +3 -2
  64. package/dist/display/Code.svelte +6 -3
  65. package/dist/display/Code.svelte.d.ts +1 -0
  66. package/dist/display/Collapsible.svelte +30 -4
  67. package/dist/display/Collapsible.svelte.d.ts +2 -1
  68. package/dist/display/Empty.svelte +37 -3
  69. package/dist/display/Empty.svelte.d.ts +3 -0
  70. package/dist/display/Item.svelte +31 -18
  71. package/dist/display/Item.svelte.d.ts +2 -2
  72. package/dist/display/Map.svelte +488 -0
  73. package/dist/display/Map.svelte.d.ts +44 -0
  74. package/dist/display/Section.svelte +14 -12
  75. package/dist/display/Section.svelte.d.ts +2 -3
  76. package/dist/display/Skeleton.svelte +32 -0
  77. package/dist/display/Skeleton.svelte.d.ts +10 -0
  78. package/dist/display/Table.svelte +94 -132
  79. package/dist/display/Table.svelte.d.ts +10 -1
  80. package/dist/display/css/accordion.css +349 -52
  81. package/dist/display/css/alert.css +18 -25
  82. package/dist/display/css/avatar-group.css +38 -44
  83. package/dist/display/css/avatar.css +152 -123
  84. package/dist/display/css/badge.css +50 -27
  85. package/dist/display/css/card.css +51 -71
  86. package/dist/display/css/carousel.css +25 -5
  87. package/dist/display/css/chat-box.css +158 -26
  88. package/dist/display/css/chip.css +142 -68
  89. package/dist/display/css/code.css +2 -6
  90. package/dist/display/css/collapsible.css +349 -45
  91. package/dist/display/css/divider.css +8 -6
  92. package/dist/display/css/empty.css +7 -0
  93. package/dist/display/css/item.css +311 -89
  94. package/dist/display/css/map.css +164 -0
  95. package/dist/display/css/section.css +78 -33
  96. package/dist/display/css/skeleton.css +58 -0
  97. package/dist/display/css/table.css +320 -189
  98. package/dist/form/Checkbox.svelte +11 -5
  99. package/dist/form/Checkbox.svelte.d.ts +2 -1
  100. package/dist/form/ColorField.svelte +543 -0
  101. package/dist/form/ColorField.svelte.d.ts +29 -0
  102. package/dist/form/ComboBox.svelte +24 -9
  103. package/dist/form/ComboBox.svelte.d.ts +2 -2
  104. package/dist/form/CsvField.svelte +62 -136
  105. package/dist/form/CsvField.svelte.d.ts +2 -2
  106. package/dist/form/DateField.svelte +33 -15
  107. package/dist/form/DateField.svelte.d.ts +2 -1
  108. package/dist/form/DateRange.svelte +436 -0
  109. package/dist/form/DateRange.svelte.d.ts +24 -0
  110. package/dist/form/DragDrop.svelte +348 -0
  111. package/dist/form/DragDrop.svelte.d.ts +32 -0
  112. package/dist/form/Dropzone.svelte +28 -8
  113. package/dist/form/Dropzone.svelte.d.ts +2 -2
  114. package/dist/form/Editor.svelte +626 -0
  115. package/dist/form/Editor.svelte.d.ts +50 -0
  116. package/dist/form/ImageCropper.svelte +291 -61
  117. package/dist/form/ImageCropper.svelte.d.ts +15 -1
  118. package/dist/form/PasswordField.svelte +120 -75
  119. package/dist/form/PasswordField.svelte.d.ts +9 -10
  120. package/dist/form/PhoneField.svelte +34 -16
  121. package/dist/form/PhoneField.svelte.d.ts +4 -3
  122. package/dist/form/PinField.svelte +39 -31
  123. package/dist/form/PinField.svelte.d.ts +3 -3
  124. package/dist/form/RadioGroup.svelte +4 -4
  125. package/dist/form/RadioGroup.svelte.d.ts +1 -1
  126. package/dist/form/Select.svelte +20 -19
  127. package/dist/form/Select.svelte.d.ts +2 -2
  128. package/dist/form/Slider.svelte +4 -2
  129. package/dist/form/Slider.svelte.d.ts +1 -0
  130. package/dist/form/TextField.svelte +16 -7
  131. package/dist/form/TextField.svelte.d.ts +2 -2
  132. package/dist/form/Textarea.svelte +15 -6
  133. package/dist/form/Textarea.svelte.d.ts +2 -2
  134. package/dist/form/Toggle.svelte +11 -1
  135. package/dist/form/Toggle.svelte.d.ts +2 -0
  136. package/dist/form/css/checkbox.css +18 -2
  137. package/dist/form/css/color-field.css +141 -0
  138. package/dist/form/css/control.css +193 -82
  139. package/dist/form/css/csv-field.css +226 -0
  140. package/dist/form/css/date-range.css +122 -0
  141. package/dist/form/css/date.css +24 -2
  142. package/dist/form/css/drag-drop.css +271 -0
  143. package/dist/form/css/dropzone.css +153 -34
  144. package/dist/form/css/editor.css +367 -0
  145. package/dist/form/css/field.css +4 -0
  146. package/dist/form/css/image-cropper.css +223 -22
  147. package/dist/form/css/password.css +1 -1
  148. package/dist/form/css/radio-group.css +1 -1
  149. package/dist/form/css/select.css +2 -2
  150. package/dist/form/css/slider.css +1 -0
  151. package/dist/form/css/textarea.css +178 -75
  152. package/dist/form/css/toggle.css +11 -2
  153. package/dist/hooks/use-table.svelte.d.ts +1 -0
  154. package/dist/hooks/use-table.svelte.js +6 -0
  155. package/dist/icons/index.d.ts +38 -2
  156. package/dist/icons/index.js +40 -4
  157. package/dist/index.css +16 -1
  158. package/dist/index.d.ts +11 -3
  159. package/dist/index.js +10 -2
  160. package/dist/layout/AppBar.svelte +22 -14
  161. package/dist/layout/AppBar.svelte.d.ts +2 -1
  162. package/dist/layout/Footer.svelte +19 -11
  163. package/dist/layout/Footer.svelte.d.ts +2 -1
  164. package/dist/layout/Provider.svelte +27 -4
  165. package/dist/layout/Provider.svelte.d.ts +3 -1
  166. package/dist/layout/css/app-bar.css +63 -66
  167. package/dist/layout/css/footer.css +62 -65
  168. package/dist/navigation/BottomNav.svelte +41 -13
  169. package/dist/navigation/FooterGroup.svelte +1 -1
  170. package/dist/navigation/NavMenu.svelte +47 -23
  171. package/dist/navigation/NavMenu.svelte.d.ts +29 -0
  172. package/dist/navigation/Pagination.svelte +158 -0
  173. package/dist/navigation/Pagination.svelte.d.ts +18 -0
  174. package/dist/navigation/SideNav.svelte +30 -25
  175. package/dist/navigation/SideNav.svelte.d.ts +2 -3
  176. package/dist/navigation/Tabs.svelte +17 -7
  177. package/dist/navigation/Tabs.svelte.d.ts +2 -2
  178. package/dist/navigation/css/bottom-nav.css +279 -257
  179. package/dist/navigation/css/footer-group.css +1 -1
  180. package/dist/navigation/css/footer-nav.css +1 -1
  181. package/dist/navigation/css/nav-menu.css +332 -106
  182. package/dist/navigation/css/pagination.css +74 -0
  183. package/dist/navigation/css/side-nav.css +515 -75
  184. package/dist/navigation/css/tabs.css +246 -52
  185. package/dist/overlay/Command.svelte +340 -0
  186. package/dist/overlay/Command.svelte.d.ts +24 -25
  187. package/dist/overlay/Drawer.svelte +49 -21
  188. package/dist/overlay/Drawer.svelte.d.ts +2 -2
  189. package/dist/overlay/Dropdown.svelte +4 -5
  190. package/dist/overlay/Modal.svelte +51 -16
  191. package/dist/overlay/Modal.svelte.d.ts +3 -3
  192. package/dist/overlay/Toast.svelte +41 -17
  193. package/dist/overlay/Toast.svelte.d.ts +1 -1
  194. package/dist/overlay/Tooltip.svelte +40 -26
  195. package/dist/overlay/Tooltip.svelte.d.ts +2 -2
  196. package/dist/overlay/css/command.css +80 -0
  197. package/dist/overlay/css/drawer.css +63 -24
  198. package/dist/overlay/css/dropdown.css +1 -1
  199. package/dist/overlay/css/hovercard.css +1 -1
  200. package/dist/overlay/css/modal.css +27 -27
  201. package/dist/overlay/css/toast.css +17 -29
  202. package/dist/overlay/css/tooltip.css +83 -66
  203. package/dist/stores/theme.svelte.js +26 -1
  204. package/dist/stores/toast.svelte.d.ts +4 -4
  205. package/dist/stores/toast.svelte.js +2 -2
  206. 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;