snice 4.8.0 → 4.9.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 (315) hide show
  1. package/adapters/react/camera-annotate.d.ts +27 -0
  2. package/adapters/react/camera-annotate.d.ts.map +1 -0
  3. package/adapters/react/camera-annotate.js +24 -0
  4. package/adapters/react/camera-annotate.js.map +1 -0
  5. package/adapters/react/camera-annotate.tsx +35 -0
  6. package/adapters/react/candlestick.d.ts +34 -0
  7. package/adapters/react/candlestick.d.ts.map +1 -0
  8. package/adapters/react/candlestick.js +24 -0
  9. package/adapters/react/candlestick.js.map +1 -0
  10. package/adapters/react/candlestick.tsx +42 -0
  11. package/adapters/react/components.d.ts +14 -0
  12. package/adapters/react/components.d.ts.map +1 -1
  13. package/adapters/react/components.js +7 -0
  14. package/adapters/react/components.js.map +1 -1
  15. package/adapters/react/components.ts +14 -0
  16. package/adapters/react/funnel.d.ts +31 -0
  17. package/adapters/react/funnel.d.ts.map +1 -0
  18. package/adapters/react/funnel.js +24 -0
  19. package/adapters/react/funnel.js.map +1 -0
  20. package/adapters/react/funnel.tsx +39 -0
  21. package/adapters/react/network-graph.d.ts +32 -0
  22. package/adapters/react/network-graph.d.ts.map +1 -0
  23. package/adapters/react/network-graph.js +24 -0
  24. package/adapters/react/network-graph.js.map +1 -0
  25. package/adapters/react/network-graph.tsx +40 -0
  26. package/adapters/react/sankey.d.ts +31 -0
  27. package/adapters/react/sankey.d.ts.map +1 -0
  28. package/adapters/react/sankey.js +24 -0
  29. package/adapters/react/sankey.js.map +1 -0
  30. package/adapters/react/sankey.tsx +39 -0
  31. package/adapters/react/time-range-picker.d.ts +33 -0
  32. package/adapters/react/time-range-picker.d.ts.map +1 -0
  33. package/adapters/react/time-range-picker.js +24 -0
  34. package/adapters/react/time-range-picker.js.map +1 -0
  35. package/adapters/react/time-range-picker.tsx +41 -0
  36. package/adapters/react/treemap.d.ts +30 -0
  37. package/adapters/react/treemap.d.ts.map +1 -0
  38. package/adapters/react/treemap.js +24 -0
  39. package/adapters/react/treemap.js.map +1 -0
  40. package/adapters/react/treemap.tsx +38 -0
  41. package/adapters/react/virtual-scroller.d.ts +1 -0
  42. package/adapters/react/virtual-scroller.d.ts.map +1 -1
  43. package/adapters/react/virtual-scroller.js +1 -1
  44. package/adapters/react/virtual-scroller.js.map +1 -1
  45. package/adapters/react/virtual-scroller.tsx +2 -1
  46. package/dist/cdn/accordion/snice-accordion.js +1 -1
  47. package/dist/cdn/accordion/snice-accordion.min.js +1 -1
  48. package/dist/cdn/alert/snice-alert.js +1 -1
  49. package/dist/cdn/alert/snice-alert.min.js +1 -1
  50. package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
  51. package/dist/cdn/audio-recorder/snice-audio-recorder.min.js +1 -1
  52. package/dist/cdn/avatar/snice-avatar.js +1 -1
  53. package/dist/cdn/avatar/snice-avatar.min.js +1 -1
  54. package/dist/cdn/badge/snice-badge.js +1 -1
  55. package/dist/cdn/badge/snice-badge.min.js +1 -1
  56. package/dist/cdn/banner/snice-banner.js +1 -1
  57. package/dist/cdn/banner/snice-banner.min.js +1 -1
  58. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +2 -2
  59. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js.map +1 -1
  60. package/dist/cdn/breadcrumbs/snice-breadcrumbs.min.js +13 -13
  61. package/dist/cdn/breadcrumbs/snice-breadcrumbs.min.js.map +1 -1
  62. package/dist/cdn/button/snice-button.js +1 -1
  63. package/dist/cdn/button/snice-button.min.js +1 -1
  64. package/dist/cdn/calendar/snice-calendar.js +1 -1
  65. package/dist/cdn/calendar/snice-calendar.min.js +1 -1
  66. package/dist/cdn/camera/snice-camera.js +1 -1
  67. package/dist/cdn/camera/snice-camera.min.js +1 -1
  68. package/dist/cdn/camera-annotate/README.md +27 -0
  69. package/dist/cdn/camera-annotate/snice-camera-annotate.js +730 -0
  70. package/dist/cdn/camera-annotate/snice-camera-annotate.js.map +1 -0
  71. package/dist/cdn/camera-annotate/snice-camera-annotate.min.js +144 -0
  72. package/dist/cdn/camera-annotate/snice-camera-annotate.min.js.map +1 -0
  73. package/dist/cdn/candlestick/README.md +27 -0
  74. package/dist/cdn/candlestick/snice-candlestick.js +717 -0
  75. package/dist/cdn/candlestick/snice-candlestick.js.map +1 -0
  76. package/dist/cdn/candlestick/snice-candlestick.min.js +22 -0
  77. package/dist/cdn/candlestick/snice-candlestick.min.js.map +1 -0
  78. package/dist/cdn/card/snice-card.js +1 -1
  79. package/dist/cdn/card/snice-card.min.js +1 -1
  80. package/dist/cdn/carousel/snice-carousel.js +1 -1
  81. package/dist/cdn/carousel/snice-carousel.min.js +1 -1
  82. package/dist/cdn/chart/snice-chart.js +1 -1
  83. package/dist/cdn/chart/snice-chart.min.js +1 -1
  84. package/dist/cdn/chat/snice-chat.js +1 -1
  85. package/dist/cdn/chat/snice-chat.min.js +1 -1
  86. package/dist/cdn/checkbox/snice-checkbox.js +1 -1
  87. package/dist/cdn/checkbox/snice-checkbox.min.js +1 -1
  88. package/dist/cdn/chip/snice-chip.js +1 -1
  89. package/dist/cdn/chip/snice-chip.min.js +1 -1
  90. package/dist/cdn/code-block/snice-code-block.js +1 -1
  91. package/dist/cdn/code-block/snice-code-block.min.js +1 -1
  92. package/dist/cdn/color-display/snice-color-display.js +1 -1
  93. package/dist/cdn/color-display/snice-color-display.min.js +1 -1
  94. package/dist/cdn/color-picker/snice-color-picker.js +1 -1
  95. package/dist/cdn/color-picker/snice-color-picker.min.js +1 -1
  96. package/dist/cdn/command-palette/snice-command-palette.js +1 -1
  97. package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
  98. package/dist/cdn/date-picker/snice-date-picker.js +1 -1
  99. package/dist/cdn/date-picker/snice-date-picker.min.js +1 -1
  100. package/dist/cdn/divider/snice-divider.js +1 -1
  101. package/dist/cdn/divider/snice-divider.min.js +1 -1
  102. package/dist/cdn/doc/snice-doc.js +1 -1
  103. package/dist/cdn/doc/snice-doc.min.js +1 -1
  104. package/dist/cdn/draw/snice-draw.js +1 -1
  105. package/dist/cdn/draw/snice-draw.min.js +1 -1
  106. package/dist/cdn/drawer/snice-drawer.js +1 -1
  107. package/dist/cdn/drawer/snice-drawer.min.js +1 -1
  108. package/dist/cdn/empty-state/snice-empty-state.js +1 -1
  109. package/dist/cdn/empty-state/snice-empty-state.min.js +1 -1
  110. package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
  111. package/dist/cdn/file-gallery/snice-file-gallery.min.js +1 -1
  112. package/dist/cdn/file-upload/snice-file-upload.js +1 -1
  113. package/dist/cdn/file-upload/snice-file-upload.min.js +1 -1
  114. package/dist/cdn/funnel/README.md +27 -0
  115. package/dist/cdn/funnel/snice-funnel.js +424 -0
  116. package/dist/cdn/funnel/snice-funnel.js.map +1 -0
  117. package/dist/cdn/funnel/snice-funnel.min.js +20 -0
  118. package/dist/cdn/funnel/snice-funnel.min.js.map +1 -0
  119. package/dist/cdn/gauge/snice-gauge.js +1 -1
  120. package/dist/cdn/gauge/snice-gauge.min.js +1 -1
  121. package/dist/cdn/heatmap/snice-heatmap.js +1 -1
  122. package/dist/cdn/heatmap/snice-heatmap.min.js +1 -1
  123. package/dist/cdn/image/snice-image.js +1 -1
  124. package/dist/cdn/image/snice-image.min.js +1 -1
  125. package/dist/cdn/input/snice-input.js +1 -1
  126. package/dist/cdn/input/snice-input.min.js +1 -1
  127. package/dist/cdn/kanban/snice-kanban.js +1 -1
  128. package/dist/cdn/kanban/snice-kanban.min.js +1 -1
  129. package/dist/cdn/kpi/snice-kpi.js +1 -1
  130. package/dist/cdn/kpi/snice-kpi.min.js +1 -1
  131. package/dist/cdn/layout/README.md +2 -2
  132. package/dist/cdn/layout/snice-layout.js +23 -6
  133. package/dist/cdn/layout/snice-layout.js.map +1 -1
  134. package/dist/cdn/layout/snice-layout.min.js +2 -2
  135. package/dist/cdn/layout/snice-layout.min.js.map +1 -1
  136. package/dist/cdn/link/snice-link.js +1 -1
  137. package/dist/cdn/link/snice-link.min.js +1 -1
  138. package/dist/cdn/link-preview/snice-link-preview.js +1 -1
  139. package/dist/cdn/link-preview/snice-link-preview.min.js +1 -1
  140. package/dist/cdn/list/README.md +6 -2
  141. package/dist/cdn/list/snice-list.js +87 -10
  142. package/dist/cdn/list/snice-list.js.map +1 -1
  143. package/dist/cdn/list/snice-list.min.js +20 -6
  144. package/dist/cdn/list/snice-list.min.js.map +1 -1
  145. package/dist/cdn/location/snice-location.js +1 -1
  146. package/dist/cdn/location/snice-location.min.js +1 -1
  147. package/dist/cdn/login/snice-login.js +1 -1
  148. package/dist/cdn/login/snice-login.min.js +1 -1
  149. package/dist/cdn/masonry/snice-masonry.js +1 -1
  150. package/dist/cdn/masonry/snice-masonry.min.js +1 -1
  151. package/dist/cdn/menu/snice-menu.js +1 -1
  152. package/dist/cdn/menu/snice-menu.min.js +1 -1
  153. package/dist/cdn/modal/snice-modal.js +1 -1
  154. package/dist/cdn/modal/snice-modal.min.js +1 -1
  155. package/dist/cdn/music-player/snice-music-player.js +1 -1
  156. package/dist/cdn/music-player/snice-music-player.min.js +1 -1
  157. package/dist/cdn/nav/README.md +2 -2
  158. package/dist/cdn/nav/snice-nav.js +23 -6
  159. package/dist/cdn/nav/snice-nav.js.map +1 -1
  160. package/dist/cdn/nav/snice-nav.min.js +2 -2
  161. package/dist/cdn/nav/snice-nav.min.js.map +1 -1
  162. package/dist/cdn/network-graph/README.md +27 -0
  163. package/dist/cdn/network-graph/snice-network-graph.js +788 -0
  164. package/dist/cdn/network-graph/snice-network-graph.js.map +1 -0
  165. package/dist/cdn/network-graph/snice-network-graph.min.js +13 -0
  166. package/dist/cdn/network-graph/snice-network-graph.min.js.map +1 -0
  167. package/dist/cdn/pagination/README.md +2 -2
  168. package/dist/cdn/pagination/snice-pagination.js +13 -13
  169. package/dist/cdn/pagination/snice-pagination.js.map +1 -1
  170. package/dist/cdn/pagination/snice-pagination.min.js +14 -14
  171. package/dist/cdn/pagination/snice-pagination.min.js.map +1 -1
  172. package/dist/cdn/paint/snice-paint.js +1 -1
  173. package/dist/cdn/paint/snice-paint.min.js +1 -1
  174. package/dist/cdn/progress/snice-progress.js +1 -1
  175. package/dist/cdn/progress/snice-progress.min.js +1 -1
  176. package/dist/cdn/qr-code/snice-qr-code.js +1 -1
  177. package/dist/cdn/qr-code/snice-qr-code.min.js +1 -1
  178. package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
  179. package/dist/cdn/qr-reader/snice-qr-reader.min.js +1 -1
  180. package/dist/cdn/radio/snice-radio.js +1 -1
  181. package/dist/cdn/radio/snice-radio.min.js +1 -1
  182. package/dist/cdn/runtime/snice-runtime.esm.js +3 -3
  183. package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
  184. package/dist/cdn/runtime/snice-runtime.esm.min.js +3 -3
  185. package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
  186. package/dist/cdn/runtime/snice-runtime.js +3 -3
  187. package/dist/cdn/runtime/snice-runtime.js.map +1 -1
  188. package/dist/cdn/runtime/snice-runtime.min.js +3 -3
  189. package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
  190. package/dist/cdn/sankey/README.md +27 -0
  191. package/dist/cdn/sankey/snice-sankey.js +679 -0
  192. package/dist/cdn/sankey/snice-sankey.js.map +1 -0
  193. package/dist/cdn/sankey/snice-sankey.min.js +21 -0
  194. package/dist/cdn/sankey/snice-sankey.min.js.map +1 -0
  195. package/dist/cdn/select/snice-select.js +1 -1
  196. package/dist/cdn/select/snice-select.min.js +1 -1
  197. package/dist/cdn/skeleton/snice-skeleton.js +1 -1
  198. package/dist/cdn/skeleton/snice-skeleton.min.js +1 -1
  199. package/dist/cdn/slider/snice-slider.js +1 -1
  200. package/dist/cdn/slider/snice-slider.min.js +1 -1
  201. package/dist/cdn/sparkline/snice-sparkline.js +1 -1
  202. package/dist/cdn/sparkline/snice-sparkline.min.js +1 -1
  203. package/dist/cdn/spinner/snice-spinner.js +1 -1
  204. package/dist/cdn/spinner/snice-spinner.min.js +1 -1
  205. package/dist/cdn/split-pane/snice-split-pane.js +1 -1
  206. package/dist/cdn/split-pane/snice-split-pane.min.js +1 -1
  207. package/dist/cdn/stepper/README.md +6 -2
  208. package/dist/cdn/stepper/snice-stepper.js +77 -10
  209. package/dist/cdn/stepper/snice-stepper.js.map +1 -1
  210. package/dist/cdn/stepper/snice-stepper.min.js +13 -9
  211. package/dist/cdn/stepper/snice-stepper.min.js.map +1 -1
  212. package/dist/cdn/switch/snice-switch.js +1 -1
  213. package/dist/cdn/switch/snice-switch.min.js +1 -1
  214. package/dist/cdn/table/snice-table.js +1 -1
  215. package/dist/cdn/table/snice-table.min.js +1 -1
  216. package/dist/cdn/tabs/snice-tabs.js +1 -1
  217. package/dist/cdn/tabs/snice-tabs.min.js +1 -1
  218. package/dist/cdn/terminal/snice-terminal.js +1 -1
  219. package/dist/cdn/terminal/snice-terminal.min.js +1 -1
  220. package/dist/cdn/textarea/snice-textarea.js +1 -1
  221. package/dist/cdn/textarea/snice-textarea.min.js +1 -1
  222. package/dist/cdn/time-range-picker/README.md +27 -0
  223. package/dist/cdn/time-range-picker/snice-time-range-picker.js +635 -0
  224. package/dist/cdn/time-range-picker/snice-time-range-picker.js.map +1 -0
  225. package/dist/cdn/time-range-picker/snice-time-range-picker.min.js +34 -0
  226. package/dist/cdn/time-range-picker/snice-time-range-picker.min.js.map +1 -0
  227. package/dist/cdn/timeline/snice-timeline.js +1 -1
  228. package/dist/cdn/timeline/snice-timeline.min.js +1 -1
  229. package/dist/cdn/timer/snice-timer.js +1 -1
  230. package/dist/cdn/timer/snice-timer.min.js +1 -1
  231. package/dist/cdn/toast/snice-toast.js +1 -1
  232. package/dist/cdn/toast/snice-toast.min.js +1 -1
  233. package/dist/cdn/tooltip/snice-tooltip.js +1 -1
  234. package/dist/cdn/tooltip/snice-tooltip.min.js +1 -1
  235. package/dist/cdn/tree/README.md +5 -1
  236. package/dist/cdn/tree/snice-tree.js +4 -8
  237. package/dist/cdn/tree/snice-tree.js.map +1 -1
  238. package/dist/cdn/tree/snice-tree.min.js +5 -5
  239. package/dist/cdn/tree/snice-tree.min.js.map +1 -1
  240. package/dist/cdn/treemap/README.md +27 -0
  241. package/dist/cdn/treemap/snice-treemap.js +522 -0
  242. package/dist/cdn/treemap/snice-treemap.js.map +1 -0
  243. package/dist/cdn/treemap/snice-treemap.min.js +14 -0
  244. package/dist/cdn/treemap/snice-treemap.min.js.map +1 -0
  245. package/dist/cdn/virtual-scroller/README.md +2 -2
  246. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +47 -16
  247. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js.map +1 -1
  248. package/dist/cdn/virtual-scroller/snice-virtual-scroller.min.js +9 -9
  249. package/dist/cdn/virtual-scroller/snice-virtual-scroller.min.js.map +1 -1
  250. package/dist/components/breadcrumbs/snice-breadcrumbs.js +1 -1
  251. package/dist/components/breadcrumbs/snice-breadcrumbs.js.map +1 -1
  252. package/dist/components/camera-annotate/snice-camera-annotate.d.ts +68 -0
  253. package/dist/components/camera-annotate/snice-camera-annotate.js +663 -0
  254. package/dist/components/camera-annotate/snice-camera-annotate.js.map +1 -0
  255. package/dist/components/camera-annotate/snice-camera-annotate.types.d.ts +50 -0
  256. package/dist/components/candlestick/snice-candlestick.d.ts +78 -0
  257. package/dist/components/candlestick/snice-candlestick.js +650 -0
  258. package/dist/components/candlestick/snice-candlestick.js.map +1 -0
  259. package/dist/components/candlestick/snice-candlestick.types.d.ts +40 -0
  260. package/dist/components/funnel/snice-funnel.d.ts +37 -0
  261. package/dist/components/funnel/snice-funnel.js +357 -0
  262. package/dist/components/funnel/snice-funnel.js.map +1 -0
  263. package/dist/components/funnel/snice-funnel.types.d.ts +28 -0
  264. package/dist/components/list/snice-list-item.d.ts +2 -0
  265. package/dist/components/list/snice-list-item.js +20 -2
  266. package/dist/components/list/snice-list-item.js.map +1 -1
  267. package/dist/components/nav/snice-nav.js +22 -5
  268. package/dist/components/nav/snice-nav.js.map +1 -1
  269. package/dist/components/network-graph/snice-network-graph.d.ts +80 -0
  270. package/dist/components/network-graph/snice-network-graph.js +721 -0
  271. package/dist/components/network-graph/snice-network-graph.js.map +1 -0
  272. package/dist/components/network-graph/snice-network-graph.types.d.ts +49 -0
  273. package/dist/components/pagination/snice-pagination.js +12 -12
  274. package/dist/components/sankey/snice-sankey.d.ts +46 -0
  275. package/dist/components/sankey/snice-sankey.js +612 -0
  276. package/dist/components/sankey/snice-sankey.js.map +1 -0
  277. package/dist/components/sankey/snice-sankey.types.d.ts +59 -0
  278. package/dist/components/stepper/snice-stepper.js +9 -3
  279. package/dist/components/stepper/snice-stepper.js.map +1 -1
  280. package/dist/components/time-range-picker/snice-time-range-picker.d.ts +67 -0
  281. package/dist/components/time-range-picker/snice-time-range-picker.js +568 -0
  282. package/dist/components/time-range-picker/snice-time-range-picker.js.map +1 -0
  283. package/dist/components/time-range-picker/snice-time-range-picker.types.d.ts +39 -0
  284. package/dist/components/treemap/snice-treemap.d.ts +49 -0
  285. package/dist/components/treemap/snice-treemap.js +455 -0
  286. package/dist/components/treemap/snice-treemap.js.map +1 -0
  287. package/dist/components/treemap/snice-treemap.types.d.ts +42 -0
  288. package/dist/components/virtual-scroller/snice-virtual-scroller.d.ts +5 -0
  289. package/dist/components/virtual-scroller/snice-virtual-scroller.js +47 -16
  290. package/dist/components/virtual-scroller/snice-virtual-scroller.js.map +1 -1
  291. package/dist/index.cjs +1 -1
  292. package/dist/index.cjs.map +1 -1
  293. package/dist/index.esm.js +1 -1
  294. package/dist/index.esm.js.map +1 -1
  295. package/dist/index.iife.js +1 -1
  296. package/dist/index.iife.js.map +1 -1
  297. package/dist/symbols.cjs +1 -1
  298. package/dist/symbols.esm.js +1 -1
  299. package/dist/transitions.cjs +1 -1
  300. package/dist/transitions.esm.js +1 -1
  301. package/docs/ai/components/camera-annotate.md +82 -0
  302. package/docs/ai/components/candlestick.md +79 -0
  303. package/docs/ai/components/funnel.md +86 -0
  304. package/docs/ai/components/network-graph.md +87 -0
  305. package/docs/ai/components/sankey.md +63 -0
  306. package/docs/ai/components/time-range-picker.md +78 -0
  307. package/docs/ai/components/treemap.md +78 -0
  308. package/docs/components/camera-annotate.md +186 -0
  309. package/docs/components/candlestick.md +196 -0
  310. package/docs/components/funnel.md +191 -0
  311. package/docs/components/network-graph.md +215 -0
  312. package/docs/components/sankey.md +201 -0
  313. package/docs/components/time-range-picker.md +213 -0
  314. package/docs/components/treemap.md +198 -0
  315. package/package.json +1 -1
@@ -0,0 +1,730 @@
1
+ /*!
2
+ * snice v4.8.0
3
+ * Imperative TypeScript framework for building vanilla web components with decorators, differential rendering, routing, and controllers. No virtual DOM, no build complexity.
4
+ * (c) 2024
5
+ * Released under the MIT License.
6
+ */
7
+ if(typeof globalThis.Snice==="undefined"){console.warn("[snice] snice-runtime.min.js must be loaded before snice-camera-annotate.min.js");}
8
+ var SniceCameraAnnotate = (function (exports, snice) {
9
+ 'use strict';
10
+
11
+ /******************************************************************************
12
+ Copyright (c) Microsoft Corporation.
13
+
14
+ Permission to use, copy, modify, and/or distribute this software for any
15
+ purpose with or without fee is hereby granted.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
18
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
19
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
20
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
21
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
22
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
23
+ PERFORMANCE OF THIS SOFTWARE.
24
+ ***************************************************************************** */
25
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
26
+
27
+
28
+ function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
29
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
30
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
31
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
32
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
33
+ var _, done = false;
34
+ for (var i = decorators.length - 1; i >= 0; i--) {
35
+ var context = {};
36
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
37
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
38
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
39
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
40
+ if (kind === "accessor") {
41
+ if (result === void 0) continue;
42
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
43
+ if (_ = accept(result.get)) descriptor.get = _;
44
+ if (_ = accept(result.set)) descriptor.set = _;
45
+ if (_ = accept(result.init)) initializers.unshift(_);
46
+ }
47
+ else if (_ = accept(result)) {
48
+ if (kind === "field") initializers.unshift(_);
49
+ else descriptor[key] = _;
50
+ }
51
+ }
52
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
53
+ done = true;
54
+ }
55
+ function __runInitializers(thisArg, initializers, value) {
56
+ var useValue = arguments.length > 2;
57
+ for (var i = 0; i < initializers.length; i++) {
58
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
59
+ }
60
+ return useValue ? value : void 0;
61
+ }
62
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
63
+ var e = new Error(message);
64
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
65
+ };
66
+
67
+ var componentStyles = ":host{display:block;width:100%;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);contain:layout style paint;--ca-bg:var(--snice-color-background, rgb(255 255 255));--ca-bg-element:var(--snice-color-background-element, rgb(252 251 249));--ca-text:var(--snice-color-text, rgb(23 23 23));--ca-text-secondary:var(--snice-color-text-secondary, rgb(82 82 82));--ca-text-tertiary:var(--snice-color-text-tertiary, rgb(115 115 115));--ca-border:var(--snice-color-border, rgb(226 226 226));--ca-primary:var(--snice-color-primary, rgb(37 99 235));--ca-danger:var(--snice-color-danger, rgb(220 38 38))}.ca-layout{display:flex;gap:var(--snice-spacing-md,1rem);width:100%}.ca-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--snice-spacing-sm,.75rem)}.ca-canvas-area{position:relative;width:100%;background:rgb(0 0 0);border-radius:var(--snice-border-radius-lg,.5rem);overflow:hidden}.ca-canvas-area video{display:block;width:100%;height:auto}.ca-canvas-area video.mirror{transform:scaleX(-1)}.ca-canvas-area canvas{display:block;width:100%;height:auto;cursor:crosshair}.ca-canvas-area canvas.hidden,.ca-canvas-area video.hidden{display:none}.ca-toolbar{display:flex;align-items:center;gap:var(--snice-spacing-xs,.5rem);flex-wrap:wrap}.ca-btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--snice-spacing-2xs,.25rem);padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-sm,.75rem);border:1px solid var(--ca-border);border-radius:var(--snice-border-radius-md,.25rem);background:var(--ca-bg);color:var(--ca-text);font-size:var(--snice-font-size-sm, .875rem);font-family:inherit;cursor:pointer;transition:all var(--snice-transition-fast, 150ms) ease;white-space:nowrap}.ca-btn:hover{background:var(--ca-bg-element)}.ca-btn:active{transform:scale(.97)}.ca-btn.primary{background:var(--ca-primary);color:var(--snice-color-text-inverse,rgb(250 250 250));border-color:var(--ca-primary)}.ca-btn.primary:hover{opacity:.9}.ca-btn.danger{color:var(--ca-danger);border-color:var(--ca-danger)}.ca-btn.danger:hover{background:var(--ca-danger);color:var(--snice-color-text-inverse,rgb(250 250 250))}.ca-btn.small{padding:var(--snice-spacing-3xs,.125rem) var(--snice-spacing-2xs,.25rem);font-size:var(--snice-font-size-xs, .75rem)}.ca-btn.active{background:var(--ca-primary);color:var(--snice-color-text-inverse,rgb(250 250 250));border-color:var(--ca-primary)}.ca-btn svg{width:1rem;height:1rem;flex-shrink:0}.ca-separator{width:1px;height:1.5rem;background:var(--ca-border);margin:0 var(--snice-spacing-3xs,.125rem)}.ca-toolbar-group{display:flex;align-items:center;gap:var(--snice-spacing-2xs,.25rem)}.ca-stroke-width{width:3.5rem;padding:var(--snice-spacing-2xs,.25rem);border:1px solid var(--ca-border);border-radius:var(--snice-border-radius-md,.25rem);font-size:var(--snice-font-size-sm, .875rem);font-family:inherit;background:var(--ca-bg);color:var(--ca-text);text-align:center}.ca-sidebar{width:16rem;flex-shrink:0;display:flex;flex-direction:column;gap:var(--snice-spacing-xs,.5rem);border:1px solid var(--ca-border);border-radius:var(--snice-border-radius-lg,.5rem);padding:var(--snice-spacing-sm,.75rem);background:var(--ca-bg);max-height:32rem;overflow-y:auto}.ca-sidebar.hidden{display:none}.ca-sidebar-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:var(--snice-spacing-xs,.5rem);border-bottom:1px solid var(--ca-border)}.ca-sidebar-title{font-size:var(--snice-font-size-sm, .875rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--ca-text)}.ca-annotation-list{display:flex;flex-direction:column;gap:var(--snice-spacing-2xs,.25rem)}.ca-annotation-item{display:flex;align-items:center;gap:var(--snice-spacing-xs,.5rem);padding:var(--snice-spacing-2xs,.25rem) var(--snice-spacing-xs,.5rem);border-radius:var(--snice-border-radius-md,.25rem);border:1px solid transparent;cursor:pointer;transition:all var(--snice-transition-fast, 150ms) ease}.ca-annotation-item:hover{background:var(--ca-bg-element);border-color:var(--ca-border)}.ca-annotation-item.highlighted{background:var(--ca-bg-element);border-color:var(--ca-primary)}.ca-annotation-color{width:.75rem;height:.75rem;border-radius:50%;flex-shrink:0;border:1px solid var(--ca-border)}.ca-annotation-label{flex:1;min-width:0}.ca-annotation-label input{width:100%;border:none;background:0 0;font-size:var(--snice-font-size-sm, .875rem);font-family:inherit;color:var(--ca-text);padding:var(--snice-spacing-3xs,.125rem) 0;outline:0}.ca-annotation-label input:focus{border-bottom:1px solid var(--ca-primary)}.ca-annotation-label input::placeholder{color:var(--ca-text-tertiary)}.ca-annotation-actions{display:flex;align-items:center;gap:var(--snice-spacing-3xs,.125rem)}.ca-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;border:none;background:0 0;color:var(--ca-text-tertiary);cursor:pointer;border-radius:var(--snice-border-radius-md,.25rem);padding:0;transition:all var(--snice-transition-fast, 150ms) ease}.ca-icon-btn:hover{background:var(--ca-bg-element);color:var(--ca-text)}.ca-icon-btn svg{width:.875rem;height:.875rem}.ca-icon-btn.hidden-state{opacity:.4}.ca-color-section{display:flex;flex-direction:column;gap:var(--snice-spacing-2xs,.25rem)}.ca-color-palette{display:flex;flex-wrap:wrap;gap:var(--snice-spacing-3xs,.125rem);justify-content:center}.ca-color-swatch{width:1.25rem;height:1.25rem;border-radius:50%;border:2px solid transparent;cursor:pointer;transition:all var(--snice-transition-fast, 150ms) ease}.ca-color-swatch:hover{transform:scale(1.2)}.ca-color-swatch.active{border-color:var(--ca-text);box-shadow:0 0 0 2px var(--ca-bg),0 0 0 3px var(--ca-text)}.ca-auto-rotate{display:flex;align-items:center;gap:var(--snice-spacing-2xs,.25rem);font-size:var(--snice-font-size-xs, .75rem);color:var(--ca-text-secondary);cursor:pointer}.ca-auto-rotate input{margin:0;cursor:pointer}.ca-empty-state{text-align:center;padding:var(--snice-spacing-lg,1.5rem) var(--snice-spacing-sm,.75rem);color:var(--ca-text-tertiary);font-size:var(--snice-font-size-sm, .875rem)}";
68
+
69
+ const PRESET_COLORS = [
70
+ '#f87171', '#fb923c', '#fbbf24', '#a3e635',
71
+ '#34d399', '#22d3ee', '#60a5fa', '#a78bfa',
72
+ '#f472b6', '#fb7185', '#e879f9', '#818cf8'
73
+ ];
74
+ let SniceCameraAnnotate = (() => {
75
+ let _classDecorators = [snice.element('snice-camera-annotate')];
76
+ let _classDescriptor;
77
+ let _classExtraInitializers = [];
78
+ let _classThis;
79
+ let _classSuper = HTMLElement;
80
+ let _instanceExtraInitializers = [];
81
+ let _mode_decorators;
82
+ let _mode_initializers = [];
83
+ let _mode_extraInitializers = [];
84
+ let _autoRotateColors_decorators;
85
+ let _autoRotateColors_initializers = [];
86
+ let _autoRotateColors_extraInitializers = [];
87
+ let _showLabelsPanel_decorators;
88
+ let _showLabelsPanel_initializers = [];
89
+ let _showLabelsPanel_extraInitializers = [];
90
+ let _videoEl_decorators;
91
+ let _videoEl_initializers = [];
92
+ let _videoEl_extraInitializers = [];
93
+ let _drawCanvas_decorators;
94
+ let _drawCanvas_initializers = [];
95
+ let _drawCanvas_extraInitializers = [];
96
+ let _componentStyles_decorators;
97
+ let _init_decorators;
98
+ let _cleanup_decorators;
99
+ let _template_decorators;
100
+ let _handleModeChange_decorators;
101
+ let _emitCapture_decorators;
102
+ let _emitAnnotate_decorators;
103
+ let _emitAnnotationChange_decorators;
104
+ (class extends _classSuper {
105
+ static { _classThis = this; }
106
+ constructor() {
107
+ super(...arguments);
108
+ this.mode = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _mode_initializers, 'camera'));
109
+ this.autoRotateColors = (__runInitializers(this, _mode_extraInitializers), __runInitializers(this, _autoRotateColors_initializers, true));
110
+ this.showLabelsPanel = (__runInitializers(this, _autoRotateColors_extraInitializers), __runInitializers(this, _showLabelsPanel_initializers, true));
111
+ this.videoEl = (__runInitializers(this, _showLabelsPanel_extraInitializers), __runInitializers(this, _videoEl_initializers, void 0));
112
+ this.drawCanvas = (__runInitializers(this, _videoEl_extraInitializers), __runInitializers(this, _drawCanvas_initializers, void 0));
113
+ this.stream = (__runInitializers(this, _drawCanvas_extraInitializers), null);
114
+ this.ctx = null;
115
+ this.capturedImageData = '';
116
+ this.capturedImage = null;
117
+ this.imageWidth = 0;
118
+ this.imageHeight = 0;
119
+ // Drawing state
120
+ this.isDrawing = false;
121
+ this.currentPoints = [];
122
+ this.strokes = [];
123
+ this.annotations = [];
124
+ this.activeColor = PRESET_COLORS[0];
125
+ this.colorIndex = 0;
126
+ this.strokeWidth = 3;
127
+ // Highlight state
128
+ this.highlightedAnnotationId = null;
129
+ }
130
+ static {
131
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
132
+ _mode_decorators = [snice.property()];
133
+ _autoRotateColors_decorators = [snice.property({ type: Boolean, attribute: 'auto-rotate-colors' })];
134
+ _showLabelsPanel_decorators = [snice.property({ type: Boolean, attribute: 'show-labels-panel' })];
135
+ _videoEl_decorators = [snice.query('.ca-video')];
136
+ _drawCanvas_decorators = [snice.query('.ca-draw-canvas')];
137
+ _componentStyles_decorators = [snice.styles()];
138
+ _init_decorators = [snice.ready()];
139
+ _cleanup_decorators = [snice.dispose()];
140
+ _template_decorators = [snice.render()];
141
+ _handleModeChange_decorators = [snice.watch('mode')];
142
+ _emitCapture_decorators = [snice.dispatch('capture', { bubbles: true, composed: true })];
143
+ _emitAnnotate_decorators = [snice.dispatch('annotate', { bubbles: true, composed: true })];
144
+ _emitAnnotationChange_decorators = [snice.dispatch('annotation-change', { bubbles: true, composed: true })];
145
+ __esDecorate(this, null, _componentStyles_decorators, { kind: "method", name: "componentStyles", static: false, private: false, access: { has: obj => "componentStyles" in obj, get: obj => obj.componentStyles }, metadata: _metadata }, null, _instanceExtraInitializers);
146
+ __esDecorate(this, null, _init_decorators, { kind: "method", name: "init", static: false, private: false, access: { has: obj => "init" in obj, get: obj => obj.init }, metadata: _metadata }, null, _instanceExtraInitializers);
147
+ __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);
148
+ __esDecorate(this, null, _template_decorators, { kind: "method", name: "template", static: false, private: false, access: { has: obj => "template" in obj, get: obj => obj.template }, metadata: _metadata }, null, _instanceExtraInitializers);
149
+ __esDecorate(this, null, _handleModeChange_decorators, { kind: "method", name: "handleModeChange", static: false, private: false, access: { has: obj => "handleModeChange" in obj, get: obj => obj.handleModeChange }, metadata: _metadata }, null, _instanceExtraInitializers);
150
+ __esDecorate(this, null, _emitCapture_decorators, { kind: "method", name: "emitCapture", static: false, private: false, access: { has: obj => "emitCapture" in obj, get: obj => obj.emitCapture }, metadata: _metadata }, null, _instanceExtraInitializers);
151
+ __esDecorate(this, null, _emitAnnotate_decorators, { kind: "method", name: "emitAnnotate", static: false, private: false, access: { has: obj => "emitAnnotate" in obj, get: obj => obj.emitAnnotate }, metadata: _metadata }, null, _instanceExtraInitializers);
152
+ __esDecorate(this, null, _emitAnnotationChange_decorators, { kind: "method", name: "emitAnnotationChange", static: false, private: false, access: { has: obj => "emitAnnotationChange" in obj, get: obj => obj.emitAnnotationChange }, metadata: _metadata }, null, _instanceExtraInitializers);
153
+ __esDecorate(null, null, _mode_decorators, { kind: "field", name: "mode", static: false, private: false, access: { has: obj => "mode" in obj, get: obj => obj.mode, set: (obj, value) => { obj.mode = value; } }, metadata: _metadata }, _mode_initializers, _mode_extraInitializers);
154
+ __esDecorate(null, null, _autoRotateColors_decorators, { kind: "field", name: "autoRotateColors", static: false, private: false, access: { has: obj => "autoRotateColors" in obj, get: obj => obj.autoRotateColors, set: (obj, value) => { obj.autoRotateColors = value; } }, metadata: _metadata }, _autoRotateColors_initializers, _autoRotateColors_extraInitializers);
155
+ __esDecorate(null, null, _showLabelsPanel_decorators, { kind: "field", name: "showLabelsPanel", static: false, private: false, access: { has: obj => "showLabelsPanel" in obj, get: obj => obj.showLabelsPanel, set: (obj, value) => { obj.showLabelsPanel = value; } }, metadata: _metadata }, _showLabelsPanel_initializers, _showLabelsPanel_extraInitializers);
156
+ __esDecorate(null, null, _videoEl_decorators, { kind: "field", name: "videoEl", static: false, private: false, access: { has: obj => "videoEl" in obj, get: obj => obj.videoEl, set: (obj, value) => { obj.videoEl = value; } }, metadata: _metadata }, _videoEl_initializers, _videoEl_extraInitializers);
157
+ __esDecorate(null, null, _drawCanvas_decorators, { kind: "field", name: "drawCanvas", static: false, private: false, access: { has: obj => "drawCanvas" in obj, get: obj => obj.drawCanvas, set: (obj, value) => { obj.drawCanvas = value; } }, metadata: _metadata }, _drawCanvas_initializers, _drawCanvas_extraInitializers);
158
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
159
+ _classThis = _classDescriptor.value;
160
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
161
+ __runInitializers(_classThis, _classExtraInitializers);
162
+ }
163
+ componentStyles() {
164
+ return snice.css /*css*/ `${componentStyles}`;
165
+ }
166
+ async init() {
167
+ if (this.mode === 'camera') {
168
+ await this.startCamera();
169
+ }
170
+ }
171
+ cleanup() {
172
+ this.stopCamera();
173
+ }
174
+ template() {
175
+ return snice.html `
176
+ <div class="ca-layout">
177
+ <div class="ca-main">
178
+ <div class="ca-canvas-area">
179
+ <video
180
+ class="ca-video mirror ${this.mode === 'annotate' ? 'hidden' : ''}"
181
+ autoplay
182
+ playsinline
183
+ muted>
184
+ </video>
185
+ <canvas
186
+ class="ca-draw-canvas ${this.mode === 'camera' ? 'hidden' : ''}"
187
+ @pointerdown=${this.handlePointerDown}
188
+ @pointermove=${this.handlePointerMove}
189
+ @pointerup=${this.handlePointerUp}>
190
+ </canvas>
191
+ </div>
192
+ ${this.renderToolbar()}
193
+ </div>
194
+ <div class="ca-sidebar ${this.showLabelsPanel ? '' : 'hidden'}">
195
+ ${this.renderSidebar()}
196
+ </div>
197
+ </div>
198
+ `;
199
+ }
200
+ renderToolbar() {
201
+ const inCamera = this.mode === 'camera';
202
+ return snice.html `
203
+ <div class="ca-toolbar">
204
+ <button class="ca-btn primary" @click=${inCamera ? this.capture : this.retake}>
205
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
206
+ ${inCamera
207
+ ? snice.html `<path d="M9 2L7 5H4C2.9 5 2 5.9 2 7V19C2 20.1 2.9 21 4 21H20C21.1 21 22 20.1 22 19V7C22 5.9 21.1 5 20 5H17L15 2H9Z"/><circle cx="12" cy="13" r="3"/>`
208
+ : snice.html `<path d="M1 4v6h6"/><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"/>`}
209
+ </svg>
210
+ ${inCamera ? 'Capture' : 'Retake'}
211
+ </button>
212
+
213
+ <if value=${!inCamera}>
214
+ <div class="ca-separator"></div>
215
+ <div class="ca-toolbar-group">
216
+ <button class="ca-btn small" @click=${this.undoStroke} title="Undo">
217
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
218
+ <path d="M1 4v6h6"/><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"/>
219
+ </svg>
220
+ </button>
221
+ <button class="ca-btn small danger" @click=${this.clearAnnotations} title="Clear all">
222
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
223
+ <path d="M3 6h18"/><path d="M8 6V4h8v2"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"/>
224
+ </svg>
225
+ </button>
226
+ </div>
227
+ <div class="ca-separator"></div>
228
+ <label class="ca-toolbar-group" style="font-size:0.75rem;color:var(--ca-text-secondary);">
229
+ Width:
230
+ <input
231
+ type="number"
232
+ class="ca-stroke-width"
233
+ min="1"
234
+ max="20"
235
+ .value="${String(this.strokeWidth)}"
236
+ @change=${this.handleStrokeWidthChange}
237
+ />
238
+ </label>
239
+ <div class="ca-separator"></div>
240
+ <button class="ca-btn small" @click=${this.handleExportImage} title="Export image">
241
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
242
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/>
243
+ </svg>
244
+ Export
245
+ </button>
246
+ </if>
247
+ </div>
248
+ `;
249
+ }
250
+ renderSidebar() {
251
+ return snice.html `
252
+ <div class="ca-sidebar-header">
253
+ <span class="ca-sidebar-title">Annotations</span>
254
+ <div class="ca-toolbar-group">
255
+ <button class="ca-icon-btn" @click=${this.toggleAllAnnotations} title="Toggle all">
256
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
257
+ <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/>
258
+ </svg>
259
+ </button>
260
+ </div>
261
+ </div>
262
+
263
+ <div class="ca-color-section">
264
+ <div class="ca-color-palette">
265
+ ${PRESET_COLORS.map(color => snice.html `
266
+ <div
267
+ class="ca-color-swatch ${this.activeColor === color ? 'active' : ''}"
268
+ style="background-color: ${color}"
269
+ @click=${() => this.selectColor(color)}
270
+ title="${color}">
271
+ </div>
272
+ `)}
273
+ </div>
274
+ <label class="ca-auto-rotate">
275
+ <input
276
+ type="checkbox"
277
+ ?checked=${this.autoRotateColors}
278
+ @change=${this.handleAutoRotateChange}
279
+ />
280
+ Auto Rotate Colors
281
+ </label>
282
+ </div>
283
+
284
+ <div class="ca-annotation-list">
285
+ ${this.annotations.length === 0
286
+ ? snice.html `<div class="ca-empty-state">Draw on the image to create annotations</div>`
287
+ : this.annotations.map(ann => this.renderAnnotationItem(ann))}
288
+ </div>
289
+ `;
290
+ }
291
+ renderAnnotationItem(ann) {
292
+ const isHighlighted = this.highlightedAnnotationId === ann.id;
293
+ return snice.html `
294
+ <div
295
+ class="ca-annotation-item ${isHighlighted ? 'highlighted' : ''}"
296
+ @mouseenter=${() => this.highlightAnnotation(ann.id)}
297
+ @mouseleave=${() => this.unhighlightAnnotation()}>
298
+ <div class="ca-annotation-color" style="background-color: ${ann.color}"></div>
299
+ <div class="ca-annotation-label">
300
+ <input
301
+ type="text"
302
+ placeholder="Add label..."
303
+ .value="${ann.label}"
304
+ @input=${(e) => this.updateAnnotationLabel(ann.id, e.target.value)}
305
+ />
306
+ </div>
307
+ <div class="ca-annotation-actions">
308
+ <button
309
+ class="ca-icon-btn ${ann.visible ? '' : 'hidden-state'}"
310
+ @click=${() => this.toggleAnnotationVisibility(ann.id)}
311
+ title="${ann.visible ? 'Hide' : 'Show'}">
312
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
313
+ ${ann.visible
314
+ ? snice.html `<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/>`
315
+ : snice.html `<path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"/><line x1="1" y1="1" x2="23" y2="23"/>`}
316
+ </svg>
317
+ </button>
318
+ <button
319
+ class="ca-icon-btn"
320
+ @click=${() => this.deleteAnnotation(ann.id)}
321
+ title="Delete">
322
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
323
+ <line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>
324
+ </svg>
325
+ </button>
326
+ </div>
327
+ </div>
328
+ `;
329
+ }
330
+ // --- Camera ---
331
+ async startCamera() {
332
+ try {
333
+ this.stream = await navigator.mediaDevices.getUserMedia({
334
+ audio: false,
335
+ video: { width: { ideal: 1280 }, height: { ideal: 720 }, facingMode: 'user' }
336
+ });
337
+ if (this.videoEl) {
338
+ this.videoEl.srcObject = this.stream;
339
+ await this.videoEl.play();
340
+ }
341
+ }
342
+ catch (err) {
343
+ console.error('Camera access error:', err);
344
+ }
345
+ }
346
+ stopCamera() {
347
+ if (this.stream) {
348
+ this.stream.getTracks().forEach(t => t.stop());
349
+ this.stream = null;
350
+ }
351
+ }
352
+ // --- Capture ---
353
+ async capture() {
354
+ if (!this.videoEl)
355
+ return;
356
+ const tempCanvas = document.createElement('canvas');
357
+ tempCanvas.width = this.videoEl.videoWidth || 640;
358
+ tempCanvas.height = this.videoEl.videoHeight || 480;
359
+ const tempCtx = tempCanvas.getContext('2d');
360
+ if (!tempCtx)
361
+ return;
362
+ // Mirror for user-facing camera
363
+ tempCtx.scale(-1, 1);
364
+ tempCtx.drawImage(this.videoEl, -tempCanvas.width, 0, tempCanvas.width, tempCanvas.height);
365
+ this.capturedImageData = tempCanvas.toDataURL('image/jpeg', 0.92);
366
+ this.imageWidth = tempCanvas.width;
367
+ this.imageHeight = tempCanvas.height;
368
+ // Load as image for drawing
369
+ this.capturedImage = new Image();
370
+ this.capturedImage.src = this.capturedImageData;
371
+ await new Promise(resolve => {
372
+ this.capturedImage.onload = () => resolve();
373
+ });
374
+ this.stopCamera();
375
+ this.mode = 'annotate';
376
+ // Init canvas after mode switch renders it
377
+ requestAnimationFrame(() => {
378
+ this.initDrawCanvas();
379
+ this.emitCapture();
380
+ });
381
+ }
382
+ retake() {
383
+ this.strokes = [];
384
+ this.annotations = [];
385
+ this.capturedImageData = '';
386
+ this.capturedImage = null;
387
+ this.highlightedAnnotationId = null;
388
+ this.colorIndex = 0;
389
+ this.activeColor = PRESET_COLORS[0];
390
+ this.mode = 'camera';
391
+ requestAnimationFrame(() => this.startCamera());
392
+ }
393
+ // --- Drawing ---
394
+ initDrawCanvas() {
395
+ const canvas = this.drawCanvas;
396
+ if (!canvas || !this.capturedImage)
397
+ return;
398
+ canvas.width = this.imageWidth;
399
+ canvas.height = this.imageHeight;
400
+ this.ctx = canvas.getContext('2d');
401
+ this.redrawCanvas();
402
+ }
403
+ getCanvasPoint(e) {
404
+ const canvas = this.drawCanvas;
405
+ if (!canvas)
406
+ return { x: 0, y: 0 };
407
+ const rect = canvas.getBoundingClientRect();
408
+ return {
409
+ x: (e.clientX - rect.left) * (canvas.width / rect.width),
410
+ y: (e.clientY - rect.top) * (canvas.height / rect.height)
411
+ };
412
+ }
413
+ handlePointerDown(e) {
414
+ if (this.mode !== 'annotate')
415
+ return;
416
+ e.preventDefault();
417
+ this.isDrawing = true;
418
+ this.currentPoints = [this.getCanvasPoint(e)];
419
+ this.drawCanvas?.setPointerCapture(e.pointerId);
420
+ }
421
+ handlePointerMove(e) {
422
+ if (!this.isDrawing)
423
+ return;
424
+ e.preventDefault();
425
+ const point = this.getCanvasPoint(e);
426
+ this.currentPoints.push(point);
427
+ this.redrawCanvas();
428
+ this.drawCurrentStroke();
429
+ }
430
+ handlePointerUp(e) {
431
+ if (!this.isDrawing)
432
+ return;
433
+ e.preventDefault();
434
+ this.isDrawing = false;
435
+ this.drawCanvas?.releasePointerCapture(e.pointerId);
436
+ if (this.currentPoints.length < 2) {
437
+ this.currentPoints = [];
438
+ return;
439
+ }
440
+ const strokeId = `stroke-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
441
+ const stroke = {
442
+ id: strokeId,
443
+ color: this.activeColor,
444
+ width: this.strokeWidth,
445
+ points: [...this.currentPoints],
446
+ timestamp: Date.now()
447
+ };
448
+ this.strokes.push(stroke);
449
+ const annotation = {
450
+ id: `ann-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
451
+ strokeId,
452
+ label: '',
453
+ color: this.activeColor,
454
+ visible: true,
455
+ timestamp: Date.now()
456
+ };
457
+ this.annotations.push(annotation);
458
+ this.currentPoints = [];
459
+ // Auto rotate color
460
+ if (this.autoRotateColors) {
461
+ this.colorIndex = (this.colorIndex + 1) % PRESET_COLORS.length;
462
+ this.activeColor = PRESET_COLORS[this.colorIndex];
463
+ }
464
+ this.redrawCanvas();
465
+ this.emitAnnotate(annotation);
466
+ this.emitAnnotationChange();
467
+ }
468
+ drawCurrentStroke() {
469
+ if (!this.ctx || this.currentPoints.length < 2)
470
+ return;
471
+ this.ctx.lineJoin = 'round';
472
+ this.ctx.lineCap = 'round';
473
+ this.ctx.strokeStyle = this.activeColor;
474
+ this.ctx.lineWidth = this.strokeWidth * 2;
475
+ this.ctx.beginPath();
476
+ this.ctx.moveTo(this.currentPoints[0].x, this.currentPoints[0].y);
477
+ for (let i = 1; i < this.currentPoints.length; i++) {
478
+ const prev = this.currentPoints[i - 1];
479
+ const curr = this.currentPoints[i];
480
+ const midX = (prev.x + curr.x) / 2;
481
+ const midY = (prev.y + curr.y) / 2;
482
+ this.ctx.quadraticCurveTo(prev.x, prev.y, midX, midY);
483
+ }
484
+ const last = this.currentPoints[this.currentPoints.length - 1];
485
+ this.ctx.lineTo(last.x, last.y);
486
+ this.ctx.stroke();
487
+ }
488
+ redrawCanvas() {
489
+ if (!this.ctx || !this.capturedImage)
490
+ return;
491
+ this.ctx.clearRect(0, 0, this.imageWidth, this.imageHeight);
492
+ this.ctx.drawImage(this.capturedImage, 0, 0, this.imageWidth, this.imageHeight);
493
+ for (const stroke of this.strokes) {
494
+ const ann = this.annotations.find(a => a.strokeId === stroke.id);
495
+ if (ann && !ann.visible)
496
+ continue;
497
+ this.ctx.save();
498
+ // Apply highlight/dim effect
499
+ if (this.highlightedAnnotationId !== null) {
500
+ const isHighlighted = ann && ann.id === this.highlightedAnnotationId;
501
+ if (!isHighlighted) {
502
+ this.ctx.globalAlpha = 0.2;
503
+ this.ctx.filter = 'grayscale(1)';
504
+ }
505
+ }
506
+ this.drawStroke(stroke);
507
+ this.ctx.restore();
508
+ }
509
+ }
510
+ drawStroke(stroke) {
511
+ if (!this.ctx || stroke.points.length === 0)
512
+ return;
513
+ this.ctx.lineJoin = 'round';
514
+ this.ctx.lineCap = 'round';
515
+ this.ctx.strokeStyle = stroke.color;
516
+ this.ctx.lineWidth = stroke.width * 2;
517
+ if (stroke.points.length === 1) {
518
+ this.ctx.beginPath();
519
+ this.ctx.arc(stroke.points[0].x, stroke.points[0].y, stroke.width, 0, Math.PI * 2);
520
+ this.ctx.fillStyle = stroke.color;
521
+ this.ctx.fill();
522
+ return;
523
+ }
524
+ this.ctx.beginPath();
525
+ this.ctx.moveTo(stroke.points[0].x, stroke.points[0].y);
526
+ for (let i = 1; i < stroke.points.length; i++) {
527
+ const prev = stroke.points[i - 1];
528
+ const curr = stroke.points[i];
529
+ const midX = (prev.x + curr.x) / 2;
530
+ const midY = (prev.y + curr.y) / 2;
531
+ this.ctx.quadraticCurveTo(prev.x, prev.y, midX, midY);
532
+ }
533
+ const last = stroke.points[stroke.points.length - 1];
534
+ this.ctx.lineTo(last.x, last.y);
535
+ this.ctx.stroke();
536
+ }
537
+ // --- Annotation management ---
538
+ selectColor(color) {
539
+ this.activeColor = color;
540
+ this.colorIndex = PRESET_COLORS.indexOf(color);
541
+ }
542
+ handleAutoRotateChange(e) {
543
+ this.autoRotateColors = e.target.checked;
544
+ }
545
+ handleStrokeWidthChange(e) {
546
+ this.strokeWidth = Math.max(1, Math.min(20, parseInt(e.target.value) || 3));
547
+ }
548
+ updateAnnotationLabel(id, label) {
549
+ const ann = this.annotations.find(a => a.id === id);
550
+ if (ann) {
551
+ ann.label = label;
552
+ this.emitAnnotationChange();
553
+ }
554
+ }
555
+ toggleAnnotationVisibility(id) {
556
+ const ann = this.annotations.find(a => a.id === id);
557
+ if (ann) {
558
+ ann.visible = !ann.visible;
559
+ this.redrawCanvas();
560
+ this.emitAnnotationChange();
561
+ }
562
+ }
563
+ toggleAllAnnotations() {
564
+ const allVisible = this.annotations.every(a => a.visible);
565
+ this.annotations.forEach(a => a.visible = !allVisible);
566
+ this.redrawCanvas();
567
+ this.emitAnnotationChange();
568
+ }
569
+ deleteAnnotation(id) {
570
+ const ann = this.annotations.find(a => a.id === id);
571
+ if (!ann)
572
+ return;
573
+ this.strokes = this.strokes.filter(s => s.id !== ann.strokeId);
574
+ this.annotations = this.annotations.filter(a => a.id !== id);
575
+ this.redrawCanvas();
576
+ this.emitAnnotationChange();
577
+ }
578
+ highlightAnnotation(id) {
579
+ this.highlightedAnnotationId = id;
580
+ this.redrawCanvas();
581
+ }
582
+ unhighlightAnnotation() {
583
+ this.highlightedAnnotationId = null;
584
+ this.redrawCanvas();
585
+ }
586
+ undoStroke() {
587
+ if (this.strokes.length === 0)
588
+ return;
589
+ const lastStroke = this.strokes.pop();
590
+ this.annotations = this.annotations.filter(a => a.strokeId !== lastStroke.id);
591
+ this.redrawCanvas();
592
+ this.emitAnnotationChange();
593
+ }
594
+ handleExportImage() {
595
+ const dataURL = this.exportImage();
596
+ const a = document.createElement('a');
597
+ a.href = dataURL;
598
+ a.download = `annotated-${Date.now()}.png`;
599
+ a.click();
600
+ }
601
+ // --- Public API ---
602
+ exportImage(options) {
603
+ const canvas = document.createElement('canvas');
604
+ canvas.width = this.imageWidth;
605
+ canvas.height = this.imageHeight;
606
+ const ctx = canvas.getContext('2d');
607
+ // Draw base image
608
+ if (this.capturedImage) {
609
+ ctx.drawImage(this.capturedImage, 0, 0, this.imageWidth, this.imageHeight);
610
+ }
611
+ // Draw visible strokes
612
+ for (const stroke of this.strokes) {
613
+ const ann = this.annotations.find(a => a.strokeId === stroke.id);
614
+ if (ann && !ann.visible)
615
+ continue;
616
+ this.drawStrokeOnCtx(ctx, stroke);
617
+ }
618
+ // Optionally draw labels
619
+ if (options?.includeLabels) {
620
+ for (const ann of this.annotations) {
621
+ if (!ann.visible || !ann.label)
622
+ continue;
623
+ const stroke = this.strokes.find(s => s.id === ann.strokeId);
624
+ if (!stroke || stroke.points.length === 0)
625
+ continue;
626
+ // Position label near stroke center
627
+ let cx = 0, cy = 0;
628
+ for (const p of stroke.points) {
629
+ cx += p.x;
630
+ cy += p.y;
631
+ }
632
+ cx /= stroke.points.length;
633
+ cy /= stroke.points.length;
634
+ ctx.font = `${Math.max(14, this.imageWidth / 60)}px sans-serif`;
635
+ ctx.fillStyle = ann.color;
636
+ ctx.strokeStyle = 'white';
637
+ ctx.lineWidth = 3;
638
+ ctx.strokeText(ann.label, cx, cy - 10);
639
+ ctx.fillText(ann.label, cx, cy - 10);
640
+ }
641
+ }
642
+ return canvas.toDataURL('image/png');
643
+ }
644
+ drawStrokeOnCtx(ctx, stroke) {
645
+ if (stroke.points.length === 0)
646
+ return;
647
+ ctx.lineJoin = 'round';
648
+ ctx.lineCap = 'round';
649
+ ctx.strokeStyle = stroke.color;
650
+ ctx.lineWidth = stroke.width * 2;
651
+ if (stroke.points.length === 1) {
652
+ ctx.beginPath();
653
+ ctx.arc(stroke.points[0].x, stroke.points[0].y, stroke.width, 0, Math.PI * 2);
654
+ ctx.fillStyle = stroke.color;
655
+ ctx.fill();
656
+ return;
657
+ }
658
+ ctx.beginPath();
659
+ ctx.moveTo(stroke.points[0].x, stroke.points[0].y);
660
+ for (let i = 1; i < stroke.points.length; i++) {
661
+ const prev = stroke.points[i - 1];
662
+ const curr = stroke.points[i];
663
+ const midX = (prev.x + curr.x) / 2;
664
+ const midY = (prev.y + curr.y) / 2;
665
+ ctx.quadraticCurveTo(prev.x, prev.y, midX, midY);
666
+ }
667
+ const last = stroke.points[stroke.points.length - 1];
668
+ ctx.lineTo(last.x, last.y);
669
+ ctx.stroke();
670
+ }
671
+ exportAnnotations() {
672
+ return {
673
+ annotations: this.annotations.map(a => ({ ...a })),
674
+ strokes: this.strokes.map(s => ({
675
+ ...s,
676
+ points: s.points.map(p => ({ ...p }))
677
+ })),
678
+ imageWidth: this.imageWidth,
679
+ imageHeight: this.imageHeight
680
+ };
681
+ }
682
+ importAnnotations(data) {
683
+ this.annotations = data.annotations.map(a => ({ ...a }));
684
+ this.strokes = data.strokes.map(s => ({
685
+ ...s,
686
+ points: s.points.map(p => ({ ...p }))
687
+ }));
688
+ this.imageWidth = data.imageWidth;
689
+ this.imageHeight = data.imageHeight;
690
+ this.redrawCanvas();
691
+ this.emitAnnotationChange();
692
+ }
693
+ clearAnnotations() {
694
+ this.strokes = [];
695
+ this.annotations = [];
696
+ this.highlightedAnnotationId = null;
697
+ this.colorIndex = 0;
698
+ this.activeColor = PRESET_COLORS[0];
699
+ this.redrawCanvas();
700
+ this.emitAnnotationChange();
701
+ }
702
+ handleModeChange() {
703
+ if (this.mode === 'annotate' && this.capturedImage) {
704
+ requestAnimationFrame(() => this.initDrawCanvas());
705
+ }
706
+ }
707
+ // --- Events ---
708
+ emitCapture() {
709
+ return {
710
+ dataURL: this.capturedImageData,
711
+ width: this.imageWidth,
712
+ height: this.imageHeight
713
+ };
714
+ }
715
+ emitAnnotate(annotation) {
716
+ return { annotation };
717
+ }
718
+ emitAnnotationChange() {
719
+ return { annotations: this.annotations.map(a => ({ ...a })) };
720
+ }
721
+ });
722
+ return _classThis;
723
+ })();
724
+
725
+ exports.SniceCameraAnnotate = SniceCameraAnnotate;
726
+
727
+ return exports;
728
+
729
+ })({}, Snice);
730
+ //# sourceMappingURL=snice-camera-annotate.js.map