@kubex/zinc 0.0.2 → 1.0.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 (604) hide show
  1. package/.editorconfig +18 -0
  2. package/.eslintignore +8 -0
  3. package/.eslintrc.cjs +208 -0
  4. package/.github/workflows/eleventy_build.yml +42 -0
  5. package/.github/workflows/js_build_and_deploy.yaml +62 -0
  6. package/custom-elements-manifest.config.js +230 -0
  7. package/custom-elements.json +24227 -0
  8. package/docs/_includes/component.njk +340 -0
  9. package/docs/_includes/default.njk +137 -0
  10. package/docs/_includes/sidebar.njk +24 -0
  11. package/docs/_utilities/active-links.cjs +41 -0
  12. package/docs/_utilities/anchor-headings.cjs +74 -0
  13. package/docs/_utilities/cem.cjs +89 -0
  14. package/docs/_utilities/code-previews.cjs +98 -0
  15. package/docs/_utilities/copy-code-buttons.cjs +26 -0
  16. package/docs/_utilities/external-links.cjs +53 -0
  17. package/docs/_utilities/highlight-code.cjs +74 -0
  18. package/docs/_utilities/markdown.cjs +74 -0
  19. package/docs/_utilities/prettier.cjs +26 -0
  20. package/docs/_utilities/replacer.cjs +24 -0
  21. package/docs/_utilities/scrolling-tables.cjs +23 -0
  22. package/docs/_utilities/strings.cjs +16 -0
  23. package/docs/_utilities/table-of-contents.cjs +48 -0
  24. package/docs/_utilities/typography.cjs +24 -0
  25. package/docs/assets/icons.json +57989 -0
  26. package/docs/assets/images/chrome.png +0 -0
  27. package/docs/assets/images/edge.png +0 -0
  28. package/docs/assets/images/firefox.png +0 -0
  29. package/docs/assets/images/opera.png +0 -0
  30. package/docs/assets/images/safari.png +0 -0
  31. package/docs/assets/images/watermark.svg +1 -0
  32. package/docs/assets/rip.js +78 -0
  33. package/docs/assets/scripts/code-previews.js +250 -0
  34. package/docs/assets/scripts/docs.js +374 -0
  35. package/docs/assets/scripts/search.js +441 -0
  36. package/docs/assets/scripts/turbo.js +29 -0
  37. package/docs/assets/styles/code-previews.css +169 -0
  38. package/docs/assets/styles/docs.css +1168 -0
  39. package/docs/assets/styles/search.css +347 -0
  40. package/docs/eleventy.config.cjs +262 -0
  41. package/docs/pages/components/absolute-container.md +35 -0
  42. package/docs/pages/components/action-bar.md +58 -0
  43. package/docs/pages/components/alert.md +45 -0
  44. package/docs/pages/components/bulk-actions.md +26 -0
  45. package/docs/pages/components/button-group.md +78 -0
  46. package/docs/pages/components/button-menu.md +127 -0
  47. package/docs/pages/components/button.md +80 -0
  48. package/docs/pages/components/chart.md +27 -0
  49. package/docs/pages/components/checkbox-group.md +196 -0
  50. package/docs/pages/components/checkbox.md +157 -0
  51. package/docs/pages/components/chip.md +61 -0
  52. package/docs/pages/components/collapsible.md +52 -0
  53. package/docs/pages/components/cols.md +66 -0
  54. package/docs/pages/components/confirm.md +52 -0
  55. package/docs/pages/components/content-block.md +108 -0
  56. package/docs/pages/components/copy-button.md +22 -0
  57. package/docs/pages/components/data-select.md +54 -0
  58. package/docs/pages/components/data-table-filter.md +23 -0
  59. package/docs/pages/components/data-table-sort.md +20 -0
  60. package/docs/pages/components/data-table.md +74 -0
  61. package/docs/pages/components/datepicker.md +25 -0
  62. package/docs/pages/components/defined-label.md +26 -0
  63. package/docs/pages/components/dialog.md +145 -0
  64. package/docs/pages/components/dropdown.md +22 -0
  65. package/docs/pages/components/editor.md +26 -0
  66. package/docs/pages/components/empty-state.md +51 -0
  67. package/docs/pages/components/expanding-action.md +55 -0
  68. package/docs/pages/components/file.md +45 -0
  69. package/docs/pages/components/form-group.md +22 -0
  70. package/docs/pages/components/header.md +103 -0
  71. package/docs/pages/components/icon.md +322 -0
  72. package/docs/pages/components/inline-edit.md +41 -0
  73. package/docs/pages/components/input.md +261 -0
  74. package/docs/pages/components/item.md +78 -0
  75. package/docs/pages/components/linked-select.md +41 -0
  76. package/docs/pages/components/menu-item.md +22 -0
  77. package/docs/pages/components/menu.md +36 -0
  78. package/docs/pages/components/navbar.md +57 -0
  79. package/docs/pages/components/note.md +55 -0
  80. package/docs/pages/components/option.md +22 -0
  81. package/docs/pages/components/order-table.md +22 -0
  82. package/docs/pages/components/page-nav.md +23 -0
  83. package/docs/pages/components/pagination.md +22 -0
  84. package/docs/pages/components/pane.md +22 -0
  85. package/docs/pages/components/panel.md +124 -0
  86. package/docs/pages/components/popup.md +22 -0
  87. package/docs/pages/components/progress-bar.md +22 -0
  88. package/docs/pages/components/progress-tile.md +22 -0
  89. package/docs/pages/components/query-builder.md +148 -0
  90. package/docs/pages/components/radio-group.md +129 -0
  91. package/docs/pages/components/radio.md +20 -0
  92. package/docs/pages/components/rating.md +28 -0
  93. package/docs/pages/components/scroll-container.md +22 -0
  94. package/docs/pages/components/select.md +452 -0
  95. package/docs/pages/components/sidebar.md +28 -0
  96. package/docs/pages/components/simple-chart.md +23 -0
  97. package/docs/pages/components/skeleton.md +70 -0
  98. package/docs/pages/components/slideout.md +23 -0
  99. package/docs/pages/components/sp.md +87 -0
  100. package/docs/pages/components/split-button.md +32 -0
  101. package/docs/pages/components/split-pane.md +22 -0
  102. package/docs/pages/components/stat.md +24 -0
  103. package/docs/pages/components/status-indicator.md +13 -0
  104. package/docs/pages/components/stepper.md +20 -0
  105. package/docs/pages/components/style.md +106 -0
  106. package/docs/pages/components/table.md +22 -0
  107. package/docs/pages/components/tabs.md +57 -0
  108. package/docs/pages/components/textarea.md +120 -0
  109. package/docs/pages/components/tile-property.md +29 -0
  110. package/docs/pages/components/tile.md +51 -0
  111. package/docs/pages/components/timer.md +22 -0
  112. package/docs/pages/components/toggle.md +22 -0
  113. package/docs/pages/components/tooltip.md +242 -0
  114. package/docs/pages/components/vertical-stepper.md +22 -0
  115. package/docs/pages/components/well.md +13 -0
  116. package/docs/pages/getting-started/example-layout.md +143 -0
  117. package/docs/pages/getting-started/example-page.md +83 -0
  118. package/docs/pages/getting-started/form-controls.md +552 -0
  119. package/docs/pages/getting-started/form-examples.md +122 -0
  120. package/docs/pages/getting-started/table-examples.md +43 -0
  121. package/docs/pages/index.md +32 -0
  122. package/index.html +22 -0
  123. package/package.json +111 -11
  124. package/scripts/build.js +381 -0
  125. package/scripts/generator/generator.js +102 -0
  126. package/scripts/generator/index.js +17 -0
  127. package/scripts/generator/preprocess.js +20 -0
  128. package/scripts/generator/resolver.js +86 -0
  129. package/scripts/generator/tailwind.config.js +14 -0
  130. package/scripts/make-metadata.js +10 -0
  131. package/scripts/make-themes.js +27 -0
  132. package/scripts/plop/plopfile.js +63 -0
  133. package/scripts/plop/templates/component.hbs +43 -0
  134. package/scripts/plop/templates/define.hbs +12 -0
  135. package/scripts/plop/templates/docs.hbs +20 -0
  136. package/scripts/plop/templates/style.hbs +5 -0
  137. package/scripts/plop/templates/test.hbs +10 -0
  138. package/scss/_global-components.scss +4 -0
  139. package/scss/_global-spacing.scss +96 -0
  140. package/scss/_root.scss +202 -0
  141. package/scss/boot.scss +29 -0
  142. package/scss/mixins/_helper-mixins.scss +24 -0
  143. package/scss/mixins/_spacing-mixins.scss +84 -0
  144. package/scss/mixins/index.scss +2 -0
  145. package/scss/shared/_base.scss +138 -0
  146. package/scss/shared/_button.scss +27 -0
  147. package/scss/shared/_form-elements.scss +162 -0
  148. package/scss/shared/_opacity.scss +27 -0
  149. package/scss/shared/_reset.scss +288 -0
  150. package/scss/shared/_table.scss +73 -0
  151. package/scss/shared/divide.scss +41 -0
  152. package/scss/shared/index.scss +12 -0
  153. package/scss/shared/layout.scss +290 -0
  154. package/scss/shared/nav.scss +71 -0
  155. package/scss/themes/_dark.scss +277 -0
  156. package/scss/themes/_index.scss +3 -0
  157. package/scss/themes/_light.scss +540 -0
  158. package/scss/themes/_utility.scss +44 -0
  159. package/scss/variables/_spacing.scss +35 -0
  160. package/scss/variables/index.scss +1 -0
  161. package/src/components/absolute-container/absolute-container.component.ts +62 -0
  162. package/src/components/absolute-container/absolute-container.test.ts +10 -0
  163. package/src/components/absolute-container/index.ts +12 -0
  164. package/src/components/action-bar/action-bar.component.ts +41 -0
  165. package/src/components/action-bar/action-bar.scss +33 -0
  166. package/src/components/action-bar/action-bar.test.ts +10 -0
  167. package/src/components/action-bar/index.ts +12 -0
  168. package/src/components/alert/alert.component.ts +71 -0
  169. package/src/components/alert/alert.scss +170 -0
  170. package/src/components/alert/alert.test.ts +10 -0
  171. package/src/components/alert/index.ts +12 -0
  172. package/src/components/bulk-actions/bulk-actions.component.ts +229 -0
  173. package/src/components/bulk-actions/bulk-actions.scss +56 -0
  174. package/src/components/bulk-actions/bulk-actions.test.ts +10 -0
  175. package/src/components/bulk-actions/index.ts +12 -0
  176. package/src/components/button/button.component.ts +242 -0
  177. package/src/components/button/button.scss +346 -0
  178. package/src/components/button/button.test.ts +32 -0
  179. package/src/components/button/index.ts +12 -0
  180. package/src/components/button-group/button-group.component.ts +74 -0
  181. package/src/components/button-group/button-group.scss +39 -0
  182. package/src/components/button-group/button-group.test.ts +10 -0
  183. package/src/components/button-group/index.ts +12 -0
  184. package/src/components/button-menu/button-menu.component.ts +353 -0
  185. package/src/components/button-menu/button-menu.scss +41 -0
  186. package/src/components/button-menu/button-menu.test.ts +10 -0
  187. package/src/components/button-menu/index.ts +12 -0
  188. package/src/components/chart/chart.component.ts +206 -0
  189. package/src/components/chart/chart.scss +11 -0
  190. package/src/components/chart/chart.test.ts +10 -0
  191. package/src/components/chart/index.ts +12 -0
  192. package/src/components/checkbox/checkbox.component.ts +326 -0
  193. package/src/components/checkbox/checkbox.scss +202 -0
  194. package/src/components/checkbox/checkbox.test.ts +10 -0
  195. package/src/components/checkbox/index.ts +12 -0
  196. package/src/components/checkbox-group/checkbox-group.component.ts +351 -0
  197. package/src/components/checkbox-group/checkbox-group.scss +60 -0
  198. package/src/components/checkbox-group/checkbox-group.test.ts +10 -0
  199. package/src/components/checkbox-group/index.ts +12 -0
  200. package/src/components/chip/chip.component.ts +70 -0
  201. package/src/components/chip/chip.scss +101 -0
  202. package/src/components/chip/chip.test.ts +10 -0
  203. package/src/components/chip/index.ts +12 -0
  204. package/src/components/collapsible/collapsible.component.ts +86 -0
  205. package/src/components/collapsible/collapsible.scss +100 -0
  206. package/src/components/collapsible/collapsible.test.ts +10 -0
  207. package/src/components/collapsible/index.ts +12 -0
  208. package/src/components/cols/cols.component.ts +76 -0
  209. package/src/components/cols/cols.scss +99 -0
  210. package/src/components/cols/cols.test.ts +10 -0
  211. package/src/components/cols/index.ts +12 -0
  212. package/src/components/confirm/confirm.component.ts +181 -0
  213. package/src/components/confirm/confirm.scss +44 -0
  214. package/src/components/confirm/confirm.test.ts +10 -0
  215. package/src/components/confirm/index.ts +12 -0
  216. package/src/components/content-block/content-block.component.ts +225 -0
  217. package/src/components/content-block/content-block.scss +64 -0
  218. package/src/components/content-block/content-block.test.ts +10 -0
  219. package/src/components/content-block/index.ts +12 -0
  220. package/src/components/copy-button/copy-button.component.ts +163 -0
  221. package/src/components/copy-button/copy-button.scss +47 -0
  222. package/src/components/copy-button/copy-button.test.ts +10 -0
  223. package/src/components/copy-button/index.ts +12 -0
  224. package/src/components/data-select/data-select.component.ts +219 -0
  225. package/src/components/data-select/data-select.scss +43 -0
  226. package/src/components/data-select/data-select.test.ts +10 -0
  227. package/src/components/data-select/index.ts +12 -0
  228. package/src/components/data-select/providers/color-data-provider.ts +16 -0
  229. package/src/components/data-select/providers/country-code-data-provider.ts +517 -0
  230. package/src/components/data-select/providers/country-data-provider.ts +527 -0
  231. package/src/components/data-select/providers/currency-data-provider.ts +328 -0
  232. package/src/components/data-select/providers/provider.ts +32 -0
  233. package/src/components/data-table/data-table.component.ts +1093 -0
  234. package/src/components/data-table/data-table.scss +330 -0
  235. package/src/components/data-table/data-table.test.ts +10 -0
  236. package/src/components/data-table/index.ts +12 -0
  237. package/src/components/data-table-filter/data-table-filter.component.ts +126 -0
  238. package/src/components/data-table-filter/data-table-filter.scss +22 -0
  239. package/src/components/data-table-filter/data-table-filter.test.ts +10 -0
  240. package/src/components/data-table-filter/index.ts +12 -0
  241. package/src/components/data-table-sort/data-table-sort.component.ts +56 -0
  242. package/src/components/data-table-sort/data-table-sort.scss +37 -0
  243. package/src/components/data-table-sort/data-table-sort.test.ts +10 -0
  244. package/src/components/data-table-sort/index.ts +12 -0
  245. package/src/components/datepicker/datepicker.component.ts +315 -0
  246. package/src/components/datepicker/datepicker.scss +237 -0
  247. package/src/components/datepicker/datepicker.test.ts +10 -0
  248. package/src/components/datepicker/index.ts +12 -0
  249. package/src/components/defined-label/defined-label.component.ts +241 -0
  250. package/src/components/defined-label/defined-label.scss +43 -0
  251. package/src/components/defined-label/defined-label.test.ts +10 -0
  252. package/src/components/defined-label/index.ts +12 -0
  253. package/src/components/dialog/dialog.component.ts +237 -0
  254. package/src/components/dialog/dialog.scss +197 -0
  255. package/src/components/dialog/dialog.test.ts +10 -0
  256. package/src/components/dialog/index.ts +12 -0
  257. package/src/components/dropdown/dropdown.component.ts +380 -0
  258. package/src/components/dropdown/dropdown.scss +9 -0
  259. package/src/components/dropdown/dropdown.test.ts +10 -0
  260. package/src/components/dropdown/index.ts +12 -0
  261. package/src/components/editor/editor.component.ts +423 -0
  262. package/src/components/editor/editor.scss +131 -0
  263. package/src/components/editor/editor.test.ts +10 -0
  264. package/src/components/editor/index.ts +12 -0
  265. package/src/components/editor/modules/attachment-module.ts +195 -0
  266. package/src/components/editor/modules/dialog-module/dialog-module.component.ts +289 -0
  267. package/src/components/editor/modules/dialog-module/dialog-module.scss +115 -0
  268. package/src/components/editor/modules/dialog-module/dialog-module.ts +99 -0
  269. package/src/components/editor/modules/drag-drop-module.ts +125 -0
  270. package/src/components/editor/modules/events/zn-command-select.ts +7 -0
  271. package/src/components/editor/modules/events/zn-editor-update.ts +7 -0
  272. package/src/components/editor/modules/events/zn-show-canned-response-dialog.ts +15 -0
  273. package/src/components/editor/modules/image-resize-module/image-resize-module.ts +157 -0
  274. package/src/components/editor/modules/menu-module/menu-module.component.ts +149 -0
  275. package/src/components/editor/modules/menu-module/menu-module.scss +17 -0
  276. package/src/components/editor/modules/menu-module/menu-module.ts +203 -0
  277. package/src/components/editor/modules/time-tracking-module.ts +35 -0
  278. package/src/components/empty-state/empty-state.component.ts +63 -0
  279. package/src/components/empty-state/empty-state.scss +91 -0
  280. package/src/components/empty-state/empty-state.test.ts +10 -0
  281. package/src/components/empty-state/index.ts +12 -0
  282. package/src/components/expanding-action/expanding-action.component.ts +312 -0
  283. package/src/components/expanding-action/expanding-action.scss +87 -0
  284. package/src/components/expanding-action/expanding-action.test.ts +10 -0
  285. package/src/components/expanding-action/index.ts +12 -0
  286. package/src/components/file/file.component.ts +619 -0
  287. package/src/components/file/file.scss +200 -0
  288. package/src/components/file/file.test.ts +10 -0
  289. package/src/components/file/index.ts +12 -0
  290. package/src/components/form-group/form-group.component.ts +93 -0
  291. package/src/components/form-group/form-group.scss +84 -0
  292. package/src/components/form-group/form-group.test.ts +10 -0
  293. package/src/components/form-group/index.ts +12 -0
  294. package/src/components/header/header.component.ts +186 -0
  295. package/src/components/header/header.scss +244 -0
  296. package/src/components/header/header.test.ts +10 -0
  297. package/src/components/header/index.ts +12 -0
  298. package/src/components/hover-container/hover-container.component.ts +214 -0
  299. package/src/components/hover-container/hover-container.scss +59 -0
  300. package/src/components/hover-container/hover-container.ts +10 -0
  301. package/src/components/hover-container/index.ts +12 -0
  302. package/src/components/icon/icon.component.ts +251 -0
  303. package/src/components/icon/icon.scss +186 -0
  304. package/src/components/icon/icon.test.ts +10 -0
  305. package/src/components/icon/index.ts +13 -0
  306. package/src/components/icon/lni.scss +2492 -0
  307. package/src/components/inline-edit/index.ts +12 -0
  308. package/src/components/inline-edit/inline-edit.component.ts +289 -0
  309. package/src/components/inline-edit/inline-edit.scss +139 -0
  310. package/src/components/inline-edit/inline-edit.test.ts +10 -0
  311. package/src/components/input/index.ts +12 -0
  312. package/src/components/input/input.component.ts +614 -0
  313. package/src/components/input/input.scss +355 -0
  314. package/src/components/input/input.test.ts +10 -0
  315. package/src/components/item/index.ts +12 -0
  316. package/src/components/item/item.component.ts +102 -0
  317. package/src/components/item/item.scss +161 -0
  318. package/src/components/item/item.test.ts +10 -0
  319. package/src/components/linked-select/index.ts +12 -0
  320. package/src/components/linked-select/linked-select.component.ts +156 -0
  321. package/src/components/linked-select/linked-select.scss +9 -0
  322. package/src/components/linked-select/linked-select.test.ts +17 -0
  323. package/src/components/menu/index.ts +12 -0
  324. package/src/components/menu/menu.component.ts +243 -0
  325. package/src/components/menu/menu.scss +14 -0
  326. package/src/components/menu/menu.test.ts +10 -0
  327. package/src/components/menu-item/index.ts +12 -0
  328. package/src/components/menu-item/menu-item.component.ts +220 -0
  329. package/src/components/menu-item/menu-item.scss +157 -0
  330. package/src/components/menu-item/menu-item.test.ts +10 -0
  331. package/src/components/menu-item/submenu-controller.ts +291 -0
  332. package/src/components/navbar/index.ts +12 -0
  333. package/src/components/navbar/navbar.component.ts +240 -0
  334. package/src/components/navbar/navbar.scss +411 -0
  335. package/src/components/navbar/navbar.test.ts +10 -0
  336. package/src/components/note/index.ts +12 -0
  337. package/src/components/note/note.component.ts +60 -0
  338. package/src/components/note/note.scss +69 -0
  339. package/src/components/note/note.test.ts +10 -0
  340. package/src/components/option/index.ts +12 -0
  341. package/src/components/option/option.component.ts +152 -0
  342. package/src/components/option/option.scss +88 -0
  343. package/src/components/option/option.test.ts +10 -0
  344. package/src/components/order-table/index.ts +12 -0
  345. package/src/components/order-table/order-table.component.ts +323 -0
  346. package/src/components/order-table/order-table.scss +154 -0
  347. package/src/components/order-table/order-table.test.ts +10 -0
  348. package/src/components/page-nav/index.ts +12 -0
  349. package/src/components/page-nav/page-nav.component.ts +117 -0
  350. package/src/components/page-nav/page-nav.scss +155 -0
  351. package/src/components/page-nav/page-nav.test.ts +10 -0
  352. package/src/components/pagination/index.ts +12 -0
  353. package/src/components/pagination/pagination.component.ts +91 -0
  354. package/src/components/pagination/pagination.scss +76 -0
  355. package/src/components/pagination/pagination.test.ts +10 -0
  356. package/src/components/pane/index.ts +12 -0
  357. package/src/components/pane/pane.component.ts +52 -0
  358. package/src/components/pane/pane.scss +45 -0
  359. package/src/components/pane/pane.test.ts +10 -0
  360. package/src/components/panel/index.ts +12 -0
  361. package/src/components/panel/panel.component.ts +100 -0
  362. package/src/components/panel/panel.scss +129 -0
  363. package/src/components/panel/panel.test.ts +10 -0
  364. package/src/components/popup/index.ts +12 -0
  365. package/src/components/popup/popup.component.ts +543 -0
  366. package/src/components/popup/popup.scss +59 -0
  367. package/src/components/popup/popup.test.ts +10 -0
  368. package/src/components/progress-bar/index.ts +12 -0
  369. package/src/components/progress-bar/progress-bar.component.ts +80 -0
  370. package/src/components/progress-bar/progress-bar.scss +46 -0
  371. package/src/components/progress-bar/progress-bar.test.ts +10 -0
  372. package/src/components/progress-tile/index.ts +12 -0
  373. package/src/components/progress-tile/progress-tile.component.ts +127 -0
  374. package/src/components/progress-tile/progress-tile.scss +116 -0
  375. package/src/components/progress-tile/progress-tile.test.ts +10 -0
  376. package/src/components/query-builder/index.ts +12 -0
  377. package/src/components/query-builder/query-builder.component.ts +544 -0
  378. package/src/components/query-builder/query-builder.scss +53 -0
  379. package/src/components/query-builder/query-builder.test.ts +10 -0
  380. package/src/components/radio/index.ts +12 -0
  381. package/src/components/radio/radio.component.ts +305 -0
  382. package/src/components/radio/radio.scss +197 -0
  383. package/src/components/radio/radio.test.ts +10 -0
  384. package/src/components/radio-group/index.ts +12 -0
  385. package/src/components/radio-group/radio-group.component.ts +362 -0
  386. package/src/components/radio-group/radio-group.scss +60 -0
  387. package/src/components/radio-group/radio-group.test.ts +10 -0
  388. package/src/components/rating/index.ts +12 -0
  389. package/src/components/rating/rating.component.ts +235 -0
  390. package/src/components/rating/rating.scss +82 -0
  391. package/src/components/rating/rating.test.ts +10 -0
  392. package/src/components/scroll-container/index.ts +12 -0
  393. package/src/components/scroll-container/scroll-container.component.ts +41 -0
  394. package/src/components/scroll-container/scroll-container.scss +17 -0
  395. package/src/components/scroll-container/scroll-container.test.ts +10 -0
  396. package/src/components/select/index.ts +12 -0
  397. package/src/components/select/select.component.ts +984 -0
  398. package/src/components/select/select.scss +325 -0
  399. package/src/components/select/select.test.ts +10 -0
  400. package/src/components/sidebar/index.ts +12 -0
  401. package/src/components/sidebar/sidebar.component.ts +98 -0
  402. package/src/components/sidebar/sidebar.scss +294 -0
  403. package/src/components/sidebar/sidebar.test.ts +10 -0
  404. package/src/components/simple-chart/index.ts +12 -0
  405. package/src/components/simple-chart/simple-chart.component.ts +204 -0
  406. package/src/components/simple-chart/simple-chart.scss +9 -0
  407. package/src/components/simple-chart/simple-chart.test.ts +10 -0
  408. package/src/components/skeleton/index.ts +12 -0
  409. package/src/components/skeleton/skeleton.component.ts +34 -0
  410. package/src/components/skeleton/skeleton.scss +39 -0
  411. package/src/components/skeleton/skeleton.test.ts +10 -0
  412. package/src/components/slideout/index.ts +12 -0
  413. package/src/components/slideout/slideout.component.ts +223 -0
  414. package/src/components/slideout/slideout.scss +96 -0
  415. package/src/components/slideout/slideout.test.ts +10 -0
  416. package/src/components/sp/index.ts +12 -0
  417. package/src/components/sp/sp.component.ts +86 -0
  418. package/src/components/sp/sp.scss +88 -0
  419. package/src/components/sp/sp.test.ts +10 -0
  420. package/src/components/split-button/index.ts +12 -0
  421. package/src/components/split-button/split-button.component.ts +154 -0
  422. package/src/components/split-button/split-button.scss +9 -0
  423. package/src/components/split-button/split-button.test.ts +10 -0
  424. package/src/components/split-pane/index.ts +12 -0
  425. package/src/components/split-pane/split-pane.component.ts +195 -0
  426. package/src/components/split-pane/split-pane.scss +303 -0
  427. package/src/components/split-pane/split-pane.test.ts +10 -0
  428. package/src/components/stat/index.ts +12 -0
  429. package/src/components/stat/stat.component.ts +117 -0
  430. package/src/components/stat/stat.scss +92 -0
  431. package/src/components/stat/stat.test.ts +10 -0
  432. package/src/components/status-indicator/index.ts +12 -0
  433. package/src/components/status-indicator/status-indicator.component.ts +31 -0
  434. package/src/components/status-indicator/status-indicator.scss +32 -0
  435. package/src/components/status-indicator/status-indicator.test.ts +10 -0
  436. package/src/components/stepper/index.ts +12 -0
  437. package/src/components/stepper/stepper.component.ts +80 -0
  438. package/src/components/stepper/stepper.scss +88 -0
  439. package/src/components/stepper/stepper.test.ts +10 -0
  440. package/src/components/style/index.ts +12 -0
  441. package/src/components/style/style.component.ts +150 -0
  442. package/src/components/style/style.scss +1 -0
  443. package/src/components/style/style.test.ts +10 -0
  444. package/src/components/table/index.ts +12 -0
  445. package/src/components/table/table.component.ts +297 -0
  446. package/src/components/table/table.scss +209 -0
  447. package/src/components/table/table.test.ts +10 -0
  448. package/src/components/tabs/index.ts +12 -0
  449. package/src/components/tabs/tabs.component.ts +496 -0
  450. package/src/components/tabs/tabs.scss +147 -0
  451. package/src/components/tabs/tabs.test.ts +10 -0
  452. package/src/components/textarea/index.ts +12 -0
  453. package/src/components/textarea/textarea.component.ts +417 -0
  454. package/src/components/textarea/textarea.scss +152 -0
  455. package/src/components/textarea/textarea.test.ts +10 -0
  456. package/src/components/tile/index.ts +12 -0
  457. package/src/components/tile/tile.component.ts +105 -0
  458. package/src/components/tile/tile.scss +144 -0
  459. package/src/components/tile/tile.test.ts +10 -0
  460. package/src/components/tile-property/index.ts +12 -0
  461. package/src/components/tile-property/tile-property.component.ts +43 -0
  462. package/src/components/tile-property/tile-property.scss +43 -0
  463. package/src/components/tile-property/tile-property.test.ts +10 -0
  464. package/src/components/timer/index.ts +12 -0
  465. package/src/components/timer/timer.component.ts +88 -0
  466. package/src/components/timer/timer.scss +40 -0
  467. package/src/components/timer/timer.test.ts +10 -0
  468. package/src/components/toggle/index.ts +12 -0
  469. package/src/components/toggle/toggle.component.ts +203 -0
  470. package/src/components/toggle/toggle.scss +93 -0
  471. package/src/components/toggle/toggle.test.ts +10 -0
  472. package/src/components/tooltip/index.ts +12 -0
  473. package/src/components/tooltip/tooltip.component.ts +215 -0
  474. package/src/components/tooltip/tooltip.scss +43 -0
  475. package/src/components/tooltip/tooltip.test.ts +10 -0
  476. package/src/components/vertical-stepper/index.ts +12 -0
  477. package/src/components/vertical-stepper/vertical-stepper.component.ts +53 -0
  478. package/src/components/vertical-stepper/vertical-stepper.scss +84 -0
  479. package/src/components/vertical-stepper/vertical-stepper.test.ts +10 -0
  480. package/src/components/well/index.ts +12 -0
  481. package/src/components/well/well.component.ts +43 -0
  482. package/src/components/well/well.scss +19 -0
  483. package/src/components/well/well.test.ts +10 -0
  484. package/src/declaration.d.ts +39 -0
  485. package/src/events/events.ts +7 -0
  486. package/src/events/zn-after-collapse.ts +7 -0
  487. package/src/events/zn-after-expand.ts +7 -0
  488. package/src/events/zn-after-hide.ts +7 -0
  489. package/src/events/zn-after-show.ts +7 -0
  490. package/src/events/zn-blur.ts +7 -0
  491. package/src/events/zn-cancel.ts +7 -0
  492. package/src/events/zn-change.ts +7 -0
  493. package/src/events/zn-clear.ts +7 -0
  494. package/src/events/zn-close.ts +7 -0
  495. package/src/events/zn-collapse.ts +7 -0
  496. package/src/events/zn-copy.ts +7 -0
  497. package/src/events/zn-element-added.ts +7 -0
  498. package/src/events/zn-error.ts +7 -0
  499. package/src/events/zn-expand.ts +7 -0
  500. package/src/events/zn-filter-change.ts +7 -0
  501. package/src/events/zn-finish.ts +7 -0
  502. package/src/events/zn-focus.ts +7 -0
  503. package/src/events/zn-hide.ts +7 -0
  504. package/src/events/zn-hover.ts +10 -0
  505. package/src/events/zn-initial-focus.ts +7 -0
  506. package/src/events/zn-input.ts +7 -0
  507. package/src/events/zn-invalid.ts +7 -0
  508. package/src/events/zn-load.ts +7 -0
  509. package/src/events/zn-menu-ready.ts +9 -0
  510. package/src/events/zn-menu-select.ts +9 -0
  511. package/src/events/zn-open.ts +7 -0
  512. package/src/events/zn-remove.ts +7 -0
  513. package/src/events/zn-request-close.ts +7 -0
  514. package/src/events/zn-select.ts +9 -0
  515. package/src/events/zn-show.ts +7 -0
  516. package/src/events/zn-sort-change.ts +7 -0
  517. package/src/events/zn-submit.ts +7 -0
  518. package/src/form-control.scss +123 -0
  519. package/src/internal/animate.ts +64 -0
  520. package/src/internal/default-value.ts +49 -0
  521. package/src/internal/event.ts +75 -0
  522. package/src/internal/form.ts +527 -0
  523. package/src/internal/offset.ts +13 -0
  524. package/src/internal/scroll.ts +69 -0
  525. package/src/internal/slot.ts +110 -0
  526. package/src/internal/storage.ts +70 -0
  527. package/src/internal/tabbable.ts +198 -0
  528. package/src/internal/theme.ts +54 -0
  529. package/src/internal/watch.ts +63 -0
  530. package/src/internal/zinc-element.ts +113 -0
  531. package/src/translations/en.ts +30 -0
  532. package/src/utilities/animation-registry.ts +74 -0
  533. package/src/utilities/base-path.ts +46 -0
  534. package/src/utilities/lit-to-html.ts +7 -0
  535. package/src/utilities/localize.ts +37 -0
  536. package/src/utilities/md5.ts +216 -0
  537. package/src/utilities/on.ts +29 -0
  538. package/src/utilities/query.ts +36 -0
  539. package/src/wc.scss +33 -0
  540. package/src/zinc-autoloader.ts +58 -0
  541. package/src/zinc.ts +83 -0
  542. package/tsconfig.json +41 -0
  543. package/tsconfig.prod.json +12 -0
  544. package/vscode.html-custom-data.json +2804 -0
  545. package/web-test-runner.config.js +50 -0
  546. package/web-types.json +6420 -0
  547. package/zn.d.ts +6318 -0
  548. package/zn.min.css +1 -0
  549. package/zn.min.js +3701 -0
  550. package/.idea/.name +0 -1
  551. package/.idea/fusion.iml +0 -9
  552. package/.idea/modules.xml +0 -8
  553. package/.idea/php.xml +0 -4
  554. package/.idea/vcs.xml +0 -6
  555. package/.idea/watcherTasks.xml +0 -25
  556. package/components/Blank/demo/demo.html +0 -11
  557. package/components/Blank/dist/zn-blank.js +0 -39
  558. package/components/Blank/go/component.go +0 -18
  559. package/components/Blank/go/go.mod +0 -3
  560. package/components/Blank/package.json +0 -33
  561. package/components/Blank/php/composer.json +0 -25
  562. package/components/Blank/php/src/Blank.php +0 -15
  563. package/components/Blank/rollup.config.js +0 -32
  564. package/components/Blank/scss/Styles.scss +0 -6
  565. package/components/Blank/ts/Component.ts +0 -15
  566. package/components/Blank/tsconfig.json +0 -7
  567. package/components/Icon/demo/demo.html +0 -90
  568. package/components/Icon/dist/zn-icon.js +0 -55
  569. package/components/Icon/go/component.go +0 -56
  570. package/components/Icon/go/go.mod +0 -3
  571. package/components/Icon/package.json +0 -33
  572. package/components/Icon/php/composer.json +0 -26
  573. package/components/Icon/php/src/Icon.php +0 -38
  574. package/components/Icon/php/src/Library.php +0 -17
  575. package/components/Icon/php/src/Size.php +0 -42
  576. package/components/Icon/roadmap.md +0 -7
  577. package/components/Icon/rollup.config.js +0 -32
  578. package/components/Icon/scss/Styles.scss +0 -65
  579. package/components/Icon/ts/Component.ts +0 -108
  580. package/components/Icon/ts/md5.ts +0 -215
  581. package/components/Icon/tsconfig.json +0 -7
  582. package/components/MaxWidth/demo/demo.html +0 -11
  583. package/components/MaxWidth/dist/zn-max-width.js +0 -51
  584. package/components/MaxWidth/go/component.go +0 -24
  585. package/components/MaxWidth/go/go.mod +0 -3
  586. package/components/MaxWidth/package.json +0 -33
  587. package/components/MaxWidth/php/composer.json +0 -25
  588. package/components/MaxWidth/php/src/MaxWidth.php +0 -32
  589. package/components/MaxWidth/rollup.config.js +0 -32
  590. package/components/MaxWidth/scss/Styles.scss +0 -13
  591. package/components/MaxWidth/ts/Component.ts +0 -27
  592. package/components/MaxWidth/tsconfig.json +0 -7
  593. package/components/roadmap.md +0 -4
  594. package/layout/components/Columns/demo/demo.html +0 -16
  595. package/layout/components/Columns/ts/Component.ts +0 -59
  596. package/layout/demo/index.html +0 -24
  597. package/layout/dist/zn-layout.js +0 -87
  598. package/layout/package.json +0 -38
  599. package/layout/rollup.config.js +0 -38
  600. package/layout/scss/layout.scss +0 -24
  601. package/layout/tailwind.config.js +0 -42
  602. package/layout/ts/import.ts +0 -2
  603. package/layout/tsconfig.json +0 -7
  604. /package/{layout/components/Columns/scss/Styles.scss → src/internal/zinc-element.test.ts} +0 -0
@@ -0,0 +1,619 @@
1
+ import {animateTo} from "../../internal/animate";
2
+ import {classMap} from "lit/directives/class-map.js";
3
+ import {type CSSResultGroup, html, type HTMLTemplateResult, unsafeCSS} from 'lit';
4
+ import {defaultValue} from "../../internal/default-value";
5
+ import {FormControlController} from "../../internal/form";
6
+ import {getAnimation, setDefaultAnimation} from "../../utilities/animation-registry";
7
+ import {HasSlotController} from "../../internal/slot";
8
+ import {ifDefined} from "lit/directives/if-defined.js";
9
+ import {LocalizeController} from "../../utilities/localize";
10
+ import {property, query, state} from 'lit/decorators.js';
11
+ import {repeat} from 'lit/directives/repeat.js';
12
+ import {watch} from "../../internal/watch";
13
+ import ZincElement, {type ZincFormControl} from '../../internal/zinc-element';
14
+ import type ZnButton from "../button";
15
+
16
+ import styles from './file.scss';
17
+
18
+ /**
19
+ * @summary File controls allow selecting an arbitrary number of files for uploading.
20
+ * @documentation https://zinc.style/components/drag-upload
21
+ * @status experimental
22
+ * @since 1.0
23
+ *
24
+ * @dependency zn-button
25
+ * @dependency zn-icon
26
+ *
27
+ * @slot label - The file control's label. Alternatively, you can use the `label` attribute.
28
+ * @slot help-text - Text that describes how to use the file control.
29
+ * Alternatively, you can use the `help-text` attribute.
30
+ * @slot droparea-icon - Optional droparea icon to use instead of the default.
31
+ * Works best with `<zn-icon>`.
32
+ * @slot trigger - Optional content to be used as trigger instead of the default content.
33
+ * Opening the file dialog on click and as well as drag and drop will work for this content.
34
+ * Following attributes will no longer work: *label*, *droparea*, *help-text*, *size*,
35
+ * *hide-value*. Also if using the disabled attribute, the disabled styling will not be
36
+ * applied and must be taken care of yourself.
37
+ *
38
+ * @event zn-blur - Emitted when the control loses focus.
39
+ * @event zn-change - Emitted when an alteration to the control's value is committed by the user.
40
+ * @event zn-error - Emitted when multiple files are selected via drag and drop, without
41
+ * the `multiple` property being set.
42
+ * @event zn-focus - Emitted when the control gains focus.
43
+ * @event zn-input - Emitted when the control receives input.
44
+ *
45
+ * @csspart form-control - The form control that wraps the label, input, and help text.
46
+ * @csspart form-control-label - The label's wrapper.
47
+ * @csspart form-control-input - The input's wrapper.
48
+ * @csspart form-control-help-text - The help text's wrapper.
49
+ * @csspart button-wrapper - The wrapper around the button and text value.
50
+ * @csspart button - The zn-button acting as a file input.
51
+ * @csspart button__base - The zn-button's exported `base` part.
52
+ * @csspart value - The chosen files or placeholder text for the file input.
53
+ * @csspart droparea - The element wrapping the drop zone.
54
+ * @csspart droparea-background - The background of the drop zone.
55
+ * @csspart droparea-icon - The container that wraps the icon for the drop zone.
56
+ * @csspart droparea-value - The text for the drop zone.
57
+ * @csspart trigger - The container that wraps the trigger.
58
+ *
59
+ * @animation file.iconDrop - The animation to use for the file icon
60
+ * when a file is dropped
61
+ * @animation file.text.disappear - The disappear animation to use for the file placeholder text
62
+ * when a file is dropped
63
+ * @animation file.text.appear - The appear animation to use for the file placeholder text
64
+ * when a file is dropped
65
+ */
66
+ export default class ZnFile extends ZincElement implements ZincFormControl {
67
+ static styles: CSSResultGroup = unsafeCSS(styles);
68
+
69
+ private readonly formControlController = new FormControlController(this, {
70
+ assumeInteractionOn: ['zn-change'],
71
+ value: (el: ZnFile) => el.files
72
+ })
73
+
74
+ private readonly hasSlotController = new HasSlotController(this, 'help-text', 'label');
75
+
76
+ private readonly localize = new LocalizeController(this);
77
+
78
+ @state() private userIsDragging = false;
79
+
80
+ @query('.input__control') input: HTMLInputElement;
81
+
82
+ @query('.button') button: ZnButton;
83
+
84
+ @query('.droparea') dropareaWrapper: HTMLDivElement;
85
+
86
+ @query('.droparea__icon') dropareaIcon: HTMLSpanElement;
87
+
88
+ @query('.input__value') inputChosen: HTMLSpanElement;
89
+
90
+ /**
91
+ * The selected files as a FileList object containing a list of File objects.
92
+ * The FileList behaves like an array, so you can get the number of selected files
93
+ * via its length property.
94
+ * [see MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#getting_information_on_selected_files)
95
+ *
96
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#getting_information_on_selected_files
97
+ */
98
+ @property({type: Object})
99
+ set files(v: FileList | null) {
100
+ if (this.input) {
101
+ this.input.files = v;
102
+ }
103
+ }
104
+
105
+ get files() {
106
+ return this.input?.files;
107
+ }
108
+
109
+ /** The name of the file control, submitted as a name/value pair with form data. */
110
+ @property({type: String}) name = '';
111
+
112
+ /**
113
+ * The current value of the input, submitted as a name/value pair with form data.
114
+ * Beware that the only valid value when setting a file input is an empty string!
115
+ */
116
+
117
+ /**
118
+ * The value of the file control contains a string that represents the path of the selected file.
119
+ * If multiple files are selected, the value represents the first file in the list.
120
+ * If no file is selected, the value is an empty string.
121
+ * Beware that the only valid value when setting a file control is an empty string!
122
+ * [see MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#value)
123
+ *
124
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#value
125
+ */
126
+ @property({type: String})
127
+ set value(v: string) {
128
+ if (this.input) {
129
+ this.input.value = v;
130
+ }
131
+ }
132
+
133
+ get value() {
134
+ return this.input?.value;
135
+ }
136
+
137
+ /** The default value of the form control. Primarily used for resetting the form control. */
138
+ @defaultValue() defaultValue: string = '';
139
+
140
+ /** The file control's size. */
141
+ @property({reflect: true}) size: 'small' | 'medium' | 'large' = 'medium';
142
+
143
+ /** The file control's label. If you need to display HTML, use the `label` slot instead. */
144
+ @property() label = '';
145
+
146
+ /** If this is set, then the only way to remove files is to click the cross next to them. */
147
+ @property({type: Boolean}) clearable = false;
148
+
149
+ /**
150
+ * The file control's help text.
151
+ * If you need to display HTML, use the `help-text` slot instead.
152
+ */
153
+ @property({attribute: 'help-text'}) helpText = '';
154
+
155
+ /** Disables the file control. */
156
+ @property({reflect: true, type: Boolean}) disabled = false;
157
+
158
+ /** Draw the file control as a drop area */
159
+ @property({type: Boolean}) droparea = false;
160
+
161
+ /**
162
+ * Comma separated list of supported file types
163
+ * [see MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept)
164
+ *
165
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept
166
+ * @example <zn-file accept=".jpg,.jpeg,.png,.gif,text/plain,image/*"></zn-file>
167
+ */
168
+ @property({type: String}) accept = '';
169
+
170
+ /**
171
+ * Specifies the types of files that the server accepts.
172
+ * Can be set either to user or environment.
173
+ * Works only when not using a droparea!
174
+ * [see MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/capture)
175
+ *
176
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/capture
177
+ */
178
+ @property({type: String}) capture: 'user' | 'environment';
179
+
180
+ /**
181
+ * Indicates whether the user can select more than one file.
182
+ * Has no effect if webkitdirectory is set.
183
+ * [see MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#multiple)
184
+ *
185
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#multiple
186
+ */
187
+ @property({reflect: true, type: Boolean}) multiple = false;
188
+
189
+ /**
190
+ * Indicates that the file control should let the user select directories instead of files.
191
+ * When a directory is selected, the directory and its entire hierarchy of contents are included
192
+ * in the set of selected items.
193
+ * Note: This is a non-standard attribute but is supported in the major browsers.
194
+ * [see MDN](https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/webkitdirectory)
195
+ *
196
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/webkitdirectory
197
+ */
198
+ @property({reflect: true, type: Boolean}) webkitdirectory = false;
199
+
200
+ /**
201
+ * By default, form controls are associated with the nearest containing `<form>` element.
202
+ * This attribute allows you to place the form control outside of a form and associate it
203
+ * with the form that has this `id`. The form must be in the same document
204
+ * or shadow root for this to work.
205
+ */
206
+ @property({reflect: true}) form = '';
207
+
208
+ /** Makes the input a required field. */
209
+ @property({reflect: true, type: Boolean}) required = false;
210
+
211
+ /** Suppress the value from being displayed in the file control */
212
+ @property({attribute: 'hide-value', type: Boolean}) hideValue = false;
213
+
214
+ /** Gets the validity state object */
215
+ get validity() {
216
+ return this.input?.validity;
217
+ }
218
+
219
+ /** Gets the validation message */
220
+ get validationMessage() {
221
+ return this.input.validationMessage;
222
+ }
223
+
224
+ /**
225
+ * Checks for validity but does not show a validation message.
226
+ * Returns `true` when valid and `false` when invalid.
227
+ */
228
+ checkValidity() {
229
+ return this.input.checkValidity();
230
+ }
231
+
232
+ /** Gets the associated form, if one exists. */
233
+ getForm(): HTMLFormElement | null {
234
+ return this.formControlController.getForm();
235
+ }
236
+
237
+ /** Checks for validity and shows the browser's validation message if the control is invalid. */
238
+ reportValidity() {
239
+ return this.input.reportValidity();
240
+ }
241
+
242
+ /** Sets a custom validation message. Pass an empty string to restore validity. */
243
+ setCustomValidity(message: string) {
244
+ this.input.setCustomValidity(message);
245
+ this.formControlController.updateValidity();
246
+ }
247
+
248
+ @watch('disabled', {waitUntilFirstUpdate: true})
249
+ handleDisabledChange() {
250
+ // Disabled form controls are always valid
251
+ this.formControlController.setValidity(this.disabled);
252
+ }
253
+
254
+ @watch('value', {waitUntilFirstUpdate: true})
255
+ async handleValueChange() {
256
+ await this.updateComplete;
257
+ this.formControlController.updateValidity();
258
+ }
259
+
260
+ /** Sets focus on the button or droparea. */
261
+ focus(options?: FocusOptions) {
262
+ if (this.droparea) {
263
+ this.dropareaWrapper?.focus(options);
264
+ return;
265
+ }
266
+
267
+ this.button?.focus(options);
268
+ }
269
+
270
+ /** Removes focus from the button or droparea. */
271
+ blur() {
272
+ if (this.droparea) {
273
+ this.dropareaWrapper?.blur();
274
+ return;
275
+ }
276
+
277
+ this.button?.blur();
278
+ }
279
+
280
+ private handleInvalid = (e: Event) => {
281
+ this.formControlController.setValidity(false);
282
+ this.formControlController.emitInvalidEvent(e);
283
+ }
284
+
285
+ private handleFiles(files: FileList | null) {
286
+ if (!files) {
287
+ this.value = '';
288
+ return;
289
+ }
290
+
291
+ this.files = files;
292
+ }
293
+
294
+ private async handleTransferItems(items: DataTransferItemList | null): Promise<FileList> {
295
+ if (!items) {
296
+ this.value = '';
297
+ return new Promise((_resolve, reject) => {
298
+ reject(new Error('No proper items found'))
299
+ })
300
+ }
301
+
302
+ const entries = Array.from(items).map(item => item.webkitGetAsEntry());
303
+
304
+ const filesPromise = entries.map(entry => this.getFilesFromEntry(entry));
305
+ const filesArray = await Promise.all(filesPromise);
306
+ const files = filesArray.flat();
307
+
308
+ const dataTransfer = new DataTransfer();
309
+ Array.from(files).forEach(f => dataTransfer.items.add(f));
310
+ return dataTransfer.files;
311
+ }
312
+
313
+ private async getFilesFromEntry(entry: FileSystemEntry | null): Promise<File[]> {
314
+ if (!entry) {
315
+ return [];
316
+ }
317
+
318
+ if (entry.isFile) {
319
+ return new Promise<File[]>((resolve, reject) => {
320
+ (entry as FileSystemFileEntry).file(file => resolve([file]), reject);
321
+ });
322
+ } else if (entry.isDirectory) {
323
+ return new Promise<File[]>((resolve, reject) => {
324
+ const dirReader = (entry as FileSystemDirectoryEntry).createReader();
325
+ dirReader.readEntries(entries => {
326
+ Promise.all(entries.map(e => this.getFilesFromEntry(e)))
327
+ .then(files => {
328
+ resolve(files.flat())
329
+ }).catch(reject);
330
+ });
331
+ });
332
+ }
333
+ return [];
334
+ }
335
+
336
+ private handleClick(e: Event) {
337
+ e.preventDefault();
338
+ this.input.click();
339
+ }
340
+
341
+ /** Handles the change event of the native input */
342
+ private handleChange(e: Event) {
343
+ e.preventDefault();
344
+ e.stopPropagation();
345
+
346
+ this.emit('zn-input');
347
+ this.emit('zn-change');
348
+ }
349
+
350
+ private handleDragOver = (e: DragEvent) => {
351
+ e.preventDefault();
352
+ e.stopPropagation();
353
+ this.userIsDragging = true;
354
+ }
355
+
356
+ private handleDragLeave = (e: DragEvent) => {
357
+ e.preventDefault();
358
+ e.stopPropagation();
359
+ this.userIsDragging = false;
360
+ }
361
+
362
+ private handleDrop = async (e: DragEvent) => {
363
+ e.preventDefault();
364
+ e.stopPropagation();
365
+
366
+
367
+ if (!e.dataTransfer) {
368
+ return;
369
+ }
370
+
371
+ const files = await this.handleTransferItems(e.dataTransfer.items);
372
+ this.userIsDragging = false;
373
+
374
+ if (!files) {
375
+ return;
376
+ }
377
+
378
+ // webkitdirectory also allows multiple files
379
+ if (!this.multiple && !this.webkitdirectory && files.length > 1) {
380
+ this.emit('zn-error');
381
+ return;
382
+ }
383
+
384
+ // Use the transferred file list from the drag drop interface
385
+ const hasTrigger = this.hasSlotController.test('trigger');
386
+ if (!hasTrigger) {
387
+ const disappearAnimation = getAnimation(this.inputChosen, 'file.text.disappear', {dir: this.localize.dir()});
388
+ const appearAnimation = getAnimation(this.inputChosen, 'file.text.appear', {dir: this.localize.dir()});
389
+
390
+ if (this.droparea) {
391
+ const dropIconAnimation = getAnimation(this.dropareaIcon, 'file.iconDrop', {dir: this.localize.dir()});
392
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
393
+ animateTo(this.dropareaIcon, dropIconAnimation.keyframes, dropIconAnimation.options);
394
+ }
395
+ // eslint-disable-next-line max-len
396
+ await animateTo(this.inputChosen, disappearAnimation.keyframes, disappearAnimation.options);
397
+ this.handleFiles(files);
398
+ await animateTo(this.inputChosen, appearAnimation.keyframes, appearAnimation.options);
399
+ } else {
400
+ this.handleFiles(files);
401
+ }
402
+
403
+ this.input.dispatchEvent(new Event('change'));
404
+ }
405
+
406
+ /**
407
+ * Handle the focus of the droparea and emit focus event
408
+ */
409
+ private handleFocus() {
410
+ this.emit('zn-focus');
411
+ }
412
+
413
+ /**
414
+ * Handle the blur of the droparea and emit blur event
415
+ */
416
+ private handleBlur() {
417
+ this.emit('zn-blur');
418
+ }
419
+
420
+ /**
421
+ * Remove a file from the list of files
422
+ */
423
+ private removeFile = (e: Event) => {
424
+ e.preventDefault();
425
+ e.stopPropagation();
426
+
427
+ const files = Array.from(this.files || []);
428
+ const file = (e.target as ZnButton).parentElement?.getAttribute('data-file-name');
429
+
430
+ const index = files.findIndex(f => f.name === file);
431
+
432
+ if (index !== -1) {
433
+ files.splice(index, 1);
434
+ }
435
+
436
+ const dataTransfer = new DataTransfer();
437
+ files.forEach(f => dataTransfer.items.add(f));
438
+ this.files = dataTransfer.files;
439
+ this.input.dispatchEvent(new Event('change'));
440
+ }
441
+
442
+ private renderFileValueWithDelete(): HTMLTemplateResult {
443
+ // files as an array
444
+ const files = Array.from(this.files || []);
445
+ const isClearable = this.clearable;
446
+
447
+ // @ts-expect-error variadic
448
+ const fileChosenLabel = this.localize.term('numFilesSelected', 0, this.webkitdirectory);
449
+ return html`
450
+ ${files ? html`
451
+ <div class="file_wrapper">
452
+ ${repeat(files, (file: File) => html`
453
+ <zn-chip
454
+ class=${classMap({
455
+ 'input__value': true,
456
+ 'input__value--hidden': this.hideValue,
457
+ })}
458
+ data-file-name="${file.name}"
459
+ part="value">
460
+ ${file.name}
461
+ ${isClearable ? html`
462
+ <zn-button
463
+ slot="action"
464
+ class="input__delete"
465
+ color="transparent"
466
+ icon="close"
467
+ size="content"
468
+ icon-size="18"
469
+ @click="${this.removeFile}"
470
+ part="delete"></zn-button>` : ''}
471
+ </zn-chip>
472
+ `)}
473
+ </div>` : html`${fileChosenLabel}`}`;
474
+ }
475
+
476
+ private renderDroparea(): HTMLTemplateResult {
477
+ return html`
478
+ <div
479
+ class="droparea"
480
+ @click="${this.handleClick}"
481
+ @keypress="${this.handleClick}"
482
+ @focus="${this.handleFocus}"
483
+ @blur="${this.handleBlur}"
484
+ tabindex="${this.disabled ? '-1' : '0'}"
485
+ part="droparea">
486
+ <div
487
+ class="droparea__background"
488
+ part="droparea-background">
489
+ <span part="droparea-icon" class="droparea__icon">
490
+ <slot name="droparea-icon">
491
+ <zn-icon src="upload_file"></zn-icon>
492
+ </slot>
493
+ </span>
494
+ <p class="droparea__text"
495
+ part="droparea-value">
496
+ <strong>${this.localize.term(this.webkitdirectory ? 'folderDragDrop' : 'fileDragDrop')}</strong>
497
+ ${this.renderFileValueWithDelete()}
498
+ </p>
499
+ </div>
500
+ </div>
501
+ `;
502
+ }
503
+
504
+ private renderButton(): HTMLTemplateResult {
505
+ let buttonText = this.localize.term('fileButtonText');
506
+ if (this.multiple) {
507
+ buttonText = this.localize.term('fileButtonTextMultiple');
508
+ }
509
+ if (this.webkitdirectory) {
510
+ buttonText = this.localize.term('folderButtonText');
511
+ }
512
+
513
+ return html`
514
+ <div
515
+ class="button__wrapper"
516
+ part="button-wrapper">
517
+ <zn-button
518
+ class="button"
519
+ @click="${this.handleClick}"
520
+ ?disabled=${this.disabled}
521
+ exportparts="base:button__base"
522
+ part="button"
523
+ size="small"
524
+ outline>
525
+ ${buttonText}
526
+ </zn-button>
527
+ ${this.renderFileValueWithDelete()}
528
+ </div>`;
529
+ }
530
+
531
+ render() {
532
+ const hasLabel = this.label || this.hasSlotController.test('label');
533
+ const hasHelpText = this.helpText || this.hasSlotController.test('help-text');
534
+ const hasTrigger = this.hasSlotController.test('trigger');
535
+
536
+
537
+ return html`
538
+ <div
539
+ class="${classMap({
540
+ 'form-control': true,
541
+ 'form-control--droparea': this.droparea,
542
+ 'form-control--has-help-text': hasHelpText,
543
+ 'form-control--has-label': hasLabel,
544
+ 'form-control--large': this.size === 'large',
545
+ 'form-control--medium': this.size === 'medium',
546
+ 'form-control--small': this.size === 'small',
547
+ 'form-control--user-dragging': this.userIsDragging,
548
+ })}"
549
+ @dragenter="${this.handleDragOver}"
550
+ @dragleave="${this.handleDragLeave}"
551
+ @dragover="${this.handleDragOver}"
552
+ @drop="${this.handleDrop}"
553
+ part="form-control">
554
+ ${hasTrigger ?
555
+ html`
556
+ <slot name="trigger" part="trigger" @click="${this.handleClick}" @keypress="${this.handleClick}"></slot>` :
557
+ html`
558
+ <label
559
+ aria-hidden="${hasLabel ? 'false' : 'true'}"
560
+ class="form-control__label"
561
+ for="input"
562
+ part="form-control-label">
563
+ <slot name="label">${this.label}</slot>
564
+ </label>
565
+
566
+ <div class="form-control-input" part="form-control-input">
567
+ ${this.droparea ? this.renderDroparea() : this.renderButton()}
568
+ </div>
569
+
570
+ <div
571
+ aria-hidden="${hasHelpText ? 'false' : 'true'}"
572
+ class="form-control__help-text"
573
+ id="help-text"
574
+ part="form-control-help-text">
575
+ <slot name="help-text">${this.helpText}</slot>
576
+ </div>
577
+ `}
578
+ <input
579
+ accept=${this.accept}
580
+ aria-describedby="help-text"
581
+ @change=${this.handleChange}
582
+ class="input__control"
583
+ ?disabled=${this.disabled}
584
+ id="input"
585
+ @invalid=${this.handleInvalid}
586
+ ?multiple=${this.multiple}
587
+ name=${ifDefined(this.name)}
588
+ ?required=${this.required}
589
+ type="file"
590
+ tabindex="-1"
591
+ ?webkitdirectory=${this.webkitdirectory}>
592
+ </div>`;
593
+ }
594
+ }
595
+
596
+ setDefaultAnimation('file.iconDrop', {
597
+ keyframes: [
598
+ {scale: 1},
599
+ {scale: 0.7},
600
+ {scale: 1},
601
+ ],
602
+ options: {duration: 600, easing: 'ease-out'},
603
+ });
604
+
605
+ setDefaultAnimation('file.text.disappear', {
606
+ keyframes: [
607
+ {opacity: 1},
608
+ {opacity: 0, transform: 'translateY(-40%)'},
609
+ ],
610
+ options: {duration: 300, easing: 'cubic-bezier(0.45, 1.45, 0.8, 1)'},
611
+ });
612
+
613
+ setDefaultAnimation('file.text.appear', {
614
+ keyframes: [
615
+ {opacity: 0, transform: 'translateY(40%)'},
616
+ {opacity: 1},
617
+ ],
618
+ options: {duration: 300, easing: 'cubic-bezier(0.45, 1.45, 0.8, 1)'},
619
+ });