@gxp-dev/mod-ui 2.0.0 → 2.0.1

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 (811) hide show
  1. package/.storybook/preview.ts +7 -0
  2. package/README.md +6 -6
  3. package/dist/_virtual/_plugin-vue_export-helper.js +10 -0
  4. package/dist/_virtual/_plugin-vue_export-helper.js.map +1 -0
  5. package/dist/action.d.ts +4 -0
  6. package/dist/action.d.ts.map +1 -0
  7. package/dist/action.js +9 -0
  8. package/dist/action.js.map +1 -0
  9. package/dist/adapters/fieldTypeMap.d.ts.map +1 -1
  10. package/dist/adapters/fieldTypeMap.js +4 -8
  11. package/dist/adapters/fieldTypeMap.js.map +1 -1
  12. package/dist/adapters/index.d.ts +1 -1
  13. package/dist/boolean.d.ts +5 -0
  14. package/dist/boolean.d.ts.map +1 -0
  15. package/dist/boolean.js +11 -0
  16. package/dist/boolean.js.map +1 -0
  17. package/dist/builder.d.ts +9 -0
  18. package/dist/builder.d.ts.map +1 -0
  19. package/dist/builder.js +19 -0
  20. package/dist/builder.js.map +1 -0
  21. package/dist/cards.d.ts +8 -0
  22. package/dist/cards.d.ts.map +1 -0
  23. package/dist/cards.js +17 -0
  24. package/dist/cards.js.map +1 -0
  25. package/dist/code.d.ts +6 -0
  26. package/dist/code.d.ts.map +1 -0
  27. package/dist/code.js +13 -0
  28. package/dist/code.js.map +1 -0
  29. package/dist/components/compositions/cards/CardListCard.vue.d.ts +30 -0
  30. package/dist/components/compositions/cards/CardListCard.vue.d.ts.map +1 -0
  31. package/dist/components/compositions/cards/CardListCard.vue.js +122 -2
  32. package/dist/components/compositions/cards/CardListCard.vue.js.map +1 -1
  33. package/dist/components/compositions/cards/CardListCard.vue2.js +2 -122
  34. package/dist/components/compositions/cards/CardListCard.vue2.js.map +1 -1
  35. package/dist/components/compositions/cards/DataTableCard.vue.d.ts +58 -0
  36. package/dist/components/compositions/cards/DataTableCard.vue.d.ts.map +1 -0
  37. package/dist/components/compositions/cards/DataTableCard.vue.js +387 -2
  38. package/dist/components/compositions/cards/DataTableCard.vue.js.map +1 -1
  39. package/dist/components/compositions/cards/DataTableCard.vue2.js +2 -387
  40. package/dist/components/compositions/cards/DataTableCard.vue2.js.map +1 -1
  41. package/dist/components/compositions/cards/ElementDisplayCard.vue.d.ts +16 -0
  42. package/dist/components/compositions/cards/ElementDisplayCard.vue.d.ts.map +1 -0
  43. package/dist/components/compositions/cards/ElementDisplayCard.vue.js +64 -2
  44. package/dist/components/compositions/cards/ElementDisplayCard.vue.js.map +1 -1
  45. package/dist/components/compositions/cards/ElementDisplayCard.vue2.js +2 -64
  46. package/dist/components/compositions/cards/ElementDisplayCard.vue2.js.map +1 -1
  47. package/dist/components/compositions/cards/ElementListCard.vue.d.ts +22 -0
  48. package/dist/components/compositions/cards/ElementListCard.vue.d.ts.map +1 -0
  49. package/dist/components/compositions/cards/ElementListCard.vue.js +92 -2
  50. package/dist/components/compositions/cards/ElementListCard.vue.js.map +1 -1
  51. package/dist/components/compositions/cards/ElementListCard.vue2.js +2 -92
  52. package/dist/components/compositions/cards/ElementListCard.vue2.js.map +1 -1
  53. package/dist/components/compositions/cards/GridViewCard.vue.d.ts +35 -0
  54. package/dist/components/compositions/cards/GridViewCard.vue.d.ts.map +1 -0
  55. package/dist/components/compositions/cards/GridViewCard.vue.js +128 -2
  56. package/dist/components/compositions/cards/GridViewCard.vue.js.map +1 -1
  57. package/dist/components/compositions/cards/GridViewCard.vue2.js +2 -128
  58. package/dist/components/compositions/cards/GridViewCard.vue2.js.map +1 -1
  59. package/dist/components/compositions/cards/InfoCard.vue.d.ts +24 -0
  60. package/dist/components/compositions/cards/InfoCard.vue.d.ts.map +1 -0
  61. package/dist/components/compositions/cards/InfoCard.vue.js +183 -2
  62. package/dist/components/compositions/cards/InfoCard.vue.js.map +1 -1
  63. package/dist/components/compositions/cards/InfoCard.vue2.js +2 -183
  64. package/dist/components/compositions/cards/InfoCard.vue2.js.map +1 -1
  65. package/dist/components/compositions/cards/TabListCard.vue.d.ts +36 -0
  66. package/dist/components/compositions/cards/TabListCard.vue.d.ts.map +1 -0
  67. package/dist/components/compositions/cards/TabListCard.vue.js +124 -2
  68. package/dist/components/compositions/cards/TabListCard.vue.js.map +1 -1
  69. package/dist/components/compositions/cards/TabListCard.vue2.js +2 -124
  70. package/dist/components/compositions/cards/TabListCard.vue2.js.map +1 -1
  71. package/dist/components/compositions/elements/action/ButtonAction.vue.d.ts +42 -0
  72. package/dist/components/compositions/elements/action/ButtonAction.vue.d.ts.map +1 -0
  73. package/dist/components/compositions/elements/action/ButtonAction.vue.js +157 -2
  74. package/dist/components/compositions/elements/action/ButtonAction.vue.js.map +1 -1
  75. package/dist/components/compositions/elements/action/ButtonAction.vue2.js +2 -157
  76. package/dist/components/compositions/elements/action/ButtonAction.vue2.js.map +1 -1
  77. package/dist/components/compositions/elements/action/ButtonGroupAction.vue.d.ts +46 -0
  78. package/dist/components/compositions/elements/action/ButtonGroupAction.vue.d.ts.map +1 -0
  79. package/dist/components/compositions/elements/action/ButtonGroupAction.vue.js +66 -2
  80. package/dist/components/compositions/elements/action/ButtonGroupAction.vue.js.map +1 -1
  81. package/dist/components/compositions/elements/action/ButtonGroupAction.vue2.js +2 -66
  82. package/dist/components/compositions/elements/action/ButtonGroupAction.vue2.js.map +1 -1
  83. package/dist/components/compositions/elements/action/LinkAction.vue.d.ts +30 -0
  84. package/dist/components/compositions/elements/action/LinkAction.vue.d.ts.map +1 -0
  85. package/dist/components/compositions/elements/action/LinkAction.vue.js +55 -2
  86. package/dist/components/compositions/elements/action/LinkAction.vue.js.map +1 -1
  87. package/dist/components/compositions/elements/action/LinkAction.vue2.js +2 -55
  88. package/dist/components/compositions/elements/action/LinkAction.vue2.js.map +1 -1
  89. package/dist/components/compositions/elements/boolean/CheckboxBoolean.vue.d.ts +25 -0
  90. package/dist/components/compositions/elements/boolean/CheckboxBoolean.vue.d.ts.map +1 -0
  91. package/dist/components/compositions/elements/boolean/CheckboxBoolean.vue.js +68 -2
  92. package/dist/components/compositions/elements/boolean/CheckboxBoolean.vue.js.map +1 -1
  93. package/dist/components/compositions/elements/boolean/CheckboxBoolean.vue2.js +2 -68
  94. package/dist/components/compositions/elements/boolean/CheckboxBoolean.vue2.js.map +1 -1
  95. package/dist/components/compositions/elements/boolean/IconToggleBoolean.vue.d.ts +29 -0
  96. package/dist/components/compositions/elements/boolean/IconToggleBoolean.vue.d.ts.map +1 -0
  97. package/dist/components/compositions/elements/boolean/IconToggleBoolean.vue.js +75 -2
  98. package/dist/components/compositions/elements/boolean/IconToggleBoolean.vue.js.map +1 -1
  99. package/dist/components/compositions/elements/boolean/IconToggleBoolean.vue2.js +2 -75
  100. package/dist/components/compositions/elements/boolean/IconToggleBoolean.vue2.js.map +1 -1
  101. package/dist/components/compositions/elements/boolean/RadioBoolean.vue.d.ts +33 -0
  102. package/dist/components/compositions/elements/boolean/RadioBoolean.vue.d.ts.map +1 -0
  103. package/dist/components/compositions/elements/boolean/RadioBoolean.vue.js +91 -2
  104. package/dist/components/compositions/elements/boolean/RadioBoolean.vue.js.map +1 -1
  105. package/dist/components/compositions/elements/boolean/RadioBoolean.vue2.js +2 -91
  106. package/dist/components/compositions/elements/boolean/RadioBoolean.vue2.js.map +1 -1
  107. package/dist/components/compositions/elements/boolean/SwitchBoolean.vue.d.ts +29 -0
  108. package/dist/components/compositions/elements/boolean/SwitchBoolean.vue.d.ts.map +1 -0
  109. package/dist/components/compositions/elements/boolean/SwitchBoolean.vue.js +77 -2
  110. package/dist/components/compositions/elements/boolean/SwitchBoolean.vue.js.map +1 -1
  111. package/dist/components/compositions/elements/boolean/SwitchBoolean.vue2.js +2 -77
  112. package/dist/components/compositions/elements/boolean/SwitchBoolean.vue2.js.map +1 -1
  113. package/dist/components/compositions/elements/builder/DependencyListBuilder.vue.d.ts +29 -0
  114. package/dist/components/compositions/elements/builder/DependencyListBuilder.vue.d.ts.map +1 -0
  115. package/dist/components/compositions/elements/builder/DependencyListBuilder.vue.js +666 -2
  116. package/dist/components/compositions/elements/builder/DependencyListBuilder.vue.js.map +1 -1
  117. package/dist/components/compositions/elements/builder/DependencyListBuilder.vue2.js +2 -666
  118. package/dist/components/compositions/elements/builder/DependencyListBuilder.vue2.js.map +1 -1
  119. package/dist/components/compositions/elements/builder/ElementListBuilder.vue.d.ts +29 -0
  120. package/dist/components/compositions/elements/builder/ElementListBuilder.vue.d.ts.map +1 -0
  121. package/dist/components/compositions/elements/builder/ElementListBuilder.vue.js +421 -2
  122. package/dist/components/compositions/elements/builder/ElementListBuilder.vue.js.map +1 -1
  123. package/dist/components/compositions/elements/builder/ElementListBuilder.vue2.js +2 -421
  124. package/dist/components/compositions/elements/builder/ElementListBuilder.vue2.js.map +1 -1
  125. package/dist/components/compositions/elements/builder/FormBuilder.vue.d.ts +30 -0
  126. package/dist/components/compositions/elements/builder/FormBuilder.vue.d.ts.map +1 -0
  127. package/dist/components/compositions/elements/builder/FormBuilder.vue.js +857 -2
  128. package/dist/components/compositions/elements/builder/FormBuilder.vue.js.map +1 -1
  129. package/dist/components/compositions/elements/builder/FormBuilder.vue2.js +2 -857
  130. package/dist/components/compositions/elements/builder/FormBuilder.vue2.js.map +1 -1
  131. package/dist/components/compositions/elements/builder/GridBuilder.vue.d.ts +37 -0
  132. package/dist/components/compositions/elements/builder/GridBuilder.vue.d.ts.map +1 -0
  133. package/dist/components/compositions/elements/builder/GridBuilder.vue.js +452 -2
  134. package/dist/components/compositions/elements/builder/GridBuilder.vue.js.map +1 -1
  135. package/dist/components/compositions/elements/builder/GridBuilder.vue2.js +2 -452
  136. package/dist/components/compositions/elements/builder/GridBuilder.vue2.js.map +1 -1
  137. package/dist/components/compositions/elements/builder/ObjectBuilder.vue.d.ts +33 -0
  138. package/dist/components/compositions/elements/builder/ObjectBuilder.vue.d.ts.map +1 -0
  139. package/dist/components/compositions/elements/builder/ObjectBuilder.vue.js +511 -2
  140. package/dist/components/compositions/elements/builder/ObjectBuilder.vue.js.map +1 -1
  141. package/dist/components/compositions/elements/builder/ObjectBuilder.vue2.js +2 -511
  142. package/dist/components/compositions/elements/builder/ObjectBuilder.vue2.js.map +1 -1
  143. package/dist/components/compositions/elements/builder/PresetBuilder.vue.d.ts +29 -0
  144. package/dist/components/compositions/elements/builder/PresetBuilder.vue.d.ts.map +1 -0
  145. package/dist/components/compositions/elements/builder/PresetBuilder.vue.js +163 -2
  146. package/dist/components/compositions/elements/builder/PresetBuilder.vue.js.map +1 -1
  147. package/dist/components/compositions/elements/builder/PresetBuilder.vue2.js +2 -163
  148. package/dist/components/compositions/elements/builder/PresetBuilder.vue2.js.map +1 -1
  149. package/dist/components/compositions/elements/builder/QuizBuilder.vue.d.ts +34 -0
  150. package/dist/components/compositions/elements/builder/QuizBuilder.vue.d.ts.map +1 -0
  151. package/dist/components/compositions/elements/builder/QuizBuilder.vue.js +591 -2
  152. package/dist/components/compositions/elements/builder/QuizBuilder.vue.js.map +1 -1
  153. package/dist/components/compositions/elements/builder/QuizBuilder.vue2.js +2 -591
  154. package/dist/components/compositions/elements/builder/QuizBuilder.vue2.js.map +1 -1
  155. package/dist/components/compositions/elements/builder/ReactiveCanvasBuilder.vue.d.ts +29 -0
  156. package/dist/components/compositions/elements/builder/ReactiveCanvasBuilder.vue.d.ts.map +1 -0
  157. package/dist/components/compositions/elements/builder/ReactiveCanvasBuilder.vue.js +580 -2
  158. package/dist/components/compositions/elements/builder/ReactiveCanvasBuilder.vue.js.map +1 -1
  159. package/dist/components/compositions/elements/builder/ReactiveCanvasBuilder.vue2.js +2 -580
  160. package/dist/components/compositions/elements/builder/ReactiveCanvasBuilder.vue2.js.map +1 -1
  161. package/dist/components/compositions/elements/card/ListCard.vue.d.ts +21 -0
  162. package/dist/components/compositions/elements/card/ListCard.vue.d.ts.map +1 -0
  163. package/dist/components/compositions/elements/code/BuildStatus.vue.d.ts +43 -0
  164. package/dist/components/compositions/elements/code/BuildStatus.vue.d.ts.map +1 -0
  165. package/dist/components/compositions/elements/code/BuildStatus.vue.js +246 -2
  166. package/dist/components/compositions/elements/code/BuildStatus.vue.js.map +1 -1
  167. package/dist/components/compositions/elements/code/BuildStatus.vue2.js +2 -246
  168. package/dist/components/compositions/elements/code/BuildStatus.vue2.js.map +1 -1
  169. package/dist/components/compositions/elements/code/ChatMessage.vue.d.ts +39 -0
  170. package/dist/components/compositions/elements/code/ChatMessage.vue.d.ts.map +1 -0
  171. package/dist/components/compositions/elements/code/ChatMessage.vue.js +267 -2
  172. package/dist/components/compositions/elements/code/ChatMessage.vue.js.map +1 -1
  173. package/dist/components/compositions/elements/code/ChatMessage.vue2.js +2 -267
  174. package/dist/components/compositions/elements/code/ChatMessage.vue2.js.map +1 -1
  175. package/dist/components/compositions/elements/code/FileTree.vue.d.ts +42 -0
  176. package/dist/components/compositions/elements/code/FileTree.vue.d.ts.map +1 -0
  177. package/dist/components/compositions/elements/code/FileTree.vue.js +251 -2
  178. package/dist/components/compositions/elements/code/FileTree.vue.js.map +1 -1
  179. package/dist/components/compositions/elements/code/FileTree.vue2.js +2 -251
  180. package/dist/components/compositions/elements/code/FileTree.vue2.js.map +1 -1
  181. package/dist/components/compositions/elements/code/GitCodeEditor.vue.d.ts +54 -0
  182. package/dist/components/compositions/elements/code/GitCodeEditor.vue.d.ts.map +1 -0
  183. package/dist/components/compositions/elements/code/GitCodeEditor.vue.js +273 -2
  184. package/dist/components/compositions/elements/code/GitCodeEditor.vue.js.map +1 -1
  185. package/dist/components/compositions/elements/code/GitCodeEditor.vue2.js +2 -273
  186. package/dist/components/compositions/elements/code/GitCodeEditor.vue2.js.map +1 -1
  187. package/dist/components/compositions/elements/code/PullRequestsList.vue.d.ts +46 -0
  188. package/dist/components/compositions/elements/code/PullRequestsList.vue.d.ts.map +1 -0
  189. package/dist/components/compositions/elements/code/PullRequestsList.vue.js +303 -2
  190. package/dist/components/compositions/elements/code/PullRequestsList.vue.js.map +1 -1
  191. package/dist/components/compositions/elements/code/PullRequestsList.vue2.js +2 -303
  192. package/dist/components/compositions/elements/code/PullRequestsList.vue2.js.map +1 -1
  193. package/dist/components/compositions/elements/configuration-block/DialogBlock.vue.d.ts +17 -0
  194. package/dist/components/compositions/elements/configuration-block/DialogBlock.vue.d.ts.map +1 -0
  195. package/dist/components/compositions/elements/configuration-block/DialogBlock.vue.js +101 -2
  196. package/dist/components/compositions/elements/configuration-block/DialogBlock.vue.js.map +1 -1
  197. package/dist/components/compositions/elements/configuration-block/DialogBlock.vue2.js +2 -101
  198. package/dist/components/compositions/elements/configuration-block/DialogBlock.vue2.js.map +1 -1
  199. package/dist/components/compositions/elements/configuration-block/ElementsBlock.vue.d.ts +20 -0
  200. package/dist/components/compositions/elements/configuration-block/ElementsBlock.vue.d.ts.map +1 -0
  201. package/dist/components/compositions/elements/configuration-block/ElementsBlock.vue.js +33 -2
  202. package/dist/components/compositions/elements/configuration-block/ElementsBlock.vue.js.map +1 -1
  203. package/dist/components/compositions/elements/configuration-block/ElementsBlock.vue2.js +2 -33
  204. package/dist/components/compositions/elements/configuration-block/ElementsBlock.vue2.js.map +1 -1
  205. package/dist/components/compositions/elements/configuration-block/ModalBlock.vue.d.ts +17 -0
  206. package/dist/components/compositions/elements/configuration-block/ModalBlock.vue.d.ts.map +1 -0
  207. package/dist/components/compositions/elements/configuration-block/ModalBlock.vue.js +103 -2
  208. package/dist/components/compositions/elements/configuration-block/ModalBlock.vue.js.map +1 -1
  209. package/dist/components/compositions/elements/configuration-block/ModalBlock.vue2.js +2 -103
  210. package/dist/components/compositions/elements/configuration-block/ModalBlock.vue2.js.map +1 -1
  211. package/dist/components/compositions/elements/configuration-block/RepeatableBlock.vue.d.ts +29 -0
  212. package/dist/components/compositions/elements/configuration-block/RepeatableBlock.vue.d.ts.map +1 -0
  213. package/dist/components/compositions/elements/configuration-block/RepeatableBlock.vue.js +172 -2
  214. package/dist/components/compositions/elements/configuration-block/RepeatableBlock.vue.js.map +1 -1
  215. package/dist/components/compositions/elements/configuration-block/RepeatableBlock.vue2.js +2 -140
  216. package/dist/components/compositions/elements/configuration-block/RepeatableBlock.vue2.js.map +1 -1
  217. package/dist/components/compositions/elements/configuration-block/RepeatableRow.vue.d.ts +12 -0
  218. package/dist/components/compositions/elements/configuration-block/RepeatableRow.vue.d.ts.map +1 -0
  219. package/dist/components/compositions/elements/configuration-block/RepeatableRow.vue.js +5 -0
  220. package/dist/components/compositions/elements/configuration-block/RepeatableRow.vue.js.map +1 -0
  221. package/dist/components/compositions/elements/configuration-block/RepeatableRow.vue2.js +25 -0
  222. package/dist/components/compositions/elements/configuration-block/RepeatableRow.vue2.js.map +1 -0
  223. package/dist/components/compositions/elements/display/BannerDisplay.vue.d.ts +13 -0
  224. package/dist/components/compositions/elements/display/BannerDisplay.vue.d.ts.map +1 -0
  225. package/dist/components/compositions/elements/display/BannerDisplay.vue.js +63 -2
  226. package/dist/components/compositions/elements/display/BannerDisplay.vue.js.map +1 -1
  227. package/dist/components/compositions/elements/display/BannerDisplay.vue2.js +2 -63
  228. package/dist/components/compositions/elements/display/BannerDisplay.vue2.js.map +1 -1
  229. package/dist/components/compositions/elements/display/BarcodeDisplay.vue.d.ts +12 -0
  230. package/dist/components/compositions/elements/display/BarcodeDisplay.vue.d.ts.map +1 -0
  231. package/dist/components/compositions/elements/display/BarcodeDisplay.vue.js +52 -2
  232. package/dist/components/compositions/elements/display/BarcodeDisplay.vue.js.map +1 -1
  233. package/dist/components/compositions/elements/display/BarcodeDisplay.vue2.js +2 -52
  234. package/dist/components/compositions/elements/display/BarcodeDisplay.vue2.js.map +1 -1
  235. package/dist/components/compositions/elements/display/CarouselDisplay.vue.d.ts +27 -0
  236. package/dist/components/compositions/elements/display/CarouselDisplay.vue.d.ts.map +1 -0
  237. package/dist/components/compositions/elements/display/CarouselDisplay.vue.js +144 -2
  238. package/dist/components/compositions/elements/display/CarouselDisplay.vue.js.map +1 -1
  239. package/dist/components/compositions/elements/display/CarouselDisplay.vue2.js +2 -144
  240. package/dist/components/compositions/elements/display/CarouselDisplay.vue2.js.map +1 -1
  241. package/dist/components/compositions/elements/display/ChartDisplay.vue.d.ts +17 -0
  242. package/dist/components/compositions/elements/display/ChartDisplay.vue.d.ts.map +1 -0
  243. package/dist/components/compositions/elements/display/ChartDisplay.vue.js +78 -2
  244. package/dist/components/compositions/elements/display/ChartDisplay.vue.js.map +1 -1
  245. package/dist/components/compositions/elements/display/ChartDisplay.vue2.js +2 -78
  246. package/dist/components/compositions/elements/display/ChartDisplay.vue2.js.map +1 -1
  247. package/dist/components/compositions/elements/display/HtmlDisplay.vue.d.ts +7 -0
  248. package/dist/components/compositions/elements/display/HtmlDisplay.vue.d.ts.map +1 -0
  249. package/dist/components/compositions/elements/display/HtmlDisplay.vue.js +20 -2
  250. package/dist/components/compositions/elements/display/HtmlDisplay.vue.js.map +1 -1
  251. package/dist/components/compositions/elements/display/HtmlDisplay.vue2.js +2 -20
  252. package/dist/components/compositions/elements/display/HtmlDisplay.vue2.js.map +1 -1
  253. package/dist/components/compositions/elements/display/IconDisplay.vue.d.ts +10 -0
  254. package/dist/components/compositions/elements/display/IconDisplay.vue.d.ts.map +1 -0
  255. package/dist/components/compositions/elements/display/IconDisplay.vue.js +55 -2
  256. package/dist/components/compositions/elements/display/IconDisplay.vue.js.map +1 -1
  257. package/dist/components/compositions/elements/display/IconDisplay.vue2.js +2 -55
  258. package/dist/components/compositions/elements/display/IconDisplay.vue2.js.map +1 -1
  259. package/dist/components/compositions/elements/display/IframeDisplay.vue.d.ts +11 -0
  260. package/dist/components/compositions/elements/display/IframeDisplay.vue.d.ts.map +1 -0
  261. package/dist/components/compositions/elements/display/IframeDisplay.vue.js +32 -2
  262. package/dist/components/compositions/elements/display/IframeDisplay.vue.js.map +1 -1
  263. package/dist/components/compositions/elements/display/IframeDisplay.vue2.js +2 -32
  264. package/dist/components/compositions/elements/display/IframeDisplay.vue2.js.map +1 -1
  265. package/dist/components/compositions/elements/display/ImageDisplay.vue.d.ts +8 -0
  266. package/dist/components/compositions/elements/display/ImageDisplay.vue.d.ts.map +1 -0
  267. package/dist/components/compositions/elements/display/ImageDisplay.vue.js +35 -2
  268. package/dist/components/compositions/elements/display/ImageDisplay.vue.js.map +1 -1
  269. package/dist/components/compositions/elements/display/ImageDisplay.vue2.js +2 -35
  270. package/dist/components/compositions/elements/display/ImageDisplay.vue2.js.map +1 -1
  271. package/dist/components/compositions/elements/display/MarkdownDisplay.vue.d.ts +7 -0
  272. package/dist/components/compositions/elements/display/MarkdownDisplay.vue.d.ts.map +1 -0
  273. package/dist/components/compositions/elements/display/MarkdownDisplay.vue.js +39 -2
  274. package/dist/components/compositions/elements/display/MarkdownDisplay.vue.js.map +1 -1
  275. package/dist/components/compositions/elements/display/MarkdownDisplay.vue2.js +2 -39
  276. package/dist/components/compositions/elements/display/MarkdownDisplay.vue2.js.map +1 -1
  277. package/dist/components/compositions/elements/display/ProgressBarDisplay.vue.d.ts +11 -0
  278. package/dist/components/compositions/elements/display/ProgressBarDisplay.vue.d.ts.map +1 -0
  279. package/dist/components/compositions/elements/display/ProgressBarDisplay.vue.js +42 -2
  280. package/dist/components/compositions/elements/display/ProgressBarDisplay.vue.js.map +1 -1
  281. package/dist/components/compositions/elements/display/ProgressBarDisplay.vue2.js +2 -42
  282. package/dist/components/compositions/elements/display/ProgressBarDisplay.vue2.js.map +1 -1
  283. package/dist/components/compositions/elements/display/QrCodeDisplay.vue.d.ts +9 -0
  284. package/dist/components/compositions/elements/display/QrCodeDisplay.vue.d.ts.map +1 -0
  285. package/dist/components/compositions/elements/display/QrCodeDisplay.vue.js +46 -2
  286. package/dist/components/compositions/elements/display/QrCodeDisplay.vue.js.map +1 -1
  287. package/dist/components/compositions/elements/display/QrCodeDisplay.vue2.js +2 -46
  288. package/dist/components/compositions/elements/display/QrCodeDisplay.vue2.js.map +1 -1
  289. package/dist/components/compositions/elements/display/ReactiveCanvasDisplay.vue.d.ts +7 -0
  290. package/dist/components/compositions/elements/display/ReactiveCanvasDisplay.vue.d.ts.map +1 -0
  291. package/dist/components/compositions/elements/display/ReactiveCanvasDisplay.vue.js +64 -2
  292. package/dist/components/compositions/elements/display/ReactiveCanvasDisplay.vue.js.map +1 -1
  293. package/dist/components/compositions/elements/display/ReactiveCanvasDisplay.vue2.js +2 -64
  294. package/dist/components/compositions/elements/display/ReactiveCanvasDisplay.vue2.js.map +1 -1
  295. package/dist/components/compositions/elements/display/SpriteDisplay.vue.d.ts +7 -0
  296. package/dist/components/compositions/elements/display/SpriteDisplay.vue.d.ts.map +1 -0
  297. package/dist/components/compositions/elements/display/SpriteDisplay.vue.js +64 -2
  298. package/dist/components/compositions/elements/display/SpriteDisplay.vue.js.map +1 -1
  299. package/dist/components/compositions/elements/display/SpriteDisplay.vue2.js +2 -64
  300. package/dist/components/compositions/elements/display/SpriteDisplay.vue2.js.map +1 -1
  301. package/dist/components/compositions/elements/display/TypeDisplay.vue.d.ts +11 -0
  302. package/dist/components/compositions/elements/display/TypeDisplay.vue.d.ts.map +1 -0
  303. package/dist/components/compositions/elements/display/TypeDisplay.vue.js +42 -2
  304. package/dist/components/compositions/elements/display/TypeDisplay.vue.js.map +1 -1
  305. package/dist/components/compositions/elements/display/TypeDisplay.vue2.js +2 -42
  306. package/dist/components/compositions/elements/display/TypeDisplay.vue2.js.map +1 -1
  307. package/dist/components/compositions/elements/display/VideoPlayerDisplay.vue.d.ts +10 -0
  308. package/dist/components/compositions/elements/display/VideoPlayerDisplay.vue.d.ts.map +1 -0
  309. package/dist/components/compositions/elements/display/VideoPlayerDisplay.vue.js +33 -2
  310. package/dist/components/compositions/elements/display/VideoPlayerDisplay.vue.js.map +1 -1
  311. package/dist/components/compositions/elements/display/VideoPlayerDisplay.vue2.js +2 -33
  312. package/dist/components/compositions/elements/display/VideoPlayerDisplay.vue2.js.map +1 -1
  313. package/dist/components/compositions/elements/editor/CodeEditor.vue.d.ts +33 -0
  314. package/dist/components/compositions/elements/editor/CodeEditor.vue.d.ts.map +1 -0
  315. package/dist/components/compositions/elements/editor/CodeEditor.vue.js +5 -2
  316. package/dist/components/compositions/elements/editor/CodeEditor.vue.js.map +1 -1
  317. package/dist/components/compositions/elements/editor/CodeEditor.vue2.js +211 -53
  318. package/dist/components/compositions/elements/editor/CodeEditor.vue2.js.map +1 -1
  319. package/dist/components/compositions/elements/editor/HtmlEditor.vue.d.ts +24 -0
  320. package/dist/components/compositions/elements/editor/HtmlEditor.vue.d.ts.map +1 -0
  321. package/dist/components/compositions/elements/editor/HtmlEditor.vue.js +5 -2
  322. package/dist/components/compositions/elements/editor/HtmlEditor.vue.js.map +1 -1
  323. package/dist/components/compositions/elements/editor/HtmlEditor.vue2.js +1333 -50
  324. package/dist/components/compositions/elements/editor/HtmlEditor.vue2.js.map +1 -1
  325. package/dist/components/compositions/elements/editor/ImageEditor.vue.d.ts +24 -0
  326. package/dist/components/compositions/elements/editor/ImageEditor.vue.d.ts.map +1 -0
  327. package/dist/components/compositions/elements/editor/ImageEditor.vue.js +67 -2
  328. package/dist/components/compositions/elements/editor/ImageEditor.vue.js.map +1 -1
  329. package/dist/components/compositions/elements/editor/ImageEditor.vue2.js +2 -67
  330. package/dist/components/compositions/elements/editor/ImageEditor.vue2.js.map +1 -1
  331. package/dist/components/compositions/elements/editor/MarkdownEditor.vue.d.ts +28 -0
  332. package/dist/components/compositions/elements/editor/MarkdownEditor.vue.d.ts.map +1 -0
  333. package/dist/components/compositions/elements/editor/MarkdownEditor.vue.js +82 -2
  334. package/dist/components/compositions/elements/editor/MarkdownEditor.vue.js.map +1 -1
  335. package/dist/components/compositions/elements/editor/MarkdownEditor.vue2.js +2 -82
  336. package/dist/components/compositions/elements/editor/MarkdownEditor.vue2.js.map +1 -1
  337. package/dist/components/compositions/elements/editor/RichTextEditor.vue.d.ts +26 -0
  338. package/dist/components/compositions/elements/editor/RichTextEditor.vue.d.ts.map +1 -0
  339. package/dist/components/compositions/elements/editor/RichTextEditor.vue.js +262 -2
  340. package/dist/components/compositions/elements/editor/RichTextEditor.vue.js.map +1 -1
  341. package/dist/components/compositions/elements/editor/RichTextEditor.vue2.js +2 -262
  342. package/dist/components/compositions/elements/editor/RichTextEditor.vue2.js.map +1 -1
  343. package/dist/components/compositions/elements/file/AssetPickerFile.vue.d.ts +47 -0
  344. package/dist/components/compositions/elements/file/AssetPickerFile.vue.d.ts.map +1 -0
  345. package/dist/components/compositions/elements/file/AssetPickerFile.vue.js +293 -2
  346. package/dist/components/compositions/elements/file/AssetPickerFile.vue.js.map +1 -1
  347. package/dist/components/compositions/elements/file/AssetPickerFile.vue2.js +2 -293
  348. package/dist/components/compositions/elements/file/AssetPickerFile.vue2.js.map +1 -1
  349. package/dist/components/compositions/elements/file/DropzoneFile.vue.d.ts +33 -0
  350. package/dist/components/compositions/elements/file/DropzoneFile.vue.d.ts.map +1 -0
  351. package/dist/components/compositions/elements/file/DropzoneFile.vue.js +171 -2
  352. package/dist/components/compositions/elements/file/DropzoneFile.vue.js.map +1 -1
  353. package/dist/components/compositions/elements/file/DropzoneFile.vue2.js +2 -171
  354. package/dist/components/compositions/elements/file/DropzoneFile.vue2.js.map +1 -1
  355. package/dist/components/compositions/elements/file/UploadFile.vue.d.ts +33 -0
  356. package/dist/components/compositions/elements/file/UploadFile.vue.d.ts.map +1 -0
  357. package/dist/components/compositions/elements/file/UploadFile.vue.js +149 -2
  358. package/dist/components/compositions/elements/file/UploadFile.vue.js.map +1 -1
  359. package/dist/components/compositions/elements/file/UploadFile.vue2.js +2 -149
  360. package/dist/components/compositions/elements/file/UploadFile.vue2.js.map +1 -1
  361. package/dist/components/compositions/elements/input/BarcodeScannerInput.vue.d.ts +48 -0
  362. package/dist/components/compositions/elements/input/BarcodeScannerInput.vue.d.ts.map +1 -0
  363. package/dist/components/compositions/elements/input/BarcodeScannerInput.vue.js +166 -2
  364. package/dist/components/compositions/elements/input/BarcodeScannerInput.vue.js.map +1 -1
  365. package/dist/components/compositions/elements/input/BarcodeScannerInput.vue2.js +2 -166
  366. package/dist/components/compositions/elements/input/BarcodeScannerInput.vue2.js.map +1 -1
  367. package/dist/components/compositions/elements/input/EmailInput.vue.d.ts +48 -0
  368. package/dist/components/compositions/elements/input/EmailInput.vue.d.ts.map +1 -0
  369. package/dist/components/compositions/elements/input/EmailInput.vue.js +62 -2
  370. package/dist/components/compositions/elements/input/EmailInput.vue.js.map +1 -1
  371. package/dist/components/compositions/elements/input/EmailInput.vue2.js +2 -62
  372. package/dist/components/compositions/elements/input/EmailInput.vue2.js.map +1 -1
  373. package/dist/components/compositions/elements/input/NumberInput.vue.d.ts +49 -0
  374. package/dist/components/compositions/elements/input/NumberInput.vue.d.ts.map +1 -0
  375. package/dist/components/compositions/elements/input/NumberInput.vue.js +73 -2
  376. package/dist/components/compositions/elements/input/NumberInput.vue.js.map +1 -1
  377. package/dist/components/compositions/elements/input/NumberInput.vue2.js +2 -73
  378. package/dist/components/compositions/elements/input/NumberInput.vue2.js.map +1 -1
  379. package/dist/components/compositions/elements/input/PasswordInput.vue.d.ts +49 -0
  380. package/dist/components/compositions/elements/input/PasswordInput.vue.d.ts.map +1 -0
  381. package/dist/components/compositions/elements/input/PasswordInput.vue.js +98 -2
  382. package/dist/components/compositions/elements/input/PasswordInput.vue.js.map +1 -1
  383. package/dist/components/compositions/elements/input/PasswordInput.vue2.js +2 -98
  384. package/dist/components/compositions/elements/input/PasswordInput.vue2.js.map +1 -1
  385. package/dist/components/compositions/elements/input/RangeSliderInput.vue.d.ts +31 -0
  386. package/dist/components/compositions/elements/input/RangeSliderInput.vue.d.ts.map +1 -0
  387. package/dist/components/compositions/elements/input/RangeSliderInput.vue.js +69 -2
  388. package/dist/components/compositions/elements/input/RangeSliderInput.vue.js.map +1 -1
  389. package/dist/components/compositions/elements/input/RangeSliderInput.vue2.js +2 -69
  390. package/dist/components/compositions/elements/input/RangeSliderInput.vue2.js.map +1 -1
  391. package/dist/components/compositions/elements/input/SearchInput.vue.d.ts +48 -0
  392. package/dist/components/compositions/elements/input/SearchInput.vue.d.ts.map +1 -0
  393. package/dist/components/compositions/elements/input/SearchInput.vue.js +69 -2
  394. package/dist/components/compositions/elements/input/SearchInput.vue.js.map +1 -1
  395. package/dist/components/compositions/elements/input/SearchInput.vue2.js +2 -69
  396. package/dist/components/compositions/elements/input/SearchInput.vue2.js.map +1 -1
  397. package/dist/components/compositions/elements/input/TelInput.vue.d.ts +48 -0
  398. package/dist/components/compositions/elements/input/TelInput.vue.d.ts.map +1 -0
  399. package/dist/components/compositions/elements/input/TelInput.vue.js +62 -2
  400. package/dist/components/compositions/elements/input/TelInput.vue.js.map +1 -1
  401. package/dist/components/compositions/elements/input/TelInput.vue2.js +2 -62
  402. package/dist/components/compositions/elements/input/TelInput.vue2.js.map +1 -1
  403. package/dist/components/compositions/elements/input/TextInput.vue.d.ts +48 -0
  404. package/dist/components/compositions/elements/input/TextInput.vue.d.ts.map +1 -0
  405. package/dist/components/compositions/elements/input/TextInput.vue.js +62 -2
  406. package/dist/components/compositions/elements/input/TextInput.vue.js.map +1 -1
  407. package/dist/components/compositions/elements/input/TextInput.vue2.js +2 -62
  408. package/dist/components/compositions/elements/input/TextInput.vue2.js.map +1 -1
  409. package/dist/components/compositions/elements/input/TextareaInput.vue.d.ts +54 -0
  410. package/dist/components/compositions/elements/input/TextareaInput.vue.d.ts.map +1 -0
  411. package/dist/components/compositions/elements/input/TextareaInput.vue.js +63 -2
  412. package/dist/components/compositions/elements/input/TextareaInput.vue.js.map +1 -1
  413. package/dist/components/compositions/elements/input/TextareaInput.vue2.js +2 -63
  414. package/dist/components/compositions/elements/input/TextareaInput.vue2.js.map +1 -1
  415. package/dist/components/compositions/elements/input/UrlInput.vue.d.ts +48 -0
  416. package/dist/components/compositions/elements/input/UrlInput.vue.d.ts.map +1 -0
  417. package/dist/components/compositions/elements/input/UrlInput.vue.js +62 -2
  418. package/dist/components/compositions/elements/input/UrlInput.vue.js.map +1 -1
  419. package/dist/components/compositions/elements/input/UrlInput.vue2.js +2 -62
  420. package/dist/components/compositions/elements/input/UrlInput.vue2.js.map +1 -1
  421. package/dist/components/compositions/elements/option-select/AsyncSelectOption.vue.d.ts +44 -0
  422. package/dist/components/compositions/elements/option-select/AsyncSelectOption.vue.d.ts.map +1 -0
  423. package/dist/components/compositions/elements/option-select/AsyncSelectOption.vue.js +167 -2
  424. package/dist/components/compositions/elements/option-select/AsyncSelectOption.vue.js.map +1 -1
  425. package/dist/components/compositions/elements/option-select/AsyncSelectOption.vue2.js +2 -167
  426. package/dist/components/compositions/elements/option-select/AsyncSelectOption.vue2.js.map +1 -1
  427. package/dist/components/compositions/elements/option-select/AutoCompleteOption.vue.d.ts +31 -0
  428. package/dist/components/compositions/elements/option-select/AutoCompleteOption.vue.d.ts.map +1 -0
  429. package/dist/components/compositions/elements/option-select/AutoCompleteOption.vue.js +121 -2
  430. package/dist/components/compositions/elements/option-select/AutoCompleteOption.vue.js.map +1 -1
  431. package/dist/components/compositions/elements/option-select/AutoCompleteOption.vue2.js +2 -121
  432. package/dist/components/compositions/elements/option-select/AutoCompleteOption.vue2.js.map +1 -1
  433. package/dist/components/compositions/elements/option-select/CheckboxOption.vue.d.ts +29 -0
  434. package/dist/components/compositions/elements/option-select/CheckboxOption.vue.d.ts.map +1 -0
  435. package/dist/components/compositions/elements/option-select/CheckboxOption.vue.js +87 -2
  436. package/dist/components/compositions/elements/option-select/CheckboxOption.vue.js.map +1 -1
  437. package/dist/components/compositions/elements/option-select/CheckboxOption.vue2.js +2 -87
  438. package/dist/components/compositions/elements/option-select/CheckboxOption.vue2.js.map +1 -1
  439. package/dist/components/compositions/elements/option-select/IntegrationConnectorOption.vue.d.ts +41 -0
  440. package/dist/components/compositions/elements/option-select/IntegrationConnectorOption.vue.d.ts.map +1 -0
  441. package/dist/components/compositions/elements/option-select/IntegrationConnectorOption.vue.js +237 -2
  442. package/dist/components/compositions/elements/option-select/IntegrationConnectorOption.vue.js.map +1 -1
  443. package/dist/components/compositions/elements/option-select/IntegrationConnectorOption.vue2.js +2 -237
  444. package/dist/components/compositions/elements/option-select/IntegrationConnectorOption.vue2.js.map +1 -1
  445. package/dist/components/compositions/elements/option-select/ListOption.vue.d.ts +29 -0
  446. package/dist/components/compositions/elements/option-select/ListOption.vue.d.ts.map +1 -0
  447. package/dist/components/compositions/elements/option-select/ListOption.vue.js +89 -2
  448. package/dist/components/compositions/elements/option-select/ListOption.vue.js.map +1 -1
  449. package/dist/components/compositions/elements/option-select/ListOption.vue2.js +2 -89
  450. package/dist/components/compositions/elements/option-select/ListOption.vue2.js.map +1 -1
  451. package/dist/components/compositions/elements/option-select/PillSelectOption.vue.d.ts +28 -0
  452. package/dist/components/compositions/elements/option-select/PillSelectOption.vue.d.ts.map +1 -0
  453. package/dist/components/compositions/elements/option-select/PillSelectOption.vue.js +85 -2
  454. package/dist/components/compositions/elements/option-select/PillSelectOption.vue.js.map +1 -1
  455. package/dist/components/compositions/elements/option-select/PillSelectOption.vue2.js +2 -85
  456. package/dist/components/compositions/elements/option-select/PillSelectOption.vue2.js.map +1 -1
  457. package/dist/components/compositions/elements/option-select/RadioOption.vue.d.ts +29 -0
  458. package/dist/components/compositions/elements/option-select/RadioOption.vue.d.ts.map +1 -0
  459. package/dist/components/compositions/elements/option-select/RadioOption.vue.js +98 -2
  460. package/dist/components/compositions/elements/option-select/RadioOption.vue.js.map +1 -1
  461. package/dist/components/compositions/elements/option-select/RadioOption.vue2.js +2 -98
  462. package/dist/components/compositions/elements/option-select/RadioOption.vue2.js.map +1 -1
  463. package/dist/components/compositions/elements/option-select/SelectMultipleOption.vue.d.ts +29 -0
  464. package/dist/components/compositions/elements/option-select/SelectMultipleOption.vue.d.ts.map +1 -0
  465. package/dist/components/compositions/elements/option-select/SelectMultipleOption.vue.js +151 -2
  466. package/dist/components/compositions/elements/option-select/SelectMultipleOption.vue.js.map +1 -1
  467. package/dist/components/compositions/elements/option-select/SelectMultipleOption.vue2.js +2 -151
  468. package/dist/components/compositions/elements/option-select/SelectMultipleOption.vue2.js.map +1 -1
  469. package/dist/components/compositions/elements/option-select/SelectOption.vue.d.ts +29 -0
  470. package/dist/components/compositions/elements/option-select/SelectOption.vue.d.ts.map +1 -0
  471. package/dist/components/compositions/elements/option-select/SelectOption.vue.js +116 -2
  472. package/dist/components/compositions/elements/option-select/SelectOption.vue.js.map +1 -1
  473. package/dist/components/compositions/elements/option-select/SelectOption.vue2.js +2 -116
  474. package/dist/components/compositions/elements/option-select/SelectOption.vue2.js.map +1 -1
  475. package/dist/components/compositions/elements/picker/AsyncSelectPicker.vue.d.ts +40 -0
  476. package/dist/components/compositions/elements/picker/AsyncSelectPicker.vue.d.ts.map +1 -0
  477. package/dist/components/compositions/elements/picker/AsyncSelectPicker.vue.js +182 -2
  478. package/dist/components/compositions/elements/picker/AsyncSelectPicker.vue.js.map +1 -1
  479. package/dist/components/compositions/elements/picker/AsyncSelectPicker.vue2.js +2 -182
  480. package/dist/components/compositions/elements/picker/AsyncSelectPicker.vue2.js.map +1 -1
  481. package/dist/components/compositions/elements/picker/ColorPicker.vue.d.ts +29 -0
  482. package/dist/components/compositions/elements/picker/ColorPicker.vue.d.ts.map +1 -0
  483. package/dist/components/compositions/elements/picker/ColorPicker.vue.js +155 -2
  484. package/dist/components/compositions/elements/picker/ColorPicker.vue.js.map +1 -1
  485. package/dist/components/compositions/elements/picker/ColorPicker.vue2.js +2 -155
  486. package/dist/components/compositions/elements/picker/ColorPicker.vue2.js.map +1 -1
  487. package/dist/components/compositions/elements/picker/DataModelPicker.vue.d.ts +29 -0
  488. package/dist/components/compositions/elements/picker/DataModelPicker.vue.d.ts.map +1 -0
  489. package/dist/components/compositions/elements/picker/DataModelPicker.vue.js +104 -2
  490. package/dist/components/compositions/elements/picker/DataModelPicker.vue.js.map +1 -1
  491. package/dist/components/compositions/elements/picker/DataModelPicker.vue2.js +2 -104
  492. package/dist/components/compositions/elements/picker/DataModelPicker.vue2.js.map +1 -1
  493. package/dist/components/compositions/elements/picker/DatePicker.vue.d.ts +32 -0
  494. package/dist/components/compositions/elements/picker/DatePicker.vue.d.ts.map +1 -0
  495. package/dist/components/compositions/elements/picker/DatePicker.vue.js +140 -2
  496. package/dist/components/compositions/elements/picker/DatePicker.vue.js.map +1 -1
  497. package/dist/components/compositions/elements/picker/DatePicker.vue2.js +2 -140
  498. package/dist/components/compositions/elements/picker/DatePicker.vue2.js.map +1 -1
  499. package/dist/components/compositions/elements/picker/DateTimePicker.vue.d.ts +26 -0
  500. package/dist/components/compositions/elements/picker/DateTimePicker.vue.d.ts.map +1 -0
  501. package/dist/components/compositions/elements/picker/DateTimePicker.vue.js +171 -2
  502. package/dist/components/compositions/elements/picker/DateTimePicker.vue.js.map +1 -1
  503. package/dist/components/compositions/elements/picker/DateTimePicker.vue2.js +2 -171
  504. package/dist/components/compositions/elements/picker/DateTimePicker.vue2.js.map +1 -1
  505. package/dist/components/compositions/elements/picker/IconPicker.vue.d.ts +26 -0
  506. package/dist/components/compositions/elements/picker/IconPicker.vue.d.ts.map +1 -0
  507. package/dist/components/compositions/elements/picker/IconPicker.vue.js +190 -2
  508. package/dist/components/compositions/elements/picker/IconPicker.vue.js.map +1 -1
  509. package/dist/components/compositions/elements/picker/IconPicker.vue2.js +2 -190
  510. package/dist/components/compositions/elements/picker/IconPicker.vue2.js.map +1 -1
  511. package/dist/components/compositions/elements/picker/IconPickerInline.vue.d.ts +24 -0
  512. package/dist/components/compositions/elements/picker/IconPickerInline.vue.d.ts.map +1 -0
  513. package/dist/components/compositions/elements/{components/IconPickerInline.vue2.js → picker/IconPickerInline.vue.js} +23 -23
  514. package/dist/components/compositions/elements/picker/IconPickerInline.vue.js.map +1 -0
  515. package/dist/components/compositions/elements/picker/IconPickerInline.vue2.js +5 -0
  516. package/dist/components/compositions/elements/picker/IconPickerInline.vue2.js.map +1 -0
  517. package/dist/components/compositions/elements/picker/IntegrationConnectorPicker.vue.d.ts +41 -0
  518. package/dist/components/compositions/elements/picker/IntegrationConnectorPicker.vue.d.ts.map +1 -0
  519. package/dist/components/compositions/elements/picker/IntegrationConnectorPicker.vue.js +271 -2
  520. package/dist/components/compositions/elements/picker/IntegrationConnectorPicker.vue.js.map +1 -1
  521. package/dist/components/compositions/elements/picker/IntegrationConnectorPicker.vue2.js +2 -271
  522. package/dist/components/compositions/elements/picker/IntegrationConnectorPicker.vue2.js.map +1 -1
  523. package/dist/components/compositions/elements/picker/MapPicker.vue.d.ts +55 -0
  524. package/dist/components/compositions/elements/picker/MapPicker.vue.d.ts.map +1 -0
  525. package/dist/components/compositions/elements/picker/MapPicker.vue.js +118 -2
  526. package/dist/components/compositions/elements/picker/MapPicker.vue.js.map +1 -1
  527. package/dist/components/compositions/elements/picker/MapPicker.vue2.js +2 -118
  528. package/dist/components/compositions/elements/picker/MapPicker.vue2.js.map +1 -1
  529. package/dist/components/compositions/elements/picker/TimePicker.vue.d.ts +26 -0
  530. package/dist/components/compositions/elements/picker/TimePicker.vue.d.ts.map +1 -0
  531. package/dist/components/compositions/elements/picker/TimePicker.vue.js +106 -2
  532. package/dist/components/compositions/elements/picker/TimePicker.vue.js.map +1 -1
  533. package/dist/components/compositions/elements/picker/TimePicker.vue2.js +2 -106
  534. package/dist/components/compositions/elements/picker/TimePicker.vue2.js.map +1 -1
  535. package/dist/components/compositions/elements/picker/TimezonePicker.vue.d.ts +26 -0
  536. package/dist/components/compositions/elements/picker/TimezonePicker.vue.d.ts.map +1 -0
  537. package/dist/components/compositions/elements/picker/TimezonePicker.vue.js +124 -2
  538. package/dist/components/compositions/elements/picker/TimezonePicker.vue.js.map +1 -1
  539. package/dist/components/compositions/elements/picker/TimezonePicker.vue2.js +2 -124
  540. package/dist/components/compositions/elements/picker/TimezonePicker.vue2.js.map +1 -1
  541. package/dist/components/ui/index.d.ts +3 -3
  542. package/dist/components/ui/toast/index.d.ts +1 -1
  543. package/dist/components/ui/toast/index.js.map +1 -1
  544. package/dist/configuration-block.d.ts +5 -0
  545. package/dist/configuration-block.d.ts.map +1 -0
  546. package/dist/configuration-block.js +11 -0
  547. package/dist/configuration-block.js.map +1 -0
  548. package/dist/definitions/elements/PickerElement.d.ts +1 -1
  549. package/dist/definitions/elements/PickerElement.d.ts.map +1 -1
  550. package/dist/definitions/elements/PickerElement.js +3 -2
  551. package/dist/definitions/elements/PickerElement.js.map +1 -1
  552. package/dist/definitions/elements/index.d.ts +1 -155
  553. package/dist/definitions/elements/index.d.ts.map +1 -1
  554. package/dist/definitions/elements/index.js +112 -121
  555. package/dist/definitions/elements/index.js.map +1 -1
  556. package/dist/definitions/index.d.ts +1 -1
  557. package/dist/definitions/shared/base.d.ts +1 -1
  558. package/dist/definitions/shared/base.d.ts.map +1 -1
  559. package/dist/definitions/shared/base.js.map +1 -1
  560. package/dist/display.d.ts +16 -0
  561. package/dist/display.d.ts.map +1 -0
  562. package/dist/display.js +33 -0
  563. package/dist/display.js.map +1 -0
  564. package/dist/editor.d.ts +6 -0
  565. package/dist/editor.d.ts.map +1 -0
  566. package/dist/editor.js +13 -0
  567. package/dist/editor.js.map +1 -0
  568. package/dist/engine/registry.d.ts +0 -2
  569. package/dist/engine/registry.d.ts.map +1 -1
  570. package/dist/engine/registry.js +1 -5
  571. package/dist/engine/registry.js.map +1 -1
  572. package/dist/engine/useCardLoader.js +1 -1
  573. package/dist/engine/useCardLoader.js.map +1 -1
  574. package/dist/engine/useElementLoader.js +1 -1
  575. package/dist/engine/useElementLoader.js.map +1 -1
  576. package/dist/engine/useFormData.d.ts.map +1 -1
  577. package/dist/engine/useFormData.js +13 -13
  578. package/dist/engine/useFormData.js.map +1 -1
  579. package/dist/file.d.ts +4 -0
  580. package/dist/file.d.ts.map +1 -0
  581. package/dist/file.js +9 -0
  582. package/dist/file.js.map +1 -0
  583. package/dist/index.d.ts +3 -3
  584. package/dist/index.js +71 -75
  585. package/dist/index.js.map +1 -1
  586. package/dist/input.d.ts +11 -0
  587. package/dist/input.d.ts.map +1 -0
  588. package/dist/input.js +23 -0
  589. package/dist/input.js.map +1 -0
  590. package/dist/lib/storybook.d.ts +45 -0
  591. package/dist/lib/storybook.d.ts.map +1 -0
  592. package/dist/option-select.d.ts +10 -0
  593. package/dist/option-select.d.ts.map +1 -0
  594. package/dist/option-select.js +21 -0
  595. package/dist/option-select.js.map +1 -0
  596. package/dist/pages/ShowPage.vue.js +1 -1
  597. package/dist/pages/ShowPage.vue.js.map +1 -1
  598. package/dist/picker.d.ts +12 -0
  599. package/dist/picker.d.ts.map +1 -0
  600. package/dist/picker.js +25 -0
  601. package/dist/picker.js.map +1 -0
  602. package/dist/stores/dependencyListBuilderStore.d.ts +1 -1
  603. package/dist/stores/dependencyListBuilderStore.js +5 -5
  604. package/dist/stores/dependencyListBuilderStore.js.map +1 -1
  605. package/dist/stores/elementListBuilderStore.d.ts +1 -1
  606. package/dist/stores/elementListBuilderStore.js +14 -14
  607. package/dist/stores/elementListBuilderStore.js.map +1 -1
  608. package/dist/stores/formBuilderStore.d.ts +1 -1
  609. package/dist/stores/formBuilderStore.js +5 -5
  610. package/dist/stores/formBuilderStore.js.map +1 -1
  611. package/dist/stores/formDataStore.d.ts +1 -1
  612. package/dist/stores/formDataStore.js +2 -2
  613. package/dist/stores/formDataStore.js.map +1 -1
  614. package/dist/stores/gridBuilderStore.d.ts +1 -1
  615. package/dist/stores/gridBuilderStore.js +11 -11
  616. package/dist/stores/gridBuilderStore.js.map +1 -1
  617. package/dist/stores/objectBuilderStore.d.ts +1 -1
  618. package/dist/stores/objectBuilderStore.js +1 -1
  619. package/dist/stores/objectBuilderStore.js.map +1 -1
  620. package/dist/stores/presetBuilderStore.d.ts +1 -1
  621. package/dist/stores/presetBuilderStore.js +12 -12
  622. package/dist/stores/presetBuilderStore.js.map +1 -1
  623. package/dist/stores/quizBuilderStore.d.ts +1 -1
  624. package/dist/stores/quizBuilderStore.js +1 -1
  625. package/dist/stores/quizBuilderStore.js.map +1 -1
  626. package/dist/stores/reactiveCanvasBuilderStore.d.ts +1 -1
  627. package/dist/stores/reactiveCanvasBuilderStore.js +40 -40
  628. package/dist/stores/reactiveCanvasBuilderStore.js.map +1 -1
  629. package/dist/styles/mod-ui.css +1 -0
  630. package/package.json +85 -20
  631. package/src/action.ts +3 -0
  632. package/src/adapters/fieldTypeMap.ts +3 -8
  633. package/src/adapters/index.ts +1 -1
  634. package/src/boolean.ts +4 -0
  635. package/src/builder.ts +8 -0
  636. package/src/cards.ts +7 -0
  637. package/src/code.ts +5 -0
  638. package/src/components/compositions/cards/CardListCard.stories.ts +2 -0
  639. package/src/components/compositions/cards/DataTableCard.stories.ts +2 -0
  640. package/src/components/compositions/cards/ElementDisplayCard.stories.ts +2 -0
  641. package/src/components/compositions/cards/ElementListCard.stories.ts +2 -0
  642. package/src/components/compositions/cards/GridViewCard.stories.ts +2 -0
  643. package/src/components/compositions/cards/InfoCard.stories.ts +2 -0
  644. package/src/components/compositions/cards/TabListCard.stories.ts +2 -0
  645. package/src/components/compositions/elements/action/ButtonAction.stories.ts +3 -1
  646. package/src/components/compositions/elements/action/ButtonGroupAction.stories.ts +3 -1
  647. package/src/components/compositions/elements/action/LinkAction.stories.ts +3 -1
  648. package/src/components/compositions/elements/boolean/CheckboxBoolean.stories.ts +3 -1
  649. package/src/components/compositions/elements/boolean/IconToggleBoolean.stories.ts +3 -1
  650. package/src/components/compositions/elements/boolean/RadioBoolean.stories.ts +3 -1
  651. package/src/components/compositions/elements/boolean/SwitchBoolean.stories.ts +3 -1
  652. package/src/components/compositions/elements/builder/DependencyListBuilder.stories.ts +1 -1
  653. package/src/components/compositions/elements/builder/ElementListBuilder.stories.ts +1 -1
  654. package/src/components/compositions/elements/builder/ElementListBuilder.test.ts +0 -1
  655. package/src/components/compositions/elements/builder/FormBuilder.stories.ts +2 -0
  656. package/src/components/compositions/elements/builder/FormBuilder.test.ts +0 -1
  657. package/src/components/compositions/elements/builder/GridBuilder.stories.ts +2 -0
  658. package/src/components/compositions/elements/builder/ObjectBuilder.stories.ts +1 -1
  659. package/src/components/compositions/elements/builder/PresetBuilder.stories.ts +1 -1
  660. package/src/components/compositions/elements/builder/QuizBuilder.stories.ts +2 -0
  661. package/src/components/compositions/elements/builder/ReactiveCanvasBuilder.stories.ts +1 -1
  662. package/src/components/compositions/elements/code/BuildStatus.stories.ts +3 -1
  663. package/src/components/compositions/elements/code/ChatMessage.stories.ts +1 -1
  664. package/src/components/compositions/elements/code/FileTree.stories.ts +3 -1
  665. package/src/components/compositions/elements/code/GitCodeEditor.stories.ts +3 -1
  666. package/src/components/compositions/elements/code/PullRequestsList.stories.ts +3 -1
  667. package/src/components/compositions/elements/configuration-block/DialogBlock.stories.ts +1 -1
  668. package/src/components/compositions/elements/configuration-block/ElementsBlock.stories.ts +1 -1
  669. package/src/components/compositions/elements/configuration-block/ModalBlock.stories.ts +2 -0
  670. package/src/components/compositions/elements/configuration-block/RepeatableBlock.stories.ts +45 -2
  671. package/src/components/compositions/elements/configuration-block/RepeatableBlock.test.ts +47 -16
  672. package/src/components/compositions/elements/configuration-block/RepeatableBlock.vue +161 -92
  673. package/src/components/compositions/elements/configuration-block/RepeatableRow.vue +36 -0
  674. package/src/components/compositions/elements/display/BannerDisplay.stories.ts +3 -1
  675. package/src/components/compositions/elements/display/BarcodeDisplay.stories.ts +3 -1
  676. package/src/components/compositions/elements/display/CarouselDisplay.stories.ts +3 -1
  677. package/src/components/compositions/elements/display/ChartDisplay.stories.ts +3 -1
  678. package/src/components/compositions/elements/display/HtmlDisplay.stories.ts +3 -1
  679. package/src/components/compositions/elements/display/IconDisplay.stories.ts +3 -1
  680. package/src/components/compositions/elements/display/IframeDisplay.stories.ts +3 -1
  681. package/src/components/compositions/elements/display/ImageDisplay.stories.ts +3 -1
  682. package/src/components/compositions/elements/display/MarkdownDisplay.stories.ts +3 -1
  683. package/src/components/compositions/elements/display/ProgressBarDisplay.stories.ts +3 -1
  684. package/src/components/compositions/elements/display/QrCodeDisplay.stories.ts +3 -1
  685. package/src/components/compositions/elements/display/ReactiveCanvasDisplay.stories.ts +3 -1
  686. package/src/components/compositions/elements/display/SpriteDisplay.stories.ts +3 -1
  687. package/src/components/compositions/elements/display/TypeDisplay.stories.ts +3 -1
  688. package/src/components/compositions/elements/display/VideoPlayerDisplay.stories.ts +3 -1
  689. package/src/components/compositions/elements/editor/CodeEditor.stories.ts +88 -12
  690. package/src/components/compositions/elements/editor/CodeEditor.test.ts +72 -41
  691. package/src/components/compositions/elements/editor/CodeEditor.vue +306 -38
  692. package/src/components/compositions/elements/editor/HtmlEditor.stories.ts +73 -6
  693. package/src/components/compositions/elements/editor/HtmlEditor.test.ts +59 -50
  694. package/src/components/compositions/elements/editor/HtmlEditor.vue +942 -41
  695. package/src/components/compositions/elements/editor/ImageEditor.stories.ts +3 -1
  696. package/src/components/compositions/elements/editor/MarkdownEditor.stories.ts +3 -1
  697. package/src/components/compositions/elements/editor/RichTextEditor.stories.ts +3 -1
  698. package/src/components/compositions/elements/file/AssetPickerFile.stories.ts +3 -1
  699. package/src/components/compositions/elements/file/DropzoneFile.stories.ts +3 -1
  700. package/src/components/compositions/elements/file/UploadFile.stories.ts +3 -1
  701. package/src/components/compositions/elements/input/BarcodeScannerInput.stories.ts +3 -1
  702. package/src/components/compositions/elements/input/EmailInput.stories.ts +3 -1
  703. package/src/components/compositions/elements/input/NumberInput.stories.ts +3 -1
  704. package/src/components/compositions/elements/input/PasswordInput.stories.ts +3 -1
  705. package/src/components/compositions/elements/input/RangeSliderInput.stories.ts +3 -1
  706. package/src/components/compositions/elements/input/SearchInput.stories.ts +3 -1
  707. package/src/components/compositions/elements/input/TelInput.stories.ts +3 -1
  708. package/src/components/compositions/elements/input/TextInput.stories.ts +3 -1
  709. package/src/components/compositions/elements/input/TextareaInput.stories.ts +3 -1
  710. package/src/components/compositions/elements/input/UrlInput.stories.ts +3 -1
  711. package/src/components/compositions/elements/option-select/AsyncSelectOption.stories.ts +3 -1
  712. package/src/components/compositions/elements/option-select/AutoCompleteOption.stories.ts +3 -1
  713. package/src/components/compositions/elements/option-select/CheckboxOption.stories.ts +3 -1
  714. package/src/components/compositions/elements/option-select/IntegrationConnectorOption.stories.ts +3 -1
  715. package/src/components/compositions/elements/option-select/ListOption.stories.ts +3 -1
  716. package/src/components/compositions/elements/option-select/PillSelectOption.stories.ts +3 -1
  717. package/src/components/compositions/elements/option-select/RadioOption.stories.ts +3 -1
  718. package/src/components/compositions/elements/option-select/SelectMultipleOption.stories.ts +3 -1
  719. package/src/components/compositions/elements/option-select/SelectOption.stories.ts +3 -1
  720. package/src/components/compositions/elements/picker/AsyncSelectPicker.stories.ts +3 -1
  721. package/src/components/compositions/elements/picker/ColorPicker.stories.ts +3 -1
  722. package/src/components/compositions/elements/picker/DataModelPicker.stories.ts +3 -1
  723. package/src/components/compositions/elements/picker/DatePicker.stories.ts +3 -1
  724. package/src/components/compositions/elements/picker/DateTimePicker.stories.ts +3 -1
  725. package/src/components/compositions/elements/picker/IconPicker.stories.ts +3 -1
  726. package/src/components/compositions/elements/{components → picker}/IconPickerInline.stories.ts +3 -1
  727. package/src/components/compositions/elements/{components → picker}/IconPickerInline.test.ts +8 -8
  728. package/src/components/compositions/elements/{components → picker}/IconPickerInline.vue +4 -4
  729. package/src/components/compositions/elements/picker/IntegrationConnectorPicker.stories.ts +3 -1
  730. package/src/components/compositions/elements/picker/MapPicker.stories.ts +3 -1
  731. package/src/components/compositions/elements/picker/TimePicker.stories.ts +3 -1
  732. package/src/components/compositions/elements/picker/TimezonePicker.stories.ts +3 -1
  733. package/src/components/ui/accordion/Accordion.stories.ts +2 -0
  734. package/src/components/ui/alert/Alert.stories.ts +2 -0
  735. package/src/components/ui/avatar/Avatar.stories.ts +2 -0
  736. package/src/components/ui/badge/Badge.stories.ts +2 -0
  737. package/src/components/ui/button/Button.stories.ts +5 -0
  738. package/src/components/ui/calendar/Calendar.stories.ts +2 -0
  739. package/src/components/ui/card/Card.stories.ts +2 -0
  740. package/src/components/ui/checkbox/Checkbox.stories.ts +2 -0
  741. package/src/components/ui/combobox/Combobox.stories.ts +2 -0
  742. package/src/components/ui/command/Command.stories.ts +2 -0
  743. package/src/components/ui/dialog/Dialog.stories.ts +2 -0
  744. package/src/components/ui/dropdown-menu/DropdownMenu.stories.ts +2 -0
  745. package/src/components/ui/field-frame/FieldFrame.stories.ts +1 -1
  746. package/src/components/ui/index.ts +3 -3
  747. package/src/components/ui/input/Input.stories.ts +2 -0
  748. package/src/components/ui/label/Label.stories.ts +2 -0
  749. package/src/components/ui/popover/Popover.stories.ts +2 -0
  750. package/src/components/ui/progress/Progress.stories.ts +2 -0
  751. package/src/components/ui/radio-group/RadioGroup.stories.ts +2 -0
  752. package/src/components/ui/select/Select.stories.ts +2 -0
  753. package/src/components/ui/separator/Separator.stories.ts +2 -0
  754. package/src/components/ui/sheet/Sheet.stories.ts +2 -0
  755. package/src/components/ui/skeleton/Skeleton.stories.ts +2 -0
  756. package/src/components/ui/slider/Slider.stories.ts +2 -0
  757. package/src/components/ui/switch/Switch.stories.ts +2 -0
  758. package/src/components/ui/table/Table.stories.ts +2 -0
  759. package/src/components/ui/tabs/Tabs.stories.ts +2 -0
  760. package/src/components/ui/textarea/Textarea.stories.ts +2 -0
  761. package/src/components/ui/toast/Toaster.stories.ts +2 -0
  762. package/src/components/ui/toast/index.ts +1 -1
  763. package/src/components/ui/toggle/Toggle.stories.ts +2 -0
  764. package/src/components/ui/tooltip/Tooltip.stories.ts +2 -0
  765. package/src/configuration-block.ts +4 -0
  766. package/src/definitions/__tests__/schema.test.ts +0 -1
  767. package/src/definitions/elements/PickerElement.ts +2 -0
  768. package/src/definitions/elements/index.ts +0 -18
  769. package/src/definitions/index.ts +1 -1
  770. package/src/definitions/shared/base.ts +0 -1
  771. package/src/display.ts +15 -0
  772. package/src/editor.ts +5 -0
  773. package/src/engine/registry.ts +1 -7
  774. package/src/engine/useFormData.ts +1 -1
  775. package/src/file.ts +3 -0
  776. package/src/index.ts +3 -3
  777. package/src/input.ts +10 -0
  778. package/src/lib/storybook.ts +67 -0
  779. package/src/option-select.ts +9 -0
  780. package/src/pages/IndexPage.stories.ts +2 -1
  781. package/src/pages/ShowPage.stories.ts +2 -1
  782. package/src/pages/ShowPage.vue +1 -1
  783. package/src/picker.ts +11 -0
  784. package/src/stores/dependencyListBuilderStore.ts +1 -1
  785. package/src/stores/elementListBuilderStore.ts +1 -1
  786. package/src/stores/formBuilderStore.ts +1 -1
  787. package/src/stores/formDataStore.ts +1 -1
  788. package/src/stores/gridBuilderStore.ts +1 -1
  789. package/src/stores/objectBuilderStore.ts +1 -1
  790. package/src/stores/presetBuilderStore.ts +1 -1
  791. package/src/stores/quizBuilderStore.ts +1 -1
  792. package/src/stores/reactiveCanvasBuilderStore.ts +1 -1
  793. package/src/styles/themes/dark.css +1 -1
  794. package/src/styles/themes/default.css +1 -1
  795. package/src/styles/themes/kiosk.css +1 -1
  796. package/dist/components/compositions/elements/components/IconBadge.vue.js +0 -5
  797. package/dist/components/compositions/elements/components/IconBadge.vue.js.map +0 -1
  798. package/dist/components/compositions/elements/components/IconBadge.vue2.js +0 -77
  799. package/dist/components/compositions/elements/components/IconBadge.vue2.js.map +0 -1
  800. package/dist/components/compositions/elements/components/IconPickerInline.vue.js +0 -5
  801. package/dist/components/compositions/elements/components/IconPickerInline.vue.js.map +0 -1
  802. package/dist/components/compositions/elements/components/IconPickerInline.vue2.js.map +0 -1
  803. package/dist/definitions/elements/ComponentsElement.d.ts +0 -187
  804. package/dist/definitions/elements/ComponentsElement.d.ts.map +0 -1
  805. package/dist/definitions/elements/ComponentsElement.js +0 -111
  806. package/dist/definitions/elements/ComponentsElement.js.map +0 -1
  807. package/dist/styles/index.css +0 -1
  808. package/src/components/compositions/elements/components/IconBadge.stories.ts +0 -96
  809. package/src/components/compositions/elements/components/IconBadge.test.ts +0 -70
  810. package/src/components/compositions/elements/components/IconBadge.vue +0 -121
  811. package/src/definitions/elements/ComponentsElement.ts +0 -149
@@ -1,14 +1,72 @@
1
1
  <script setup lang="ts">
2
- /**
3
- * Props-driven HTML editor composition. Split view: editable HTML source
4
- * on the left, sandboxed iframe preview on the right. The iframe uses an
5
- * empty `sandbox` to neuter scripts so the preview is safe even for
6
- * adversarial input.
7
- *
8
- * <HtmlEditor v-model="body" label="HTML body" />
9
- */
10
- import { computed } from "vue"
2
+ import { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from "vue"
3
+ import { EditorContent, Extension, Node, useEditor } from "@tiptap/vue-3"
4
+ import StarterKit from "@tiptap/starter-kit"
5
+ import Underline from "@tiptap/extension-underline"
6
+ import TextAlign from "@tiptap/extension-text-align"
7
+ import { BackgroundColor, Color, FontFamily, TextStyle } from "@tiptap/extension-text-style"
8
+ import Link from "@tiptap/extension-link"
9
+ import Image from "@tiptap/extension-image"
10
+ import { Table, TableRow, TableCell, TableHeader } from "@tiptap/extension-table"
11
+ import {
12
+ AlignCenter,
13
+ AlignLeft,
14
+ AlignRight,
15
+ ArrowDown,
16
+ ArrowLeft,
17
+ ArrowRight,
18
+ ArrowUp,
19
+ Bold,
20
+ Code,
21
+ Combine,
22
+ Heading,
23
+ Heading1,
24
+ Heading2,
25
+ Heading3,
26
+ Heading4,
27
+ Heading5,
28
+ Heading6,
29
+ Highlighter,
30
+ ImageIcon,
31
+ Italic,
32
+ Link2,
33
+ List,
34
+ ListOrdered,
35
+ Minus,
36
+ Palette,
37
+ Quote,
38
+ Redo,
39
+ Scissors,
40
+ Strikethrough,
41
+ Table2,
42
+ Trash2,
43
+ Type,
44
+ Underline as UnderlineIcon,
45
+ Undo,
46
+ X,
47
+ } from "lucide-vue-next"
48
+ import {
49
+ DropdownMenu,
50
+ DropdownMenuContent,
51
+ DropdownMenuItem,
52
+ DropdownMenuLabel,
53
+ DropdownMenuSeparator,
54
+ DropdownMenuTrigger,
55
+ } from "@/components/ui/dropdown-menu"
56
+ import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"
57
+ import {
58
+ Dialog,
59
+ DialogContent,
60
+ DialogFooter,
61
+ DialogHeader,
62
+ DialogTitle,
63
+ } from "@/components/ui/dialog"
64
+ import { Button } from "@/components/ui/button"
65
+ import { Input } from "@/components/ui/input"
66
+ import { Label } from "@/components/ui/label"
67
+ import { Checkbox } from "@/components/ui/checkbox"
11
68
  import { FieldFrame } from "@/components/ui/field-frame"
69
+ import { cn } from "@/lib/utils"
12
70
 
13
71
  export interface HtmlEditorProps {
14
72
  modelValue?: string | null
@@ -22,25 +80,402 @@ export interface HtmlEditorProps {
22
80
  disabled?: boolean
23
81
  helpText?: string
24
82
  errors?: string[]
25
- rows?: number
83
+ minHeight?: string
26
84
  }
27
85
 
28
- withDefaults(defineProps<HtmlEditorProps>(), {
86
+ const props = withDefaults(defineProps<HtmlEditorProps>(), {
29
87
  errors: () => [],
30
- rows: 12,
88
+ minHeight: "14rem",
31
89
  })
32
90
 
33
- const model = defineModel<string | null>("modelValue")
91
+ const emit = defineEmits<{
92
+ (e: "update:modelValue", value: string): void
93
+ }>()
34
94
 
35
- const source = computed<string>(() => model.value ?? "")
95
+ // ---------------------------------------------------------------------------
96
+ // Custom node: preserve <video> tags
97
+ // ---------------------------------------------------------------------------
36
98
 
37
- const previewSrcDoc = computed<string>(
38
- () => `<!doctype html><html><body>${source.value}</body></html>`,
99
+ const VideoNode = Node.create({
100
+ name: "video",
101
+ group: "block",
102
+ content: "block*",
103
+ addAttributes() {
104
+ return {
105
+ src: { default: null },
106
+ width: { default: "320" },
107
+ height: { default: "240" },
108
+ controls: {
109
+ default: true,
110
+ parseHTML: (el: HTMLElement) => el.hasAttribute("controls"),
111
+ renderHTML: (a: Record<string, unknown>) => (a.controls ? { controls: "" } : {}),
112
+ },
113
+ }
114
+ },
115
+ parseHTML() {
116
+ return [{ tag: "video" }]
117
+ },
118
+ renderHTML({ HTMLAttributes }: { HTMLAttributes: Record<string, unknown> }) {
119
+ return ["video", HTMLAttributes, 0]
120
+ },
121
+ })
122
+
123
+ // Extended Image to pass through style attribute
124
+ const ExtendedImage = Image.extend({
125
+ addAttributes() {
126
+ return {
127
+ src: { default: "" },
128
+ alt: { default: undefined },
129
+ title: { default: undefined },
130
+ style: { default: undefined },
131
+ }
132
+ },
133
+ })
134
+
135
+ // ---------------------------------------------------------------------------
136
+ // Font families
137
+ // ---------------------------------------------------------------------------
138
+
139
+ const FONTS: { label: string; value: string }[] = [
140
+ { label: "Arial", value: "Arial, sans-serif" },
141
+ { label: "Verdana", value: "Verdana, sans-serif" },
142
+ { label: "Tahoma", value: "Tahoma, sans-serif" },
143
+ { label: "Times New Roman", value: "'Times New Roman', serif" },
144
+ { label: "Georgia", value: "Georgia, serif" },
145
+ { label: "Courier New", value: "'Courier New', monospace" },
146
+ ]
147
+
148
+ // ---------------------------------------------------------------------------
149
+ // Editor
150
+ // ---------------------------------------------------------------------------
151
+
152
+ const isInert = computed(() => Boolean(props.disabled || props.readonly))
153
+
154
+ const editor = useEditor({
155
+ content: props.modelValue ?? "",
156
+ editable: !isInert.value,
157
+ extensions: [
158
+ StarterKit,
159
+ Underline,
160
+ TextAlign.configure({ types: ["heading", "paragraph"] }),
161
+ TextStyle,
162
+ Color,
163
+ BackgroundColor,
164
+ FontFamily.configure({ types: ["textStyle"] }),
165
+ Link.configure({ openOnClick: false }),
166
+ ExtendedImage.configure({ inline: false, allowBase64: true }),
167
+ Table.configure({ resizable: true }),
168
+ TableRow,
169
+ TableHeader,
170
+ TableCell,
171
+ VideoNode,
172
+ // Suppress unused Extension import warning — it's used by BackgroundColor above
173
+ Extension.create({ name: "_noop" }),
174
+ ].filter((e) => e.name !== "_noop"),
175
+ editorProps: {
176
+ attributes: { class: "focus:outline-none" },
177
+ },
178
+ onUpdate: () => {
179
+ if (editor.value) emit("update:modelValue", editor.value.getHTML())
180
+ },
181
+ onSelectionUpdate: () => {
182
+ syncFormattingState()
183
+ },
184
+ })
185
+
186
+ watch(
187
+ () => props.modelValue,
188
+ (value) => {
189
+ const e = editor.value
190
+ if (!e) return
191
+ const next = value ?? ""
192
+ if (next === e.getHTML()) return
193
+ e.commands.setContent(next, { emitUpdate: false })
194
+ },
39
195
  )
40
196
 
41
- function onInput(event: Event): void {
42
- const target = event.target as HTMLTextAreaElement | null
43
- model.value = target?.value ?? ""
197
+ watch(isInert, (v) => {
198
+ editor.value?.setEditable(!v)
199
+ })
200
+
201
+ onBeforeUnmount(() => {
202
+ editor.value?.destroy()
203
+ })
204
+
205
+ onMounted(() => {
206
+ nextTick(() => {
207
+ const e = editor.value
208
+ if (e && props.modelValue && e.isEmpty) {
209
+ e.commands.setContent(props.modelValue, { emitUpdate: false })
210
+ }
211
+ })
212
+ })
213
+
214
+ // ---------------------------------------------------------------------------
215
+ // Formatting state tracking
216
+ // ---------------------------------------------------------------------------
217
+
218
+ const currentHeading = ref<number | null>(null)
219
+ const currentAlign = ref<"left" | "center" | "right">("left")
220
+ const currentFont = ref<string | null>(null)
221
+ const currentTextColor = ref<string>("")
222
+ const currentBgColor = ref<string>("")
223
+
224
+ function syncFormattingState(): void {
225
+ const e = editor.value
226
+ if (!e) return
227
+
228
+ currentHeading.value = null
229
+ for (let i = 1; i <= 6; i++) {
230
+ if (e.isActive("heading", { level: i })) {
231
+ currentHeading.value = i
232
+ break
233
+ }
234
+ }
235
+
236
+ if (e.isActive({ textAlign: "center" })) currentAlign.value = "center"
237
+ else if (e.isActive({ textAlign: "right" })) currentAlign.value = "right"
238
+ else currentAlign.value = "left"
239
+
240
+ currentFont.value = FONTS.find((f) => e.isActive("textStyle", { fontFamily: f.value }))?.value ?? null
241
+
242
+ const attrs = e.getAttributes("textStyle") as Record<string, unknown>
243
+ currentTextColor.value = typeof attrs.color === "string" ? attrs.color : ""
244
+ currentBgColor.value = typeof attrs.backgroundColor === "string" ? attrs.backgroundColor : ""
245
+ }
246
+
247
+ // ---------------------------------------------------------------------------
248
+ // Toolbar helpers
249
+ // ---------------------------------------------------------------------------
250
+
251
+ function isActive(name: string, attrs?: Record<string, unknown>): boolean {
252
+ const e = editor.value
253
+ if (!e) return false
254
+ return attrs ? e.isActive(name, attrs) : e.isActive(name)
255
+ }
256
+
257
+ function setHeading(level: 1 | 2 | 3 | 4 | 5 | 6): void {
258
+ editor.value?.chain().focus().setHeading({ level }).run()
259
+ currentHeading.value = level
260
+ }
261
+
262
+ function clearHeading(): void {
263
+ editor.value?.chain().focus().setParagraph().run()
264
+ currentHeading.value = null
265
+ }
266
+
267
+ const headingIcon = computed(() => {
268
+ switch (currentHeading.value) {
269
+ case 1: return Heading1
270
+ case 2: return Heading2
271
+ case 3: return Heading3
272
+ case 4: return Heading4
273
+ case 5: return Heading5
274
+ case 6: return Heading6
275
+ default: return Heading
276
+ }
277
+ })
278
+
279
+ const alignIcon = computed(() => {
280
+ if (currentAlign.value === "center") return AlignCenter
281
+ if (currentAlign.value === "right") return AlignRight
282
+ return AlignLeft
283
+ })
284
+
285
+ function setAlign(align: "left" | "center" | "right"): void {
286
+ editor.value?.chain().focus().setTextAlign(align).run()
287
+ currentAlign.value = align
288
+ }
289
+
290
+ function setFont(value: string): void {
291
+ editor.value?.chain().focus().unsetFontFamily().setFontFamily(value).run()
292
+ currentFont.value = value
293
+ }
294
+
295
+ function clearFont(): void {
296
+ editor.value?.chain().focus().unsetFontFamily().run()
297
+ currentFont.value = null
298
+ }
299
+
300
+ // Color commands are added by BackgroundColor/Color extensions — cast via unknown
301
+ function applyTextColor(color: string): void {
302
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
303
+ ;(editor.value?.chain().focus() as any)?.unsetColor()?.setColor(color)?.run()
304
+ currentTextColor.value = color
305
+ }
306
+
307
+ function clearTextColor(): void {
308
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
309
+ ;(editor.value?.chain().focus() as any)?.unsetColor()?.run()
310
+ currentTextColor.value = ""
311
+ }
312
+
313
+ function applyBgColor(color: string): void {
314
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
315
+ ;(editor.value?.chain().focus() as any)?.unsetBackgroundColor()?.setBackgroundColor(color)?.run()
316
+ currentBgColor.value = color
317
+ }
318
+
319
+ function clearBgColor(): void {
320
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
321
+ ;(editor.value?.chain().focus() as any)?.unsetBackgroundColor()?.run()
322
+ currentBgColor.value = ""
323
+ }
324
+
325
+ function toggleList(type: "bullet" | "ordered"): void {
326
+ if (type === "bullet") editor.value?.chain().focus().toggleBulletList().run()
327
+ else editor.value?.chain().focus().toggleOrderedList().run()
328
+ }
329
+
330
+ // ---------------------------------------------------------------------------
331
+ // Table
332
+ // ---------------------------------------------------------------------------
333
+
334
+ const tableHoverRows = ref(2)
335
+ const tableHoverCols = ref(2)
336
+
337
+ /** Flat list for the 4×6 table creation grid */
338
+ const tableGridCells = computed(() => {
339
+ const cells: { r: number; c: number }[] = []
340
+ for (let r = 1; r <= 4; r++) {
341
+ for (let c = 1; c <= 6; c++) {
342
+ cells.push({ r, c })
343
+ }
344
+ }
345
+ return cells
346
+ })
347
+
348
+ function insertTable(): void {
349
+ editor.value
350
+ ?.chain()
351
+ .focus()
352
+ .insertTable({ rows: tableHoverRows.value, cols: tableHoverCols.value, withHeaderRow: true })
353
+ .run()
354
+ }
355
+
356
+ // ---------------------------------------------------------------------------
357
+ // Link dialog
358
+ // ---------------------------------------------------------------------------
359
+
360
+ const linkDialogOpen = ref(false)
361
+ const linkUrl = ref("")
362
+ const linkText = ref("")
363
+ const linkTargetBlank = ref(true)
364
+ const isEditingLink = ref(false)
365
+
366
+ function openLinkDialog(): void {
367
+ const e = editor.value
368
+ if (!e) return
369
+ isEditingLink.value = e.isActive("link")
370
+ if (isEditingLink.value) {
371
+ e.chain().focus().extendMarkRange("link").run()
372
+ const attrs = e.getAttributes("link") as Record<string, unknown>
373
+ linkUrl.value = typeof attrs.href === "string" ? attrs.href : ""
374
+ linkTargetBlank.value = attrs.target === "_blank"
375
+ const { from, to } = e.state.selection
376
+ linkText.value = e.state.doc.textBetween(from, to, " ")
377
+ } else {
378
+ const { from, to } = e.state.selection
379
+ linkText.value = e.state.doc.textBetween(from, to, " ")
380
+ linkUrl.value = "https://"
381
+ linkTargetBlank.value = true
382
+ }
383
+ if (!linkText.value) linkText.value = "Link"
384
+ linkDialogOpen.value = true
385
+ }
386
+
387
+ function applyLink(): void {
388
+ const e = editor.value
389
+ if (!e || !linkUrl.value) return
390
+ if (e.isActive("link")) e.chain().focus().unsetLink().run()
391
+ const target = linkTargetBlank.value ? "_blank" : "_self"
392
+ const { from, to } = e.state.selection
393
+ if (from === to) {
394
+ e.chain().focus().insertContent(`<a href="${linkUrl.value}" target="${target}">${linkText.value}</a>`).run()
395
+ } else {
396
+ e.chain().focus().extendMarkRange("link").setLink({ href: linkUrl.value, target }).run()
397
+ }
398
+ linkDialogOpen.value = false
399
+ }
400
+
401
+ function removeLink(): void {
402
+ editor.value?.chain().focus().extendMarkRange("link").unsetLink().run()
403
+ linkDialogOpen.value = false
404
+ }
405
+
406
+ // ---------------------------------------------------------------------------
407
+ // Image dialog
408
+ // ---------------------------------------------------------------------------
409
+
410
+ const imageDialogOpen = ref(false)
411
+ const imageUrl = ref("")
412
+ const imageAlt = ref("")
413
+ const imageStyle = ref("")
414
+ const isEditingImage = ref(false)
415
+
416
+ function openImageDialog(): void {
417
+ const e = editor.value
418
+ if (!e) return
419
+ isEditingImage.value = e.isActive("image")
420
+ if (isEditingImage.value) {
421
+ const attrs = e.getAttributes("image") as Record<string, unknown>
422
+ imageUrl.value = typeof attrs.src === "string" ? attrs.src : ""
423
+ imageAlt.value = typeof attrs.alt === "string" ? attrs.alt : ""
424
+ imageStyle.value = typeof attrs.style === "string" ? attrs.style : ""
425
+ } else {
426
+ imageUrl.value = ""
427
+ imageAlt.value = ""
428
+ imageStyle.value = "width: auto; height: auto; max-width: 100%;"
429
+ }
430
+ imageDialogOpen.value = true
431
+ }
432
+
433
+ function applyImage(): void {
434
+ const e = editor.value
435
+ if (!e || !imageUrl.value) return
436
+ const attrs = {
437
+ src: imageUrl.value,
438
+ alt: imageAlt.value || undefined,
439
+ style: imageStyle.value || undefined,
440
+ }
441
+ if (isEditingImage.value) {
442
+ e.chain().focus().updateAttributes("image", attrs).run()
443
+ } else {
444
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
445
+ ;(e.chain().focus() as any).setImage(attrs).run()
446
+ }
447
+ imageDialogOpen.value = false
448
+ }
449
+
450
+ // ---------------------------------------------------------------------------
451
+ // HTML source dialog
452
+ // ---------------------------------------------------------------------------
453
+
454
+ const sourceDialogOpen = ref(false)
455
+ const sourceHtml = ref("")
456
+
457
+ function openSourceDialog(): void {
458
+ if (!editor.value) return
459
+ sourceHtml.value = editor.value.getHTML()
460
+ sourceDialogOpen.value = true
461
+ }
462
+
463
+ function applySource(): void {
464
+ if (!editor.value) return
465
+ editor.value.commands.setContent(sourceHtml.value)
466
+ emit("update:modelValue", sourceHtml.value)
467
+ sourceDialogOpen.value = false
468
+ }
469
+
470
+ // ---------------------------------------------------------------------------
471
+ // Misc
472
+ // ---------------------------------------------------------------------------
473
+
474
+ const hasErrors = computed(() => props.errors.length > 0)
475
+ const contentStyle = computed(() => ({ minHeight: props.minHeight }))
476
+
477
+ function btnClass(active: boolean): string {
478
+ return cn("h-7 w-7 p-0 shrink-0", active ? "bg-muted text-foreground" : "text-muted-foreground")
44
479
  }
45
480
  </script>
46
481
 
@@ -54,29 +489,495 @@ function onInput(event: Event): void {
54
489
  :errors="errors"
55
490
  data-testid="html-editor"
56
491
  >
57
- <div class="grid grid-cols-1 gap-3 lg:grid-cols-2">
58
- <textarea
59
- :id="id"
60
- :name="name ?? undefined"
61
- :placeholder="placeholder ?? '<!-- type HTML here -->'"
62
- :readonly="readonly"
63
- :disabled="disabled"
64
- :required="required"
65
- :rows="rows"
66
- :value="source"
67
- :data-element-name="name ?? undefined"
68
- data-testid="html-editor-source"
69
- class="font-mono text-sm rounded-md border border-input bg-background px-3 py-2 shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50"
70
- :class="errors.length ? 'border-destructive ring-destructive' : ''"
71
- @input="onInput"
72
- />
73
- <iframe
74
- :srcdoc="previewSrcDoc"
75
- sandbox=""
76
- data-testid="html-editor-preview"
77
- class="min-h-[12rem] rounded-md border bg-background"
78
- title="HTML preview"
492
+ <div
493
+ :class="cn(
494
+ 'rounded-md border border-input bg-background shadow-sm overflow-hidden',
495
+ hasErrors ? 'border-destructive ring-1 ring-destructive' : '',
496
+ isInert ? 'opacity-60' : '',
497
+ )"
498
+ :data-element-name="name ?? undefined"
499
+ >
500
+ <!-- ----------------------------------------------------------------- -->
501
+ <!-- Toolbar -->
502
+ <!-- ----------------------------------------------------------------- -->
503
+ <div
504
+ class="flex flex-col border-b bg-muted/30"
505
+ :class="isInert ? 'pointer-events-none' : ''"
506
+ role="toolbar"
507
+ aria-label="HTML formatting"
508
+ data-testid="html-editor-toolbar"
509
+ >
510
+ <!-- Row 1: headings · inline formatting · blockquote/hr · undo/redo · source -->
511
+ <div class="flex flex-wrap items-center gap-0.5 border-b border-border/40 px-1.5 py-1">
512
+ <!-- Heading -->
513
+ <DropdownMenu>
514
+ <DropdownMenuTrigger as-child>
515
+ <Button type="button" variant="ghost" :class="btnClass(currentHeading !== null)" title="Heading">
516
+ <component :is="headingIcon" class="h-4 w-4" />
517
+ </Button>
518
+ </DropdownMenuTrigger>
519
+ <DropdownMenuContent align="start" class="w-44">
520
+ <DropdownMenuLabel class="text-xs uppercase text-muted-foreground">Heading</DropdownMenuLabel>
521
+ <DropdownMenuSeparator />
522
+ <DropdownMenuItem :class="currentHeading === 1 ? 'bg-muted' : ''" @click="setHeading(1)">
523
+ <Heading1 class="mr-2 h-4 w-4" />Heading 1
524
+ </DropdownMenuItem>
525
+ <DropdownMenuItem :class="currentHeading === 2 ? 'bg-muted' : ''" @click="setHeading(2)">
526
+ <Heading2 class="mr-2 h-4 w-4" />Heading 2
527
+ </DropdownMenuItem>
528
+ <DropdownMenuItem :class="currentHeading === 3 ? 'bg-muted' : ''" @click="setHeading(3)">
529
+ <Heading3 class="mr-2 h-4 w-4" />Heading 3
530
+ </DropdownMenuItem>
531
+ <DropdownMenuItem :class="currentHeading === 4 ? 'bg-muted' : ''" @click="setHeading(4)">
532
+ <Heading4 class="mr-2 h-4 w-4" />Heading 4
533
+ </DropdownMenuItem>
534
+ <DropdownMenuItem :class="currentHeading === 5 ? 'bg-muted' : ''" @click="setHeading(5)">
535
+ <Heading5 class="mr-2 h-4 w-4" />Heading 5
536
+ </DropdownMenuItem>
537
+ <DropdownMenuItem :class="currentHeading === 6 ? 'bg-muted' : ''" @click="setHeading(6)">
538
+ <Heading6 class="mr-2 h-4 w-4" />Heading 6
539
+ </DropdownMenuItem>
540
+ <DropdownMenuSeparator />
541
+ <DropdownMenuItem @click="clearHeading">
542
+ <X class="mr-2 h-4 w-4" />Clear heading
543
+ </DropdownMenuItem>
544
+ </DropdownMenuContent>
545
+ </DropdownMenu>
546
+
547
+ <div class="mx-0.5 h-5 w-px bg-border/60 shrink-0" />
548
+
549
+ <Button type="button" variant="ghost" :class="btnClass(isActive('bold'))" title="Bold"
550
+ @click="editor?.chain().focus().toggleBold().run()"><Bold class="h-4 w-4" /></Button>
551
+ <Button type="button" variant="ghost" :class="btnClass(isActive('italic'))" title="Italic"
552
+ @click="editor?.chain().focus().toggleItalic().run()"><Italic class="h-4 w-4" /></Button>
553
+ <Button type="button" variant="ghost" :class="btnClass(isActive('underline'))" title="Underline"
554
+ @click="editor?.chain().focus().toggleUnderline().run()"><UnderlineIcon class="h-4 w-4" /></Button>
555
+ <Button type="button" variant="ghost" :class="btnClass(isActive('strike'))" title="Strikethrough"
556
+ @click="editor?.chain().focus().toggleStrike().run()"><Strikethrough class="h-4 w-4" /></Button>
557
+
558
+ <div class="mx-0.5 h-5 w-px bg-border/60 shrink-0" />
559
+
560
+ <Button type="button" variant="ghost" :class="btnClass(isActive('blockquote'))" title="Blockquote"
561
+ @click="editor?.chain().focus().toggleBlockquote().run()"><Quote class="h-4 w-4" /></Button>
562
+ <Button type="button" variant="ghost" :class="btnClass(false)" title="Horizontal rule"
563
+ @click="editor?.chain().focus().setHorizontalRule().run()"><Minus class="h-4 w-4" /></Button>
564
+
565
+ <div class="flex-1" />
566
+
567
+ <Button type="button" variant="ghost" :class="btnClass(false)" title="Undo"
568
+ :disabled="!editor?.can().chain().focus().undo().run()"
569
+ @click="editor?.chain().focus().undo().run()"><Undo class="h-4 w-4" /></Button>
570
+ <Button type="button" variant="ghost" :class="btnClass(false)" title="Redo"
571
+ :disabled="!editor?.can().chain().focus().redo().run()"
572
+ @click="editor?.chain().focus().redo().run()"><Redo class="h-4 w-4" /></Button>
573
+
574
+ <div class="mx-0.5 h-5 w-px bg-border/60 shrink-0" />
575
+
576
+ <Button type="button" variant="ghost" :class="btnClass(false)" title="Edit HTML source"
577
+ @click="openSourceDialog"><Code class="h-4 w-4" /></Button>
578
+ </div>
579
+
580
+ <!-- Row 2: align · font · colors · link/image · lists · table -->
581
+ <div class="flex flex-wrap items-center gap-0.5 px-1.5 py-1">
582
+ <!-- Align -->
583
+ <DropdownMenu>
584
+ <DropdownMenuTrigger as-child>
585
+ <Button type="button" variant="ghost" :class="btnClass(currentAlign !== 'left')" title="Text alignment">
586
+ <component :is="alignIcon" class="h-4 w-4" />
587
+ </Button>
588
+ </DropdownMenuTrigger>
589
+ <DropdownMenuContent align="start" class="w-36">
590
+ <DropdownMenuItem :class="currentAlign === 'left' ? 'bg-muted' : ''" @click="setAlign('left')">
591
+ <AlignLeft class="mr-2 h-4 w-4" />Left
592
+ </DropdownMenuItem>
593
+ <DropdownMenuItem :class="currentAlign === 'center' ? 'bg-muted' : ''" @click="setAlign('center')">
594
+ <AlignCenter class="mr-2 h-4 w-4" />Center
595
+ </DropdownMenuItem>
596
+ <DropdownMenuItem :class="currentAlign === 'right' ? 'bg-muted' : ''" @click="setAlign('right')">
597
+ <AlignRight class="mr-2 h-4 w-4" />Right
598
+ </DropdownMenuItem>
599
+ </DropdownMenuContent>
600
+ </DropdownMenu>
601
+
602
+ <div class="mx-0.5 h-5 w-px bg-border/60 shrink-0" />
603
+
604
+ <!-- Font family -->
605
+ <DropdownMenu>
606
+ <DropdownMenuTrigger as-child>
607
+ <Button type="button" variant="ghost" :class="btnClass(currentFont !== null)" title="Font family">
608
+ <Type class="h-4 w-4" />
609
+ </Button>
610
+ </DropdownMenuTrigger>
611
+ <DropdownMenuContent align="start" class="w-52">
612
+ <DropdownMenuLabel class="text-xs uppercase text-muted-foreground">Font family</DropdownMenuLabel>
613
+ <DropdownMenuSeparator />
614
+ <DropdownMenuItem
615
+ v-for="font in FONTS"
616
+ :key="font.value"
617
+ :class="currentFont === font.value ? 'bg-muted' : ''"
618
+ :style="`font-family: ${font.value}`"
619
+ @click="setFont(font.value)"
620
+ >
621
+ {{ font.label }}
622
+ </DropdownMenuItem>
623
+ <DropdownMenuSeparator />
624
+ <DropdownMenuItem @click="clearFont">
625
+ <X class="mr-2 h-4 w-4" />Use default
626
+ </DropdownMenuItem>
627
+ </DropdownMenuContent>
628
+ </DropdownMenu>
629
+
630
+ <!-- Text color -->
631
+ <Popover>
632
+ <PopoverTrigger as-child>
633
+ <Button type="button" variant="ghost" :class="btnClass(!!currentTextColor)" title="Text color">
634
+ <Palette class="h-4 w-4" :style="currentTextColor ? { color: currentTextColor } : {}" />
635
+ </Button>
636
+ </PopoverTrigger>
637
+ <PopoverContent class="w-52 p-3" align="start">
638
+ <p class="mb-2 text-xs font-medium text-muted-foreground">Text color</p>
639
+ <div class="flex items-center gap-2">
640
+ <input
641
+ type="color"
642
+ :value="currentTextColor || '#000000'"
643
+ class="h-8 w-8 cursor-pointer rounded border border-input p-0.5"
644
+ @input="applyTextColor(($event.target as HTMLInputElement).value)"
645
+ />
646
+ <Input
647
+ :model-value="currentTextColor"
648
+ placeholder="#000000"
649
+ class="h-7 font-mono text-xs"
650
+ maxlength="7"
651
+ @blur="applyTextColor(($event.target as HTMLInputElement).value)"
652
+ />
653
+ </div>
654
+ <Button type="button" variant="ghost" size="sm" class="mt-2 w-full text-xs" @click="clearTextColor">
655
+ <X class="mr-1 h-3 w-3" />Clear color
656
+ </Button>
657
+ </PopoverContent>
658
+ </Popover>
659
+
660
+ <!-- Highlight / background color -->
661
+ <Popover>
662
+ <PopoverTrigger as-child>
663
+ <Button type="button" variant="ghost" :class="btnClass(!!currentBgColor)" title="Highlight color">
664
+ <Highlighter class="h-4 w-4" :style="currentBgColor ? { color: currentBgColor } : {}" />
665
+ </Button>
666
+ </PopoverTrigger>
667
+ <PopoverContent class="w-52 p-3" align="start">
668
+ <p class="mb-2 text-xs font-medium text-muted-foreground">Highlight color</p>
669
+ <div class="flex items-center gap-2">
670
+ <input
671
+ type="color"
672
+ :value="currentBgColor || '#ffff00'"
673
+ class="h-8 w-8 cursor-pointer rounded border border-input p-0.5"
674
+ @input="applyBgColor(($event.target as HTMLInputElement).value)"
675
+ />
676
+ <Input
677
+ :model-value="currentBgColor"
678
+ placeholder="#ffff00"
679
+ class="h-7 font-mono text-xs"
680
+ maxlength="7"
681
+ @blur="applyBgColor(($event.target as HTMLInputElement).value)"
682
+ />
683
+ </div>
684
+ <Button type="button" variant="ghost" size="sm" class="mt-2 w-full text-xs" @click="clearBgColor">
685
+ <X class="mr-1 h-3 w-3" />Clear highlight
686
+ </Button>
687
+ </PopoverContent>
688
+ </Popover>
689
+
690
+ <div class="mx-0.5 h-5 w-px bg-border/60 shrink-0" />
691
+
692
+ <!-- Link -->
693
+ <Button type="button" variant="ghost" :class="btnClass(isActive('link'))" title="Insert / edit link"
694
+ @click="openLinkDialog"><Link2 class="h-4 w-4" /></Button>
695
+
696
+ <!-- Image -->
697
+ <Button type="button" variant="ghost" :class="btnClass(isActive('image'))" title="Insert / edit image"
698
+ @click="openImageDialog"><ImageIcon class="h-4 w-4" /></Button>
699
+
700
+ <div class="mx-0.5 h-5 w-px bg-border/60 shrink-0" />
701
+
702
+ <!-- Lists -->
703
+ <DropdownMenu>
704
+ <DropdownMenuTrigger as-child>
705
+ <Button type="button" variant="ghost" :class="btnClass(isActive('bulletList') || isActive('orderedList'))" title="Lists">
706
+ <component :is="isActive('orderedList') ? ListOrdered : List" class="h-4 w-4" />
707
+ </Button>
708
+ </DropdownMenuTrigger>
709
+ <DropdownMenuContent align="start" class="w-40">
710
+ <DropdownMenuItem :class="isActive('bulletList') ? 'bg-muted' : ''" @click="toggleList('bullet')">
711
+ <List class="mr-2 h-4 w-4" />Bullet list
712
+ </DropdownMenuItem>
713
+ <DropdownMenuItem :class="isActive('orderedList') ? 'bg-muted' : ''" @click="toggleList('ordered')">
714
+ <ListOrdered class="mr-2 h-4 w-4" />Ordered list
715
+ </DropdownMenuItem>
716
+ </DropdownMenuContent>
717
+ </DropdownMenu>
718
+
719
+ <div class="mx-0.5 h-5 w-px bg-border/60 shrink-0" />
720
+
721
+ <!-- Table -->
722
+ <DropdownMenu>
723
+ <DropdownMenuTrigger as-child>
724
+ <Button type="button" variant="ghost" :class="btnClass(isActive('table'))" title="Table">
725
+ <Table2 class="h-4 w-4" />
726
+ </Button>
727
+ </DropdownMenuTrigger>
728
+ <DropdownMenuContent align="start" class="w-52">
729
+ <!-- Create-table grid (only when not inside a table) -->
730
+ <template v-if="!isActive('table')">
731
+ <DropdownMenuLabel class="text-xs uppercase text-muted-foreground">
732
+ Insert {{ tableHoverRows }}×{{ tableHoverCols }} table
733
+ </DropdownMenuLabel>
734
+ <div class="px-2 pb-2">
735
+ <div class="grid gap-0.5" style="grid-template-columns: repeat(6, 1.25rem)">
736
+ <button
737
+ v-for="cell in tableGridCells"
738
+ :key="`${cell.r}-${cell.c}`"
739
+ type="button"
740
+ class="h-5 w-5 rounded-sm border transition-colors"
741
+ :class="cell.r <= tableHoverRows && cell.c <= tableHoverCols
742
+ ? 'bg-primary border-primary'
743
+ : 'bg-muted/50 border-border hover:bg-muted'"
744
+ @mouseover="tableHoverRows = cell.r; tableHoverCols = cell.c"
745
+ @click="insertTable"
746
+ />
747
+ </div>
748
+ </div>
749
+ <DropdownMenuSeparator />
750
+ </template>
751
+
752
+ <DropdownMenuLabel class="text-xs uppercase text-muted-foreground">Column</DropdownMenuLabel>
753
+ <DropdownMenuItem :disabled="!isActive('table')" @click="editor?.chain().focus().addColumnBefore().run()">
754
+ <ArrowLeft class="mr-2 h-4 w-4" />Add before
755
+ </DropdownMenuItem>
756
+ <DropdownMenuItem :disabled="!isActive('table')" @click="editor?.chain().focus().addColumnAfter().run()">
757
+ <ArrowRight class="mr-2 h-4 w-4" />Add after
758
+ </DropdownMenuItem>
759
+ <DropdownMenuItem :disabled="!isActive('table')" @click="editor?.chain().focus().deleteColumn().run()">
760
+ <Trash2 class="mr-2 h-4 w-4" />Delete column
761
+ </DropdownMenuItem>
762
+ <DropdownMenuSeparator />
763
+ <DropdownMenuLabel class="text-xs uppercase text-muted-foreground">Row</DropdownMenuLabel>
764
+ <DropdownMenuItem :disabled="!isActive('table')" @click="editor?.chain().focus().addRowBefore().run()">
765
+ <ArrowUp class="mr-2 h-4 w-4" />Add before
766
+ </DropdownMenuItem>
767
+ <DropdownMenuItem :disabled="!isActive('table')" @click="editor?.chain().focus().addRowAfter().run()">
768
+ <ArrowDown class="mr-2 h-4 w-4" />Add after
769
+ </DropdownMenuItem>
770
+ <DropdownMenuItem :disabled="!isActive('table')" @click="editor?.chain().focus().deleteRow().run()">
771
+ <Trash2 class="mr-2 h-4 w-4" />Delete row
772
+ </DropdownMenuItem>
773
+ <DropdownMenuSeparator />
774
+ <DropdownMenuLabel class="text-xs uppercase text-muted-foreground">Cell</DropdownMenuLabel>
775
+ <DropdownMenuItem :disabled="!isActive('table')" @click="editor?.chain().focus().mergeCells().run()">
776
+ <Combine class="mr-2 h-4 w-4" />Merge cells
777
+ </DropdownMenuItem>
778
+ <DropdownMenuItem :disabled="!isActive('table')" @click="editor?.chain().focus().splitCell().run()">
779
+ <Scissors class="mr-2 h-4 w-4" />Split cell
780
+ </DropdownMenuItem>
781
+ <DropdownMenuSeparator />
782
+ <DropdownMenuItem
783
+ :disabled="!isActive('table')"
784
+ class="text-destructive focus:text-destructive"
785
+ @click="editor?.chain().focus().deleteTable().run()"
786
+ >
787
+ <Trash2 class="mr-2 h-4 w-4" />Delete table
788
+ </DropdownMenuItem>
789
+ </DropdownMenuContent>
790
+ </DropdownMenu>
791
+ </div>
792
+ </div>
793
+
794
+ <!-- ----------------------------------------------------------------- -->
795
+ <!-- Editor content area -->
796
+ <!-- ----------------------------------------------------------------- -->
797
+ <EditorContent
798
+ v-if="editor"
799
+ :editor="editor"
800
+ :style="contentStyle"
801
+ class="html-editor-content prose prose-sm max-w-none px-3 py-2 dark:prose-invert
802
+ [&_.ProseMirror]:min-h-full [&_.ProseMirror]:outline-none"
803
+ data-testid="html-editor-content"
804
+ @click="editor?.chain().focus().run()"
79
805
  />
80
806
  </div>
807
+
808
+ <!-- ------------------------------------------------------------------- -->
809
+ <!-- Link dialog -->
810
+ <!-- ------------------------------------------------------------------- -->
811
+ <Dialog v-model:open="linkDialogOpen">
812
+ <DialogContent class="max-w-md">
813
+ <DialogHeader>
814
+ <DialogTitle>{{ isEditingLink ? 'Edit link' : 'Insert link' }}</DialogTitle>
815
+ </DialogHeader>
816
+ <div class="grid gap-4 py-2">
817
+ <div class="grid gap-1.5">
818
+ <Label for="html-editor-link-url">URL</Label>
819
+ <Input id="html-editor-link-url" v-model="linkUrl" placeholder="https://example.com" />
820
+ </div>
821
+ <div class="grid gap-1.5">
822
+ <Label for="html-editor-link-text">Link text</Label>
823
+ <Input id="html-editor-link-text" v-model="linkText" placeholder="Link text" />
824
+ </div>
825
+ <div class="flex items-center gap-2">
826
+ <Checkbox
827
+ id="html-editor-link-target"
828
+ :checked="linkTargetBlank"
829
+ @update:checked="linkTargetBlank = !!$event"
830
+ />
831
+ <Label for="html-editor-link-target" class="cursor-pointer font-normal">Open in new tab</Label>
832
+ </div>
833
+ </div>
834
+ <DialogFooter class="flex-row items-center justify-between gap-2">
835
+ <Button v-if="isEditingLink" type="button" variant="destructive" size="sm" @click="removeLink">
836
+ <Trash2 class="mr-1.5 h-3.5 w-3.5" />Remove link
837
+ </Button>
838
+ <div class="flex gap-2">
839
+ <Button type="button" variant="outline" size="sm" @click="linkDialogOpen = false">Cancel</Button>
840
+ <Button type="button" size="sm" @click="applyLink">Apply</Button>
841
+ </div>
842
+ </DialogFooter>
843
+ </DialogContent>
844
+ </Dialog>
845
+
846
+ <!-- ------------------------------------------------------------------- -->
847
+ <!-- Image dialog -->
848
+ <!-- ------------------------------------------------------------------- -->
849
+ <Dialog v-model:open="imageDialogOpen">
850
+ <DialogContent class="max-w-md">
851
+ <DialogHeader>
852
+ <DialogTitle>{{ isEditingImage ? 'Edit image' : 'Insert image' }}</DialogTitle>
853
+ </DialogHeader>
854
+ <div class="grid gap-4 py-2">
855
+ <div class="grid gap-1.5">
856
+ <Label for="html-editor-img-url">Image URL</Label>
857
+ <Input id="html-editor-img-url" v-model="imageUrl" placeholder="https://example.com/image.jpg" />
858
+ </div>
859
+ <div class="grid gap-1.5">
860
+ <Label for="html-editor-img-alt">Alt text</Label>
861
+ <Input id="html-editor-img-alt" v-model="imageAlt" placeholder="Describe the image" />
862
+ </div>
863
+ <div class="grid gap-1.5">
864
+ <Label for="html-editor-img-style">
865
+ Style <span class="ml-1 text-xs font-normal text-muted-foreground">(optional)</span>
866
+ </Label>
867
+ <Input id="html-editor-img-style" v-model="imageStyle" placeholder="width: 100%; height: auto;" />
868
+ </div>
869
+ </div>
870
+ <DialogFooter>
871
+ <Button type="button" variant="outline" size="sm" @click="imageDialogOpen = false">Cancel</Button>
872
+ <Button type="button" size="sm" @click="applyImage">
873
+ {{ isEditingImage ? 'Update' : 'Insert' }}
874
+ </Button>
875
+ </DialogFooter>
876
+ </DialogContent>
877
+ </Dialog>
878
+
879
+ <!-- ------------------------------------------------------------------- -->
880
+ <!-- HTML source dialog -->
881
+ <!-- ------------------------------------------------------------------- -->
882
+ <Dialog v-model:open="sourceDialogOpen">
883
+ <DialogContent class="max-w-3xl">
884
+ <DialogHeader>
885
+ <DialogTitle>Edit HTML source</DialogTitle>
886
+ </DialogHeader>
887
+ <textarea
888
+ v-model="sourceHtml"
889
+ class="h-96 w-full resize-y rounded-md border border-input bg-background p-3 font-mono text-xs
890
+ focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
891
+ spellcheck="false"
892
+ data-testid="html-editor-source"
893
+ />
894
+ <DialogFooter>
895
+ <Button type="button" variant="outline" size="sm" @click="sourceDialogOpen = false">Cancel</Button>
896
+ <Button type="button" size="sm" @click="applySource">Apply changes</Button>
897
+ </DialogFooter>
898
+ </DialogContent>
899
+ </Dialog>
81
900
  </FieldFrame>
82
901
  </template>
902
+
903
+ <style scoped>
904
+ /* Table chrome */
905
+ :deep(.html-editor-content table) {
906
+ border-collapse: collapse;
907
+ margin: 0.5rem 0;
908
+ overflow: hidden;
909
+ table-layout: fixed;
910
+ width: 100%;
911
+ }
912
+
913
+ :deep(.html-editor-content table td),
914
+ :deep(.html-editor-content table th) {
915
+ border: 2px solid var(--border);
916
+ box-sizing: border-box;
917
+ min-width: 1em;
918
+ padding: 0.375rem 0.5rem;
919
+ position: relative;
920
+ vertical-align: top;
921
+ }
922
+
923
+ :deep(.html-editor-content table th) {
924
+ background-color: var(--muted);
925
+ font-weight: 600;
926
+ text-align: left;
927
+ }
928
+
929
+ :deep(.html-editor-content table .selectedCell::after) {
930
+ background: color-mix(in oklch, var(--primary) 15%, transparent);
931
+ content: "";
932
+ inset: 0;
933
+ pointer-events: none;
934
+ position: absolute;
935
+ z-index: 2;
936
+ }
937
+
938
+ :deep(.html-editor-content .tableWrapper) {
939
+ overflow-x: auto;
940
+ }
941
+
942
+ :deep(.html-editor-content .column-resize-handle) {
943
+ background-color: var(--primary);
944
+ bottom: -2px;
945
+ pointer-events: none;
946
+ position: absolute;
947
+ right: -2px;
948
+ top: 0;
949
+ width: 4px;
950
+ }
951
+
952
+ :deep(.html-editor-content .resize-cursor) {
953
+ cursor: col-resize;
954
+ }
955
+
956
+ /* Content styling */
957
+ :deep(.html-editor-content a) {
958
+ color: var(--primary);
959
+ text-decoration: underline;
960
+ }
961
+
962
+ :deep(.html-editor-content img) {
963
+ display: block;
964
+ margin: 0.75rem 0;
965
+ }
966
+
967
+ :deep(.html-editor-content img.ProseMirror-selectednode) {
968
+ outline: 2px solid var(--primary);
969
+ outline-offset: 2px;
970
+ }
971
+
972
+ :deep(.html-editor-content blockquote) {
973
+ border-left: 3px solid var(--border);
974
+ color: var(--muted-foreground);
975
+ font-style: italic;
976
+ margin-left: 0;
977
+ padding-left: 1rem;
978
+ }
979
+
980
+ :deep(.html-editor-content .ProseMirror-focused) {
981
+ outline: none;
982
+ }
983
+ </style>