snice 4.14.0 → 4.16.0

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 (384) hide show
  1. package/adapters/react/doc.d.ts +1 -0
  2. package/adapters/react/doc.d.ts.map +1 -1
  3. package/adapters/react/doc.js +1 -1
  4. package/adapters/react/doc.js.map +1 -1
  5. package/adapters/react/doc.tsx +2 -1
  6. package/adapters/react/input.d.ts +3 -0
  7. package/adapters/react/input.d.ts.map +1 -1
  8. package/adapters/react/input.js +1 -1
  9. package/adapters/react/input.js.map +1 -1
  10. package/adapters/react/input.tsx +4 -1
  11. package/adapters/react/modal.d.ts +2 -0
  12. package/adapters/react/modal.d.ts.map +1 -1
  13. package/adapters/react/modal.js +1 -1
  14. package/adapters/react/modal.js.map +1 -1
  15. package/adapters/react/modal.tsx +3 -1
  16. package/dist/cdn/accordion/snice-accordion.js +1 -1
  17. package/dist/cdn/accordion/snice-accordion.min.js +1 -1
  18. package/dist/cdn/alert/snice-alert.js +1 -1
  19. package/dist/cdn/alert/snice-alert.min.js +1 -1
  20. package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
  21. package/dist/cdn/app-tiles/snice-app-tiles.min.js +1 -1
  22. package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
  23. package/dist/cdn/audio-recorder/snice-audio-recorder.min.js +1 -1
  24. package/dist/cdn/avatar/snice-avatar.js +1 -1
  25. package/dist/cdn/avatar/snice-avatar.min.js +1 -1
  26. package/dist/cdn/badge/snice-badge.js +1 -1
  27. package/dist/cdn/badge/snice-badge.min.js +1 -1
  28. package/dist/cdn/banner/snice-banner.js +1 -1
  29. package/dist/cdn/banner/snice-banner.min.js +1 -1
  30. package/dist/cdn/book/README.md +2 -2
  31. package/dist/cdn/book/snice-book.js +29 -8
  32. package/dist/cdn/book/snice-book.js.map +1 -1
  33. package/dist/cdn/book/snice-book.min.js +3 -3
  34. package/dist/cdn/book/snice-book.min.js.map +1 -1
  35. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
  36. package/dist/cdn/breadcrumbs/snice-breadcrumbs.min.js +1 -1
  37. package/dist/cdn/button/snice-button.js +1 -1
  38. package/dist/cdn/button/snice-button.min.js +1 -1
  39. package/dist/cdn/calendar/snice-calendar.js +1 -1
  40. package/dist/cdn/calendar/snice-calendar.min.js +1 -1
  41. package/dist/cdn/camera/snice-camera.js +1 -1
  42. package/dist/cdn/camera/snice-camera.min.js +1 -1
  43. package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
  44. package/dist/cdn/camera-annotate/snice-camera-annotate.min.js +1 -1
  45. package/dist/cdn/candlestick/snice-candlestick.js +1 -1
  46. package/dist/cdn/candlestick/snice-candlestick.min.js +1 -1
  47. package/dist/cdn/card/snice-card.js +1 -1
  48. package/dist/cdn/card/snice-card.min.js +1 -1
  49. package/dist/cdn/carousel/snice-carousel.js +1 -1
  50. package/dist/cdn/carousel/snice-carousel.min.js +1 -1
  51. package/dist/cdn/chart/snice-chart.js +1 -1
  52. package/dist/cdn/chart/snice-chart.min.js +1 -1
  53. package/dist/cdn/chat/snice-chat.js +1 -1
  54. package/dist/cdn/chat/snice-chat.min.js +1 -1
  55. package/dist/cdn/checkbox/snice-checkbox.js +1 -1
  56. package/dist/cdn/checkbox/snice-checkbox.min.js +1 -1
  57. package/dist/cdn/chip/snice-chip.js +1 -1
  58. package/dist/cdn/chip/snice-chip.min.js +1 -1
  59. package/dist/cdn/code-block/snice-code-block.js +4 -4
  60. package/dist/cdn/code-block/snice-code-block.js.map +1 -1
  61. package/dist/cdn/code-block/snice-code-block.min.js +2 -2
  62. package/dist/cdn/code-block/snice-code-block.min.js.map +1 -1
  63. package/dist/cdn/color-display/snice-color-display.js +1 -1
  64. package/dist/cdn/color-display/snice-color-display.min.js +1 -1
  65. package/dist/cdn/color-picker/snice-color-picker.js +1 -1
  66. package/dist/cdn/color-picker/snice-color-picker.min.js +1 -1
  67. package/dist/cdn/command-palette/snice-command-palette.js +1 -1
  68. package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
  69. package/dist/cdn/comments/snice-comments.js +1 -1
  70. package/dist/cdn/comments/snice-comments.min.js +1 -1
  71. package/dist/cdn/countdown/snice-countdown.js +1 -1
  72. package/dist/cdn/countdown/snice-countdown.min.js +1 -1
  73. package/dist/cdn/cropper/snice-cropper.js +1 -1
  74. package/dist/cdn/cropper/snice-cropper.min.js +1 -1
  75. package/dist/cdn/date-picker/README.md +1 -1
  76. package/dist/cdn/date-picker/snice-date-picker.js +49 -39
  77. package/dist/cdn/date-picker/snice-date-picker.js.map +1 -1
  78. package/dist/cdn/date-picker/snice-date-picker.min.js +4 -4
  79. package/dist/cdn/date-picker/snice-date-picker.min.js.map +1 -1
  80. package/dist/cdn/diff/snice-diff.js +1 -1
  81. package/dist/cdn/diff/snice-diff.min.js +1 -1
  82. package/dist/cdn/divider/snice-divider.js +1 -1
  83. package/dist/cdn/divider/snice-divider.min.js +1 -1
  84. package/dist/cdn/doc/README.md +2 -2
  85. package/dist/cdn/doc/snice-doc.js +221 -35
  86. package/dist/cdn/doc/snice-doc.js.map +1 -1
  87. package/dist/cdn/doc/snice-doc.min.js +2 -2
  88. package/dist/cdn/doc/snice-doc.min.js.map +1 -1
  89. package/dist/cdn/draw/snice-draw.js +1 -1
  90. package/dist/cdn/draw/snice-draw.min.js +1 -1
  91. package/dist/cdn/drawer/snice-drawer.js +1 -1
  92. package/dist/cdn/drawer/snice-drawer.min.js +1 -1
  93. package/dist/cdn/empty-state/snice-empty-state.js +1 -1
  94. package/dist/cdn/empty-state/snice-empty-state.min.js +1 -1
  95. package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
  96. package/dist/cdn/file-gallery/snice-file-gallery.min.js +1 -1
  97. package/dist/cdn/file-upload/snice-file-upload.js +1 -1
  98. package/dist/cdn/file-upload/snice-file-upload.min.js +1 -1
  99. package/dist/cdn/flip-card/snice-flip-card.js +1 -1
  100. package/dist/cdn/flip-card/snice-flip-card.min.js +1 -1
  101. package/dist/cdn/flow/snice-flow.js +1 -1
  102. package/dist/cdn/flow/snice-flow.min.js +1 -1
  103. package/dist/cdn/funnel/snice-funnel.js +1 -1
  104. package/dist/cdn/funnel/snice-funnel.min.js +1 -1
  105. package/dist/cdn/gantt/snice-gantt.js +1 -1
  106. package/dist/cdn/gantt/snice-gantt.min.js +1 -1
  107. package/dist/cdn/gauge/snice-gauge.js +1 -1
  108. package/dist/cdn/gauge/snice-gauge.min.js +1 -1
  109. package/dist/cdn/heatmap/snice-heatmap.js +1 -1
  110. package/dist/cdn/heatmap/snice-heatmap.min.js +1 -1
  111. package/dist/cdn/image/snice-image.js +1 -1
  112. package/dist/cdn/image/snice-image.min.js +1 -1
  113. package/dist/cdn/input/README.md +2 -2
  114. package/dist/cdn/input/snice-input.js +21 -3
  115. package/dist/cdn/input/snice-input.js.map +1 -1
  116. package/dist/cdn/input/snice-input.min.js +3 -3
  117. package/dist/cdn/input/snice-input.min.js.map +1 -1
  118. package/dist/cdn/kanban/snice-kanban.js +1 -1
  119. package/dist/cdn/kanban/snice-kanban.min.js +1 -1
  120. package/dist/cdn/kpi/snice-kpi.js +1 -1
  121. package/dist/cdn/kpi/snice-kpi.min.js +1 -1
  122. package/dist/cdn/layout/snice-layout.js +1 -1
  123. package/dist/cdn/layout/snice-layout.min.js +1 -1
  124. package/dist/cdn/link/snice-link.js +1 -1
  125. package/dist/cdn/link/snice-link.min.js +1 -1
  126. package/dist/cdn/link-preview/snice-link-preview.js +2 -2
  127. package/dist/cdn/link-preview/snice-link-preview.js.map +1 -1
  128. package/dist/cdn/link-preview/snice-link-preview.min.js +2 -2
  129. package/dist/cdn/link-preview/snice-link-preview.min.js.map +1 -1
  130. package/dist/cdn/list/snice-list.js +4 -4
  131. package/dist/cdn/list/snice-list.js.map +1 -1
  132. package/dist/cdn/list/snice-list.min.js +2 -2
  133. package/dist/cdn/list/snice-list.min.js.map +1 -1
  134. package/dist/cdn/location/snice-location.js +1 -1
  135. package/dist/cdn/location/snice-location.min.js +1 -1
  136. package/dist/cdn/login/snice-login.js +1 -1
  137. package/dist/cdn/login/snice-login.min.js +1 -1
  138. package/dist/cdn/map/snice-map.js +1 -1
  139. package/dist/cdn/map/snice-map.min.js +1 -1
  140. package/dist/cdn/markdown/snice-markdown.js +1 -1
  141. package/dist/cdn/markdown/snice-markdown.min.js +1 -1
  142. package/dist/cdn/masonry/snice-masonry.js +1 -1
  143. package/dist/cdn/masonry/snice-masonry.min.js +1 -1
  144. package/dist/cdn/menu/snice-menu.js +2 -2
  145. package/dist/cdn/menu/snice-menu.js.map +1 -1
  146. package/dist/cdn/menu/snice-menu.min.js +2 -2
  147. package/dist/cdn/menu/snice-menu.min.js.map +1 -1
  148. package/dist/cdn/modal/README.md +2 -2
  149. package/dist/cdn/modal/snice-modal.js +34 -18
  150. package/dist/cdn/modal/snice-modal.js.map +1 -1
  151. package/dist/cdn/modal/snice-modal.min.js +24 -20
  152. package/dist/cdn/modal/snice-modal.min.js.map +1 -1
  153. package/dist/cdn/music-player/README.md +2 -2
  154. package/dist/cdn/music-player/snice-music-player.js +8 -1
  155. package/dist/cdn/music-player/snice-music-player.js.map +1 -1
  156. package/dist/cdn/music-player/snice-music-player.min.js +3 -3
  157. package/dist/cdn/music-player/snice-music-player.min.js.map +1 -1
  158. package/dist/cdn/nav/snice-nav.js +1 -1
  159. package/dist/cdn/nav/snice-nav.min.js +1 -1
  160. package/dist/cdn/network-graph/snice-network-graph.js +1 -1
  161. package/dist/cdn/network-graph/snice-network-graph.min.js +1 -1
  162. package/dist/cdn/notification-center/snice-notification-center.js +1 -1
  163. package/dist/cdn/notification-center/snice-notification-center.min.js +1 -1
  164. package/dist/cdn/org-chart/snice-org-chart.js +1 -1
  165. package/dist/cdn/org-chart/snice-org-chart.min.js +1 -1
  166. package/dist/cdn/pagination/snice-pagination.js +1 -1
  167. package/dist/cdn/pagination/snice-pagination.min.js +1 -1
  168. package/dist/cdn/paint/snice-paint.js +1 -1
  169. package/dist/cdn/paint/snice-paint.min.js +1 -1
  170. package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
  171. package/dist/cdn/pdf-viewer/snice-pdf-viewer.min.js +1 -1
  172. package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
  173. package/dist/cdn/podcast-player/snice-podcast-player.min.js +1 -1
  174. package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
  175. package/dist/cdn/pricing-table/snice-pricing-table.min.js +1 -1
  176. package/dist/cdn/progress/snice-progress.js +1 -1
  177. package/dist/cdn/progress/snice-progress.min.js +1 -1
  178. package/dist/cdn/qr-code/snice-qr-code.js +1 -1
  179. package/dist/cdn/qr-code/snice-qr-code.min.js +1 -1
  180. package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
  181. package/dist/cdn/qr-reader/snice-qr-reader.min.js +1 -1
  182. package/dist/cdn/radio/README.md +2 -2
  183. package/dist/cdn/radio/snice-radio.js +23 -3
  184. package/dist/cdn/radio/snice-radio.js.map +1 -1
  185. package/dist/cdn/radio/snice-radio.min.js +3 -3
  186. package/dist/cdn/radio/snice-radio.min.js.map +1 -1
  187. package/dist/cdn/rating/snice-rating.js +1 -1
  188. package/dist/cdn/rating/snice-rating.min.js +1 -1
  189. package/dist/cdn/recipe/snice-recipe.js +1 -1
  190. package/dist/cdn/recipe/snice-recipe.min.js +1 -1
  191. package/dist/cdn/runtime/README.md +2 -2
  192. package/dist/cdn/runtime/snice-runtime.esm.js +513 -46
  193. package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
  194. package/dist/cdn/runtime/snice-runtime.esm.min.js +6 -6
  195. package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
  196. package/dist/cdn/runtime/snice-runtime.js +6420 -5951
  197. package/dist/cdn/runtime/snice-runtime.js.map +1 -1
  198. package/dist/cdn/runtime/snice-runtime.min.js +18 -18
  199. package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
  200. package/dist/cdn/sankey/snice-sankey.js +1 -1
  201. package/dist/cdn/sankey/snice-sankey.min.js +1 -1
  202. package/dist/cdn/select/README.md +2 -2
  203. package/dist/cdn/select/snice-select.js +46 -92
  204. package/dist/cdn/select/snice-select.js.map +1 -1
  205. package/dist/cdn/select/snice-select.min.js +5 -13
  206. package/dist/cdn/select/snice-select.min.js.map +1 -1
  207. package/dist/cdn/skeleton/snice-skeleton.js +1 -1
  208. package/dist/cdn/skeleton/snice-skeleton.min.js +1 -1
  209. package/dist/cdn/slider/snice-slider.js +1 -1
  210. package/dist/cdn/slider/snice-slider.min.js +1 -1
  211. package/dist/cdn/sortable/snice-sortable.js +1 -1
  212. package/dist/cdn/sortable/snice-sortable.min.js +1 -1
  213. package/dist/cdn/sparkline/snice-sparkline.js +1 -1
  214. package/dist/cdn/sparkline/snice-sparkline.min.js +1 -1
  215. package/dist/cdn/spinner/snice-spinner.js +1 -1
  216. package/dist/cdn/spinner/snice-spinner.min.js +1 -1
  217. package/dist/cdn/split-pane/snice-split-pane.js +1 -1
  218. package/dist/cdn/split-pane/snice-split-pane.min.js +1 -1
  219. package/dist/cdn/spotlight/snice-spotlight.js +1 -1
  220. package/dist/cdn/spotlight/snice-spotlight.min.js +1 -1
  221. package/dist/cdn/spreadsheet/snice-spreadsheet.js +1 -1
  222. package/dist/cdn/spreadsheet/snice-spreadsheet.min.js +1 -1
  223. package/dist/cdn/stepper/snice-stepper.js +1 -1
  224. package/dist/cdn/stepper/snice-stepper.min.js +1 -1
  225. package/dist/cdn/switch/README.md +1 -1
  226. package/dist/cdn/switch/snice-switch.js +33 -23
  227. package/dist/cdn/switch/snice-switch.js.map +1 -1
  228. package/dist/cdn/switch/snice-switch.min.js +3 -3
  229. package/dist/cdn/switch/snice-switch.min.js.map +1 -1
  230. package/dist/cdn/table/README.md +2 -2
  231. package/dist/cdn/table/snice-table.js +2876 -111
  232. package/dist/cdn/table/snice-table.js.map +1 -1
  233. package/dist/cdn/table/snice-table.min.js +187 -47
  234. package/dist/cdn/table/snice-table.min.js.map +1 -1
  235. package/dist/cdn/tabs/snice-tabs.js +1 -1
  236. package/dist/cdn/tabs/snice-tabs.min.js +1 -1
  237. package/dist/cdn/tag-input/snice-tag-input.js +1 -1
  238. package/dist/cdn/tag-input/snice-tag-input.min.js +1 -1
  239. package/dist/cdn/terminal/snice-terminal.js +1 -1
  240. package/dist/cdn/terminal/snice-terminal.min.js +1 -1
  241. package/dist/cdn/testimonial/snice-testimonial.js +1 -1
  242. package/dist/cdn/testimonial/snice-testimonial.min.js +1 -1
  243. package/dist/cdn/textarea/snice-textarea.js +1 -1
  244. package/dist/cdn/textarea/snice-textarea.min.js +1 -1
  245. package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
  246. package/dist/cdn/time-range-picker/snice-time-range-picker.min.js +1 -1
  247. package/dist/cdn/timeline/snice-timeline.js +1 -1
  248. package/dist/cdn/timeline/snice-timeline.min.js +1 -1
  249. package/dist/cdn/timer/snice-timer.js +1 -1
  250. package/dist/cdn/timer/snice-timer.min.js +1 -1
  251. package/dist/cdn/toast/README.md +1 -1
  252. package/dist/cdn/toast/snice-toast.js +3 -3
  253. package/dist/cdn/toast/snice-toast.js.map +1 -1
  254. package/dist/cdn/toast/snice-toast.min.js +2 -2
  255. package/dist/cdn/toast/snice-toast.min.js.map +1 -1
  256. package/dist/cdn/tooltip/snice-tooltip.js +1 -1
  257. package/dist/cdn/tooltip/snice-tooltip.min.js +1 -1
  258. package/dist/cdn/tree/snice-tree.js +1 -1
  259. package/dist/cdn/tree/snice-tree.min.js +1 -1
  260. package/dist/cdn/treemap/snice-treemap.js +1 -1
  261. package/dist/cdn/treemap/snice-treemap.min.js +1 -1
  262. package/dist/cdn/video-player/snice-video-player.js +1 -1
  263. package/dist/cdn/video-player/snice-video-player.min.js +1 -1
  264. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
  265. package/dist/cdn/virtual-scroller/snice-virtual-scroller.min.js +1 -1
  266. package/dist/cdn/waterfall/snice-waterfall.js +1 -1
  267. package/dist/cdn/waterfall/snice-waterfall.min.js +1 -1
  268. package/dist/cdn/weather/snice-weather.js +1 -1
  269. package/dist/cdn/weather/snice-weather.min.js +1 -1
  270. package/dist/components/book/snice-book.d.ts +2 -0
  271. package/dist/components/book/snice-book.js +28 -7
  272. package/dist/components/book/snice-book.js.map +1 -1
  273. package/dist/components/book/snice-book.types.d.ts +7 -0
  274. package/dist/components/code-block/snice-code-block.js +3 -3
  275. package/dist/components/code-block/snice-code-block.js.map +1 -1
  276. package/dist/components/code-block/snice-code-block.types.d.ts +3 -3
  277. package/dist/components/date-picker/snice-date-picker.d.ts +2 -0
  278. package/dist/components/date-picker/snice-date-picker.js +49 -39
  279. package/dist/components/date-picker/snice-date-picker.js.map +1 -1
  280. package/dist/components/doc/snice-doc.d.ts +20 -0
  281. package/dist/components/doc/snice-doc.js +220 -34
  282. package/dist/components/doc/snice-doc.js.map +1 -1
  283. package/dist/components/input/snice-input.d.ts +3 -0
  284. package/dist/components/input/snice-input.js +20 -2
  285. package/dist/components/input/snice-input.js.map +1 -1
  286. package/dist/components/input/snice-input.types.d.ts +3 -0
  287. package/dist/components/link-preview/snice-link-preview.js +1 -1
  288. package/dist/components/link-preview/snice-link-preview.js.map +1 -1
  289. package/dist/components/list/snice-list.js +3 -3
  290. package/dist/components/list/snice-list.js.map +1 -1
  291. package/dist/components/menu/snice-menu.js +1 -1
  292. package/dist/components/menu/snice-menu.js.map +1 -1
  293. package/dist/components/modal/snice-modal.d.ts +2 -0
  294. package/dist/components/modal/snice-modal.js +33 -17
  295. package/dist/components/modal/snice-modal.js.map +1 -1
  296. package/dist/components/modal/snice-modal.types.d.ts +2 -0
  297. package/dist/components/music-player/snice-music-player.d.ts +1 -0
  298. package/dist/components/music-player/snice-music-player.js +7 -0
  299. package/dist/components/music-player/snice-music-player.js.map +1 -1
  300. package/dist/components/notification-center/snice-notification-center.d.ts +1 -1
  301. package/dist/components/notification-center/snice-notification-center.js.map +1 -1
  302. package/dist/components/notification-center/snice-notification-center.types.d.ts +1 -0
  303. package/dist/components/radio/snice-radio.d.ts +1 -0
  304. package/dist/components/radio/snice-radio.js +22 -2
  305. package/dist/components/radio/snice-radio.js.map +1 -1
  306. package/dist/components/select/snice-select.d.ts +2 -4
  307. package/dist/components/select/snice-select.js +46 -92
  308. package/dist/components/select/snice-select.js.map +1 -1
  309. package/dist/components/switch/snice-switch.d.ts +2 -0
  310. package/dist/components/switch/snice-switch.js +32 -22
  311. package/dist/components/switch/snice-switch.js.map +1 -1
  312. package/dist/components/table/snice-table.d.ts +2 -0
  313. package/dist/components/table/snice-table.js +17 -3
  314. package/dist/components/table/snice-table.js.map +1 -1
  315. package/dist/components/toast/snice-toast-container.js +2 -2
  316. package/dist/components/toast/snice-toast-container.js.map +1 -1
  317. package/dist/index.cjs +512 -43
  318. package/dist/index.cjs.map +1 -1
  319. package/dist/index.d.ts +1 -0
  320. package/dist/index.esm.js +511 -44
  321. package/dist/index.esm.js.map +1 -1
  322. package/dist/index.iife.js +512 -43
  323. package/dist/index.iife.js.map +1 -1
  324. package/dist/symbols.cjs +1 -1
  325. package/dist/symbols.esm.js +1 -1
  326. package/dist/tooltip-observer.d.ts +11 -0
  327. package/dist/transitions.cjs +1 -1
  328. package/dist/transitions.esm.js +1 -1
  329. package/docs/ai/DEVELOPMENT.md +1 -1
  330. package/docs/ai/api.md +14 -10
  331. package/docs/ai/architecture.md +18 -5
  332. package/docs/ai/components/app-tiles.md +1 -1
  333. package/docs/ai/components/book.md +5 -6
  334. package/docs/ai/components/camera-annotate.md +3 -3
  335. package/docs/ai/components/candlestick.md +3 -3
  336. package/docs/ai/components/chart.md +1 -1
  337. package/docs/ai/components/code-block.md +3 -3
  338. package/docs/ai/components/doc.md +26 -15
  339. package/docs/ai/components/file-gallery.md +1 -1
  340. package/docs/ai/components/input.md +10 -0
  341. package/docs/ai/components/link-preview.md +1 -1
  342. package/docs/ai/components/list.md +2 -2
  343. package/docs/ai/components/markdown.md +13 -6
  344. package/docs/ai/components/modal.md +2 -0
  345. package/docs/ai/components/music-player.md +3 -2
  346. package/docs/ai/components/network-graph.md +5 -5
  347. package/docs/ai/components/notification-center.md +1 -0
  348. package/docs/ai/components/pdf-viewer.md +1 -1
  349. package/docs/ai/components/radio.md +2 -2
  350. package/docs/ai/components/sankey.md +3 -3
  351. package/docs/ai/components/select.md +1 -1
  352. package/docs/ai/components/tooltip.md +54 -0
  353. package/docs/ai/decorators.md +4 -4
  354. package/docs/code-block.md +4 -4
  355. package/docs/components/app-tiles.md +1 -1
  356. package/docs/components/book.md +3 -4
  357. package/docs/components/button.md +2 -2
  358. package/docs/components/camera-annotate.md +6 -6
  359. package/docs/components/candlestick.md +6 -6
  360. package/docs/components/chart.md +4 -6
  361. package/docs/components/checkbox.md +3 -3
  362. package/docs/components/chip.md +4 -4
  363. package/docs/components/code-block.md +4 -3
  364. package/docs/components/doc.md +99 -58
  365. package/docs/components/file-gallery.md +25 -3
  366. package/docs/components/input.md +20 -0
  367. package/docs/components/kpi.md +2 -3
  368. package/docs/components/link-preview.md +2 -2
  369. package/docs/components/list.md +3 -3
  370. package/docs/components/markdown.md +14 -36
  371. package/docs/components/modal.md +2 -0
  372. package/docs/components/music-player.md +3 -2
  373. package/docs/components/network-graph.md +7 -7
  374. package/docs/components/notification-center.md +1 -0
  375. package/docs/components/pdf-viewer.md +1 -1
  376. package/docs/components/sankey.md +6 -6
  377. package/docs/components/switch.md +1 -1
  378. package/docs/components/table.md +2 -2
  379. package/docs/components/tooltip.md +133 -0
  380. package/docs/controllers.md +3 -14
  381. package/docs/elements.md +0 -1
  382. package/docs/events.md +3 -0
  383. package/docs/request-response.md +2 -0
  384. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v4.13.0
2
+ * snice v4.15.0
3
3
  * Imperative TypeScript framework for building vanilla web components with decorators, differential rendering, routing, and controllers. No virtual DOM, no build complexity.
4
4
  * (c) 2024
5
5
  * Released under the MIT License.
@@ -64,8 +64,28 @@ var SniceDoc = (function (exports, snice) {
64
64
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
65
65
  };
66
66
 
67
- var cssContent = ":host{display:block;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Noto Sans',Helvetica,Arial,sans-serif;font-size:16px;line-height:1.6;color:var(--snice-doc-text-color,#333);background:var(--snice-doc-background,#fff);height:100%;min-height:600px}.doc-wrapper{display:flex;flex-direction:column;height:100%}.toolbar{display:flex;gap:4px;padding:8px 12px;background:var(--snice-doc-sidebar-background,#f6f8fa);border-bottom:1px solid var(--snice-doc-border,#e1e4e8);flex-wrap:wrap}.toolbar-btn{padding:6px 12px;border:1px solid var(--snice-doc-border,#e1e4e8);background:var(--snice-doc-background,#fff);border-radius:4px;cursor:pointer;font-weight:600;font-size:14px;color:var(--snice-doc-text-color,#333);transition:.2s;min-width:32px;text-align:center}.toolbar-btn:hover{background:var(--snice-doc-menu-hover,#e8eaed);border-color:var(--snice-doc-primary-color,#0969da)}.toolbar-btn:active{transform:translateY(1px)}.toolbar-divider{width:1px;background:var(--snice-doc-border,#e1e4e8);margin:0 4px}.doc-main{display:flex;flex:1;overflow:hidden}.doc-sidebar{width:200px;background:var(--snice-doc-sidebar-background,#f6f8fa);border-right:1px solid var(--snice-doc-border,#e1e4e8);padding:16px 0;flex-shrink:0;transition:width .3s;position:relative}.doc-sidebar.collapsed{width:50px}.sidebar-toggle{position:absolute;top:10px;right:10px;background:var(--snice-doc-background,#fff);border:1px solid var(--snice-doc-border,#e1e4e8);border-radius:4px;width:28px;height:28px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--snice-doc-text-color,#333);transition:background .2s}.sidebar-toggle:hover{background:var(--snice-doc-menu-hover,#e1e4e8)}.sidebar-header{font-weight:600;font-size:12px;color:var(--snice-doc-muted-color,#666);text-transform:uppercase;padding:0 16px 8px;margin-bottom:8px;border-bottom:1px solid var(--snice-doc-border,#e1e4e8)}.sidebar-item{display:flex;align-items:center;gap:12px;padding:10px 16px;border:none;background:0 0;cursor:pointer;width:100%;text-align:left;font-size:14px;color:var(--snice-doc-text-color,#333);transition:background .2s}.sidebar-item:hover{background:var(--snice-doc-background,#fff)}.sidebar-icon{font-size:18px;width:24px;text-align:center}.doc-editor{flex:1;padding:60px 100px;overflow-y:auto;outline:0;max-width:850px;margin:0 auto;width:100%}.doc-editor:empty:before{content:attr(data-placeholder);color:var(--snice-doc-placeholder-color,#999);pointer-events:none}.doc-editor p{margin:0 0 12px;min-height:1.6em}.doc-editor h1{font-size:2em;font-weight:700;line-height:1.2;margin:24px 0 16px}.doc-editor h2{font-size:1.5em;font-weight:700;line-height:1.3;margin:20px 0 12px}.doc-editor h3{font-size:1.25em;font-weight:700;line-height:1.4;margin:16px 0 8px}.doc-editor ol,.doc-editor ul{margin:0 0 12px;padding-left:30px}.doc-editor li{margin:4px 0}.doc-editor code{font-family:Monaco,Menlo,'Ubuntu Mono',Consolas,monospace;font-size:.9em;background:var(--snice-doc-inline-code-background,rgba(175,184,193,.2));padding:2px 6px;border-radius:3px}.doc-editor a{color:var(--snice-doc-link-color,#0969da);text-decoration:underline}.doc-editor img{max-width:100%;height:auto;display:block;margin:16px 0;border-radius:4px}.doc-editor table{border-collapse:collapse;width:100%;margin:16px 0}.doc-editor table td,.doc-editor table th{border:1px solid var(--snice-doc-border,#e1e4e8);padding:8px 12px}.doc-editor table th{background:var(--snice-doc-sidebar-background,#f6f8fa);font-weight:600}.doc-editor hr{margin:20px 0;border:none;border-top:1px solid var(--snice-doc-border,#e1e4e8)}:host([readonly]) .doc-sidebar,:host([readonly]) .toolbar{display:none}:host([readonly]) .doc-editor{cursor:default}";
67
+ var cssContent = ":host{display:block;font-family:var(--snice-doc-font-family, var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif));font-size:var(--snice-doc-font-size, var(--snice-font-size-md, 16px));line-height:var(--snice-line-height-loose, 1.6);color:var(--snice-doc-text-color,var(--snice-color-text,#333));background:var(--snice-doc-background,var(--snice-color-background,#fff));height:100%;min-height:600px}.doc-wrapper{display:flex;flex-direction:column;height:100%}.toolbar{display:flex;gap:var(--snice-spacing-2xs,4px);padding:var(--snice-spacing-xs,8px) var(--snice-spacing-sm,12px);background:var(--snice-doc-toolbar-background,var(--snice-color-background-secondary,#f6f8fa));border-bottom:1px solid var(--snice-doc-border,var(--snice-color-border,#e1e4e8));flex-wrap:wrap;position:relative}.toolbar-btn{display:inline-flex;align-items:center;justify-content:center;padding:6px 12px;border:1px solid var(--snice-doc-border,var(--snice-color-border,#e1e4e8));background:var(--snice-doc-background,var(--snice-color-background,#fff));border-radius:var(--snice-border-radius-md,4px);cursor:pointer;font-weight:var(--snice-font-weight-semibold,600);font-size:var(--snice-font-size-sm, 14px);color:var(--snice-doc-text-color,var(--snice-color-text,#333));transition:all var(--snice-transition-fast, 150ms);min-width:32px;min-height:32px}.toolbar-btn:hover{background:var(--snice-doc-hover-background,var(--snice-color-background-hover,#e8eaed));border-color:var(--snice-doc-primary-color,var(--snice-color-primary,#0969da))}.toolbar-btn:active{transform:translateY(1px)}.toolbar-divider{width:1px;background:var(--snice-doc-border,var(--snice-color-border,#e1e4e8));margin:0 var(--snice-spacing-2xs,4px)}.doc-main{display:flex;flex:1;overflow:hidden}.doc-sidebar{width:200px;background:var(--snice-doc-sidebar-background,var(--snice-color-background-secondary,#f6f8fa));border-right:1px solid var(--snice-doc-border,var(--snice-color-border,#e1e4e8));padding:var(--snice-spacing-md,16px) 0;flex-shrink:0;transition:width .3s;position:relative}.doc-sidebar.collapsed{width:50px}.sidebar-toggle{position:absolute;top:10px;right:10px;background:var(--snice-doc-background,var(--snice-color-background,#fff));border:1px solid var(--snice-doc-border,var(--snice-color-border,#e1e4e8));border-radius:var(--snice-border-radius-md,4px);width:28px;height:28px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:var(--snice-font-size-sm, 14px);color:var(--snice-doc-text-color,var(--snice-color-text,#333));transition:background var(--snice-transition-fast, 150ms)}.sidebar-toggle:hover{background:var(--snice-doc-hover-background,var(--snice-color-background-hover,#e1e4e8))}.sidebar-header{font-weight:var(--snice-font-weight-semibold,600);font-size:var(--snice-font-size-xs, 12px);color:var(--snice-doc-muted-color,var(--snice-color-text-secondary,#666));text-transform:uppercase;padding:0 var(--snice-spacing-md,16px) var(--snice-spacing-xs,8px);margin-bottom:var(--snice-spacing-xs,8px);border-bottom:1px solid var(--snice-doc-border,var(--snice-color-border,#e1e4e8))}.sidebar-item{display:flex;align-items:center;gap:var(--snice-spacing-sm,12px);padding:10px var(--snice-spacing-md,16px);border:none;background:0 0;cursor:pointer;width:100%;text-align:left;font-size:var(--snice-font-size-sm, 14px);color:var(--snice-doc-text-color,var(--snice-color-text,#333));transition:background var(--snice-transition-fast, 150ms)}.sidebar-item:hover{background:var(--snice-doc-hover-background,var(--snice-color-background-hover,#f0f0f0))}.sidebar-icon{font-size:18px;width:24px;text-align:center}.doc-editor{flex:1;padding:60px 100px;overflow-y:auto;outline:0;max-width:850px;margin:0 auto;width:100%}.doc-editor:empty:before{content:attr(data-placeholder);color:var(--snice-doc-placeholder-color,var(--snice-color-text-tertiary,#999));pointer-events:none}.doc-editor p{margin:0 0 var(--snice-spacing-sm,12px);min-height:1.6em}.doc-editor h1{font-size:2em;font-weight:var(--snice-font-weight-bold,700);line-height:var(--snice-line-height-dense, 1.2);margin:var(--snice-spacing-lg,24px) 0 var(--snice-spacing-md,16px)}.doc-editor h2{font-size:1.5em;font-weight:var(--snice-font-weight-bold,700);line-height:1.3;margin:20px 0 var(--snice-spacing-sm,12px)}.doc-editor h3{font-size:1.25em;font-weight:var(--snice-font-weight-bold,700);line-height:1.4;margin:var(--snice-spacing-md,16px) 0 var(--snice-spacing-xs,8px)}.doc-editor ol,.doc-editor ul{margin:0 0 var(--snice-spacing-sm,12px);padding-left:30px}.doc-editor li{margin:var(--snice-spacing-2xs,4px) 0}.doc-editor code{font-family:var(--snice-font-family-mono, 'Monaco', 'Menlo', 'Consolas', monospace);font-size:.9em;background:var(--snice-doc-inline-code-background,var(--snice-color-background-tertiary,rgba(175,184,193,.2)));padding:2px 6px;border-radius:var(--snice-border-radius-sm,3px)}.doc-editor a{color:var(--snice-doc-link-color,var(--snice-color-primary,#0969da));text-decoration:underline}.doc-editor img{max-width:100%;height:auto;display:block;margin:var(--snice-spacing-md,16px) 0;border-radius:var(--snice-border-radius-md,4px)}.doc-editor table{border-collapse:collapse;width:100%;margin:var(--snice-spacing-md,16px) 0}.doc-editor table td,.doc-editor table th{border:1px solid var(--snice-doc-border,var(--snice-color-border,#e1e4e8));padding:var(--snice-spacing-xs,8px) var(--snice-spacing-sm,12px)}.doc-editor table th{background:var(--snice-doc-sidebar-background,var(--snice-color-background-secondary,#f6f8fa));font-weight:var(--snice-font-weight-semibold,600)}.doc-editor hr{margin:20px 0;border:none;border-top:1px solid var(--snice-doc-border,var(--snice-color-border,#e1e4e8))}.download-menu{position:absolute;right:var(--snice-spacing-sm,12px);top:100%;background:var(--snice-doc-background,var(--snice-color-background,#fff));border:1px solid var(--snice-doc-border,var(--snice-color-border,#e1e4e8));border-radius:var(--snice-border-radius-lg,6px);box-shadow:var(--snice-shadow-md,0 4px 12px rgba(0,0,0,.15));z-index:var(--snice-z-index-dropdown,100);min-width:160px;padding:var(--snice-spacing-2xs,4px)}.download-menu-item{display:block;width:100%;padding:var(--snice-spacing-xs,8px) var(--snice-spacing-sm,12px);border:none;background:0 0;text-align:left;font-size:var(--snice-font-size-sm, 14px);color:var(--snice-doc-text-color,var(--snice-color-text,#333));cursor:pointer;border-radius:var(--snice-border-radius-md,4px)}.download-menu-item:hover{background:var(--snice-doc-hover-background,var(--snice-color-background-hover,#e8eaed))}.toolbar-btn .icon--material{font-family:'Material Symbols Outlined',sans-serif;font-size:20px;font-weight:400;font-style:normal;line-height:1;letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-smoothing:antialiased}.toolbar-btn .icon--fa{font-size:var(--snice-font-size-sm, 14px)}:host([readonly]) .doc-sidebar,:host([readonly]) .toolbar{display:none}:host([readonly]) .doc-editor{cursor:default}";
68
68
 
69
+ const ICON_MAP = {
70
+ default: {
71
+ bold: 'B', italic: 'I', underline: 'U', strikethrough: 'S',
72
+ h1: 'H1', h2: 'H2', h3: 'H3', paragraph: 'P',
73
+ 'bullet-list': '•', 'numbered-list': '1.',
74
+ link: '🔗', image: '🖼', table: '📊', divider: '―', download: '⬇'
75
+ },
76
+ material: {
77
+ bold: 'format_bold', italic: 'format_italic', underline: 'format_underlined', strikethrough: 'strikethrough_s',
78
+ h1: 'looks_one', h2: 'looks_two', h3: 'looks_3', paragraph: 'notes',
79
+ 'bullet-list': 'format_list_bulleted', 'numbered-list': 'format_list_numbered',
80
+ link: 'link', image: 'image', table: 'table_chart', divider: 'horizontal_rule', download: 'download'
81
+ },
82
+ fontawesome: {
83
+ bold: 'fa-bold', italic: 'fa-italic', underline: 'fa-underline', strikethrough: 'fa-strikethrough',
84
+ h1: 'fa-heading', h2: 'fa-heading', h3: 'fa-heading', paragraph: 'fa-paragraph',
85
+ 'bullet-list': 'fa-list-ul', 'numbered-list': 'fa-list-ol',
86
+ link: 'fa-link', image: 'fa-image', table: 'fa-table', divider: 'fa-minus', download: 'fa-download'
87
+ }
88
+ };
69
89
  /**
70
90
  * snice-doc - Simple document editor
71
91
  */
@@ -82,6 +102,9 @@ var SniceDoc = (function (exports, snice) {
82
102
  let _readonly_decorators;
83
103
  let _readonly_initializers = [];
84
104
  let _readonly_extraInitializers = [];
105
+ let _icons_decorators;
106
+ let _icons_initializers = [];
107
+ let _icons_extraInitializers = [];
85
108
  let _styles_decorators;
86
109
  let _init_decorators;
87
110
  let _cleanup_decorators;
@@ -91,7 +114,8 @@ var SniceDoc = (function (exports, snice) {
91
114
  super(...arguments);
92
115
  this.placeholder = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _placeholder_initializers, 'Start typing...'));
93
116
  this.readonly = (__runInitializers(this, _placeholder_extraInitializers), __runInitializers(this, _readonly_initializers, false));
94
- this.editor = __runInitializers(this, _readonly_extraInitializers);
117
+ this.icons = (__runInitializers(this, _readonly_extraInitializers), __runInitializers(this, _icons_initializers, 'default'));
118
+ this.editor = __runInitializers(this, _icons_extraInitializers);
95
119
  this.showFormatToolbar = false;
96
120
  this.formatToolbarPosition = null;
97
121
  this.savedSelection = null;
@@ -135,12 +159,10 @@ var SniceDoc = (function (exports, snice) {
135
159
  const selection = window.getSelection();
136
160
  if (selection && selection.rangeCount > 0) {
137
161
  const range = selection.getRangeAt(0);
138
- // Just save it - we'll validate when restoring
139
162
  this.savedSelection = range.cloneRange();
140
163
  }
141
164
  };
142
165
  this.saveSelectionBeforeAction = (e) => {
143
- // Save selection before clicking toolbar/sidebar buttons
144
166
  this.saveCurrentSelection();
145
167
  };
146
168
  this.handleSelectionChange = () => {
@@ -148,18 +170,17 @@ var SniceDoc = (function (exports, snice) {
148
170
  if (!selection || selection.isCollapsed || selection.rangeCount === 0) {
149
171
  return;
150
172
  }
151
- // Check if selection is within our editor
152
173
  const range = selection.getRangeAt(0);
153
174
  if (!this.editor.contains(range.commonAncestorContainer)) {
154
175
  return;
155
176
  }
156
- // Could add floating toolbar here if desired
157
177
  };
158
178
  }
159
179
  static {
160
180
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
161
181
  _placeholder_decorators = [snice.property({ type: String })];
162
182
  _readonly_decorators = [snice.property({ type: Boolean })];
183
+ _icons_decorators = [snice.property({ type: String })];
163
184
  _styles_decorators = [snice.styles()];
164
185
  _init_decorators = [snice.ready()];
165
186
  _cleanup_decorators = [snice.dispose()];
@@ -168,6 +189,7 @@ var SniceDoc = (function (exports, snice) {
168
189
  __esDecorate(this, null, _cleanup_decorators, { kind: "method", name: "cleanup", static: false, private: false, access: { has: obj => "cleanup" in obj, get: obj => obj.cleanup }, metadata: _metadata }, null, _instanceExtraInitializers);
169
190
  __esDecorate(null, null, _placeholder_decorators, { kind: "field", name: "placeholder", static: false, private: false, access: { has: obj => "placeholder" in obj, get: obj => obj.placeholder, set: (obj, value) => { obj.placeholder = value; } }, metadata: _metadata }, _placeholder_initializers, _placeholder_extraInitializers);
170
191
  __esDecorate(null, null, _readonly_decorators, { kind: "field", name: "readonly", static: false, private: false, access: { has: obj => "readonly" in obj, get: obj => obj.readonly, set: (obj, value) => { obj.readonly = value; } }, metadata: _metadata }, _readonly_initializers, _readonly_extraInitializers);
192
+ __esDecorate(null, null, _icons_decorators, { kind: "field", name: "icons", static: false, private: false, access: { has: obj => "icons" in obj, get: obj => obj.icons, set: (obj, value) => { obj.icons = value; } }, metadata: _metadata }, _icons_initializers, _icons_extraInitializers);
171
193
  __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
172
194
  _classThis = _classDescriptor.value;
173
195
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
@@ -179,7 +201,6 @@ var SniceDoc = (function (exports, snice) {
179
201
  init() {
180
202
  this.initializeDOM();
181
203
  document.addEventListener('selectionchange', this.handleSelectionChange);
182
- // Save selection whenever editor loses focus
183
204
  this.editor.addEventListener('blur', this.saveCurrentSelection);
184
205
  }
185
206
  cleanup() {
@@ -191,17 +212,14 @@ var SniceDoc = (function (exports, snice) {
191
212
  return;
192
213
  const wrapper = document.createElement('div');
193
214
  wrapper.className = 'doc-wrapper';
194
- // Create toolbar
195
215
  const toolbar = this.createToolbar();
196
216
  wrapper.appendChild(toolbar);
197
- // Create editor
198
217
  this.editor = document.createElement('div');
199
218
  this.editor.className = 'doc-editor';
200
219
  this.editor.contentEditable = String(!this.readonly);
201
220
  this.editor.setAttribute('data-placeholder', this.placeholder);
202
- // Add default paragraph
203
221
  const p = document.createElement('p');
204
- p.innerHTML = '<br>'; // Placeholder for empty paragraph
222
+ p.innerHTML = '<br>';
205
223
  this.editor.appendChild(p);
206
224
  this.editor.addEventListener('paste', this.handlePaste);
207
225
  this.editor.addEventListener('keyup', this.saveCurrentSelection);
@@ -210,27 +228,53 @@ var SniceDoc = (function (exports, snice) {
210
228
  wrapper.appendChild(this.editor);
211
229
  this.shadowRoot.appendChild(wrapper);
212
230
  }
231
+ createToolbarButton(icon, title) {
232
+ const btn = document.createElement('button');
233
+ btn.className = 'toolbar-btn';
234
+ btn.title = title;
235
+ const map = ICON_MAP[this.icons];
236
+ const iconValue = map[icon] || icon;
237
+ if (this.icons === 'material') {
238
+ const span = document.createElement('span');
239
+ span.className = 'icon--material';
240
+ span.setAttribute('part', 'icon');
241
+ span.textContent = iconValue;
242
+ btn.appendChild(span);
243
+ }
244
+ else if (this.icons === 'fontawesome') {
245
+ const i = document.createElement('i');
246
+ i.className = `icon--fa fa-solid ${iconValue}`;
247
+ i.setAttribute('part', 'icon');
248
+ btn.appendChild(i);
249
+ }
250
+ else {
251
+ btn.textContent = iconValue;
252
+ }
253
+ return btn;
254
+ }
213
255
  createToolbar() {
214
256
  const toolbar = document.createElement('div');
215
257
  toolbar.className = 'toolbar';
216
258
  const tools = [
217
- { cmd: 'bold', label: 'B', title: 'Bold (Ctrl+B)' },
218
- { cmd: 'italic', label: 'I', title: 'Italic (Ctrl+I)' },
219
- { cmd: 'underline', label: 'U', title: 'Underline (Ctrl+U)' },
220
- { cmd: 'strikeThrough', label: 'S', title: 'Strikethrough' },
259
+ { cmd: 'bold', icon: 'bold', title: 'Bold (Ctrl+B)' },
260
+ { cmd: 'italic', icon: 'italic', title: 'Italic (Ctrl+I)' },
261
+ { cmd: 'underline', icon: 'underline', title: 'Underline (Ctrl+U)' },
262
+ { cmd: 'strikeThrough', icon: 'strikethrough', title: 'Strikethrough' },
263
+ { cmd: 'divider' },
264
+ { cmd: 'formatBlock', value: 'h1', icon: 'h1', title: 'Heading 1' },
265
+ { cmd: 'formatBlock', value: 'h2', icon: 'h2', title: 'Heading 2' },
266
+ { cmd: 'formatBlock', value: 'h3', icon: 'h3', title: 'Heading 3' },
267
+ { cmd: 'formatBlock', value: 'p', icon: 'paragraph', title: 'Paragraph' },
221
268
  { cmd: 'divider' },
222
- { cmd: 'formatBlock', value: 'h1', label: 'H1', title: 'Heading 1' },
223
- { cmd: 'formatBlock', value: 'h2', label: 'H2', title: 'Heading 2' },
224
- { cmd: 'formatBlock', value: 'h3', label: 'H3', title: 'Heading 3' },
225
- { cmd: 'formatBlock', value: 'p', label: 'P', title: 'Paragraph' },
269
+ { cmd: 'insertUnorderedList', icon: 'bullet-list', title: 'Bullet List' },
270
+ { cmd: 'insertOrderedList', icon: 'numbered-list', title: 'Numbered List' },
226
271
  { cmd: 'divider' },
227
- { cmd: 'insertUnorderedList', label: '', title: 'Bullet List' },
228
- { cmd: 'insertOrderedList', label: '1.', title: 'Numbered List' },
272
+ { cmd: 'createLink', icon: 'link', title: 'Insert Link' },
273
+ { cmd: 'insertImage', icon: 'image', title: 'Insert Image' },
274
+ { cmd: 'insertTable', icon: 'table', title: 'Insert Table' },
275
+ { cmd: 'insertDivider', icon: 'divider', title: 'Insert Divider' },
229
276
  { cmd: 'divider' },
230
- { cmd: 'createLink', label: '🔗', title: 'Insert Link' },
231
- { cmd: 'insertImage', label: '🖼', title: 'Insert Image' },
232
- { cmd: 'insertTable', label: '📊', title: 'Insert Table' },
233
- { cmd: 'insertDivider', label: '―', title: 'Insert Divider' },
277
+ { cmd: 'download', icon: 'download', title: 'Download' },
234
278
  ];
235
279
  tools.forEach(tool => {
236
280
  if (tool.cmd === 'divider') {
@@ -239,10 +283,7 @@ var SniceDoc = (function (exports, snice) {
239
283
  toolbar.appendChild(divider);
240
284
  }
241
285
  else {
242
- const btn = document.createElement('button');
243
- btn.className = 'toolbar-btn';
244
- btn.textContent = tool.label || '';
245
- btn.title = tool.title || '';
286
+ const btn = this.createToolbarButton(tool.icon, tool.title);
246
287
  btn.addEventListener('click', () => this.execCommand(tool.cmd, tool.value));
247
288
  toolbar.appendChild(btn);
248
289
  }
@@ -251,6 +292,10 @@ var SniceDoc = (function (exports, snice) {
251
292
  return toolbar;
252
293
  }
253
294
  execCommand(cmd, value) {
295
+ if (cmd === 'download') {
296
+ this.showDownloadMenu();
297
+ return;
298
+ }
254
299
  this.editor.focus();
255
300
  switch (cmd) {
256
301
  case 'createLink':
@@ -270,6 +315,41 @@ var SniceDoc = (function (exports, snice) {
270
315
  break;
271
316
  }
272
317
  }
318
+ showDownloadMenu() {
319
+ const existing = this.shadowRoot?.querySelector('.download-menu');
320
+ if (existing) {
321
+ existing.remove();
322
+ return;
323
+ }
324
+ const menu = document.createElement('div');
325
+ menu.className = 'download-menu';
326
+ const formats = [
327
+ { format: 'html', label: 'HTML (.html)' },
328
+ { format: 'markdown', label: 'Markdown (.md)' },
329
+ { format: 'text', label: 'Plain Text (.txt)' },
330
+ ];
331
+ formats.forEach(f => {
332
+ const item = document.createElement('button');
333
+ item.className = 'download-menu-item';
334
+ item.textContent = f.label;
335
+ item.addEventListener('click', () => {
336
+ this.downloadAs(f.format);
337
+ menu.remove();
338
+ });
339
+ menu.appendChild(item);
340
+ });
341
+ const toolbar = this.shadowRoot?.querySelector('.toolbar');
342
+ if (toolbar) {
343
+ toolbar.appendChild(menu);
344
+ }
345
+ const closeHandler = (e) => {
346
+ if (!menu.contains(e.target)) {
347
+ menu.remove();
348
+ document.removeEventListener('click', closeHandler);
349
+ }
350
+ };
351
+ setTimeout(() => document.addEventListener('click', closeHandler), 0);
352
+ }
273
353
  showLinkDialog() {
274
354
  const dialog = document.createElement('snice-modal');
275
355
  dialog.setAttribute('title', 'Insert Link');
@@ -306,7 +386,6 @@ var SniceDoc = (function (exports, snice) {
306
386
  content.appendChild(actions);
307
387
  dialog.appendChild(content);
308
388
  document.body.appendChild(dialog);
309
- // Wait for components to be ready, then show modal
310
389
  customElements.whenDefined('snice-modal').then(() => {
311
390
  requestAnimationFrame(() => {
312
391
  dialog.show();
@@ -352,7 +431,6 @@ var SniceDoc = (function (exports, snice) {
352
431
  content.appendChild(actions);
353
432
  dialog.appendChild(content);
354
433
  document.body.appendChild(dialog);
355
- // Wait for components to be ready, then show modal
356
434
  customElements.whenDefined('snice-modal').then(() => {
357
435
  requestAnimationFrame(() => {
358
436
  dialog.show();
@@ -432,9 +510,7 @@ var SniceDoc = (function (exports, snice) {
432
510
  content.appendChild(actions);
433
511
  dialog.appendChild(content);
434
512
  document.body.appendChild(dialog);
435
- // Wait for components to be ready, then show modal
436
513
  customElements.whenDefined('snice-modal').then(() => {
437
- // Use connectedCallback to ensure the component is fully initialized
438
514
  requestAnimationFrame(() => {
439
515
  requestAnimationFrame(() => {
440
516
  dialog.open = true;
@@ -489,7 +565,6 @@ var SniceDoc = (function (exports, snice) {
489
565
  const selection = window.getSelection();
490
566
  if (selection && selection.rangeCount > 0) {
491
567
  const range = selection.getRangeAt(0);
492
- // Check if the range is within the editor
493
568
  if (!this.editor.contains(range.commonAncestorContainer)) {
494
569
  this.editor.appendChild(hr);
495
570
  }
@@ -526,12 +601,123 @@ var SniceDoc = (function (exports, snice) {
526
601
  setHTML(html) {
527
602
  this.editor.innerHTML = html;
528
603
  }
604
+ /**
605
+ * Get document as plain text
606
+ */
607
+ getText() {
608
+ return this.editor.innerText || '';
609
+ }
610
+ /**
611
+ * Get document as markdown
612
+ */
613
+ getMarkdown() {
614
+ return this.nodeToMarkdown(this.editor).trim() + '\n';
615
+ }
616
+ /**
617
+ * Download document in specified format
618
+ */
619
+ downloadAs(format, filename) {
620
+ let content;
621
+ let mimeType;
622
+ let ext;
623
+ switch (format) {
624
+ case 'html':
625
+ content = this.getHTML();
626
+ mimeType = 'text/html';
627
+ ext = 'html';
628
+ break;
629
+ case 'markdown':
630
+ content = this.getMarkdown();
631
+ mimeType = 'text/markdown';
632
+ ext = 'md';
633
+ break;
634
+ case 'text':
635
+ content = this.getText();
636
+ mimeType = 'text/plain';
637
+ ext = 'txt';
638
+ break;
639
+ }
640
+ const name = filename || `document.${ext}`;
641
+ const blob = new Blob([content], { type: mimeType });
642
+ const url = URL.createObjectURL(blob);
643
+ const a = document.createElement('a');
644
+ a.href = url;
645
+ a.download = name;
646
+ a.click();
647
+ URL.revokeObjectURL(url);
648
+ }
529
649
  /**
530
650
  * Clear document
531
651
  */
532
652
  clear() {
533
653
  this.editor.innerHTML = '<p><br></p>';
534
654
  }
655
+ nodeToMarkdown(node) {
656
+ if (node.nodeType === Node.TEXT_NODE) {
657
+ return node.textContent || '';
658
+ }
659
+ if (node.nodeType !== Node.ELEMENT_NODE)
660
+ return '';
661
+ const el = node;
662
+ const tag = el.tagName.toLowerCase();
663
+ const children = Array.from(el.childNodes).map(n => this.nodeToMarkdown(n)).join('');
664
+ switch (tag) {
665
+ case 'h1': return `# ${children.trim()}\n\n`;
666
+ case 'h2': return `## ${children.trim()}\n\n`;
667
+ case 'h3': return `### ${children.trim()}\n\n`;
668
+ case 'h4': return `#### ${children.trim()}\n\n`;
669
+ case 'h5': return `##### ${children.trim()}\n\n`;
670
+ case 'h6': return `###### ${children.trim()}\n\n`;
671
+ case 'p': return `${children.trim()}\n\n`;
672
+ case 'br': return '\n';
673
+ case 'b':
674
+ case 'strong': return `**${children}**`;
675
+ case 'i':
676
+ case 'em': return `*${children}*`;
677
+ case 'u': return `<u>${children}</u>`;
678
+ case 's':
679
+ case 'strike':
680
+ case 'del': return `~~${children}~~`;
681
+ case 'a': return `[${children}](${el.href})`;
682
+ case 'img': return `![${el.alt || ''}](${el.src})`;
683
+ case 'ul': return this.listToMarkdown(el, false);
684
+ case 'ol': return this.listToMarkdown(el, true);
685
+ case 'li': return children.trim();
686
+ case 'hr': return '---\n\n';
687
+ case 'code': return `\`${children}\``;
688
+ case 'blockquote': return children.split('\n').filter(l => l.trim()).map(line => `> ${line}`).join('\n') + '\n\n';
689
+ case 'table': return this.tableToMarkdown(el);
690
+ case 'div': return children;
691
+ default: return children;
692
+ }
693
+ }
694
+ listToMarkdown(el, ordered) {
695
+ let result = '';
696
+ const items = el.querySelectorAll(':scope > li');
697
+ items.forEach((li, i) => {
698
+ const prefix = ordered ? `${i + 1}. ` : '- ';
699
+ const content = this.nodeToMarkdown(li);
700
+ result += `${prefix}${content}\n`;
701
+ });
702
+ return result + '\n';
703
+ }
704
+ tableToMarkdown(el) {
705
+ const rows = el.querySelectorAll('tr');
706
+ if (rows.length === 0)
707
+ return '';
708
+ let result = '';
709
+ let isFirst = true;
710
+ rows.forEach(row => {
711
+ const cells = row.querySelectorAll('td, th');
712
+ const cellTexts = Array.from(cells).map(cell => this.nodeToMarkdown(cell).trim());
713
+ result += `| ${cellTexts.join(' | ')} |\n`;
714
+ if (isFirst) {
715
+ result += `| ${cellTexts.map(() => '---').join(' | ')} |\n`;
716
+ isFirst = false;
717
+ }
718
+ });
719
+ return result + '\n';
720
+ }
535
721
  });
536
722
  return _classThis;
537
723
  })();