@expressivecss/expressive 0.14.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (603) hide show
  1. package/CHANGELOG.md +1589 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19304 -12021
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/fonts/LICENSE-noto-sans-arabic +93 -0
  8. package/dist/fonts/LICENSE-noto-sans-hebrew +93 -0
  9. package/dist/fonts/LICENSE-noto-sans-thai +93 -0
  10. package/dist/fonts/material-symbols-outlined.woff2 +0 -0
  11. package/dist/fonts/material-symbols-rounded.woff2 +0 -0
  12. package/dist/fonts/material-symbols-sharp.woff2 +0 -0
  13. package/dist/fonts/noto-sans-arabic-arabic-400.woff2 +0 -0
  14. package/dist/fonts/noto-sans-arabic-arabic-500.woff2 +0 -0
  15. package/dist/fonts/noto-sans-arabic-arabic-700.woff2 +0 -0
  16. package/dist/fonts/noto-sans-cyrillic-400.woff2 +0 -0
  17. package/dist/fonts/noto-sans-cyrillic-500.woff2 +0 -0
  18. package/dist/fonts/noto-sans-cyrillic-700.woff2 +0 -0
  19. package/dist/fonts/noto-sans-cyrillic-ext-400.woff2 +0 -0
  20. package/dist/fonts/noto-sans-cyrillic-ext-500.woff2 +0 -0
  21. package/dist/fonts/noto-sans-cyrillic-ext-700.woff2 +0 -0
  22. package/dist/fonts/noto-sans-devanagari-400.woff2 +0 -0
  23. package/dist/fonts/noto-sans-devanagari-500.woff2 +0 -0
  24. package/dist/fonts/noto-sans-devanagari-700.woff2 +0 -0
  25. package/dist/fonts/noto-sans-greek-400.woff2 +0 -0
  26. package/dist/fonts/noto-sans-greek-500.woff2 +0 -0
  27. package/dist/fonts/noto-sans-greek-700.woff2 +0 -0
  28. package/dist/fonts/noto-sans-greek-ext-400.woff2 +0 -0
  29. package/dist/fonts/noto-sans-greek-ext-500.woff2 +0 -0
  30. package/dist/fonts/noto-sans-greek-ext-700.woff2 +0 -0
  31. package/dist/fonts/noto-sans-hebrew-hebrew-400.woff2 +0 -0
  32. package/dist/fonts/noto-sans-hebrew-hebrew-500.woff2 +0 -0
  33. package/dist/fonts/noto-sans-hebrew-hebrew-700.woff2 +0 -0
  34. package/dist/fonts/noto-sans-latin-700.woff2 +0 -0
  35. package/dist/fonts/noto-sans-latin-ext-400.woff2 +0 -0
  36. package/dist/fonts/noto-sans-latin-ext-500.woff2 +0 -0
  37. package/dist/fonts/noto-sans-latin-ext-700.woff2 +0 -0
  38. package/dist/fonts/noto-sans-thai-thai-400.woff2 +0 -0
  39. package/dist/fonts/noto-sans-thai-thai-500.woff2 +0 -0
  40. package/dist/fonts/noto-sans-thai-thai-700.woff2 +0 -0
  41. package/dist/fonts/noto-sans-vietnamese-400.woff2 +0 -0
  42. package/dist/fonts/noto-sans-vietnamese-500.woff2 +0 -0
  43. package/dist/fonts/noto-sans-vietnamese-700.woff2 +0 -0
  44. package/dist/fonts/roboto-cyrillic-400.woff2 +0 -0
  45. package/dist/fonts/roboto-cyrillic-500.woff2 +0 -0
  46. package/dist/fonts/roboto-cyrillic-700.woff2 +0 -0
  47. package/dist/fonts/roboto-cyrillic-ext-400.woff2 +0 -0
  48. package/dist/fonts/roboto-cyrillic-ext-500.woff2 +0 -0
  49. package/dist/fonts/roboto-cyrillic-ext-700.woff2 +0 -0
  50. package/dist/fonts/roboto-greek-400.woff2 +0 -0
  51. package/dist/fonts/roboto-greek-500.woff2 +0 -0
  52. package/dist/fonts/roboto-greek-700.woff2 +0 -0
  53. package/dist/fonts/roboto-greek-ext-400.woff2 +0 -0
  54. package/dist/fonts/roboto-greek-ext-500.woff2 +0 -0
  55. package/dist/fonts/roboto-greek-ext-700.woff2 +0 -0
  56. package/dist/fonts/roboto-latin-700.woff2 +0 -0
  57. package/dist/fonts/roboto-latin-ext-400.woff2 +0 -0
  58. package/dist/fonts/roboto-latin-ext-500.woff2 +0 -0
  59. package/dist/fonts/roboto-latin-ext-700.woff2 +0 -0
  60. package/dist/fonts/roboto-vietnamese-400.woff2 +0 -0
  61. package/dist/fonts/roboto-vietnamese-500.woff2 +0 -0
  62. package/dist/fonts/roboto-vietnamese-700.woff2 +0 -0
  63. package/dist/js/chunks/chunk-2CS6TITK.mjs +219 -0
  64. package/dist/js/chunks/chunk-2CS6TITK.mjs.map +7 -0
  65. package/dist/js/chunks/chunk-2RLBDFH4.mjs +108 -0
  66. package/dist/js/chunks/chunk-2RLBDFH4.mjs.map +7 -0
  67. package/dist/js/chunks/chunk-3L3QIYLC.mjs +85 -0
  68. package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +7 -0
  69. package/dist/js/chunks/chunk-4EWGD4V2.mjs +75 -0
  70. package/dist/js/chunks/chunk-4EWGD4V2.mjs.map +7 -0
  71. package/dist/js/chunks/chunk-4IKVPCSU.mjs +7 -0
  72. package/dist/js/chunks/chunk-4IKVPCSU.mjs.map +7 -0
  73. package/dist/js/chunks/chunk-4PIXLDNJ.mjs +127 -0
  74. package/dist/js/chunks/chunk-4PIXLDNJ.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-A7ALMYUR.mjs → chunk-4QUCNFSD.mjs} +68 -125
  76. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-4TKTLGEM.mjs → chunk-4TRZ2AER.mjs} +35 -41
  78. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-BG6ZRB5H.mjs → chunk-5KIHWJI2.mjs} +40 -26
  80. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-YDCS5S3J.mjs → chunk-67ZPPKXS.mjs} +20 -33
  82. package/dist/js/chunks/chunk-67ZPPKXS.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-3DHK5CZU.mjs → chunk-6FSEUFVW.mjs} +40 -29
  84. package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +7 -0
  85. package/dist/js/chunks/chunk-752ADW4M.mjs +225 -0
  86. package/dist/js/chunks/chunk-752ADW4M.mjs.map +7 -0
  87. package/dist/js/chunks/{chunk-GVGT6MIU.mjs → chunk-75E5EDJF.mjs} +3 -11
  88. package/dist/js/chunks/chunk-75E5EDJF.mjs.map +7 -0
  89. package/dist/js/chunks/{chunk-TBM3FT7G.mjs → chunk-7NLUI3RR.mjs} +148 -78
  90. package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +7 -0
  91. package/dist/js/chunks/chunk-7W7TV6NY.mjs +108 -0
  92. package/dist/js/chunks/chunk-7W7TV6NY.mjs.map +7 -0
  93. package/dist/js/chunks/chunk-7YQBHTK3.mjs +225 -0
  94. package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +7 -0
  95. package/dist/js/chunks/chunk-7YZ5CN3V.mjs +33 -0
  96. package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +7 -0
  97. package/dist/js/chunks/chunk-AI73GJKG.mjs +28 -0
  98. package/dist/js/chunks/chunk-AI73GJKG.mjs.map +7 -0
  99. package/dist/js/chunks/{chunk-NS2UMNZV.mjs → chunk-ANKFWNWT.mjs} +21 -45
  100. package/dist/js/chunks/chunk-ANKFWNWT.mjs.map +7 -0
  101. package/dist/js/chunks/{chunk-GIW4K4SE.mjs → chunk-B7DQFHA5.mjs} +37 -53
  102. package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +7 -0
  103. package/dist/js/chunks/chunk-BIGU5RCJ.mjs +153 -0
  104. package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +7 -0
  105. package/dist/js/chunks/{chunk-GUB3TNO2.mjs → chunk-BPF3I2MN.mjs} +109 -27
  106. package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +7 -0
  107. package/dist/js/chunks/chunk-CMGXGYUC.mjs +74 -0
  108. package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +7 -0
  109. package/dist/js/chunks/{chunk-JIDMQGK6.mjs → chunk-CSYWKEK3.mjs} +322 -223
  110. package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +7 -0
  111. package/dist/js/chunks/chunk-CZSQHXEV.mjs +227 -0
  112. package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +7 -0
  113. package/dist/js/chunks/chunk-DZYVU75J.mjs +121 -0
  114. package/dist/js/chunks/chunk-DZYVU75J.mjs.map +7 -0
  115. package/dist/js/chunks/{chunk-QDAL4IYN.mjs → chunk-EC26RU2D.mjs} +11 -29
  116. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-3GVFZ4XO.mjs → chunk-EVCVFEV3.mjs} +238 -152
  118. package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +7 -0
  119. package/dist/js/chunks/chunk-FCNF4GRJ.mjs +445 -0
  120. package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +7 -0
  121. package/dist/js/chunks/chunk-GCWWEZKO.mjs +342 -0
  122. package/dist/js/chunks/chunk-GCWWEZKO.mjs.map +7 -0
  123. package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
  124. package/dist/js/chunks/chunk-GVZQH2H5.mjs +54 -0
  125. package/dist/js/chunks/chunk-GVZQH2H5.mjs.map +7 -0
  126. package/dist/js/chunks/chunk-GWZ76SR4.mjs +435 -0
  127. package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +7 -0
  128. package/dist/js/chunks/{chunk-ZAS25YFD.mjs → chunk-ILDRRG7T.mjs} +21 -23
  129. package/dist/js/chunks/chunk-ILDRRG7T.mjs.map +7 -0
  130. package/dist/js/chunks/chunk-INLZWHLY.mjs +80 -0
  131. package/dist/js/chunks/chunk-INLZWHLY.mjs.map +7 -0
  132. package/dist/js/chunks/chunk-JUKBBN6P.mjs +175 -0
  133. package/dist/js/chunks/chunk-JUKBBN6P.mjs.map +7 -0
  134. package/dist/js/chunks/chunk-KYIEG4U3.mjs +730 -0
  135. package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +7 -0
  136. package/dist/js/chunks/{chunk-KHV6DZXX.mjs → chunk-KZPSAXIU.mjs} +156 -46
  137. package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +7 -0
  138. package/dist/js/chunks/chunk-LDXCC2L3.mjs +438 -0
  139. package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +7 -0
  140. package/dist/js/chunks/chunk-NAC72P7R.mjs +137 -0
  141. package/dist/js/chunks/chunk-NAC72P7R.mjs.map +7 -0
  142. package/dist/js/chunks/chunk-NBJAUGPP.mjs +244 -0
  143. package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +7 -0
  144. package/dist/js/chunks/chunk-NNHVANQA.mjs +113 -0
  145. package/dist/js/chunks/chunk-NNHVANQA.mjs.map +7 -0
  146. package/dist/js/chunks/chunk-NVQ5EHCU.mjs +376 -0
  147. package/dist/js/chunks/chunk-NVQ5EHCU.mjs.map +7 -0
  148. package/dist/js/chunks/{chunk-Z2NRKI7R.mjs → chunk-OP43LLIC.mjs} +44 -73
  149. package/dist/js/chunks/chunk-OP43LLIC.mjs.map +7 -0
  150. package/dist/js/chunks/chunk-OUCHKSAW.mjs +63 -0
  151. package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +7 -0
  152. package/dist/js/chunks/{chunk-PM655FXL.mjs → chunk-OYNUDOHR.mjs} +20 -48
  153. package/dist/js/chunks/chunk-OYNUDOHR.mjs.map +7 -0
  154. package/dist/js/chunks/{chunk-UEZUJQ66.mjs → chunk-P6DRQ6KS.mjs} +36 -31
  155. package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +7 -0
  156. package/dist/js/chunks/chunk-PA7NU5AK.mjs +99 -0
  157. package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +7 -0
  158. package/dist/js/chunks/chunk-QACZ6TUP.mjs +224 -0
  159. package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +7 -0
  160. package/dist/js/chunks/{chunk-5HQSGDZ5.mjs → chunk-QXKWVHBD.mjs} +286 -203
  161. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +7 -0
  162. package/dist/js/chunks/{chunk-DAIU5SLG.mjs → chunk-ROH2HDB4.mjs} +7 -6
  163. package/dist/js/chunks/chunk-ROH2HDB4.mjs.map +7 -0
  164. package/dist/js/chunks/chunk-S23RJ3XY.mjs +86 -0
  165. package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +7 -0
  166. package/dist/js/chunks/{chunk-FS7XY3HT.mjs → chunk-SPPHF7YZ.mjs} +36 -29
  167. package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +7 -0
  168. package/dist/js/chunks/chunk-T3BNSRP3.mjs +152 -0
  169. package/dist/js/chunks/chunk-T3BNSRP3.mjs.map +7 -0
  170. package/dist/js/chunks/chunk-TFABTUAZ.mjs +108 -0
  171. package/dist/js/chunks/chunk-TFABTUAZ.mjs.map +7 -0
  172. package/dist/js/chunks/chunk-U4B3VHFS.mjs +507 -0
  173. package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +7 -0
  174. package/dist/js/chunks/chunk-UGJHCHXG.mjs +341 -0
  175. package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +7 -0
  176. package/dist/js/chunks/chunk-VFV75DHF.mjs +70 -0
  177. package/dist/js/chunks/chunk-VFV75DHF.mjs.map +7 -0
  178. package/dist/js/chunks/{chunk-4HZMB7LI.mjs → chunk-VGY4M57S.mjs} +281 -135
  179. package/dist/js/chunks/chunk-VGY4M57S.mjs.map +7 -0
  180. package/dist/js/chunks/chunk-VH4BMAZS.mjs +167 -0
  181. package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +7 -0
  182. package/dist/js/chunks/chunk-VJVQIXHC.mjs +123 -0
  183. package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +7 -0
  184. package/dist/js/chunks/{chunk-S3XDFGSZ.mjs → chunk-VMY55K2X.mjs} +92 -141
  185. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +7 -0
  186. package/dist/js/chunks/{chunk-UEXCIMJZ.mjs → chunk-VR3L2WN5.mjs} +11 -17
  187. package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +7 -0
  188. package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
  189. package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
  190. package/dist/js/chunks/chunk-WU7XJ4RR.mjs +450 -0
  191. package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +7 -0
  192. package/dist/js/chunks/chunk-X7SDA2J5.mjs +116 -0
  193. package/dist/js/chunks/chunk-X7SDA2J5.mjs.map +7 -0
  194. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs +209 -0
  195. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs.map +7 -0
  196. package/dist/js/chunks/chunk-Y6TLRA3U.mjs +129 -0
  197. package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +7 -0
  198. package/dist/js/chunks/chunk-Z4GICXR2.mjs +190 -0
  199. package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +7 -0
  200. package/dist/js/chunks/chunk-Z4OARDZ7.mjs +442 -0
  201. package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +7 -0
  202. package/dist/js/chunks/{chunk-MZ6Z24BX.mjs → chunk-ZJNLAGY5.mjs} +19 -34
  203. package/dist/js/chunks/chunk-ZJNLAGY5.mjs.map +7 -0
  204. package/dist/js/chunks/chunk-ZKWUWBUB.mjs +81 -0
  205. package/dist/js/chunks/chunk-ZKWUWBUB.mjs.map +7 -0
  206. package/dist/js/chunks/chunk-ZM3XBHWV.mjs +746 -0
  207. package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +7 -0
  208. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs +48 -0
  209. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs.map +7 -0
  210. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs +251 -0
  211. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +7 -0
  212. package/dist/js/expressive.cjs +10333 -4070
  213. package/dist/js/expressive.cjs.map +4 -4
  214. package/dist/js/expressive.js +10333 -4070
  215. package/dist/js/expressive.js.map +4 -4
  216. package/dist/js/expressive.min.js +23 -25
  217. package/dist/js/expressive.min.js.map +4 -4
  218. package/dist/js/expressive.mjs +184 -69
  219. package/dist/js/expressive.mjs.map +2 -2
  220. package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
  221. package/dist/js/internal/behaviors/copy.mjs +9 -0
  222. package/dist/js/internal/behaviors/copy.mjs.map +7 -0
  223. package/dist/js/internal/behaviors/dataTables.mjs +10 -0
  224. package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
  225. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  226. package/dist/js/internal/behaviors/forms.mjs +2 -2
  227. package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
  228. package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
  229. package/dist/js/internal/behaviors/lists.mjs +8 -0
  230. package/dist/js/internal/behaviors/lists.mjs.map +7 -0
  231. package/dist/js/internal/behaviors/paneResize.mjs +8 -0
  232. package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
  233. package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
  234. package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
  235. package/dist/js/internal/behaviors/sortable.mjs +8 -0
  236. package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
  237. package/dist/js/internal/behaviors/theme.mjs +8 -0
  238. package/dist/js/internal/behaviors/theme.mjs.map +7 -0
  239. package/dist/js/internal/behaviors/tour.mjs +8 -0
  240. package/dist/js/internal/behaviors/tour.mjs.map +7 -0
  241. package/dist/js/internal/behaviors/transferList.mjs +8 -0
  242. package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
  243. package/dist/js/internal/components/appBar.mjs +3 -2
  244. package/dist/js/internal/components/autocomplete.mjs +4 -4
  245. package/dist/js/internal/components/backToTop.mjs +9 -0
  246. package/dist/js/internal/components/backToTop.mjs.map +7 -0
  247. package/dist/js/internal/components/barChart.mjs +5 -4
  248. package/dist/js/internal/components/buttonGroup.mjs +3 -2
  249. package/dist/js/internal/components/buttons.mjs +3 -3
  250. package/dist/js/internal/components/cards.mjs +3 -3
  251. package/dist/js/internal/components/carousel.mjs +3 -3
  252. package/dist/js/internal/components/cascader.mjs +10 -0
  253. package/dist/js/internal/components/cascader.mjs.map +7 -0
  254. package/dist/js/internal/components/characterCounter.mjs +3 -2
  255. package/dist/js/internal/components/chips.mjs +6 -5
  256. package/dist/js/internal/components/colorPicker.mjs +9 -0
  257. package/dist/js/internal/components/colorPicker.mjs.map +7 -0
  258. package/dist/js/internal/components/columnChart.mjs +4 -3
  259. package/dist/js/internal/components/commandPalette.mjs +3 -3
  260. package/dist/js/internal/components/confetti.mjs +3 -2
  261. package/dist/js/internal/components/currencyInput.mjs +9 -0
  262. package/dist/js/internal/components/currencyInput.mjs.map +7 -0
  263. package/dist/js/internal/components/datepicker.mjs +11 -8
  264. package/dist/js/internal/components/expandingCard.mjs +3 -3
  265. package/dist/js/internal/components/funnelChart.mjs +10 -0
  266. package/dist/js/internal/components/funnelChart.mjs.map +7 -0
  267. package/dist/js/internal/components/heatmapChart.mjs +4 -3
  268. package/dist/js/internal/components/hoverCard.mjs +9 -0
  269. package/dist/js/internal/components/hoverCard.mjs.map +7 -0
  270. package/dist/js/internal/components/index.mjs +133 -64
  271. package/dist/js/internal/components/inputMask.mjs +9 -0
  272. package/dist/js/internal/components/inputMask.mjs.map +7 -0
  273. package/dist/js/internal/components/keypad.mjs +9 -0
  274. package/dist/js/internal/components/keypad.mjs.map +7 -0
  275. package/dist/js/internal/components/lightbox.mjs +3 -3
  276. package/dist/js/internal/components/lineChart.mjs +29 -4
  277. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  278. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  279. package/dist/js/internal/components/mapView.mjs +3 -3
  280. package/dist/js/internal/components/menu.mjs +3 -3
  281. package/dist/js/internal/components/menubar.mjs +10 -0
  282. package/dist/js/internal/components/menubar.mjs.map +7 -0
  283. package/dist/js/internal/components/messageScroller.mjs +3 -3
  284. package/dist/js/internal/components/mixedChart.mjs +5 -4
  285. package/dist/js/internal/components/navigationRail.mjs +3 -2
  286. package/dist/js/internal/components/particles.mjs +3 -2
  287. package/dist/js/internal/components/pieChart.mjs +4 -3
  288. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  289. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  290. package/dist/js/internal/components/questionnaire.mjs +3 -3
  291. package/dist/js/internal/components/radarChart.mjs +4 -3
  292. package/dist/js/internal/components/radialChart.mjs +4 -3
  293. package/dist/js/internal/components/registry.mjs +59 -40
  294. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  295. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  296. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  297. package/dist/js/internal/components/scatterChart.mjs +10 -0
  298. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  299. package/dist/js/internal/components/scrollspy.mjs +3 -2
  300. package/dist/js/internal/components/select.mjs +4 -4
  301. package/dist/js/internal/components/showMore.mjs +9 -0
  302. package/dist/js/internal/components/showMore.mjs.map +7 -0
  303. package/dist/js/internal/components/slider.mjs +3 -3
  304. package/dist/js/internal/components/snackbar.mjs +2 -2
  305. package/dist/js/internal/components/swipeActions.mjs +9 -0
  306. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  307. package/dist/js/internal/components/tabs.mjs +3 -4
  308. package/dist/js/internal/components/timepicker.mjs +5 -4
  309. package/dist/js/internal/components/tooltip.mjs +3 -3
  310. package/dist/js/internal/components/treeSelect.mjs +13 -0
  311. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  312. package/dist/js/internal/components/treemapChart.mjs +10 -0
  313. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  314. package/dist/js/internal/core/component.mjs +2 -1
  315. package/dist/js/internal/core/formControl.mjs +12 -0
  316. package/dist/js/internal/core/formControl.mjs.map +7 -0
  317. package/dist/js/internal/core/spring.mjs +11 -0
  318. package/dist/js/internal/core/spring.mjs.map +7 -0
  319. package/dist/js/internal/core/utils.mjs +11 -3
  320. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  321. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  322. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  323. package/dist/js/modular.mjs +175 -69
  324. package/dist/types/behaviors/bottomSheets.d.ts +19 -3
  325. package/dist/types/behaviors/copy.d.ts +18 -0
  326. package/dist/types/behaviors/dataTables.d.ts +129 -0
  327. package/dist/types/behaviors/dialogs.d.ts +27 -1
  328. package/dist/types/behaviors/forms.d.ts +68 -2
  329. package/dist/types/behaviors/imageCompare.d.ts +12 -0
  330. package/dist/types/behaviors/lists.d.ts +12 -0
  331. package/dist/types/behaviors/paneResize.d.ts +29 -0
  332. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  333. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  334. package/dist/types/behaviors/sortable.d.ts +28 -0
  335. package/dist/types/behaviors/theme.d.ts +22 -0
  336. package/dist/types/behaviors/tour.d.ts +36 -0
  337. package/dist/types/behaviors/transferList.d.ts +51 -0
  338. package/dist/types/components/appBar.d.ts +5 -6
  339. package/dist/types/components/autocomplete.d.ts +92 -17
  340. package/dist/types/components/backToTop.d.ts +36 -0
  341. package/dist/types/components/barChart.d.ts +3 -6
  342. package/dist/types/components/buttonGroup.d.ts +2 -4
  343. package/dist/types/components/buttons.d.ts +5 -5
  344. package/dist/types/components/cards.d.ts +3 -16
  345. package/dist/types/components/carousel.d.ts +9 -15
  346. package/dist/types/components/cascader.d.ts +130 -0
  347. package/dist/types/components/characterCounter.d.ts +2 -15
  348. package/dist/types/components/chips.d.ts +65 -19
  349. package/dist/types/components/colorPicker.d.ts +42 -0
  350. package/dist/types/components/columnChart.d.ts +23 -10
  351. package/dist/types/components/commandPalette.d.ts +11 -16
  352. package/dist/types/components/confetti.d.ts +2 -4
  353. package/dist/types/components/currencyInput.d.ts +59 -0
  354. package/dist/types/components/datepicker.d.ts +59 -36
  355. package/dist/types/components/expandingCard.d.ts +6 -6
  356. package/dist/types/components/funnelChart.d.ts +38 -0
  357. package/dist/types/components/heatmapChart.d.ts +39 -8
  358. package/dist/types/components/hoverCard.d.ts +58 -0
  359. package/dist/types/components/index.d.ts +17 -1
  360. package/dist/types/components/inputMask.d.ts +30 -0
  361. package/dist/types/components/keypad.d.ts +66 -0
  362. package/dist/types/components/lightbox.d.ts +17 -25
  363. package/dist/types/components/lineChart.d.ts +176 -10
  364. package/dist/types/components/loadingOverlay.d.ts +42 -0
  365. package/dist/types/components/mapView.d.ts +26 -17
  366. package/dist/types/components/menu.d.ts +61 -22
  367. package/dist/types/components/menubar.d.ts +37 -0
  368. package/dist/types/components/messageScroller.d.ts +2 -14
  369. package/dist/types/components/mixedChart.d.ts +15 -6
  370. package/dist/types/components/navigationRail.d.ts +16 -5
  371. package/dist/types/components/particles.d.ts +8 -4
  372. package/dist/types/components/pieChart.d.ts +32 -7
  373. package/dist/types/components/pullToRefresh.d.ts +80 -0
  374. package/dist/types/components/questionnaire.d.ts +58 -16
  375. package/dist/types/components/radarChart.d.ts +10 -6
  376. package/dist/types/components/radialChart.d.ts +58 -8
  377. package/dist/types/components/registry.d.ts +77 -3
  378. package/dist/types/components/richTextEditor.d.ts +6 -14
  379. package/dist/types/components/sankeyChart.d.ts +72 -0
  380. package/dist/types/components/scatterChart.d.ts +102 -0
  381. package/dist/types/components/scrollspy.d.ts +3 -5
  382. package/dist/types/components/select.d.ts +43 -30
  383. package/dist/types/components/showMore.d.ts +51 -0
  384. package/dist/types/components/slider.d.ts +5 -15
  385. package/dist/types/components/snackbar.d.ts +62 -0
  386. package/dist/types/components/swipeActions.d.ts +81 -0
  387. package/dist/types/components/tabs.d.ts +93 -27
  388. package/dist/types/components/timepicker.d.ts +114 -20
  389. package/dist/types/components/tooltip.d.ts +56 -20
  390. package/dist/types/components/treeSelect.d.ts +106 -0
  391. package/dist/types/components/treemapChart.d.ts +56 -0
  392. package/dist/types/core/component.d.ts +43 -25
  393. package/dist/types/core/formControl.d.ts +21 -0
  394. package/dist/types/core/spring.d.ts +20 -0
  395. package/dist/types/core/utils.d.ts +85 -72
  396. package/dist/types/modular.d.ts +33 -1
  397. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -7
  398. package/dist/types/plugins/modalDisplayPlugin.d.ts +32 -0
  399. package/package.json +10 -8
  400. package/src/sass/README.md +27 -18
  401. package/src/sass/abstracts/_breakpoints.scss +0 -1
  402. package/src/sass/abstracts/_elevation.scss +13 -7
  403. package/src/sass/abstracts/_index.scss +1 -0
  404. package/src/sass/abstracts/_mixins.scss +438 -92
  405. package/src/sass/abstracts/_spring.scss +63 -0
  406. package/src/sass/abstracts/_variables.scss +43 -15
  407. package/src/sass/base/_fonts.scss +61 -48
  408. package/src/sass/base/_global.scss +105 -34
  409. package/src/sass/base/_index.scss +3 -1
  410. package/src/sass/base/_normalize.scss +59 -114
  411. package/src/sass/base/_print.scss +21 -0
  412. package/src/sass/base/_prose.scss +68 -0
  413. package/src/sass/base/_typography.scss +9 -5
  414. package/src/sass/components/_accordion.scss +9 -16
  415. package/src/sass/components/_alert.scss +102 -0
  416. package/src/sass/components/_aura.scss +8 -3
  417. package/src/sass/components/_avatar.scss +3 -3
  418. package/src/sass/components/_back-to-top.scss +38 -0
  419. package/src/sass/components/_badges.scss +7 -13
  420. package/src/sass/components/_bar-chart.scss +41 -19
  421. package/src/sass/components/_bottom-sheet.scss +44 -16
  422. package/src/sass/components/_breadcrumb.scss +8 -1
  423. package/src/sass/components/_button-groups.scss +44 -89
  424. package/src/sass/components/_buttons.scss +156 -63
  425. package/src/sass/components/_calendar.scss +246 -0
  426. package/src/sass/components/_cards.scss +41 -68
  427. package/src/sass/components/_carousel.scss +43 -158
  428. package/src/sass/components/_cascader.scss +142 -0
  429. package/src/sass/components/_chips.scss +36 -52
  430. package/src/sass/components/_column-chart.scss +19 -12
  431. package/src/sass/components/_command-palette.scss +4 -7
  432. package/src/sass/components/_confetti.scss +0 -2
  433. package/src/sass/components/_countdown.scss +1 -1
  434. package/src/sass/components/_data-table.scss +162 -27
  435. package/src/sass/components/_datepicker.scss +57 -62
  436. package/src/sass/components/_description-list.scss +85 -0
  437. package/src/sass/components/_dialog.scss +42 -44
  438. package/src/sass/components/_docked-display.scss +1 -3
  439. package/src/sass/components/_drag-handle.scss +16 -20
  440. package/src/sass/components/_expanding-card.scss +20 -9
  441. package/src/sass/components/_fab-menu.scss +44 -32
  442. package/src/sass/components/_funnel-chart.scss +124 -0
  443. package/src/sass/components/_heatmap-chart.scss +113 -24
  444. package/src/sass/components/_icon-buttons.scss +7 -8
  445. package/src/sass/components/_icons-material-design.scss +2 -2
  446. package/src/sass/components/_image-compare.scss +108 -0
  447. package/src/sass/components/_index.scss +21 -0
  448. package/src/sass/components/_keypad.scss +182 -0
  449. package/src/sass/components/_kpi.scss +6 -11
  450. package/src/sass/components/_lightbox.scss +26 -20
  451. package/src/sass/components/_line-chart.scss +16 -2
  452. package/src/sass/components/_list.scss +59 -14
  453. package/src/sass/components/_loading-indicator.scss +1 -0
  454. package/src/sass/components/_loading-overlay.scss +105 -0
  455. package/src/sass/components/_map.scss +35 -13
  456. package/src/sass/components/_marquee.scss +3 -2
  457. package/src/sass/components/_mega-menu.scss +137 -0
  458. package/src/sass/components/_menu.scss +159 -182
  459. package/src/sass/components/_menubar.scss +59 -0
  460. package/src/sass/components/_message-scroller.scss +2 -2
  461. package/src/sass/components/_message.scss +3 -3
  462. package/src/sass/components/_mixed-chart.scss +37 -9
  463. package/src/sass/components/_modal-display.scss +21 -0
  464. package/src/sass/components/_navbar.scss +43 -65
  465. package/src/sass/components/_navigation-bar.scss +15 -77
  466. package/src/sass/components/_navigation-rail.scss +171 -121
  467. package/src/sass/components/_org-chart.scss +192 -0
  468. package/src/sass/components/_page-footer.scss +16 -13
  469. package/src/sass/components/_pagination.scss +6 -13
  470. package/src/sass/components/_panes.scss +33 -31
  471. package/src/sass/components/_particles.scss +0 -2
  472. package/src/sass/components/_pie-chart.scss +91 -11
  473. package/src/sass/components/_popover.scss +18 -5
  474. package/src/sass/components/_progress.scss +158 -35
  475. package/src/sass/components/_pull-to-refresh.scss +90 -0
  476. package/src/sass/components/_questionnaire.scss +74 -3
  477. package/src/sass/components/_radar-chart.scss +38 -10
  478. package/src/sass/components/_radial-chart.scss +113 -5
  479. package/src/sass/components/_rich-text-editor.scss +2 -2
  480. package/src/sass/components/_sankey-chart.scss +114 -0
  481. package/src/sass/components/_scatter-chart.scss +153 -0
  482. package/src/sass/components/_scrim.scss +0 -2
  483. package/src/sass/components/_scrollspy.scss +0 -2
  484. package/src/sass/components/_search.scss +26 -22
  485. package/src/sass/components/_show-more.scss +8 -0
  486. package/src/sass/components/_side-sheet.scss +23 -40
  487. package/src/sass/components/_skeleton.scss +2 -4
  488. package/src/sass/components/_snackbar.scss +27 -21
  489. package/src/sass/components/_split-button.scss +5 -5
  490. package/src/sass/components/_stat.scss +3 -8
  491. package/src/sass/components/_stepper.scss +1 -5
  492. package/src/sass/components/_swipe-actions.scss +71 -0
  493. package/src/sass/components/_tabs.scss +51 -32
  494. package/src/sass/components/_timeline.scss +12 -12
  495. package/src/sass/components/_timepicker.scss +111 -112
  496. package/src/sass/components/_toolbar.scss +35 -47
  497. package/src/sass/components/_tooltip.scss +21 -12
  498. package/src/sass/components/_tour.scss +89 -0
  499. package/src/sass/components/_transfer-list.scss +73 -0
  500. package/src/sass/components/_transitions.scss +4 -4
  501. package/src/sass/components/_tree.scss +3 -16
  502. package/src/sass/components/_treemap-chart.scss +122 -0
  503. package/src/sass/components/forms/_checkboxes.scss +140 -86
  504. package/src/sass/components/forms/_color-picker.scss +135 -0
  505. package/src/sass/components/forms/_color-swatches.scss +85 -0
  506. package/src/sass/components/forms/_drop-zone.scss +15 -9
  507. package/src/sass/components/forms/_fieldset.scss +10 -10
  508. package/src/sass/components/forms/_file-input.scss +6 -9
  509. package/src/sass/components/forms/_index.scss +3 -1
  510. package/src/sass/components/forms/_input-fields.scss +254 -90
  511. package/src/sass/components/forms/_radio-buttons.scss +40 -127
  512. package/src/sass/components/forms/_rating.scss +2 -32
  513. package/src/sass/components/forms/_select.scss +199 -23
  514. package/src/sass/components/forms/_slider.scss +140 -330
  515. package/src/sass/components/forms/_switches.scss +53 -164
  516. package/src/sass/custom.scss +10 -1
  517. package/src/sass/expressive.scss +3 -63
  518. package/src/sass/tokens/_contrast.scss +94 -0
  519. package/src/sass/tokens/_elevation.scss +16 -0
  520. package/src/sass/tokens/_index.scss +5 -0
  521. package/src/sass/tokens/_motion.scss +109 -0
  522. package/src/sass/tokens/_reference.scss +72 -141
  523. package/src/sass/tokens/_shape.scss +38 -0
  524. package/src/sass/tokens/_stacking.scss +27 -0
  525. package/src/sass/tokens/_state.scss +2 -4
  526. package/src/sass/tokens/_theme.scss +11 -2
  527. package/src/sass/tokens/_vibrant.scss +2 -5
  528. package/src/sass/utilities/_colors.scss +6 -1
  529. package/src/sass/utilities/_defer-render.scss +17 -0
  530. package/src/sass/utilities/_helpers.scss +183 -26
  531. package/src/sass/utilities/_index.scss +2 -1
  532. package/src/sass/utilities/_scroll-area.scss +0 -2
  533. package/src/sass/utilities/_spacing.scss +52 -34
  534. package/src/sass/utilities/_typescale.scss +8 -1
  535. package/src/sass/utilities/_visibility.scss +47 -76
  536. package/src/sass/utilities/_z-depth.scss +7 -4
  537. package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +0 -7
  538. package/dist/js/chunks/chunk-3GVFZ4XO.mjs.map +0 -7
  539. package/dist/js/chunks/chunk-4HZMB7LI.mjs.map +0 -7
  540. package/dist/js/chunks/chunk-4KMNFIFZ.mjs +0 -270
  541. package/dist/js/chunks/chunk-4KMNFIFZ.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-4TKTLGEM.mjs.map +0 -7
  543. package/dist/js/chunks/chunk-5BKHWHYY.mjs +0 -292
  544. package/dist/js/chunks/chunk-5BKHWHYY.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-5HQSGDZ5.mjs.map +0 -7
  546. package/dist/js/chunks/chunk-6N2XAEFK.mjs +0 -125
  547. package/dist/js/chunks/chunk-6N2XAEFK.mjs.map +0 -7
  548. package/dist/js/chunks/chunk-A7ALMYUR.mjs.map +0 -7
  549. package/dist/js/chunks/chunk-BG6ZRB5H.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-CUQPB25U.mjs +0 -55
  551. package/dist/js/chunks/chunk-CUQPB25U.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-DAIU5SLG.mjs.map +0 -7
  553. package/dist/js/chunks/chunk-FS7XY3HT.mjs.map +0 -7
  554. package/dist/js/chunks/chunk-GIW4K4SE.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-GUB3TNO2.mjs.map +0 -7
  556. package/dist/js/chunks/chunk-GVGT6MIU.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-GZKEFWPM.mjs +0 -181
  558. package/dist/js/chunks/chunk-GZKEFWPM.mjs.map +0 -7
  559. package/dist/js/chunks/chunk-HKT2S7VM.mjs +0 -48
  560. package/dist/js/chunks/chunk-HKT2S7VM.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-ILP3PDTL.mjs +0 -187
  562. package/dist/js/chunks/chunk-ILP3PDTL.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-JIDMQGK6.mjs.map +0 -7
  564. package/dist/js/chunks/chunk-KBNN3QDH.mjs +0 -7
  565. package/dist/js/chunks/chunk-KBNN3QDH.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-KHV6DZXX.mjs.map +0 -7
  567. package/dist/js/chunks/chunk-KY6U46SM.mjs +0 -345
  568. package/dist/js/chunks/chunk-KY6U46SM.mjs.map +0 -7
  569. package/dist/js/chunks/chunk-LRZMJZ3T.mjs +0 -291
  570. package/dist/js/chunks/chunk-LRZMJZ3T.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-LTWPGFBR.mjs +0 -59
  572. package/dist/js/chunks/chunk-LTWPGFBR.mjs.map +0 -7
  573. package/dist/js/chunks/chunk-MNPROCZF.mjs +0 -328
  574. package/dist/js/chunks/chunk-MNPROCZF.mjs.map +0 -7
  575. package/dist/js/chunks/chunk-MZ6Z24BX.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-NS2UMNZV.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-O5XPWXIQ.mjs +0 -406
  578. package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-PM655FXL.mjs.map +0 -7
  580. package/dist/js/chunks/chunk-QDAL4IYN.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-QERLECVU.mjs +0 -572
  582. package/dist/js/chunks/chunk-QERLECVU.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-QJABDLSD.mjs +0 -112
  584. package/dist/js/chunks/chunk-QJABDLSD.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-RHRQKTTX.mjs +0 -139
  586. package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +0 -7
  587. package/dist/js/chunks/chunk-S3XDFGSZ.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-SPETGK25.mjs +0 -59
  589. package/dist/js/chunks/chunk-SPETGK25.mjs.map +0 -7
  590. package/dist/js/chunks/chunk-TBM3FT7G.mjs.map +0 -7
  591. package/dist/js/chunks/chunk-UEXCIMJZ.mjs.map +0 -7
  592. package/dist/js/chunks/chunk-UEZUJQ66.mjs.map +0 -7
  593. package/dist/js/chunks/chunk-VGZSAFTX.mjs +0 -173
  594. package/dist/js/chunks/chunk-VGZSAFTX.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-X7OCHZVF.mjs +0 -76
  596. package/dist/js/chunks/chunk-X7OCHZVF.mjs.map +0 -7
  597. package/dist/js/chunks/chunk-YDCS5S3J.mjs.map +0 -7
  598. package/dist/js/chunks/chunk-YMSXJON6.mjs +0 -79
  599. package/dist/js/chunks/chunk-YMSXJON6.mjs.map +0 -7
  600. package/dist/js/chunks/chunk-Z2NRKI7R.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-ZAS25YFD.mjs.map +0 -7
  602. package/dist/js/chunks/chunk-ZKZKNSLC.mjs +0 -1
  603. /package/dist/js/chunks/{chunk-ZKZKNSLC.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -0,0 +1,450 @@
1
+ import {
2
+ formAssociated,
3
+ unwrapControl,
4
+ wrapInControl
5
+ } from "./chunk-INLZWHLY.mjs";
6
+ import {
7
+ Autocomplete
8
+ } from "./chunk-VGY4M57S.mjs";
9
+ import {
10
+ Component
11
+ } from "./chunk-CMGXGYUC.mjs";
12
+ import {
13
+ Utils,
14
+ restoreAttribute
15
+ } from "./chunk-ZVLOUDIJ.mjs";
16
+
17
+ // src/ts/components/chips.ts
18
+ var CONTROL = "expressive-chips-control";
19
+ var pastedValues = (e) => (e.clipboardData?.getData("text") ?? "").split(/[,\t\n]/).map((value) => value.trim()).filter(Boolean);
20
+ var _defaults = {
21
+ data: [],
22
+ placeholder: "",
23
+ secondaryPlaceholder: "",
24
+ closeIconClass: "material-symbols",
25
+ autocompleteOptions: {},
26
+ autocompleteOnly: false,
27
+ limit: Infinity,
28
+ allowUserInput: false,
29
+ i18n: { remove: "Remove", required: "Add at least one item." },
30
+ onChipAdd: null,
31
+ onChipSelect: null,
32
+ onChipDelete: null
33
+ };
34
+ var _Chips = class _Chips extends Component {
35
+ constructor(el, options) {
36
+ super(el, options);
37
+ /** The form name the text input had, which the chips submit instead. */
38
+ this._name = "";
39
+ /** The chips the field started with, which a form reset puts back. */
40
+ this._initialData = [];
41
+ /** The input's own aria-required, or null, put back on destroy. */
42
+ this._ariaRequired = null;
43
+ /** The form control wrapping a named input, which the form reads instead of it. */
44
+ this._control = null;
45
+ /** The named text input, whose form, disabled state and required the chips take over. */
46
+ this._source = null;
47
+ this._required = false;
48
+ /** Pasted text that lists several values, split by commas, tabs or lines, adds a chip for each. */
49
+ this._handleInputPaste = (e) => {
50
+ const values = pastedValues(e);
51
+ if (values.length < 2 || this._suggestionsOnly) return;
52
+ e.preventDefault();
53
+ values.every((id) => (this.addChip({ id }), _Chips.getInstance(this.el) === this));
54
+ };
55
+ this._handleChipClick = (e) => {
56
+ const _chip = e.target.closest(".chip");
57
+ const clickedClose = !!e.target.closest(".close");
58
+ if (_chip) {
59
+ const index = this._chips.indexOf(_chip);
60
+ if (index < 0) return;
61
+ if (clickedClose) {
62
+ this._deleteChip(index, "input");
63
+ } else {
64
+ this.selectChip(index);
65
+ }
66
+ } else {
67
+ this._input.focus();
68
+ }
69
+ };
70
+ // Selection follows focus: a chip is selected while focus is inside it, and
71
+ // none is once focus moves to the input or out of the field.
72
+ this._handleFocusIn = (e) => {
73
+ const chip = e.target.closest(".chip");
74
+ this._setSelected(chip && this._chips.includes(chip) ? chip : null);
75
+ };
76
+ this._handleFocusOut = (e) => {
77
+ if (!this.el.contains(e.relatedTarget)) this._setSelected(null);
78
+ };
79
+ this._handleInputFocus = () => {
80
+ this.el.classList.add("focus");
81
+ };
82
+ this._handleInputBlur = () => {
83
+ this.el.classList.remove("focus");
84
+ };
85
+ this._handleInputKeydown = (e) => {
86
+ if (Utils.isComposing(e)) return;
87
+ if (e.key === "Enter") {
88
+ if (this.hasAutocomplete && this.autocomplete?.isOpen && this.autocomplete.container.querySelector('[role="option"]')) {
89
+ return;
90
+ }
91
+ e.preventDefault();
92
+ if (!this.hasAutocomplete || !this.options.autocompleteOnly) {
93
+ this.addChip({ id: this._input.value });
94
+ }
95
+ this._input.value = "";
96
+ this.autocomplete?.close();
97
+ } else if (this._input.value === "" && this.chipsData.length && ["Backspace", _Chips._backKey(this.el)].includes(e.key)) {
98
+ e.preventDefault();
99
+ this.selectChip(this.chipsData.length - 1);
100
+ }
101
+ };
102
+ this.el.classList.add("chips");
103
+ this.chipsData = [];
104
+ this._chips = [];
105
+ this._takeName();
106
+ if (this.options.data.length) {
107
+ this.chipsData = [...this.options.data];
108
+ this._renderChips();
109
+ }
110
+ if (this.options.allowUserInput) {
111
+ this.el.classList.add("field");
112
+ this._setupInput();
113
+ this._setupEventHandlers();
114
+ this.el.append(this._end);
115
+ }
116
+ this._setupLabel();
117
+ this._sync();
118
+ this._initialData = [...this.chipsData];
119
+ }
120
+ /**
121
+ * Selection is drawn by a class now, not by `:focus`, so it does not clear
122
+ * itself when focus moves - every path that changes the selection has to go
123
+ * through here or the class and the field drift apart.
124
+ *
125
+ * Deliberately no `aria-selected`: the chip is not an option in a listbox,
126
+ * and putting the attribute on an element with no such role is the same
127
+ * defect the semantics standard exists to remove.
128
+ */
129
+ _setSelected(chip) {
130
+ this._selectedChip?.classList.remove("selected");
131
+ this._selectedChip = chip;
132
+ chip?.classList.add("selected");
133
+ }
134
+ static get defaults() {
135
+ return _defaults;
136
+ }
137
+ getData() {
138
+ return this.chipsData;
139
+ }
140
+ destroy() {
141
+ if (this.autocomplete && Autocomplete.getInstance(this._input) === this.autocomplete) {
142
+ this.autocomplete.destroy();
143
+ }
144
+ this._events.abort();
145
+ this._chips.forEach((c) => c.remove());
146
+ this._chips = [];
147
+ this._giveNameBack();
148
+ super.destroy();
149
+ }
150
+ _setupEventHandlers() {
151
+ const { signal } = this._events;
152
+ this.el.addEventListener("click", this._handleChipClick, { signal });
153
+ this.el.addEventListener("keydown", _Chips._handleChipsKeydown, { signal });
154
+ this.el.addEventListener("focusin", this._handleFocusIn, { signal });
155
+ this.el.addEventListener("focusout", this._handleFocusOut, { signal });
156
+ this._input.addEventListener("focus", this._handleInputFocus, { signal });
157
+ this._input.addEventListener("blur", this._handleInputBlur, { signal });
158
+ this._input.addEventListener("keydown", this._handleInputKeydown, { signal });
159
+ this._input.addEventListener("paste", this._handleInputPaste, { signal });
160
+ }
161
+ /**
162
+ * A text input with a `name` would submit whatever is half typed. The chips
163
+ * submit under that name instead, one value per chip, as a multiple select
164
+ * does, so the input gives its name up until destroy().
165
+ */
166
+ _takeName() {
167
+ const input = this._editorInput();
168
+ this._name = input?.getAttribute("name") ?? "";
169
+ if (this._name && formAssociated()) this._wrap(input);
170
+ }
171
+ /**
172
+ * Wraps the input in the form control, which takes its name and required.
173
+ * `display: contents` lays the input out as a child of the field still.
174
+ */
175
+ _wrap(input) {
176
+ this._source = input;
177
+ this._takeRequired(input);
178
+ this._control = wrapInControl(CONTROL, input, () => this._validate());
179
+ this._control.onFormReset = () => this._resetChips();
180
+ this._validate();
181
+ }
182
+ /**
183
+ * The editor's text field, or null. A static .chips of filter checkboxes,
184
+ * which AutoInit also starts, keeps its own native form values.
185
+ */
186
+ _editorInput() {
187
+ return this.options.allowUserInput ? this.el.querySelector('input:is(:not([type]), [type="text"])') : null;
188
+ }
189
+ /** Where the text field ends: chips go before it, and it goes last. */
190
+ get _end() {
191
+ return this._control ?? this._input;
192
+ }
193
+ /** After the chips change: give the form one value per chip and update a required field's validity. */
194
+ _sync() {
195
+ if (!this._control) return;
196
+ const data = new FormData();
197
+ this.chipsData.forEach((chip) => data.append(this._name, String(chip.id)));
198
+ this._control.internals.setFormValue(data);
199
+ this._validate();
200
+ }
201
+ /**
202
+ * The chips are what is required, not the text, so `required` moves to the
203
+ * control, and aria-required keeps telling assistive technology.
204
+ */
205
+ _takeRequired(input) {
206
+ this._required = input.required;
207
+ if (!this._required) return;
208
+ this._ariaRequired = input.getAttribute("aria-required");
209
+ input.required = false;
210
+ input.setAttribute("aria-required", "true");
211
+ }
212
+ /**
213
+ * A required field is valid once it has a chip, whatever is half typed. The
214
+ * control holds this validity, apart from any error the page sets on the
215
+ * input, and anchors it at the input, which a submit then focuses.
216
+ */
217
+ _validate() {
218
+ const internals = this._control.internals;
219
+ if (this._required && !this._source.readOnly && !this.chipsData.length) {
220
+ internals.setValidity({ valueMissing: true }, this._requiredMessage, this._anchor);
221
+ } else internals.setValidity({});
222
+ }
223
+ /** The input, unless page script moved it out of the control, where it cannot anchor the message. */
224
+ get _anchor() {
225
+ return this._control.contains(this._source) ? this._source : void 0;
226
+ }
227
+ /** A validity flag needs a message, so an empty i18n.required falls back to the default. */
228
+ get _requiredMessage() {
229
+ return this.options.i18n.required || _defaults.i18n.required;
230
+ }
231
+ _resetChips() {
232
+ this._setSelected(null);
233
+ this._chips.forEach((chip) => chip.remove());
234
+ this.chipsData = [...this._initialData];
235
+ this._chips = this.chipsData.map((chip) => this._renderChip(chip));
236
+ this._control.before(...this._chips);
237
+ this._setPlaceholder();
238
+ this._sync();
239
+ }
240
+ /** Unwraps the input, with whatever else went in the control, and gives it its name and required back. */
241
+ _giveNameBack() {
242
+ if (!this._control) return;
243
+ unwrapControl(this._control, this._source);
244
+ this._control = null;
245
+ if (!this._required) return;
246
+ this._source.required = true;
247
+ restoreAttribute(this._source, "aria-required", this._ariaRequired);
248
+ }
249
+ /** Whether only an autocomplete suggestion can become a chip. */
250
+ get _suggestionsOnly() {
251
+ return this.hasAutocomplete && this.options.autocompleteOnly;
252
+ }
253
+ /** The arrow that points back towards the first chip, which in RTL is Right. */
254
+ static _backKey(el) {
255
+ return getComputedStyle(el).direction === "rtl" ? "ArrowRight" : "ArrowLeft";
256
+ }
257
+ static _handleChipsKeydown(e) {
258
+ const chips = e.target.closest(".chips");
259
+ const tag = e.target.tagName;
260
+ if (tag === "INPUT" || tag === "TEXTAREA" || !chips) return;
261
+ const currChips = chips["Expressive_Chips"];
262
+ if (!currChips) return;
263
+ if (e.key === "Backspace" || e.key === "Delete") {
264
+ const index = currChips._chips.indexOf(e.target.closest(".chip"));
265
+ if (index < 0) return;
266
+ e.preventDefault();
267
+ currChips._deleteChip(index, "previous");
268
+ } else if (e.key === "ArrowLeft" || e.key === "ArrowRight") {
269
+ const current = e.target.closest(".chip") ?? currChips._selectedChip;
270
+ const index = currChips._chips.indexOf(current);
271
+ if (index < 0) return;
272
+ if (e.key === _Chips._backKey(chips)) {
273
+ if (index > 0) currChips.selectChip(index - 1);
274
+ } else {
275
+ const selectIndex = index + 1;
276
+ if (selectIndex >= currChips.chipsData.length) {
277
+ currChips._setSelected(null);
278
+ currChips._input.focus();
279
+ } else currChips.selectChip(selectIndex);
280
+ }
281
+ }
282
+ }
283
+ _renderChip(chip) {
284
+ if (!chip.id && chip.id !== 0) return;
285
+ const label = chip.text || chip.id;
286
+ const renderedChip = document.createElement("span");
287
+ renderedChip.classList.add("chip");
288
+ renderedChip.innerText = label;
289
+ if (chip.image) {
290
+ const img = document.createElement("img");
291
+ img.setAttribute("src", chip.image);
292
+ renderedChip.insertBefore(img, renderedChip.firstChild);
293
+ }
294
+ if (this.options.allowUserInput) {
295
+ const closeButton = document.createElement("button");
296
+ closeButton.type = "button";
297
+ closeButton.classList.add("close");
298
+ closeButton.setAttribute("aria-label", `${this.options.i18n.remove} ${label}`);
299
+ const closeIcon = document.createElement("span");
300
+ closeIcon.classList.add(this.options.closeIconClass);
301
+ closeIcon.setAttribute("aria-hidden", "true");
302
+ closeIcon.innerText = "close";
303
+ closeButton.appendChild(closeIcon);
304
+ renderedChip.appendChild(closeButton);
305
+ }
306
+ return renderedChip;
307
+ }
308
+ _renderChips() {
309
+ this._chips = [];
310
+ for (let i = 0; i < this.chipsData.length; i++) {
311
+ const chipElem = this._renderChip(this.chipsData[i]);
312
+ this.el.appendChild(chipElem);
313
+ this._chips.push(chipElem);
314
+ }
315
+ }
316
+ _setupAutocomplete() {
317
+ this.options.autocompleteOptions.onAutocomplete = (items) => {
318
+ if (_Chips.getInstance(this.el) !== this) return;
319
+ if (items.length > 0) {
320
+ this.addChip({
321
+ id: items[0].id,
322
+ text: items[0].text,
323
+ image: items[0].image
324
+ });
325
+ this._input.value = "";
326
+ this._input.focus();
327
+ }
328
+ };
329
+ const pageOnCreate = this.options.autocompleteOptions.onCreate;
330
+ this.autocomplete = Autocomplete.init(this._input, {
331
+ ...this.options.autocompleteOptions,
332
+ onCreate: (text, autocomplete) => {
333
+ this._addTyped(text);
334
+ if (typeof pageOnCreate === "function") pageOnCreate.call(autocomplete, text, autocomplete);
335
+ }
336
+ });
337
+ }
338
+ /** The "Add" row is a deliberate choice, so it adds a chip even in an autocompleteOnly field. */
339
+ _addTyped(text) {
340
+ if (_Chips.getInstance(this.el) !== this) return;
341
+ this.addChip({ id: text });
342
+ this._input.value = "";
343
+ this._input.focus();
344
+ }
345
+ _setupInput() {
346
+ this._input = this.el.querySelector("input");
347
+ if (!this._input) {
348
+ this._input = document.createElement("input");
349
+ this.el.append(this._input);
350
+ }
351
+ this._input.classList.add("input");
352
+ this.hasAutocomplete = Object.keys(this.options.autocompleteOptions).length > 0;
353
+ if (this.hasAutocomplete) this._setupAutocomplete();
354
+ this._setPlaceholder();
355
+ if (!this._input.getAttribute("id")) this._input.setAttribute("id", Utils.guid());
356
+ }
357
+ _setupLabel() {
358
+ this._label = this.el.querySelector("label");
359
+ if (this._label && this._input) this._label.setAttribute("for", this._input.getAttribute("id"));
360
+ }
361
+ _setPlaceholder() {
362
+ if (!this._input) return;
363
+ if (!this.chipsData.length && this.options.placeholder) {
364
+ this._input.placeholder = this.options.placeholder;
365
+ } else if (this.chipsData.length && this.options.secondaryPlaceholder) {
366
+ this._input.placeholder = this.options.secondaryPlaceholder;
367
+ }
368
+ }
369
+ _isValidAndNotExist(chip) {
370
+ const isValid = !!chip.id || chip.id === 0;
371
+ const doesNotExist = !this.chipsData.some((item) => item.id == chip.id);
372
+ return isValid && doesNotExist;
373
+ }
374
+ /**
375
+ * Add chip to input.
376
+ * @param chip Chip data object
377
+ */
378
+ addChip(chip) {
379
+ if (!this._isValidAndNotExist(chip) || this.chipsData.length >= this.options.limit) return;
380
+ const renderedChip = this._renderChip(chip);
381
+ this._chips.push(renderedChip);
382
+ this.chipsData.push(chip);
383
+ if (this._end) this._end.before(renderedChip);
384
+ else this.el.append(renderedChip);
385
+ this._setPlaceholder();
386
+ this._sync();
387
+ this._notify("chip-add", this.options.onChipAdd, { args: [this.el, renderedChip], detail: { chip: renderedChip }, current: () => this._chips.includes(renderedChip) });
388
+ }
389
+ /**
390
+ * Delete nth chip.
391
+ * @param chipIndex Index of chip
392
+ */
393
+ deleteChip(chipIndex) {
394
+ const root = this.el.getRootNode();
395
+ this._deleteChip(chipIndex, this._chips[chipIndex]?.contains(root.activeElement) ? "input" : null);
396
+ }
397
+ _deleteChip(chipIndex, focus) {
398
+ const chip = this._chips[chipIndex];
399
+ if (!chip) return;
400
+ if (this._selectedChip === chip) this._setSelected(null);
401
+ chip.remove();
402
+ this._chips.splice(chipIndex, 1);
403
+ this.chipsData.splice(chipIndex, 1);
404
+ this._setPlaceholder();
405
+ this._sync();
406
+ const focusPath = [];
407
+ let root = this.el.getRootNode();
408
+ while (root) {
409
+ focusPath.push({ root, element: root.activeElement });
410
+ root = "host" in root ? root.host.getRootNode() : null;
411
+ }
412
+ this._notify("chip-delete", this.options.onChipDelete, { args: [this.el, chip], detail: { chip }, current: () => !this._chips.includes(chip) });
413
+ if (!focus || focusPath.some(({ root: root2, element }) => root2.activeElement !== element) || this.el["Expressive_Chips"] !== this) return;
414
+ if (focus === "previous" && this._chips.length) this.selectChip(Math.max(chipIndex - 1, 0));
415
+ else {
416
+ this._setSelected(null);
417
+ this._input?.focus();
418
+ }
419
+ }
420
+ /**
421
+ * Select nth chip.
422
+ * @param chipIndex Index of chip
423
+ */
424
+ selectChip(chipIndex) {
425
+ const chip = this._chips[chipIndex];
426
+ if (!chip) return;
427
+ this._setSelected(chip);
428
+ chip.querySelector(".close")?.focus();
429
+ this._notify("chip-select", this.options.onChipSelect, { args: [this.el, chip], detail: { chip }, current: () => this._selectedChip === chip });
430
+ }
431
+ static Init() {
432
+ Utils.onDocumentReady(() => {
433
+ const chips = document.querySelectorAll(".chips");
434
+ chips.forEach((el) => {
435
+ el.addEventListener("click", (e) => {
436
+ if (!e.target.closest(".close")) return;
437
+ const chip = e.target.closest(".chip");
438
+ if (chip && !el["Expressive_Chips"]?._chips.includes(chip)) chip.remove();
439
+ });
440
+ });
441
+ });
442
+ }
443
+ };
444
+ _Chips.key = "Expressive_Chips";
445
+ var Chips = _Chips;
446
+
447
+ export {
448
+ Chips
449
+ };
450
+ //# sourceMappingURL=chunk-WU7XJ4RR.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/chips.ts"],
4
+ "sourcesContent": ["import { Utils, restoreAttribute } from '../core/utils';\nimport { Autocomplete, AutocompleteOptions } from './autocomplete';\nimport { Component, BaseOptions } from '../core/component';\nimport { FormControl, formAssociated, wrapInControl, unwrapControl } from '../core/formControl';\n\nexport interface ChipData {\n /**\n * Unique identifier.\n */\n id: number | string;\n /**\n * Chip text. If not specified, \"id\" will be used.\n */\n text?: string;\n /**\n * Chip image (URL).\n */\n image?: string;\n}\n\n/** The form control a named field submits through, wrapping its input. */\nconst CONTROL = 'expressive-chips-control';\n\n/** The values in pasted text, split by commas, tabs or lines. */\nconst pastedValues = (e: ClipboardEvent) =>\n (e.clipboardData?.getData('text') ?? '').split(/[,\\t\\n]/).map((value) => value.trim()).filter(Boolean);\n\nexport interface ChipsI18nOptions {\n /** Prefix for the delete button's accessible name. */\n remove: string;\n /** What a required field says while it has no chips. */\n required: string;\n}\n\nexport interface ChipsOptions extends BaseOptions {\n /**\n * Set the chip data.\n * @default []\n */\n data: ChipData[];\n /**\n * Set first placeholder when there are no tags.\n * @default \"\"\n */\n placeholder: string;\n /**\n * Set second placeholder when adding additional tags.\n * @default \"\"\n */\n secondaryPlaceholder: string;\n /**\n * Set autocomplete options.\n * @default {}\n */\n autocompleteOptions: Partial<AutocompleteOptions>;\n /**\n * Toggles abililty to add custom value not in autocomplete list.\n * @default false\n */\n autocompleteOnly: boolean;\n /**\n * Set chips limit.\n * @default Infinity\n */\n limit: number;\n /**\n * Specifies class to be used in \"close\" button.\n * @default 'material-symbols'\n */\n closeIconClass: string;\n /**\n * Specifies option to render user input field\n * @default false;\n */\n allowUserInput: boolean;\n /**\n * Strings the component generates. `remove` prefixes the delete button's\n * accessible name, giving \"Remove Apple\". `required` is what a required\n * field says while it has no chips.\n * @default { remove: 'Remove', required: 'Add at least one item.' }\n */\n i18n: Partial<ChipsI18nOptions>;\n /**\n * Callback for chip add.\n * @default null\n */\n onChipAdd: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip select.\n * @default null\n */\n onChipSelect: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip delete.\n * @default null\n */\n onChipDelete: (element: HTMLElement, chip: HTMLElement) => void;\n}\n\nconst _defaults: ChipsOptions = {\n data: [],\n placeholder: '',\n secondaryPlaceholder: '',\n closeIconClass: 'material-symbols',\n autocompleteOptions: {},\n autocompleteOnly: false,\n limit: Infinity,\n allowUserInput: false,\n i18n: { remove: 'Remove', required: 'Add at least one item.' },\n onChipAdd: null,\n onChipSelect: null,\n onChipDelete: null\n};\n\nexport class Chips extends Component<ChipsOptions> {\n /** Array of the current chips data. */\n chipsData: ChipData[];\n /** If the chips has autocomplete enabled. */\n hasAutocomplete: boolean;\n /** Autocomplete instance, if any. */\n autocomplete: Autocomplete;\n _input: HTMLInputElement;\n _label: HTMLLabelElement;\n _chips: HTMLElement[];\n private _selectedChip: HTMLElement;\n /** The form name the text input had, which the chips submit instead. */\n private _name = '';\n /** The chips the field started with, which a form reset puts back. */\n private _initialData: ChipData[] = [];\n /** The input's own aria-required, or null, put back on destroy. */\n private _ariaRequired: string | null = null;\n /** The form control wrapping a named input, which the form reads instead of it. */\n private _control: FormControl | null = null;\n /** The named text input, whose form, disabled state and required the chips take over. */\n private _source: HTMLInputElement | null = null;\n private _required = false;\n\n /**\n * Selection is drawn by a class now, not by `:focus`, so it does not clear\n * itself when focus moves - every path that changes the selection has to go\n * through here or the class and the field drift apart.\n *\n * Deliberately no `aria-selected`: the chip is not an option in a listbox,\n * and putting the attribute on an element with no such role is the same\n * defect the semantics standard exists to remove.\n */\n private _setSelected(chip: HTMLElement | null) {\n this._selectedChip?.classList.remove('selected');\n this._selectedChip = chip;\n chip?.classList.add('selected');\n }\n\n constructor(el: HTMLElement, options: Partial<ChipsOptions>) {\n super(el, options);\n\n this.el.classList.add('chips');\n this.chipsData = [];\n this._chips = [];\n this._takeName();\n\n // Render initial chips\n if (this.options.data.length) {\n // A copy: adding or deleting a chip would otherwise edit the caller's\n // array, and a batch init would have every instance share one list.\n this.chipsData = [...this.options.data];\n this._renderChips();\n }\n\n // Render input element, setup event handlers\n if (this.options.allowUserInput) {\n this.el.classList.add('field');\n this._setupInput();\n this._setupEventHandlers();\n // move input to end, inside its control when it has one\n this.el.append(this._end);\n }\n // After _setupInput: the label points at the input's id, which is only\n // assigned there. Running this first threw on any .chips with a <label>.\n this._setupLabel();\n this._sync();\n // After autocomplete, which can turn the input's value into a chip.\n this._initialData = [...this.chipsData];\n }\n\n static get defaults() {\n return _defaults;\n }\n\n static key = 'Expressive_Chips';\n\n getData() {\n return this.chipsData;\n }\n\n destroy() {\n if (this.autocomplete && Autocomplete.getInstance(this._input) === this.autocomplete) {\n this.autocomplete.destroy();\n }\n this._events.abort();\n this._chips.forEach((c) => c.remove());\n this._chips = [];\n this._giveNameBack();\n super.destroy();\n }\n\n _setupEventHandlers() {\n const { signal } = this._events;\n this.el.addEventListener('click', this._handleChipClick, { signal });\n this.el.addEventListener('keydown', Chips._handleChipsKeydown, { signal });\n this.el.addEventListener('focusin', this._handleFocusIn, { signal });\n this.el.addEventListener('focusout', this._handleFocusOut, { signal });\n this._input.addEventListener('focus', this._handleInputFocus, { signal });\n this._input.addEventListener('blur', this._handleInputBlur, { signal });\n this._input.addEventListener('keydown', this._handleInputKeydown, { signal });\n this._input.addEventListener('paste', this._handleInputPaste, { signal });\n }\n\n /**\n * A text input with a `name` would submit whatever is half typed. The chips\n * submit under that name instead, one value per chip, as a multiple select\n * does, so the input gives its name up until destroy().\n */\n private _takeName() {\n const input = this._editorInput();\n this._name = input?.getAttribute('name') ?? '';\n // ponytail: without form-associated custom elements (jsdom) the input keeps its name and submits its text.\n if (this._name && formAssociated()) this._wrap(input);\n }\n\n /**\n * Wraps the input in the form control, which takes its name and required.\n * `display: contents` lays the input out as a child of the field still.\n */\n private _wrap(input: HTMLInputElement) {\n this._source = input;\n this._takeRequired(input);\n // The control follows the input's disabled state and form; a read-only input is not validated, so its required no longer counts.\n this._control = wrapInControl(CONTROL, input, () => this._validate());\n this._control.onFormReset = () => this._resetChips();\n this._validate();\n }\n\n /**\n * The editor's text field, or null. A static .chips of filter checkboxes,\n * which AutoInit also starts, keeps its own native form values.\n */\n private _editorInput() {\n return this.options.allowUserInput ? this.el.querySelector<HTMLInputElement>('input:is(:not([type]), [type=\"text\"])') : null;\n }\n\n /** Where the text field ends: chips go before it, and it goes last. */\n private get _end() {\n return this._control ?? this._input;\n }\n\n /** After the chips change: give the form one value per chip and update a required field's validity. */\n private _sync() {\n if (!this._control) return;\n const data = new FormData();\n this.chipsData.forEach((chip) => data.append(this._name, String(chip.id)));\n this._control.internals.setFormValue(data);\n this._validate();\n }\n\n /**\n * The chips are what is required, not the text, so `required` moves to the\n * control, and aria-required keeps telling assistive technology.\n */\n private _takeRequired(input: HTMLInputElement) {\n this._required = input.required;\n if (!this._required) return;\n this._ariaRequired = input.getAttribute('aria-required');\n input.required = false;\n input.setAttribute('aria-required', 'true');\n }\n\n /**\n * A required field is valid once it has a chip, whatever is half typed. The\n * control holds this validity, apart from any error the page sets on the\n * input, and anchors it at the input, which a submit then focuses.\n */\n private _validate() {\n const internals = this._control.internals;\n if (this._required && !this._source.readOnly && !this.chipsData.length) {\n internals.setValidity({ valueMissing: true }, this._requiredMessage, this._anchor);\n } else internals.setValidity({});\n }\n\n /** The input, unless page script moved it out of the control, where it cannot anchor the message. */\n private get _anchor() {\n return this._control.contains(this._source) ? this._source : undefined;\n }\n\n /** A validity flag needs a message, so an empty i18n.required falls back to the default. */\n private get _requiredMessage() {\n return this.options.i18n.required || _defaults.i18n.required;\n }\n\n private _resetChips() {\n this._setSelected(null);\n this._chips.forEach((chip) => chip.remove());\n this.chipsData = [...this._initialData];\n this._chips = this.chipsData.map((chip) => this._renderChip(chip));\n this._control.before(...this._chips);\n this._setPlaceholder();\n this._sync();\n }\n\n /** Unwraps the input, with whatever else went in the control, and gives it its name and required back. */\n private _giveNameBack() {\n if (!this._control) return;\n unwrapControl(this._control, this._source);\n this._control = null;\n if (!this._required) return;\n this._source.required = true;\n restoreAttribute(this._source, 'aria-required', this._ariaRequired);\n }\n\n /** Whether only an autocomplete suggestion can become a chip. */\n private get _suggestionsOnly() {\n return this.hasAutocomplete && this.options.autocompleteOnly;\n }\n\n /** Pasted text that lists several values, split by commas, tabs or lines, adds a chip for each. */\n _handleInputPaste = (e: ClipboardEvent) => {\n const values = pastedValues(e);\n if (values.length < 2 || this._suggestionsOnly) return;\n e.preventDefault();\n // An add callback can destroy or replace the instance; the rest of the paste is its.\n values.every((id) => (this.addChip({ id }), Chips.getInstance(this.el) === this));\n };\n\n _handleChipClick = (e: MouseEvent) => {\n const _chip = (<HTMLElement>e.target).closest('.chip');\n // closest, not classList: the close button now wraps an icon span, so a\n // click on the glyph reports the span as the target.\n const clickedClose = !!(<HTMLElement>e.target).closest('.close');\n if (_chip) {\n // Index into the chip list, not into the container's children: the\n // container also holds the label and the input, so counting children\n // gave an index that did not line up with chipsData.\n const index = this._chips.indexOf(_chip as HTMLElement);\n if (index < 0) return;\n if (clickedClose) {\n this._deleteChip(index, 'input');\n } else {\n this.selectChip(index);\n }\n // Default handle click to focus on input\n } else {\n this._input.focus();\n }\n };\n\n /** The arrow that points back towards the first chip, which in RTL is Right. */\n private static _backKey(el: Element) {\n return getComputedStyle(el).direction === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n }\n\n static _handleChipsKeydown(e: KeyboardEvent) {\n const chips = (<HTMLElement>e.target).closest('.chips');\n\n // Don't handle keydown inputs on input and textarea\n const tag = (<HTMLElement>e.target).tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || !chips) return;\n\n const currChips: Chips = chips['Expressive_Chips'];\n if (!currChips) return; // .chips markup without an instance behind it\n\n if (e.key === 'Backspace' || e.key === 'Delete') {\n const index = currChips._chips.indexOf((e.target as HTMLElement).closest('.chip'));\n if (index < 0) return;\n e.preventDefault();\n currChips._deleteChip(index, 'previous');\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n // Move from the chip that has focus, the same one Backspace deletes.\n const current = (e.target as HTMLElement).closest<HTMLElement>('.chip') ?? currChips._selectedChip;\n const index = currChips._chips.indexOf(current);\n if (index < 0) return;\n if (e.key === Chips._backKey(chips)) {\n if (index > 0) currChips.selectChip(index - 1);\n } else {\n const selectIndex = index + 1;\n if (selectIndex >= currChips.chipsData.length) {\n // Walking off the end returns to the input, so nothing is selected\n // any more - without this the last chip kept the class.\n currChips._setSelected(null);\n currChips._input.focus();\n }\n else currChips.selectChip(selectIndex);\n }\n }\n }\n\n // Selection follows focus: a chip is selected while focus is inside it, and\n // none is once focus moves to the input or out of the field.\n _handleFocusIn = (e: FocusEvent) => {\n const chip = (e.target as HTMLElement).closest<HTMLElement>('.chip');\n this._setSelected(chip && this._chips.includes(chip) ? chip : null);\n };\n\n _handleFocusOut = (e: FocusEvent) => {\n if (!this.el.contains(e.relatedTarget as Node | null)) this._setSelected(null);\n };\n\n _handleInputFocus = () => {\n this.el.classList.add('focus');\n };\n\n _handleInputBlur = () => {\n this.el.classList.remove('focus');\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n // Enter that confirms an IME composition is not a request to add a chip.\n if (Utils.isComposing(e)) return;\n if (e.key === 'Enter') {\n // Override enter if autocompleting.\n if (this.hasAutocomplete && this.autocomplete?.isOpen &&\n this.autocomplete.container.querySelector('[role=\"option\"]')) {\n return;\n }\n e.preventDefault();\n if (!this.hasAutocomplete || !this.options.autocompleteOnly) {\n this.addChip({ id: this._input.value });\n }\n this._input.value = '';\n // The list answered the text Enter just used up.\n this.autocomplete?.close();\n } else if (\n this._input.value === '' &&\n this.chipsData.length &&\n ['Backspace', Chips._backKey(this.el)].includes(e.key)\n ) {\n e.preventDefault();\n this.selectChip(this.chipsData.length - 1);\n }\n };\n\n _renderChip(chip: ChipData): HTMLElement {\n if (!chip.id && chip.id !== 0) return;\n const label = chip.text || <string>chip.id;\n // <span>, not <div>: a chip is inline, and the container itself is not a\n // control. It used to be a <div tabindex=\"0\"> with no role - focusable,\n // and announcing nothing.\n const renderedChip = document.createElement('span');\n renderedChip.classList.add('chip');\n renderedChip.innerText = label;\n // attach image if needed\n if (chip.image) {\n const img = document.createElement('img');\n img.setAttribute('src', chip.image);\n renderedChip.insertBefore(img, renderedChip.firstChild);\n }\n if (this.options.allowUserInput) {\n // The delete affordance is the control, so it is the <button> and it\n // carries the name. `type` is explicit because a bare button inside a\n // form submits it.\n const closeButton = document.createElement('button');\n closeButton.type = 'button';\n closeButton.classList.add('close');\n closeButton.setAttribute('aria-label', `${this.options.i18n.remove} ${label}`);\n // The ligature is text and is read out, so the glyph is hidden and the\n // button's own label is what gets announced.\n const closeIcon = document.createElement('span');\n closeIcon.classList.add(this.options.closeIconClass);\n closeIcon.setAttribute('aria-hidden', 'true');\n closeIcon.innerText = 'close';\n closeButton.appendChild(closeIcon);\n renderedChip.appendChild(closeButton);\n }\n return renderedChip;\n }\n\n _renderChips() {\n this._chips = []; //.remove();\n for (let i = 0; i < this.chipsData.length; i++) {\n const chipElem = this._renderChip(this.chipsData[i]);\n this.el.appendChild(chipElem);\n this._chips.push(chipElem);\n }\n }\n\n _setupAutocomplete() {\n this.options.autocompleteOptions.onAutocomplete = (items) => {\n if (Chips.getInstance(this.el) !== this) return;\n if (items.length > 0) {\n this.addChip({\n id: items[0].id,\n text: items[0].text,\n image: items[0].image\n });\n this._input.value = '';\n this._input.focus();\n }\n };\n // A new object, so a second Chips given the same options does not wrap this wrapper.\n const pageOnCreate = this.options.autocompleteOptions.onCreate;\n this.autocomplete = Autocomplete.init(this._input, {\n ...this.options.autocompleteOptions,\n onCreate: (text, autocomplete) => {\n this._addTyped(text);\n if (typeof pageOnCreate === 'function') pageOnCreate.call(autocomplete, text, autocomplete);\n }\n });\n }\n\n /** The \"Add\" row is a deliberate choice, so it adds a chip even in an autocompleteOnly field. */\n private _addTyped(text: string) {\n if (Chips.getInstance(this.el) !== this) return;\n this.addChip({ id: text });\n this._input.value = '';\n this._input.focus();\n }\n\n _setupInput() {\n this._input = this.el.querySelector('input');\n if (!this._input) {\n this._input = document.createElement('input');\n this.el.append(this._input);\n }\n this._input.classList.add('input');\n this.hasAutocomplete = Object.keys(this.options.autocompleteOptions).length > 0;\n // Setup autocomplete if needed\n if (this.hasAutocomplete) this._setupAutocomplete();\n this._setPlaceholder();\n // Set input id\n if (!this._input.getAttribute('id')) this._input.setAttribute('id', Utils.guid());\n }\n\n _setupLabel() {\n this._label = this.el.querySelector('label');\n // No input to point at when allowUserInput is off.\n if (this._label && this._input) this._label.setAttribute('for', this._input.getAttribute('id'));\n }\n\n _setPlaceholder() {\n if (!this._input) return;\n if (!this.chipsData.length && this.options.placeholder) {\n this._input.placeholder = this.options.placeholder;\n } else if (this.chipsData.length && this.options.secondaryPlaceholder) {\n this._input.placeholder = this.options.secondaryPlaceholder;\n }\n }\n\n _isValidAndNotExist(chip: ChipData) {\n const isValid = !!chip.id || chip.id === 0;\n const doesNotExist = !this.chipsData.some((item) => item.id == chip.id);\n return isValid && doesNotExist;\n }\n\n /**\n * Add chip to input.\n * @param chip Chip data object\n */\n addChip(chip: ChipData) {\n if (!this._isValidAndNotExist(chip) || this.chipsData.length >= this.options.limit) return;\n const renderedChip = this._renderChip(chip);\n this._chips.push(renderedChip);\n this.chipsData.push(chip);\n if (this._end) this._end.before(renderedChip);\n else this.el.append(renderedChip);\n this._setPlaceholder();\n this._sync();\n this._notify('chip-add', this.options.onChipAdd, { args: [this.el, renderedChip], detail: { chip: renderedChip }, current: () => this._chips.includes(renderedChip) });\n }\n\n /**\n * Delete nth chip.\n * @param chipIndex Index of chip\n */\n deleteChip(chipIndex: number) {\n const root = this.el.getRootNode() as Document | ShadowRoot;\n this._deleteChip(chipIndex, this._chips[chipIndex]?.contains(root.activeElement) ? 'input' : null);\n }\n\n private _deleteChip(chipIndex: number, focus: 'input' | 'previous' | null) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n if (this._selectedChip === chip) this._setSelected(null);\n chip.remove();\n this._chips.splice(chipIndex, 1);\n this.chipsData.splice(chipIndex, 1);\n this._setPlaceholder();\n this._sync();\n const focusPath: { root: Document | ShadowRoot; element: Element | null }[] = [];\n let root = this.el.getRootNode() as Document | ShadowRoot;\n while (root) {\n focusPath.push({ root, element: root.activeElement });\n root = 'host' in root ? root.host.getRootNode() as Document | ShadowRoot : null;\n }\n this._notify('chip-delete', this.options.onChipDelete, { args: [this.el, chip], detail: { chip }, current: () => !this._chips.includes(chip) });\n if (!focus || focusPath.some(({ root, element }) => root.activeElement !== element) || this.el['Expressive_Chips'] !== this) return;\n if (focus === 'previous' && this._chips.length) this.selectChip(Math.max(chipIndex - 1, 0));\n else {\n this._setSelected(null);\n this._input?.focus();\n }\n }\n\n /**\n * Select nth chip.\n * @param chipIndex Index of chip\n */\n selectChip(chipIndex: number) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n this._setSelected(chip);\n // The chip is not a control any more, so focus goes to the one thing in it\n // that is - the delete button.\n (chip.querySelector('.close') as HTMLElement | null)?.focus();\n this._notify('chip-select', this.options.onChipSelect, { args: [this.el, chip], detail: { chip }, current: () => this._selectedChip === chip });\n }\n\n static Init() {\n // Handle removal of static chips - markup written by hand, which no Chips\n // instance tracks even when one sits on the container (AutoInit gives every\n // .chips one, usually without allowUserInput and so without a click\n // handler). A chip the instance rendered belongs to _handleChipClick:\n // removing the node here as well left chipsData holding an entry whose\n // element was gone.\n Utils.onDocumentReady(() => {\n const chips = document.querySelectorAll('.chips');\n chips.forEach((el) => {\n el.addEventListener('click', (e) => {\n // closest: the close button wraps an icon span, so a click on the\n // glyph reports the span.\n if (!(<HTMLElement>e.target).closest('.close')) return;\n const chip = (<HTMLElement>e.target).closest<HTMLElement>('.chip');\n if (chip && !(el['Expressive_Chips'] as Chips | undefined)?._chips.includes(chip)) chip.remove();\n });\n });\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["root"]
7
+ }
@@ -0,0 +1,116 @@
1
+ import {
2
+ Component
3
+ } from "./chunk-CMGXGYUC.mjs";
4
+ import {
5
+ Utils,
6
+ restoreAttribute
7
+ } from "./chunk-ZVLOUDIJ.mjs";
8
+
9
+ // src/ts/components/showMore.ts
10
+ var _defaults = {
11
+ onOpen: null,
12
+ onClose: null,
13
+ i18n: { showLess: "Show less" }
14
+ };
15
+ var CLAMP_PROPERTIES = ["-webkit-line-clamp", "line-clamp"];
16
+ var BUTTON_ATTRIBUTES = ["aria-expanded", "aria-controls", "hidden"];
17
+ function labelNode(button) {
18
+ const walker = button.ownerDocument.createTreeWalker(button, NodeFilter.SHOW_TEXT);
19
+ let label = null;
20
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) {
21
+ if (node.textContent.trim() && !node.parentElement.closest('[aria-hidden="true"]')) label = node;
22
+ }
23
+ return label;
24
+ }
25
+ var _ShowMore = class _ShowMore extends Component {
26
+ constructor(el, options) {
27
+ super(el, options);
28
+ this.isOpen = false;
29
+ // Attributes as they were before init, so destroy() can restore them.
30
+ this._initial = {};
31
+ this._initialId = null;
32
+ this._label = null;
33
+ this._moreLabel = "";
34
+ this._observer = null;
35
+ /** Shows the full text. */
36
+ this.open = () => {
37
+ if (this.isOpen || !this.button) return;
38
+ this._show(true);
39
+ this._notify("open", this.options.onOpen, { current: () => this.isOpen });
40
+ };
41
+ /** Clamps the text again. */
42
+ this.close = () => {
43
+ if (!this.isOpen) return;
44
+ this._show(false);
45
+ this._notify("close", this.options.onClose, { current: () => !this.isOpen });
46
+ };
47
+ this._toggle = () => this.isOpen ? this.close() : this.open();
48
+ /**
49
+ * Hides the button while the clamped text fits. Open text keeps it. So does
50
+ * focus, so a resize cannot hide the button someone is on and drop focus on
51
+ * the page. The check runs again on blur, which also hides a button whose
52
+ * text was collapsed after it widened to fit, since collapsing it then
53
+ * leaves the box the same size.
54
+ */
55
+ this._fit = () => {
56
+ if (this.isOpen || this.button.matches(":focus") || _ShowMore.getInstance(this.el) !== this) return;
57
+ this.button.hidden = this.text.scrollHeight - this.text.clientHeight <= 1;
58
+ };
59
+ this.text = el.querySelector(":scope > :is(.line-clamp-1, .line-clamp-2, .line-clamp-3)");
60
+ this.button = el.querySelector(":scope > button");
61
+ if (!this.text || !this.button) return;
62
+ this._wire();
63
+ const { signal } = this._events;
64
+ this.button.addEventListener("click", this._toggle, { signal });
65
+ this.button.addEventListener("blur", this._fit, { signal });
66
+ this._observer = new ResizeObserver(this._fit);
67
+ this._observer.observe(this.text);
68
+ el.ownerDocument.fonts?.ready.then(this._fit);
69
+ }
70
+ static get defaults() {
71
+ return _defaults;
72
+ }
73
+ destroy() {
74
+ if (this.button) {
75
+ this._observer.disconnect();
76
+ if (this.isOpen) this._show(false);
77
+ for (const name of BUTTON_ATTRIBUTES) restoreAttribute(this.button, name, this._initial[name]);
78
+ restoreAttribute(this.text, "id", this._initialId);
79
+ }
80
+ super.destroy();
81
+ }
82
+ /** Records what destroy() restores, then points the button at the text. */
83
+ _wire() {
84
+ for (const name of BUTTON_ATTRIBUTES) this._initial[name] = this.button.getAttribute(name);
85
+ this._initialId = this.text.getAttribute("id");
86
+ if (!this.text.id) this.text.id = `show-more-${Utils.guid()}`;
87
+ this._label = labelNode(this.button);
88
+ if (this._label) this._moreLabel = this._label.data;
89
+ this.button.ariaExpanded = "false";
90
+ this.button.setAttribute("aria-controls", this.text.id);
91
+ }
92
+ _show(open) {
93
+ this.isOpen = open;
94
+ this.button.ariaExpanded = String(open);
95
+ if (this._label) this._label.data = open ? this._lessLabel() : this._moreLabel;
96
+ this._clamp(!open);
97
+ }
98
+ _lessLabel() {
99
+ return this.button.dataset.showLess || this.options.i18n.showLess;
100
+ }
101
+ _clamp(on) {
102
+ if (on) this._restoreClamp();
103
+ else for (const property of CLAMP_PROPERTIES) this.text.style.setProperty(property, "unset");
104
+ }
105
+ _restoreClamp() {
106
+ for (const property of CLAMP_PROPERTIES) this.text.style.removeProperty(property);
107
+ if (!this.text.style.length) this.text.removeAttribute("style");
108
+ }
109
+ };
110
+ _ShowMore.key = "Expressive_ShowMore";
111
+ var ShowMore = _ShowMore;
112
+
113
+ export {
114
+ ShowMore
115
+ };
116
+ //# sourceMappingURL=chunk-X7SDA2J5.mjs.map