@lenne.tech/ng-base 18.1.3 → 22.0.1

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 +771 -0
  5. package/fesm2022/lenne.tech-ng-base-ai.mjs.map +1 -0
  6. package/fesm2022/lenne.tech-ng-base-auth-provide.mjs +945 -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 +34645 -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 +845 -0
  62. package/types/lenne.tech-ng-base-auth-provide.d.ts +604 -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 +7744 -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,825 @@
1
+ import { t as LtBugReportService } from "./lenne.tech-ng-base-bug-bug-report-service-DWoTb_iw.mjs";
2
+ import { registerLtBugMessages } from "./lenne.tech-ng-base-bug-messages-BsP4fRQU.mjs";
3
+ import { emptyLtBugReportForm, formatLtBugFileSize, ltBugPrefillFromError, ltDataUrlSize } from "./lenne.tech-ng-base-bug-report-Tzlhe1Cm.mjs";
4
+ import * as i0 from "@angular/core";
5
+ import { Component, ElementRef, Injector, afterNextRender, computed, inject, input, output, signal } from "@angular/core";
6
+ import { LT_I18N_OPTIONS, LtI18nService } from "@lenne.tech/ng-base";
7
+ import { NgIcon, provideIcons } from "@ng-icons/core";
8
+ import { lucideAppWindow, lucideArrowUpDown, lucideChevronDown, lucideCircleAlert, lucideCircleArrowRight, lucideClock, lucideFileText, lucideHand, lucideInfo, lucideKeyboard, lucideMousePointerClick, lucidePaperclip, lucidePencil, lucideSend, lucideUpload, lucideX } from "@ng-icons/lucide";
9
+ import { FormField, disabled, form, maxLength, required, submit } from "@angular/forms/signals";
10
+ import * as i1 from "@lenne.tech/ng-base/ui";
11
+ import { HlmBadgeImports, HlmButtonImports, HlmCollapsibleImports, HlmDialogImports, HlmNativeSelectImports, HlmSpinnerImports, HlmSwitchImports, HlmTextareaImports, LtFormField, LtNotice, LtOverlayService, LtSelect, LtTextField, injectLtOverlayRef } from "@lenne.tech/ng-base/ui";
12
+ import { ltFocusFirstInvalid } from "@lenne.tech/ng-base/utils";
13
+ let nextId$1 = 0;
14
+ var LtBugAttachments = class LtBugAttachments {
15
+ accept = input("image/*,.pdf,.doc,.docx,.txt,.log", ...ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []);
16
+ attachments = input.required(...ngDevMode ? [{ debugName: "attachments" }] : /* istanbul ignore next */ []);
17
+ disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
18
+ maxFiles = input(10, ...ngDevMode ? [{ debugName: "maxFiles" }] : /* istanbul ignore next */ []);
19
+ maxFileSize = input(10, ...ngDevMode ? [{ debugName: "maxFileSize" }] : /* istanbul ignore next */ []);
20
+ added = output();
21
+ removed = output();
22
+ i18n = inject(LtI18nService);
23
+ hintId = `lt-bug-attachments-${nextId$1++}-hint`;
24
+ dragging = signal(false, ...ngDevMode ? [{ debugName: "dragging" }] : /* istanbul ignore next */ []);
25
+ rejections = signal([], ...ngDevMode ? [{ debugName: "rejections" }] : /* istanbul ignore next */ []);
26
+ formatSize = formatLtBugFileSize;
27
+ dragDepth = 0;
28
+ openFileDialog(fileInput) {
29
+ if (!this.disabled()) fileInput.click();
30
+ }
31
+ onInputChange(fileInput) {
32
+ const files = Array.from(fileInput.files ?? []);
33
+ fileInput.value = "";
34
+ this.addFiles(files);
35
+ }
36
+ onDragEnter(event) {
37
+ event.preventDefault();
38
+ if (!this.disabled()) {
39
+ this.dragDepth++;
40
+ this.dragging.set(true);
41
+ }
42
+ }
43
+ onDragOver(event) {
44
+ event.preventDefault();
45
+ if (event.dataTransfer) event.dataTransfer.dropEffect = this.disabled() ? "none" : "copy";
46
+ }
47
+ onDragLeave(event) {
48
+ event.preventDefault();
49
+ this.dragDepth = Math.max(0, this.dragDepth - 1);
50
+ if (this.dragDepth === 0) this.dragging.set(false);
51
+ }
52
+ onDrop(event) {
53
+ event.preventDefault();
54
+ this.dragDepth = 0;
55
+ this.dragging.set(false);
56
+ if (!this.disabled()) this.addFiles(Array.from(event.dataTransfer?.files ?? []));
57
+ }
58
+ async addFiles(files) {
59
+ if (!files.length) return [];
60
+ const messages = [];
61
+ const accepted = [];
62
+ const maxBytes = this.maxFileSize() * 1024 * 1024;
63
+ let count = this.attachments().length;
64
+ for (const file of files) {
65
+ if (file.size > maxBytes) {
66
+ messages.push(this.i18n.t("lt.bug.fileTooLarge", {
67
+ max: this.maxFileSize(),
68
+ name: file.name
69
+ }));
70
+ continue;
71
+ }
72
+ if (count >= this.maxFiles()) {
73
+ messages.push(this.i18n.t("lt.bug.tooManyFiles", {
74
+ max: this.maxFiles(),
75
+ name: file.name
76
+ }));
77
+ continue;
78
+ }
79
+ try {
80
+ const data = await readAsDataUrl(file);
81
+ accepted.push({
82
+ data,
83
+ id: `attachment-${Date.now()}-${nextId$1++}`,
84
+ name: file.name,
85
+ size: file.size,
86
+ type: file.type || "application/octet-stream",
87
+ ...file.type.startsWith("image/") ? { preview: data } : {}
88
+ });
89
+ count++;
90
+ } catch {
91
+ messages.push(this.i18n.t("lt.bug.fileReadFailed", { name: file.name }));
92
+ }
93
+ }
94
+ this.rejections.set(messages);
95
+ if (accepted.length) this.added.emit(accepted);
96
+ return accepted;
97
+ }
98
+ removeLabel(attachment) {
99
+ return this.i18n.t("lt.bug.removeAttachment", { name: attachment.name });
100
+ }
101
+ static ɵfac = i0.ɵɵngDeclareFactory({
102
+ minVersion: "12.0.0",
103
+ version: "22.2.4",
104
+ ngImport: i0,
105
+ type: LtBugAttachments,
106
+ deps: [],
107
+ target: i0.ɵɵFactoryTarget.Component
108
+ });
109
+ static ɵcmp = i0.ɵɵngDeclareComponent({
110
+ minVersion: "17.0.0",
111
+ version: "22.2.4",
112
+ type: LtBugAttachments,
113
+ isStandalone: true,
114
+ selector: "lt-bug-attachments",
115
+ inputs: {
116
+ accept: {
117
+ classPropertyName: "accept",
118
+ publicName: "accept",
119
+ isSignal: true,
120
+ isRequired: false,
121
+ transformFunction: null
122
+ },
123
+ attachments: {
124
+ classPropertyName: "attachments",
125
+ publicName: "attachments",
126
+ isSignal: true,
127
+ isRequired: true,
128
+ transformFunction: null
129
+ },
130
+ disabled: {
131
+ classPropertyName: "disabled",
132
+ publicName: "disabled",
133
+ isSignal: true,
134
+ isRequired: false,
135
+ transformFunction: null
136
+ },
137
+ maxFiles: {
138
+ classPropertyName: "maxFiles",
139
+ publicName: "maxFiles",
140
+ isSignal: true,
141
+ isRequired: false,
142
+ transformFunction: null
143
+ },
144
+ maxFileSize: {
145
+ classPropertyName: "maxFileSize",
146
+ publicName: "maxFileSize",
147
+ isSignal: true,
148
+ isRequired: false,
149
+ transformFunction: null
150
+ }
151
+ },
152
+ outputs: {
153
+ added: "added",
154
+ removed: "removed"
155
+ },
156
+ host: { classAttribute: "flex flex-col gap-3" },
157
+ providers: [provideIcons({
158
+ lucideFileText,
159
+ lucidePaperclip,
160
+ lucideUpload,
161
+ lucideX
162
+ })],
163
+ ngImport: i0,
164
+ template: "<div\n class=\"border-border flex flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-4 text-center transition-colors data-[disabled=true]:opacity-50 data-[dragging=true]:border-primary data-[dragging=true]:bg-primary/5\"\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 <button hlmBtn type=\"button\" variant=\"outline\" size=\"sm\" [disabled]=\"disabled()\" [attr.aria-describedby]=\"hintId\" (click)=\"openFileDialog(fileInput)\">\n {{ i18n.t('lt.bug.selectFiles') }}\n </button>\n <p [id]=\"hintId\" class=\"text-muted-foreground text-xs\">{{ i18n.t('lt.bug.dropHint') }} · {{ i18n.t('lt.bug.maxFileSize', { max: maxFileSize() }) }}</p>\n <input\n #fileInput\n type=\"file\"\n multiple\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n data-slot=\"file-input\"\n [accept]=\"accept()\"\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@if (attachments().length > 0) {\n <div class=\"flex flex-col gap-2\">\n <p class=\"text-sm font-medium\" [id]=\"hintId + '-list'\">{{ i18n.t('lt.bug.attachmentsCount', { count: attachments().length }) }}</p>\n <ul class=\"flex flex-col gap-1\" data-slot=\"attachment-list\" [attr.aria-labelledby]=\"hintId + '-list'\">\n @for (attachment of attachments(); track attachment.id) {\n <li class=\"bg-muted/50 flex items-center gap-3 rounded-lg p-2\" data-slot=\"attachment\" [attr.data-screenshot]=\"attachment.isScreenshot || null\">\n @if (attachment.preview) {\n <img class=\"size-10 shrink-0 rounded object-cover\" [src]=\"attachment.preview\" [alt]=\"attachment.name\" />\n } @else {\n <ng-icon\n class=\"text-muted-foreground shrink-0 text-2xl\"\n aria-hidden=\"true\"\n [name]=\"attachment.type.startsWith('text/') || attachment.type.includes('pdf') ? 'lucideFileText' : 'lucidePaperclip'\"\n />\n }\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <div class=\"flex min-w-0 items-center gap-2\">\n <span class=\"truncate text-sm font-medium\" [title]=\"attachment.name\">{{ attachment.name }}</span>\n @if (attachment.isScreenshot) {\n <span hlmBadge variant=\"secondary\">{{ i18n.t('lt.bug.screenshot') }}</span>\n }\n </div>\n <span class=\"text-muted-foreground text-xs\">{{ formatSize(attachment.size) }}</span>\n </div>\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"remove\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"removeLabel(attachment)\"\n (click)=\"removed.emit(attachment.id)\"\n >\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n </li>\n }\n </ul>\n </div>\n}\n",
165
+ dependencies: [
166
+ {
167
+ kind: "directive",
168
+ type: i1.HlmBadge,
169
+ selector: "[hlmBadge],hlm-badge",
170
+ inputs: ["variant"],
171
+ exportAs: ["hlmBadge"]
172
+ },
173
+ {
174
+ kind: "directive",
175
+ type: i1.HlmButton,
176
+ selector: "button[hlmBtn], a[hlmBtn]",
177
+ inputs: ["variant", "size"],
178
+ exportAs: ["hlmBtn"]
179
+ },
180
+ {
181
+ kind: "component",
182
+ type: NgIcon,
183
+ selector: "ng-icon",
184
+ inputs: [
185
+ "name",
186
+ "svg",
187
+ "size",
188
+ "strokeWidth",
189
+ "color"
190
+ ]
191
+ }
192
+ ]
193
+ });
194
+ };
195
+ i0.ɵɵngDeclareClassMetadata({
196
+ minVersion: "12.0.0",
197
+ version: "22.2.4",
198
+ ngImport: i0,
199
+ type: LtBugAttachments,
200
+ decorators: [{
201
+ type: Component,
202
+ args: [{
203
+ selector: "lt-bug-attachments",
204
+ imports: [
205
+ HlmBadgeImports,
206
+ HlmButtonImports,
207
+ NgIcon
208
+ ],
209
+ providers: [provideIcons({
210
+ lucideFileText,
211
+ lucidePaperclip,
212
+ lucideUpload,
213
+ lucideX
214
+ })],
215
+ host: { class: "flex flex-col gap-3" },
216
+ template: "<div\n class=\"border-border flex flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-4 text-center transition-colors data-[disabled=true]:opacity-50 data-[dragging=true]:border-primary data-[dragging=true]:bg-primary/5\"\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 <button hlmBtn type=\"button\" variant=\"outline\" size=\"sm\" [disabled]=\"disabled()\" [attr.aria-describedby]=\"hintId\" (click)=\"openFileDialog(fileInput)\">\n {{ i18n.t('lt.bug.selectFiles') }}\n </button>\n <p [id]=\"hintId\" class=\"text-muted-foreground text-xs\">{{ i18n.t('lt.bug.dropHint') }} · {{ i18n.t('lt.bug.maxFileSize', { max: maxFileSize() }) }}</p>\n <input\n #fileInput\n type=\"file\"\n multiple\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n data-slot=\"file-input\"\n [accept]=\"accept()\"\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@if (attachments().length > 0) {\n <div class=\"flex flex-col gap-2\">\n <p class=\"text-sm font-medium\" [id]=\"hintId + '-list'\">{{ i18n.t('lt.bug.attachmentsCount', { count: attachments().length }) }}</p>\n <ul class=\"flex flex-col gap-1\" data-slot=\"attachment-list\" [attr.aria-labelledby]=\"hintId + '-list'\">\n @for (attachment of attachments(); track attachment.id) {\n <li class=\"bg-muted/50 flex items-center gap-3 rounded-lg p-2\" data-slot=\"attachment\" [attr.data-screenshot]=\"attachment.isScreenshot || null\">\n @if (attachment.preview) {\n <img class=\"size-10 shrink-0 rounded object-cover\" [src]=\"attachment.preview\" [alt]=\"attachment.name\" />\n } @else {\n <ng-icon\n class=\"text-muted-foreground shrink-0 text-2xl\"\n aria-hidden=\"true\"\n [name]=\"attachment.type.startsWith('text/') || attachment.type.includes('pdf') ? 'lucideFileText' : 'lucidePaperclip'\"\n />\n }\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <div class=\"flex min-w-0 items-center gap-2\">\n <span class=\"truncate text-sm font-medium\" [title]=\"attachment.name\">{{ attachment.name }}</span>\n @if (attachment.isScreenshot) {\n <span hlmBadge variant=\"secondary\">{{ i18n.t('lt.bug.screenshot') }}</span>\n }\n </div>\n <span class=\"text-muted-foreground text-xs\">{{ formatSize(attachment.size) }}</span>\n </div>\n <button\n hlmBtn\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n data-action=\"remove\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"removeLabel(attachment)\"\n (click)=\"removed.emit(attachment.id)\"\n >\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n </li>\n }\n </ul>\n </div>\n}\n"
217
+ }]
218
+ }],
219
+ propDecorators: {
220
+ accept: [{
221
+ type: i0.Input,
222
+ args: [{
223
+ isSignal: true,
224
+ alias: "accept",
225
+ required: false
226
+ }]
227
+ }],
228
+ attachments: [{
229
+ type: i0.Input,
230
+ args: [{
231
+ isSignal: true,
232
+ alias: "attachments",
233
+ required: true
234
+ }]
235
+ }],
236
+ disabled: [{
237
+ type: i0.Input,
238
+ args: [{
239
+ isSignal: true,
240
+ alias: "disabled",
241
+ required: false
242
+ }]
243
+ }],
244
+ maxFiles: [{
245
+ type: i0.Input,
246
+ args: [{
247
+ isSignal: true,
248
+ alias: "maxFiles",
249
+ required: false
250
+ }]
251
+ }],
252
+ maxFileSize: [{
253
+ type: i0.Input,
254
+ args: [{
255
+ isSignal: true,
256
+ alias: "maxFileSize",
257
+ required: false
258
+ }]
259
+ }],
260
+ added: [{
261
+ type: i0.Output,
262
+ args: ["added"]
263
+ }],
264
+ removed: [{
265
+ type: i0.Output,
266
+ args: ["removed"]
267
+ }]
268
+ }
269
+ });
270
+ function readAsDataUrl(file) {
271
+ return new Promise((resolve, reject) => {
272
+ const reader = new FileReader();
273
+ reader.onload = () => typeof reader.result === "string" ? resolve(reader.result) : reject(/* @__PURE__ */ new Error("Unexpected FileReader result"));
274
+ reader.onerror = () => reject(reader.error ?? /* @__PURE__ */ new Error("FileReader error"));
275
+ reader.onabort = () => reject(/* @__PURE__ */ new Error("FileReader aborted"));
276
+ reader.readAsDataURL(file);
277
+ });
278
+ }
279
+ let nextId = 0;
280
+ const ICONS = {
281
+ click: "lucideMousePointerClick",
282
+ error: "lucideCircleAlert",
283
+ form_change: "lucideFileText",
284
+ form_submit: "lucideSend",
285
+ hover: "lucideHand",
286
+ input_change: "lucidePencil",
287
+ keyboard: "lucideKeyboard",
288
+ modal_close: "lucideX",
289
+ modal_open: "lucideAppWindow",
290
+ navigation: "lucideCircleArrowRight",
291
+ scroll: "lucideArrowUpDown"
292
+ };
293
+ const COLORS = {
294
+ error: "text-error",
295
+ form_change: "text-success",
296
+ form_submit: "text-success",
297
+ input_change: "text-warning",
298
+ keyboard: "text-info",
299
+ modal_close: "text-error",
300
+ modal_open: "text-info",
301
+ navigation: "text-info"
302
+ };
303
+ var LtBugJourneyTimeline = class LtBugJourneyTimeline {
304
+ events = input.required(...ngDevMode ? [{ debugName: "events" }] : /* istanbul ignore next */ []);
305
+ i18n = inject(LtI18nService);
306
+ filterId = `lt-bug-journey-${nextId++}-filter`;
307
+ filter = signal("all", ...ngDevMode ? [{ debugName: "filter" }] : /* istanbul ignore next */ []);
308
+ types = computed(() => ["all", ...new Set(this.events().map((event) => event.type))], ...ngDevMode ? [{ debugName: "types" }] : /* istanbul ignore next */ []);
309
+ filtered = computed(() => {
310
+ const filter = this.filter();
311
+ return filter === "all" ? this.events() : this.events().filter((event) => event.type === filter);
312
+ }, ...ngDevMode ? [{ debugName: "filtered" }] : /* istanbul ignore next */ []);
313
+ typeLabel(type) {
314
+ if (type === "all") return this.i18n.t("lt.bug.allEventTypes");
315
+ const key = `lt.bug.events.${type}`;
316
+ const label = this.i18n.t(key);
317
+ return label === key ? type.replace(/_/g, " ").replace(/\b\w/g, (letter) => letter.toUpperCase()) : label;
318
+ }
319
+ icon(type) {
320
+ return ICONS[type] ?? "lucideInfo";
321
+ }
322
+ color(type) {
323
+ return COLORS[type] ?? "text-primary";
324
+ }
325
+ time(timestamp) {
326
+ const date = new Date(timestamp);
327
+ return Number.isNaN(date.getTime()) ? "" : date.toLocaleTimeString(this.i18n.locale() === "en" ? "en-GB" : "de-DE", {
328
+ hour: "2-digit",
329
+ minute: "2-digit",
330
+ second: "2-digit"
331
+ });
332
+ }
333
+ details(event) {
334
+ const metadata = event.metadata;
335
+ if (!metadata) return "";
336
+ const parts = [];
337
+ if (metadata.text) parts.push(`${this.i18n.t("lt.bug.metaText")}: ${metadata.text.length > 30 ? `${metadata.text.slice(0, 30)}…` : metadata.text}`);
338
+ if (metadata.value) parts.push(`${this.i18n.t("lt.bug.metaValue")}: ${metadata.value}`);
339
+ if (metadata.url && metadata.url !== metadata.toUrl) parts.push(`${this.i18n.t("lt.bug.metaUrl")}: ${metadata.url}`);
340
+ if (metadata.toUrl) parts.push(`→ ${metadata.toUrl}`);
341
+ if (metadata.scrollPosition !== void 0) parts.push(`${this.i18n.t("lt.bug.metaPosition")}: ${metadata.scrollPosition}px`);
342
+ if (metadata.key) parts.push(`${this.i18n.t("lt.bug.metaKey")}: ${metadata.key}`);
343
+ if (metadata.errorMessage) parts.push(`${this.i18n.t("lt.bug.metaError")}: ${metadata.errorMessage}`);
344
+ return parts.join(" | ");
345
+ }
346
+ static ɵfac = i0.ɵɵngDeclareFactory({
347
+ minVersion: "12.0.0",
348
+ version: "22.2.4",
349
+ ngImport: i0,
350
+ type: LtBugJourneyTimeline,
351
+ deps: [],
352
+ target: i0.ɵɵFactoryTarget.Component
353
+ });
354
+ static ɵcmp = i0.ɵɵngDeclareComponent({
355
+ minVersion: "17.0.0",
356
+ version: "22.2.4",
357
+ type: LtBugJourneyTimeline,
358
+ isStandalone: true,
359
+ selector: "lt-bug-journey-timeline",
360
+ inputs: { events: {
361
+ classPropertyName: "events",
362
+ publicName: "events",
363
+ isSignal: true,
364
+ isRequired: true,
365
+ transformFunction: null
366
+ } },
367
+ host: { classAttribute: "flex flex-col gap-3" },
368
+ providers: [provideIcons({
369
+ lucideAppWindow,
370
+ lucideArrowUpDown,
371
+ lucideCircleAlert,
372
+ lucideCircleArrowRight,
373
+ lucideClock,
374
+ lucideFileText,
375
+ lucideHand,
376
+ lucideInfo,
377
+ lucideKeyboard,
378
+ lucideMousePointerClick,
379
+ lucidePencil,
380
+ lucideSend,
381
+ lucideX
382
+ })],
383
+ ngImport: i0,
384
+ template: "<div class=\"flex flex-col gap-1.5\">\n <label class=\"text-sm font-medium\" [for]=\"filterId\">{{ i18n.t('lt.bug.journeyFilter') }}</label>\n <hlm-native-select size=\"sm\" [selectId]=\"filterId\" [value]=\"filter()\" (valueChange)=\"filter.set($event || 'all')\">\n @for (type of types(); track type) {\n <option hlmNativeSelectOption [value]=\"type\">{{ typeLabel(type) }}</option>\n }\n </hlm-native-select>\n</div>\n\n@if (filtered().length > 0) {\n <ol class=\"flex max-h-96 flex-col gap-2 overflow-y-auto\" data-slot=\"journey-list\" [attr.aria-label]=\"i18n.t('lt.bug.journeyEvents')\">\n @for (event of filtered(); track $index) {\n <li class=\"border-border flex items-start gap-3 rounded-lg border p-3\" data-slot=\"journey-event\" [attr.data-type]=\"event.type\">\n <ng-icon class=\"mt-0.5 shrink-0 text-lg\" aria-hidden=\"true\" [class]=\"color(event.type)\" [name]=\"icon(event.type)\" />\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <div class=\"flex items-center justify-between gap-2\">\n <span hlmBadge variant=\"outline\">{{ typeLabel(event.type) }}</span>\n <time class=\"text-muted-foreground text-xs\" [attr.datetime]=\"event.timestamp\">{{ time(event.timestamp) }}</time>\n </div>\n <p class=\"truncate text-sm font-medium\" [title]=\"event.target\">{{ event.target }}</p>\n @if (details(event); as text) {\n <p class=\"text-muted-foreground truncate text-xs\" [title]=\"text\">{{ text }}</p>\n }\n </div>\n </li>\n }\n </ol>\n} @else {\n <div class=\"text-muted-foreground flex flex-col items-center gap-2 py-8 text-center\" data-slot=\"journey-empty\">\n <ng-icon name=\"lucideClock\" class=\"text-4xl opacity-50\" aria-hidden=\"true\" />\n <p class=\"text-sm\">{{ i18n.t('lt.bug.journeyEmpty') }}</p>\n </div>\n}\n",
385
+ dependencies: [
386
+ {
387
+ kind: "directive",
388
+ type: i1.HlmBadge,
389
+ selector: "[hlmBadge],hlm-badge",
390
+ inputs: ["variant"],
391
+ exportAs: ["hlmBadge"]
392
+ },
393
+ {
394
+ kind: "component",
395
+ type: i1.HlmNativeSelect,
396
+ selector: "hlm-native-select",
397
+ inputs: [
398
+ "selectId",
399
+ "selectClass",
400
+ "selectIconClass",
401
+ "size",
402
+ "disabled",
403
+ "forceInvalid",
404
+ "aria-invalid",
405
+ "value"
406
+ ],
407
+ outputs: ["valueChange"],
408
+ exportAs: ["hlmNativeSelect"]
409
+ },
410
+ {
411
+ kind: "directive",
412
+ type: i1.HlmNativeSelectOption,
413
+ selector: "option[hlmNativeSelectOption]",
414
+ exportAs: ["hlmNativeSelectOption"]
415
+ },
416
+ {
417
+ kind: "component",
418
+ type: NgIcon,
419
+ selector: "ng-icon",
420
+ inputs: [
421
+ "name",
422
+ "svg",
423
+ "size",
424
+ "strokeWidth",
425
+ "color"
426
+ ]
427
+ }
428
+ ]
429
+ });
430
+ };
431
+ i0.ɵɵngDeclareClassMetadata({
432
+ minVersion: "12.0.0",
433
+ version: "22.2.4",
434
+ ngImport: i0,
435
+ type: LtBugJourneyTimeline,
436
+ decorators: [{
437
+ type: Component,
438
+ args: [{
439
+ selector: "lt-bug-journey-timeline",
440
+ imports: [
441
+ HlmBadgeImports,
442
+ HlmNativeSelectImports,
443
+ NgIcon
444
+ ],
445
+ providers: [provideIcons({
446
+ lucideAppWindow,
447
+ lucideArrowUpDown,
448
+ lucideCircleAlert,
449
+ lucideCircleArrowRight,
450
+ lucideClock,
451
+ lucideFileText,
452
+ lucideHand,
453
+ lucideInfo,
454
+ lucideKeyboard,
455
+ lucideMousePointerClick,
456
+ lucidePencil,
457
+ lucideSend,
458
+ lucideX
459
+ })],
460
+ host: { class: "flex flex-col gap-3" },
461
+ template: "<div class=\"flex flex-col gap-1.5\">\n <label class=\"text-sm font-medium\" [for]=\"filterId\">{{ i18n.t('lt.bug.journeyFilter') }}</label>\n <hlm-native-select size=\"sm\" [selectId]=\"filterId\" [value]=\"filter()\" (valueChange)=\"filter.set($event || 'all')\">\n @for (type of types(); track type) {\n <option hlmNativeSelectOption [value]=\"type\">{{ typeLabel(type) }}</option>\n }\n </hlm-native-select>\n</div>\n\n@if (filtered().length > 0) {\n <ol class=\"flex max-h-96 flex-col gap-2 overflow-y-auto\" data-slot=\"journey-list\" [attr.aria-label]=\"i18n.t('lt.bug.journeyEvents')\">\n @for (event of filtered(); track $index) {\n <li class=\"border-border flex items-start gap-3 rounded-lg border p-3\" data-slot=\"journey-event\" [attr.data-type]=\"event.type\">\n <ng-icon class=\"mt-0.5 shrink-0 text-lg\" aria-hidden=\"true\" [class]=\"color(event.type)\" [name]=\"icon(event.type)\" />\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <div class=\"flex items-center justify-between gap-2\">\n <span hlmBadge variant=\"outline\">{{ typeLabel(event.type) }}</span>\n <time class=\"text-muted-foreground text-xs\" [attr.datetime]=\"event.timestamp\">{{ time(event.timestamp) }}</time>\n </div>\n <p class=\"truncate text-sm font-medium\" [title]=\"event.target\">{{ event.target }}</p>\n @if (details(event); as text) {\n <p class=\"text-muted-foreground truncate text-xs\" [title]=\"text\">{{ text }}</p>\n }\n </div>\n </li>\n }\n </ol>\n} @else {\n <div class=\"text-muted-foreground flex flex-col items-center gap-2 py-8 text-center\" data-slot=\"journey-empty\">\n <ng-icon name=\"lucideClock\" class=\"text-4xl opacity-50\" aria-hidden=\"true\" />\n <p class=\"text-sm\">{{ i18n.t('lt.bug.journeyEmpty') }}</p>\n </div>\n}\n"
462
+ }]
463
+ }],
464
+ propDecorators: { events: [{
465
+ type: i0.Input,
466
+ args: [{
467
+ isSignal: true,
468
+ alias: "events",
469
+ required: true
470
+ }]
471
+ }] }
472
+ });
473
+ const TYPES = [
474
+ "bug",
475
+ "feature",
476
+ "enhancement",
477
+ "other"
478
+ ];
479
+ var LtBugReportDialog = class LtBugReportDialog {
480
+ bug = inject(LtBugReportService);
481
+ i18n = registered(inject(LtI18nService), inject(LT_I18N_OPTIONS).messages);
482
+ ref = injectLtOverlayRef();
483
+ host = inject(ElementRef);
484
+ injector = inject(Injector);
485
+ model = signal(initialForm(this.bug.lastError()), ...ngDevMode ? [{ debugName: "model" }] : /* istanbul ignore next */ []);
486
+ reportForm = form(this.model, (path) => {
487
+ required(path.title, { message: this.i18n.t("lt.bug.titleRequired") });
488
+ maxLength(path.title, 255);
489
+ required(path.type, { message: this.i18n.t("lt.bug.typeRequired") });
490
+ required(path.description, { message: this.i18n.t("lt.bug.descriptionRequired") });
491
+ disabled(path, () => this.bug.isSubmitting());
492
+ });
493
+ attachments = signal(initialAttachments(this.bug.screenshot()), ...ngDevMode ? [{ debugName: "attachments" }] : /* istanbul ignore next */ []);
494
+ includes = signal({
495
+ browserInfo: true,
496
+ consoleLogs: true,
497
+ networkRequests: true,
498
+ userJourney: true
499
+ }, ...ngDevMode ? [{ debugName: "includes" }] : /* istanbul ignore next */ []);
500
+ showAdditional = signal(false, ...ngDevMode ? [{ debugName: "showAdditional" }] : /* istanbul ignore next */ []);
501
+ showJourney = signal(false, ...ngDevMode ? [{ debugName: "showJourney" }] : /* istanbul ignore next */ []);
502
+ journey = this.bug.getUserJourney();
503
+ consoleCount = this.bug.getConsoleLogs().length;
504
+ networkCount = this.bug.getNetworkRequests().length;
505
+ options = this.bug.options;
506
+ journeyEnabled = this.options.enableUserJourney && this.options.userJourney.enabled;
507
+ hasScreenshot = computed(() => this.attachments().some((attachment) => attachment.isScreenshot), ...ngDevMode ? [{ debugName: "hasScreenshot" }] : /* istanbul ignore next */ []);
508
+ typeOptions = computed(() => TYPES.map((type) => ({
509
+ label: this.i18n.t(`lt.bug.types.${type}`),
510
+ value: type
511
+ })), ...ngDevMode ? [{ debugName: "typeOptions" }] : /* istanbul ignore next */ []);
512
+ typeError = computed(() => fieldError(this.reportForm.type), ...ngDevMode ? [{ debugName: "typeError" }] : /* istanbul ignore next */ []);
513
+ descriptionError = computed(() => fieldError(this.reportForm.description), ...ngDevMode ? [{ debugName: "descriptionError" }] : /* istanbul ignore next */ []);
514
+ setInclude(key, value) {
515
+ this.includes.update((current) => ({
516
+ ...current,
517
+ [key]: value
518
+ }));
519
+ }
520
+ addAttachments(added) {
521
+ this.attachments.update((current) => [...current, ...added]);
522
+ }
523
+ removeAttachment(id) {
524
+ this.attachments.update((current) => current.filter((attachment) => attachment.id !== id));
525
+ }
526
+ cancel() {
527
+ if (!this.bug.isSubmitting()) this.ref.close(false);
528
+ }
529
+ async onSubmit(event) {
530
+ event?.preventDefault();
531
+ if (this.bug.isSubmitting()) return;
532
+ await submit(this.reportForm, {
533
+ action: async () => {
534
+ try {
535
+ await this.bug.submit(await this.bug.buildReport(this.model(), this.attachments(), this.includes()));
536
+ this.bug.reset();
537
+ this.ref.close(true);
538
+ } catch {}
539
+ },
540
+ onInvalid: () => afterNextRender(() => ltFocusFirstInvalid(this.host.nativeElement, { offset: 0 }), { injector: this.injector })
541
+ });
542
+ }
543
+ static ɵfac = i0.ɵɵngDeclareFactory({
544
+ minVersion: "12.0.0",
545
+ version: "22.2.4",
546
+ ngImport: i0,
547
+ type: LtBugReportDialog,
548
+ deps: [],
549
+ target: i0.ɵɵFactoryTarget.Component
550
+ });
551
+ static ɵcmp = i0.ɵɵngDeclareComponent({
552
+ minVersion: "17.0.0",
553
+ version: "22.2.4",
554
+ type: LtBugReportDialog,
555
+ isStandalone: true,
556
+ selector: "lt-bug-report-dialog",
557
+ host: {
558
+ attributes: { "data-lt-bug-ui": "" },
559
+ classAttribute: "grid min-w-0 gap-6"
560
+ },
561
+ providers: [provideIcons({
562
+ lucideChevronDown,
563
+ lucideX
564
+ })],
565
+ ngImport: i0,
566
+ template: "<div hlmDialogHeader>\n <h2 hlmDialogTitle>{{ i18n.t('lt.bug.dialogTitle') }}</h2>\n <p hlmDialogDescription>{{ i18n.t('lt.bug.dialogDescription') }}</p>\n</div>\n\n<form id=\"lt-bug-form\" class=\"flex min-w-0 flex-col gap-4\" novalidate data-slot=\"bug-report-form\" (submit)=\"onSubmit($event)\">\n @if (bug.error(); as message) {\n <lt-notice variant=\"error\" data-slot=\"bug-report-error\">\n <div class=\"flex items-start justify-between gap-3\">\n <span>{{ message }}</span>\n <button hlmBtn type=\"button\" variant=\"ghost\" size=\"icon-sm\" class=\"-my-1 shrink-0\" [attr.aria-label]=\"i18n.t('lt.bug.dismissError')\" (click)=\"bug.error.set(null)\">\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n </div>\n </lt-notice>\n }\n\n <lt-text-field id=\"lt-bug-title\" [label]=\"i18n.t('lt.bug.title')\" [placeholder]=\"i18n.t('lt.bug.titlePlaceholder')\" [formField]=\"reportForm.title\" />\n\n <lt-form-field for=\"lt-bug-type\" [label]=\"i18n.t('lt.bug.type')\" [required]=\"true\" [error]=\"typeError()\">\n <lt-select id=\"lt-bug-type\" [options]=\"typeOptions()\" [placeholder]=\"i18n.t('lt.bug.typePlaceholder')\" [formField]=\"reportForm.type\" />\n </lt-form-field>\n\n <lt-form-field for=\"lt-bug-description\" [label]=\"i18n.t('lt.bug.description')\" [required]=\"true\" [error]=\"descriptionError()\">\n <textarea\n hlmTextarea\n id=\"lt-bug-description\"\n rows=\"4\"\n class=\"max-h-64\"\n [placeholder]=\"i18n.t('lt.bug.descriptionPlaceholder')\"\n [forceInvalid]=\"!!descriptionError()\"\n [formField]=\"reportForm.description\"\n ></textarea>\n </lt-form-field>\n\n <lt-form-field for=\"lt-bug-expected\" [label]=\"i18n.t('lt.bug.expectedBehavior')\">\n <textarea\n hlmTextarea\n id=\"lt-bug-expected\"\n rows=\"3\"\n class=\"max-h-48\"\n [placeholder]=\"i18n.t('lt.bug.expectedBehaviorPlaceholder')\"\n [formField]=\"reportForm.expectedBehavior\"\n ></textarea>\n </lt-form-field>\n\n <lt-form-field for=\"lt-bug-steps\" [label]=\"i18n.t('lt.bug.stepsToReproduce')\">\n <textarea\n hlmTextarea\n id=\"lt-bug-steps\"\n rows=\"3\"\n class=\"max-h-48\"\n [placeholder]=\"i18n.t('lt.bug.stepsToReproducePlaceholder')\"\n [formField]=\"reportForm.stepsToReproduce\"\n ></textarea>\n </lt-form-field>\n\n <section class=\"flex flex-col gap-2\" aria-labelledby=\"lt-bug-attachments-title\" data-slot=\"bug-report-attachments\">\n <h3 id=\"lt-bug-attachments-title\" class=\"text-sm font-medium\">\n {{ i18n.t('lt.bug.attachments') }}\n @if (hasScreenshot()) {\n <span class=\"text-muted-foreground ms-2 text-xs font-normal\">{{ i18n.t('lt.bug.screenshotCaptured') }}</span>\n }\n </h3>\n <lt-bug-attachments [attachments]=\"attachments()\" [disabled]=\"bug.isSubmitting()\" (added)=\"addAttachments($event)\" (removed)=\"removeAttachment($event)\" />\n </section>\n\n @if (options.enableBrowserInfo || options.enableConsoleLogs || options.enableNetworkRequests || journeyEnabled) {\n <div hlmCollapsible class=\"border-border rounded-lg border\" data-slot=\"bug-report-additional\" [expanded]=\"showAdditional()\" (expandedChange)=\"showAdditional.set($event)\">\n <button hlmCollapsibleTrigger type=\"button\" class=\"hover:bg-muted flex w-full items-center justify-between rounded-lg px-3 py-2.5 text-start text-sm font-medium\">\n <span>{{ i18n.t('lt.bug.additionalInfo') }}</span>\n <ng-icon name=\"lucideChevronDown\" class=\"transition-transform duration-200\" aria-hidden=\"true\" [class.rotate-180]=\"showAdditional()\" />\n </button>\n <div hlmCollapsibleContent class=\"border-border flex flex-col gap-3 border-t p-3\">\n @if (options.enableBrowserInfo) {\n <div class=\"flex items-center justify-between gap-3\">\n <div class=\"flex min-w-0 flex-col\">\n <span id=\"lt-bug-include-browser-label\" class=\"text-sm font-medium\">{{ i18n.t('lt.bug.browserInfo') }}</span>\n <span id=\"lt-bug-include-browser-hint\" class=\"text-muted-foreground text-xs\">{{ i18n.t('lt.bug.browserInfoHint') }}</span>\n </div>\n <hlm-switch\n inputId=\"lt-bug-include-browser\"\n aria-labelledby=\"lt-bug-include-browser-label\"\n aria-describedby=\"lt-bug-include-browser-hint\"\n [checked]=\"includes().browserInfo\"\n [disabled]=\"bug.isSubmitting()\"\n (checkedChange)=\"setInclude('browserInfo', $event)\"\n />\n </div>\n }\n @if (options.enableConsoleLogs) {\n <div class=\"flex items-center justify-between gap-3\">\n <div class=\"flex min-w-0 flex-col\">\n <span id=\"lt-bug-include-console-label\" class=\"text-sm font-medium\">{{ i18n.t('lt.bug.consoleLogs') }}</span>\n <span id=\"lt-bug-include-console-hint\" class=\"text-muted-foreground text-xs\">{{ i18n.t('lt.bug.consoleLogsHint', { count: consoleCount }) }}</span>\n </div>\n <hlm-switch\n inputId=\"lt-bug-include-console\"\n aria-labelledby=\"lt-bug-include-console-label\"\n aria-describedby=\"lt-bug-include-console-hint\"\n [checked]=\"includes().consoleLogs\"\n [disabled]=\"bug.isSubmitting()\"\n (checkedChange)=\"setInclude('consoleLogs', $event)\"\n />\n </div>\n }\n @if (options.enableNetworkRequests) {\n <div class=\"flex items-center justify-between gap-3\">\n <div class=\"flex min-w-0 flex-col\">\n <span id=\"lt-bug-include-network-label\" class=\"text-sm font-medium\">{{ i18n.t('lt.bug.networkRequests') }}</span>\n <span id=\"lt-bug-include-network-hint\" class=\"text-muted-foreground text-xs\">{{ i18n.t('lt.bug.networkRequestsHint', { count: networkCount }) }}</span>\n </div>\n <hlm-switch\n inputId=\"lt-bug-include-network\"\n aria-labelledby=\"lt-bug-include-network-label\"\n aria-describedby=\"lt-bug-include-network-hint\"\n [checked]=\"includes().networkRequests\"\n [disabled]=\"bug.isSubmitting()\"\n (checkedChange)=\"setInclude('networkRequests', $event)\"\n />\n </div>\n }\n @if (journeyEnabled) {\n <div class=\"flex items-center justify-between gap-3\">\n <div class=\"flex min-w-0 flex-col\">\n <span id=\"lt-bug-include-journey-label\" class=\"text-sm font-medium\">{{ i18n.t('lt.bug.userJourney') }}</span>\n <span id=\"lt-bug-include-journey-hint\" class=\"text-muted-foreground text-xs\">{{ i18n.t('lt.bug.userJourneyHint', { count: journey.length }) }}</span>\n </div>\n <hlm-switch\n inputId=\"lt-bug-include-journey\"\n aria-labelledby=\"lt-bug-include-journey-label\"\n aria-describedby=\"lt-bug-include-journey-hint\"\n [checked]=\"includes().userJourney\"\n [disabled]=\"bug.isSubmitting()\"\n (checkedChange)=\"setInclude('userJourney', $event)\"\n />\n </div>\n }\n </div>\n </div>\n }\n\n @if (journeyEnabled && includes().userJourney && journey.length > 0) {\n <div hlmCollapsible class=\"border-border rounded-lg border\" data-slot=\"bug-report-journey\" [expanded]=\"showJourney()\" (expandedChange)=\"showJourney.set($event)\">\n <button hlmCollapsibleTrigger type=\"button\" class=\"hover:bg-muted flex w-full items-center justify-between rounded-lg px-3 py-2.5 text-start text-sm font-medium\">\n <span>{{ i18n.t('lt.bug.journeyPreview', { count: journey.length }) }}</span>\n <ng-icon name=\"lucideChevronDown\" class=\"transition-transform duration-200\" aria-hidden=\"true\" [class.rotate-180]=\"showJourney()\" />\n </button>\n <div hlmCollapsibleContent class=\"border-border border-t p-3\">\n <lt-bug-journey-timeline [events]=\"journey\" />\n </div>\n </div>\n }\n</form>\n\n<div hlmDialogFooter>\n <button hlmBtn type=\"button\" variant=\"outline\" data-action=\"cancel\" [disabled]=\"bug.isSubmitting()\" (click)=\"cancel()\">{{ i18n.t('lt.bug.cancel') }}</button>\n <button hlmBtn type=\"submit\" form=\"lt-bug-form\" data-action=\"submit\" [attr.aria-busy]=\"bug.isSubmitting() || null\" [attr.aria-disabled]=\"bug.isSubmitting() || null\">\n @if (bug.isSubmitting()) {\n <hlm-spinner aria-hidden=\"true\" />\n {{ i18n.t('lt.bug.submitting') }}\n } @else {\n {{ i18n.t('lt.bug.submit') }}\n }\n </button>\n</div>\n",
567
+ dependencies: [
568
+ {
569
+ kind: "directive",
570
+ type: FormField,
571
+ selector: "[formField]",
572
+ inputs: ["formField"],
573
+ exportAs: ["formField"]
574
+ },
575
+ {
576
+ kind: "directive",
577
+ type: i1.HlmButton,
578
+ selector: "button[hlmBtn], a[hlmBtn]",
579
+ inputs: ["variant", "size"],
580
+ exportAs: ["hlmBtn"]
581
+ },
582
+ {
583
+ kind: "directive",
584
+ type: i1.HlmCollapsible,
585
+ selector: "[hlmCollapsible],hlm-collapsible",
586
+ exportAs: ["hlmCollapsible"]
587
+ },
588
+ {
589
+ kind: "directive",
590
+ type: i1.HlmCollapsibleContent,
591
+ selector: "[hlmCollapsibleContent],hlm-collapsible-content",
592
+ exportAs: ["hlmCollapsibleContent"]
593
+ },
594
+ {
595
+ kind: "directive",
596
+ type: i1.HlmCollapsibleTrigger,
597
+ selector: "button[hlmCollapsibleTrigger]",
598
+ exportAs: ["hlmCollapsibleTrigger"]
599
+ },
600
+ {
601
+ kind: "directive",
602
+ type: i1.HlmDialogDescription,
603
+ selector: "[hlmDialogDescription]",
604
+ exportAs: ["hlmDialogDescription"]
605
+ },
606
+ {
607
+ kind: "directive",
608
+ type: i1.HlmDialogFooter,
609
+ selector: "[hlmDialogFooter],hlm-dialog-footer",
610
+ exportAs: ["hlmDialogFooter"]
611
+ },
612
+ {
613
+ kind: "directive",
614
+ type: i1.HlmDialogHeader,
615
+ selector: "[hlmDialogHeader],hlm-dialog-header",
616
+ exportAs: ["hlmDialogHeader"]
617
+ },
618
+ {
619
+ kind: "directive",
620
+ type: i1.HlmDialogTitle,
621
+ selector: "[hlmDialogTitle]",
622
+ exportAs: ["hlmDialogTitle"]
623
+ },
624
+ {
625
+ kind: "component",
626
+ type: i1.HlmSpinner,
627
+ selector: "hlm-spinner",
628
+ inputs: ["icon", "aria-label"],
629
+ exportAs: ["hlmSpinner"]
630
+ },
631
+ {
632
+ kind: "component",
633
+ type: i1.HlmSwitch,
634
+ selector: "hlm-switch",
635
+ inputs: [
636
+ "class",
637
+ "checked",
638
+ "disabled",
639
+ "size",
640
+ "inputId",
641
+ "forceInvalid",
642
+ "aria-label",
643
+ "aria-labelledby",
644
+ "aria-describedby"
645
+ ],
646
+ outputs: ["checkedChange"],
647
+ exportAs: ["hlmSwitch"]
648
+ },
649
+ {
650
+ kind: "directive",
651
+ type: i1.HlmTextarea,
652
+ selector: "[hlmTextarea]",
653
+ exportAs: ["hlmTextarea"]
654
+ },
655
+ {
656
+ kind: "component",
657
+ type: LtBugAttachments,
658
+ selector: "lt-bug-attachments",
659
+ inputs: [
660
+ "accept",
661
+ "attachments",
662
+ "disabled",
663
+ "maxFiles",
664
+ "maxFileSize"
665
+ ],
666
+ outputs: ["added", "removed"]
667
+ },
668
+ {
669
+ kind: "component",
670
+ type: LtBugJourneyTimeline,
671
+ selector: "lt-bug-journey-timeline",
672
+ inputs: ["events"]
673
+ },
674
+ {
675
+ kind: "component",
676
+ type: LtFormField,
677
+ selector: "lt-form-field",
678
+ inputs: [
679
+ "describedBy",
680
+ "error",
681
+ "for",
682
+ "hint",
683
+ "label",
684
+ "required"
685
+ ]
686
+ },
687
+ {
688
+ kind: "component",
689
+ type: LtNotice,
690
+ selector: "lt-notice",
691
+ inputs: ["title", "variant"]
692
+ },
693
+ {
694
+ kind: "component",
695
+ type: LtSelect,
696
+ selector: "lt-select",
697
+ inputs: [
698
+ "compareWith",
699
+ "disabled",
700
+ "id",
701
+ "invalid",
702
+ "label",
703
+ "options",
704
+ "placeholder",
705
+ "searchable",
706
+ "touched",
707
+ "value"
708
+ ],
709
+ outputs: ["valueChange", "touch"]
710
+ },
711
+ {
712
+ kind: "component",
713
+ type: LtTextField,
714
+ selector: "lt-text-field",
715
+ inputs: [
716
+ "autocomplete",
717
+ "disabled",
718
+ "error",
719
+ "errors",
720
+ "hint",
721
+ "id",
722
+ "invalid",
723
+ "label",
724
+ "maxLength",
725
+ "minLength",
726
+ "name",
727
+ "placeholder",
728
+ "prefix",
729
+ "readonly",
730
+ "required",
731
+ "touched",
732
+ "type",
733
+ "unit",
734
+ "value"
735
+ ],
736
+ outputs: [
737
+ "valueChange",
738
+ "enter",
739
+ "touch"
740
+ ]
741
+ },
742
+ {
743
+ kind: "component",
744
+ type: NgIcon,
745
+ selector: "ng-icon",
746
+ inputs: [
747
+ "name",
748
+ "svg",
749
+ "size",
750
+ "strokeWidth",
751
+ "color"
752
+ ]
753
+ }
754
+ ]
755
+ });
756
+ };
757
+ i0.ɵɵngDeclareClassMetadata({
758
+ minVersion: "12.0.0",
759
+ version: "22.2.4",
760
+ ngImport: i0,
761
+ type: LtBugReportDialog,
762
+ decorators: [{
763
+ type: Component,
764
+ args: [{
765
+ selector: "lt-bug-report-dialog",
766
+ imports: [
767
+ FormField,
768
+ HlmButtonImports,
769
+ HlmCollapsibleImports,
770
+ HlmDialogImports,
771
+ HlmSpinnerImports,
772
+ HlmSwitchImports,
773
+ HlmTextareaImports,
774
+ LtBugAttachments,
775
+ LtBugJourneyTimeline,
776
+ LtFormField,
777
+ LtNotice,
778
+ LtSelect,
779
+ LtTextField,
780
+ NgIcon
781
+ ],
782
+ providers: [provideIcons({
783
+ lucideChevronDown,
784
+ lucideX
785
+ })],
786
+ host: {
787
+ "data-lt-bug-ui": "",
788
+ class: "grid min-w-0 gap-6"
789
+ },
790
+ template: "<div hlmDialogHeader>\n <h2 hlmDialogTitle>{{ i18n.t('lt.bug.dialogTitle') }}</h2>\n <p hlmDialogDescription>{{ i18n.t('lt.bug.dialogDescription') }}</p>\n</div>\n\n<form id=\"lt-bug-form\" class=\"flex min-w-0 flex-col gap-4\" novalidate data-slot=\"bug-report-form\" (submit)=\"onSubmit($event)\">\n @if (bug.error(); as message) {\n <lt-notice variant=\"error\" data-slot=\"bug-report-error\">\n <div class=\"flex items-start justify-between gap-3\">\n <span>{{ message }}</span>\n <button hlmBtn type=\"button\" variant=\"ghost\" size=\"icon-sm\" class=\"-my-1 shrink-0\" [attr.aria-label]=\"i18n.t('lt.bug.dismissError')\" (click)=\"bug.error.set(null)\">\n <ng-icon name=\"lucideX\" aria-hidden=\"true\" />\n </button>\n </div>\n </lt-notice>\n }\n\n <lt-text-field id=\"lt-bug-title\" [label]=\"i18n.t('lt.bug.title')\" [placeholder]=\"i18n.t('lt.bug.titlePlaceholder')\" [formField]=\"reportForm.title\" />\n\n <lt-form-field for=\"lt-bug-type\" [label]=\"i18n.t('lt.bug.type')\" [required]=\"true\" [error]=\"typeError()\">\n <lt-select id=\"lt-bug-type\" [options]=\"typeOptions()\" [placeholder]=\"i18n.t('lt.bug.typePlaceholder')\" [formField]=\"reportForm.type\" />\n </lt-form-field>\n\n <lt-form-field for=\"lt-bug-description\" [label]=\"i18n.t('lt.bug.description')\" [required]=\"true\" [error]=\"descriptionError()\">\n <textarea\n hlmTextarea\n id=\"lt-bug-description\"\n rows=\"4\"\n class=\"max-h-64\"\n [placeholder]=\"i18n.t('lt.bug.descriptionPlaceholder')\"\n [forceInvalid]=\"!!descriptionError()\"\n [formField]=\"reportForm.description\"\n ></textarea>\n </lt-form-field>\n\n <lt-form-field for=\"lt-bug-expected\" [label]=\"i18n.t('lt.bug.expectedBehavior')\">\n <textarea\n hlmTextarea\n id=\"lt-bug-expected\"\n rows=\"3\"\n class=\"max-h-48\"\n [placeholder]=\"i18n.t('lt.bug.expectedBehaviorPlaceholder')\"\n [formField]=\"reportForm.expectedBehavior\"\n ></textarea>\n </lt-form-field>\n\n <lt-form-field for=\"lt-bug-steps\" [label]=\"i18n.t('lt.bug.stepsToReproduce')\">\n <textarea\n hlmTextarea\n id=\"lt-bug-steps\"\n rows=\"3\"\n class=\"max-h-48\"\n [placeholder]=\"i18n.t('lt.bug.stepsToReproducePlaceholder')\"\n [formField]=\"reportForm.stepsToReproduce\"\n ></textarea>\n </lt-form-field>\n\n <section class=\"flex flex-col gap-2\" aria-labelledby=\"lt-bug-attachments-title\" data-slot=\"bug-report-attachments\">\n <h3 id=\"lt-bug-attachments-title\" class=\"text-sm font-medium\">\n {{ i18n.t('lt.bug.attachments') }}\n @if (hasScreenshot()) {\n <span class=\"text-muted-foreground ms-2 text-xs font-normal\">{{ i18n.t('lt.bug.screenshotCaptured') }}</span>\n }\n </h3>\n <lt-bug-attachments [attachments]=\"attachments()\" [disabled]=\"bug.isSubmitting()\" (added)=\"addAttachments($event)\" (removed)=\"removeAttachment($event)\" />\n </section>\n\n @if (options.enableBrowserInfo || options.enableConsoleLogs || options.enableNetworkRequests || journeyEnabled) {\n <div hlmCollapsible class=\"border-border rounded-lg border\" data-slot=\"bug-report-additional\" [expanded]=\"showAdditional()\" (expandedChange)=\"showAdditional.set($event)\">\n <button hlmCollapsibleTrigger type=\"button\" class=\"hover:bg-muted flex w-full items-center justify-between rounded-lg px-3 py-2.5 text-start text-sm font-medium\">\n <span>{{ i18n.t('lt.bug.additionalInfo') }}</span>\n <ng-icon name=\"lucideChevronDown\" class=\"transition-transform duration-200\" aria-hidden=\"true\" [class.rotate-180]=\"showAdditional()\" />\n </button>\n <div hlmCollapsibleContent class=\"border-border flex flex-col gap-3 border-t p-3\">\n @if (options.enableBrowserInfo) {\n <div class=\"flex items-center justify-between gap-3\">\n <div class=\"flex min-w-0 flex-col\">\n <span id=\"lt-bug-include-browser-label\" class=\"text-sm font-medium\">{{ i18n.t('lt.bug.browserInfo') }}</span>\n <span id=\"lt-bug-include-browser-hint\" class=\"text-muted-foreground text-xs\">{{ i18n.t('lt.bug.browserInfoHint') }}</span>\n </div>\n <hlm-switch\n inputId=\"lt-bug-include-browser\"\n aria-labelledby=\"lt-bug-include-browser-label\"\n aria-describedby=\"lt-bug-include-browser-hint\"\n [checked]=\"includes().browserInfo\"\n [disabled]=\"bug.isSubmitting()\"\n (checkedChange)=\"setInclude('browserInfo', $event)\"\n />\n </div>\n }\n @if (options.enableConsoleLogs) {\n <div class=\"flex items-center justify-between gap-3\">\n <div class=\"flex min-w-0 flex-col\">\n <span id=\"lt-bug-include-console-label\" class=\"text-sm font-medium\">{{ i18n.t('lt.bug.consoleLogs') }}</span>\n <span id=\"lt-bug-include-console-hint\" class=\"text-muted-foreground text-xs\">{{ i18n.t('lt.bug.consoleLogsHint', { count: consoleCount }) }}</span>\n </div>\n <hlm-switch\n inputId=\"lt-bug-include-console\"\n aria-labelledby=\"lt-bug-include-console-label\"\n aria-describedby=\"lt-bug-include-console-hint\"\n [checked]=\"includes().consoleLogs\"\n [disabled]=\"bug.isSubmitting()\"\n (checkedChange)=\"setInclude('consoleLogs', $event)\"\n />\n </div>\n }\n @if (options.enableNetworkRequests) {\n <div class=\"flex items-center justify-between gap-3\">\n <div class=\"flex min-w-0 flex-col\">\n <span id=\"lt-bug-include-network-label\" class=\"text-sm font-medium\">{{ i18n.t('lt.bug.networkRequests') }}</span>\n <span id=\"lt-bug-include-network-hint\" class=\"text-muted-foreground text-xs\">{{ i18n.t('lt.bug.networkRequestsHint', { count: networkCount }) }}</span>\n </div>\n <hlm-switch\n inputId=\"lt-bug-include-network\"\n aria-labelledby=\"lt-bug-include-network-label\"\n aria-describedby=\"lt-bug-include-network-hint\"\n [checked]=\"includes().networkRequests\"\n [disabled]=\"bug.isSubmitting()\"\n (checkedChange)=\"setInclude('networkRequests', $event)\"\n />\n </div>\n }\n @if (journeyEnabled) {\n <div class=\"flex items-center justify-between gap-3\">\n <div class=\"flex min-w-0 flex-col\">\n <span id=\"lt-bug-include-journey-label\" class=\"text-sm font-medium\">{{ i18n.t('lt.bug.userJourney') }}</span>\n <span id=\"lt-bug-include-journey-hint\" class=\"text-muted-foreground text-xs\">{{ i18n.t('lt.bug.userJourneyHint', { count: journey.length }) }}</span>\n </div>\n <hlm-switch\n inputId=\"lt-bug-include-journey\"\n aria-labelledby=\"lt-bug-include-journey-label\"\n aria-describedby=\"lt-bug-include-journey-hint\"\n [checked]=\"includes().userJourney\"\n [disabled]=\"bug.isSubmitting()\"\n (checkedChange)=\"setInclude('userJourney', $event)\"\n />\n </div>\n }\n </div>\n </div>\n }\n\n @if (journeyEnabled && includes().userJourney && journey.length > 0) {\n <div hlmCollapsible class=\"border-border rounded-lg border\" data-slot=\"bug-report-journey\" [expanded]=\"showJourney()\" (expandedChange)=\"showJourney.set($event)\">\n <button hlmCollapsibleTrigger type=\"button\" class=\"hover:bg-muted flex w-full items-center justify-between rounded-lg px-3 py-2.5 text-start text-sm font-medium\">\n <span>{{ i18n.t('lt.bug.journeyPreview', { count: journey.length }) }}</span>\n <ng-icon name=\"lucideChevronDown\" class=\"transition-transform duration-200\" aria-hidden=\"true\" [class.rotate-180]=\"showJourney()\" />\n </button>\n <div hlmCollapsibleContent class=\"border-border border-t p-3\">\n <lt-bug-journey-timeline [events]=\"journey\" />\n </div>\n </div>\n }\n</form>\n\n<div hlmDialogFooter>\n <button hlmBtn type=\"button\" variant=\"outline\" data-action=\"cancel\" [disabled]=\"bug.isSubmitting()\" (click)=\"cancel()\">{{ i18n.t('lt.bug.cancel') }}</button>\n <button hlmBtn type=\"submit\" form=\"lt-bug-form\" data-action=\"submit\" [attr.aria-busy]=\"bug.isSubmitting() || null\" [attr.aria-disabled]=\"bug.isSubmitting() || null\">\n @if (bug.isSubmitting()) {\n <hlm-spinner aria-hidden=\"true\" />\n {{ i18n.t('lt.bug.submitting') }}\n } @else {\n {{ i18n.t('lt.bug.submit') }}\n }\n </button>\n</div>\n"
791
+ }]
792
+ }]
793
+ });
794
+ function openLtBugReportDialog(injector) {
795
+ return injector.get(LtOverlayService).open(LtBugReportDialog, { contentClass: "sm:max-w-2xl" });
796
+ }
797
+ function registered(i18n, appMessages) {
798
+ registerLtBugMessages(i18n, appMessages);
799
+ return i18n;
800
+ }
801
+ function initialForm(error) {
802
+ return error ? {
803
+ ...emptyLtBugReportForm(),
804
+ ...ltBugPrefillFromError(error)
805
+ } : emptyLtBugReportForm();
806
+ }
807
+ function initialAttachments(screenshot) {
808
+ if (!screenshot) return [];
809
+ return [{
810
+ data: screenshot,
811
+ id: `screenshot-${Date.now()}`,
812
+ isScreenshot: true,
813
+ name: "screenshot.png",
814
+ preview: screenshot,
815
+ size: ltDataUrlSize(screenshot),
816
+ type: "image/png"
817
+ }];
818
+ }
819
+ function fieldError(field) {
820
+ const state = field();
821
+ return state.invalid() && state.touched() ? state.errors().find((error) => !!error.message)?.message ?? null : null;
822
+ }
823
+ export { openLtBugReportDialog };
824
+
825
+ //# sourceMappingURL=lenne.tech-ng-base-bug-bug-report-dialog-BRzVmKJr.mjs.map