@bagelink/vue 1.17.2 → 1.17.6

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 (95) hide show
  1. package/dist/assetTransport.d.ts +9 -31
  2. package/dist/assetTransport.d.ts.map +1 -1
  3. package/dist/assets.d.ts +39 -20
  4. package/dist/assets.d.ts.map +1 -1
  5. package/dist/components/AddressSearch.vue.d.ts +40 -36
  6. package/dist/components/AddressSearch.vue.d.ts.map +1 -1
  7. package/dist/components/ContextMenu.vue.d.ts +518 -0
  8. package/dist/components/ContextMenu.vue.d.ts.map +1 -0
  9. package/dist/components/Dropdown.types.d.ts +25 -0
  10. package/dist/components/Dropdown.types.d.ts.map +1 -0
  11. package/dist/components/Dropdown.vue.d.ts +20 -15
  12. package/dist/components/Dropdown.vue.d.ts.map +1 -1
  13. package/dist/components/FilterQuery.vue.d.ts +1 -1
  14. package/dist/components/FilterQuery.vue.d.ts.map +1 -1
  15. package/dist/components/Icon/Icon.vue.d.ts +0 -1
  16. package/dist/components/Icon/Icon.vue.d.ts.map +1 -1
  17. package/dist/components/Icon/constants.d.ts +0 -1
  18. package/dist/components/Icon/constants.d.ts.map +1 -1
  19. package/dist/components/Icon/types.d.ts +2 -3
  20. package/dist/components/Icon/types.d.ts.map +1 -1
  21. package/dist/components/Swiper.vue.d.ts +1 -1
  22. package/dist/components/draggable/useDraggable.d.ts.map +1 -1
  23. package/dist/components/form/inputs/IconPickerInput.vue.d.ts +48 -37
  24. package/dist/components/form/inputs/IconPickerInput.vue.d.ts.map +1 -1
  25. package/dist/components/form/inputs/RichText/components/EditorToolbar.vue.d.ts.map +1 -1
  26. package/dist/components/form/inputs/RichText/composables/useCommands.d.ts.map +1 -1
  27. package/dist/components/form/inputs/RichText/composables/useEditor.d.ts +3 -0
  28. package/dist/components/form/inputs/RichText/composables/useEditor.d.ts.map +1 -1
  29. package/dist/components/form/inputs/RichText/composables/useEditorKeyboard.d.ts +1 -1
  30. package/dist/components/form/inputs/RichText/composables/useEditorKeyboard.d.ts.map +1 -1
  31. package/dist/components/form/inputs/RichText/index.vue.d.ts.map +1 -1
  32. package/dist/components/form/inputs/RichText/utils/commands.d.ts.map +1 -1
  33. package/dist/components/form/inputs/RichText/utils/selection.d.ts +2 -0
  34. package/dist/components/form/inputs/RichText/utils/selection.d.ts.map +1 -1
  35. package/dist/components/form/inputs/RichText/utils/table.d.ts +34 -8
  36. package/dist/components/form/inputs/RichText/utils/table.d.ts.map +1 -1
  37. package/dist/components/form/inputs/SelectInput.vue.d.ts +71 -63
  38. package/dist/components/form/inputs/SelectInput.vue.d.ts.map +1 -1
  39. package/dist/components/form/inputs/TelInput.vue.d.ts +2 -2
  40. package/dist/components/index.d.ts +3 -1
  41. package/dist/components/index.d.ts.map +1 -1
  42. package/dist/composables/index.d.ts +1 -1
  43. package/dist/composables/index.d.ts.map +1 -1
  44. package/dist/composables/useBoundedRectDrag.d.ts.map +1 -1
  45. package/dist/composables/usePointerSession.d.ts +14 -3
  46. package/dist/composables/usePointerSession.d.ts.map +1 -1
  47. package/dist/core.css +3 -3
  48. package/dist/directives/vResize.d.ts.map +1 -1
  49. package/dist/form-flow/form-flow.d.ts +4 -2
  50. package/dist/form-flow/form-flow.d.ts.map +1 -1
  51. package/dist/form-flow/schema-fields.d.ts +4 -1
  52. package/dist/form-flow/schema-fields.d.ts.map +1 -1
  53. package/dist/index.cjs +240 -153
  54. package/dist/index.css +1 -1
  55. package/dist/index.mjs +18459 -18281
  56. package/dist/style.css +3 -3
  57. package/dist/types/BagelForm.d.ts +2 -0
  58. package/dist/types/BagelForm.d.ts.map +1 -1
  59. package/package.json +1 -1
  60. package/src/assetTransport.test.ts +33 -83
  61. package/src/assetTransport.ts +24 -90
  62. package/src/assets.test.ts +58 -99
  63. package/src/assets.ts +78 -161
  64. package/src/components/ContextMenu.vue +113 -0
  65. package/src/components/Dropdown.types.ts +27 -0
  66. package/src/components/Dropdown.vue +129 -64
  67. package/src/components/FilterQuery.vue +1 -1
  68. package/src/components/Icon/Icon.vue +8 -30
  69. package/src/components/Icon/constants.ts +0 -166
  70. package/src/components/Icon/types.ts +2 -3
  71. package/src/components/draggable/useDraggable.ts +67 -100
  72. package/src/components/form/inputs/IconPickerInput.vue +14 -9
  73. package/src/components/form/inputs/RichText/components/EditorToolbar.vue +43 -111
  74. package/src/components/form/inputs/RichText/composables/useCommands.ts +32 -54
  75. package/src/components/form/inputs/RichText/composables/useEditor.ts +45 -171
  76. package/src/components/form/inputs/RichText/composables/useEditorKeyboard.ts +90 -14
  77. package/src/components/form/inputs/RichText/index.vue +1195 -1210
  78. package/src/components/form/inputs/RichText/utils/commands.ts +689 -1028
  79. package/src/components/form/inputs/RichText/utils/selection.ts +66 -41
  80. package/src/components/form/inputs/RichText/utils/table.ts +798 -136
  81. package/src/components/form/inputs/SelectInput.vue +1 -1
  82. package/src/components/form/inputs/Upload/AssetUploadInput.vue +2 -2
  83. package/src/components/index.ts +3 -1
  84. package/src/composables/index.ts +1 -1
  85. package/src/composables/useBoundedRectDrag.ts +9 -12
  86. package/src/composables/usePointerSession.ts +57 -12
  87. package/src/directives/vResize.ts +6 -7
  88. package/src/form-flow/form-flow.ts +8 -3
  89. package/src/form-flow/schema-fields.ts +9 -4
  90. package/src/styles/core.css +1 -18
  91. package/src/types/BagelForm.ts +2 -0
  92. package/dist/components/form/inputs/RichText/utils/formatting.d.ts +0 -10
  93. package/dist/components/form/inputs/RichText/utils/formatting.d.ts.map +0 -1
  94. package/src/components/form/inputs/RichText/components/gridBox.vue +0 -58
  95. package/src/components/form/inputs/RichText/utils/formatting.ts +0 -331
@@ -1,3 +1,29 @@
1
+ const ALIGN_BLOCK_SELECTOR = 'p, h1, h2, h3, h4, h5, h6, blockquote, li, td, th'
2
+
3
+ export const ACTIVE_STYLE_KEYS = [
4
+ 'bold',
5
+ 'italic',
6
+ 'underline',
7
+ 'link',
8
+ 'h1',
9
+ 'h2',
10
+ 'h3',
11
+ 'h4',
12
+ 'h5',
13
+ 'h6',
14
+ 'blockquote',
15
+ 'p',
16
+ 'orderedList',
17
+ 'unorderedList',
18
+ 'alignLeft',
19
+ 'alignCenter',
20
+ 'alignRight',
21
+ 'alignJustify',
22
+ 'textDirection',
23
+ 'ltrDirection',
24
+ 'rtlDirection'
25
+ ] as const
26
+
1
27
  export function getSelection(state: any) {
2
28
  return state.selection
3
29
  }
@@ -6,43 +32,40 @@ export function getSelectionRange(state: any) {
6
32
  return state.range
7
33
  }
8
34
 
9
- export function isStyleActive(style: string, doc: Document) {
35
+ export function isStyleActive(style: string, doc: Document): boolean {
10
36
  const selection = doc.getSelection()
11
37
  if (!selection || !selection.rangeCount) { return false }
12
38
 
13
39
  const range = selection.getRangeAt(0)
14
40
  const container = range.commonAncestorContainer
15
- const parent = container.nodeType === Node.TEXT_NODE ? container.parentElement : container as Element
41
+ const parent = container.nodeType === Node.TEXT_NODE
42
+ ? container.parentElement
43
+ : container as Element
16
44
 
17
45
  if (!parent) { return false }
18
46
 
19
- // Check if the current node or any parent has the style
20
47
  const checkParent = (element: Element | null, checker: (el: Element) => boolean): boolean => {
21
- if (!element) { return false }
48
+ if (!element || element === doc.body || element === doc.documentElement) { return false }
22
49
  if (checker(element)) { return true }
23
50
  return checkParent(element.parentElement, checker)
24
51
  }
25
52
 
26
- // Define style checkers for different formatting types
27
53
  const styleCheckers: { [key: string]: (el: Element) => boolean } = {
28
- // Text formatting - check for elements only, not CSS styles
29
54
  bold: (el) => {
30
55
  const tagName = el.tagName?.toLowerCase()
31
- // Only consider <b> and <strong> tags, not CSS bold styling
32
56
  return tagName === 'strong' || tagName === 'b'
33
57
  },
34
-
35
58
  italic: (el) => {
36
59
  const tagName = el.tagName?.toLowerCase()
37
- // Only consider <i> and <em> tags, not CSS italic styling
38
60
  return tagName === 'em' || tagName === 'i'
39
61
  },
40
-
41
62
  underline: (el) => {
42
63
  const tagName = el.tagName?.toLowerCase()
43
- // Only consider <u> tag, not CSS underline styling
44
64
  return tagName === 'u'
45
65
  },
66
+ link: (el) => {
67
+ return el.tagName?.toLowerCase() === 'a'
68
+ },
46
69
 
47
70
  // Block elements
48
71
  h1: el => el.tagName?.toLowerCase() === 'h1',
@@ -54,65 +77,68 @@ export function isStyleActive(style: string, doc: Document) {
54
77
  p: el => el.tagName?.toLowerCase() === 'p',
55
78
  blockquote: el => el.tagName?.toLowerCase() === 'blockquote',
56
79
 
57
- // List elements - check if we're inside a list
58
- orderedList: (el) => {
59
- // Check if we're inside an ordered list
60
- return !!el.closest('ol')
61
- },
62
-
63
- unorderedList: (el) => {
64
- // Check if we're inside an unordered list
65
- return !!el.closest('ul')
66
- },
80
+ // List elements
81
+ orderedList: el => !!el.closest('ol'),
82
+ unorderedList: el => !!el.closest('ul'),
67
83
 
68
- // Text alignment
84
+ // Text alignment (supports both physical left/right and logical start/end)
69
85
  alignLeft: (el) => {
70
- const paragraph = el.closest('p, h1, h2, h3, h4, h5, h6')
71
- return (paragraph as HTMLElement)?.style.textAlign === 'start'
86
+ const block = el.closest(ALIGN_BLOCK_SELECTOR) as HTMLElement | null
87
+ const align = block?.style.textAlign
88
+ return align === 'left' || align === 'start'
72
89
  },
73
90
  alignCenter: (el) => {
74
- const paragraph = el.closest('p, h1, h2, h3, h4, h5, h6')
75
- return (paragraph as HTMLElement)?.style.textAlign === 'center'
91
+ const block = el.closest(ALIGN_BLOCK_SELECTOR) as HTMLElement | null
92
+ return block?.style.textAlign === 'center'
76
93
  },
77
94
  alignRight: (el) => {
78
- const paragraph = el.closest('p, h1, h2, h3, h4, h5, h6')
79
- return (paragraph as HTMLElement)?.style.textAlign === 'end'
95
+ const block = el.closest(ALIGN_BLOCK_SELECTOR) as HTMLElement | null
96
+ const align = block?.style.textAlign
97
+ return align === 'right' || align === 'end'
80
98
  },
81
99
  alignJustify: (el) => {
82
- const paragraph = el.closest('p, h1, h2, h3, h4, h5, h6')
83
- return (paragraph as HTMLElement)?.style.textAlign === 'justify'
100
+ const block = el.closest(ALIGN_BLOCK_SELECTOR) as HTMLElement | null
101
+ return block?.style.textAlign === 'justify'
84
102
  },
85
103
 
86
104
  // Text direction
87
105
  textDirection: (el) => {
88
- const paragraph = el.closest('p, h1, h2, h3, h4, h5, h6')
89
- return (paragraph as HTMLElement)?.dir === 'rtl'
106
+ const block = el.closest(ALIGN_BLOCK_SELECTOR) as HTMLElement | null
107
+ return (block?.dir || el.closest('table')?.dir) === 'rtl'
90
108
  },
91
109
  ltrDirection: (el) => {
92
- const paragraph = el.closest('p, h1, h2, h3, h4, h5, h6')
93
- return (paragraph as HTMLElement)?.dir === 'ltr'
110
+ const block = el.closest(ALIGN_BLOCK_SELECTOR) as HTMLElement | null
111
+ return (block?.dir || el.closest('table')?.dir) === 'ltr'
94
112
  },
95
113
  rtlDirection: (el) => {
96
- const paragraph = el.closest('p, h1, h2, h3, h4, h5, h6')
97
- return (paragraph as HTMLElement)?.dir === 'rtl'
114
+ const block = el.closest(ALIGN_BLOCK_SELECTOR) as HTMLElement | null
115
+ return (block?.dir || el.closest('table')?.dir) === 'rtl'
98
116
  }
99
117
  }
100
118
 
101
- // Special handling for view state commands
102
119
  if (['splitView', 'codeView', 'fullScreen'].includes(style)) {
103
- return false // These are handled by the editor state directly
120
+ return false
104
121
  }
105
122
 
106
- // Use the appropriate checker
107
123
  const checker = styleCheckers[style]
108
124
  if (checker) {
109
125
  return checkParent(parent, checker)
110
126
  }
111
127
 
112
- // Fallback: check if element matches the style tag name
113
128
  return checkParent(parent, el => el.tagName?.toLowerCase() === style.toLowerCase())
114
129
  }
115
130
 
131
+ export function computeActiveStyles(doc: Document | undefined): Set<string> {
132
+ const styles = new Set<string>()
133
+ if (!doc) { return styles }
134
+ for (const style of ACTIVE_STYLE_KEYS) {
135
+ if (isStyleActive(style, doc)) {
136
+ styles.add(style)
137
+ }
138
+ }
139
+ return styles
140
+ }
141
+
116
142
  export interface SelectionInfo {
117
143
  startBlock: Element
118
144
  endBlock: Element
@@ -131,7 +157,6 @@ export function analyzeSelection(doc: Document, range: Range): SelectionInfo | n
131
157
 
132
158
  const startBlock = parent.closest('p,h1,h2,h3,h4,h5,h6,blockquote,li') || parent
133
159
 
134
- // Analyze if selection spans multiple blocks
135
160
  const isMultiBlock = (() => {
136
161
  if (!range.collapsed) {
137
162
  const { endContainer } = range