@lenne.tech/ng-base 18.1.2 → 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 -902
  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 -109
  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 -50
  416. package/src/services/theme.service.d.ts +0 -17
@@ -0,0 +1,287 @@
1
+ import { DOCUMENT, isPlatformBrowser } from "@angular/common";
2
+ import * as i0 from "@angular/core";
3
+ import { PLATFORM_ID, Service, inject, signal } from "@angular/core";
4
+ import { Meta, Title } from "@angular/platform-browser";
5
+ import { LT_RUNTIME_CONFIG } from "@lenne.tech/ng-base";
6
+ function ltFirstInvalidControl(root = globalThis.document) {
7
+ return root?.querySelector("[aria-invalid=\"true\"], input:invalid, select:invalid, textarea:invalid") ?? null;
8
+ }
9
+ function ltFocusFirstInvalid(root, options = {}) {
10
+ const control = ltFirstInvalidControl(root);
11
+ if (!control) return false;
12
+ const view = control.ownerDocument.defaultView;
13
+ const top = control.getBoundingClientRect().top + (view?.scrollY ?? 0) - (options.offset ?? 96);
14
+ view?.scrollTo({
15
+ behavior: view.matchMedia?.("(prefers-reduced-motion: reduce)").matches ? "auto" : "smooth",
16
+ top: Math.max(0, top)
17
+ });
18
+ control.focus({ preventScroll: true });
19
+ return true;
20
+ }
21
+ const ISO_DATE = /^\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?$/;
22
+ function ltMap(source, target, options = {}) {
23
+ if (!source || typeof source !== "object" || Array.isArray(source)) return target;
24
+ const values = source;
25
+ for (const key of Object.keys(target)) {
26
+ const value = values[key];
27
+ if (value === void 0 || typeof value === "function" && !options.funcAllowed) continue;
28
+ target[key] = (options.dateStringToDate === true || Array.isArray(options.dateStringToDate) && options.dateStringToDate.includes(key)) && typeof value === "string" && ISO_DATE.test(value) ? new Date(value) : value;
29
+ }
30
+ return target;
31
+ }
32
+ function ltIsEqual(a, b) {
33
+ if (a === b) return true;
34
+ if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
35
+ if (typeof a !== "object" || typeof b !== "object" || a === null || b === null || Array.isArray(a) !== Array.isArray(b)) return false;
36
+ const keys = (value) => Object.keys(value).filter((key) => typeof value[key] !== "function");
37
+ const keysA = keys(a);
38
+ const keysB = keys(b);
39
+ return keysA.length === keysB.length && keysA.every((key) => ltIsEqual(a[key], b[key]));
40
+ }
41
+ function ltGetDiff(a, b) {
42
+ const result = {};
43
+ for (const [key, value] of Object.entries(a)) if (typeof value !== "function" && !ltIsEqual(value, b[key])) result[key] = value;
44
+ return result;
45
+ }
46
+ var LtStandard = class {
47
+ static map(data, options) {
48
+ return ltMap(data, new this(), options);
49
+ }
50
+ static maps(data, options) {
51
+ return (Array.isArray(data) ? data : data ? [data] : []).map((item) => ltMap(item, new this(), options));
52
+ }
53
+ map(data, options) {
54
+ return ltMap(data, this, options);
55
+ }
56
+ clone(changes) {
57
+ const copy = Object.assign(Object.create(Object.getPrototypeOf(this)), structuredClone(Object.fromEntries(Object.entries(this))));
58
+ return changes ? Object.assign(copy, changes) : copy;
59
+ }
60
+ getDiff(compare) {
61
+ return ltGetDiff(this, compare);
62
+ }
63
+ };
64
+ function ltSlug(value) {
65
+ return String(value ?? "").trim().toLowerCase().replace(/ä/g, "ae").replace(/ö/g, "oe").replace(/ü/g, "ue").replace(/ß/g, "ss").normalize("NFKD").replace(/[̀-ͯ]/g, "").replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "").replace(/-{2,}/g, "-").replace(/^-|-$/g, "");
66
+ }
67
+ function ltUid(length = 24) {
68
+ const bytes = new Uint8Array(Math.ceil(length / 2));
69
+ crypto.getRandomValues(bytes);
70
+ return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("").slice(0, length);
71
+ }
72
+ function ltDelay(ms) {
73
+ return new Promise((resolve) => setTimeout(resolve, ms));
74
+ }
75
+ function ltDeepFreeze(value, seen = /* @__PURE__ */ new WeakSet()) {
76
+ if (value && typeof value === "object" && !seen.has(value)) {
77
+ seen.add(value);
78
+ for (const child of Object.values(value)) ltDeepFreeze(child, seen);
79
+ Object.freeze(value);
80
+ }
81
+ return value;
82
+ }
83
+ var LtScrollService = class LtScrollService {
84
+ document = inject(DOCUMENT);
85
+ isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
86
+ scrollTo(target, options = {}) {
87
+ if (!this.isBrowser) return false;
88
+ const element = typeof target === "string" ? this.document.getElementById(target.replace(/^#/, "")) : target;
89
+ if (!element) return false;
90
+ const top = element.getBoundingClientRect().top + (this.document.defaultView?.scrollY ?? 0) - (options.offset ?? 0);
91
+ this.document.defaultView?.scrollTo({
92
+ behavior: options.behavior ?? this.defaultBehavior(),
93
+ top: Math.max(0, top)
94
+ });
95
+ if (options.focus && element instanceof HTMLElement) element.focus({ preventScroll: true });
96
+ return true;
97
+ }
98
+ scrollToTop(behavior) {
99
+ if (this.isBrowser) this.document.defaultView?.scrollTo({
100
+ behavior: behavior ?? this.defaultBehavior(),
101
+ top: 0
102
+ });
103
+ }
104
+ defaultBehavior() {
105
+ return this.document.defaultView?.matchMedia?.("(prefers-reduced-motion: reduce)").matches ? "auto" : "smooth";
106
+ }
107
+ static ɵfac = i0.ɵɵngDeclareFactory({
108
+ minVersion: "12.0.0",
109
+ version: "22.2.4",
110
+ ngImport: i0,
111
+ type: LtScrollService,
112
+ deps: [],
113
+ target: i0.ɵɵFactoryTarget.Service
114
+ });
115
+ static ɵprov = i0.ɵɵngDeclareService({
116
+ minVersion: "22.0.0",
117
+ version: "22.2.4",
118
+ ngImport: i0,
119
+ type: LtScrollService
120
+ });
121
+ };
122
+ i0.ɵɵngDeclareClassMetadata({
123
+ minVersion: "12.0.0",
124
+ version: "22.2.4",
125
+ ngImport: i0,
126
+ type: LtScrollService,
127
+ decorators: [{ type: Service }]
128
+ });
129
+ var LtSeoService = class LtSeoService {
130
+ title = inject(Title);
131
+ meta = inject(Meta);
132
+ document = inject(DOCUMENT);
133
+ runtime = inject(LT_RUNTIME_CONFIG, { optional: true });
134
+ set(data) {
135
+ const url = this.absolute(data.url) ?? this.currentUrl();
136
+ const image = this.absolute(data.image);
137
+ this.title.setTitle(data.title);
138
+ this.tag("name", "description", data.description);
139
+ this.tag("name", "keywords", data.keywords);
140
+ this.tag("name", "robots", data.index === false ? "noindex, nofollow" : void 0);
141
+ this.tag("property", "og:title", data.title);
142
+ this.tag("property", "og:description", data.description);
143
+ this.tag("property", "og:type", data.type ?? "website");
144
+ this.tag("property", "og:url", url);
145
+ this.tag("property", "og:image", image);
146
+ this.tag("property", "og:site_name", data.siteName);
147
+ this.tag("property", "og:locale", data.locale);
148
+ this.tag("name", "twitter:card", image ? "summary_large_image" : "summary");
149
+ this.tag("name", "twitter:title", data.title);
150
+ this.tag("name", "twitter:description", data.description);
151
+ this.tag("name", "twitter:image", image);
152
+ this.setCanonical(this.absolute(data.canonical) ?? url);
153
+ }
154
+ setNoIndex() {
155
+ this.tag("name", "robots", "noindex, nofollow");
156
+ }
157
+ setCanonical(url) {
158
+ const head = this.document.head;
159
+ let link = head?.querySelector("link[rel=\"canonical\"]") ?? null;
160
+ if (!url) {
161
+ link?.remove();
162
+ return;
163
+ }
164
+ if (!link && head) {
165
+ link = this.document.createElement("link");
166
+ link.setAttribute("rel", "canonical");
167
+ head.appendChild(link);
168
+ }
169
+ link?.setAttribute("href", url);
170
+ }
171
+ tag(attribute, key, content) {
172
+ if (content) this.meta.updateTag({
173
+ [attribute]: key,
174
+ content
175
+ });
176
+ else this.meta.removeTag(`${attribute}="${key}"`);
177
+ }
178
+ absolute(urlOrPath) {
179
+ if (!urlOrPath) return;
180
+ if (/^[a-z][a-z\d+\-.]*:/i.test(urlOrPath)) return urlOrPath;
181
+ const site = (this.runtime?.siteUrl || this.document.location?.origin || "").replace(/\/+$/, "");
182
+ return site ? `${site}${urlOrPath.startsWith("/") ? "" : "/"}${urlOrPath}` : urlOrPath;
183
+ }
184
+ currentUrl() {
185
+ const location = this.document.location;
186
+ if (!location?.pathname) return;
187
+ return this.absolute(`${location.pathname}${location.search ?? ""}`);
188
+ }
189
+ static ɵfac = i0.ɵɵngDeclareFactory({
190
+ minVersion: "12.0.0",
191
+ version: "22.2.4",
192
+ ngImport: i0,
193
+ type: LtSeoService,
194
+ deps: [],
195
+ target: i0.ɵɵFactoryTarget.Service
196
+ });
197
+ static ɵprov = i0.ɵɵngDeclareService({
198
+ minVersion: "22.0.0",
199
+ version: "22.2.4",
200
+ ngImport: i0,
201
+ type: LtSeoService
202
+ });
203
+ };
204
+ i0.ɵɵngDeclareClassMetadata({
205
+ minVersion: "12.0.0",
206
+ version: "22.2.4",
207
+ ngImport: i0,
208
+ type: LtSeoService,
209
+ decorators: [{ type: Service }]
210
+ });
211
+ var LtStorageService = class LtStorageService {
212
+ isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
213
+ prefix = inject(LT_RUNTIME_CONFIG, { optional: true })?.storagePrefix ?? "";
214
+ save(key, value, type = "local") {
215
+ const storage = this.storage(type);
216
+ if (!storage) return false;
217
+ try {
218
+ storage.setItem(this.key(key), JSON.stringify(value));
219
+ return true;
220
+ } catch {
221
+ return false;
222
+ }
223
+ }
224
+ load(key, fallback, type = "local") {
225
+ const raw = this.storage(type)?.getItem(this.key(key));
226
+ if (raw === null || raw === void 0) return fallback;
227
+ try {
228
+ return JSON.parse(raw);
229
+ } catch {
230
+ return fallback;
231
+ }
232
+ }
233
+ remove(key, type = "local") {
234
+ this.storage(type)?.removeItem(this.key(key));
235
+ }
236
+ clear(type = "local") {
237
+ const storage = this.storage(type);
238
+ if (!storage) return;
239
+ const prefix = this.key("");
240
+ for (const key of Object.keys(storage)) if (key.startsWith(prefix)) storage.removeItem(key);
241
+ }
242
+ signal(key, fallback, type = "local") {
243
+ const state = signal(this.load(key, fallback, type), ...ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []);
244
+ const originalSet = state.set.bind(state);
245
+ state.set = (value) => {
246
+ originalSet(value);
247
+ this.save(key, value, type);
248
+ };
249
+ state.update = (updater) => state.set(updater(state()));
250
+ return state;
251
+ }
252
+ key(key) {
253
+ return this.prefix ? `${this.prefix}_${key}` : key;
254
+ }
255
+ storage(type) {
256
+ if (!this.isBrowser) return null;
257
+ try {
258
+ return type === "session" ? globalThis.sessionStorage : globalThis.localStorage;
259
+ } catch {
260
+ return null;
261
+ }
262
+ }
263
+ static ɵfac = i0.ɵɵngDeclareFactory({
264
+ minVersion: "12.0.0",
265
+ version: "22.2.4",
266
+ ngImport: i0,
267
+ type: LtStorageService,
268
+ deps: [],
269
+ target: i0.ɵɵFactoryTarget.Service
270
+ });
271
+ static ɵprov = i0.ɵɵngDeclareService({
272
+ minVersion: "22.0.0",
273
+ version: "22.2.4",
274
+ ngImport: i0,
275
+ type: LtStorageService
276
+ });
277
+ };
278
+ i0.ɵɵngDeclareClassMetadata({
279
+ minVersion: "12.0.0",
280
+ version: "22.2.4",
281
+ ngImport: i0,
282
+ type: LtStorageService,
283
+ decorators: [{ type: Service }]
284
+ });
285
+ export { LtScrollService, LtSeoService, LtStandard, LtStorageService, ltDeepFreeze, ltDelay, ltFirstInvalidControl, ltFocusFirstInvalid, ltGetDiff, ltIsEqual, ltMap, ltSlug, ltUid };
286
+
287
+ //# sourceMappingURL=lenne.tech-ng-base-utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lenne.tech-ng-base-utils.mjs","names":[],"sources":["../../../projects/ng-base/utils/src/lib/forms.ts","../../../projects/ng-base/utils/src/lib/mapping.ts","../../../projects/ng-base/utils/src/lib/scroll-service.ts","../../../projects/ng-base/utils/src/lib/seo-service.ts","../../../projects/ng-base/utils/src/lib/storage-service.ts"],"sourcesContent":["/**\n * Form helpers that work with Signal Forms, Reactive Forms and plain HTML alike: they look at the rendered DOM\n * (`aria-invalid=\"true\"`, `:invalid`) instead of a form model.\n */\n\n/** The first invalid control inside `root` (default `document`), in DOM order. */\nexport function ltFirstInvalidControl(root: ParentNode | null | undefined = globalThis.document): HTMLElement | null {\n return root?.querySelector<HTMLElement>('[aria-invalid=\"true\"], input:invalid, select:invalid, textarea:invalid') ?? null;\n}\n\n/**\n * Scroll to and focus the first invalid control (call it after a failed submit). Returns whether one was found.\n * `offset` keeps it clear of a sticky header.\n */\nexport function ltFocusFirstInvalid(root?: ParentNode | null, options: { offset?: number } = {}): boolean {\n const control = ltFirstInvalidControl(root);\n if (!control) {\n return false;\n }\n const view = control.ownerDocument.defaultView;\n const top = control.getBoundingClientRect().top + (view?.scrollY ?? 0) - (options.offset ?? 96);\n view?.scrollTo({ behavior: view.matchMedia?.('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth', top: Math.max(0, top) });\n control.focus({ preventScroll: true });\n return true;\n}\n","/** Options of {@link ltMap}. */\nexport interface LtMapOptions {\n /** Convert ISO date strings into `Date` (all keys, or only the listed ones). Default `false`. */\n dateStringToDate?: boolean | string[];\n /** Copy function values too (default `false`). */\n funcAllowed?: boolean;\n}\n\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}(?:[T ]\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:?\\d{2})?)?$/;\n\n/**\n * Copy the properties of `source` that exist on `target` (keys of `target` decide, unknown keys are ignored).\n * Ported from ng-base 18 `Helper.map` without its defects (the function check was always true, dates were parsed by\n * default and silently turned any string into an invalid `Date`).\n */\nexport function ltMap<T extends object>(source: unknown, target: T, options: LtMapOptions = {}): T {\n if (!source || typeof source !== 'object' || Array.isArray(source)) {\n return target;\n }\n const values = source as Record<string, unknown>;\n for (const key of Object.keys(target)) {\n const value = values[key];\n if (value === undefined || (typeof value === 'function' && !options.funcAllowed)) {\n continue;\n }\n const convert = options.dateStringToDate === true || (Array.isArray(options.dateStringToDate) && options.dateStringToDate.includes(key));\n (target as Record<string, unknown>)[key] = convert && typeof value === 'string' && ISO_DATE.test(value) ? new Date(value) : value;\n }\n return target;\n}\n\n/** Deep equality of JSON-like values (functions ignored, `Date` compared by time). */\nexport function ltIsEqual(a: unknown, b: unknown): boolean {\n if (a === b) {\n return true;\n }\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null || Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n const keys = (value: object) => Object.keys(value).filter((key) => typeof (value as Record<string, unknown>)[key] !== 'function');\n const keysA = keys(a);\n const keysB = keys(b);\n return keysA.length === keysB.length && keysA.every((key) => ltIsEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]));\n}\n\n/** First-level properties of `a` that differ from `b` (changed arrays/objects are returned as a whole). */\nexport function ltGetDiff<T extends object>(a: T, b: Partial<T> | Record<string, unknown>): Partial<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(a)) {\n if (typeof value !== 'function' && !ltIsEqual(value, (b as Record<string, unknown>)[key])) {\n result[key] = value;\n }\n }\n return result as Partial<T>;\n}\n\n/**\n * Base class for client-side models with `map`, `clone` and `getDiff` (the `Standard` idea of ng-base 18). Declare\n * the properties with initial values (`id = ''`), only declared keys are mapped.\n *\n * @example\n * class Contact extends LtStandard { id = ''; name = ''; createdAt?: Date = undefined; }\n * const contact = Contact.map({ id: '1', name: 'Ada', role: 'ignored' });\n */\nexport class LtStandard {\n /** Create an instance and map `data` onto it. */\n static map<T extends LtStandard>(this: new () => T, data: unknown, options?: LtMapOptions): T {\n return ltMap(data, new this(), options);\n }\n\n /** Map an array (or one item) of plain objects. */\n static maps<T extends LtStandard>(this: new () => T, data: unknown, options?: LtMapOptions): T[] {\n const items = Array.isArray(data) ? data : data ? [data] : [];\n return items.map((item) => ltMap(item, new this(), options));\n }\n\n /** Map `data` onto this instance. */\n map(data: unknown, options?: LtMapOptions): this {\n return ltMap(data, this, options);\n }\n\n /** Deep copy (structuredClone), optionally with changes. */\n clone(changes?: Partial<this>): this {\n const copy = Object.assign(Object.create(Object.getPrototypeOf(this)) as this, structuredClone(Object.fromEntries(Object.entries(this))));\n return changes ? Object.assign(copy, changes) : copy;\n }\n\n /** First-level properties that differ from `compare`. */\n getDiff(compare: Record<string, unknown>): Partial<this> {\n return ltGetDiff(this, compare);\n }\n}\n\n/**\n * URL slug: lower case, umlauts transliterated (`ä` → `ae`, `ß` → `ss`), whitespace → `-`, other characters removed,\n * repeated hyphens collapsed.\n */\nexport function ltSlug(value: unknown): string {\n return String(value ?? '')\n .trim()\n .toLowerCase()\n .replace(/ä/g, 'ae')\n .replace(/ö/g, 'oe')\n .replace(/ü/g, 'ue')\n .replace(/ß/g, 'ss')\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .replace(/-{2,}/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/** Random id of hex characters (default 24, like a MongoDB ObjectId). */\nexport function ltUid(length = 24): string {\n const bytes = new Uint8Array(Math.ceil(length / 2));\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0'))\n .join('')\n .slice(0, length);\n}\n\n/** Promise that resolves after `ms` milliseconds. */\nexport function ltDelay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Recursively freeze an object (cycle-safe). */\nexport function ltDeepFreeze<T>(value: T, seen = new WeakSet<object>()): Readonly<T> {\n if (value && typeof value === 'object' && !seen.has(value)) {\n seen.add(value);\n for (const child of Object.values(value)) {\n ltDeepFreeze(child, seen);\n }\n Object.freeze(value);\n }\n return value;\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { inject, PLATFORM_ID, Service } from '@angular/core';\n\n/** Options of {@link LtScrollService.scrollTo}. */\nexport interface LtScrollOptions {\n /** Scroll behaviour (default `smooth`, `auto` when the user prefers reduced motion). */\n behavior?: ScrollBehavior;\n /** Focus the target after scrolling (default `false`). */\n focus?: boolean;\n /** Offset in pixels above the target, e.g. for a sticky header (default `0`). */\n offset?: number;\n}\n\n/** Scrolling helpers (browser only, no-ops on the server). */\n@Service()\nexport class LtScrollService {\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Scroll to an element (id or element). Returns `false` when it does not exist. */\n scrollTo(target: string | Element, options: LtScrollOptions = {}): boolean {\n if (!this.isBrowser) {\n return false;\n }\n const element = typeof target === 'string' ? this.document.getElementById(target.replace(/^#/, '')) : target;\n if (!element) {\n return false;\n }\n const top = element.getBoundingClientRect().top + (this.document.defaultView?.scrollY ?? 0) - (options.offset ?? 0);\n this.document.defaultView?.scrollTo({ behavior: options.behavior ?? this.defaultBehavior(), top: Math.max(0, top) });\n if (options.focus && element instanceof HTMLElement) {\n element.focus({ preventScroll: true });\n }\n return true;\n }\n\n /** Scroll to the top of the page. */\n scrollToTop(behavior?: ScrollBehavior): void {\n if (this.isBrowser) {\n this.document.defaultView?.scrollTo({ behavior: behavior ?? this.defaultBehavior(), top: 0 });\n }\n }\n\n private defaultBehavior(): ScrollBehavior {\n return this.document.defaultView?.matchMedia?.('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth';\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Service } from '@angular/core';\nimport { Meta, Title } from '@angular/platform-browser';\nimport { LT_RUNTIME_CONFIG } from '@lenne.tech/ng-base';\n\n/** SEO data of a page. */\nexport interface LtSeoData {\n /** Canonical URL (absolute, or a path resolved against `NG_PUBLIC_SITE_URL`). Default: `url`. */\n canonical?: string;\n description?: string;\n /** Social image (absolute URL, or a path resolved against the site URL). */\n image?: string;\n keywords?: string;\n /** Locale for `og:locale`, e.g. `de_DE`. */\n locale?: string;\n /** `false` adds `noindex, nofollow`. Default `true`. */\n index?: boolean;\n /** Site name for `og:site_name`. */\n siteName?: string;\n title: string;\n /** `og:type` (default `website`). */\n type?: string;\n /** Page URL (absolute, or a path resolved against the site URL). Default: the current URL. */\n url?: string;\n}\n\n/**\n * Title, description, Open Graph, Twitter and robots meta tags, plus the canonical link (SSR-safe: tags are rendered\n * on the server). Ported from ng-base 18 (`SEOService`, fixed 2026-11-03) and extended by canonical, robots and\n * site-URL resolution.\n */\n@Service()\nexport class LtSeoService {\n private readonly title = inject(Title);\n private readonly meta = inject(Meta);\n private readonly document = inject(DOCUMENT);\n private readonly runtime = inject(LT_RUNTIME_CONFIG, { optional: true });\n\n /** Set every tag for a page. Tags of an earlier page that `data` leaves out are removed. */\n set(data: LtSeoData): void {\n const url = this.absolute(data.url) ?? this.currentUrl();\n const image = this.absolute(data.image);\n this.title.setTitle(data.title);\n this.tag('name', 'description', data.description);\n this.tag('name', 'keywords', data.keywords);\n this.tag('name', 'robots', data.index === false ? 'noindex, nofollow' : undefined);\n this.tag('property', 'og:title', data.title);\n this.tag('property', 'og:description', data.description);\n this.tag('property', 'og:type', data.type ?? 'website');\n this.tag('property', 'og:url', url);\n this.tag('property', 'og:image', image);\n this.tag('property', 'og:site_name', data.siteName);\n this.tag('property', 'og:locale', data.locale);\n this.tag('name', 'twitter:card', image ? 'summary_large_image' : 'summary');\n this.tag('name', 'twitter:title', data.title);\n this.tag('name', 'twitter:description', data.description);\n this.tag('name', 'twitter:image', image);\n this.setCanonical(this.absolute(data.canonical) ?? url);\n }\n\n /** Mark the page as not indexable (`noindex, nofollow`). */\n setNoIndex(): void {\n this.tag('name', 'robots', 'noindex, nofollow');\n }\n\n /** Set or remove `<link rel=\"canonical\">`. */\n setCanonical(url: string | undefined): void {\n const head = this.document.head;\n let link = head?.querySelector<HTMLLinkElement>('link[rel=\"canonical\"]') ?? null;\n if (!url) {\n link?.remove();\n return;\n }\n if (!link && head) {\n link = this.document.createElement('link');\n link.setAttribute('rel', 'canonical');\n head.appendChild(link);\n }\n link?.setAttribute('href', url);\n }\n\n private tag(attribute: 'name' | 'property', key: string, content: string | undefined): void {\n if (content) {\n this.meta.updateTag({ [attribute]: key, content });\n } else {\n this.meta.removeTag(`${attribute}=\"${key}\"`);\n }\n }\n\n private absolute(urlOrPath: string | undefined): string | undefined {\n if (!urlOrPath) {\n return undefined;\n }\n if (/^[a-z][a-z\\d+\\-.]*:/i.test(urlOrPath)) {\n return urlOrPath;\n }\n const site = (this.runtime?.siteUrl || this.document.location?.origin || '').replace(/\\/+$/, '');\n return site ? `${site}${urlOrPath.startsWith('/') ? '' : '/'}${urlOrPath}` : urlOrPath;\n }\n\n private currentUrl(): string | undefined {\n const location = this.document.location;\n if (!location?.pathname) {\n return undefined;\n }\n return this.absolute(`${location.pathname}${location.search ?? ''}`);\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { inject, PLATFORM_ID, Service, signal, type WritableSignal } from '@angular/core';\nimport { LT_RUNTIME_CONFIG } from '@lenne.tech/ng-base';\n\n/**\n * JSON values in `localStorage` (or `sessionStorage`) under the project prefix (`NG_PUBLIC_STORAGE_PREFIX` →\n * `<prefix>_<key>`). SSR-safe: on the server every read returns the fallback and writes are ignored.\n */\n@Service()\nexport class LtStorageService {\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly prefix = inject(LT_RUNTIME_CONFIG, { optional: true })?.storagePrefix ?? '';\n\n /** Store a JSON-serialisable value. Returns `false` when no storage is available or it is full. */\n save(key: string, value: unknown, type: 'local' | 'session' = 'local'): boolean {\n const storage = this.storage(type);\n if (!storage) {\n return false;\n }\n try {\n storage.setItem(this.key(key), JSON.stringify(value));\n return true;\n } catch {\n return false;\n }\n }\n\n /** Load a value (`fallback` when missing, unparsable or on the server). */\n load<T>(key: string, fallback: T, type?: 'local' | 'session'): T;\n load<T>(key: string, fallback?: T, type?: 'local' | 'session'): T | undefined;\n load<T>(key: string, fallback?: T, type: 'local' | 'session' = 'local'): T | undefined {\n const raw = this.storage(type)?.getItem(this.key(key));\n if (raw === null || raw === undefined) {\n return fallback;\n }\n try {\n return JSON.parse(raw) as T;\n } catch {\n return fallback;\n }\n }\n\n /** Remove a value. */\n remove(key: string, type: 'local' | 'session' = 'local'): void {\n this.storage(type)?.removeItem(this.key(key));\n }\n\n /** Remove every value under the project prefix. */\n clear(type: 'local' | 'session' = 'local'): void {\n const storage = this.storage(type);\n if (!storage) {\n return;\n }\n const prefix = this.key('');\n for (const key of Object.keys(storage)) {\n if (key.startsWith(prefix)) {\n storage.removeItem(key);\n }\n }\n }\n\n /** A writable signal persisted under `key` (initial value from storage, every `set` saved). */\n signal<T>(key: string, fallback: T, type: 'local' | 'session' = 'local'): WritableSignal<T> {\n const state = signal<T>(this.load(key, fallback, type));\n const originalSet = state.set.bind(state);\n state.set = (value: T) => {\n originalSet(value);\n this.save(key, value, type);\n };\n state.update = (updater: (value: T) => T) => state.set(updater(state()));\n return state;\n }\n\n private key(key: string): string {\n return this.prefix ? `${this.prefix}_${key}` : key;\n }\n\n private storage(type: 'local' | 'session'): Storage | null {\n if (!this.isBrowser) {\n return null;\n }\n try {\n return type === 'session' ? globalThis.sessionStorage : globalThis.localStorage;\n } catch {\n return null;\n }\n }\n}\n"],"mappings":"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"}