frappe-ui 1.0.0-beta.1 → 1.0.0-beta.2

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 (64) hide show
  1. package/package.json +7 -1
  2. package/src/molecules/editor/components/ImageViewerModal.vue +6 -6
  3. package/src/molecules/editor/components/MediaNodeView.vue +6 -6
  4. package/src/molecules/editor/components/MediaToolbar.vue +1 -1
  5. package/src/molecules/editor/components/font-color/ColorSwatchGrid.vue +1 -1
  6. package/src/molecules/editor/components/font-color/fontColorController.ts +2 -2
  7. package/src/molecules/editor/components/font-color/swatches.ts +1 -1
  8. package/src/molecules/editor/components/image-viewer/ImageViewerControlsBar.vue +1 -1
  9. package/src/molecules/editor/components/media-node-view-controller.ts +1 -1
  10. package/src/molecules/editor/composables/useNamedColorState.ts +1 -1
  11. package/src/molecules/editor/composables/useNodeViewResize.ts +1 -1
  12. package/src/molecules/editor/composables/useSuggestionList.ts +2 -2
  13. package/src/molecules/editor/composables/useTocActiveHeading.ts +1 -1
  14. package/src/molecules/editor/composables/useTocAnchors.ts +2 -2
  15. package/src/molecules/editor/extensions/code-block/CodeBlockComponent.vue +2 -2
  16. package/src/molecules/editor/extensions/code-block/code-block.ts +1 -1
  17. package/src/molecules/editor/extensions/content-paste/content-paste-extension.ts +3 -3
  18. package/src/molecules/editor/extensions/content-paste/paste-image-controller.test.ts +1 -1
  19. package/src/molecules/editor/extensions/content-paste/paste-image-controller.ts +1 -1
  20. package/src/molecules/editor/extensions/content-paste/paste-markdown-utils.ts +2 -2
  21. package/src/molecules/editor/extensions/emoji/EmojiList.vue +2 -2
  22. package/src/molecules/editor/extensions/emoji/emoji-extension.ts +1 -1
  23. package/src/molecules/editor/extensions/iframe/IframeInsertDialog.vue +3 -3
  24. package/src/molecules/editor/extensions/iframe/IframeNodeView.vue +3 -3
  25. package/src/molecules/editor/extensions/iframe/iframe-allowlist.ts +1 -1
  26. package/src/molecules/editor/extensions/iframe/iframe-embed-utils.ts +1 -1
  27. package/src/molecules/editor/extensions/iframe/iframe-paste-handler.ts +1 -1
  28. package/src/molecules/editor/extensions/image/image-engine.ts +3 -3
  29. package/src/molecules/editor/extensions/image/image-extension.ts +7 -7
  30. package/src/molecules/editor/extensions/image-group/ImageGroupGridCell.vue +1 -1
  31. package/src/molecules/editor/extensions/image-group/ImageGroupNodeView.vue +5 -5
  32. package/src/molecules/editor/extensions/image-group/ImageGroupUploadDialog.vue +5 -5
  33. package/src/molecules/editor/extensions/image-group/image-group-commands.ts +2 -2
  34. package/src/molecules/editor/extensions/image-group/image-group-extension.ts +1 -1
  35. package/src/molecules/editor/extensions/image-group/image-group-utils.ts +1 -1
  36. package/src/molecules/editor/extensions/image-group/useImageGroupDialog.ts +2 -2
  37. package/src/molecules/editor/extensions/link/LinkEditorPopup.vue +3 -3
  38. package/src/molecules/editor/extensions/link/link-commands.ts +2 -2
  39. package/src/molecules/editor/extensions/link/link-paste-plugin.ts +1 -1
  40. package/src/molecules/editor/extensions/link/link-popup-controller.ts +1 -1
  41. package/src/molecules/editor/extensions/mention/mention-extension.ts +1 -1
  42. package/src/molecules/editor/extensions/shared/media-node-ops.ts +3 -3
  43. package/src/molecules/editor/extensions/shared/media-plugin.ts +3 -3
  44. package/src/molecules/editor/extensions/shared/media-upload-engine.test.ts +10 -10
  45. package/src/molecules/editor/extensions/shared/media-upload-engine.ts +8 -8
  46. package/src/molecules/editor/extensions/shared/media-upload-types.ts +3 -3
  47. package/src/molecules/editor/extensions/shared/suggestion-helpers.ts +1 -1
  48. package/src/molecules/editor/extensions/shared/suggestion-renderer.ts +1 -1
  49. package/src/molecules/editor/extensions/shared/suggestion-types.ts +1 -1
  50. package/src/molecules/editor/extensions/shared/upload-types.ts +1 -1
  51. package/src/molecules/editor/extensions/slash-commands/SlashCommandsList.vue +2 -2
  52. package/src/molecules/editor/extensions/slash-commands/slash-commands-extension.ts +2 -2
  53. package/src/molecules/editor/extensions/suggestion/SuggestionList.vue +2 -2
  54. package/src/molecules/editor/extensions/suggestion/SuggestionListItem.vue +1 -1
  55. package/src/molecules/editor/extensions/suggestion/createSuggestionExtension.ts +2 -2
  56. package/src/molecules/editor/extensions/suggestion/index.ts +1 -1
  57. package/src/molecules/editor/extensions/tag/tag-extension.ts +1 -1
  58. package/src/molecules/editor/extensions/toc-node/TocItem.vue +2 -2
  59. package/src/molecules/editor/extensions/toc-node/TocNodeView.vue +6 -6
  60. package/src/molecules/editor/extensions/toc-node/toc-render.ts +2 -2
  61. package/src/molecules/editor/extensions/toc-node/toc-scroll-controller.ts +1 -1
  62. package/src/molecules/editor/extensions/video/video-config.ts +2 -2
  63. package/src/molecules/editor/extensions/video/video-extension.ts +6 -6
  64. package/tailwind/preset.js +4 -0
package/package.json CHANGED
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "name": "frappe-ui",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0-beta.2",
4
4
  "description": "A set of components and utilities for rapid UI development",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
+ "imports": {
8
+ "#components/*": "./src/components/*",
9
+ "#molecules/*": "./src/molecules/*",
10
+ "#composables/*": "./src/composables/*",
11
+ "#utils/*": "./src/utils/*"
12
+ },
7
13
  "scripts": {
8
14
  "test": "vitest --run",
9
15
  "test:coverage": "vitest --run --coverage",
@@ -71,12 +71,12 @@
71
71
 
72
72
  <script setup lang="ts">
73
73
  import { computed, onMounted, onUnmounted, ref, toRef, watch } from 'vue'
74
- import { useTouchHandler } from '@composables/useTouchHandler'
75
- import { useImageNavigation } from '@composables/useImageNavigation'
76
- import { useZoomPan } from '@composables/useZoomPan'
77
- import { useControlsAutoHide } from '@molecules/editor/composables/useControlsAutoHide'
78
- import { useFullscreen } from '@molecules/editor/composables/useFullscreen'
79
- import { useElementSize } from '@molecules/editor/composables/useElementSize'
74
+ import { useTouchHandler } from '#composables/useTouchHandler'
75
+ import { useImageNavigation } from '#composables/useImageNavigation'
76
+ import { useZoomPan } from '#composables/useZoomPan'
77
+ import { useControlsAutoHide } from '#molecules/editor/composables/useControlsAutoHide'
78
+ import { useFullscreen } from '#molecules/editor/composables/useFullscreen'
79
+ import { useElementSize } from '#molecules/editor/composables/useElementSize'
80
80
  import ImageViewerControlsBar from './image-viewer/ImageViewerControlsBar.vue'
81
81
  import { downloadImage } from './image-viewer/imageViewerDownload'
82
82
  import { createImageViewerKeydown } from './image-viewer/imageViewerKeymap'
@@ -1,12 +1,12 @@
1
1
  <script setup lang="ts">
2
2
  import { ref, computed, watch, toRaw } from 'vue'
3
3
  import { NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'
4
- import LoadingIndicator from '@components/LoadingIndicator.vue'
5
- import Button from '@components/Button/Button.vue'
6
- import { ErrorMessage } from '@components/ErrorMessage'
7
- import { getLocalFile } from '@molecules/editor/extensions/shared/media-upload-state'
8
- import { useNodeViewEditable } from '@molecules/editor/composables/useNodeViewEditable'
9
- import { useNodeViewResize } from '@molecules/editor/composables/useNodeViewResize'
4
+ import LoadingIndicator from '#components/LoadingIndicator.vue'
5
+ import Button from '#components/Button/Button.vue'
6
+ import { ErrorMessage } from '#components/ErrorMessage'
7
+ import { getLocalFile } from '#molecules/editor/extensions/shared/media-upload-state'
8
+ import { useNodeViewEditable } from '#molecules/editor/composables/useNodeViewEditable'
9
+ import { useNodeViewResize } from '#molecules/editor/composables/useNodeViewResize'
10
10
  import MediaToolbar from './MediaToolbar.vue'
11
11
  import {
12
12
  wrapperClasses,
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import { ref, computed, onMounted, onUnmounted } from 'vue'
3
3
  import type { Node } from '@tiptap/pm/model'
4
- import Tooltip from '@components/Tooltip/Tooltip.vue'
4
+ import Tooltip from '#components/Tooltip/Tooltip.vue'
5
5
  import { alignIcon, type MediaAlign } from './media-node-view-utils'
6
6
 
7
7
  const props = defineProps<{
@@ -27,7 +27,7 @@
27
27
  </template>
28
28
 
29
29
  <script setup lang="ts">
30
- import Tooltip from '@components/Tooltip/Tooltip.vue'
30
+ import Tooltip from '#components/Tooltip/Tooltip.vue'
31
31
  import type { ColorSwatch } from './swatches'
32
32
 
33
33
  defineProps<{
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, h } from 'vue'
2
2
  import type { Editor } from '@tiptap/core'
3
- import { useFloatingPopup } from '@molecules/editor/composables/useFloatingPopup'
4
- import { useNamedColorState } from '@molecules/editor/composables/useNamedColorState'
3
+ import { useFloatingPopup } from '#molecules/editor/composables/useFloatingPopup'
4
+ import { useNamedColorState } from '#molecules/editor/composables/useNamedColorState'
5
5
  import ColorSwatchGrid from './ColorSwatchGrid.vue'
6
6
  import { highlightSwatches, textSwatches } from './swatches'
7
7
 
@@ -12,7 +12,7 @@
12
12
  import {
13
13
  PALETTE_COLORS,
14
14
  type PaletteColor,
15
- } from '@molecules/editor/extensions/shared/color-palette'
15
+ } from '#molecules/editor/extensions/shared/color-palette'
16
16
 
17
17
  export interface ColorSwatch {
18
18
  /** Lowercase palette value stored on the mark, e.g. `'blue'`. `null` = Default. */
@@ -100,7 +100,7 @@
100
100
  </template>
101
101
 
102
102
  <script setup lang="ts">
103
- import Tooltip from '@components/Tooltip/Tooltip.vue'
103
+ import Tooltip from '#components/Tooltip/Tooltip.vue'
104
104
 
105
105
  defineProps<{
106
106
  visible: boolean
@@ -10,7 +10,7 @@
10
10
  * logic — hence the `*-controller.ts` suffix per CONVENTIONS §3.2.
11
11
  */
12
12
  import type { Editor } from '@tiptap/core'
13
- import { safeGetPos } from '@molecules/editor/extensions/shared/node-view'
13
+ import { safeGetPos } from '#molecules/editor/extensions/shared/node-view'
14
14
  import type { MediaAlign } from './media-node-view-utils'
15
15
 
16
16
  type GetPos = () => number | undefined
@@ -1,6 +1,6 @@
1
1
  import type { Editor } from '@tiptap/core'
2
2
  import { onBeforeUnmount, onMounted, ref, type Ref } from 'vue'
3
- import { PALETTE_NAMES } from '@molecules/editor/extensions/shared/color-palette'
3
+ import { PALETTE_NAMES } from '#molecules/editor/extensions/shared/color-palette'
4
4
 
5
5
  export interface NamedColorState {
6
6
  /** The active named text color, or `null` when none / mixed / unset. */
@@ -17,7 +17,7 @@
17
17
  */
18
18
  import { ref, onUnmounted, type Ref } from 'vue'
19
19
  import type { Editor } from '@tiptap/core'
20
- import { safeGetPos } from '@molecules/editor/extensions/shared/node-view'
20
+ import { safeGetPos } from '#molecules/editor/extensions/shared/node-view'
21
21
 
22
22
  export interface ResizeArgs {
23
23
  /** The element being resized (image / video / iframe). May be null pre-mount. */
@@ -1,11 +1,11 @@
1
1
  import { ref, watch, type Ref } from 'vue'
2
- import type { SuggestionListExpose } from '@molecules/editor/extensions/shared/suggestion-types'
2
+ import type { SuggestionListExpose } from '#molecules/editor/extensions/shared/suggestion-types'
3
3
 
4
4
  /**
5
5
  * Selection + keyboard state machine shared by `SuggestionList.vue`.
6
6
  *
7
7
  * Canonical import path:
8
- * `@molecules/editor/composables/useSuggestionList`
8
+ * `#molecules/editor/composables/useSuggestionList`
9
9
  *
10
10
  * Owns the empty-list guard: ArrowUp/ArrowDown short-circuit when there are no
11
11
  * items, so the wrap-around index math never evaluates `% 0` (which would yield
@@ -7,7 +7,7 @@ import {
7
7
  type Ref,
8
8
  } from 'vue'
9
9
  import type { Editor } from '@tiptap/core'
10
- import type { HeadingInfo } from '@molecules/editor/extensions/shared/heading-scope'
10
+ import type { HeadingInfo } from '#molecules/editor/extensions/shared/heading-scope'
11
11
 
12
12
  const ACTIVE_TOP_THRESHOLD = -50
13
13
  const ACTIVE_BOTTOM_THRESHOLD = 100
@@ -13,11 +13,11 @@ import {
13
13
  getActiveTabId,
14
14
  getActiveTabRange,
15
15
  type HeadingInfo,
16
- } from '@molecules/editor/extensions/shared/heading-scope'
16
+ } from '#molecules/editor/extensions/shared/heading-scope'
17
17
  import {
18
18
  foldHeadings,
19
19
  type HeadingTreeNode,
20
- } from '@molecules/editor/extensions/shared/heading-tree-utils'
20
+ } from '#molecules/editor/extensions/shared/heading-tree-utils'
21
21
 
22
22
  export type TocAnchorTree = HeadingTreeNode<HeadingInfo>[]
23
23
 
@@ -27,8 +27,8 @@
27
27
  import { computed, toRaw } from 'vue'
28
28
  import { NodeViewContent, nodeViewProps, NodeViewWrapper } from '@tiptap/vue-3'
29
29
  import { createLowlight } from 'lowlight'
30
- import { useNodeViewEditable } from '@molecules/editor/composables/useNodeViewEditable'
31
- import { listEditorLanguages } from '@molecules/editor/extensions/shared/lowlight-languages'
30
+ import { useNodeViewEditable } from '#molecules/editor/composables/useNodeViewEditable'
31
+ import { listEditorLanguages } from '#molecules/editor/extensions/shared/lowlight-languages'
32
32
  import './CodeBlockComponent.css'
33
33
 
34
34
  type Lowlight = ReturnType<typeof createLowlight>
@@ -3,7 +3,7 @@ import CodeBlockLowlight from '@tiptap/extension-code-block-lowlight'
3
3
  import Code from '@tiptap/extension-code'
4
4
  import { VueNodeViewRenderer } from '@tiptap/vue-3'
5
5
  import { markInputRule } from '@tiptap/core'
6
- import { toggleCodeOnBacktick } from '@molecules/editor/extensions/shared/toggle-code-shortcut'
6
+ import { toggleCodeOnBacktick } from '#molecules/editor/extensions/shared/toggle-code-shortcut'
7
7
  import {
8
8
  INDENT,
9
9
  getCodeBlockCtx,
@@ -21,9 +21,9 @@ import { Extension } from '@tiptap/core'
21
21
  import { Plugin, PluginKey } from '@tiptap/pm/state'
22
22
  import { Slice } from '@tiptap/pm/model'
23
23
  import type { EditorView } from '@tiptap/pm/view'
24
- import type { UploadedFile } from '@utils/useFileUpload'
25
- import { imageEngine } from '@molecules/editor/extensions/image/image-engine'
26
- import { resolveUploadOptions } from '@molecules/editor/extensions/shared/media-upload-engine'
24
+ import type { UploadedFile } from '#utils/useFileUpload'
25
+ import { imageEngine } from '#molecules/editor/extensions/image/image-engine'
26
+ import { resolveUploadOptions } from '#molecules/editor/extensions/shared/media-upload-engine'
27
27
  import { absolutizeMediaSrcs } from './media-src-utils'
28
28
  import { htmlContainsImage } from './paste-html-utils'
29
29
  import { tryMarkdownSlice } from './paste-markdown-utils'
@@ -24,7 +24,7 @@ vi.mock('./paste-html-utils', () => ({
24
24
  { node: { type: { name: 'image' } }, pos: 5, src: DATA_SRC },
25
25
  ]),
26
26
  }))
27
- vi.mock('@molecules/editor/extensions/shared/media-upload-engine', () => ({
27
+ vi.mock('#molecules/editor/extensions/shared/media-upload-engine', () => ({
28
28
  dataUrlOrBlobToFile: vi.fn(
29
29
  async () => new File(['x'], 'p.png', { type: 'image/png' }),
30
30
  ),
@@ -34,7 +34,7 @@ import {
34
34
  dataUrlOrBlobToFile,
35
35
  type MediaUploadEngine,
36
36
  type MediaUploadOptions,
37
- } from '@molecules/editor/extensions/shared/media-upload-engine'
37
+ } from '#molecules/editor/extensions/shared/media-upload-engine'
38
38
  import { collectImageNodes, parseHtmlToSlice } from './paste-html-utils'
39
39
 
40
40
  /**
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Markdown-from-plaintext paste helper.
3
3
  *
4
- * Wraps `@utils/markdown` so the extension can stay declarative: detect whether
4
+ * Wraps `#utils/markdown` so the extension can stay declarative: detect whether
5
5
  * a pasted plaintext string looks like markdown and, if so, render it to a
6
6
  * ProseMirror {@link Slice}. Returns `null` when the text is not markdown.
7
7
  */
8
8
  import type { Schema, Slice } from '@tiptap/pm/model'
9
- import { detectMarkdown, markdownToHTML } from '@utils/markdown'
9
+ import { detectMarkdown, markdownToHTML } from '#utils/markdown'
10
10
  import { parseHtmlToSlice } from './paste-html-utils'
11
11
 
12
12
  /**
@@ -17,8 +17,8 @@
17
17
  import { ref, type PropType } from 'vue'
18
18
  import SuggestionList from '../suggestion/SuggestionList.vue'
19
19
  import type { Editor, Range } from '@tiptap/core'
20
- import type { SuggestionListExpose } from '@molecules/editor/extensions/shared/suggestion-types'
21
- import { forwardKeyDown } from '@molecules/editor/composables/useSuggestionList'
20
+ import type { SuggestionListExpose } from '#molecules/editor/extensions/shared/suggestion-types'
21
+ import { forwardKeyDown } from '#molecules/editor/composables/useSuggestionList'
22
22
  import type { EmojiItem } from './emoji-extension'
23
23
 
24
24
  const props = defineProps({
@@ -3,7 +3,7 @@ import {
3
3
  type BaseSuggestionItem,
4
4
  createSuggestionExtension,
5
5
  } from '../suggestion/createSuggestionExtension'
6
- import { filterByQuery } from '@molecules/editor/extensions/shared/suggestion-helpers'
6
+ import { filterByQuery } from '#molecules/editor/extensions/shared/suggestion-helpers'
7
7
  import EmojiList from './EmojiList.vue'
8
8
  import _EMOJIS from './emojis.json'
9
9
 
@@ -45,9 +45,9 @@
45
45
  <script setup lang="ts">
46
46
  import { computed, onMounted, nextTick, useTemplateRef } from 'vue'
47
47
  import type { Editor } from '@tiptap/core'
48
- import Dialog from '@components/Dialog/Dialog.vue'
49
- import Button from '@components/Button/Button.vue'
50
- import Textarea from '@components/Textarea/Textarea.vue'
48
+ import Dialog from '#components/Dialog/Dialog.vue'
49
+ import Button from '#components/Button/Button.vue'
50
+ import Textarea from '#components/Textarea/Textarea.vue'
51
51
  import { useIframeDialog } from './useIframeDialog'
52
52
 
53
53
  const props = defineProps<{
@@ -1,9 +1,9 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, ref, toRaw } from 'vue'
3
3
  import { NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'
4
- import { useNodeViewEditable } from '@molecules/editor/composables/useNodeViewEditable'
5
- import { useNodeViewResize } from '@molecules/editor/composables/useNodeViewResize'
6
- import { safeGetPos } from '@molecules/editor/extensions/shared/node-view'
4
+ import { useNodeViewEditable } from '#molecules/editor/composables/useNodeViewEditable'
5
+ import { useNodeViewResize } from '#molecules/editor/composables/useNodeViewResize'
6
+ import { safeGetPos } from '#molecules/editor/extensions/shared/node-view'
7
7
  import { IFRAME_SANDBOX } from './iframe-allowlist'
8
8
  import type { IframeAlign } from './iframe-commands'
9
9
 
@@ -11,7 +11,7 @@
11
11
  import {
12
12
  isSafeUrl,
13
13
  matchesHostname,
14
- } from '@molecules/editor/extensions/shared/url-safety'
14
+ } from '#molecules/editor/extensions/shared/url-safety'
15
15
 
16
16
  /**
17
17
  * Hostnames (and their embed sub-hosts) we permit as iframe sources.
@@ -12,7 +12,7 @@
12
12
  *
13
13
  * Everything is side-effect-free and unit-testable.
14
14
  */
15
- import { matchesHostname } from '@molecules/editor/extensions/shared/url-safety'
15
+ import { matchesHostname } from '#molecules/editor/extensions/shared/url-safety'
16
16
 
17
17
  const EDITOR_PADDING = 40
18
18
 
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import { Plugin, PluginKey } from '@tiptap/pm/state'
11
11
  import type { EditorView } from '@tiptap/pm/view'
12
- import { dispatchIfAlive } from '@molecules/editor/extensions/shared/node-view'
12
+ import { dispatchIfAlive } from '#molecules/editor/extensions/shared/node-view'
13
13
  import { validateIframeUrl } from './iframe-allowlist'
14
14
  import {
15
15
  processEmbedUrl,
@@ -7,9 +7,9 @@
7
7
  * so the node view can show a loading placeholder. All upload/queue/find/
8
8
  * dimension logic lives in the shared engine — this file only supplies config.
9
9
  */
10
- import { createMediaUploadEngine } from '@molecules/editor/extensions/shared/media-upload-engine'
11
- import { probeImageDimensions } from '@molecules/editor/extensions/shared/media-dimensions'
12
- import type { MediaUploadConfig } from '@molecules/editor/extensions/shared/media-upload-engine'
10
+ import { createMediaUploadEngine } from '#molecules/editor/extensions/shared/media-upload-engine'
11
+ import { probeImageDimensions } from '#molecules/editor/extensions/shared/media-dimensions'
12
+ import type { MediaUploadConfig } from '#molecules/editor/extensions/shared/media-upload-engine'
13
13
 
14
14
  export const imageUploadConfig: MediaUploadConfig = {
15
15
  nodeName: 'image',
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Everything imperative (staging files, placeholder insertion, dimension probe,
7
7
  * write-back, drop/paste, async-safe dispatch) lives in
8
- * `@molecules/editor/extensions/shared/*` and is shared with video. This file is
8
+ * `#molecules/editor/extensions/shared/*` and is shared with video. This file is
9
9
  * the TipTap shell only.
10
10
  */
11
11
  import {
@@ -15,15 +15,15 @@ import {
15
15
  } from '@tiptap/core'
16
16
  import type { Editor } from '@tiptap/core'
17
17
  import { VueNodeViewRenderer } from '@tiptap/vue-3'
18
- import type { UploadedFile } from '@utils/useFileUpload'
19
- import MediaNodeView from '@molecules/editor/components/MediaNodeView.vue'
20
- import { createMediaPlugin } from '@molecules/editor/extensions/shared/media-plugin'
21
- import { pickFiles } from '@molecules/editor/extensions/shared/file-picker'
22
- import { openImageGroupUploadDialog } from '@molecules/editor/extensions/image-group/imageGroupDialogController'
18
+ import type { UploadedFile } from '#utils/useFileUpload'
19
+ import MediaNodeView from '#molecules/editor/components/MediaNodeView.vue'
20
+ import { createMediaPlugin } from '#molecules/editor/extensions/shared/media-plugin'
21
+ import { pickFiles } from '#molecules/editor/extensions/shared/file-picker'
22
+ import { openImageGroupUploadDialog } from '#molecules/editor/extensions/image-group/imageGroupDialogController'
23
23
  import {
24
24
  resolveUploadOptions as resolveUploadOptionsBase,
25
25
  type MediaUploadOptions,
26
- } from '@molecules/editor/extensions/shared/media-upload-engine'
26
+ } from '#molecules/editor/extensions/shared/media-upload-engine'
27
27
  import { imageEngine, imageUploadConfig } from './image-engine'
28
28
 
29
29
  export interface ImageExtensionOptions {
@@ -67,7 +67,7 @@
67
67
 
68
68
  <script setup lang="ts">
69
69
  import { computed, nextTick, ref, useTemplateRef } from 'vue'
70
- import { useObjectUrl } from '@molecules/editor/composables/useObjectUrl'
70
+ import { useObjectUrl } from '#molecules/editor/composables/useObjectUrl'
71
71
  import { isImageSupported } from './image-group-utils'
72
72
  import type { ImageItem } from './useImageGroupDialog'
73
73
 
@@ -84,10 +84,10 @@ import { computed, ref, toRaw } from 'vue'
84
84
  import { NodeViewWrapper, type Editor } from '@tiptap/vue-3'
85
85
  import type { NodeViewProps } from '@tiptap/vue-3'
86
86
  import type { Node as ProseMirrorNode } from '@tiptap/pm/model'
87
- import Button from '@components/Button/Button.vue'
88
- import Select from '@components/Select/Select.vue'
89
- import ImageViewerModal from '@molecules/editor/components/ImageViewerModal.vue'
90
- import { useNodeViewEditable } from '@molecules/editor/composables/useNodeViewEditable'
87
+ import Button from '#components/Button/Button.vue'
88
+ import Select from '#components/Select/Select.vue'
89
+ import ImageViewerModal from '#molecules/editor/components/ImageViewerModal.vue'
90
+ import { useNodeViewEditable } from '#molecules/editor/composables/useNodeViewEditable'
91
91
  import ImageGroupUploadDialog from './ImageGroupUploadDialog.vue'
92
92
  import { clampColumns, columnSelectOptions } from './image-group-utils'
93
93
  import {
@@ -95,7 +95,7 @@ import {
95
95
  replaceImageGroup,
96
96
  setImageGroupColumns,
97
97
  } from './image-group-commands'
98
- import type { ExistingImage } from '@molecules/editor/extensions/shared/upload-types'
98
+ import type { ExistingImage } from '#molecules/editor/extensions/shared/upload-types'
99
99
 
100
100
  const props = defineProps<NodeViewProps & { editor: Editor }>()
101
101
 
@@ -132,11 +132,11 @@
132
132
 
133
133
  <script setup lang="ts">
134
134
  import { computed, useTemplateRef, watch } from 'vue'
135
- import Dialog from '@components/Dialog/Dialog.vue'
136
- import Button from '@components/Button/Button.vue'
137
- import Select from '@components/Select/Select.vue'
135
+ import Dialog from '#components/Dialog/Dialog.vue'
136
+ import Button from '#components/Button/Button.vue'
137
+ import Select from '#components/Select/Select.vue'
138
138
  import type { Editor } from '@tiptap/core'
139
- import { useScopedFileDrop } from '@molecules/editor/composables/useScopedFileDrop'
139
+ import { useScopedFileDrop } from '#molecules/editor/composables/useScopedFileDrop'
140
140
  import {
141
141
  clampColumns,
142
142
  columnSelectOptions,
@@ -145,7 +145,7 @@ import {
145
145
  import { useImageGroupDialog } from './useImageGroupDialog'
146
146
  import { useStrayDropGuard } from './useStrayDropGuard'
147
147
  import ImageGroupGrid from './ImageGroupGrid.vue'
148
- import type { ExistingImage } from '@molecules/editor/extensions/shared/upload-types'
148
+ import type { ExistingImage } from '#molecules/editor/extensions/shared/upload-types'
149
149
 
150
150
  const props = withDefaults(
151
151
  defineProps<{
@@ -9,9 +9,9 @@
9
9
  import type { CommandProps, RawCommands } from '@tiptap/core'
10
10
  import type { Node as ProseMirrorNode } from '@tiptap/pm/model'
11
11
  import type { Editor } from '@tiptap/core'
12
- import { safeGetPos } from '@molecules/editor/extensions/shared/node-view'
12
+ import { safeGetPos } from '#molecules/editor/extensions/shared/node-view'
13
13
  import { clampColumns } from './image-group-utils'
14
- import type { ExistingImage } from '@molecules/editor/extensions/shared/upload-types'
14
+ import type { ExistingImage } from '#molecules/editor/extensions/shared/upload-types'
15
15
 
16
16
  const IMAGE_GROUP = 'imageGroup'
17
17
 
@@ -3,7 +3,7 @@ import { VueNodeViewRenderer } from '@tiptap/vue-3'
3
3
  import ImageGroupNodeView from './ImageGroupNodeView.vue'
4
4
  import { buildImageGroupCommands } from './image-group-commands'
5
5
  import { clampColumns, DEFAULT_COLUMNS } from './image-group-utils'
6
- import type { UploadedFile } from '@utils/useFileUpload'
6
+ import type { UploadedFile } from '#utils/useFileUpload'
7
7
 
8
8
  export interface ImageGroupOptions {
9
9
  /**
@@ -5,7 +5,7 @@
5
5
  * commands and the extension schema all share these so the column set, the
6
6
  * deterministic ids and the preview-support check stay in exactly one place.
7
7
  */
8
- import type { ExistingImage } from '@molecules/editor/extensions/shared/upload-types'
8
+ import type { ExistingImage } from '#molecules/editor/extensions/shared/upload-types'
9
9
 
10
10
  /** Columns a user may pick in the grid. The single source for the Select + clamps. */
11
11
  export const ALLOWED_COLUMNS = [2, 3, 4] as const
@@ -3,12 +3,12 @@ import type { Editor } from '@tiptap/core'
3
3
  import {
4
4
  resolveUploadOptions,
5
5
  uploadFilesParallel,
6
- } from '@molecules/editor/extensions/shared/media-upload-engine'
6
+ } from '#molecules/editor/extensions/shared/media-upload-engine'
7
7
  import type {
8
8
  ExistingImage,
9
9
  MediaUploadOptions,
10
10
  UploadResult,
11
- } from '@molecules/editor/extensions/shared/upload-types'
11
+ } from '#molecules/editor/extensions/shared/upload-types'
12
12
  import {
13
13
  existingItemId,
14
14
  fileItemId,
@@ -63,9 +63,9 @@
63
63
 
64
64
  <script setup lang="ts">
65
65
  import { onMounted, ref, useTemplateRef, nextTick } from 'vue'
66
- import Button from '@components/Button/Button.vue'
67
- import TextInput from '@components/TextInput/TextInput.vue'
68
- import { isSafeUrl } from '@molecules/editor/extensions/shared/url-safety'
66
+ import Button from '#components/Button/Button.vue'
67
+ import TextInput from '#components/TextInput/TextInput.vue'
68
+ import { isSafeUrl } from '#molecules/editor/extensions/shared/url-safety'
69
69
 
70
70
  const props = defineProps<{
71
71
  href: string
@@ -1,8 +1,8 @@
1
1
  import { type Editor, getMarkRange } from '@tiptap/core'
2
2
  import type { MarkType } from '@tiptap/pm/model'
3
- import { mapStoredRange } from '@molecules/editor/extensions/shared/node-view'
3
+ import { mapStoredRange } from '#molecules/editor/extensions/shared/node-view'
4
4
  import { openLinkPopup } from './link-popup-controller'
5
- import type { VirtualReference } from '@molecules/editor/composables/useFloatingPopup'
5
+ import type { VirtualReference } from '#molecules/editor/composables/useFloatingPopup'
6
6
 
7
7
  /**
8
8
  * A TipTap command factory: `() => ({ editor }) => boolean`.
@@ -1,7 +1,7 @@
1
1
  import type { Editor } from '@tiptap/core'
2
2
  import type { MarkType } from '@tiptap/pm/model'
3
3
  import { Plugin, PluginKey } from '@tiptap/pm/state'
4
- import { isSafeUrl } from '@molecules/editor/extensions/shared/url-safety'
4
+ import { isSafeUrl } from '#molecules/editor/extensions/shared/url-safety'
5
5
 
6
6
  /**
7
7
  * Options for {@link linkPastePlugin}.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  useFloatingPopup,
3
3
  type VirtualReference,
4
- } from '@molecules/editor/composables/useFloatingPopup'
4
+ } from '#molecules/editor/composables/useFloatingPopup'
5
5
  import LinkEditorPopup from './LinkEditorPopup.vue'
6
6
 
7
7
  /**
@@ -18,7 +18,7 @@ import {
18
18
  insertSuggestionNode,
19
19
  filterByQuery,
20
20
  getSuggestionOptions,
21
- } from '@molecules/editor/extensions/shared/suggestion-helpers'
21
+ } from '#molecules/editor/extensions/shared/suggestion-helpers'
22
22
  import './style.css'
23
23
 
24
24
  export interface MentionSuggestionItem extends BaseSuggestionItem {
@@ -11,12 +11,12 @@ import type { EditorView } from '@tiptap/pm/view'
11
11
  import {
12
12
  dispatchIfAlive,
13
13
  findNodeByUploadId,
14
- } from '@molecules/editor/extensions/shared/node-view'
15
- import type { MediaDimensions } from '@molecules/editor/extensions/shared/media-dimensions'
14
+ } from '#molecules/editor/extensions/shared/node-view'
15
+ import type { MediaDimensions } from '#molecules/editor/extensions/shared/media-dimensions'
16
16
  import type {
17
17
  InsertMode,
18
18
  UploadedFile,
19
- } from '@molecules/editor/extensions/shared/media-upload-types'
19
+ } from '#molecules/editor/extensions/shared/media-upload-types'
20
20
 
21
21
  /** Optional intrinsic dimensions (null when the probe failed). */
22
22
  export interface OptionalDimensions {
@@ -12,13 +12,13 @@ import { Plugin, Selection } from '@tiptap/pm/state'
12
12
  import type { Transaction, EditorState } from '@tiptap/pm/state'
13
13
  import type { EditorView } from '@tiptap/pm/view'
14
14
  import type { Editor } from '@tiptap/core'
15
- import { dispatchIfAlive } from '@molecules/editor/extensions/shared/node-view'
16
- import { resolveUploadOptions } from '@molecules/editor/extensions/shared/media-upload-engine'
15
+ import { dispatchIfAlive } from '#molecules/editor/extensions/shared/node-view'
16
+ import { resolveUploadOptions } from '#molecules/editor/extensions/shared/media-upload-engine'
17
17
  import type {
18
18
  MediaUploadConfig,
19
19
  MediaUploadEngine,
20
20
  MediaUploadOptions,
21
- } from '@molecules/editor/extensions/shared/media-upload-types'
21
+ } from '#molecules/editor/extensions/shared/media-upload-types'
22
22
 
23
23
  /** Bridge to read the live extension `editor`/`options` at event time. */
24
24
  export interface MediaPluginHost {
@@ -14,21 +14,21 @@
14
14
  */
15
15
  import { describe, it, expect, vi, beforeEach } from 'vitest'
16
16
 
17
- vi.mock('@utils/file-to-base64', () => ({
17
+ vi.mock('#utils/file-to-base64', () => ({
18
18
  default: vi.fn(async () => 'data:image/png;base64,AAAA'),
19
19
  }))
20
- vi.mock('@molecules/editor/extensions/shared/url-safety', () => ({
20
+ vi.mock('#molecules/editor/extensions/shared/url-safety', () => ({
21
21
  isSafeUrl: () => true,
22
22
  }))
23
- vi.mock('@molecules/editor/extensions/shared/upload-id', () => ({
23
+ vi.mock('#molecules/editor/extensions/shared/upload-id', () => ({
24
24
  createUploadId: () => 'uid-1',
25
25
  }))
26
- vi.mock('@molecules/editor/extensions/shared/media-upload-state', () => ({
26
+ vi.mock('#molecules/editor/extensions/shared/media-upload-state', () => ({
27
27
  setLocalFile: vi.fn(),
28
28
  getLocalFile: vi.fn(() => ({ file: new File(['x'], 'x.png') })),
29
29
  deleteLocalFile: vi.fn(),
30
30
  }))
31
- vi.mock('@molecules/editor/extensions/shared/media-node-ops', () => ({
31
+ vi.mock('#molecules/editor/extensions/shared/media-node-ops', () => ({
32
32
  insertPlaceholder: vi.fn(),
33
33
  applyUploadSuccess: vi.fn(),
34
34
  applyUploadError: vi.fn(),
@@ -36,15 +36,15 @@ vi.mock('@molecules/editor/extensions/shared/media-node-ops', () => ({
36
36
  findNodeBySource: vi.fn(() => 0),
37
37
  }))
38
38
 
39
- import { createMediaUploadEngine } from '@molecules/editor/extensions/shared/media-upload-engine'
40
- import fileToBase64 from '@utils/file-to-base64'
41
- import { setLocalFile } from '@molecules/editor/extensions/shared/media-upload-state'
39
+ import { createMediaUploadEngine } from '#molecules/editor/extensions/shared/media-upload-engine'
40
+ import fileToBase64 from '#utils/file-to-base64'
41
+ import { setLocalFile } from '#molecules/editor/extensions/shared/media-upload-state'
42
42
  import {
43
43
  insertPlaceholder,
44
44
  applyUploadSuccess,
45
45
  applyUploadError,
46
- } from '@molecules/editor/extensions/shared/media-node-ops'
47
- import type { MediaUploadConfig } from '@molecules/editor/extensions/shared/media-upload-types'
46
+ } from '#molecules/editor/extensions/shared/media-node-ops'
47
+ import type { MediaUploadConfig } from '#molecules/editor/extensions/shared/media-upload-types'
48
48
 
49
49
  /** A throwaway stand-in for an EditorView (only identity matters to the test). */
50
50
  function makeView(): { isDestroyed: boolean; state: unknown } {
@@ -19,15 +19,15 @@
19
19
  * and the ProseMirror plugin in `media-plugin.ts` to keep this file ≤300 lines.
20
20
  */
21
21
  import type { Editor } from '@tiptap/core'
22
- import fileToBase64 from '@utils/file-to-base64'
23
- import { isSafeUrl } from '@molecules/editor/extensions/shared/url-safety'
24
- import { findNodeByUploadId } from '@molecules/editor/extensions/shared/node-view'
22
+ import fileToBase64 from '#utils/file-to-base64'
23
+ import { isSafeUrl } from '#molecules/editor/extensions/shared/url-safety'
24
+ import { findNodeByUploadId } from '#molecules/editor/extensions/shared/node-view'
25
25
  import {
26
26
  deleteLocalFile,
27
27
  getLocalFile,
28
28
  setLocalFile,
29
- } from '@molecules/editor/extensions/shared/media-upload-state'
30
- import { createUploadId } from '@molecules/editor/extensions/shared/upload-id'
29
+ } from '#molecules/editor/extensions/shared/media-upload-state'
30
+ import { createUploadId } from '#molecules/editor/extensions/shared/upload-id'
31
31
  import {
32
32
  applyUploadError,
33
33
  applyUploadSuccess,
@@ -35,7 +35,7 @@ import {
35
35
  findNodeBySource,
36
36
  insertPlaceholder,
37
37
  type OptionalDimensions,
38
- } from '@molecules/editor/extensions/shared/media-node-ops'
38
+ } from '#molecules/editor/extensions/shared/media-node-ops'
39
39
  import type {
40
40
  InsertMode,
41
41
  MediaUploadConfig,
@@ -43,7 +43,7 @@ import type {
43
43
  MediaUploadOptions,
44
44
  UploadedFile,
45
45
  UploadResult,
46
- } from '@molecules/editor/extensions/shared/media-upload-types'
46
+ } from '#molecules/editor/extensions/shared/media-upload-types'
47
47
 
48
48
  export type {
49
49
  MediaUploadConfig,
@@ -51,7 +51,7 @@ export type {
51
51
  MediaUploadOptions,
52
52
  UploadedFile,
53
53
  UploadResult,
54
- } from '@molecules/editor/extensions/shared/media-upload-types'
54
+ } from '#molecules/editor/extensions/shared/media-upload-types'
55
55
 
56
56
  /**
57
57
  * Resolve the effective upload options. A directly-configured `uploadFunction`
@@ -3,12 +3,12 @@
3
3
  *
4
4
  * Split out of `media-upload-engine.ts` to keep that module ≤300 lines. The
5
5
  * engine re-exports every public type from here, so the canonical import path
6
- * for consumers remains `@molecules/editor/extensions/shared/media-upload-engine`
6
+ * for consumers remains `#molecules/editor/extensions/shared/media-upload-engine`
7
7
  * (per the conventions import map §2).
8
8
  */
9
9
  import type { Editor } from '@tiptap/core'
10
- import type { UploadedFile as FrappeUploadedFile } from '@utils/useFileUpload'
11
- import type { MediaDimensions } from '@molecules/editor/extensions/shared/media-dimensions'
10
+ import type { UploadedFile as FrappeUploadedFile } from '#utils/useFileUpload'
11
+ import type { MediaDimensions } from '#molecules/editor/extensions/shared/media-dimensions'
12
12
 
13
13
  /** Result of a successful upload. Must carry a `file_url`. */
14
14
  export interface UploadedFile extends Partial<FrappeUploadedFile> {
@@ -5,7 +5,7 @@ import type { Editor, Range } from '@tiptap/core'
5
5
  * the single case-insensitive filter, and a typed options lookup.
6
6
  *
7
7
  * Canonical import path:
8
- * `@molecules/editor/extensions/shared/suggestion-helpers`
8
+ * `#molecules/editor/extensions/shared/suggestion-helpers`
9
9
  */
10
10
 
11
11
  /**
@@ -23,7 +23,7 @@ export interface SuggestionFloatingOptions {
23
23
  * `createSuggestionExtension().render()`.
24
24
  *
25
25
  * Canonical import path:
26
- * `@molecules/editor/extensions/shared/suggestion-renderer`
26
+ * `#molecules/editor/extensions/shared/suggestion-renderer`
27
27
  *
28
28
  * Owns four correctness fixes over the original inline implementation:
29
29
  * 1. Escape -> `return false` so the suggestion plugin itself runs `onExit`
@@ -7,7 +7,7 @@
7
7
  * other.
8
8
  *
9
9
  * Canonical import path:
10
- * `@molecules/editor/extensions/shared/suggestion-types`
10
+ * `#molecules/editor/extensions/shared/suggestion-types`
11
11
  */
12
12
 
13
13
  /**
@@ -13,7 +13,7 @@ export type {
13
13
  MediaUploadOptions,
14
14
  UploadResult,
15
15
  UploadedFile,
16
- } from '@molecules/editor/extensions/shared/media-upload-types'
16
+ } from '#molecules/editor/extensions/shared/media-upload-types'
17
17
 
18
18
  /**
19
19
  * An image already present in the document (or a freshly-uploaded one rendered
@@ -19,8 +19,8 @@
19
19
  import { ref, type PropType } from 'vue'
20
20
  import SuggestionList from '../suggestion/SuggestionList.vue'
21
21
  import type { Editor, Range } from '@tiptap/core'
22
- import type { SuggestionListExpose } from '@molecules/editor/extensions/shared/suggestion-types'
23
- import { forwardKeyDown } from '@molecules/editor/composables/useSuggestionList'
22
+ import type { SuggestionListExpose } from '#molecules/editor/extensions/shared/suggestion-types'
23
+ import { forwardKeyDown } from '#molecules/editor/composables/useSuggestionList'
24
24
  import type { CommandItem } from './slash-commands-extension'
25
25
 
26
26
  const props = defineProps({
@@ -8,8 +8,8 @@ import {
8
8
  commandMeta,
9
9
  headingMeta,
10
10
  type EditorCommandMeta,
11
- } from '@molecules/editor/commands'
12
- import { filterByQuery } from '@molecules/editor/extensions/shared/suggestion-helpers'
11
+ } from '#molecules/editor/commands'
12
+ import { filterByQuery } from '#molecules/editor/extensions/shared/suggestion-helpers'
13
13
  import SlashCommandsList from './SlashCommandsList.vue'
14
14
 
15
15
  export const SlashCommandSuggestionKey = new PluginKey('slashCommandSuggestion')
@@ -36,8 +36,8 @@ import {
36
36
  type PropType,
37
37
  type ComponentPublicInstance,
38
38
  } from 'vue'
39
- import type { BaseSuggestionItem } from '@molecules/editor/extensions/shared/suggestion-types'
40
- import { useSuggestionList } from '@molecules/editor/composables/useSuggestionList'
39
+ import type { BaseSuggestionItem } from '#molecules/editor/extensions/shared/suggestion-types'
40
+ import { useSuggestionList } from '#molecules/editor/composables/useSuggestionList'
41
41
  import SuggestionListItem from './SuggestionListItem.vue'
42
42
 
43
43
  const props = defineProps({
@@ -17,7 +17,7 @@
17
17
 
18
18
  <script setup lang="ts">
19
19
  import { computed, type PropType } from 'vue'
20
- import type { BaseSuggestionItem } from '@molecules/editor/extensions/shared/suggestion-types'
20
+ import type { BaseSuggestionItem } from '#molecules/editor/extensions/shared/suggestion-types'
21
21
 
22
22
  const props = defineProps({
23
23
  item: {
@@ -2,11 +2,11 @@ import { Extension, type Editor, type Range } from '@tiptap/core'
2
2
  import Suggestion, { type SuggestionOptions } from '@tiptap/suggestion'
3
3
  import type { PluginKey } from '@tiptap/pm/state'
4
4
  import type { Component as VueComponent } from 'vue'
5
- import type { BaseSuggestionItem } from '@molecules/editor/extensions/shared/suggestion-types'
5
+ import type { BaseSuggestionItem } from '#molecules/editor/extensions/shared/suggestion-types'
6
6
  import {
7
7
  createSuggestionRenderer,
8
8
  type SuggestionFloatingOptions,
9
- } from '@molecules/editor/extensions/shared/suggestion-renderer'
9
+ } from '#molecules/editor/extensions/shared/suggestion-renderer'
10
10
 
11
11
  // Re-export for back-compat: several extensions still import the base item type
12
12
  // from this module path. The canonical home is `suggestion-types`.
@@ -3,4 +3,4 @@ export {
3
3
  type BaseSuggestionItem,
4
4
  type CreateSuggestionExtensionOptions,
5
5
  } from './createSuggestionExtension'
6
- export type { SuggestionListExpose } from '@molecules/editor/extensions/shared/suggestion-types'
6
+ export type { SuggestionListExpose } from '#molecules/editor/extensions/shared/suggestion-types'
@@ -17,7 +17,7 @@ import {
17
17
  insertSuggestionNode,
18
18
  filterByQuery,
19
19
  getSuggestionOptions,
20
- } from '@molecules/editor/extensions/shared/suggestion-helpers'
20
+ } from '#molecules/editor/extensions/shared/suggestion-helpers'
21
21
  import { toValue, type MaybeRefOrGetter } from 'vue'
22
22
 
23
23
  type TagOption = TagSuggestionItem & { id?: string }
@@ -28,8 +28,8 @@
28
28
  </template>
29
29
 
30
30
  <script setup lang="ts">
31
- import type { HeadingTreeNode } from '@molecules/editor/extensions/shared/heading-tree-utils'
32
- import type { EnrichedAnchor } from '@molecules/editor/composables/useTocActiveHeading'
31
+ import type { HeadingTreeNode } from '#molecules/editor/extensions/shared/heading-tree-utils'
32
+ import type { EnrichedAnchor } from '#molecules/editor/composables/useTocActiveHeading'
33
33
 
34
34
  const props = defineProps<{
35
35
  node: HeadingTreeNode<EnrichedAnchor>
@@ -31,19 +31,19 @@
31
31
  <script setup lang="ts">
32
32
  import { computed, toRaw } from 'vue'
33
33
  import { NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3'
34
- import { useNodeViewEditable } from '@molecules/editor/composables/useNodeViewEditable'
34
+ import { useNodeViewEditable } from '#molecules/editor/composables/useNodeViewEditable'
35
35
  import {
36
36
  safeGetPos,
37
37
  getExtensionHTMLAttributes,
38
38
  dispatchIfAlive,
39
- } from '@molecules/editor/extensions/shared/node-view'
40
- import { foldHeadings } from '@molecules/editor/extensions/shared/heading-tree-utils'
41
- import { useScrollContainer } from '@molecules/editor/composables/useScrollContainer'
42
- import { useTocAnchors } from '@molecules/editor/composables/useTocAnchors'
39
+ } from '#molecules/editor/extensions/shared/node-view'
40
+ import { foldHeadings } from '#molecules/editor/extensions/shared/heading-tree-utils'
41
+ import { useScrollContainer } from '#molecules/editor/composables/useScrollContainer'
42
+ import { useTocAnchors } from '#molecules/editor/composables/useTocAnchors'
43
43
  import {
44
44
  useTocActiveHeading,
45
45
  type EnrichedAnchor,
46
- } from '@molecules/editor/composables/useTocActiveHeading'
46
+ } from '#molecules/editor/composables/useTocActiveHeading'
47
47
  import { scrollToHeading } from './toc-scroll-controller'
48
48
  import TocItem from './TocItem.vue'
49
49
 
@@ -10,12 +10,12 @@ import type { DOMOutputSpec } from '@tiptap/pm/model'
10
10
  import {
11
11
  collectHeadings,
12
12
  getActiveTabRange,
13
- } from '@molecules/editor/extensions/shared/heading-scope'
13
+ } from '#molecules/editor/extensions/shared/heading-scope'
14
14
  import {
15
15
  foldHeadings,
16
16
  headingsToRenderSpec,
17
17
  type TocRenderNode,
18
- } from '@molecules/editor/extensions/shared/heading-tree-utils'
18
+ } from '#molecules/editor/extensions/shared/heading-tree-utils'
19
19
 
20
20
  const OL_STYLE = 'list-style-type: decimal; margin: 0.5em 0; padding-left: 1.5em'
21
21
  const NESTED_OL_STYLE = 'list-style-type: decimal; padding-left: 1.5em'
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import type { Editor } from '@tiptap/core'
10
10
  import { TextSelection } from '@tiptap/pm/state'
11
- import type { HeadingInfo } from '@molecules/editor/extensions/shared/heading-scope'
11
+ import type { HeadingInfo } from '#molecules/editor/extensions/shared/heading-scope'
12
12
 
13
13
  const HEADING_SELECTOR = 'h1, h2, h3, h4, h5, h6'
14
14
  const SCROLL_OFFSET = 20
@@ -13,8 +13,8 @@
13
13
  import {
14
14
  createMediaUploadEngine,
15
15
  type MediaUploadConfig,
16
- } from '@molecules/editor/extensions/shared/media-upload-engine'
17
- import { probeVideoDimensions } from '@molecules/editor/extensions/shared/media-dimensions'
16
+ } from '#molecules/editor/extensions/shared/media-upload-engine'
17
+ import { probeVideoDimensions } from '#molecules/editor/extensions/shared/media-dimensions'
18
18
 
19
19
  /** The per-node config for the video upload pipeline. */
20
20
  export const videoConfig: MediaUploadConfig = {
@@ -19,15 +19,15 @@ import {
19
19
  mergeAttributes,
20
20
  } from '@tiptap/core'
21
21
  import { VueNodeViewRenderer } from '@tiptap/vue-3'
22
- import MediaNodeView from '@molecules/editor/components/MediaNodeView.vue'
23
- import type { UploadedFile } from '@utils/useFileUpload'
22
+ import MediaNodeView from '#molecules/editor/components/MediaNodeView.vue'
23
+ import type { UploadedFile } from '#utils/useFileUpload'
24
24
  import {
25
25
  resolveUploadOptions,
26
26
  type MediaUploadOptions,
27
- } from '@molecules/editor/extensions/shared/media-upload-engine'
28
- import { createMediaPlugin } from '@molecules/editor/extensions/shared/media-plugin'
29
- import { findNodeByUploadId } from '@molecules/editor/extensions/shared/node-view'
30
- import { pickFiles } from '@molecules/editor/extensions/shared/file-picker'
27
+ } from '#molecules/editor/extensions/shared/media-upload-engine'
28
+ import { createMediaPlugin } from '#molecules/editor/extensions/shared/media-plugin'
29
+ import { findNodeByUploadId } from '#molecules/editor/extensions/shared/node-view'
30
+ import { pickFiles } from '#molecules/editor/extensions/shared/file-picker'
31
31
  import { videoConfig, videoEngine } from './video-config'
32
32
 
33
33
  export interface VideoExtensionOptions {
@@ -3,6 +3,10 @@ import forms from '@tailwindcss/forms'
3
3
  import typography from '@tailwindcss/typography'
4
4
  import lucideIconsPlugin from './lucideIconsPlugin.js'
5
5
 
6
+ // NOTE: Tailwind v3 does NOT merge `content` from presets into the resolved
7
+ // config (it reads only the top-level config's content.files). So consuming
8
+ // apps must list frappe-ui's source globs in their own tailwind.config
9
+ // `content` — declaring them here would be silently ignored.
6
10
  /** @type {import('tailwindcss').Config} */
7
11
  export default {
8
12
  darkMode: ['selector', '[data-theme="dark"]'],