@firstnoodle-ui/bui 0.0.28 → 0.0.29

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 (318) hide show
  1. package/dist/bui.css +1 -1
  2. package/dist/components/horizontal-layout/Aside.vue.d.ts +2 -6
  3. package/dist/components/index.d.ts +1 -0
  4. package/dist/components/modal/Modal.vue.d.ts +9 -3
  5. package/dist/components/tree-list/InputNode.vue.d.ts +90 -0
  6. package/dist/components/tree-list/TreeList.vue.d.ts +27 -0
  7. package/dist/components/tree-list/index.d.ts +2 -0
  8. package/dist/components/tree-list/types.d.ts +14 -0
  9. package/dist/index.mjs +6595 -6371
  10. package/package.json +22 -11
  11. package/src/components/application-wrapper/ApplicationWrapper.vue +0 -8
  12. package/src/components/application-wrapper/index.ts +0 -1
  13. package/src/components/aside-section-label/AsideSectionLabel.vue +0 -16
  14. package/src/components/aside-section-label/index.ts +0 -1
  15. package/src/components/button/Button.vue +0 -246
  16. package/src/components/button/NotificationBadge.vue +0 -15
  17. package/src/components/button/components/button-label/ButtonLabel.vue +0 -9
  18. package/src/components/button/components/button-label/index.ts +0 -1
  19. package/src/components/button/components/index.ts +0 -3
  20. package/src/components/button/components/left-group/LeftGroup.vue +0 -5
  21. package/src/components/button/components/left-group/index.ts +0 -1
  22. package/src/components/button/components/notification-badge/NotificationBadge.vue +0 -17
  23. package/src/components/button/components/notification-badge/index.ts +0 -1
  24. package/src/components/button/index.ts +0 -1
  25. package/src/components/button-group/ButtonGroup.vue +0 -97
  26. package/src/components/button-group/index.ts +0 -1
  27. package/src/components/calendar-view/CalendarView.vue +0 -106
  28. package/src/components/calendar-view/components/DateButton.vue +0 -23
  29. package/src/components/calendar-view/components/DecadeView.vue +0 -50
  30. package/src/components/calendar-view/components/MonthView.vue +0 -72
  31. package/src/components/calendar-view/components/NavButton.vue +0 -16
  32. package/src/components/calendar-view/components/YearView.vue +0 -52
  33. package/src/components/calendar-view/composables/useCalendar.ts +0 -138
  34. package/src/components/calendar-view/index.ts +0 -1
  35. package/src/components/calendar-view/utils/enums.ts +0 -31
  36. package/src/components/calendar-view/utils/index.ts +0 -240
  37. package/src/components/calendar-view/utils/types.ts +0 -13
  38. package/src/components/calendar-view/utils/utils/calendar.ts +0 -70
  39. package/src/components/calendar-view/utils/utils/date.ts +0 -130
  40. package/src/components/calendar-view/utils/utils/format.ts +0 -61
  41. package/src/components/calendar-view/utils/utils/time.ts +0 -70
  42. package/src/components/checkbox/Checkbox.vue +0 -51
  43. package/src/components/checkbox/CircleIndicator.vue +0 -26
  44. package/src/components/checkbox/DefaultIndicator.vue +0 -19
  45. package/src/components/checkbox/index.ts +0 -1
  46. package/src/components/collapse/Collapse.vue +0 -114
  47. package/src/components/collapse/index.ts +0 -1
  48. package/src/components/confirm-cancel/ConfirmCancel.vue +0 -66
  49. package/src/components/confirm-cancel/index.ts +0 -1
  50. package/src/components/confirm-cancel/types.ts +0 -18
  51. package/src/components/content-slider/ContentSlider.vue +0 -79
  52. package/src/components/content-slider/index.ts +0 -1
  53. package/src/components/data-point/DataPoint.vue +0 -5
  54. package/src/components/data-point/index.ts +0 -1
  55. package/src/components/delete-button/DeleteButton.vue +0 -19
  56. package/src/components/delete-button/index.ts +0 -1
  57. package/src/components/dialog/Dialog.vue +0 -70
  58. package/src/components/dialog/index.ts +0 -1
  59. package/src/components/fade-in-up/FadeInUp.vue +0 -17
  60. package/src/components/fade-in-up/index.ts +0 -1
  61. package/src/components/filter-chip/FilterChip.vue +0 -28
  62. package/src/components/filter-chip/index.ts +0 -1
  63. package/src/components/first-paint/FirstPaint.vue +0 -21
  64. package/src/components/first-paint/index.ts +0 -1
  65. package/src/components/first-paint/style.scss +0 -23
  66. package/src/components/flexbox/Flexbox.vue +0 -51
  67. package/src/components/flexbox/index.ts +0 -1
  68. package/src/components/horizontal-layout/Aside.vue +0 -114
  69. package/src/components/horizontal-layout/HorizontalLayout.vue +0 -118
  70. package/src/components/horizontal-layout/index.ts +0 -2
  71. package/src/components/icon/Icon.vue +0 -1263
  72. package/src/components/icon/index.ts +0 -1
  73. package/src/components/icon/utils/combine-svgs.cjs +0 -55
  74. package/src/components/icon/utils/combined-svgs.txt +0 -1150
  75. package/src/components/icon/utils/svgs/admin.svg +0 -16
  76. package/src/components/icon/utils/svgs/arrow-deviate.svg +0 -3
  77. package/src/components/icon/utils/svgs/arrow-down-plus.svg +0 -4
  78. package/src/components/icon/utils/svgs/arrow-down.svg +0 -3
  79. package/src/components/icon/utils/svgs/arrow-from.svg +0 -3
  80. package/src/components/icon/utils/svgs/arrow-left.svg +0 -3
  81. package/src/components/icon/utils/svgs/arrow-move.svg +0 -15
  82. package/src/components/icon/utils/svgs/arrow-right.svg +0 -3
  83. package/src/components/icon/utils/svgs/arrow-sub.svg +0 -3
  84. package/src/components/icon/utils/svgs/arrow-trend.svg +0 -15
  85. package/src/components/icon/utils/svgs/arrow-up-plus.svg +0 -4
  86. package/src/components/icon/utils/svgs/arrow-up.svg +0 -3
  87. package/src/components/icon/utils/svgs/authority.svg +0 -5
  88. package/src/components/icon/utils/svgs/beams.svg +0 -5
  89. package/src/components/icon/utils/svgs/bell.svg +0 -15
  90. package/src/components/icon/utils/svgs/bold.svg +0 -3
  91. package/src/components/icon/utils/svgs/box.svg +0 -5
  92. package/src/components/icon/utils/svgs/building.svg +0 -15
  93. package/src/components/icon/utils/svgs/bullet-list.svg +0 -8
  94. package/src/components/icon/utils/svgs/calendar.svg +0 -21
  95. package/src/components/icon/utils/svgs/camera.svg +0 -5
  96. package/src/components/icon/utils/svgs/categories.svg +0 -3
  97. package/src/components/icon/utils/svgs/check-circled.svg +0 -16
  98. package/src/components/icon/utils/svgs/check-outline.svg +0 -15
  99. package/src/components/icon/utils/svgs/check.svg +0 -3
  100. package/src/components/icon/utils/svgs/chevron-down.svg +0 -3
  101. package/src/components/icon/utils/svgs/chevron-left-double.svg +0 -4
  102. package/src/components/icon/utils/svgs/chevron-left.svg +0 -3
  103. package/src/components/icon/utils/svgs/chevron-right-double.svg +0 -4
  104. package/src/components/icon/utils/svgs/chevron-right.svg +0 -3
  105. package/src/components/icon/utils/svgs/chevron-up.svg +0 -3
  106. package/src/components/icon/utils/svgs/clock.svg +0 -4
  107. package/src/components/icon/utils/svgs/close-outline.svg +0 -3
  108. package/src/components/icon/utils/svgs/close.svg +0 -3
  109. package/src/components/icon/utils/svgs/columns.svg +0 -3
  110. package/src/components/icon/utils/svgs/conclusion.svg +0 -17
  111. package/src/components/icon/utils/svgs/copy.svg +0 -16
  112. package/src/components/icon/utils/svgs/crosshair.svg +0 -15
  113. package/src/components/icon/utils/svgs/dash.svg +0 -3
  114. package/src/components/icon/utils/svgs/dashboard.svg +0 -3
  115. package/src/components/icon/utils/svgs/delete.svg +0 -4
  116. package/src/components/icon/utils/svgs/delta.svg +0 -3
  117. package/src/components/icon/utils/svgs/download.svg +0 -3
  118. package/src/components/icon/utils/svgs/drag.svg +0 -8
  119. package/src/components/icon/utils/svgs/drilldown.svg +0 -8
  120. package/src/components/icon/utils/svgs/edit.svg +0 -16
  121. package/src/components/icon/utils/svgs/envelope.svg +0 -3
  122. package/src/components/icon/utils/svgs/error.svg +0 -3
  123. package/src/components/icon/utils/svgs/export-document.svg +0 -16
  124. package/src/components/icon/utils/svgs/filter.svg +0 -6
  125. package/src/components/icon/utils/svgs/filters.svg +0 -4
  126. package/src/components/icon/utils/svgs/flag.svg +0 -3
  127. package/src/components/icon/utils/svgs/folder.svg +0 -15
  128. package/src/components/icon/utils/svgs/frequency.svg +0 -3
  129. package/src/components/icon/utils/svgs/fullscreen-off.svg +0 -3
  130. package/src/components/icon/utils/svgs/fullscreen-on.svg +0 -3
  131. package/src/components/icon/utils/svgs/graduate.svg +0 -3
  132. package/src/components/icon/utils/svgs/hamburger.svg +0 -5
  133. package/src/components/icon/utils/svgs/handshake.svg +0 -15
  134. package/src/components/icon/utils/svgs/heading-1.svg +0 -4
  135. package/src/components/icon/utils/svgs/heading-2.svg +0 -4
  136. package/src/components/icon/utils/svgs/heading.svg +0 -3
  137. package/src/components/icon/utils/svgs/home.svg +0 -3
  138. package/src/components/icon/utils/svgs/id-card.svg +0 -6
  139. package/src/components/icon/utils/svgs/id.svg +0 -4
  140. package/src/components/icon/utils/svgs/indent-left.svg +0 -7
  141. package/src/components/icon/utils/svgs/indent-right.svg +0 -7
  142. package/src/components/icon/utils/svgs/information.svg +0 -17
  143. package/src/components/icon/utils/svgs/italics.svg +0 -3
  144. package/src/components/icon/utils/svgs/itenary.svg +0 -11
  145. package/src/components/icon/utils/svgs/keyboard.svg +0 -11
  146. package/src/components/icon/utils/svgs/lightning.svg +0 -15
  147. package/src/components/icon/utils/svgs/link.svg +0 -4
  148. package/src/components/icon/utils/svgs/list-collapse.svg +0 -6
  149. package/src/components/icon/utils/svgs/list-expand.svg +0 -6
  150. package/src/components/icon/utils/svgs/location.svg +0 -4
  151. package/src/components/icon/utils/svgs/lock-locked.svg +0 -4
  152. package/src/components/icon/utils/svgs/lock-unlocked.svg +0 -4
  153. package/src/components/icon/utils/svgs/magnifying-glass.svg +0 -15
  154. package/src/components/icon/utils/svgs/map.svg +0 -3
  155. package/src/components/icon/utils/svgs/megaphone.svg +0 -3
  156. package/src/components/icon/utils/svgs/message.svg +0 -15
  157. package/src/components/icon/utils/svgs/microscope.svg +0 -3
  158. package/src/components/icon/utils/svgs/moon.svg +0 -3
  159. package/src/components/icon/utils/svgs/new-document.svg +0 -4
  160. package/src/components/icon/utils/svgs/news.svg +0 -15
  161. package/src/components/icon/utils/svgs/numbered-list.svg +0 -7
  162. package/src/components/icon/utils/svgs/open-link.svg +0 -16
  163. package/src/components/icon/utils/svgs/options.svg +0 -5
  164. package/src/components/icon/utils/svgs/page.svg +0 -7
  165. package/src/components/icon/utils/svgs/paper-plane.svg +0 -15
  166. package/src/components/icon/utils/svgs/paper.svg +0 -3
  167. package/src/components/icon/utils/svgs/pen-and-paper.svg +0 -4
  168. package/src/components/icon/utils/svgs/phase.svg +0 -15
  169. package/src/components/icon/utils/svgs/photo.svg +0 -4
  170. package/src/components/icon/utils/svgs/pie-chart.svg +0 -3
  171. package/src/components/icon/utils/svgs/plus.svg +0 -3
  172. package/src/components/icon/utils/svgs/point-left.svg +0 -3
  173. package/src/components/icon/utils/svgs/point-up.svg +0 -3
  174. package/src/components/icon/utils/svgs/popup.svg +0 -16
  175. package/src/components/icon/utils/svgs/question.svg +0 -17
  176. package/src/components/icon/utils/svgs/radio-tower.svg +0 -3
  177. package/src/components/icon/utils/svgs/recycle.svg +0 -3
  178. package/src/components/icon/utils/svgs/redo.svg +0 -3
  179. package/src/components/icon/utils/svgs/refresh.svg +0 -3
  180. package/src/components/icon/utils/svgs/route.svg +0 -3
  181. package/src/components/icon/utils/svgs/rows.svg +0 -3
  182. package/src/components/icon/utils/svgs/scope.svg +0 -7
  183. package/src/components/icon/utils/svgs/settings.svg +0 -16
  184. package/src/components/icon/utils/svgs/share.svg +0 -11
  185. package/src/components/icon/utils/svgs/sign-in.svg +0 -4
  186. package/src/components/icon/utils/svgs/sign-up.svg +0 -3
  187. package/src/components/icon/utils/svgs/sort-down.svg +0 -20
  188. package/src/components/icon/utils/svgs/sort-up.svg +0 -20
  189. package/src/components/icon/utils/svgs/sort.svg +0 -7
  190. package/src/components/icon/utils/svgs/square-solid.svg +0 -3
  191. package/src/components/icon/utils/svgs/star-solid.svg +0 -15
  192. package/src/components/icon/utils/svgs/star.svg +0 -15
  193. package/src/components/icon/utils/svgs/stop-watch.svg +0 -5
  194. package/src/components/icon/utils/svgs/structure.svg +0 -3
  195. package/src/components/icon/utils/svgs/sun.svg +0 -23
  196. package/src/components/icon/utils/svgs/table.svg +0 -3
  197. package/src/components/icon/utils/svgs/tag.svg +0 -15
  198. package/src/components/icon/utils/svgs/team.svg +0 -15
  199. package/src/components/icon/utils/svgs/telescope.svg +0 -15
  200. package/src/components/icon/utils/svgs/trash.svg +0 -6
  201. package/src/components/icon/utils/svgs/triangle-angle.svg +0 -3
  202. package/src/components/icon/utils/svgs/triangle-side.svg +0 -3
  203. package/src/components/icon/utils/svgs/underline.svg +0 -4
  204. package/src/components/icon/utils/svgs/undo.svg +0 -3
  205. package/src/components/icon/utils/svgs/user.svg +0 -16
  206. package/src/components/icon/utils/svgs/venn.svg +0 -3
  207. package/src/components/icon/utils/svgs/video.svg +0 -3
  208. package/src/components/icon/utils/svgs/visibility-off-alt.svg +0 -19
  209. package/src/components/icon/utils/svgs/visibility-off.svg +0 -3
  210. package/src/components/icon/utils/svgs/visibility-on.svg +0 -16
  211. package/src/components/icon/utils/svgs/warning.svg +0 -5
  212. package/src/components/index.ts +0 -45
  213. package/src/components/input/Input.vue +0 -118
  214. package/src/components/input/index.ts +0 -1
  215. package/src/components/input-number/InputNumber.vue +0 -112
  216. package/src/components/input-number/StepButton.vue +0 -23
  217. package/src/components/input-number/index.ts +0 -1
  218. package/src/components/load-spinner/LoadSpinner.vue +0 -13
  219. package/src/components/load-spinner/index.ts +0 -1
  220. package/src/components/modal/Modal.vue +0 -111
  221. package/src/components/modal/index.ts +0 -1
  222. package/src/components/nav-item/NavItem.vue +0 -62
  223. package/src/components/nav-item/index.ts +0 -1
  224. package/src/components/notification/Notification.vue +0 -53
  225. package/src/components/notification/index.ts +0 -1
  226. package/src/components/notification-badge/NotificationBadge.vue +0 -7
  227. package/src/components/notification-badge/index.ts +0 -1
  228. package/src/components/pagination/Pagination.vue +0 -65
  229. package/src/components/pagination/index.ts +0 -1
  230. package/src/components/pop-confirm/PopConfirm.vue +0 -90
  231. package/src/components/pop-confirm/index.ts +0 -1
  232. package/src/components/pop-select/FooterButton.vue +0 -5
  233. package/src/components/pop-select/PopSelect.vue +0 -346
  234. package/src/components/pop-select/ResultFilters.vue +0 -28
  235. package/src/components/pop-select/enums.ts +0 -7
  236. package/src/components/pop-select/index.ts +0 -2
  237. package/src/components/pop-select/option.vue +0 -51
  238. package/src/components/popper/Popper.vue +0 -239
  239. package/src/components/popper/PopperContent.vue +0 -5
  240. package/src/components/popper/index.ts +0 -2
  241. package/src/components/popper/middleware.ts +0 -19
  242. package/src/components/screen-overlay/ScreenOverlay.vue +0 -53
  243. package/src/components/screen-overlay/index.ts +0 -1
  244. package/src/components/scrollbar/Bar.vue +0 -106
  245. package/src/components/scrollbar/ScrollBottomLoader.vue +0 -25
  246. package/src/components/scrollbar/Scrollbar.vue +0 -219
  247. package/src/components/scrollbar/enums.ts +0 -23
  248. package/src/components/scrollbar/index.ts +0 -3
  249. package/src/components/scrollbar/style.scss +0 -77
  250. package/src/components/scrollbar/types.ts +0 -32
  251. package/src/components/select-list/SelectList.vue +0 -476
  252. package/src/components/select-list/components/SelectListFilterChip.vue +0 -34
  253. package/src/components/select-list/components/index.ts +0 -3
  254. package/src/components/select-list/components/option-group/OptionGroup.vue +0 -20
  255. package/src/components/select-list/components/option-group/index.ts +0 -1
  256. package/src/components/select-list/components/select-list-option/SelectListOption.vue +0 -83
  257. package/src/components/select-list/components/select-list-option/index.ts +0 -1
  258. package/src/components/select-list/components/status-cards/error-card/ErrorCard.vue +0 -17
  259. package/src/components/select-list/components/status-cards/error-card/index.ts +0 -1
  260. package/src/components/select-list/components/status-cards/idle-card/IdleCard.vue +0 -11
  261. package/src/components/select-list/components/status-cards/idle-card/index.ts +0 -1
  262. package/src/components/select-list/components/status-cards/index.ts +0 -4
  263. package/src/components/select-list/components/status-cards/loading-card/LoadingCard.vue +0 -10
  264. package/src/components/select-list/components/status-cards/loading-card/index.ts +0 -1
  265. package/src/components/select-list/components/status-cards/no-match-card/NoMatchCard.vue +0 -15
  266. package/src/components/select-list/components/status-cards/no-match-card/index.ts +0 -1
  267. package/src/components/select-list/components/status-cards/status-card/StatusCard.vue +0 -25
  268. package/src/components/select-list/components/status-cards/status-card/index.ts +0 -1
  269. package/src/components/select-list/index.ts +0 -5
  270. package/src/components/select-list/types.ts +0 -49
  271. package/src/components/side-over/SideOver.vue +0 -87
  272. package/src/components/side-over/index.ts +0 -1
  273. package/src/components/status-select/StatusIndicator.vue +0 -78
  274. package/src/components/status-select/StatusSelect.vue +0 -62
  275. package/src/components/status-select/index.ts +0 -1
  276. package/src/components/switch/Switch.vue +0 -52
  277. package/src/components/switch/index.ts +0 -1
  278. package/src/components/tab/Tab.vue +0 -65
  279. package/src/components/tab/index.ts +0 -1
  280. package/src/components/tag/Tag.vue +0 -34
  281. package/src/components/tag/index.ts +0 -1
  282. package/src/components/text-editor/TextEditor.vue +0 -399
  283. package/src/components/text-editor/components/Dialog.vue +0 -11
  284. package/src/components/text-editor/components/FormattingButton.vue +0 -46
  285. package/src/components/text-editor/components/InsertLinkDialog.vue +0 -81
  286. package/src/components/text-editor/components/InsertTextDialog.vue +0 -36
  287. package/src/components/text-editor/components/index.ts +0 -3
  288. package/src/components/text-editor/index.ts +0 -1
  289. package/src/components/text-highlight/TextHighlight.vue +0 -113
  290. package/src/components/text-highlight/index.ts +0 -1
  291. package/src/components/text-viewer/TextViewer.vue +0 -5
  292. package/src/components/text-viewer/index.ts +0 -1
  293. package/src/components/toggle-button/ToggleButton.vue +0 -105
  294. package/src/components/toggle-button/index.ts +0 -1
  295. package/src/components/tooltip/Tooltip.vue +0 -54
  296. package/src/components/tooltip/index.ts +0 -1
  297. package/src/components/types.ts +0 -232
  298. package/src/components/vertical-layout/RunningSection.vue +0 -54
  299. package/src/components/vertical-layout/VerticalLayout.vue +0 -37
  300. package/src/components/vertical-layout/index.ts +0 -3
  301. package/src/components/vertical-layout/types.ts +0 -2
  302. package/src/components/window-frame/WindowFrame.vue +0 -20
  303. package/src/components/window-frame/index.ts +0 -1
  304. package/src/composables/index.ts +0 -5
  305. package/src/composables/useClickOutside.ts +0 -48
  306. package/src/composables/useEscapeKey.ts +0 -12
  307. package/src/composables/useMounted.ts +0 -7
  308. package/src/composables/useNextFrame.ts +0 -10
  309. package/src/composables/useTrapFocus.ts +0 -61
  310. package/src/index.ts +0 -5
  311. package/src/main.css +0 -140
  312. package/src/utils/array.ts +0 -11
  313. package/src/utils/capitalizeFirstLetter.ts +0 -4
  314. package/src/utils/clamp.ts +0 -9
  315. package/src/utils/debounce.ts +0 -8
  316. package/src/utils/index.ts +0 -5
  317. package/src/utils/scrollIntoView.ts +0 -25
  318. package/src/utils/scrollbarWidth.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 dark:text-black",
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";