@aquera/nile-elements 1.9.8 → 1.9.9

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 (232) hide show
  1. package/README.md +3 -0
  2. package/dist/{index-249de90a.esm.js → index-289706c7.esm.js} +1 -1
  3. package/dist/{index-df196058.cjs.js → index-d7e6f1c6.cjs.js} +2 -2
  4. package/dist/index-d7e6f1c6.cjs.js.map +1 -0
  5. package/dist/index.cjs.js +1 -1
  6. package/dist/index.esm.js +1 -1
  7. package/dist/index.js +1577 -1275
  8. package/dist/katex-44476ab4.esm.js +1 -0
  9. package/dist/katex-f4186f87.cjs.js +2 -0
  10. package/dist/katex-f4186f87.cjs.js.map +1 -0
  11. package/dist/nile-color-picker/index.cjs.js +1 -1
  12. package/dist/nile-color-picker/index.esm.js +1 -1
  13. package/dist/nile-color-picker/nile-color-picker.cjs.js +1 -1
  14. package/dist/nile-color-picker/nile-color-picker.cjs.js.map +1 -1
  15. package/dist/nile-color-picker/nile-color-picker.esm.js +1 -1
  16. package/dist/nile-wysiwyg-editor/engine/commands.cjs.js +1 -1
  17. package/dist/nile-wysiwyg-editor/engine/commands.cjs.js.map +1 -1
  18. package/dist/nile-wysiwyg-editor/engine/commands.esm.js +1 -1
  19. package/dist/nile-wysiwyg-editor/engine/create-state.cjs.js +1 -1
  20. package/dist/nile-wysiwyg-editor/engine/create-state.cjs.js.map +1 -1
  21. package/dist/nile-wysiwyg-editor/engine/create-state.esm.js +1 -1
  22. package/dist/nile-wysiwyg-editor/engine/index.cjs.js +1 -1
  23. package/dist/nile-wysiwyg-editor/engine/index.esm.js +1 -1
  24. package/dist/nile-wysiwyg-editor/engine/inputrules.cjs.js +1 -1
  25. package/dist/nile-wysiwyg-editor/engine/keymap.cjs.js +1 -1
  26. package/dist/nile-wysiwyg-editor/engine/keymap.esm.js +1 -1
  27. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.cjs.js +1 -1
  28. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.cjs.js.map +1 -1
  29. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.esm.js +1 -1
  30. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.cjs.js +1 -1
  31. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.cjs.js.map +1 -1
  32. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.esm.js +1 -1
  33. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.cjs.js +1 -1
  34. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.cjs.js.map +1 -1
  35. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.esm.js +1 -1
  36. package/dist/nile-wysiwyg-editor/engine/plugins/math-view.cjs.js +1 -1
  37. package/dist/nile-wysiwyg-editor/engine/plugins/math-view.cjs.js.map +1 -1
  38. package/dist/nile-wysiwyg-editor/engine/plugins/math-view.esm.js +1 -1
  39. package/dist/nile-wysiwyg-editor/engine/plugins/style-block-view.cjs.js +2 -0
  40. package/dist/nile-wysiwyg-editor/engine/plugins/style-block-view.cjs.js.map +1 -0
  41. package/dist/nile-wysiwyg-editor/engine/plugins/style-block-view.esm.js +1 -0
  42. package/dist/nile-wysiwyg-editor/engine/plugins/tables.cjs.js +1 -1
  43. package/dist/nile-wysiwyg-editor/engine/plugins/tables.cjs.js.map +1 -1
  44. package/dist/nile-wysiwyg-editor/engine/plugins/tables.esm.js +1 -1
  45. package/dist/nile-wysiwyg-editor/engine/sanitize.cjs.js +1 -1
  46. package/dist/nile-wysiwyg-editor/engine/sanitize.cjs.js.map +1 -1
  47. package/dist/nile-wysiwyg-editor/engine/sanitize.esm.js +1 -1
  48. package/dist/nile-wysiwyg-editor/engine/schema.cjs.js +1 -1
  49. package/dist/nile-wysiwyg-editor/engine/schema.cjs.js.map +1 -1
  50. package/dist/nile-wysiwyg-editor/engine/schema.esm.js +1 -1
  51. package/dist/nile-wysiwyg-editor/engine/selection-state.cjs.js +1 -1
  52. package/dist/nile-wysiwyg-editor/engine/selection-state.cjs.js.map +1 -1
  53. package/dist/nile-wysiwyg-editor/engine/selection-state.esm.js +1 -1
  54. package/dist/nile-wysiwyg-editor/index.cjs.js +1 -1
  55. package/dist/nile-wysiwyg-editor/index.esm.js +1 -1
  56. package/dist/nile-wysiwyg-editor/math/katex-renderer.cjs.js +2 -0
  57. package/dist/nile-wysiwyg-editor/math/katex-renderer.cjs.js.map +1 -0
  58. package/dist/nile-wysiwyg-editor/math/katex-renderer.esm.js +1 -0
  59. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js +1 -1
  60. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js.map +1 -1
  61. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js +1 -1
  62. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js.map +1 -1
  63. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.esm.js +22 -3
  64. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.esm.js +7 -6
  65. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.cjs.js +1 -1
  66. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.esm.js +1 -1
  67. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.cjs.js +2 -0
  68. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.cjs.js.map +1 -0
  69. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.esm.js +1 -0
  70. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.cjs.js +1 -1
  71. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.cjs.js.map +1 -1
  72. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js +1 -1
  73. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js.map +1 -1
  74. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.esm.js +33 -54
  75. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.esm.js +83 -95
  76. package/dist/nile-wysiwyg-editor/types.cjs.js +1 -1
  77. package/dist/nile-wysiwyg-editor/types.cjs.js.map +1 -1
  78. package/dist/nile-wysiwyg-editor/types.esm.js +1 -1
  79. package/dist/nile-wysiwyg-editor/ui/bubble-item.cjs.js +2 -0
  80. package/dist/nile-wysiwyg-editor/ui/bubble-item.cjs.js.map +1 -0
  81. package/dist/nile-wysiwyg-editor/ui/bubble-item.esm.js +1 -0
  82. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js +1 -1
  83. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js.map +1 -1
  84. package/dist/nile-wysiwyg-editor/ui/bubble-menu.esm.js +23 -15
  85. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js +1 -1
  86. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js.map +1 -1
  87. package/dist/nile-wysiwyg-editor/ui/code-block-menu.esm.js +3 -3
  88. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js +1 -1
  89. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js.map +1 -1
  90. package/dist/nile-wysiwyg-editor/ui/embed-panel.esm.js +2 -2
  91. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js +1 -1
  92. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js.map +1 -1
  93. package/dist/nile-wysiwyg-editor/ui/math-panel.esm.js +0 -3
  94. package/dist/nile-wysiwyg-editor/ui/preview.cjs.js +2 -0
  95. package/dist/nile-wysiwyg-editor/ui/preview.cjs.js.map +1 -0
  96. package/dist/nile-wysiwyg-editor/ui/preview.esm.js +8 -0
  97. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js +1 -1
  98. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js.map +1 -1
  99. package/dist/nile-wysiwyg-editor/ui/source-view.esm.js +225 -24
  100. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js +1 -1
  101. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js.map +1 -1
  102. package/dist/nile-wysiwyg-editor/ui/suggest-list.esm.js +9 -9
  103. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js +1 -1
  104. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js.map +1 -1
  105. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.esm.js +115 -13
  106. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js +1 -1
  107. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js.map +1 -1
  108. package/dist/nile-wysiwyg-editor/ui/table-menu.esm.js +13 -12
  109. package/dist/src/index.d.ts +5 -0
  110. package/dist/src/index.js +3 -0
  111. package/dist/src/index.js.map +1 -1
  112. package/dist/src/nile-color-picker/nile-color-picker.d.ts +1 -0
  113. package/dist/src/nile-color-picker/nile-color-picker.js +1 -0
  114. package/dist/src/nile-color-picker/nile-color-picker.js.map +1 -1
  115. package/dist/src/nile-wysiwyg-editor/engine/index.d.ts +1 -0
  116. package/dist/src/nile-wysiwyg-editor/engine/index.js +1 -0
  117. package/dist/src/nile-wysiwyg-editor/engine/index.js.map +1 -1
  118. package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.js +3 -0
  119. package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.js.map +1 -1
  120. package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.d.ts +19 -4
  121. package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.js +23 -18
  122. package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.js.map +1 -1
  123. package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.d.ts +8 -3
  124. package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.js +41 -4
  125. package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.js.map +1 -1
  126. package/dist/src/nile-wysiwyg-editor/engine/plugins/style-block-view.d.ts +17 -0
  127. package/dist/src/nile-wysiwyg-editor/engine/plugins/style-block-view.js +174 -0
  128. package/dist/src/nile-wysiwyg-editor/engine/plugins/style-block-view.js.map +1 -0
  129. package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.js +33 -2
  130. package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.js.map +1 -1
  131. package/dist/src/nile-wysiwyg-editor/engine/pm.test.js +49 -8
  132. package/dist/src/nile-wysiwyg-editor/engine/pm.test.js.map +1 -1
  133. package/dist/src/nile-wysiwyg-editor/engine/sanitize.d.ts +12 -0
  134. package/dist/src/nile-wysiwyg-editor/engine/sanitize.js +76 -8
  135. package/dist/src/nile-wysiwyg-editor/engine/sanitize.js.map +1 -1
  136. package/dist/src/nile-wysiwyg-editor/engine/schema.d.ts +2 -0
  137. package/dist/src/nile-wysiwyg-editor/engine/schema.js +154 -2
  138. package/dist/src/nile-wysiwyg-editor/engine/schema.js.map +1 -1
  139. package/dist/src/nile-wysiwyg-editor/index.d.ts +5 -0
  140. package/dist/src/nile-wysiwyg-editor/index.js +3 -0
  141. package/dist/src/nile-wysiwyg-editor/index.js.map +1 -1
  142. package/dist/src/nile-wysiwyg-editor/math/katex-renderer.d.ts +38 -0
  143. package/dist/src/nile-wysiwyg-editor/math/katex-renderer.js +40 -0
  144. package/dist/src/nile-wysiwyg-editor/math/katex-renderer.js.map +1 -0
  145. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js +22 -3
  146. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js.map +1 -1
  147. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.d.ts +36 -0
  148. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js +125 -8
  149. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js.map +1 -1
  150. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.js +5 -2
  151. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.js.map +1 -1
  152. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.d.ts +2 -0
  153. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.js +1 -0
  154. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.js.map +1 -1
  155. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.d.ts +55 -0
  156. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.js +79 -0
  157. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.js.map +1 -0
  158. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js +33 -54
  159. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js.map +1 -1
  160. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.d.ts +50 -2
  161. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.js +158 -102
  162. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.js.map +1 -1
  163. package/dist/src/nile-wysiwyg-editor/types.d.ts +4 -2
  164. package/dist/src/nile-wysiwyg-editor/types.js +2 -2
  165. package/dist/src/nile-wysiwyg-editor/types.js.map +1 -1
  166. package/dist/src/nile-wysiwyg-editor/ui/bubble-item.d.ts +48 -0
  167. package/dist/src/nile-wysiwyg-editor/ui/bubble-item.js +69 -0
  168. package/dist/src/nile-wysiwyg-editor/ui/bubble-item.js.map +1 -0
  169. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.d.ts +17 -2
  170. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js +128 -35
  171. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js.map +1 -1
  172. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.d.ts +2 -1
  173. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js +4 -3
  174. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js.map +1 -1
  175. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js +0 -3
  176. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js.map +1 -1
  177. package/dist/src/nile-wysiwyg-editor/ui/preview.d.ts +20 -0
  178. package/dist/src/nile-wysiwyg-editor/ui/preview.js +44 -0
  179. package/dist/src/nile-wysiwyg-editor/ui/preview.js.map +1 -0
  180. package/dist/src/nile-wysiwyg-editor/ui/source-view.d.ts +35 -3
  181. package/dist/src/nile-wysiwyg-editor/ui/source-view.js +337 -24
  182. package/dist/src/nile-wysiwyg-editor/ui/source-view.js.map +1 -1
  183. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.d.ts +1 -0
  184. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js +9 -0
  185. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js.map +1 -1
  186. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.d.ts +13 -2
  187. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js +166 -10
  188. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js.map +1 -1
  189. package/dist/src/nile-wysiwyg-editor/ui/table-menu.d.ts +1 -0
  190. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js +10 -8
  191. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js.map +1 -1
  192. package/dist/src/version.js +1 -1
  193. package/dist/src/version.js.map +1 -1
  194. package/dist/tsconfig.tsbuildinfo +1 -1
  195. package/dist/xml-25c4108a.esm.js +1 -0
  196. package/dist/xml-90fd974e.cjs.js +2 -0
  197. package/dist/xml-90fd974e.cjs.js.map +1 -0
  198. package/package.json +2 -1
  199. package/rollup.config.js +1 -0
  200. package/src/index.ts +8 -0
  201. package/src/nile-color-picker/nile-color-picker.ts +1 -0
  202. package/src/nile-wysiwyg-editor/engine/index.ts +1 -0
  203. package/src/nile-wysiwyg-editor/engine/plugins/embed-view.ts +3 -0
  204. package/src/nile-wysiwyg-editor/engine/plugins/embeds.ts +26 -20
  205. package/src/nile-wysiwyg-editor/engine/plugins/math-view.ts +45 -4
  206. package/src/nile-wysiwyg-editor/engine/plugins/style-block-view.ts +178 -0
  207. package/src/nile-wysiwyg-editor/engine/plugins/tables.ts +34 -2
  208. package/src/nile-wysiwyg-editor/engine/pm.test.ts +58 -8
  209. package/src/nile-wysiwyg-editor/engine/sanitize.ts +71 -8
  210. package/src/nile-wysiwyg-editor/engine/schema.ts +158 -7
  211. package/src/nile-wysiwyg-editor/index.ts +5 -0
  212. package/src/nile-wysiwyg-editor/math/katex-renderer.ts +59 -0
  213. package/src/nile-wysiwyg-editor/math/katex.d.ts +17 -0
  214. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.ts +22 -3
  215. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.ts +5 -2
  216. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.ts +142 -7
  217. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.ts +2 -0
  218. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.ts +68 -0
  219. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.ts +33 -54
  220. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.ts +202 -108
  221. package/src/nile-wysiwyg-editor/types.ts +6 -4
  222. package/src/nile-wysiwyg-editor/ui/bubble-item.ts +60 -0
  223. package/src/nile-wysiwyg-editor/ui/bubble-menu.ts +147 -40
  224. package/src/nile-wysiwyg-editor/ui/embed-panel.ts +4 -3
  225. package/src/nile-wysiwyg-editor/ui/math-panel.ts +0 -3
  226. package/src/nile-wysiwyg-editor/ui/preview.ts +42 -0
  227. package/src/nile-wysiwyg-editor/ui/source-view.ts +339 -31
  228. package/src/nile-wysiwyg-editor/ui/suggest-list.ts +10 -0
  229. package/src/nile-wysiwyg-editor/ui/table-grid-picker.ts +160 -10
  230. package/src/nile-wysiwyg-editor/ui/table-menu.ts +10 -8
  231. package/vscode-html-custom-data.json +75 -6
  232. package/dist/index-df196058.cjs.js.map +0 -1
@@ -1,18 +1,100 @@
1
- import { html, css, TemplateResult, CSSResultArray } from 'lit';
1
+ import { html, css, TemplateResult, CSSResultArray, nothing } from 'lit';
2
2
  import { customElement, property } from 'lit/decorators.js';
3
3
  import NileElement from '../../internal/nile-element';
4
4
  import { renderGlyph } from '../../internal/glyph';
5
5
  import type { ToolbarState } from '../engine/selection-state';
6
6
  import type { WysiwygCommandDetail } from '../types';
7
+ import type { AuthoredToolbarItem } from '../nile-wysiwyg-toolbar/nile-wysiwyg-toolbar';
8
+ import '../../nile-lite-tooltip/nile-lite-tooltip';
7
9
 
8
- interface BubbleItem {
9
- name: WysiwygCommandDetail['name'];
10
+ /** A control the bubble menu knows how to render, keyed by its authored name. */
11
+ interface BubbleDef {
12
+ /** The command dispatched on click. */
13
+ command: WysiwygCommandDetail['name'];
10
14
  label: string;
11
15
  /** nile-glyph icon name (ng-* names are stroke-drawn). */
12
16
  icon: string;
13
- active: (state: ToolbarState) => boolean;
17
+ /** Static attrs sent with the command (e.g. alignment direction). */
18
+ attrs?: WysiwygCommandDetail['attrs'];
19
+ active?: (state: ToolbarState) => boolean;
14
20
  }
15
21
 
22
+ /**
23
+ * Registry of controls addressable by `<nile-wysiwyg-bubble-item name="…">`.
24
+ * Icons/labels mirror the main toolbar so both surfaces look identical.
25
+ */
26
+ const BUBBLE_ITEMS: Record<string, BubbleDef> = {
27
+ bold: { command: 'bold', label: 'Bold', icon: 'format_bold', active: s => s.bold },
28
+ italic: { command: 'italic', label: 'Italic', icon: 'format_italic', active: s => s.italic },
29
+ underline: {
30
+ command: 'underline',
31
+ label: 'Underline',
32
+ icon: 'format_underline',
33
+ active: s => s.underline,
34
+ },
35
+ strike: {
36
+ command: 'strike',
37
+ label: 'Strikethrough',
38
+ icon: 'ng-strikethrough',
39
+ active: s => s.strike,
40
+ },
41
+ code: { command: 'code', label: 'Inline code', icon: 'ng-code', active: s => s.code },
42
+ subscript: {
43
+ command: 'subscript',
44
+ label: 'Subscript',
45
+ icon: 'ng-subscript',
46
+ active: s => s.subscript,
47
+ },
48
+ superscript: {
49
+ command: 'superscript',
50
+ label: 'Superscript',
51
+ icon: 'ng-superscript',
52
+ active: s => s.superscript,
53
+ },
54
+ link: { command: 'openLink', label: 'Link', icon: 'link_2', active: s => s.linkActive },
55
+ bulletList: {
56
+ command: 'bulletList',
57
+ label: 'Bulleted list',
58
+ icon: 'format_list_bulleted',
59
+ active: s => s.inBulletList,
60
+ },
61
+ orderedList: {
62
+ command: 'orderedList',
63
+ label: 'Numbered list',
64
+ icon: 'format_list_numbered',
65
+ active: s => s.inOrderedList,
66
+ },
67
+ alignLeft: {
68
+ command: 'align',
69
+ label: 'Align left',
70
+ icon: 'format_align_left',
71
+ attrs: { align: 'left' },
72
+ active: s => s.align === 'left',
73
+ },
74
+ alignCenter: {
75
+ command: 'align',
76
+ label: 'Align center',
77
+ icon: 'format_align_middle',
78
+ attrs: { align: 'center' },
79
+ active: s => s.align === 'center',
80
+ },
81
+ alignRight: {
82
+ command: 'align',
83
+ label: 'Align right',
84
+ icon: 'format_align_right',
85
+ attrs: { align: 'right' },
86
+ active: s => s.align === 'right',
87
+ },
88
+ clearFormatting: {
89
+ command: 'clearFormatting',
90
+ label: 'Clear formatting',
91
+ icon: 'format_clear',
92
+ },
93
+ };
94
+
95
+ /** Built-in default when no `<nile-wysiwyg-bubble-item>` children are authored. */
96
+ const DEFAULT_BUBBLE = ['bold', 'italic', 'underline', 'strike', 'link'];
97
+
16
98
  /**
17
99
  * Balloon toolbar shown over non-empty selections. The host owns positioning
18
100
  * (absolute left/top) and visibility; commands bubble up as
@@ -24,6 +106,13 @@ export class NileWysiwygBubbleMenu extends NileElement {
24
106
 
25
107
  @property({ attribute: false }) toolbarState?: ToolbarState;
26
108
 
109
+ /**
110
+ * Structured item list authored in light DOM (from
111
+ * `<nile-wysiwyg-bubble-item>` children). `'|'` is a separator. Falls back to
112
+ * {@link DEFAULT_BUBBLE} when empty.
113
+ */
114
+ @property({ attribute: false }) items?: AuthoredToolbarItem[];
115
+
27
116
  public static get styles(): CSSResultArray {
28
117
  return [
29
118
  css`
@@ -78,54 +167,72 @@ export class NileWysiwygBubbleMenu extends NileElement {
78
167
  background: var(--nile-colors-primary-50, var(--ng-componentcolors-utility-blue-50, #eff4ff));
79
168
  color: var(--nile-colors-primary-700, var(--ng-componentcolors-utility-blue-700, #1d4ed8));
80
169
  }
170
+
171
+ .divider {
172
+ align-self: stretch;
173
+ width: 1px;
174
+ margin: 3px 2px;
175
+ background: var(--nile-colors-neutral-300, #e4e7ec);
176
+ }
81
177
  `,
82
178
  ];
83
179
  }
84
180
 
85
- /** Same icon set as the main toolbar, so both surfaces look identical. */
86
- private items: BubbleItem[] = [
87
- { name: 'bold', label: 'Bold', icon: 'format_bold', active: s => s.bold },
88
- { name: 'italic', label: 'Italic', icon: 'format_italic', active: s => s.italic },
89
- {
90
- name: 'underline',
91
- label: 'Underline',
92
- icon: 'format_underline',
93
- active: s => s.underline,
94
- },
95
- {
96
- name: 'strike',
97
- label: 'Strikethrough',
98
- icon: 'ng-strikethrough',
99
- active: s => s.strike,
100
- },
101
- {
102
- name: 'openLink',
103
- label: 'Link',
104
- icon: 'link_2',
105
- active: s => s.linkActive,
106
- },
107
- ];
181
+ /**
182
+ * True when this instance is an author's declarative `<nile-wysiwyg-bubble-menu>`
183
+ * container in an editor's light DOM (holding `<nile-wysiwyg-bubble-item>`
184
+ * children). It renders nothing the editor reads the items and renders the
185
+ * real bubble menu in its own shadow DOM. The editor's internal instance
186
+ * lives in a shadow root, so `closest` never matches it.
187
+ */
188
+ private get isAuthoringContainer(): boolean {
189
+ return !!this.closest('nile-wysiwyg-editor');
190
+ }
108
191
 
109
192
  public render(): TemplateResult {
193
+ if (this.isAuthoringContainer) return html``;
194
+
110
195
  const state = this.toolbarState;
196
+ const entries: AuthoredToolbarItem[] =
197
+ this.items && this.items.length
198
+ ? this.items
199
+ : DEFAULT_BUBBLE.map(name => ({ name }));
111
200
  return html`
112
201
  <div class="bubble" part="bubble-menu" @mousedown=${(e: Event) => e.preventDefault()}>
113
- ${this.items.map(
114
- item => html`
115
- <button
116
- type="button"
117
- title=${item.label}
118
- aria-label=${item.label}
119
- ?data-active=${state ? item.active(state) : false}
120
- @click=${() => this.emit('wysiwyg-command', { name: item.name })}
121
- >
122
- ${renderGlyph(item.icon, 16)}
123
- </button>
124
- `
125
- )}
202
+ ${entries.map(entry => this.renderEntry(entry, state))}
126
203
  </div>
127
204
  `;
128
205
  }
206
+
207
+ private renderEntry(
208
+ entry: AuthoredToolbarItem,
209
+ state?: ToolbarState
210
+ ): TemplateResult | typeof nothing {
211
+ if (entry.name === '|') {
212
+ return html`<span class="divider" part="bubble-divider"></span>`;
213
+ }
214
+ const base = BUBBLE_ITEMS[entry.name];
215
+ const label = entry.label || base?.label || entry.name;
216
+ const icon = entry.icon || base?.icon;
217
+ // Unknown command with no icon to draw → nothing to render.
218
+ if (!icon) return nothing;
219
+ const command = base?.command ?? (entry.name as WysiwygCommandDetail['name']);
220
+ const attrs = base?.attrs;
221
+ const isActive = base?.active && state ? base.active(state) : false;
222
+ return html`
223
+ <nile-lite-tooltip content=${label} placement="top">
224
+ <button
225
+ type="button"
226
+ aria-label=${label}
227
+ ?data-active=${isActive}
228
+ @click=${() =>
229
+ this.emit('wysiwyg-command', attrs ? { name: command, attrs } : { name: command })}
230
+ >
231
+ ${renderGlyph(icon, 16)}
232
+ </button>
233
+ </nile-lite-tooltip>
234
+ `;
235
+ }
129
236
  }
130
237
 
131
238
  declare global {
@@ -6,7 +6,8 @@ import '../../nile-input/index';
6
6
  import '../../nile-button/index';
7
7
 
8
8
  /**
9
- * Floating embed-insert panel: paste a YouTube/Vimeo/Loom link. Styled to
9
+ * Floating embed-insert panel: paste any https:// link (YouTube/Vimeo/Loom
10
+ * are auto-formatted; anything else embeds as a sandboxed iframe). Styled to
10
11
  * match the image panel (nile-input + nile-button). Emits
11
12
  * `wysiwyg-embed-apply` detail: { src, provider } and `wysiwyg-embed-cancel`.
12
13
  */
@@ -94,7 +95,7 @@ export class NileWysiwygEmbedPanel extends NileElement {
94
95
  private handleSubmit(): void {
95
96
  const target = toEmbedUrl(this.urlValue.trim());
96
97
  if (!target) {
97
- this.error = 'Only YouTube, Vimeo, and Loom links are supported.';
98
+ this.error = 'Enter a valid https:// URL.';
98
99
  return;
99
100
  }
100
101
  this.error = '';
@@ -124,7 +125,7 @@ export class NileWysiwygEmbedPanel extends NileElement {
124
125
 
125
126
  ${this.error
126
127
  ? html`<span class="error" part="error">${this.error}</span>`
127
- : html`<span class="hint">YouTube, Vimeo, or Loom</span>`}
128
+ : html`<span class="hint">Add any link to it</span>`}
128
129
 
129
130
  <div class="actions">
130
131
  <nile-button variant="primary" @click=${() => this.handleSubmit()}
@@ -148,9 +148,6 @@ export class NileWysiwygMathPanel extends NileElement {
148
148
  </nile-button-toggle-group>
149
149
  </div>
150
150
 
151
- <span class="hint"
152
- >LaTeX is stored as-is; rendering uses your math renderer if configured.</span
153
- >
154
151
 
155
152
  <div class="actions">
156
153
  <nile-button variant="primary" @click=${() => this.handleSubmit()}
@@ -0,0 +1,42 @@
1
+ import { LitElement, html, css, TemplateResult, CSSResultArray } from 'lit';
2
+ import { customElement, property } from 'lit/decorators.js';
3
+ import { unsafeHTML } from 'lit/directives/unsafe-html.js';
4
+ import { styles as editorStyles } from '../nile-wysiwyg-editor.css';
5
+
6
+ /**
7
+ * Renders sanitized document HTML inside its OWN shadow root. Any author
8
+ * `<style>` block in the content is therefore scoped to this element and
9
+ * cannot leak into the surrounding source-view / editor chrome (which lives in
10
+ * a different shadow root). Reuses the editor's content styles so the render
11
+ * matches the live editor. The content wrapper is an `<article>`, not a
12
+ * `<div>`, so a blanket `div { … }` rule doesn't paint the wrapper itself.
13
+ */
14
+ @customElement('nile-wysiwyg-preview')
15
+ export class NileWysiwygPreview extends LitElement {
16
+ /** Sanitized HTML to render (already run through sanitizeHtml). */
17
+ @property({ type: String }) content = '';
18
+
19
+ public static get styles(): CSSResultArray {
20
+ return [
21
+ editorStyles,
22
+ css`
23
+ :host {
24
+ display: block;
25
+ }
26
+ .ProseMirror {
27
+ min-height: 0;
28
+ }
29
+ `,
30
+ ];
31
+ }
32
+
33
+ public render(): TemplateResult {
34
+ return html`<article class="ProseMirror">${unsafeHTML(this.content)}</article>`;
35
+ }
36
+ }
37
+
38
+ declare global {
39
+ interface HTMLElementTagNameMap {
40
+ 'nile-wysiwyg-preview': NileWysiwygPreview;
41
+ }
42
+ }