@lenne.tech/ng-base 18.1.3 → 22.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 (416) hide show
  1. package/CLAUDE.md +55 -0
  2. package/LICENSE +2 -2
  3. package/README.md +237 -44
  4. package/fesm2022/lenne.tech-ng-base-ai.mjs +767 -0
  5. package/fesm2022/lenne.tech-ng-base-ai.mjs.map +1 -0
  6. package/fesm2022/lenne.tech-ng-base-auth-provide.mjs +939 -0
  7. package/fesm2022/lenne.tech-ng-base-auth-provide.mjs.map +1 -0
  8. package/fesm2022/lenne.tech-ng-base-auth.mjs +454 -0
  9. package/fesm2022/lenne.tech-ng-base-auth.mjs.map +1 -0
  10. package/fesm2022/lenne.tech-ng-base-bug-bug-report-dialog-BRzVmKJr.mjs +825 -0
  11. package/fesm2022/lenne.tech-ng-base-bug-bug-report-dialog-BRzVmKJr.mjs.map +1 -0
  12. package/fesm2022/lenne.tech-ng-base-bug-bug-report-service-DWoTb_iw.mjs +351 -0
  13. package/fesm2022/lenne.tech-ng-base-bug-bug-report-service-DWoTb_iw.mjs.map +1 -0
  14. package/fesm2022/lenne.tech-ng-base-bug-capture-engine-TkjMDdqj.mjs +1046 -0
  15. package/fesm2022/lenne.tech-ng-base-bug-capture-engine-TkjMDdqj.mjs.map +1 -0
  16. package/fesm2022/lenne.tech-ng-base-bug-constants-Brm2KGHi.mjs +4 -0
  17. package/fesm2022/lenne.tech-ng-base-bug-constants-Brm2KGHi.mjs.map +1 -0
  18. package/fesm2022/lenne.tech-ng-base-bug-messages-BsP4fRQU.mjs +179 -0
  19. package/fesm2022/lenne.tech-ng-base-bug-messages-BsP4fRQU.mjs.map +1 -0
  20. package/fesm2022/lenne.tech-ng-base-bug-provide.mjs +26 -0
  21. package/fesm2022/lenne.tech-ng-base-bug-provide.mjs.map +1 -0
  22. package/fesm2022/lenne.tech-ng-base-bug-report-Tzlhe1Cm.mjs +62 -0
  23. package/fesm2022/lenne.tech-ng-base-bug-report-Tzlhe1Cm.mjs.map +1 -0
  24. package/fesm2022/lenne.tech-ng-base-bug-server.mjs +818 -0
  25. package/fesm2022/lenne.tech-ng-base-bug-server.mjs.map +1 -0
  26. package/fesm2022/lenne.tech-ng-base-bug.mjs +196 -0
  27. package/fesm2022/lenne.tech-ng-base-bug.mjs.map +1 -0
  28. package/fesm2022/lenne.tech-ng-base-files-ui.mjs +445 -0
  29. package/fesm2022/lenne.tech-ng-base-files-ui.mjs.map +1 -0
  30. package/fesm2022/lenne.tech-ng-base-files.mjs +474 -0
  31. package/fesm2022/lenne.tech-ng-base-files.mjs.map +1 -0
  32. package/fesm2022/lenne.tech-ng-base-server.mjs +408 -0
  33. package/fesm2022/lenne.tech-ng-base-server.mjs.map +1 -0
  34. package/fesm2022/lenne.tech-ng-base-share.mjs +76 -0
  35. package/fesm2022/lenne.tech-ng-base-share.mjs.map +1 -0
  36. package/fesm2022/lenne.tech-ng-base-sync.mjs +1096 -0
  37. package/fesm2022/lenne.tech-ng-base-sync.mjs.map +1 -0
  38. package/fesm2022/lenne.tech-ng-base-testing.mjs +171 -0
  39. package/fesm2022/lenne.tech-ng-base-testing.mjs.map +1 -0
  40. package/fesm2022/lenne.tech-ng-base-ui-provide.mjs +124 -0
  41. package/fesm2022/lenne.tech-ng-base-ui-provide.mjs.map +1 -0
  42. package/fesm2022/lenne.tech-ng-base-ui.mjs +34611 -0
  43. package/fesm2022/lenne.tech-ng-base-ui.mjs.map +1 -0
  44. package/fesm2022/lenne.tech-ng-base-utils.mjs +287 -0
  45. package/fesm2022/lenne.tech-ng-base-utils.mjs.map +1 -0
  46. package/fesm2022/lenne.tech-ng-base.mjs +615 -910
  47. package/fesm2022/lenne.tech-ng-base.mjs.map +1 -1
  48. package/i18n/auth/de.json +17 -0
  49. package/i18n/auth/en.json +17 -0
  50. package/i18n/bug/de.json +85 -0
  51. package/i18n/bug/en.json +85 -0
  52. package/i18n/de.json +8 -0
  53. package/i18n/en.json +8 -0
  54. package/i18n/files/de.json +27 -0
  55. package/i18n/files/en.json +27 -0
  56. package/i18n/share/de.json +8 -0
  57. package/i18n/share/en.json +8 -0
  58. package/i18n/ui/de.json +38 -0
  59. package/i18n/ui/en.json +38 -0
  60. package/package.json +127 -58
  61. package/types/lenne.tech-ng-base-ai.d.ts +830 -0
  62. package/types/lenne.tech-ng-base-auth-provide.d.ts +603 -0
  63. package/types/lenne.tech-ng-base-auth.d.ts +320 -0
  64. package/types/lenne.tech-ng-base-bug-provide.d.ts +272 -0
  65. package/types/lenne.tech-ng-base-bug-rolldown-runtime-C25Le4-w.d.ts +1 -0
  66. package/types/lenne.tech-ng-base-bug-server.d.ts +316 -0
  67. package/types/lenne.tech-ng-base-bug.d.ts +202 -0
  68. package/types/lenne.tech-ng-base-files-ui.d.ts +116 -0
  69. package/types/lenne.tech-ng-base-files.d.ts +288 -0
  70. package/types/lenne.tech-ng-base-server.d.ts +262 -0
  71. package/types/lenne.tech-ng-base-share.d.ts +21 -0
  72. package/types/lenne.tech-ng-base-sync.d.ts +380 -0
  73. package/types/lenne.tech-ng-base-testing.d.ts +327 -0
  74. package/types/lenne.tech-ng-base-ui-provide.d.ts +65 -0
  75. package/types/lenne.tech-ng-base-ui.d.ts +7732 -0
  76. package/types/lenne.tech-ng-base-utils.d.ts +150 -0
  77. package/types/lenne.tech-ng-base.d.ts +503 -0
  78. package/ui/styles/components/accordion.css +3 -0
  79. package/ui/styles/components/alert-dialog.css +4 -0
  80. package/ui/styles/components/alert.css +3 -0
  81. package/ui/styles/components/aspect-ratio.css +3 -0
  82. package/ui/styles/components/attachment.css +4 -0
  83. package/ui/styles/components/autocomplete.css +4 -0
  84. package/ui/styles/components/avatar.css +3 -0
  85. package/ui/styles/components/badge.css +3 -0
  86. package/ui/styles/components/breadcrumb.css +3 -0
  87. package/ui/styles/components/bubble.css +3 -0
  88. package/ui/styles/components/button-group.css +3 -0
  89. package/ui/styles/components/button.css +3 -0
  90. package/ui/styles/components/calendar.css +5 -0
  91. package/ui/styles/components/card.css +3 -0
  92. package/ui/styles/components/checkbox.css +3 -0
  93. package/ui/styles/components/code-block.css +4 -0
  94. package/ui/styles/components/collapsible.css +3 -0
  95. package/ui/styles/components/combobox.css +5 -0
  96. package/ui/styles/components/command.css +5 -0
  97. package/ui/styles/components/context-menu.css +3 -0
  98. package/ui/styles/components/date-picker.css +7 -0
  99. package/ui/styles/components/dialog.css +4 -0
  100. package/ui/styles/components/drawer.css +3 -0
  101. package/ui/styles/components/dropdown-menu.css +3 -0
  102. package/ui/styles/components/empty.css +3 -0
  103. package/ui/styles/components/field.css +5 -0
  104. package/ui/styles/components/hover-card.css +3 -0
  105. package/ui/styles/components/index.css +91 -0
  106. package/ui/styles/components/input-group.css +6 -0
  107. package/ui/styles/components/input-otp.css +3 -0
  108. package/ui/styles/components/input.css +3 -0
  109. package/ui/styles/components/item.css +4 -0
  110. package/ui/styles/components/kbd.css +3 -0
  111. package/ui/styles/components/label.css +3 -0
  112. package/ui/styles/components/lt-breadcrumb.css +3 -0
  113. package/ui/styles/components/lt-bug-attachments.css +5 -0
  114. package/ui/styles/components/lt-bug-journey-timeline.css +5 -0
  115. package/ui/styles/components/lt-bug-report-dialog.css +15 -0
  116. package/ui/styles/components/lt-bug-report.css +4 -0
  117. package/ui/styles/components/lt-color-mode-button.css +3 -0
  118. package/ui/styles/components/lt-confirm-dialog.css +4 -0
  119. package/ui/styles/components/lt-data-view.css +5 -0
  120. package/ui/styles/components/lt-date-picker.css +3 -0
  121. package/ui/styles/components/lt-date-time-picker.css +5 -0
  122. package/ui/styles/components/lt-enter-action.css +2 -0
  123. package/ui/styles/components/lt-footer.css +3 -0
  124. package/ui/styles/components/lt-form-field.css +4 -0
  125. package/ui/styles/components/lt-header.css +5 -0
  126. package/ui/styles/components/lt-imports.css +21 -0
  127. package/ui/styles/components/lt-navigation-menu.css +3 -0
  128. package/ui/styles/components/lt-notice.css +3 -0
  129. package/ui/styles/components/lt-overlay-defaults.css +3 -0
  130. package/ui/styles/components/lt-page-card.css +3 -0
  131. package/ui/styles/components/lt-page-title.css +2 -0
  132. package/ui/styles/components/lt-password-input.css +4 -0
  133. package/ui/styles/components/lt-readonly-field.css +2 -0
  134. package/ui/styles/components/lt-select.css +4 -0
  135. package/ui/styles/components/lt-text-field.css +5 -0
  136. package/ui/styles/components/lt-toolbar-item.css +2 -0
  137. package/ui/styles/components/lt-toolbar.css +3 -0
  138. package/ui/styles/components/lt-tus-upload-component.css +5 -0
  139. package/ui/styles/components/marker.css +3 -0
  140. package/ui/styles/components/menubar.css +3 -0
  141. package/ui/styles/components/message-scroller.css +4 -0
  142. package/ui/styles/components/message.css +3 -0
  143. package/ui/styles/components/native-select.css +3 -0
  144. package/ui/styles/components/navigation-menu.css +3 -0
  145. package/ui/styles/components/pagination.css +4 -0
  146. package/ui/styles/components/popover.css +3 -0
  147. package/ui/styles/components/progress.css +3 -0
  148. package/ui/styles/components/questionnaire.css +4 -0
  149. package/ui/styles/components/radio-group.css +3 -0
  150. package/ui/styles/components/resizable.css +3 -0
  151. package/ui/styles/components/select.css +3 -0
  152. package/ui/styles/components/separator.css +3 -0
  153. package/ui/styles/components/sheet.css +4 -0
  154. package/ui/styles/components/sidebar.css +9 -0
  155. package/ui/styles/components/skeleton.css +3 -0
  156. package/ui/styles/components/slider.css +3 -0
  157. package/ui/styles/components/sonner.css +4 -0
  158. package/ui/styles/components/spinner.css +3 -0
  159. package/ui/styles/components/switch.css +3 -0
  160. package/ui/styles/components/table.css +3 -0
  161. package/ui/styles/components/tabs.css +4 -0
  162. package/ui/styles/components/textarea.css +3 -0
  163. package/ui/styles/components/toggle-group.css +4 -0
  164. package/ui/styles/components/toggle.css +3 -0
  165. package/ui/styles/components/tooltip.css +3 -0
  166. package/ui/styles/components/trace.css +3 -0
  167. package/ui/styles/components/typography.css +3 -0
  168. package/ui/styles/components/utils.css +2 -0
  169. package/ui/styles/core.css +137 -0
  170. package/ui/styles/palette.css +94 -0
  171. package/ui/styles/theme.css +14 -0
  172. package/ui/styles/transitions.css +131 -0
  173. package/base-cms/index.d.ts +0 -5
  174. package/base-cms/interfaces/base-cms-module-config.interface.d.ts +0 -16
  175. package/base-cms/pages/base-cms/base-cms.component.d.ts +0 -92
  176. package/base-cms/public-api.d.ts +0 -5
  177. package/base-components/components/breadcrumb/breadcrumb.component.d.ts +0 -10
  178. package/base-components/components/change-password/change-password.component.d.ts +0 -24
  179. package/base-components/components/checkbox/checkbox.component.d.ts +0 -12
  180. package/base-components/components/delete-account/delete-account.component.d.ts +0 -15
  181. package/base-components/components/fab-button/fab-button.component.d.ts +0 -16
  182. package/base-components/components/input/input.component.d.ts +0 -27
  183. package/base-components/components/loading-bar/loading-bar.component.d.ts +0 -17
  184. package/base-components/components/model-form/model-form-base.component.d.ts +0 -64
  185. package/base-components/components/model-form/model-form.component.d.ts +0 -139
  186. package/base-components/components/model-form-sub/model-form-sub.component.d.ts +0 -56
  187. package/base-components/components/model-table/model-table.component.d.ts +0 -115
  188. package/base-components/components/refence-input/refence-input.component.d.ts +0 -84
  189. package/base-components/components/select/select.component.d.ts +0 -25
  190. package/base-components/components/skeleton-loader/skeleton-loader.component.d.ts +0 -10
  191. package/base-components/components/tags/tags.component.d.ts +0 -60
  192. package/base-components/components/textarea/textarea.component.d.ts +0 -21
  193. package/base-components/components/toast/toast.component.d.ts +0 -19
  194. package/base-components/components/upload-image/upload-image.component.d.ts +0 -111
  195. package/base-components/directives/back-button.directive.d.ts +0 -9
  196. package/base-components/directives/context-menu.directive.d.ts +0 -22
  197. package/base-components/directives/sort.directive.d.ts +0 -15
  198. package/base-components/directives/stop-propagation.directive.d.ts +0 -10
  199. package/base-components/index.d.ts +0 -5
  200. package/base-components/pipes/ellipses.pipe.d.ts +0 -10
  201. package/base-components/public-api.d.ts +0 -26
  202. package/base-prototype/index.d.ts +0 -5
  203. package/base-prototype/pages/email-verification/email-verification.component.d.ts +0 -18
  204. package/base-prototype/pages/forgot-password/forgot-password.component.d.ts +0 -26
  205. package/base-prototype/pages/login/login.component.d.ts +0 -33
  206. package/base-prototype/pages/profile/profile.component.d.ts +0 -24
  207. package/base-prototype/pages/register/register.component.d.ts +0 -31
  208. package/base-prototype/pages/set-password/set-password.component.d.ts +0 -29
  209. package/base-prototype/public-api.d.ts +0 -9
  210. package/esm2022/base-cms/interfaces/base-cms-module-config.interface.mjs +0 -3
  211. package/esm2022/base-cms/lenne.tech-ng-base-base-cms.mjs +0 -5
  212. package/esm2022/base-cms/pages/base-cms/base-cms.component.mjs +0 -238
  213. package/esm2022/base-cms/public-api.mjs +0 -8
  214. package/esm2022/base-components/components/breadcrumb/breadcrumb.component.mjs +0 -23
  215. package/esm2022/base-components/components/change-password/change-password.component.mjs +0 -97
  216. package/esm2022/base-components/components/checkbox/checkbox.component.mjs +0 -38
  217. package/esm2022/base-components/components/delete-account/delete-account.component.mjs +0 -59
  218. package/esm2022/base-components/components/fab-button/fab-button.component.mjs +0 -24
  219. package/esm2022/base-components/components/input/input.component.mjs +0 -75
  220. package/esm2022/base-components/components/loading-bar/loading-bar.component.mjs +0 -37
  221. package/esm2022/base-components/components/model-form/model-form-base.component.mjs +0 -145
  222. package/esm2022/base-components/components/model-form/model-form.component.mjs +0 -591
  223. package/esm2022/base-components/components/model-form-sub/model-form-sub.component.mjs +0 -117
  224. package/esm2022/base-components/components/model-table/model-table.component.mjs +0 -478
  225. package/esm2022/base-components/components/refence-input/refence-input.component.mjs +0 -278
  226. package/esm2022/base-components/components/select/select.component.mjs +0 -62
  227. package/esm2022/base-components/components/skeleton-loader/skeleton-loader.component.mjs +0 -33
  228. package/esm2022/base-components/components/tags/tags.component.mjs +0 -227
  229. package/esm2022/base-components/components/textarea/textarea.component.mjs +0 -79
  230. package/esm2022/base-components/components/toast/toast.component.mjs +0 -69
  231. package/esm2022/base-components/components/upload-image/upload-image.component.mjs +0 -346
  232. package/esm2022/base-components/directives/back-button.directive.mjs +0 -25
  233. package/esm2022/base-components/directives/context-menu.directive.mjs +0 -112
  234. package/esm2022/base-components/directives/sort.directive.mjs +0 -61
  235. package/esm2022/base-components/directives/stop-propagation.directive.mjs +0 -24
  236. package/esm2022/base-components/lenne.tech-ng-base-base-components.mjs +0 -5
  237. package/esm2022/base-components/pipes/ellipses.pipe.mjs +0 -23
  238. package/esm2022/base-components/public-api.mjs +0 -30
  239. package/esm2022/base-prototype/lenne.tech-ng-base-base-prototype.mjs +0 -5
  240. package/esm2022/base-prototype/pages/email-verification/email-verification.component.mjs +0 -60
  241. package/esm2022/base-prototype/pages/forgot-password/forgot-password.component.mjs +0 -78
  242. package/esm2022/base-prototype/pages/login/login.component.mjs +0 -114
  243. package/esm2022/base-prototype/pages/profile/profile.component.mjs +0 -87
  244. package/esm2022/base-prototype/pages/register/register.component.mjs +0 -100
  245. package/esm2022/base-prototype/pages/set-password/set-password.component.mjs +0 -91
  246. package/esm2022/base-prototype/public-api.mjs +0 -11
  247. package/esm2022/lenne.tech-ng-base.mjs +0 -5
  248. package/esm2022/public-api.mjs +0 -25
  249. package/esm2022/shared/classes/auth.class.mjs +0 -14
  250. package/esm2022/shared/classes/basic-user.class.mjs +0 -49
  251. package/esm2022/shared/classes/graphql-enum.class.mjs +0 -10
  252. package/esm2022/shared/classes/graphql-meta.class.mjs +0 -345
  253. package/esm2022/shared/classes/graphql-type.class.mjs +0 -14
  254. package/esm2022/shared/classes/helper.class.mjs +0 -307
  255. package/esm2022/shared/classes/sort.class.mjs +0 -38
  256. package/esm2022/shared/classes/standard.class.mjs +0 -40
  257. package/esm2022/shared/decorators/debounce.decorator.mjs +0 -12
  258. package/esm2022/shared/enums/comparison-operator.enum.mjs +0 -16
  259. package/esm2022/shared/enums/graphql-request-type.enum.mjs +0 -10
  260. package/esm2022/shared/enums/logical-operator.enum.mjs +0 -10
  261. package/esm2022/shared/enums/skeleton-type.enum.mjs +0 -7
  262. package/esm2022/shared/enums/sort-order.enum.mjs +0 -6
  263. package/esm2022/shared/enums/toast-type.enum.mjs +0 -8
  264. package/esm2022/shared/functions/ws-client.function.mjs +0 -39
  265. package/esm2022/shared/interfaces/base-module-config.interface.mjs +0 -3
  266. package/esm2022/shared/interfaces/breadcrumb.interface.mjs +0 -2
  267. package/esm2022/shared/interfaces/can-component-deactivate.interface.mjs +0 -2
  268. package/esm2022/shared/interfaces/cms-enum-values.interface.mjs +0 -2
  269. package/esm2022/shared/interfaces/cms-field-config.interface.mjs +0 -2
  270. package/esm2022/shared/interfaces/cms-model-config.interface.mjs +0 -2
  271. package/esm2022/shared/interfaces/cms-table-field.interface.mjs +0 -2
  272. package/esm2022/shared/interfaces/combined-filter-input.interface.mjs +0 -2
  273. package/esm2022/shared/interfaces/compress-options.interface.mjs +0 -2
  274. package/esm2022/shared/interfaces/cropping-options.interface.mjs +0 -2
  275. package/esm2022/shared/interfaces/field-object.interface.mjs +0 -2
  276. package/esm2022/shared/interfaces/field.interface.mjs +0 -2
  277. package/esm2022/shared/interfaces/filter-input.interface.mjs +0 -2
  278. package/esm2022/shared/interfaces/find-args.interface.mjs +0 -2
  279. package/esm2022/shared/interfaces/graphql-crud-type.interface.mjs +0 -2
  280. package/esm2022/shared/interfaces/graphql-fields-object.interface.mjs +0 -2
  281. package/esm2022/shared/interfaces/graphql-options.interface.mjs +0 -2
  282. package/esm2022/shared/interfaces/graphql-plus-options.interfacen.mjs +0 -2
  283. package/esm2022/shared/interfaces/graphql-type-collection.interface.mjs +0 -2
  284. package/esm2022/shared/interfaces/login-config.interface.mjs +0 -2
  285. package/esm2022/shared/interfaces/register-config.interface.mjs +0 -2
  286. package/esm2022/shared/interfaces/single-filter-input.interface.mjs +0 -2
  287. package/esm2022/shared/interfaces/sort-input.interface.mjs +0 -2
  288. package/esm2022/shared/interfaces/time-components.interface.mjs +0 -2
  289. package/esm2022/shared/interfaces/toast.interface.mjs +0 -2
  290. package/esm2022/shared/lenne.tech-ng-base-shared.mjs +0 -5
  291. package/esm2022/shared/public-api.mjs +0 -74
  292. package/esm2022/shared/services/auth.service.mjs +0 -152
  293. package/esm2022/shared/services/breadcrumb.service.mjs +0 -69
  294. package/esm2022/shared/services/cms.service.mjs +0 -82
  295. package/esm2022/shared/services/file.service.mjs +0 -86
  296. package/esm2022/shared/services/forms.service.mjs +0 -61
  297. package/esm2022/shared/services/graphql-meta.service.mjs +0 -132
  298. package/esm2022/shared/services/graphql-plus.service.mjs +0 -93
  299. package/esm2022/shared/services/graphql.service.mjs +0 -510
  300. package/esm2022/shared/services/image.service.mjs +0 -102
  301. package/esm2022/shared/services/loader.service.mjs +0 -78
  302. package/esm2022/shared/services/navigation.service.mjs +0 -38
  303. package/esm2022/shared/services/scroll.service.mjs +0 -207
  304. package/esm2022/shared/services/storage.service.mjs +0 -149
  305. package/esm2022/shared/services/toast.service.mjs +0 -39
  306. package/esm2022/shared/services/user.service.mjs +0 -160
  307. package/esm2022/shared/services/ws.service.mjs +0 -17
  308. package/esm2022/shared/types/graphql-fields.type.mjs +0 -2
  309. package/esm2022/shared/types/storage.type.mjs +0 -2
  310. package/esm2022/shared/validators/email.validator.mjs +0 -7
  311. package/esm2022/shared/validators/match.validator.mjs +0 -22
  312. package/esm2022/shared/validators/secure-password.validator.mjs +0 -7
  313. package/esm2022/src/base.module.mjs +0 -64
  314. package/esm2022/src/decorators/auto-unsubscribe.decorator.mjs +0 -23
  315. package/esm2022/src/directives/lazy-load.directive.mjs +0 -48
  316. package/esm2022/src/directives/match-height.directive.mjs +0 -92
  317. package/esm2022/src/directives/resizable.directive.mjs +0 -92
  318. package/esm2022/src/factories/apollo-options.factory.mjs +0 -108
  319. package/esm2022/src/functions/extract-files.function.mjs +0 -87
  320. package/esm2022/src/guards/auth.guard.mjs +0 -91
  321. package/esm2022/src/guards/can-deactivate.guard.mjs +0 -16
  322. package/esm2022/src/guards/logout.guard.mjs +0 -34
  323. package/esm2022/src/pipes/date-ago.pipe.mjs +0 -64
  324. package/esm2022/src/pipes/safe-html.pipe.mjs +0 -22
  325. package/esm2022/src/services/fullscreen.service.mjs +0 -51
  326. package/esm2022/src/services/seo.service.mjs +0 -117
  327. package/esm2022/src/services/theme.service.mjs +0 -44
  328. package/fesm2022/lenne.tech-ng-base-base-cms.mjs +0 -251
  329. package/fesm2022/lenne.tech-ng-base-base-cms.mjs.map +0 -1
  330. package/fesm2022/lenne.tech-ng-base-base-components.mjs +0 -2917
  331. package/fesm2022/lenne.tech-ng-base-base-components.mjs.map +0 -1
  332. package/fesm2022/lenne.tech-ng-base-base-prototype.mjs +0 -505
  333. package/fesm2022/lenne.tech-ng-base-base-prototype.mjs.map +0 -1
  334. package/fesm2022/lenne.tech-ng-base-shared.mjs +0 -2863
  335. package/fesm2022/lenne.tech-ng-base-shared.mjs.map +0 -1
  336. package/index.d.ts +0 -5
  337. package/public-api.d.ts +0 -17
  338. package/shared/classes/auth.class.d.ts +0 -10
  339. package/shared/classes/basic-user.class.d.ts +0 -27
  340. package/shared/classes/graphql-enum.class.d.ts +0 -7
  341. package/shared/classes/graphql-meta.class.d.ts +0 -66
  342. package/shared/classes/graphql-type.class.d.ts +0 -13
  343. package/shared/classes/helper.class.d.ts +0 -99
  344. package/shared/classes/sort.class.d.ts +0 -12
  345. package/shared/classes/standard.class.d.ts +0 -32
  346. package/shared/decorators/debounce.decorator.d.ts +0 -1
  347. package/shared/enums/comparison-operator.enum.d.ts +0 -14
  348. package/shared/enums/graphql-request-type.enum.d.ts +0 -8
  349. package/shared/enums/logical-operator.enum.d.ts +0 -8
  350. package/shared/enums/skeleton-type.enum.d.ts +0 -5
  351. package/shared/enums/sort-order.enum.d.ts +0 -4
  352. package/shared/enums/toast-type.enum.d.ts +0 -6
  353. package/shared/functions/ws-client.function.d.ts +0 -5
  354. package/shared/index.d.ts +0 -5
  355. package/shared/interfaces/base-module-config.interface.d.ts +0 -61
  356. package/shared/interfaces/breadcrumb.interface.d.ts +0 -4
  357. package/shared/interfaces/can-component-deactivate.interface.d.ts +0 -7
  358. package/shared/interfaces/cms-enum-values.interface.d.ts +0 -4
  359. package/shared/interfaces/cms-field-config.interface.d.ts +0 -45
  360. package/shared/interfaces/cms-model-config.interface.d.ts +0 -14
  361. package/shared/interfaces/cms-table-field.interface.d.ts +0 -10
  362. package/shared/interfaces/combined-filter-input.interface.d.ts +0 -9
  363. package/shared/interfaces/compress-options.interface.d.ts +0 -15
  364. package/shared/interfaces/cropping-options.interface.d.ts +0 -12
  365. package/shared/interfaces/field-object.interface.d.ts +0 -6
  366. package/shared/interfaces/field.interface.d.ts +0 -5
  367. package/shared/interfaces/filter-input.interface.d.ts +0 -9
  368. package/shared/interfaces/find-args.interface.d.ts +0 -11
  369. package/shared/interfaces/graphql-crud-type.interface.d.ts +0 -7
  370. package/shared/interfaces/graphql-fields-object.interface.d.ts +0 -6
  371. package/shared/interfaces/graphql-options.interface.d.ts +0 -11
  372. package/shared/interfaces/graphql-plus-options.interfacen.d.ts +0 -9
  373. package/shared/interfaces/graphql-type-collection.interface.d.ts +0 -7
  374. package/shared/interfaces/login-config.interface.d.ts +0 -6
  375. package/shared/interfaces/register-config.interface.d.ts +0 -4
  376. package/shared/interfaces/single-filter-input.interface.d.ts +0 -11
  377. package/shared/interfaces/sort-input.interface.d.ts +0 -5
  378. package/shared/interfaces/time-components.interface.d.ts +0 -6
  379. package/shared/interfaces/toast.interface.d.ts +0 -8
  380. package/shared/public-api.d.ts +0 -65
  381. package/shared/services/auth.service.d.ts +0 -44
  382. package/shared/services/breadcrumb.service.d.ts +0 -32
  383. package/shared/services/cms.service.d.ts +0 -27
  384. package/shared/services/file.service.d.ts +0 -22
  385. package/shared/services/forms.service.d.ts +0 -14
  386. package/shared/services/graphql-meta.service.d.ts +0 -45
  387. package/shared/services/graphql-plus.service.d.ts +0 -27
  388. package/shared/services/graphql.service.d.ts +0 -71
  389. package/shared/services/image.service.d.ts +0 -27
  390. package/shared/services/loader.service.d.ts +0 -32
  391. package/shared/services/navigation.service.d.ts +0 -15
  392. package/shared/services/scroll.service.d.ts +0 -85
  393. package/shared/services/storage.service.d.ts +0 -49
  394. package/shared/services/toast.service.d.ts +0 -15
  395. package/shared/services/user.service.d.ts +0 -77
  396. package/shared/services/ws.service.d.ts +0 -8
  397. package/shared/types/graphql-fields.type.d.ts +0 -5
  398. package/shared/types/storage.type.d.ts +0 -4
  399. package/shared/validators/email.validator.d.ts +0 -1
  400. package/shared/validators/match.validator.d.ts +0 -4
  401. package/shared/validators/secure-password.validator.d.ts +0 -1
  402. package/src/base.module.d.ts +0 -16
  403. package/src/decorators/auto-unsubscribe.decorator.d.ts +0 -5
  404. package/src/directives/lazy-load.directive.d.ts +0 -17
  405. package/src/directives/match-height.directive.d.ts +0 -20
  406. package/src/directives/resizable.directive.d.ts +0 -26
  407. package/src/factories/apollo-options.factory.d.ts +0 -16
  408. package/src/functions/extract-files.function.d.ts +0 -15
  409. package/src/guards/auth.guard.d.ts +0 -27
  410. package/src/guards/can-deactivate.guard.d.ts +0 -10
  411. package/src/guards/logout.guard.d.ts +0 -16
  412. package/src/pipes/date-ago.pipe.d.ts +0 -34
  413. package/src/pipes/safe-html.pipe.d.ts +0 -13
  414. package/src/services/fullscreen.service.d.ts +0 -18
  415. package/src/services/seo.service.d.ts +0 -61
  416. package/src/services/theme.service.d.ts +0 -17
@@ -0,0 +1,445 @@
1
+ import * as i0 from "@angular/core";
2
+ import { Component, computed, inject, input, output, signal } from "@angular/core";
3
+ import * as i1 from "@lenne.tech/ng-base/ui";
4
+ import { HlmButtonImports, HlmProgressImports } from "@lenne.tech/ng-base/ui";
5
+ import { NgIcon, provideIcons } from "@ng-icons/core";
6
+ import { lucideFile, lucidePause, lucidePlay, lucideRefreshCw, lucideTrash2, lucideUpload, lucideX } from "@ng-icons/lucide";
7
+ import { formatLtDuration, formatLtFileSize, injectLtTusUpload } from "@lenne.tech/ng-base/files";
8
+ import { LtI18nService } from "@lenne.tech/ng-base";
9
+ const LT_FILES_MESSAGES = {
10
+ de: { lt: { "files": {
11
+ "dropzone": "Dateien hierher ziehen oder auswählen",
12
+ "select": "Dateien auswählen",
13
+ "pause": "Pausieren",
14
+ "resume": "Fortsetzen",
15
+ "cancel": "Abbrechen",
16
+ "retry": "Erneut versuchen",
17
+ "remove": "Entfernen",
18
+ "completed": "Hochgeladen",
19
+ "failed": "Fehlgeschlagen",
20
+ "dropzoneSingle": "Datei hierher ziehen oder auswählen",
21
+ "selectSingle": "Datei auswählen",
22
+ "start": "Hochladen",
23
+ "waiting": "Wartend",
24
+ "uploading": "Wird hochgeladen",
25
+ "paused": "Pausiert",
26
+ "files": "Dateien",
27
+ "remaining": "noch {time}",
28
+ "maxFileSize": "Höchstens {max} pro Datei",
29
+ "tooLarge": "{name} ist zu groß (höchstens {max})",
30
+ "tooMany": "{name} wurde nicht hinzugefügt: höchstens {max} Dateien",
31
+ "invalidType": "{name} hat einen nicht erlaubten Dateityp"
32
+ } } },
33
+ en: { lt: { "files": {
34
+ "dropzone": "Drop files here or browse",
35
+ "select": "Select files",
36
+ "pause": "Pause",
37
+ "resume": "Resume",
38
+ "cancel": "Cancel",
39
+ "retry": "Retry",
40
+ "remove": "Remove",
41
+ "completed": "Uploaded",
42
+ "failed": "Failed",
43
+ "dropzoneSingle": "Drop a file here or browse",
44
+ "selectSingle": "Select file",
45
+ "start": "Upload",
46
+ "waiting": "Waiting",
47
+ "uploading": "Uploading",
48
+ "paused": "Paused",
49
+ "files": "Files",
50
+ "remaining": "{time} left",
51
+ "maxFileSize": "At most {max} per file",
52
+ "tooLarge": "{name} is too large (at most {max})",
53
+ "tooMany": "{name} was not added: at most {max} files",
54
+ "invalidType": "{name} has a file type that is not allowed"
55
+ } } }
56
+ };
57
+ function injectLtFilesI18n() {
58
+ const i18n = inject(LtI18nService);
59
+ i18n.registerLibraryMessages("files", LT_FILES_MESSAGES);
60
+ return i18n;
61
+ }
62
+ let nextComponentId = 0;
63
+ var LtTusUploadComponent = class LtTusUploadComponent {
64
+ accept = input("", ...ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []);
65
+ autoStart = input(true, ...ngDevMode ? [{ debugName: "autoStart" }] : /* istanbul ignore next */ []);
66
+ disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
67
+ endpoint = input(void 0, ...ngDevMode ? [{ debugName: "endpoint" }] : /* istanbul ignore next */ []);
68
+ maxFileSize = input(0, ...ngDevMode ? [{ debugName: "maxFileSize" }] : /* istanbul ignore next */ []);
69
+ maxFiles = input(0, ...ngDevMode ? [{ debugName: "maxFiles" }] : /* istanbul ignore next */ []);
70
+ metadata = input({}, ...ngDevMode ? [{ debugName: "metadata" }] : /* istanbul ignore next */ []);
71
+ multiple = input(false, ...ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []);
72
+ uploaded = output();
73
+ failed = output();
74
+ filesAdded = output();
75
+ i18n = injectLtFilesI18n();
76
+ upload = injectLtTusUpload(this.uploadOptions());
77
+ hintId = `lt-tus-upload-${nextComponentId++}-hint`;
78
+ dragging = signal(false, ...ngDevMode ? [{ debugName: "dragging" }] : /* istanbul ignore next */ []);
79
+ rejections = signal([], ...ngDevMode ? [{ debugName: "rejections" }] : /* istanbul ignore next */ []);
80
+ announcement = signal("", ...ngDevMode ? [{ debugName: "announcement" }] : /* istanbul ignore next */ []);
81
+ formatSize = formatLtFileSize;
82
+ hint = computed(() => {
83
+ const max = this.maxFileSize();
84
+ return max > 0 ? this.i18n.t("lt.files.maxFileSize", { max: formatLtFileSize(max) }) : "";
85
+ }, ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
86
+ dragDepth = 0;
87
+ statusLabel(status) {
88
+ return this.i18n.t({
89
+ completed: "lt.files.completed",
90
+ error: "lt.files.failed",
91
+ idle: "lt.files.waiting",
92
+ paused: "lt.files.paused",
93
+ uploading: "lt.files.uploading"
94
+ }[status]);
95
+ }
96
+ progressLabel(item) {
97
+ const parts = [`${item.progress.percentage} %`];
98
+ if (item.progress.speed > 0) parts.push(`${formatLtFileSize(item.progress.speed)}/s`);
99
+ if (item.progress.remainingTime > 0) parts.push(this.i18n.t("lt.files.remaining", { time: formatLtDuration(item.progress.remainingTime) }));
100
+ return parts.join(" · ");
101
+ }
102
+ actionLabel(key, item) {
103
+ return `${this.i18n.t(key)}: ${item.file.name}`;
104
+ }
105
+ progressValue(item) {
106
+ return Math.min(100, Math.max(0, item.progress.percentage || 0));
107
+ }
108
+ openFileDialog(input) {
109
+ if (!this.disabled()) input.click();
110
+ }
111
+ onInputChange(input) {
112
+ const files = Array.from(input.files ?? []);
113
+ input.value = "";
114
+ this.handleFiles(files, false);
115
+ }
116
+ onDragEnter(event) {
117
+ event.preventDefault();
118
+ if (this.disabled()) return;
119
+ this.dragDepth++;
120
+ this.dragging.set(true);
121
+ }
122
+ onDragOver(event) {
123
+ event.preventDefault();
124
+ if (event.dataTransfer) event.dataTransfer.dropEffect = this.disabled() ? "none" : "copy";
125
+ }
126
+ onDragLeave(event) {
127
+ event.preventDefault();
128
+ this.dragDepth = Math.max(0, this.dragDepth - 1);
129
+ if (this.dragDepth === 0) this.dragging.set(false);
130
+ }
131
+ onDrop(event) {
132
+ event.preventDefault();
133
+ this.dragDepth = 0;
134
+ this.dragging.set(false);
135
+ if (this.disabled()) return;
136
+ this.handleFiles(Array.from(event.dataTransfer?.files ?? []), true);
137
+ }
138
+ async handleFiles(files, dropped) {
139
+ if (files.length === 0) return [];
140
+ const messages = [];
141
+ const multiple = this.multiple();
142
+ const maxFiles = multiple ? this.maxFiles() : 1;
143
+ const maxFileSize = this.maxFileSize();
144
+ const existing = multiple ? this.upload.uploads().length : 0;
145
+ const accepted = [];
146
+ for (const file of files) if (dropped && !matchesLtAccept(file, this.accept())) messages.push(this.i18n.t("lt.files.invalidType", { name: file.name }));
147
+ else if (maxFileSize > 0 && file.size > maxFileSize) messages.push(this.i18n.t("lt.files.tooLarge", {
148
+ max: formatLtFileSize(maxFileSize),
149
+ name: file.name
150
+ }));
151
+ else if (maxFiles > 0 && existing + accepted.length >= maxFiles) messages.push(this.i18n.t("lt.files.tooMany", {
152
+ max: maxFiles,
153
+ name: file.name
154
+ }));
155
+ else accepted.push(file);
156
+ this.rejections.set(messages);
157
+ if (accepted.length === 0) return [];
158
+ if (!multiple) this.upload.cancelAll();
159
+ this.filesAdded.emit(accepted);
160
+ try {
161
+ await this.upload.addFiles(accepted);
162
+ } catch (error) {
163
+ this.rejections.update((current) => [...current, error instanceof Error ? error.message : String(error)]);
164
+ return [];
165
+ }
166
+ return accepted;
167
+ }
168
+ uploadOptions() {
169
+ const options = {
170
+ onError: (item) => {
171
+ this.announcement.set(`${item.file.name}: ${this.i18n.t("lt.files.failed")}`);
172
+ this.failed.emit(item);
173
+ },
174
+ onSuccess: (item) => {
175
+ this.announcement.set(`${item.file.name}: ${this.i18n.t("lt.files.completed")}`);
176
+ this.uploaded.emit(item);
177
+ }
178
+ };
179
+ Object.defineProperties(options, {
180
+ autoStart: {
181
+ enumerable: true,
182
+ get: () => this.autoStart()
183
+ },
184
+ endpoint: {
185
+ enumerable: true,
186
+ get: () => this.endpoint() || void 0
187
+ },
188
+ metadata: {
189
+ enumerable: true,
190
+ get: () => this.metadata()
191
+ }
192
+ });
193
+ return options;
194
+ }
195
+ static ɵfac = i0.ɵɵngDeclareFactory({
196
+ minVersion: "12.0.0",
197
+ version: "22.2.4",
198
+ ngImport: i0,
199
+ type: LtTusUploadComponent,
200
+ deps: [],
201
+ target: i0.ɵɵFactoryTarget.Component
202
+ });
203
+ static ɵcmp = i0.ɵɵngDeclareComponent({
204
+ minVersion: "17.0.0",
205
+ version: "22.2.4",
206
+ type: LtTusUploadComponent,
207
+ isStandalone: true,
208
+ selector: "lt-tus-upload",
209
+ inputs: {
210
+ accept: {
211
+ classPropertyName: "accept",
212
+ publicName: "accept",
213
+ isSignal: true,
214
+ isRequired: false,
215
+ transformFunction: null
216
+ },
217
+ autoStart: {
218
+ classPropertyName: "autoStart",
219
+ publicName: "autoStart",
220
+ isSignal: true,
221
+ isRequired: false,
222
+ transformFunction: null
223
+ },
224
+ disabled: {
225
+ classPropertyName: "disabled",
226
+ publicName: "disabled",
227
+ isSignal: true,
228
+ isRequired: false,
229
+ transformFunction: null
230
+ },
231
+ endpoint: {
232
+ classPropertyName: "endpoint",
233
+ publicName: "endpoint",
234
+ isSignal: true,
235
+ isRequired: false,
236
+ transformFunction: null
237
+ },
238
+ maxFileSize: {
239
+ classPropertyName: "maxFileSize",
240
+ publicName: "maxFileSize",
241
+ isSignal: true,
242
+ isRequired: false,
243
+ transformFunction: null
244
+ },
245
+ maxFiles: {
246
+ classPropertyName: "maxFiles",
247
+ publicName: "maxFiles",
248
+ isSignal: true,
249
+ isRequired: false,
250
+ transformFunction: null
251
+ },
252
+ metadata: {
253
+ classPropertyName: "metadata",
254
+ publicName: "metadata",
255
+ isSignal: true,
256
+ isRequired: false,
257
+ transformFunction: null
258
+ },
259
+ multiple: {
260
+ classPropertyName: "multiple",
261
+ publicName: "multiple",
262
+ isSignal: true,
263
+ isRequired: false,
264
+ transformFunction: null
265
+ }
266
+ },
267
+ outputs: {
268
+ uploaded: "uploaded",
269
+ failed: "failed",
270
+ filesAdded: "filesAdded"
271
+ },
272
+ host: {
273
+ properties: { "attr.data-disabled": "disabled() || null" },
274
+ classAttribute: "block"
275
+ },
276
+ providers: [provideIcons({
277
+ lucideFile,
278
+ lucidePause,
279
+ lucidePlay,
280
+ lucideRefreshCw,
281
+ lucideTrash2,
282
+ lucideUpload,
283
+ lucideX
284
+ })],
285
+ ngImport: i0,
286
+ template: "<div class=\"flex flex-col gap-3\">\n <div\n class=\"border-border flex flex-col items-center justify-center gap-3 rounded-lg border-2 border-dashed p-6 text-center transition-colors data-[dragging=true]:border-primary data-[dragging=true]:bg-primary/5 data-[disabled=true]:opacity-50\"\n data-slot=\"dropzone\"\n [attr.data-dragging]=\"dragging() || null\"\n [attr.data-disabled]=\"disabled() || null\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <ng-icon name=\"lucideUpload\" class=\"text-muted-foreground text-2xl\" aria-hidden=\"true\" />\n <div [id]=\"hintId\" class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\">{{ i18n.t(multiple() ? 'lt.files.dropzone' : 'lt.files.dropzoneSingle') }}</p>\n @if (hint()) {\n <p class=\"text-muted-foreground text-xs\">{{ hint() }}</p>\n }\n </div>\n <button hlmBtn type=\"button\" variant=\"outline\" size=\"sm\" [disabled]=\"disabled()\" [attr.aria-describedby]=\"hintId\" (click)=\"openFileDialog(fileInput)\">\n {{ i18n.t(multiple() ? 'lt.files.select' : 'lt.files.selectSingle') }}\n </button>\n <input\n #fileInput\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n data-slot=\"file-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"onInputChange(fileInput)\"\n />\n </div>\n\n @if (rejections().length > 0) {\n <ul class=\"text-error flex flex-col gap-1 text-sm\" role=\"alert\" data-slot=\"rejections\">\n @for (message of rejections(); track $index) {\n <li>{{ message }}</li>\n }\n </ul>\n }\n\n <p class=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\" data-slot=\"announcement\">{{ announcement() }}</p>\n\n @if (upload.uploads().length > 0) {\n <ul class=\"flex flex-col gap-2\" data-slot=\"file-list\" [attr.aria-label]=\"i18n.t('lt.files.files')\">\n @for (item of upload.uploads(); track item.id) {\n <li class=\"border-border bg-background flex items-center gap-3 rounded-lg border p-3\" data-slot=\"file\" [attr.data-status]=\"item.status\">\n <ng-icon name=\"lucideFile\" class=\"text-muted-foreground shrink-0 text-xl\" aria-hidden=\"true\" />\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <p class=\"truncate text-sm font-medium\" [id]=\"item.id + '-name'\" [title]=\"item.file.name\">{{ item.file.name }}</p>\n <p class=\"text-muted-foreground flex flex-wrap items-center gap-x-2 text-xs\">\n <span>{{ formatSize(item.file.size) }}</span>\n <span aria-hidden=\"true\">·</span>\n <span\n data-slot=\"status\"\n [class.text-success]=\"item.status === 'completed'\"\n [class.text-error]=\"item.status === 'error'\"\n [class.text-warning]=\"item.status === 'paused'\"\n >{{ statusLabel(item.status) }}</span\n >\n @if (item.status === 'uploading') {\n <span aria-hidden=\"true\">·</span>\n <span data-slot=\"progress-label\">{{ progressLabel(item) }}</span>\n }\n </p>\n @if (item.status === 'uploading' || item.status === 'paused') {\n <hlm-progress class=\"mt-1\" [value]=\"progressValue(item)\" [attr.aria-labelledby]=\"item.id + '-name'\">\n <hlm-progress-indicator />\n </hlm-progress>\n }\n </div>\n <div class=\"flex shrink-0 gap-0.5\">\n @switch (item.status) {\n @case ('uploading') {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"pause\"\n [attr.aria-label]=\"actionLabel('lt.files.pause', item)\"\n (click)=\"upload.pauseUpload(item.id)\"\n >\n <ng-icon name=\"lucidePause\" aria-hidden=\"true\" />\n </button>\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"cancel\"\n [attr.aria-label]=\"actionLabel('lt.files.cancel', item)\"\n (click)=\"upload.cancelUpload(item.id)\"\n >\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n }\n @case ('paused') {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"resume\"\n [attr.aria-label]=\"actionLabel('lt.files.resume', item)\"\n (click)=\"upload.resumeUpload(item.id)\"\n >\n <ng-icon name=\"lucidePlay\" aria-hidden=\"true\" />\n </button>\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"cancel\"\n [attr.aria-label]=\"actionLabel('lt.files.cancel', item)\"\n (click)=\"upload.cancelUpload(item.id)\"\n >\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n }\n @case ('idle') {\n @if (!autoStart()) {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"start\"\n [attr.aria-label]=\"actionLabel('lt.files.start', item)\"\n (click)=\"upload.startUpload(item.id)\"\n >\n <ng-icon name=\"lucideUpload\" aria-hidden=\"true\" />\n </button>\n }\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"cancel\"\n [attr.aria-label]=\"actionLabel('lt.files.cancel', item)\"\n (click)=\"upload.cancelUpload(item.id)\"\n >\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n }\n @case ('error') {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"retry\"\n [attr.aria-label]=\"actionLabel('lt.files.retry', item)\"\n (click)=\"upload.retryUpload(item.id)\"\n >\n <ng-icon name=\"lucideRefreshCw\" aria-hidden=\"true\" />\n </button>\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"remove\"\n [attr.aria-label]=\"actionLabel('lt.files.remove', item)\"\n (click)=\"upload.removeUpload(item.id)\"\n >\n <ng-icon name=\"lucideTrash2\" aria-hidden=\"true\" />\n </button>\n }\n @case ('completed') {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"remove\"\n [attr.aria-label]=\"actionLabel('lt.files.remove', item)\"\n (click)=\"upload.removeUpload(item.id)\"\n >\n <ng-icon name=\"lucideTrash2\" aria-hidden=\"true\" />\n </button>\n }\n }\n </div>\n </li>\n }\n </ul>\n }\n</div>\n",
287
+ dependencies: [
288
+ {
289
+ kind: "directive",
290
+ type: i1.HlmButton,
291
+ selector: "button[hlmBtn], a[hlmBtn]",
292
+ inputs: ["variant", "size"],
293
+ exportAs: ["hlmBtn"]
294
+ },
295
+ {
296
+ kind: "directive",
297
+ type: i1.HlmProgress,
298
+ selector: "hlm-progress,[hlmProgress]",
299
+ exportAs: ["hlmProgress"]
300
+ },
301
+ {
302
+ kind: "directive",
303
+ type: i1.HlmProgressIndicator,
304
+ selector: "[hlmProgressIndicator],hlm-progress-indicator",
305
+ exportAs: ["hlmProgressIndicator"]
306
+ },
307
+ {
308
+ kind: "component",
309
+ type: NgIcon,
310
+ selector: "ng-icon",
311
+ inputs: [
312
+ "name",
313
+ "svg",
314
+ "size",
315
+ "strokeWidth",
316
+ "color"
317
+ ]
318
+ }
319
+ ]
320
+ });
321
+ };
322
+ i0.ɵɵngDeclareClassMetadata({
323
+ minVersion: "12.0.0",
324
+ version: "22.2.4",
325
+ ngImport: i0,
326
+ type: LtTusUploadComponent,
327
+ decorators: [{
328
+ type: Component,
329
+ args: [{
330
+ selector: "lt-tus-upload",
331
+ imports: [
332
+ HlmButtonImports,
333
+ HlmProgressImports,
334
+ NgIcon
335
+ ],
336
+ providers: [provideIcons({
337
+ lucideFile,
338
+ lucidePause,
339
+ lucidePlay,
340
+ lucideRefreshCw,
341
+ lucideTrash2,
342
+ lucideUpload,
343
+ lucideX
344
+ })],
345
+ host: {
346
+ class: "block",
347
+ "[attr.data-disabled]": "disabled() || null"
348
+ },
349
+ template: "<div class=\"flex flex-col gap-3\">\n <div\n class=\"border-border flex flex-col items-center justify-center gap-3 rounded-lg border-2 border-dashed p-6 text-center transition-colors data-[dragging=true]:border-primary data-[dragging=true]:bg-primary/5 data-[disabled=true]:opacity-50\"\n data-slot=\"dropzone\"\n [attr.data-dragging]=\"dragging() || null\"\n [attr.data-disabled]=\"disabled() || null\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <ng-icon name=\"lucideUpload\" class=\"text-muted-foreground text-2xl\" aria-hidden=\"true\" />\n <div [id]=\"hintId\" class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\">{{ i18n.t(multiple() ? 'lt.files.dropzone' : 'lt.files.dropzoneSingle') }}</p>\n @if (hint()) {\n <p class=\"text-muted-foreground text-xs\">{{ hint() }}</p>\n }\n </div>\n <button hlmBtn type=\"button\" variant=\"outline\" size=\"sm\" [disabled]=\"disabled()\" [attr.aria-describedby]=\"hintId\" (click)=\"openFileDialog(fileInput)\">\n {{ i18n.t(multiple() ? 'lt.files.select' : 'lt.files.selectSingle') }}\n </button>\n <input\n #fileInput\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n data-slot=\"file-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"onInputChange(fileInput)\"\n />\n </div>\n\n @if (rejections().length > 0) {\n <ul class=\"text-error flex flex-col gap-1 text-sm\" role=\"alert\" data-slot=\"rejections\">\n @for (message of rejections(); track $index) {\n <li>{{ message }}</li>\n }\n </ul>\n }\n\n <p class=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\" data-slot=\"announcement\">{{ announcement() }}</p>\n\n @if (upload.uploads().length > 0) {\n <ul class=\"flex flex-col gap-2\" data-slot=\"file-list\" [attr.aria-label]=\"i18n.t('lt.files.files')\">\n @for (item of upload.uploads(); track item.id) {\n <li class=\"border-border bg-background flex items-center gap-3 rounded-lg border p-3\" data-slot=\"file\" [attr.data-status]=\"item.status\">\n <ng-icon name=\"lucideFile\" class=\"text-muted-foreground shrink-0 text-xl\" aria-hidden=\"true\" />\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <p class=\"truncate text-sm font-medium\" [id]=\"item.id + '-name'\" [title]=\"item.file.name\">{{ item.file.name }}</p>\n <p class=\"text-muted-foreground flex flex-wrap items-center gap-x-2 text-xs\">\n <span>{{ formatSize(item.file.size) }}</span>\n <span aria-hidden=\"true\">·</span>\n <span\n data-slot=\"status\"\n [class.text-success]=\"item.status === 'completed'\"\n [class.text-error]=\"item.status === 'error'\"\n [class.text-warning]=\"item.status === 'paused'\"\n >{{ statusLabel(item.status) }}</span\n >\n @if (item.status === 'uploading') {\n <span aria-hidden=\"true\">·</span>\n <span data-slot=\"progress-label\">{{ progressLabel(item) }}</span>\n }\n </p>\n @if (item.status === 'uploading' || item.status === 'paused') {\n <hlm-progress class=\"mt-1\" [value]=\"progressValue(item)\" [attr.aria-labelledby]=\"item.id + '-name'\">\n <hlm-progress-indicator />\n </hlm-progress>\n }\n </div>\n <div class=\"flex shrink-0 gap-0.5\">\n @switch (item.status) {\n @case ('uploading') {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"pause\"\n [attr.aria-label]=\"actionLabel('lt.files.pause', item)\"\n (click)=\"upload.pauseUpload(item.id)\"\n >\n <ng-icon name=\"lucidePause\" aria-hidden=\"true\" />\n </button>\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"cancel\"\n [attr.aria-label]=\"actionLabel('lt.files.cancel', item)\"\n (click)=\"upload.cancelUpload(item.id)\"\n >\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n }\n @case ('paused') {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"resume\"\n [attr.aria-label]=\"actionLabel('lt.files.resume', item)\"\n (click)=\"upload.resumeUpload(item.id)\"\n >\n <ng-icon name=\"lucidePlay\" aria-hidden=\"true\" />\n </button>\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"cancel\"\n [attr.aria-label]=\"actionLabel('lt.files.cancel', item)\"\n (click)=\"upload.cancelUpload(item.id)\"\n >\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n }\n @case ('idle') {\n @if (!autoStart()) {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"start\"\n [attr.aria-label]=\"actionLabel('lt.files.start', item)\"\n (click)=\"upload.startUpload(item.id)\"\n >\n <ng-icon name=\"lucideUpload\" aria-hidden=\"true\" />\n </button>\n }\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"cancel\"\n [attr.aria-label]=\"actionLabel('lt.files.cancel', item)\"\n (click)=\"upload.cancelUpload(item.id)\"\n >\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n }\n @case ('error') {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"retry\"\n [attr.aria-label]=\"actionLabel('lt.files.retry', item)\"\n (click)=\"upload.retryUpload(item.id)\"\n >\n <ng-icon name=\"lucideRefreshCw\" aria-hidden=\"true\" />\n </button>\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"remove\"\n [attr.aria-label]=\"actionLabel('lt.files.remove', item)\"\n (click)=\"upload.removeUpload(item.id)\"\n >\n <ng-icon name=\"lucideTrash2\" aria-hidden=\"true\" />\n </button>\n }\n @case ('completed') {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"remove\"\n [attr.aria-label]=\"actionLabel('lt.files.remove', item)\"\n (click)=\"upload.removeUpload(item.id)\"\n >\n <ng-icon name=\"lucideTrash2\" aria-hidden=\"true\" />\n </button>\n }\n }\n </div>\n </li>\n }\n </ul>\n }\n</div>\n"
350
+ }]
351
+ }],
352
+ propDecorators: {
353
+ accept: [{
354
+ type: i0.Input,
355
+ args: [{
356
+ isSignal: true,
357
+ alias: "accept",
358
+ required: false
359
+ }]
360
+ }],
361
+ autoStart: [{
362
+ type: i0.Input,
363
+ args: [{
364
+ isSignal: true,
365
+ alias: "autoStart",
366
+ required: false
367
+ }]
368
+ }],
369
+ disabled: [{
370
+ type: i0.Input,
371
+ args: [{
372
+ isSignal: true,
373
+ alias: "disabled",
374
+ required: false
375
+ }]
376
+ }],
377
+ endpoint: [{
378
+ type: i0.Input,
379
+ args: [{
380
+ isSignal: true,
381
+ alias: "endpoint",
382
+ required: false
383
+ }]
384
+ }],
385
+ maxFileSize: [{
386
+ type: i0.Input,
387
+ args: [{
388
+ isSignal: true,
389
+ alias: "maxFileSize",
390
+ required: false
391
+ }]
392
+ }],
393
+ maxFiles: [{
394
+ type: i0.Input,
395
+ args: [{
396
+ isSignal: true,
397
+ alias: "maxFiles",
398
+ required: false
399
+ }]
400
+ }],
401
+ metadata: [{
402
+ type: i0.Input,
403
+ args: [{
404
+ isSignal: true,
405
+ alias: "metadata",
406
+ required: false
407
+ }]
408
+ }],
409
+ multiple: [{
410
+ type: i0.Input,
411
+ args: [{
412
+ isSignal: true,
413
+ alias: "multiple",
414
+ required: false
415
+ }]
416
+ }],
417
+ uploaded: [{
418
+ type: i0.Output,
419
+ args: ["uploaded"]
420
+ }],
421
+ failed: [{
422
+ type: i0.Output,
423
+ args: ["failed"]
424
+ }],
425
+ filesAdded: [{
426
+ type: i0.Output,
427
+ args: ["filesAdded"]
428
+ }]
429
+ }
430
+ });
431
+ function matchesLtAccept(file, accept) {
432
+ const tokens = (accept || "").split(",").map((token) => token.trim().toLowerCase()).filter(Boolean);
433
+ if (tokens.length === 0) return true;
434
+ const name = file.name.toLowerCase();
435
+ const type = (file.type || "").toLowerCase();
436
+ return tokens.some((token) => {
437
+ if (token === "*" || token === "*/*") return true;
438
+ if (token.startsWith(".")) return name.endsWith(token);
439
+ if (token.endsWith("/*")) return type.startsWith(token.slice(0, -1));
440
+ return type === token;
441
+ });
442
+ }
443
+ export { LtTusUploadComponent, matchesLtAccept };
444
+
445
+ //# sourceMappingURL=lenne.tech-ng-base-files-ui.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lenne.tech-ng-base-files-ui.mjs","names":[],"sources":["../tmp-esm2022/files/ui/lib/i18n/de.json","../tmp-esm2022/files/ui/lib/i18n/en.json","../../../projects/ng-base/files/ui/src/lib/i18n.ts","../../../projects/ng-base/files/ui/src/lib/tus-upload-component.ts","../../../projects/ng-base/files/ui/src/lib/tus-upload-component.html"],"sourcesContent":["","","import { inject } from '@angular/core';\nimport { LtI18nService } from '@lenne.tech/ng-base';\n\nimport de from './i18n/de.json';\nimport en from './i18n/en.json';\n\n/** The `lt.files.*` texts (also shipped as `i18n/files/{de,en}.json`). */\nexport const LT_FILES_MESSAGES = { de, en } as const;\n\n/** `LtI18nService` with the `lt.files.*` texts registered (injection context). */\nexport function injectLtFilesI18n(): LtI18nService {\n const i18n = inject(LtI18nService);\n i18n.registerLibraryMessages('files', LT_FILES_MESSAGES);\n return i18n;\n}\n","import { Component, computed, input, output, signal } from '@angular/core';\nimport { HlmButtonImports, HlmProgressImports } from '@lenne.tech/ng-base/ui';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { lucideFile, lucidePause, lucidePlay, lucideRefreshCw, lucideTrash2, lucideUpload, lucideX } from '@ng-icons/lucide';\n\nimport { formatLtDuration, formatLtFileSize, injectLtTusUpload, type LtUploadItem, type LtUploadOptions, type LtUploadStatus } from '@lenne.tech/ng-base/files';\nimport { injectLtFilesI18n } from './i18n';\n\nlet nextComponentId = 0;\n\n/**\n * Upload UI (drop zone, file list with progress, pause/resume/cancel/retry), the counterpart of the Nuxt starter's\n * `TusFileUpload.vue`. Built on `injectLtTusUpload()` and the `/ui` helm components.\n *\n * Keyboard: the drop zone holds a real button that opens the file dialog; every row action is a labelled button.\n * Validation (`accept` for dropped files, `maxFileSize`, `maxFiles`, single file without `multiple`) rejects files with a\n * message (`role=\"alert\"`); finished and failed uploads are announced in a polite live region. With `multiple` off a new\n * file replaces the previous one. Inputs are read when a file is added or started, so changing them takes effect for\n * the next file.\n *\n * @example <lt-tus-upload accept=\"image/*\" [multiple]=\"true\" (uploaded)=\"onUploaded($event)\" />\n */\n@Component({\n selector: 'lt-tus-upload',\n imports: [HlmButtonImports, HlmProgressImports, NgIcon],\n providers: [provideIcons({ lucideFile, lucidePause, lucidePlay, lucideRefreshCw, lucideTrash2, lucideUpload, lucideX })],\n templateUrl: './tus-upload-component.html',\n host: {\n class: 'block',\n '[attr.data-disabled]': 'disabled() || null',\n },\n})\nexport class LtTusUploadComponent {\n /** `accept` attribute of the file input; dropped files are checked against it as well. */\n readonly accept = input<string>('');\n /** Start uploads right after selection (default `true`). */\n readonly autoStart = input(true);\n /** Disable the drop zone. */\n readonly disabled = input(false);\n /** TUS endpoint (default from `provideLtFiles()`). */\n readonly endpoint = input<string | undefined>(undefined);\n /** Maximum file size in bytes (`0` = unlimited); larger files are rejected with a message. */\n readonly maxFileSize = input(0);\n /** Maximum number of files (`0` = unlimited). */\n readonly maxFiles = input(0);\n /** Extra TUS metadata for every file. */\n readonly metadata = input<Record<string, string>>({});\n /** Allow several files. */\n readonly multiple = input(false);\n\n /** A file finished uploading (`fileId` from `X-File-Id`). */\n readonly uploaded = output<LtUploadItem>();\n /** A file failed. */\n readonly failed = output<LtUploadItem>();\n /** Files were selected or dropped (the ones that passed validation and were added to the queue). */\n readonly filesAdded = output<File[]>();\n\n protected readonly i18n = injectLtFilesI18n();\n protected readonly upload = injectLtTusUpload(this.uploadOptions());\n protected readonly hintId = `lt-tus-upload-${nextComponentId++}-hint`;\n protected readonly dragging = signal(false);\n protected readonly rejections = signal<string[]>([]);\n protected readonly announcement = signal('');\n protected readonly formatSize = formatLtFileSize;\n protected readonly hint = computed(() => {\n const max = this.maxFileSize();\n return max > 0 ? this.i18n.t('lt.files.maxFileSize', { max: formatLtFileSize(max) }) : '';\n });\n private dragDepth = 0;\n\n /** Status text of an item. */\n protected statusLabel(status: LtUploadStatus): string {\n const keys: Record<LtUploadStatus, string> = {\n completed: 'lt.files.completed',\n error: 'lt.files.failed',\n idle: 'lt.files.waiting',\n paused: 'lt.files.paused',\n uploading: 'lt.files.uploading',\n };\n return this.i18n.t(keys[status]);\n }\n\n /** Progress details of an uploading item (`42 % · 1.2 MB/s · noch 5s`). */\n protected progressLabel(item: LtUploadItem): string {\n const parts = [`${item.progress.percentage} %`];\n if (item.progress.speed > 0) {\n parts.push(`${formatLtFileSize(item.progress.speed)}/s`);\n }\n if (item.progress.remainingTime > 0) {\n parts.push(this.i18n.t('lt.files.remaining', { time: formatLtDuration(item.progress.remainingTime) }));\n }\n return parts.join(' · ');\n }\n\n /** Accessible label of a row action, naming the file. */\n protected actionLabel(key: string, item: LtUploadItem): string {\n return `${this.i18n.t(key)}: ${item.file.name}`;\n }\n\n /** Progress value clamped into the range the progress bar accepts. */\n protected progressValue(item: LtUploadItem): number {\n return Math.min(100, Math.max(0, item.progress.percentage || 0));\n }\n\n protected openFileDialog(input: HTMLInputElement): void {\n if (!this.disabled()) {\n input.click();\n }\n }\n\n protected onInputChange(input: HTMLInputElement): void {\n const files = Array.from(input.files ?? []);\n // Reset, so selecting the same file again fires `change` again.\n input.value = '';\n void this.handleFiles(files, false);\n }\n\n protected onDragEnter(event: DragEvent): void {\n event.preventDefault();\n if (this.disabled()) {\n return;\n }\n this.dragDepth++;\n this.dragging.set(true);\n }\n\n protected onDragOver(event: DragEvent): void {\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = this.disabled() ? 'none' : 'copy';\n }\n }\n\n protected onDragLeave(event: DragEvent): void {\n event.preventDefault();\n this.dragDepth = Math.max(0, this.dragDepth - 1);\n if (this.dragDepth === 0) {\n this.dragging.set(false);\n }\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.dragDepth = 0;\n this.dragging.set(false);\n if (this.disabled()) {\n return;\n }\n void this.handleFiles(Array.from(event.dataTransfer?.files ?? []), true);\n }\n\n /** Validate and queue files; returns the accepted ones. */\n private async handleFiles(files: File[], dropped: boolean): Promise<File[]> {\n if (files.length === 0) {\n return [];\n }\n const messages: string[] = [];\n const multiple = this.multiple();\n const maxFiles = multiple ? this.maxFiles() : 1;\n const maxFileSize = this.maxFileSize();\n const existing = multiple ? this.upload.uploads().length : 0;\n const accepted: File[] = [];\n\n for (const file of files) {\n if (dropped && !matchesLtAccept(file, this.accept())) {\n messages.push(this.i18n.t('lt.files.invalidType', { name: file.name }));\n } else if (maxFileSize > 0 && file.size > maxFileSize) {\n messages.push(this.i18n.t('lt.files.tooLarge', { max: formatLtFileSize(maxFileSize), name: file.name }));\n } else if (maxFiles > 0 && existing + accepted.length >= maxFiles) {\n messages.push(this.i18n.t('lt.files.tooMany', { max: maxFiles, name: file.name }));\n } else {\n accepted.push(file);\n }\n }\n this.rejections.set(messages);\n if (accepted.length === 0) {\n return [];\n }\n if (!multiple) {\n this.upload.cancelAll();\n }\n this.filesAdded.emit(accepted);\n try {\n await this.upload.addFiles(accepted);\n } catch (error) {\n this.rejections.update((current) => [...current, error instanceof Error ? error.message : String(error)]);\n return [];\n }\n return accepted;\n }\n\n private uploadOptions(): LtUploadOptions {\n const options: LtUploadOptions = {\n onError: (item) => {\n this.announcement.set(`${item.file.name}: ${this.i18n.t('lt.files.failed')}`);\n this.failed.emit(item);\n },\n onSuccess: (item) => {\n this.announcement.set(`${item.file.name}: ${this.i18n.t('lt.files.completed')}`);\n this.uploaded.emit(item);\n },\n };\n // Getters over the inputs: the upload queue reads its options whenever a file is added or started.\n Object.defineProperties(options, {\n autoStart: { enumerable: true, get: () => this.autoStart() },\n endpoint: { enumerable: true, get: () => this.endpoint() || undefined },\n metadata: { enumerable: true, get: () => this.metadata() },\n });\n return options;\n }\n}\n\n/**\n * Whether `file` matches an `accept` attribute value (`image/*`, `application/pdf`, `.png`, comma separated). An empty\n * value and `*` / `*\\/*` accept everything.\n */\nexport function matchesLtAccept(file: File, accept: string): boolean {\n const tokens = (accept || '')\n .split(',')\n .map((token) => token.trim().toLowerCase())\n .filter(Boolean);\n if (tokens.length === 0) {\n return true;\n }\n const name = file.name.toLowerCase();\n const type = (file.type || '').toLowerCase();\n return tokens.some((token) => {\n if (token === '*' || token === '*/*') {\n return true;\n }\n if (token.startsWith('.')) {\n return name.endsWith(token);\n }\n if (token.endsWith('/*')) {\n return type.startsWith(token.slice(0, -1));\n }\n return type === token;\n });\n}\n","<div class=\"flex flex-col gap-3\">\n <div\n class=\"border-border flex flex-col items-center justify-center gap-3 rounded-lg border-2 border-dashed p-6 text-center transition-colors data-[dragging=true]:border-primary data-[dragging=true]:bg-primary/5 data-[disabled=true]:opacity-50\"\n data-slot=\"dropzone\"\n [attr.data-dragging]=\"dragging() || null\"\n [attr.data-disabled]=\"disabled() || null\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <ng-icon name=\"lucideUpload\" class=\"text-muted-foreground text-2xl\" aria-hidden=\"true\" />\n <div [id]=\"hintId\" class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\">{{ i18n.t(multiple() ? 'lt.files.dropzone' : 'lt.files.dropzoneSingle') }}</p>\n @if (hint()) {\n <p class=\"text-muted-foreground text-xs\">{{ hint() }}</p>\n }\n </div>\n <button hlmBtn type=\"button\" variant=\"outline\" size=\"sm\" [disabled]=\"disabled()\" [attr.aria-describedby]=\"hintId\" (click)=\"openFileDialog(fileInput)\">\n {{ i18n.t(multiple() ? 'lt.files.select' : 'lt.files.selectSingle') }}\n </button>\n <input\n #fileInput\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n data-slot=\"file-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"onInputChange(fileInput)\"\n />\n </div>\n\n @if (rejections().length > 0) {\n <ul class=\"text-error flex flex-col gap-1 text-sm\" role=\"alert\" data-slot=\"rejections\">\n @for (message of rejections(); track $index) {\n <li>{{ message }}</li>\n }\n </ul>\n }\n\n <p class=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\" data-slot=\"announcement\">{{ announcement() }}</p>\n\n @if (upload.uploads().length > 0) {\n <ul class=\"flex flex-col gap-2\" data-slot=\"file-list\" [attr.aria-label]=\"i18n.t('lt.files.files')\">\n @for (item of upload.uploads(); track item.id) {\n <li class=\"border-border bg-background flex items-center gap-3 rounded-lg border p-3\" data-slot=\"file\" [attr.data-status]=\"item.status\">\n <ng-icon name=\"lucideFile\" class=\"text-muted-foreground shrink-0 text-xl\" aria-hidden=\"true\" />\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <p class=\"truncate text-sm font-medium\" [id]=\"item.id + '-name'\" [title]=\"item.file.name\">{{ item.file.name }}</p>\n <p class=\"text-muted-foreground flex flex-wrap items-center gap-x-2 text-xs\">\n <span>{{ formatSize(item.file.size) }}</span>\n <span aria-hidden=\"true\">·</span>\n <span\n data-slot=\"status\"\n [class.text-success]=\"item.status === 'completed'\"\n [class.text-error]=\"item.status === 'error'\"\n [class.text-warning]=\"item.status === 'paused'\"\n >{{ statusLabel(item.status) }}</span\n >\n @if (item.status === 'uploading') {\n <span aria-hidden=\"true\">·</span>\n <span data-slot=\"progress-label\">{{ progressLabel(item) }}</span>\n }\n </p>\n @if (item.status === 'uploading' || item.status === 'paused') {\n <hlm-progress class=\"mt-1\" [value]=\"progressValue(item)\" [attr.aria-labelledby]=\"item.id + '-name'\">\n <hlm-progress-indicator />\n </hlm-progress>\n }\n </div>\n <div class=\"flex shrink-0 gap-0.5\">\n @switch (item.status) {\n @case ('uploading') {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"pause\"\n [attr.aria-label]=\"actionLabel('lt.files.pause', item)\"\n (click)=\"upload.pauseUpload(item.id)\"\n >\n <ng-icon name=\"lucidePause\" aria-hidden=\"true\" />\n </button>\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"cancel\"\n [attr.aria-label]=\"actionLabel('lt.files.cancel', item)\"\n (click)=\"upload.cancelUpload(item.id)\"\n >\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n }\n @case ('paused') {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"resume\"\n [attr.aria-label]=\"actionLabel('lt.files.resume', item)\"\n (click)=\"upload.resumeUpload(item.id)\"\n >\n <ng-icon name=\"lucidePlay\" aria-hidden=\"true\" />\n </button>\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"cancel\"\n [attr.aria-label]=\"actionLabel('lt.files.cancel', item)\"\n (click)=\"upload.cancelUpload(item.id)\"\n >\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n }\n @case ('idle') {\n @if (!autoStart()) {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"start\"\n [attr.aria-label]=\"actionLabel('lt.files.start', item)\"\n (click)=\"upload.startUpload(item.id)\"\n >\n <ng-icon name=\"lucideUpload\" aria-hidden=\"true\" />\n </button>\n }\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"cancel\"\n [attr.aria-label]=\"actionLabel('lt.files.cancel', item)\"\n (click)=\"upload.cancelUpload(item.id)\"\n >\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n }\n @case ('error') {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"retry\"\n [attr.aria-label]=\"actionLabel('lt.files.retry', item)\"\n (click)=\"upload.retryUpload(item.id)\"\n >\n <ng-icon name=\"lucideRefreshCw\" aria-hidden=\"true\" />\n </button>\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"remove\"\n [attr.aria-label]=\"actionLabel('lt.files.remove', item)\"\n (click)=\"upload.removeUpload(item.id)\"\n >\n <ng-icon name=\"lucideTrash2\" aria-hidden=\"true\" />\n </button>\n }\n @case ('completed') {\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"remove\"\n [attr.aria-label]=\"actionLabel('lt.files.remove', item)\"\n (click)=\"upload.removeUpload(item.id)\"\n >\n <ng-icon name=\"lucideTrash2\" aria-hidden=\"true\" />\n </button>\n }\n }\n </div>\n </li>\n }\n </ul>\n }\n</div>\n"],"mappings":"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"}