@kritzel/editor 0.4.31

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 (298) hide show
  1. package/LICENSE.md +50 -0
  2. package/README.md +5 -0
  3. package/dist/cjs/app-globals-V2Kpy_OQ.js +5 -0
  4. package/dist/cjs/index-B92VHWr4.js +1834 -0
  5. package/dist/cjs/index.cjs.js +2 -0
  6. package/dist/cjs/kritzel-active-users_46.cjs.entry.js +75271 -0
  7. package/dist/cjs/kritzel-brush-style.cjs.entry.js +31 -0
  8. package/dist/cjs/kritzel-editor.cjs.js +25 -0
  9. package/dist/cjs/loader.cjs.js +13 -0
  10. package/dist/collection/collection-manifest.json +65 -0
  11. package/dist/collection/components/kritzel-active-users/kritzel-active-users.css +65 -0
  12. package/dist/collection/components/kritzel-active-users/kritzel-active-users.js +134 -0
  13. package/dist/collection/components/kritzel-avatar/kritzel-avatar.css +58 -0
  14. package/dist/collection/components/kritzel-avatar/kritzel-avatar.js +207 -0
  15. package/dist/collection/components/kritzel-back-to-content/kritzel-back-to-content.css +42 -0
  16. package/dist/collection/components/kritzel-back-to-content/kritzel-back-to-content.js +95 -0
  17. package/dist/collection/components/kritzel-brush-style/kritzel-brush-style.css +43 -0
  18. package/dist/collection/components/kritzel-brush-style/kritzel-brush-style.js +97 -0
  19. package/dist/collection/components/kritzel-button/kritzel-button.css +73 -0
  20. package/dist/collection/components/kritzel-button/kritzel-button.js +118 -0
  21. package/dist/collection/components/kritzel-color/kritzel-color.css +25 -0
  22. package/dist/collection/components/kritzel-color/kritzel-color.js +149 -0
  23. package/dist/collection/components/kritzel-color-palette/kritzel-color-palette.css +46 -0
  24. package/dist/collection/components/kritzel-color-palette/kritzel-color-palette.js +225 -0
  25. package/dist/collection/components/kritzel-context-menu/kritzel-context-menu.css +112 -0
  26. package/dist/collection/components/kritzel-context-menu/kritzel-context-menu.js +368 -0
  27. package/dist/collection/components/kritzel-current-user/kritzel-current-user.css +11 -0
  28. package/dist/collection/components/kritzel-current-user/kritzel-current-user.js +109 -0
  29. package/dist/collection/components/kritzel-current-user-dialog/kritzel-current-user-dialog.css +39 -0
  30. package/dist/collection/components/kritzel-current-user-dialog/kritzel-current-user-dialog.js +169 -0
  31. package/dist/collection/components/kritzel-dialog/kritzel-dialog.css +209 -0
  32. package/dist/collection/components/kritzel-dialog/kritzel-dialog.js +787 -0
  33. package/dist/collection/components/kritzel-dropdown/kritzel-dropdown.css +190 -0
  34. package/dist/collection/components/kritzel-dropdown/kritzel-dropdown.js +418 -0
  35. package/dist/collection/components/kritzel-editor/kritzel-editor.css +161 -0
  36. package/dist/collection/components/kritzel-editor/kritzel-editor.js +4678 -0
  37. package/dist/collection/components/kritzel-export/kritzel-export.css +89 -0
  38. package/dist/collection/components/kritzel-export/kritzel-export.js +246 -0
  39. package/dist/collection/components/kritzel-font/kritzel-font.css +10 -0
  40. package/dist/collection/components/kritzel-font/kritzel-font.js +89 -0
  41. package/dist/collection/components/kritzel-font-family/kritzel-font-family.css +48 -0
  42. package/dist/collection/components/kritzel-font-family/kritzel-font-family.js +122 -0
  43. package/dist/collection/components/kritzel-font-size/kritzel-font-size.css +30 -0
  44. package/dist/collection/components/kritzel-font-size/kritzel-font-size.js +117 -0
  45. package/dist/collection/components/kritzel-input/kritzel-input.css +69 -0
  46. package/dist/collection/components/kritzel-input/kritzel-input.js +198 -0
  47. package/dist/collection/components/kritzel-line-endings/kritzel-line-endings.css +60 -0
  48. package/dist/collection/components/kritzel-line-endings/kritzel-line-endings.js +165 -0
  49. package/dist/collection/components/kritzel-loading-overlay/kritzel-loading-overlay.css +54 -0
  50. package/dist/collection/components/kritzel-loading-overlay/kritzel-loading-overlay.js +70 -0
  51. package/dist/collection/components/kritzel-login-dialog/kritzel-login-dialog.css +98 -0
  52. package/dist/collection/components/kritzel-login-dialog/kritzel-login-dialog.js +239 -0
  53. package/dist/collection/components/kritzel-master-detail/kritzel-master-detail.css +190 -0
  54. package/dist/collection/components/kritzel-master-detail/kritzel-master-detail.js +201 -0
  55. package/dist/collection/components/kritzel-menu/kritzel-menu.css +34 -0
  56. package/dist/collection/components/kritzel-menu/kritzel-menu.js +297 -0
  57. package/dist/collection/components/kritzel-menu-item/kritzel-menu-item.css +167 -0
  58. package/dist/collection/components/kritzel-menu-item/kritzel-menu-item.js +298 -0
  59. package/dist/collection/components/kritzel-more-menu/kritzel-more-menu.css +58 -0
  60. package/dist/collection/components/kritzel-more-menu/kritzel-more-menu.js +381 -0
  61. package/dist/collection/components/kritzel-notification-card/kritzel-notification-card.css +101 -0
  62. package/dist/collection/components/kritzel-notification-card/kritzel-notification-card.js +173 -0
  63. package/dist/collection/components/kritzel-numeric-input/kritzel-numeric-input.css +102 -0
  64. package/dist/collection/components/kritzel-numeric-input/kritzel-numeric-input.js +255 -0
  65. package/dist/collection/components/kritzel-opacity-slider/kritzel-opacity-slider.css +85 -0
  66. package/dist/collection/components/kritzel-opacity-slider/kritzel-opacity-slider.js +164 -0
  67. package/dist/collection/components/kritzel-pill-tabs/kritzel-pill-tabs.css +68 -0
  68. package/dist/collection/components/kritzel-pill-tabs/kritzel-pill-tabs.js +135 -0
  69. package/dist/collection/components/kritzel-portal/kritzel-portal.js +432 -0
  70. package/dist/collection/components/kritzel-settings/kritzel-settings.css +137 -0
  71. package/dist/collection/components/kritzel-settings/kritzel-settings.js +448 -0
  72. package/dist/collection/components/kritzel-shape-fill/kritzel-shape-fill.css +47 -0
  73. package/dist/collection/components/kritzel-shape-fill/kritzel-shape-fill.js +93 -0
  74. package/dist/collection/components/kritzel-share-dialog/kritzel-share-dialog.css +150 -0
  75. package/dist/collection/components/kritzel-share-dialog/kritzel-share-dialog.js +308 -0
  76. package/dist/collection/components/kritzel-slide-toggle/kritzel-slide-toggle.css +48 -0
  77. package/dist/collection/components/kritzel-slide-toggle/kritzel-slide-toggle.js +119 -0
  78. package/dist/collection/components/kritzel-split-button/kritzel-split-button.css +78 -0
  79. package/dist/collection/components/kritzel-split-button/kritzel-split-button.js +433 -0
  80. package/dist/collection/components/kritzel-stroke-size/kritzel-stroke-size.css +37 -0
  81. package/dist/collection/components/kritzel-stroke-size/kritzel-stroke-size.js +89 -0
  82. package/dist/collection/components/kritzel-tool-config/kritzel-tool-config.css +38 -0
  83. package/dist/collection/components/kritzel-tool-config/kritzel-tool-config.js +467 -0
  84. package/dist/collection/components/kritzel-toolbar/kritzel-toolbar.css +348 -0
  85. package/dist/collection/components/kritzel-toolbar/kritzel-toolbar.js +588 -0
  86. package/dist/collection/components/kritzel-tooltip/kritzel-tooltip.css +18 -0
  87. package/dist/collection/components/kritzel-tooltip/kritzel-tooltip.js +388 -0
  88. package/dist/collection/components/kritzel-utility-panel/kritzel-utility-panel.css +46 -0
  89. package/dist/collection/components/kritzel-utility-panel/kritzel-utility-panel.js +146 -0
  90. package/dist/collection/components/kritzel-workspace-manager/kritzel-workspace-manager.css +16 -0
  91. package/dist/collection/components/kritzel-workspace-manager/kritzel-workspace-manager.js +365 -0
  92. package/dist/collection/components/kritzel-zoom-panel/kritzel-zoom-panel.css +72 -0
  93. package/dist/collection/components/kritzel-zoom-panel/kritzel-zoom-panel.js +173 -0
  94. package/dist/collection/index.js +1 -0
  95. package/dist/components/index.d.ts +121 -0
  96. package/dist/components/index.js +48 -0
  97. package/dist/components/kritzel-active-users.d.ts +11 -0
  98. package/dist/components/kritzel-active-users.js +6 -0
  99. package/dist/components/kritzel-avatar.d.ts +11 -0
  100. package/dist/components/kritzel-avatar.js +6 -0
  101. package/dist/components/kritzel-awareness-cursors.js +6 -0
  102. package/dist/components/kritzel-back-to-content.d.ts +11 -0
  103. package/dist/components/kritzel-back-to-content.js +6 -0
  104. package/dist/components/kritzel-brush-style.d.ts +11 -0
  105. package/dist/components/kritzel-brush-style.js +64 -0
  106. package/dist/components/kritzel-button.d.ts +11 -0
  107. package/dist/components/kritzel-button.js +6 -0
  108. package/dist/components/kritzel-color-palette.d.ts +11 -0
  109. package/dist/components/kritzel-color-palette.js +6 -0
  110. package/dist/components/kritzel-color.d.ts +11 -0
  111. package/dist/components/kritzel-color.js +6 -0
  112. package/dist/components/kritzel-context-menu.d.ts +11 -0
  113. package/dist/components/kritzel-context-menu.js +6 -0
  114. package/dist/components/kritzel-current-user-dialog.d.ts +11 -0
  115. package/dist/components/kritzel-current-user-dialog.js +6 -0
  116. package/dist/components/kritzel-current-user.d.ts +11 -0
  117. package/dist/components/kritzel-current-user.js +6 -0
  118. package/dist/components/kritzel-cursor-trail.js +6 -0
  119. package/dist/components/kritzel-dialog.d.ts +11 -0
  120. package/dist/components/kritzel-dialog.js +6 -0
  121. package/dist/components/kritzel-dropdown.d.ts +11 -0
  122. package/dist/components/kritzel-dropdown.js +6 -0
  123. package/dist/components/kritzel-editor.d.ts +11 -0
  124. package/dist/components/kritzel-editor.js +1792 -0
  125. package/dist/components/kritzel-engine.js +6 -0
  126. package/dist/components/kritzel-export.d.ts +11 -0
  127. package/dist/components/kritzel-export.js +6 -0
  128. package/dist/components/kritzel-font-family.d.ts +11 -0
  129. package/dist/components/kritzel-font-family.js +6 -0
  130. package/dist/components/kritzel-font-size.d.ts +11 -0
  131. package/dist/components/kritzel-font-size.js +6 -0
  132. package/dist/components/kritzel-font.d.ts +11 -0
  133. package/dist/components/kritzel-font.js +6 -0
  134. package/dist/components/kritzel-icon.js +6 -0
  135. package/dist/components/kritzel-input.d.ts +11 -0
  136. package/dist/components/kritzel-input.js +6 -0
  137. package/dist/components/kritzel-line-endings.d.ts +11 -0
  138. package/dist/components/kritzel-line-endings.js +6 -0
  139. package/dist/components/kritzel-loading-overlay.d.ts +11 -0
  140. package/dist/components/kritzel-loading-overlay.js +6 -0
  141. package/dist/components/kritzel-login-dialog.d.ts +11 -0
  142. package/dist/components/kritzel-login-dialog.js +6 -0
  143. package/dist/components/kritzel-master-detail.d.ts +11 -0
  144. package/dist/components/kritzel-master-detail.js +6 -0
  145. package/dist/components/kritzel-menu-item.d.ts +11 -0
  146. package/dist/components/kritzel-menu-item.js +6 -0
  147. package/dist/components/kritzel-menu.d.ts +11 -0
  148. package/dist/components/kritzel-menu.js +6 -0
  149. package/dist/components/kritzel-more-menu.d.ts +11 -0
  150. package/dist/components/kritzel-more-menu.js +6 -0
  151. package/dist/components/kritzel-notification-card.d.ts +11 -0
  152. package/dist/components/kritzel-notification-card.js +6 -0
  153. package/dist/components/kritzel-numeric-input.d.ts +11 -0
  154. package/dist/components/kritzel-numeric-input.js +6 -0
  155. package/dist/components/kritzel-opacity-slider.d.ts +11 -0
  156. package/dist/components/kritzel-opacity-slider.js +6 -0
  157. package/dist/components/kritzel-pill-tabs.d.ts +11 -0
  158. package/dist/components/kritzel-pill-tabs.js +6 -0
  159. package/dist/components/kritzel-portal.d.ts +11 -0
  160. package/dist/components/kritzel-portal.js +6 -0
  161. package/dist/components/kritzel-settings.d.ts +11 -0
  162. package/dist/components/kritzel-settings.js +6 -0
  163. package/dist/components/kritzel-shape-fill.d.ts +11 -0
  164. package/dist/components/kritzel-shape-fill.js +6 -0
  165. package/dist/components/kritzel-share-dialog.d.ts +11 -0
  166. package/dist/components/kritzel-share-dialog.js +6 -0
  167. package/dist/components/kritzel-slide-toggle.d.ts +11 -0
  168. package/dist/components/kritzel-slide-toggle.js +6 -0
  169. package/dist/components/kritzel-split-button.d.ts +11 -0
  170. package/dist/components/kritzel-split-button.js +6 -0
  171. package/dist/components/kritzel-stroke-size.d.ts +11 -0
  172. package/dist/components/kritzel-stroke-size.js +6 -0
  173. package/dist/components/kritzel-tool-config.d.ts +11 -0
  174. package/dist/components/kritzel-tool-config.js +6 -0
  175. package/dist/components/kritzel-toolbar.d.ts +11 -0
  176. package/dist/components/kritzel-toolbar.js +6 -0
  177. package/dist/components/kritzel-tooltip.d.ts +11 -0
  178. package/dist/components/kritzel-tooltip.js +6 -0
  179. package/dist/components/kritzel-utility-panel.d.ts +11 -0
  180. package/dist/components/kritzel-utility-panel.js +6 -0
  181. package/dist/components/kritzel-watermark.js +6 -0
  182. package/dist/components/kritzel-workspace-manager.d.ts +11 -0
  183. package/dist/components/kritzel-workspace-manager.js +6 -0
  184. package/dist/components/kritzel-zoom-panel.d.ts +11 -0
  185. package/dist/components/kritzel-zoom-panel.js +6 -0
  186. package/dist/components/p-4-qLegHb.js +142 -0
  187. package/dist/components/p-5qkOM1RJ.js +1557 -0
  188. package/dist/components/p-B3Tqoyl9.js +43 -0
  189. package/dist/components/p-B5xYV1o3.js +77 -0
  190. package/dist/components/p-B6UJztrf.js +290 -0
  191. package/dist/components/p-BDjRSoAc.js +43 -0
  192. package/dist/components/p-BFTU3MAI.js +7 -0
  193. package/dist/components/p-BGmTmdLe.js +167 -0
  194. package/dist/components/p-BN8VWPlq.js +164 -0
  195. package/dist/components/p-BZ_KnHdR.js +222 -0
  196. package/dist/components/p-B_gT0lCn.js +94 -0
  197. package/dist/components/p-BfMlwIcG.js +62 -0
  198. package/dist/components/p-BjFrt1q0.js +62 -0
  199. package/dist/components/p-Blq9a1ni.js +3267 -0
  200. package/dist/components/p-BrGJIoGK.js +52 -0
  201. package/dist/components/p-BvG3JO85.js +56 -0
  202. package/dist/components/p-CS3YZVYE.js +319 -0
  203. package/dist/components/p-CVxGF4bJ.js +150 -0
  204. package/dist/components/p-Ckqh1tqY.js +468 -0
  205. package/dist/components/p-ClfOtiNp.js +84 -0
  206. package/dist/components/p-CmjXRLdr.js +220 -0
  207. package/dist/components/p-CoNexfpB.js +106 -0
  208. package/dist/components/p-Cp4e4oTE.js +122 -0
  209. package/dist/components/p-CrIEmItB.js +85 -0
  210. package/dist/components/p-CvaxFYS0.js +304 -0
  211. package/dist/components/p-CwBxnzYu.js +57 -0
  212. package/dist/components/p-Cy_cLtOP.js +3456 -0
  213. package/dist/components/p-CzUeIini.js +381 -0
  214. package/dist/components/p-D0tPTPkR.js +99 -0
  215. package/dist/components/p-DJxgPPfs.js +194 -0
  216. package/dist/components/p-DOJCDPVD.js +55 -0
  217. package/dist/components/p-DVv8ChhE.js +91 -0
  218. package/dist/components/p-DXZBWJBt.js +70 -0
  219. package/dist/components/p-DXuf225S.js +53 -0
  220. package/dist/components/p-DZsSiMnA.js +63037 -0
  221. package/dist/components/p-DqOC_Yck.js +112 -0
  222. package/dist/components/p-Ds0uNtwQ.js +97 -0
  223. package/dist/components/p-DyRJFg4w.js +57 -0
  224. package/dist/components/p-GbCxpbQ6.js +88 -0
  225. package/dist/components/p-McY5wZ0h.js +135 -0
  226. package/dist/components/p-QEue33R5.js +70 -0
  227. package/dist/components/p-R1D8Sr0l.js +299 -0
  228. package/dist/components/p-SLnqczCS.js +49 -0
  229. package/dist/components/p-hQwVRh0t.js +147 -0
  230. package/dist/components/p-h_uh_Njf.js +63 -0
  231. package/dist/components/p-kOINnzaR.js +161 -0
  232. package/dist/components/p-peZjvnkK.js +486 -0
  233. package/dist/esm/app-globals-DQuL1Twl.js +3 -0
  234. package/dist/esm/index-OjbYJz-P.js +1807 -0
  235. package/dist/esm/index.js +1 -0
  236. package/dist/esm/kritzel-active-users_46.entry.js +75224 -0
  237. package/dist/esm/kritzel-brush-style.entry.js +29 -0
  238. package/dist/esm/kritzel-editor.js +21 -0
  239. package/dist/esm/loader.js +11 -0
  240. package/dist/index.cjs.js +1 -0
  241. package/dist/index.js +1 -0
  242. package/dist/kritzel-editor/index.esm.js +1 -0
  243. package/dist/kritzel-editor/kritzel-editor.esm.js +21 -0
  244. package/dist/kritzel-editor/p-501047d8.entry.js +29 -0
  245. package/dist/kritzel-editor/p-60319edb.entry.js +75224 -0
  246. package/dist/kritzel-editor/p-DQuL1Twl.js +3 -0
  247. package/dist/kritzel-editor/p-OjbYJz-P.js +1790 -0
  248. package/dist/types/components/kritzel-active-users/kritzel-active-users.d.ts +21 -0
  249. package/dist/types/components/kritzel-avatar/kritzel-avatar.d.ts +27 -0
  250. package/dist/types/components/kritzel-back-to-content/kritzel-back-to-content.d.ts +17 -0
  251. package/dist/types/components/kritzel-brush-style/kritzel-brush-style.d.ts +11 -0
  252. package/dist/types/components/kritzel-button/kritzel-button.d.ts +13 -0
  253. package/dist/types/components/kritzel-color/kritzel-color.d.ts +10 -0
  254. package/dist/types/components/kritzel-color-palette/kritzel-color-palette.d.ts +17 -0
  255. package/dist/types/components/kritzel-context-menu/kritzel-context-menu.d.ts +40 -0
  256. package/dist/types/components/kritzel-current-user/kritzel-current-user.d.ts +15 -0
  257. package/dist/types/components/kritzel-current-user-dialog/kritzel-current-user-dialog.d.ts +18 -0
  258. package/dist/types/components/kritzel-dialog/kritzel-dialog.d.ts +85 -0
  259. package/dist/types/components/kritzel-dropdown/kritzel-dropdown.d.ts +48 -0
  260. package/dist/types/components/kritzel-editor/kritzel-editor.d.ts +356 -0
  261. package/dist/types/components/kritzel-export/kritzel-export.d.ts +35 -0
  262. package/dist/types/components/kritzel-font/kritzel-font.d.ts +6 -0
  263. package/dist/types/components/kritzel-font-family/kritzel-font-family.d.ts +17 -0
  264. package/dist/types/components/kritzel-font-size/kritzel-font-size.d.ts +10 -0
  265. package/dist/types/components/kritzel-input/kritzel-input.d.ts +22 -0
  266. package/dist/types/components/kritzel-line-endings/kritzel-line-endings.d.ts +21 -0
  267. package/dist/types/components/kritzel-loading-overlay/kritzel-loading-overlay.d.ts +11 -0
  268. package/dist/types/components/kritzel-login-dialog/kritzel-login-dialog.d.ts +32 -0
  269. package/dist/types/components/kritzel-master-detail/kritzel-master-detail.d.ts +25 -0
  270. package/dist/types/components/kritzel-menu/kritzel-menu.d.ts +25 -0
  271. package/dist/types/components/kritzel-menu-item/kritzel-menu-item.d.ts +28 -0
  272. package/dist/types/components/kritzel-more-menu/kritzel-more-menu.d.ts +55 -0
  273. package/dist/types/components/kritzel-notification-card/kritzel-notification-card.d.ts +22 -0
  274. package/dist/types/components/kritzel-numeric-input/kritzel-numeric-input.d.ts +32 -0
  275. package/dist/types/components/kritzel-opacity-slider/kritzel-opacity-slider.d.ts +17 -0
  276. package/dist/types/components/kritzel-pill-tabs/kritzel-pill-tabs.d.ts +26 -0
  277. package/dist/types/components/kritzel-portal/kritzel-portal.d.ts +33 -0
  278. package/dist/types/components/kritzel-settings/kritzel-settings.d.ts +64 -0
  279. package/dist/types/components/kritzel-shape-fill/kritzel-shape-fill.d.ts +10 -0
  280. package/dist/types/components/kritzel-share-dialog/kritzel-share-dialog.d.ts +49 -0
  281. package/dist/types/components/kritzel-slide-toggle/kritzel-slide-toggle.d.ts +14 -0
  282. package/dist/types/components/kritzel-split-button/kritzel-split-button.d.ts +38 -0
  283. package/dist/types/components/kritzel-stroke-size/kritzel-stroke-size.d.ts +8 -0
  284. package/dist/types/components/kritzel-tool-config/kritzel-tool-config.d.ts +39 -0
  285. package/dist/types/components/kritzel-toolbar/kritzel-toolbar.d.ts +76 -0
  286. package/dist/types/components/kritzel-tooltip/kritzel-tooltip.d.ts +30 -0
  287. package/dist/types/components/kritzel-utility-panel/kritzel-utility-panel.d.ts +14 -0
  288. package/dist/types/components/kritzel-workspace-manager/kritzel-workspace-manager.d.ts +40 -0
  289. package/dist/types/components/kritzel-zoom-panel/kritzel-zoom-panel.d.ts +20 -0
  290. package/dist/types/components.d.ts +3166 -0
  291. package/dist/types/index.d.ts +8 -0
  292. package/dist/types/stencil-public-runtime.d.ts +1873 -0
  293. package/loader/cdn.js +1 -0
  294. package/loader/index.cjs.js +1 -0
  295. package/loader/index.d.ts +24 -0
  296. package/loader/index.es2017.js +1 -0
  297. package/loader/index.js +2 -0
  298. package/package.json +83 -0
@@ -0,0 +1,190 @@
1
+ :host {
2
+ display: inline-flex;
3
+ vertical-align: middle;
4
+ width: 100%;
5
+ position: relative;
6
+ }
7
+
8
+ .dropdown-wrapper {
9
+ display: flex;
10
+ align-items: center;
11
+ border: 1px solid var(--kritzel-dropdown-border-color, #ebebeb);
12
+ border-radius: var(--kritzel-dropdown-border-radius, 6px);
13
+ overflow: visible;
14
+ height: 38px;
15
+ width: 100%;
16
+ position: relative;
17
+ }
18
+
19
+ .dropdown-wrapper:hover:not(:focus-within) {
20
+ border-color: var(--kritzel-dropdown-hover-border-color, #cccccc);
21
+ }
22
+
23
+ .dropdown-container {
24
+ flex: 1;
25
+ height: 100%;
26
+ min-width: 0;
27
+ }
28
+
29
+ .dropdown-trigger {
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: space-between;
33
+ gap: 8px;
34
+ padding: 0 8px;
35
+ height: 100%;
36
+ width: 100%;
37
+ box-sizing: border-box;
38
+ border-radius: var(--kritzel-dropdown-border-radius, 6px);
39
+ border: none;
40
+ background-color: var(--kritzel-dropdown-background, #ffffff);
41
+ cursor: var(--kritzel-global-pointer-cursor, pointer);
42
+ outline: none;
43
+ font-size: inherit;
44
+ font-family: inherit;
45
+ color: var(--kritzel-dropdown-text-color, #333333);
46
+ -webkit-tap-highlight-color: transparent;
47
+ text-align: left;
48
+ }
49
+
50
+ .dropdown-trigger:focus-visible {
51
+ outline: revert;
52
+ }
53
+
54
+ .dropdown-trigger.has-suffix-border {
55
+ border-right: 1px solid var(--kritzel-global-border-color, #ebebeb);
56
+ border-top-right-radius: 0;
57
+ border-bottom-right-radius: 0;
58
+ }
59
+
60
+ .dropdown-trigger.has-prefix-border {
61
+ border-left: 1px solid var(--kritzel-global-border-color, #ebebeb);
62
+ border-top-left-radius: 0;
63
+ border-bottom-left-radius: 0;
64
+ }
65
+
66
+ .dropdown-trigger-label {
67
+ flex: 1;
68
+ overflow: hidden;
69
+ text-overflow: ellipsis;
70
+ white-space: nowrap;
71
+ min-width: 0;
72
+ }
73
+
74
+ .dropdown-trigger-arrow {
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ width: 16px;
79
+ height: 16px;
80
+ flex-shrink: 0;
81
+ transition: transform 0.2s ease;
82
+ }
83
+
84
+ .dropdown-trigger-arrow svg {
85
+ width: 100%;
86
+ height: 100%;
87
+ }
88
+
89
+ .dropdown-trigger.is-open .dropdown-trigger-arrow {
90
+ transform: rotate(180deg);
91
+ }
92
+
93
+ .dropdown-trigger.is-open.open-up .dropdown-trigger-arrow {
94
+ transform: rotate(0deg);
95
+ }
96
+
97
+ .dropdown-menu {
98
+ position: absolute;
99
+ left: 0;
100
+ right: 0;
101
+ margin: 0;
102
+ padding: 4px 0;
103
+ list-style: none;
104
+ background-color: var(--kritzel-dropdown-background, #ffffff);
105
+ border: 1px solid var(--kritzel-global-border-color, #ebebeb);
106
+ border-radius: var(--kritzel-dropdown-menu-border-radius, var(--kritzel-dropdown-border-radius, 6px));
107
+ box-shadow: var(--kritzel-toolbar-box-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));
108
+ z-index: 1000;
109
+ max-height: 240px;
110
+ overflow-y: auto;
111
+ opacity: 0;
112
+ visibility: hidden;
113
+ transition:
114
+ opacity 0.15s ease,
115
+ transform 0.15s ease,
116
+ visibility 0.15s;
117
+ outline: none;
118
+ }
119
+
120
+ /* Open downward (default) */
121
+ .dropdown-menu.open-down {
122
+ top: calc(100% + 4px);
123
+ bottom: auto;
124
+ transform: translateY(-8px);
125
+ }
126
+
127
+ /* Open upward */
128
+ .dropdown-menu.open-up {
129
+ bottom: calc(100% + 4px);
130
+ top: auto;
131
+ transform: translateY(8px);
132
+ }
133
+
134
+ .dropdown-menu.is-open {
135
+ opacity: 1;
136
+ visibility: inherit;
137
+ transform: translateY(0);
138
+ }
139
+
140
+ /* Adjust box shadow for upward opening */
141
+ .dropdown-menu.open-up {
142
+ box-shadow: var(--kritzel-toolbar-box-shadow, 0 -4px 12px rgba(0, 0, 0, 0.15));
143
+ }
144
+
145
+ .dropdown-option {
146
+ display: flex;
147
+ align-items: center;
148
+ justify-content: space-between;
149
+ gap: 8px;
150
+ padding: 8px 12px;
151
+ cursor: var(--kritzel-global-pointer-cursor, pointer);
152
+ color: var(--kritzel-dropdown-text-color, #333333);
153
+ transition: background-color 0.1s ease;
154
+ -webkit-tap-highlight-color: transparent;
155
+ }
156
+
157
+ .dropdown-option.is-focused {
158
+ background-color: var(--kritzel-dropdown-hover-background-color, #f0f0f0);
159
+ }
160
+
161
+ .dropdown-option.is-selected {
162
+ font-weight: 600;
163
+ background-color: var(--kritzel-dropdown-selected-background-color, #007bff1a);
164
+ }
165
+
166
+ .dropdown-option-check {
167
+ display: flex;
168
+ align-items: center;
169
+ justify-content: center;
170
+ width: 16px;
171
+ height: 16px;
172
+ flex-shrink: 0;
173
+ color: var(--kritzel-dropdown-accent-color, #007bff);
174
+ }
175
+
176
+ .dropdown-option-check svg {
177
+ width: 100%;
178
+ height: 100%;
179
+ }
180
+
181
+ /* Scrollbar styling */
182
+ .dropdown-menu {
183
+ scrollbar-color: var(--kritzel-global-scrollbar-thumb-color, #ebebeb) transparent;
184
+ scrollbar-width: thin;
185
+ }
186
+
187
+ ::slotted(*) {
188
+ height: 100%;
189
+ box-sizing: border-box;
190
+ }
@@ -0,0 +1,418 @@
1
+ import { Host, h } from "@stencil/core";
2
+ export class KritzelDropdown {
3
+ el;
4
+ options = [];
5
+ optionsChanged() {
6
+ this.updateInternalValue(this.internalValue, true);
7
+ }
8
+ value;
9
+ externalValueChanged(newValue) {
10
+ if (newValue !== this.internalValue) {
11
+ this.updateInternalValue(newValue, false);
12
+ }
13
+ }
14
+ width;
15
+ selectStyles = {};
16
+ /** Force the dropdown to open in a specific direction instead of auto-detecting */
17
+ forceOpenDirection;
18
+ internalValue;
19
+ hasSuffixContent = false;
20
+ hasPrefixContent = false;
21
+ isOpen = false;
22
+ focusedIndex = -1;
23
+ openDirection = 'down';
24
+ valueChanged;
25
+ suffixSlotElement;
26
+ prefixSlotElement;
27
+ triggerElement;
28
+ menuElement;
29
+ wrapperElement;
30
+ componentWillLoad() {
31
+ this.updateInternalValue(this.value, false);
32
+ this.evaluateSuffixContent();
33
+ this.evaluatePrefixContent();
34
+ }
35
+ disconnectedCallback() {
36
+ // Close menu when component is removed from DOM to prevent orphaned open dropdowns
37
+ if (this.isOpen) {
38
+ this.isOpen = false;
39
+ }
40
+ }
41
+ handleDocumentClick(event) {
42
+ if (this.isOpen && !this.el.contains(event.target)) {
43
+ this.closeMenu();
44
+ }
45
+ }
46
+ handleDocumentKeydown(event) {
47
+ if (this.isOpen && event.key === 'Escape') {
48
+ event.stopPropagation();
49
+ event.preventDefault();
50
+ this.closeMenu();
51
+ this.triggerElement?.focus();
52
+ }
53
+ }
54
+ updateInternalValue(proposedValue, emitChange) {
55
+ let finalValue = proposedValue;
56
+ // Only fall back to an option if the proposed value is completely missing.
57
+ // We intentionally don't sanitize invalid values here, to allow for values
58
+ // that might be added to options asynchronously later (preventing race conditions).
59
+ if (!finalValue && this.options && this.options.length > 0) {
60
+ finalValue = this.options[0].value;
61
+ }
62
+ else if (!finalValue) {
63
+ finalValue = undefined;
64
+ }
65
+ if (this.internalValue !== finalValue) {
66
+ this.internalValue = finalValue;
67
+ if (emitChange || (proposedValue !== finalValue && proposedValue !== undefined)) {
68
+ this.valueChanged.emit(this.internalValue);
69
+ }
70
+ }
71
+ }
72
+ toggleMenu = () => {
73
+ if (this.isOpen) {
74
+ this.closeMenu();
75
+ }
76
+ else {
77
+ this.openMenu();
78
+ }
79
+ };
80
+ openMenu = () => {
81
+ this.calculateMenuDirection();
82
+ this.isOpen = true;
83
+ const currentIndex = this.options.findIndex(opt => opt.value === this.internalValue);
84
+ this.focusedIndex = currentIndex >= 0 ? currentIndex : 0;
85
+ // Focus the menu after it opens
86
+ requestAnimationFrame(() => {
87
+ this.menuElement?.focus();
88
+ });
89
+ };
90
+ calculateMenuDirection = () => {
91
+ if (this.forceOpenDirection) {
92
+ this.openDirection = this.forceOpenDirection;
93
+ return;
94
+ }
95
+ if (!this.wrapperElement) {
96
+ this.openDirection = 'down';
97
+ return;
98
+ }
99
+ const wrapperRect = this.wrapperElement.getBoundingClientRect();
100
+ const viewportHeight = window.innerHeight;
101
+ const spaceBelow = viewportHeight - wrapperRect.bottom;
102
+ const spaceAbove = wrapperRect.top;
103
+ // Estimate menu height (max 240px or fewer based on options)
104
+ const estimatedOptionHeight = 36; // padding + content
105
+ const menuPadding = 8; // 4px top + 4px bottom
106
+ const estimatedMenuHeight = Math.min(240, this.options.length * estimatedOptionHeight + menuPadding);
107
+ // Prefer opening downward, but switch to upward if not enough space below
108
+ // and there's more space above
109
+ if (spaceBelow < estimatedMenuHeight && spaceAbove > spaceBelow) {
110
+ this.openDirection = 'up';
111
+ }
112
+ else {
113
+ this.openDirection = 'down';
114
+ }
115
+ };
116
+ closeMenu = () => {
117
+ this.isOpen = false;
118
+ this.focusedIndex = -1;
119
+ // Note: openDirection is intentionally NOT reset here to allow the close animation
120
+ // to play in the same direction the menu was opened
121
+ };
122
+ selectOption = (option) => {
123
+ if (this.internalValue !== option.value) {
124
+ this.internalValue = option.value;
125
+ this.valueChanged.emit(this.internalValue);
126
+ }
127
+ this.closeMenu();
128
+ this.triggerElement?.focus();
129
+ };
130
+ handleTriggerKeyDown = (event) => {
131
+ switch (event.key) {
132
+ case 'Enter':
133
+ case ' ':
134
+ case 'ArrowDown':
135
+ case 'ArrowUp':
136
+ event.preventDefault();
137
+ this.openMenu();
138
+ break;
139
+ }
140
+ };
141
+ handleMenuKeyDown = (event) => {
142
+ switch (event.key) {
143
+ case 'ArrowDown':
144
+ event.preventDefault();
145
+ this.focusedIndex = Math.min(this.focusedIndex + 1, this.options.length - 1);
146
+ this.scrollFocusedOptionIntoView();
147
+ break;
148
+ case 'ArrowUp':
149
+ event.preventDefault();
150
+ this.focusedIndex = Math.max(this.focusedIndex - 1, 0);
151
+ this.scrollFocusedOptionIntoView();
152
+ break;
153
+ case 'Enter':
154
+ case ' ':
155
+ event.preventDefault();
156
+ if (this.focusedIndex >= 0 && this.focusedIndex < this.options.length) {
157
+ this.selectOption(this.options[this.focusedIndex]);
158
+ }
159
+ break;
160
+ case 'Home':
161
+ event.preventDefault();
162
+ this.focusedIndex = 0;
163
+ this.scrollFocusedOptionIntoView();
164
+ break;
165
+ case 'End':
166
+ event.preventDefault();
167
+ this.focusedIndex = this.options.length - 1;
168
+ this.scrollFocusedOptionIntoView();
169
+ break;
170
+ case 'Tab':
171
+ this.closeMenu();
172
+ break;
173
+ }
174
+ };
175
+ scrollFocusedOptionIntoView = () => {
176
+ if (!this.menuElement || this.focusedIndex < 0) {
177
+ return;
178
+ }
179
+ // Use requestAnimationFrame to ensure the DOM has updated with the new focused class
180
+ requestAnimationFrame(() => {
181
+ const focusedOption = this.menuElement?.querySelector('.dropdown-option.is-focused');
182
+ if (focusedOption) {
183
+ focusedOption.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
184
+ }
185
+ });
186
+ };
187
+ handleOptionMouseEnter = (index) => {
188
+ this.focusedIndex = index;
189
+ };
190
+ evaluateSuffixContent = () => {
191
+ if (this.suffixSlotElement) {
192
+ const newHasContent = this.suffixSlotElement.assignedNodes({ flatten: true }).length > 0;
193
+ if (this.hasSuffixContent !== newHasContent) {
194
+ this.hasSuffixContent = newHasContent;
195
+ }
196
+ }
197
+ else if (this.hasSuffixContent !== false) {
198
+ this.hasSuffixContent = false;
199
+ }
200
+ };
201
+ evaluatePrefixContent = () => {
202
+ if (this.prefixSlotElement) {
203
+ const newHasContent = this.prefixSlotElement.assignedNodes({ flatten: true }).length > 0;
204
+ if (this.hasPrefixContent !== newHasContent) {
205
+ this.hasPrefixContent = newHasContent;
206
+ }
207
+ }
208
+ else if (this.hasPrefixContent !== false) {
209
+ this.hasPrefixContent = false;
210
+ }
211
+ };
212
+ getSelectedLabel() {
213
+ const selectedOption = this.options.find(opt => opt.value === this.internalValue);
214
+ return selectedOption?.label ?? '';
215
+ }
216
+ getSelectedStyle() {
217
+ const selectedOption = this.options.find(opt => opt.value === this.internalValue);
218
+ return selectedOption?.style;
219
+ }
220
+ render() {
221
+ const triggerClasses = {
222
+ 'dropdown-trigger': true,
223
+ 'has-suffix-border': this.hasSuffixContent,
224
+ 'has-prefix-border': this.hasPrefixContent,
225
+ 'is-open': this.isOpen,
226
+ 'open-up': this.openDirection === 'up',
227
+ };
228
+ const menuClasses = {
229
+ 'dropdown-menu': true,
230
+ 'is-open': this.isOpen,
231
+ 'open-up': this.openDirection === 'up',
232
+ 'open-down': this.openDirection === 'down',
233
+ };
234
+ return (h(Host, { key: '66ec6cbffa9fd25a7bad62d6e3477c0fe7726861' }, h("div", { key: '6dc1f20070dde95ab54f44d158659e99bd81b834', class: "dropdown-wrapper", ref: el => (this.wrapperElement = el) }, h("slot", { key: 'd9655fc7f5e6a0d74b4a1904a12cc0bf478ccf4e', name: "prefix", ref: el => (this.prefixSlotElement = el), onSlotchange: this.evaluatePrefixContent }), h("div", { key: '325af053df9588e99b493c422a1f369f0af2243a', class: "dropdown-container", style: { width: this.width } }, h("button", { key: '626d54cd8e01221b1cd61e61b9d53b534e7603db', type: "button", class: triggerClasses, style: { ...this.selectStyles, ...this.getSelectedStyle() }, onClick: this.toggleMenu, onKeyDown: this.handleTriggerKeyDown, "aria-haspopup": "listbox", "aria-expanded": this.isOpen ? 'true' : 'false', ref: el => (this.triggerElement = el) }, h("span", { key: 'bbc3ec7297ee98c1903cfd547ca20daf3a5f1311', class: "dropdown-trigger-label" }, this.getSelectedLabel()), h("span", { key: '591b71aec72d2e6eaa96e8eb4c91b1f34eb2177a', class: "dropdown-trigger-arrow", "aria-hidden": "true" }, h("svg", { key: '317034d40ceab9ca72090f6a58fc0fa5b92f2db0', xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("polyline", { key: '98867959ff1d7fd5515a3fe400bdc2378013dcb9', points: "6 9 12 15 18 9" }))))), h("slot", { key: 'f9d2f73f7b233a30f57ba4a9209e1a32a8ee5e70', name: "suffix", ref: el => (this.suffixSlotElement = el), onSlotchange: this.evaluateSuffixContent }), h("ul", { key: 'f15048910c0d24855fb1e940d2adc994dee83d06', class: menuClasses, role: "listbox", tabindex: "-1", onKeyDown: this.handleMenuKeyDown, ref: el => (this.menuElement = el) }, this.options.map((option, index) => {
235
+ const isSelected = option.value === this.internalValue;
236
+ const isFocused = index === this.focusedIndex;
237
+ const optionClasses = {
238
+ 'dropdown-option': true,
239
+ 'is-selected': isSelected,
240
+ 'is-focused': isFocused,
241
+ };
242
+ return (h("li", { class: optionClasses, role: "option", "aria-selected": isSelected ? 'true' : 'false', style: option.style, onClick: () => this.selectOption(option), onMouseEnter: () => this.handleOptionMouseEnter(index) }, option.label, isSelected && (h("span", { class: "dropdown-option-check", "aria-hidden": "true" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("polyline", { points: "20 6 9 17 4 12" }))))));
243
+ })))));
244
+ }
245
+ static get is() { return "kritzel-dropdown"; }
246
+ static get encapsulation() { return "shadow"; }
247
+ static get originalStyleUrls() {
248
+ return {
249
+ "$": ["kritzel-dropdown.css"]
250
+ };
251
+ }
252
+ static get styleUrls() {
253
+ return {
254
+ "$": ["kritzel-dropdown.css"]
255
+ };
256
+ }
257
+ static get properties() {
258
+ return {
259
+ "options": {
260
+ "type": "unknown",
261
+ "mutable": false,
262
+ "complexType": {
263
+ "original": "DropdownOption[]",
264
+ "resolved": "DropdownOption[]",
265
+ "references": {
266
+ "DropdownOption": {
267
+ "location": "local",
268
+ "path": "C:/Projects/kritzel/libs/editor/core/src/components/kritzel-dropdown/kritzel-dropdown.tsx",
269
+ "id": "src/components/kritzel-dropdown/kritzel-dropdown.tsx::DropdownOption"
270
+ }
271
+ }
272
+ },
273
+ "required": false,
274
+ "optional": false,
275
+ "docs": {
276
+ "tags": [],
277
+ "text": ""
278
+ },
279
+ "getter": false,
280
+ "setter": false,
281
+ "defaultValue": "[]"
282
+ },
283
+ "value": {
284
+ "type": "string",
285
+ "mutable": false,
286
+ "complexType": {
287
+ "original": "string",
288
+ "resolved": "string",
289
+ "references": {}
290
+ },
291
+ "required": false,
292
+ "optional": false,
293
+ "docs": {
294
+ "tags": [],
295
+ "text": ""
296
+ },
297
+ "getter": false,
298
+ "setter": false,
299
+ "reflect": false,
300
+ "attribute": "value"
301
+ },
302
+ "width": {
303
+ "type": "string",
304
+ "mutable": false,
305
+ "complexType": {
306
+ "original": "string",
307
+ "resolved": "string",
308
+ "references": {}
309
+ },
310
+ "required": false,
311
+ "optional": true,
312
+ "docs": {
313
+ "tags": [],
314
+ "text": ""
315
+ },
316
+ "getter": false,
317
+ "setter": false,
318
+ "reflect": false,
319
+ "attribute": "width"
320
+ },
321
+ "selectStyles": {
322
+ "type": "unknown",
323
+ "mutable": false,
324
+ "complexType": {
325
+ "original": "Record<string, string>",
326
+ "resolved": "string",
327
+ "references": {
328
+ "Record": {
329
+ "location": "global",
330
+ "id": "global::Record"
331
+ }
332
+ }
333
+ },
334
+ "required": false,
335
+ "optional": true,
336
+ "docs": {
337
+ "tags": [],
338
+ "text": ""
339
+ },
340
+ "getter": false,
341
+ "setter": false,
342
+ "defaultValue": "{}"
343
+ },
344
+ "forceOpenDirection": {
345
+ "type": "string",
346
+ "mutable": false,
347
+ "complexType": {
348
+ "original": "'down' | 'up'",
349
+ "resolved": "\"down\" | \"up\"",
350
+ "references": {}
351
+ },
352
+ "required": false,
353
+ "optional": true,
354
+ "docs": {
355
+ "tags": [],
356
+ "text": "Force the dropdown to open in a specific direction instead of auto-detecting"
357
+ },
358
+ "getter": false,
359
+ "setter": false,
360
+ "reflect": false,
361
+ "attribute": "force-open-direction"
362
+ }
363
+ };
364
+ }
365
+ static get states() {
366
+ return {
367
+ "internalValue": {},
368
+ "hasSuffixContent": {},
369
+ "hasPrefixContent": {},
370
+ "isOpen": {},
371
+ "focusedIndex": {},
372
+ "openDirection": {}
373
+ };
374
+ }
375
+ static get events() {
376
+ return [{
377
+ "method": "valueChanged",
378
+ "name": "valueChanged",
379
+ "bubbles": true,
380
+ "cancelable": true,
381
+ "composed": true,
382
+ "docs": {
383
+ "tags": [],
384
+ "text": ""
385
+ },
386
+ "complexType": {
387
+ "original": "string",
388
+ "resolved": "string",
389
+ "references": {}
390
+ }
391
+ }];
392
+ }
393
+ static get elementRef() { return "el"; }
394
+ static get watchers() {
395
+ return [{
396
+ "propName": "options",
397
+ "methodName": "optionsChanged"
398
+ }, {
399
+ "propName": "value",
400
+ "methodName": "externalValueChanged"
401
+ }];
402
+ }
403
+ static get listeners() {
404
+ return [{
405
+ "name": "click",
406
+ "method": "handleDocumentClick",
407
+ "target": "document",
408
+ "capture": false,
409
+ "passive": false
410
+ }, {
411
+ "name": "keydown",
412
+ "method": "handleDocumentKeydown",
413
+ "target": "document",
414
+ "capture": false,
415
+ "passive": false
416
+ }];
417
+ }
418
+ }