@firstnoodle-ui/bui 0.0.13 → 0.0.14

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 (272) hide show
  1. package/dist/bui.css +1 -1
  2. package/dist/components/checkbox/Checkbox.vue.d.ts +5 -9
  3. package/dist/components/checkbox/CircleIndicator.vue.d.ts +3 -2
  4. package/dist/components/checkbox/DefaultIndicator.vue.d.ts +3 -2
  5. package/dist/components/collapse/Collapse.vue.d.ts +0 -2
  6. package/dist/components/input/Input.vue.d.ts +3 -1
  7. package/dist/components/pagination/Pagination.vue.d.ts +4 -4
  8. package/dist/components/text-editor/components/InsertLinkDialog.vue.d.ts +5 -2
  9. package/dist/components/text-editor/components/InsertTextDialog.vue.d.ts +5 -2
  10. package/dist/components/types.d.ts +2 -0
  11. package/dist/index.mjs +4391 -4425
  12. package/package.json +8 -3
  13. package/dist/components/scrollbar/scrollbarWidth.d.ts +0 -1
  14. package/src/components/application-wrapper/ApplicationWrapper.vue +0 -8
  15. package/src/components/application-wrapper/index.ts +0 -1
  16. package/src/components/aside-section-label/AsideSectionLabel.vue +0 -16
  17. package/src/components/aside-section-label/index.ts +0 -1
  18. package/src/components/button/Button.vue +0 -245
  19. package/src/components/button/NotificationBadge.vue +0 -15
  20. package/src/components/button/index.ts +0 -1
  21. package/src/components/button-group/ButtonGroup.vue +0 -97
  22. package/src/components/button-group/index.ts +0 -1
  23. package/src/components/checkbox/Checkbox.vue +0 -52
  24. package/src/components/checkbox/CircleIndicator.vue +0 -27
  25. package/src/components/checkbox/DefaultIndicator.vue +0 -22
  26. package/src/components/checkbox/index.ts +0 -1
  27. package/src/components/collapse/Collapse.vue +0 -120
  28. package/src/components/collapse/index.ts +0 -1
  29. package/src/components/confirm-cancel/ConfirmCancel.vue +0 -79
  30. package/src/components/confirm-cancel/index.ts +0 -1
  31. package/src/components/data-point/DataPoint.vue +0 -5
  32. package/src/components/data-point/index.ts +0 -1
  33. package/src/components/dialog/Dialog.vue +0 -70
  34. package/src/components/dialog/index.ts +0 -1
  35. package/src/components/fade-in-up/FadeInUp.vue +0 -17
  36. package/src/components/fade-in-up/index.ts +0 -1
  37. package/src/components/first-paint/FirstPaint.vue +0 -21
  38. package/src/components/first-paint/index.ts +0 -1
  39. package/src/components/first-paint/style.scss +0 -23
  40. package/src/components/flexbox/Flexbox.vue +0 -50
  41. package/src/components/flexbox/index.ts +0 -1
  42. package/src/components/horizontal-layout/Aside.vue +0 -113
  43. package/src/components/horizontal-layout/HorizontalLayout.vue +0 -118
  44. package/src/components/horizontal-layout/index.ts +0 -2
  45. package/src/components/icon/Icon.vue +0 -1159
  46. package/src/components/icon/index.ts +0 -1
  47. package/src/components/icon/utils/combine-svgs.cjs +0 -55
  48. package/src/components/icon/utils/combined-svgs.txt +0 -1150
  49. package/src/components/icon/utils/svgs/admin.svg +0 -16
  50. package/src/components/icon/utils/svgs/arrow-deviate.svg +0 -3
  51. package/src/components/icon/utils/svgs/arrow-down-plus.svg +0 -4
  52. package/src/components/icon/utils/svgs/arrow-down.svg +0 -3
  53. package/src/components/icon/utils/svgs/arrow-from.svg +0 -3
  54. package/src/components/icon/utils/svgs/arrow-left.svg +0 -3
  55. package/src/components/icon/utils/svgs/arrow-move.svg +0 -15
  56. package/src/components/icon/utils/svgs/arrow-right.svg +0 -3
  57. package/src/components/icon/utils/svgs/arrow-sub.svg +0 -3
  58. package/src/components/icon/utils/svgs/arrow-trend.svg +0 -15
  59. package/src/components/icon/utils/svgs/arrow-up-plus.svg +0 -4
  60. package/src/components/icon/utils/svgs/arrow-up.svg +0 -3
  61. package/src/components/icon/utils/svgs/authority.svg +0 -5
  62. package/src/components/icon/utils/svgs/beams.svg +0 -5
  63. package/src/components/icon/utils/svgs/bell.svg +0 -15
  64. package/src/components/icon/utils/svgs/bold.svg +0 -3
  65. package/src/components/icon/utils/svgs/box.svg +0 -5
  66. package/src/components/icon/utils/svgs/building.svg +0 -15
  67. package/src/components/icon/utils/svgs/bullet-list.svg +0 -8
  68. package/src/components/icon/utils/svgs/calendar.svg +0 -21
  69. package/src/components/icon/utils/svgs/camera.svg +0 -5
  70. package/src/components/icon/utils/svgs/categories.svg +0 -3
  71. package/src/components/icon/utils/svgs/check-circled.svg +0 -16
  72. package/src/components/icon/utils/svgs/check-outline.svg +0 -15
  73. package/src/components/icon/utils/svgs/check.svg +0 -3
  74. package/src/components/icon/utils/svgs/chevron-down.svg +0 -3
  75. package/src/components/icon/utils/svgs/chevron-left-double.svg +0 -4
  76. package/src/components/icon/utils/svgs/chevron-left.svg +0 -3
  77. package/src/components/icon/utils/svgs/chevron-right-double.svg +0 -4
  78. package/src/components/icon/utils/svgs/chevron-right.svg +0 -3
  79. package/src/components/icon/utils/svgs/chevron-up.svg +0 -3
  80. package/src/components/icon/utils/svgs/clock.svg +0 -4
  81. package/src/components/icon/utils/svgs/close-outline.svg +0 -3
  82. package/src/components/icon/utils/svgs/close.svg +0 -3
  83. package/src/components/icon/utils/svgs/columns.svg +0 -3
  84. package/src/components/icon/utils/svgs/conclusion.svg +0 -17
  85. package/src/components/icon/utils/svgs/copy.svg +0 -16
  86. package/src/components/icon/utils/svgs/crosshair.svg +0 -15
  87. package/src/components/icon/utils/svgs/dash.svg +0 -3
  88. package/src/components/icon/utils/svgs/dashboard.svg +0 -3
  89. package/src/components/icon/utils/svgs/delete.svg +0 -4
  90. package/src/components/icon/utils/svgs/delta.svg +0 -3
  91. package/src/components/icon/utils/svgs/download.svg +0 -3
  92. package/src/components/icon/utils/svgs/drag.svg +0 -8
  93. package/src/components/icon/utils/svgs/drilldown.svg +0 -8
  94. package/src/components/icon/utils/svgs/edit.svg +0 -16
  95. package/src/components/icon/utils/svgs/envelope.svg +0 -3
  96. package/src/components/icon/utils/svgs/error.svg +0 -3
  97. package/src/components/icon/utils/svgs/export-document.svg +0 -16
  98. package/src/components/icon/utils/svgs/filter.svg +0 -6
  99. package/src/components/icon/utils/svgs/filters.svg +0 -4
  100. package/src/components/icon/utils/svgs/flag.svg +0 -3
  101. package/src/components/icon/utils/svgs/folder.svg +0 -15
  102. package/src/components/icon/utils/svgs/frequency.svg +0 -3
  103. package/src/components/icon/utils/svgs/fullscreen-off.svg +0 -3
  104. package/src/components/icon/utils/svgs/fullscreen-on.svg +0 -3
  105. package/src/components/icon/utils/svgs/graduate.svg +0 -3
  106. package/src/components/icon/utils/svgs/hamburger.svg +0 -5
  107. package/src/components/icon/utils/svgs/handshake.svg +0 -15
  108. package/src/components/icon/utils/svgs/heading-1.svg +0 -4
  109. package/src/components/icon/utils/svgs/heading-2.svg +0 -4
  110. package/src/components/icon/utils/svgs/heading.svg +0 -3
  111. package/src/components/icon/utils/svgs/home.svg +0 -3
  112. package/src/components/icon/utils/svgs/id-card.svg +0 -6
  113. package/src/components/icon/utils/svgs/id.svg +0 -4
  114. package/src/components/icon/utils/svgs/indent-left.svg +0 -7
  115. package/src/components/icon/utils/svgs/indent-right.svg +0 -7
  116. package/src/components/icon/utils/svgs/information.svg +0 -17
  117. package/src/components/icon/utils/svgs/italics.svg +0 -3
  118. package/src/components/icon/utils/svgs/itenary.svg +0 -11
  119. package/src/components/icon/utils/svgs/keyboard.svg +0 -11
  120. package/src/components/icon/utils/svgs/lightning.svg +0 -15
  121. package/src/components/icon/utils/svgs/link.svg +0 -4
  122. package/src/components/icon/utils/svgs/list-collapse.svg +0 -6
  123. package/src/components/icon/utils/svgs/list-expand.svg +0 -6
  124. package/src/components/icon/utils/svgs/location.svg +0 -4
  125. package/src/components/icon/utils/svgs/lock-locked.svg +0 -4
  126. package/src/components/icon/utils/svgs/lock-unlocked.svg +0 -4
  127. package/src/components/icon/utils/svgs/magnifying-glass.svg +0 -15
  128. package/src/components/icon/utils/svgs/map.svg +0 -3
  129. package/src/components/icon/utils/svgs/megaphone.svg +0 -3
  130. package/src/components/icon/utils/svgs/message.svg +0 -15
  131. package/src/components/icon/utils/svgs/microscope.svg +0 -3
  132. package/src/components/icon/utils/svgs/moon.svg +0 -3
  133. package/src/components/icon/utils/svgs/new-document.svg +0 -4
  134. package/src/components/icon/utils/svgs/news.svg +0 -15
  135. package/src/components/icon/utils/svgs/numbered-list.svg +0 -7
  136. package/src/components/icon/utils/svgs/open-link.svg +0 -16
  137. package/src/components/icon/utils/svgs/options.svg +0 -5
  138. package/src/components/icon/utils/svgs/page.svg +0 -7
  139. package/src/components/icon/utils/svgs/paper-plane.svg +0 -15
  140. package/src/components/icon/utils/svgs/paper.svg +0 -3
  141. package/src/components/icon/utils/svgs/pen-and-paper.svg +0 -4
  142. package/src/components/icon/utils/svgs/phase.svg +0 -15
  143. package/src/components/icon/utils/svgs/photo.svg +0 -4
  144. package/src/components/icon/utils/svgs/pie-chart.svg +0 -3
  145. package/src/components/icon/utils/svgs/plus.svg +0 -3
  146. package/src/components/icon/utils/svgs/point-left.svg +0 -3
  147. package/src/components/icon/utils/svgs/point-up.svg +0 -3
  148. package/src/components/icon/utils/svgs/popup.svg +0 -16
  149. package/src/components/icon/utils/svgs/question.svg +0 -17
  150. package/src/components/icon/utils/svgs/radio-tower.svg +0 -3
  151. package/src/components/icon/utils/svgs/recycle.svg +0 -3
  152. package/src/components/icon/utils/svgs/redo.svg +0 -3
  153. package/src/components/icon/utils/svgs/refresh.svg +0 -3
  154. package/src/components/icon/utils/svgs/route.svg +0 -3
  155. package/src/components/icon/utils/svgs/rows.svg +0 -3
  156. package/src/components/icon/utils/svgs/scope.svg +0 -7
  157. package/src/components/icon/utils/svgs/settings.svg +0 -16
  158. package/src/components/icon/utils/svgs/share.svg +0 -11
  159. package/src/components/icon/utils/svgs/sign-in.svg +0 -4
  160. package/src/components/icon/utils/svgs/sign-up.svg +0 -3
  161. package/src/components/icon/utils/svgs/sort-down.svg +0 -20
  162. package/src/components/icon/utils/svgs/sort-up.svg +0 -20
  163. package/src/components/icon/utils/svgs/sort.svg +0 -7
  164. package/src/components/icon/utils/svgs/square-solid.svg +0 -3
  165. package/src/components/icon/utils/svgs/star-solid.svg +0 -15
  166. package/src/components/icon/utils/svgs/star.svg +0 -15
  167. package/src/components/icon/utils/svgs/stop-watch.svg +0 -5
  168. package/src/components/icon/utils/svgs/structure.svg +0 -3
  169. package/src/components/icon/utils/svgs/sun.svg +0 -23
  170. package/src/components/icon/utils/svgs/table.svg +0 -3
  171. package/src/components/icon/utils/svgs/tag.svg +0 -15
  172. package/src/components/icon/utils/svgs/team.svg +0 -15
  173. package/src/components/icon/utils/svgs/telescope.svg +0 -15
  174. package/src/components/icon/utils/svgs/trash.svg +0 -6
  175. package/src/components/icon/utils/svgs/triangle-angle.svg +0 -3
  176. package/src/components/icon/utils/svgs/triangle-side.svg +0 -3
  177. package/src/components/icon/utils/svgs/underline.svg +0 -4
  178. package/src/components/icon/utils/svgs/undo.svg +0 -3
  179. package/src/components/icon/utils/svgs/user.svg +0 -16
  180. package/src/components/icon/utils/svgs/venn.svg +0 -3
  181. package/src/components/icon/utils/svgs/video.svg +0 -3
  182. package/src/components/icon/utils/svgs/visibility-off-alt.svg +0 -19
  183. package/src/components/icon/utils/svgs/visibility-off.svg +0 -3
  184. package/src/components/icon/utils/svgs/visibility-on.svg +0 -16
  185. package/src/components/icon/utils/svgs/warning.svg +0 -5
  186. package/src/components/index.ts +0 -38
  187. package/src/components/input/Input.vue +0 -87
  188. package/src/components/input/index.ts +0 -1
  189. package/src/components/load-spinner/LoadSpinner.vue +0 -13
  190. package/src/components/load-spinner/index.ts +0 -1
  191. package/src/components/modal/Modal.vue +0 -111
  192. package/src/components/modal/index.ts +0 -1
  193. package/src/components/nav-item/NavItem.vue +0 -62
  194. package/src/components/nav-item/index.ts +0 -1
  195. package/src/components/notification/Notification.vue +0 -34
  196. package/src/components/notification/index.ts +0 -1
  197. package/src/components/pagination/Pagination.vue +0 -72
  198. package/src/components/pagination/index.ts +0 -1
  199. package/src/components/pill/Pill.vue +0 -52
  200. package/src/components/pill/index.ts +0 -2
  201. package/src/components/pill/pill-types.ts +0 -2
  202. package/src/components/pop-confirm/PopConfirm.vue +0 -69
  203. package/src/components/pop-confirm/index.ts +0 -1
  204. package/src/components/pop-select/FooterButton.vue +0 -5
  205. package/src/components/pop-select/PopSelect.vue +0 -346
  206. package/src/components/pop-select/ResultFilters.vue +0 -31
  207. package/src/components/pop-select/enums.ts +0 -7
  208. package/src/components/pop-select/index.ts +0 -2
  209. package/src/components/pop-select/option.vue +0 -51
  210. package/src/components/popper/Popper.vue +0 -239
  211. package/src/components/popper/PopperContent.vue +0 -5
  212. package/src/components/popper/index.ts +0 -2
  213. package/src/components/popper/middleware.ts +0 -19
  214. package/src/components/screen-overlay/ScreenOverlay.vue +0 -53
  215. package/src/components/screen-overlay/index.ts +0 -1
  216. package/src/components/scrollbar/Bar.vue +0 -106
  217. package/src/components/scrollbar/ScrollBottomLoader.vue +0 -25
  218. package/src/components/scrollbar/Scrollbar.vue +0 -220
  219. package/src/components/scrollbar/enums.ts +0 -23
  220. package/src/components/scrollbar/index.ts +0 -2
  221. package/src/components/scrollbar/scrollbarWidth.ts +0 -26
  222. package/src/components/scrollbar/style.scss +0 -75
  223. package/src/components/scrollbar/types.ts +0 -32
  224. package/src/components/side-over/SideOver.vue +0 -87
  225. package/src/components/side-over/index.ts +0 -1
  226. package/src/components/status-select/StatusIndicator.vue +0 -78
  227. package/src/components/status-select/StatusSelect.vue +0 -62
  228. package/src/components/status-select/index.ts +0 -1
  229. package/src/components/switch/Switch.vue +0 -52
  230. package/src/components/switch/index.ts +0 -1
  231. package/src/components/tab/Tab.vue +0 -59
  232. package/src/components/tab/index.ts +0 -1
  233. package/src/components/tag/Tag.vue +0 -34
  234. package/src/components/tag/index.ts +0 -1
  235. package/src/components/text-editor/TextEditor.vue +0 -399
  236. package/src/components/text-editor/components/Dialog.vue +0 -11
  237. package/src/components/text-editor/components/FormattingButton.vue +0 -46
  238. package/src/components/text-editor/components/InsertLinkDialog.vue +0 -81
  239. package/src/components/text-editor/components/InsertTextDialog.vue +0 -36
  240. package/src/components/text-editor/components/index.ts +0 -3
  241. package/src/components/text-editor/index.ts +0 -1
  242. package/src/components/text-highlight/TextHighlight.vue +0 -113
  243. package/src/components/text-highlight/index.ts +0 -1
  244. package/src/components/text-viewer/TextViewer.vue +0 -5
  245. package/src/components/text-viewer/index.ts +0 -1
  246. package/src/components/tooltip/Tooltip.vue +0 -54
  247. package/src/components/tooltip/index.ts +0 -1
  248. package/src/components/types.ts +0 -221
  249. package/src/components/vertical-layout/RunningSection.vue +0 -54
  250. package/src/components/vertical-layout/VerticalLayout.vue +0 -37
  251. package/src/components/vertical-layout/index.ts +0 -3
  252. package/src/components/vertical-layout/types.ts +0 -2
  253. package/src/components/window-frame/WindowFrame.vue +0 -20
  254. package/src/components/window-frame/index.ts +0 -1
  255. package/src/composables/index.ts +0 -5
  256. package/src/composables/useClickOutside.ts +0 -48
  257. package/src/composables/useEscapeKey.ts +0 -12
  258. package/src/composables/useMounted.ts +0 -7
  259. package/src/composables/useNextFrame.ts +0 -10
  260. package/src/composables/useTrapFocus.ts +0 -61
  261. package/src/index.ts +0 -5
  262. package/src/main.css +0 -116
  263. package/src/utils/array.ts +0 -11
  264. package/src/utils/clamp.ts +0 -1
  265. package/src/utils/debounce.ts +0 -8
  266. package/src/utils/index.ts +0 -5
  267. package/src/utils/scrollIntoView.ts +0 -25
  268. package/src/utils/scrollbarWidth.ts +0 -27
  269. package/tsconfig.app.json +0 -4
  270. package/tsconfig.json +0 -11
  271. package/tsconfig.node.json +0 -21
  272. package/vite.config.ts +0 -27
@@ -1,399 +0,0 @@
1
- <script setup lang="ts">
2
- import type { TIcon } from "../types";
3
- import bold from "@tiptap/extension-bold";
4
- import bulletList from "@tiptap/extension-bullet-list";
5
- import Document from "@tiptap/extension-document";
6
- import heading from "@tiptap/extension-heading";
7
- import highlight from "@tiptap/extension-highlight";
8
-
9
- import history from "@tiptap/extension-history";
10
-
11
- import italic from "@tiptap/extension-italic";
12
-
13
- import link from "@tiptap/extension-link";
14
- import listItem from "@tiptap/extension-list-item";
15
-
16
- import orderedList from "@tiptap/extension-ordered-list";
17
- import Paragraph from "@tiptap/extension-paragraph";
18
- import Placeholder from "@tiptap/extension-placeholder";
19
- import Text from "@tiptap/extension-text";
20
- import underline from "@tiptap/extension-underline";
21
- import { EditorContent, useEditor } from "@tiptap/vue-3";
22
-
23
- import { computed, onBeforeUnmount, ref } from "vue";
24
- import { BFlexbox, BIcon } from "../";
25
- import { useClickOutside } from "../../";
26
- import FormattingButton from "./components/FormattingButton.vue";
27
-
28
- import InsertLinkDialog from "./components/InsertLinkDialog.vue";
29
- import InsertTextDialog from "./components/InsertTextDialog.vue";
30
-
31
- const props = withDefaults(
32
- defineProps<{
33
- autoHideMenu?: boolean;
34
- embedded?: boolean;
35
- content: string;
36
- editorContentClasses?: string;
37
- editorContentFocusClasses?: string;
38
- emphasis?: boolean;
39
- expandVertically?: boolean;
40
- headerIcon?: TIcon;
41
- headerLabel?: string;
42
- heading?: boolean;
43
- highlight?: boolean;
44
- history?: boolean;
45
- insert?: boolean;
46
- insertIcon?: TIcon;
47
- insertLabel?: string;
48
- insertTooltip?: string;
49
- link?: boolean;
50
- listStyles?: boolean;
51
- minimal?: boolean;
52
- placeholder?: string;
53
- showMenu?: boolean;
54
- }>(),
55
- {
56
- autoHideMenu: false,
57
- editorContentClasses: "p-2 bg-1",
58
- editorContentFocusClasses: "p-2 bg-1",
59
- embedded: false,
60
- emphasis: false,
61
- expandVertically: false,
62
- heading: false,
63
- highlight: false,
64
- history: false,
65
- insert: false,
66
- insertIcon: "download",
67
- insertLabel: "Insert text",
68
- insertTooltip: "Insert text",
69
- link: false,
70
- listStyles: false,
71
- minimal: false,
72
- showMenu: undefined,
73
- },
74
- );
75
-
76
- const emit = defineEmits(["blur", "change", "focus"]);
77
-
78
- const editorFocussed = ref(false);
79
- const softFocus = ref(false);
80
- const showInsertTextDialog = ref(false);
81
- const showLinkDialog = ref(false);
82
- const editorRef = ref<HTMLDivElement>();
83
-
84
- const { disableClickOutside, enableClickOutside } = useClickOutside(() => (softFocus.value = false));
85
-
86
- const editor = useEditor({
87
- content: props.content,
88
- extensions: [
89
- bold,
90
- bulletList,
91
- heading,
92
- highlight,
93
- history,
94
- italic,
95
- link,
96
- listItem,
97
- orderedList,
98
- underline,
99
- Document,
100
- Paragraph,
101
- Text,
102
- Placeholder.configure({
103
- placeholder: props.placeholder || "",
104
- }),
105
- ],
106
- onCreate: () => {
107
- if (editorRef.value) {
108
- enableClickOutside([editorRef.value]);
109
- }
110
- },
111
- onUpdate: ({ editor }) => emit("change", editor.getHTML()),
112
- onFocus: () => {
113
- editorFocussed.value = softFocus.value = true;
114
- emit("focus");
115
- },
116
- onBlur: () => {
117
- editorFocussed.value = false;
118
- emit("blur");
119
- },
120
- });
121
-
122
- onBeforeUnmount(() => disableClickOutside());
123
-
124
- const menuVisible = computed(() => {
125
- if (props.showMenu !== undefined) return props.showMenu;
126
- return softFocus.value || !props.autoHideMenu;
127
- });
128
-
129
- const headerClass = computed(() => {
130
- return softFocus.value ? "bg-1 border-b border-default opacity-100" : "bg-2 border-b border-subtle opacity-50";
131
- });
132
-
133
- const menuClass = computed(() => {
134
- return softFocus.value ? "bg-2 border-t border-default opacity-100" : "bg-2 border-t border-subtle opacity-50";
135
- });
136
-
137
- const focusPositions = ["start", "end", "all"] as const;
138
- type TFocusPosition = (typeof focusPositions)[number];
139
-
140
- const focus = (position: TFocusPosition) => {
141
- const validatedPosition = focusPositions.includes(position) ? position : "end";
142
- editor.value?.commands.focus(validatedPosition);
143
- };
144
-
145
- const blur = () => {
146
- editor.value?.commands.blur();
147
- softFocus.value = false;
148
- };
149
-
150
- const onCancelInsertLink = () => (showLinkDialog.value = false);
151
- const onEditorMenuClick = () => (softFocus.value = true);
152
- const onLinkInserted = () => (showLinkDialog.value = false);
153
- const insertContent = (value: string) => editor.value?.commands.insertContent(value);
154
- const onInsertText = (value: string) => {
155
- insertContent(value);
156
- showInsertTextDialog.value = false;
157
- };
158
- const onAddLink = () => (showLinkDialog.value = true);
159
- const onAddText = () => (showInsertTextDialog.value = true);
160
-
161
- /**
162
- * For parent component
163
- */
164
- const closeInsert = () => (showInsertTextDialog.value = false);
165
- const setContent = (value: string) => editor.value?.commands.setContent(value);
166
-
167
- defineExpose({ blur, closeInsert, focus, setContent });
168
- </script>
169
-
170
- <template>
171
- <section v-if="editor" ref="editorRef" class="relative w-full">
172
- <BFlexbox
173
- col
174
- align="stretch"
175
- class="relative rounded-lg font-normal focus-within:border-default"
176
- :class="{
177
- 'border': !embedded,
178
- 'flex-1 min-h-0': expandVertically,
179
- 'shadow-sm-outline border-action': softFocus,
180
- 'border-transparent': !softFocus && embedded,
181
- 'border-subtle': !softFocus && !embedded,
182
- }"
183
- >
184
- <BFlexbox
185
- v-if="headerLabel || headerIcon"
186
- tag="header"
187
- class="flex-0 h-10 px-3 gap-2 text-sm text-primary rounded-t-lg overflow-hidden"
188
- :class="headerClass"
189
- >
190
- <BIcon v-if="headerIcon" :name="headerIcon" />
191
- <span v-if="headerLabel">{{ headerLabel }}</span>
192
- </BFlexbox>
193
- <BFlexbox tag="main" align="start" fullwidth>
194
- <EditorContent
195
- class="flex-1 overflow-y-auto rounded-t-lg focus:outline-hidden"
196
- :class="{
197
- [editorContentClasses]: !softFocus,
198
- [editorContentFocusClasses]: softFocus,
199
- }"
200
- :editor="editor"
201
- />
202
- </BFlexbox>
203
- <nav v-if="menuVisible" class="flex-0 min-h-0 p-1 rounded-b-lg overflow-hidden" :class="menuClass">
204
- <BFlexbox justify="between">
205
- <BFlexbox class="gap-0.5">
206
- <template v-if="history">
207
- <FormattingButton
208
- icon="undo"
209
- tooltip="Undo"
210
- @click="
211
- editor!.chain().focus().undo().run();
212
- onEditorMenuClick();
213
- "
214
- />
215
- <FormattingButton
216
- icon="redo"
217
- tooltip="Redo"
218
- @click="
219
- editor!.chain().focus().redo().run();
220
- onEditorMenuClick();
221
- "
222
- />
223
- </template>
224
- <template v-if="emphasis">
225
- <FormattingButton
226
- icon="bold"
227
- tooltip="Bold"
228
- :active="editor.isActive('bold')"
229
- @click="
230
- editor!.chain().focus().toggleBold().run();
231
- onEditorMenuClick();
232
- "
233
- />
234
- <FormattingButton
235
- icon="italics"
236
- tooltip="Italic"
237
- :active="editor.isActive('italic')"
238
- @click="
239
- editor!.chain().focus().toggleItalic().run();
240
- onEditorMenuClick();
241
- "
242
- />
243
- <FormattingButton
244
- icon="underline"
245
- tooltip="Underline"
246
- :active="editor.isActive('underline')"
247
- @click="
248
- editor!.chain().focus().toggleUnderline().run();
249
- onEditorMenuClick();
250
- "
251
- />
252
- </template>
253
- <FormattingButton
254
- v-if="highlight"
255
- icon="square-solid"
256
- tooltip="Yellow highlight"
257
- :active="editor.isActive('highlight')"
258
- @click="
259
- editor!.chain().focus().toggleHighlight().run();
260
- onEditorMenuClick();
261
- "
262
- />
263
- <FormattingButton
264
- v-if="heading"
265
- icon="heading"
266
- tooltip="Heading"
267
- :active="editor.isActive('heading', { level: 1 })"
268
- @click="
269
- editor!.chain().focus().toggleHeading({ level: 1 }).run();
270
- onEditorMenuClick();
271
- "
272
- />
273
- <FormattingButton
274
- v-if="link"
275
- icon="link"
276
- tooltip="Add link"
277
- :active="editor.isActive('link')"
278
- @click="
279
- onAddLink();
280
- onEditorMenuClick();
281
- "
282
- />
283
- <template v-if="listStyles">
284
- <FormattingButton
285
- icon="bullet-list"
286
- tooltip="Bullet list"
287
- :active="editor.isActive('bulletList')"
288
- @click="
289
- editor!.chain().focus().toggleBulletList().run();
290
- onEditorMenuClick();
291
- "
292
- />
293
- <FormattingButton
294
- icon="numbered-list"
295
- tooltip="Numbered list"
296
- :active="editor.isActive('orderedList')"
297
- @click="
298
- editor!.chain().focus().toggleOrderedList().run();
299
- onEditorMenuClick();
300
- "
301
- />
302
- <FormattingButton
303
- icon="indent-right"
304
- tooltip="Indent right"
305
- :disabled="Boolean(!editor.can().sinkListItem('listItem'))"
306
- @click="
307
- editor!.chain().focus().sinkListItem('listItem').run();
308
- onEditorMenuClick();
309
- "
310
- />
311
- <FormattingButton
312
- icon="indent-left"
313
- tooltip="Indent left"
314
- :disabled="Boolean(!editor.can().liftListItem('listItem'))"
315
- @click="
316
- editor!.chain().focus().liftListItem('listItem').run();
317
- onEditorMenuClick();
318
- "
319
- />
320
- </template>
321
- <FormattingButton
322
- v-if="insert"
323
- highlight
324
- :icon="insertIcon"
325
- :tooltip="insertTooltip"
326
- :active="editor.isActive('insert')"
327
- @click="
328
- onAddText();
329
- onEditorMenuClick();
330
- "
331
- />
332
- </BFlexbox>
333
- <div v-if="$slots.menuRight" class="pr-1">
334
- <slot name="menuRight" />
335
- </div>
336
- </BFlexbox>
337
- </nav>
338
-
339
- <InsertLinkDialog v-if="showLinkDialog" :editor="editor" @inserted="onLinkInserted" @cancel="onCancelInsertLink" />
340
-
341
- <template v-if="showInsertTextDialog">
342
- <slot v-if="$slots.insert" name="insert" />
343
- <InsertTextDialog v-else @insert="onInsertText" @cancel="showInsertTextDialog = false" />
344
- </template>
345
- </BFlexbox>
346
- </section>
347
- </template>
348
-
349
- <style>
350
- .ProseMirror {
351
- height: 100%;
352
- }
353
- .ProseMirror:focus {
354
- outline: none;
355
- }
356
-
357
- /* Render blank line */
358
- .ProseMirror p:empty::after {
359
- content: "\00A0";
360
- }
361
-
362
- .ProseMirror a {
363
- color: blue;
364
- text-decoration: underline;
365
- cursor: pointer;
366
- }
367
-
368
- /* Unordered (bullet) lists */
369
- .ProseMirror ul {
370
- margin-left: 30px;
371
- }
372
- .ProseMirror ul li {
373
- list-style: circle;
374
- list-style-position: outside;
375
- }
376
- .ProseMirror ul li > p {
377
- display: inline;
378
- }
379
-
380
- /* Ordered (numbered) lists */
381
- .ProseMirror ol {
382
- margin-left: 30px;
383
- }
384
- .ProseMirror ol li {
385
- list-style: decimal;
386
- list-style-position: outside;
387
- }
388
- .ProseMirror ol li > p {
389
- display: inline;
390
- }
391
-
392
- .tiptap p.is-editor-empty:first-child::before {
393
- color: #adb5bd;
394
- content: attr(data-placeholder);
395
- float: left;
396
- height: 0;
397
- pointer-events: none;
398
- }
399
- </style>
@@ -1,11 +0,0 @@
1
- <script setup lang="ts"></script>
2
-
3
- <template>
4
- <Teleport to="#modals">
5
- <div class="pointer-events-auto absolute top-0 left-0 w-full h-full flex items-center justify-center rounded-sm bg-black/15">
6
- <div class="px-8 py-6 bg-1 rounded-lg shadow-sm-xl space-y-2">
7
- <slot />
8
- </div>
9
- </div>
10
- </Teleport>
11
- </template>
@@ -1,46 +0,0 @@
1
- <script setup lang="ts">
2
- import type { TIcon } from "../../types";
3
- import { BFlexbox, BIcon, BTooltip } from "../../";
4
-
5
- withDefaults(
6
- defineProps<{
7
- active?: boolean;
8
- disabled?: boolean;
9
- highlight?: boolean;
10
- icon?: TIcon;
11
- label?: string;
12
- tooltip?: string;
13
- }>(),
14
- {
15
- active: false,
16
- disabled: false,
17
- highlight: false,
18
- },
19
- );
20
-
21
- const emit = defineEmits(["click"]);
22
- </script>
23
-
24
- <template>
25
- <BTooltip :text="tooltip" :delay="200">
26
- <BFlexbox
27
- tag="button"
28
- inline
29
- justify="center"
30
- class="h-8 gap-2 rounded-lg border border-transparent focus:outline-hidden focus:border-strong"
31
- :class="{
32
- 'bg-4 text-primary font-bold': active && !highlight,
33
- 'bg-4 text-action border border-subtle': highlight,
34
- 'text-tertiary bg-transparent': !active && !disabled && !highlight,
35
- 'hover:bg-5': !disabled,
36
- 'text-muted': disabled && !highlight,
37
- 'w-8': icon && !label,
38
- 'px-2': label,
39
- }"
40
- @click.stop.prevent="!disabled && emit('click')"
41
- >
42
- <BIcon v-if="icon" :name="icon" />
43
- <span v-if="label" class="text-xs leading-none">{{ label }}</span>
44
- </BFlexbox>
45
- </BTooltip>
46
- </template>
@@ -1,81 +0,0 @@
1
- <script setup lang="ts">
2
- import { onBeforeMount, onMounted, ref } from "vue";
3
- import { BConfirmCancel, BInput } from "../../";
4
- import TextEditorDialog from "./Dialog.vue";
5
-
6
- const props = defineProps<{ editor: any }>();
7
- const emit = defineEmits(["cancel", "inserted"]);
8
- const linkAddress = ref<string | null>(null);
9
- const linkDisplayName = ref<string | null>(null);
10
-
11
- const inputRef = ref<typeof BInput>();
12
-
13
- const onAddLink = () => {
14
- // get the current link if any
15
- linkAddress.value = props.editor.getAttributes("link").href;
16
-
17
- const { view, state } = props.editor;
18
-
19
- if (linkAddress.value) {
20
- /**
21
- * If there is a link address, there must be a display name.
22
- * But there is no simple way to get the display name.
23
- * This is solved by looking at the parent content of the cursor position
24
- * and find the content where the link is added
25
- *
26
- * The parent content is the line where cursor is broken down into blocks
27
- */
28
- const relevantTextNodes = view.state.selection.ranges[0].$from.parent.content.content.filter(
29
- (c: any) => c.marks.length > 0 && c.marks[0].attrs.href === linkAddress.value,
30
- );
31
-
32
- linkDisplayName.value = relevantTextNodes[0].text;
33
- }
34
- else {
35
- // get the selected text as the display name
36
- const { from, to } = view.state.selection;
37
- linkDisplayName.value = state.doc.textBetween(from, to, "");
38
- }
39
- };
40
-
41
- onBeforeMount(() => onAddLink());
42
- onMounted(() => inputRef.value!.focus());
43
-
44
- // TODO use define model
45
- const onAddressChange = (value: string) => (linkAddress.value = value);
46
- const onDisplayNameChange = (value: string) => (linkDisplayName.value = value);
47
-
48
- const onInsert = () => {
49
- if (linkAddress.value && !linkAddress.value.includes("http")) {
50
- linkAddress.value = `https://${linkAddress.value}`;
51
- }
52
-
53
- if (linkAddress.value) {
54
- props.editor.chain().focus().extendMarkRange("link").setLink({ href: linkAddress.value }).run();
55
-
56
- const transaction = props.editor.state.tr.insertText(linkDisplayName.value);
57
- props.editor.view.dispatch(transaction);
58
-
59
- emit("inserted");
60
- }
61
- };
62
- </script>
63
-
64
- <template>
65
- <TextEditorDialog>
66
- <header>Insert link</header>
67
- <section class="space-y-1">
68
- <div class="text-xs text-secondary">
69
- Text to display
70
- </div>
71
- <BInput ref="inputRef" placeholder="Text to display" :value="linkDisplayName || ''" @change="onDisplayNameChange" />
72
- </section>
73
- <section class="space-y-1">
74
- <div class="text-xs text-secondary">
75
- Address
76
- </div>
77
- <BInput placeholder="Link to a web page" :value="linkAddress || ''" @change="onAddressChange" />
78
- </section>
79
- <BConfirmCancel confirm-label="Insert" @confirm="onInsert" @cancel="emit('cancel')" />
80
- </TextEditorDialog>
81
- </template>
@@ -1,36 +0,0 @@
1
- <script setup lang="ts">
2
- import { onMounted, ref } from "vue";
3
- import { BConfirmCancel, BInput } from "../../";
4
- import TextEditorDialog from "./Dialog.vue";
5
-
6
- const emit = defineEmits(["cancel", "insert"]);
7
- const textToBeInserted = ref<string | null>(null);
8
- const inputRef = ref<typeof BInput>();
9
-
10
- onMounted(() => inputRef.value!.focus());
11
-
12
- const onCancelInsert = () => {
13
- emit("cancel");
14
- textToBeInserted.value = null;
15
- };
16
-
17
- // TODO use defineModel
18
- const onInputChange = (value: string) => (textToBeInserted.value = value);
19
-
20
- const onInsert = () => {
21
- emit("insert", textToBeInserted.value);
22
- textToBeInserted.value = null;
23
- };
24
- </script>
25
-
26
- <template>
27
- <TextEditorDialog>
28
- <header>Insert text</header>
29
- <section class="space-y-1">
30
- <BInput ref="inputRef" placeholder="Text to be inserted" :value="textToBeInserted || ''" @change="onInputChange" />
31
- </section>
32
- <div class="flex flex-1 justify-end">
33
- <BConfirmCancel confirm-label="Insert" @confirm="onInsert" @cancel="onCancelInsert" />
34
- </div>
35
- </TextEditorDialog>
36
- </template>
@@ -1,3 +0,0 @@
1
- export { default as FormattingButton } from "./FormattingButton.vue";
2
- export { default as InsertLinkDialog } from "./InsertLinkDialog.vue";
3
- export { default as InsertTextDialog } from "./InsertTextDialog.vue";
@@ -1 +0,0 @@
1
- export { default as BTextEditor } from "./TextEditor.vue";
@@ -1,113 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, onBeforeMount, ref, watch } from "vue";
3
-
4
- const props = withDefaults(
5
- defineProps<{
6
- value: string;
7
- highlight?: string | null;
8
- bold?: boolean;
9
- underline?: boolean;
10
- textColorClass?: string;
11
- backgroundColor?: "yellow" | "green" | "blue" | "red" | "pink" | "white" | null;
12
- }>(),
13
- {
14
- highlight: null,
15
- bold: false,
16
- underline: false,
17
- textColorClass: "text-primary",
18
- backgroundColor: null,
19
- },
20
- );
21
-
22
- const segments = ref<string[]>([]);
23
-
24
- const highlightColorClasses = computed(() => {
25
- if (!props.backgroundColor) return "";
26
-
27
- const base = "ring-2 shadow-sm ";
28
- switch (props.backgroundColor) {
29
- case "yellow":
30
- return `${base}bg-yellow-500 ring-yellow-500`;
31
- case "green":
32
- return `${base}bg-green-500 ring-green-500`;
33
- case "blue":
34
- return `${base}bg-blue-500 ring-blue-500`;
35
- case "red":
36
- return `${base}bg-red-500 ring-red-500`;
37
- case "pink":
38
- return `${base}bg-pink-500 ring-pink-500`;
39
- case "white":
40
- return `${base}bg-white ring-white`;
41
- default:
42
- return `${base}bg-yellow-500 ring-yellow-500`;
43
- }
44
- });
45
-
46
- const segmentiseString = (targetString: string, searchString: string) => {
47
- if (!targetString || !searchString) return [];
48
- if (typeof targetString !== "string" || typeof searchString !== "string") return [];
49
-
50
- const lowerCasedTargetString = targetString.toLowerCase();
51
- const lowerCasedSearchString = searchString.toLowerCase();
52
-
53
- const segmentBreakPoints = [];
54
- let resultIndex = -1;
55
-
56
- do {
57
- resultIndex = lowerCasedTargetString.indexOf(lowerCasedSearchString, resultIndex + 1);
58
- if (resultIndex !== -1) {
59
- segmentBreakPoints.push(resultIndex, resultIndex + lowerCasedSearchString.length);
60
- }
61
- } while (resultIndex > -1);
62
-
63
- const segments = [];
64
- let segmentIndex = 0;
65
-
66
- for (const highlight of segmentBreakPoints) {
67
- segments.push(targetString.substring(segmentIndex, highlight));
68
- segmentIndex = highlight;
69
- }
70
-
71
- segments.push(targetString.substring(segmentBreakPoints[segmentBreakPoints.length - 1], targetString.length));
72
-
73
- return segments;
74
- };
75
-
76
- onBeforeMount(() => {
77
- segments.value = props.highlight ? segmentiseString(props.value, props.highlight) : [];
78
- });
79
-
80
- watch(
81
- () => props.highlight,
82
- (newValue: string | null) => {
83
- segments.value = newValue ? segmentiseString(props.value, newValue) : [];
84
- },
85
- );
86
- </script>
87
-
88
- <template>
89
- <span class="relative z-0">
90
- <template v-if="segments.length === 0">
91
- {{ value }}
92
- </template>
93
- <template v-for="segment in segments" v-else :key="segment">
94
- <span
95
- v-if="highlight && segment.toLowerCase() === highlight.toLowerCase()"
96
- class="relative z-0 rounded"
97
- :class="[
98
- {
99
- 'font-bold': bold,
100
- 'underline': underline,
101
- },
102
- highlightColorClasses,
103
- textColorClass,
104
- ]"
105
- >
106
- {{ segment }}
107
- </span>
108
- <span v-else class="relative z-10">
109
- {{ segment }}
110
- </span>
111
- </template>
112
- </span>
113
- </template>
@@ -1 +0,0 @@
1
- export { default as BTextHighlight } from "./TextHighlight.vue";