@lucca-front/ng 22.1.0-rc.4 → 22.1.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 (238) hide show
  1. package/README.md +6 -0
  2. package/fesm2022/lucca-front-ng-a11y.mjs +9 -9
  3. package/fesm2022/lucca-front-ng-activity-feed.mjs +19 -15
  4. package/fesm2022/lucca-front-ng-activity-feed.mjs.map +1 -1
  5. package/fesm2022/lucca-front-ng-api.mjs +40 -40
  6. package/fesm2022/lucca-front-ng-app-layout.mjs +3 -3
  7. package/fesm2022/lucca-front-ng-approbation-inbox.mjs +78 -56
  8. package/fesm2022/lucca-front-ng-approbation-inbox.mjs.map +1 -1
  9. package/fesm2022/lucca-front-ng-box.mjs +3 -3
  10. package/fesm2022/lucca-front-ng-breadcrumbs.mjs +6 -6
  11. package/fesm2022/lucca-front-ng-bubble-icon.mjs +12 -7
  12. package/fesm2022/lucca-front-ng-bubble-icon.mjs.map +1 -1
  13. package/fesm2022/lucca-front-ng-bubble-illustration.mjs +3 -3
  14. package/fesm2022/lucca-front-ng-callout.mjs +24 -24
  15. package/fesm2022/lucca-front-ng-chip.mjs +4 -4
  16. package/fesm2022/lucca-front-ng-chip.mjs.map +1 -1
  17. package/fesm2022/lucca-front-ng-clear.mjs +4 -4
  18. package/fesm2022/lucca-front-ng-clear.mjs.map +1 -1
  19. package/fesm2022/lucca-front-ng-code.mjs +3 -3
  20. package/fesm2022/lucca-front-ng-color.mjs +3 -3
  21. package/fesm2022/lucca-front-ng-comment.mjs +12 -12
  22. package/fesm2022/lucca-front-ng-comment.mjs.map +1 -1
  23. package/fesm2022/lucca-front-ng-container.mjs +3 -3
  24. package/fesm2022/lucca-front-ng-core-select-api.mjs +9 -9
  25. package/fesm2022/lucca-front-ng-core-select-department.mjs +8 -6
  26. package/fesm2022/lucca-front-ng-core-select-department.mjs.map +1 -1
  27. package/fesm2022/lucca-front-ng-core-select-establishment.mjs +11 -9
  28. package/fesm2022/lucca-front-ng-core-select-establishment.mjs.map +1 -1
  29. package/fesm2022/lucca-front-ng-core-select-job-qualification.mjs +6 -6
  30. package/fesm2022/lucca-front-ng-core-select-legal-units.mjs +8 -8
  31. package/fesm2022/lucca-front-ng-core-select-legal-units.mjs.map +1 -1
  32. package/fesm2022/lucca-front-ng-core-select-occupation-category.mjs +3 -3
  33. package/fesm2022/lucca-front-ng-core-select-user.mjs +22 -20
  34. package/fesm2022/lucca-front-ng-core-select-user.mjs.map +1 -1
  35. package/fesm2022/lucca-front-ng-core-select.mjs +77 -62
  36. package/fesm2022/lucca-front-ng-core-select.mjs.map +1 -1
  37. package/fesm2022/lucca-front-ng-core.mjs +19 -19
  38. package/fesm2022/lucca-front-ng-data-table.mjs +40 -32
  39. package/fesm2022/lucca-front-ng-data-table.mjs.map +1 -1
  40. package/fesm2022/lucca-front-ng-date.mjs +40 -40
  41. package/fesm2022/lucca-front-ng-date2.mjs +93 -40
  42. package/fesm2022/lucca-front-ng-date2.mjs.map +1 -1
  43. package/fesm2022/lucca-front-ng-department.mjs +24 -24
  44. package/fesm2022/lucca-front-ng-dialog.mjs +56 -48
  45. package/fesm2022/lucca-front-ng-dialog.mjs.map +1 -1
  46. package/fesm2022/lucca-front-ng-divider.mjs +3 -3
  47. package/fesm2022/lucca-front-ng-dropdown.mjs +42 -42
  48. package/fesm2022/lucca-front-ng-dropdown.mjs.map +1 -1
  49. package/fesm2022/lucca-front-ng-empty-state.mjs +9 -9
  50. package/fesm2022/lucca-front-ng-error-page.mjs +3 -3
  51. package/fesm2022/lucca-front-ng-establishment.mjs +33 -33
  52. package/fesm2022/lucca-front-ng-fancy-box.mjs +3 -3
  53. package/fesm2022/lucca-front-ng-file-upload.mjs +33 -26
  54. package/fesm2022/lucca-front-ng-file-upload.mjs.map +1 -1
  55. package/fesm2022/lucca-front-ng-filter-pills-core.mjs +6 -6
  56. package/fesm2022/lucca-front-ng-filter-pills.mjs +90 -21
  57. package/fesm2022/lucca-front-ng-filter-pills.mjs.map +1 -1
  58. package/fesm2022/lucca-front-ng-footer.mjs +3 -3
  59. package/fesm2022/lucca-front-ng-form-field.mjs +24 -20
  60. package/fesm2022/lucca-front-ng-form-field.mjs.map +1 -1
  61. package/fesm2022/lucca-front-ng-form-header.mjs +3 -3
  62. package/fesm2022/lucca-front-ng-form-label.mjs +3 -3
  63. package/fesm2022/lucca-front-ng-form.mjs +3 -3
  64. package/fesm2022/lucca-front-ng-formly.mjs +58 -58
  65. package/fesm2022/lucca-front-ng-forms-phone-number-input.mjs +6 -6
  66. package/fesm2022/lucca-front-ng-forms-rich-text-input-formatters-html.mjs +3 -3
  67. package/fesm2022/lucca-front-ng-forms-rich-text-input-formatters-markdown.mjs +6 -6
  68. package/fesm2022/lucca-front-ng-forms-rich-text-input-formatters-plain-text.mjs +3 -3
  69. package/fesm2022/lucca-front-ng-forms-rich-text-input.mjs +38 -37
  70. package/fesm2022/lucca-front-ng-forms-rich-text-input.mjs.map +1 -1
  71. package/fesm2022/lucca-front-ng-forms.mjs +68 -48
  72. package/fesm2022/lucca-front-ng-forms.mjs.map +1 -1
  73. package/fesm2022/lucca-front-ng-gauge.mjs +3 -3
  74. package/fesm2022/lucca-front-ng-grid.mjs +6 -6
  75. package/fesm2022/lucca-front-ng-highlight-data.mjs +3 -3
  76. package/fesm2022/lucca-front-ng-highlight-section.mjs +6 -3
  77. package/fesm2022/lucca-front-ng-highlight-section.mjs.map +1 -1
  78. package/fesm2022/lucca-front-ng-highlight-text.mjs +3 -3
  79. package/fesm2022/lucca-front-ng-horizontal-navigation.mjs +9 -9
  80. package/fesm2022/lucca-front-ng-impersonation.mjs +5 -3
  81. package/fesm2022/lucca-front-ng-impersonation.mjs.map +1 -1
  82. package/fesm2022/lucca-front-ng-index-table.mjs +44 -38
  83. package/fesm2022/lucca-front-ng-index-table.mjs.map +1 -1
  84. package/fesm2022/lucca-front-ng-inline-message.mjs +3 -3
  85. package/fesm2022/lucca-front-ng-input.mjs +21 -21
  86. package/fesm2022/lucca-front-ng-kbd.mjs +306 -0
  87. package/fesm2022/lucca-front-ng-kbd.mjs.map +1 -0
  88. package/fesm2022/lucca-front-ng-link.mjs +38 -14
  89. package/fesm2022/lucca-front-ng-link.mjs.map +1 -1
  90. package/fesm2022/lucca-front-ng-listbox.mjs +13 -10
  91. package/fesm2022/lucca-front-ng-listbox.mjs.map +1 -1
  92. package/fesm2022/lucca-front-ng-listing.mjs +21 -11
  93. package/fesm2022/lucca-front-ng-listing.mjs.map +1 -1
  94. package/fesm2022/lucca-front-ng-loading.mjs +51 -10
  95. package/fesm2022/lucca-front-ng-loading.mjs.map +1 -1
  96. package/fesm2022/lucca-front-ng-main-layout.mjs +6 -6
  97. package/fesm2022/lucca-front-ng-markdown.mjs +3 -3
  98. package/fesm2022/lucca-front-ng-mobile-push.mjs +3 -3
  99. package/fesm2022/lucca-front-ng-modal.mjs +22 -22
  100. package/fesm2022/lucca-front-ng-multi-select.mjs +42 -42
  101. package/fesm2022/lucca-front-ng-multi-select.mjs.map +1 -1
  102. package/fesm2022/lucca-front-ng-new-badge.mjs +3 -3
  103. package/fesm2022/lucca-front-ng-number-format.mjs +6 -6
  104. package/fesm2022/lucca-front-ng-number.mjs +7 -7
  105. package/fesm2022/lucca-front-ng-option.mjs +130 -130
  106. package/fesm2022/lucca-front-ng-option.mjs.map +1 -1
  107. package/fesm2022/lucca-front-ng-page-header.mjs +3 -3
  108. package/fesm2022/lucca-front-ng-pagination.mjs +3 -3
  109. package/fesm2022/lucca-front-ng-plg-push.mjs +3 -3
  110. package/fesm2022/lucca-front-ng-popover.mjs +17 -17
  111. package/fesm2022/lucca-front-ng-popover2.mjs +54 -21
  112. package/fesm2022/lucca-front-ng-popover2.mjs.map +1 -1
  113. package/fesm2022/lucca-front-ng-popup.mjs +10 -10
  114. package/fesm2022/lucca-front-ng-priority-level.mjs +128 -0
  115. package/fesm2022/lucca-front-ng-priority-level.mjs.map +1 -0
  116. package/fesm2022/lucca-front-ng-progress-bar.mjs +3 -3
  117. package/fesm2022/lucca-front-ng-progress-stepper.mjs +6 -6
  118. package/fesm2022/lucca-front-ng-read-more.mjs +6 -6
  119. package/fesm2022/lucca-front-ng-read-more.mjs.map +1 -1
  120. package/fesm2022/lucca-front-ng-resource-card.mjs +12 -12
  121. package/fesm2022/lucca-front-ng-safe-content.mjs +10 -10
  122. package/fesm2022/lucca-front-ng-scroll-box.mjs +4 -4
  123. package/fesm2022/lucca-front-ng-scroll-box.mjs.map +1 -1
  124. package/fesm2022/lucca-front-ng-scroll.mjs +9 -10
  125. package/fesm2022/lucca-front-ng-scroll.mjs.map +1 -1
  126. package/fesm2022/lucca-front-ng-segmented-control-tabs.mjs +8 -8
  127. package/fesm2022/lucca-front-ng-segmented-control.mjs +8 -8
  128. package/fesm2022/lucca-front-ng-select.mjs +14 -14
  129. package/fesm2022/lucca-front-ng-sidepanel.mjs +7 -7
  130. package/fesm2022/lucca-front-ng-simple-select.mjs +16 -16
  131. package/fesm2022/lucca-front-ng-simple-select.mjs.map +1 -1
  132. package/fesm2022/lucca-front-ng-software-icon-wrapper.mjs +6 -6
  133. package/fesm2022/lucca-front-ng-software-icon.mjs +3 -3
  134. package/fesm2022/lucca-front-ng-sortable-list.mjs +6 -6
  135. package/fesm2022/lucca-front-ng-status-badge.mjs +3 -3
  136. package/fesm2022/lucca-front-ng-table-of-content.mjs +6 -6
  137. package/fesm2022/lucca-front-ng-text-flow.mjs +4 -4
  138. package/fesm2022/lucca-front-ng-text-flow.mjs.map +1 -1
  139. package/fesm2022/lucca-front-ng-time.mjs +18 -18
  140. package/fesm2022/lucca-front-ng-title.mjs +10 -10
  141. package/fesm2022/lucca-front-ng-toast.mjs +10 -10
  142. package/fesm2022/lucca-front-ng-tree-select.mjs +7 -7
  143. package/fesm2022/lucca-front-ng-tree-select.mjs.map +1 -1
  144. package/fesm2022/lucca-front-ng-user-popover.mjs +22 -22
  145. package/fesm2022/lucca-front-ng-user-popover.mjs.map +1 -1
  146. package/fesm2022/lucca-front-ng-user.mjs +68 -61
  147. package/fesm2022/lucca-front-ng-user.mjs.map +1 -1
  148. package/fesm2022/lucca-front-ng-vertical-navigation.mjs +12 -12
  149. package/package.json +23 -10
  150. package/schematics/lib/local-deps/package-lock.json +7 -7
  151. package/schematics/lib/local-deps/package.json +1 -1
  152. package/schematics/lu-button/migration.js +59 -33
  153. package/src/components/_sidepanel.scss +2 -2
  154. package/src/components/cdk/_global.scss +4 -0
  155. package/src/components/cdk/_overlay.scss +1 -1
  156. package/src/definitions/option/_option-item.scss +7 -4
  157. package/types/lucca-front-ng-a11y.d.ts +1 -1
  158. package/types/lucca-front-ng-activity-feed.d.ts +13 -9
  159. package/types/lucca-front-ng-api.d.ts +31 -31
  160. package/types/lucca-front-ng-approbation-inbox.d.ts +22 -14
  161. package/types/lucca-front-ng-bubble-icon.d.ts +5 -2
  162. package/types/lucca-front-ng-callout.d.ts +17 -17
  163. package/types/lucca-front-ng-chip.d.ts +7 -7
  164. package/types/lucca-front-ng-clear.d.ts +2 -2
  165. package/types/lucca-front-ng-color.d.ts +3 -3
  166. package/types/lucca-front-ng-comment.d.ts +14 -14
  167. package/types/lucca-front-ng-container.d.ts +1 -1
  168. package/types/lucca-front-ng-core-select-api.d.ts +7 -7
  169. package/types/lucca-front-ng-core-select-department.d.ts +7 -5
  170. package/types/lucca-front-ng-core-select-establishment.d.ts +8 -6
  171. package/types/lucca-front-ng-core-select-job-qualification.d.ts +2 -2
  172. package/types/lucca-front-ng-core-select-legal-units.d.ts +3 -3
  173. package/types/lucca-front-ng-core-select-occupation-category.d.ts +2 -2
  174. package/types/lucca-front-ng-core-select-user.d.ts +14 -12
  175. package/types/lucca-front-ng-core-select.d.ts +56 -41
  176. package/types/lucca-front-ng-core.d.ts +5 -5
  177. package/types/lucca-front-ng-data-table.d.ts +38 -33
  178. package/types/lucca-front-ng-date.d.ts +13 -13
  179. package/types/lucca-front-ng-date2.d.ts +56 -37
  180. package/types/lucca-front-ng-department.d.ts +2 -2
  181. package/types/lucca-front-ng-dialog.d.ts +9 -9
  182. package/types/lucca-front-ng-divider.d.ts +2 -2
  183. package/types/lucca-front-ng-dropdown.d.ts +2 -2
  184. package/types/lucca-front-ng-empty-state.d.ts +20 -20
  185. package/types/lucca-front-ng-establishment.d.ts +15 -15
  186. package/types/lucca-front-ng-fancy-box.d.ts +12 -12
  187. package/types/lucca-front-ng-file-upload.d.ts +21 -15
  188. package/types/lucca-front-ng-filter-pills.d.ts +27 -18
  189. package/types/lucca-front-ng-footer.d.ts +1 -1
  190. package/types/lucca-front-ng-form-field.d.ts +19 -19
  191. package/types/lucca-front-ng-form-label.d.ts +4 -4
  192. package/types/lucca-front-ng-form.d.ts +1 -1
  193. package/types/lucca-front-ng-forms-phone-number-input.d.ts +11 -11
  194. package/types/lucca-front-ng-forms-rich-text-input.d.ts +11 -11
  195. package/types/lucca-front-ng-forms.d.ts +59 -49
  196. package/types/lucca-front-ng-grid.d.ts +23 -23
  197. package/types/lucca-front-ng-highlight-data.d.ts +5 -5
  198. package/types/lucca-front-ng-highlight-section.d.ts +6 -3
  199. package/types/lucca-front-ng-horizontal-navigation.d.ts +4 -4
  200. package/types/lucca-front-ng-impersonation.d.ts +8 -6
  201. package/types/lucca-front-ng-index-table.d.ts +20 -18
  202. package/types/lucca-front-ng-inline-message.d.ts +2 -2
  203. package/types/lucca-front-ng-kbd.d.ts +59 -0
  204. package/types/lucca-front-ng-link.d.ts +17 -4
  205. package/types/lucca-front-ng-listbox.d.ts +10 -9
  206. package/types/lucca-front-ng-listing.d.ts +14 -3
  207. package/types/lucca-front-ng-loading.d.ts +18 -6
  208. package/types/lucca-front-ng-main-layout.d.ts +9 -9
  209. package/types/lucca-front-ng-modal.d.ts +4 -4
  210. package/types/lucca-front-ng-multi-select.d.ts +21 -21
  211. package/types/lucca-front-ng-option.d.ts +3 -3
  212. package/types/lucca-front-ng-page-header.d.ts +2 -2
  213. package/types/lucca-front-ng-pagination.d.ts +3 -3
  214. package/types/lucca-front-ng-popover.d.ts +18 -18
  215. package/types/lucca-front-ng-popover2.d.ts +9 -8
  216. package/types/lucca-front-ng-popup.d.ts +4 -4
  217. package/types/{lucca-front-ng-priority-levels.d.ts → lucca-front-ng-priority-level.d.ts} +11 -11
  218. package/types/lucca-front-ng-progress-bar.d.ts +1 -1
  219. package/types/lucca-front-ng-progress-stepper.d.ts +2 -2
  220. package/types/lucca-front-ng-read-more.d.ts +6 -6
  221. package/types/lucca-front-ng-resource-card.d.ts +3 -3
  222. package/types/lucca-front-ng-segmented-control-tabs.d.ts +5 -5
  223. package/types/lucca-front-ng-segmented-control.d.ts +3 -3
  224. package/types/lucca-front-ng-select.d.ts +9 -9
  225. package/types/lucca-front-ng-sidepanel.d.ts +1 -1
  226. package/types/lucca-front-ng-simple-select.d.ts +9 -9
  227. package/types/lucca-front-ng-software-icon.d.ts +1 -1
  228. package/types/lucca-front-ng-sortable-list.d.ts +1 -1
  229. package/types/lucca-front-ng-status-badge.d.ts +1 -1
  230. package/types/lucca-front-ng-time.d.ts +19 -19
  231. package/types/lucca-front-ng-title.d.ts +2 -2
  232. package/types/lucca-front-ng-toast.d.ts +2 -2
  233. package/types/lucca-front-ng-tree-select.d.ts +2 -2
  234. package/types/lucca-front-ng-user-popover.d.ts +1 -2
  235. package/types/lucca-front-ng-user.d.ts +26 -20
  236. package/types/lucca-front-ng-vertical-navigation.d.ts +5 -5
  237. package/fesm2022/lucca-front-ng-priority-levels.mjs +0 -128
  238. package/fesm2022/lucca-front-ng-priority-levels.mjs.map +0 -1
@@ -0,0 +1,306 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, input, computed, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { intlInputOptions } from '@lucca-front/ng/core';
4
+ import { NgTemplateOutlet } from '@angular/common';
5
+ import { IconComponent } from '@lucca-front/ng/icon';
6
+
7
+ const Translations = {
8
+ 'nl-BE': {
9
+ alt: 'Alt',
10
+ option: 'Option',
11
+ control: 'Ctrl',
12
+ meta: 'Win',
13
+ command: 'Cmd',
14
+ shift: 'Shift',
15
+ tab: 'Tab',
16
+ space: 'Spatie',
17
+ enter: 'Enter',
18
+ escape: 'Esc',
19
+ backspace: 'Backspace',
20
+ delete: 'Delete',
21
+ home: 'Home',
22
+ end: 'End',
23
+ pageUp: 'Page Up',
24
+ pageDown: 'Page Down',
25
+ arrowUp: 'pijl omhoog',
26
+ arrowDown: 'pijl omlaag',
27
+ arrowLeft: 'pijl naar links',
28
+ arrowRight: 'pijl naar rechts',
29
+ },
30
+ fr: {
31
+ alt: 'Alt',
32
+ option: 'Option',
33
+ control: 'Ctrl',
34
+ meta: 'Win',
35
+ command: 'Cmd',
36
+ shift: 'Maj',
37
+ tab: 'Tab',
38
+ space: 'Espace',
39
+ enter: 'Entrée',
40
+ escape: 'Échap',
41
+ backspace: 'Retour arrière',
42
+ delete: 'Suppr',
43
+ home: 'Début',
44
+ end: 'Fin',
45
+ pageUp: 'Page préc',
46
+ pageDown: 'Page suiv',
47
+ arrowUp: 'flèche haut',
48
+ arrowDown: 'flèche bas',
49
+ arrowLeft: 'flèche gauche',
50
+ arrowRight: 'flèche droite',
51
+ },
52
+ de: {
53
+ alt: 'Alt',
54
+ option: 'Option',
55
+ control: 'Strg',
56
+ meta: 'Win',
57
+ command: 'Cmd',
58
+ shift: 'Umschalt',
59
+ tab: 'Tab',
60
+ space: 'Leertaste',
61
+ enter: 'Eingabe',
62
+ escape: 'Esc',
63
+ backspace: 'Rücktaste',
64
+ delete: 'Entf',
65
+ home: 'Pos1',
66
+ end: 'Ende',
67
+ pageUp: 'Bild auf',
68
+ pageDown: 'Bild ab',
69
+ arrowUp: 'Pfeil nach oben',
70
+ arrowDown: 'Pfeil nach unten',
71
+ arrowLeft: 'Pfeil nach links',
72
+ arrowRight: 'Pfeil nach rechts',
73
+ },
74
+ en: {
75
+ alt: 'Alt',
76
+ option: 'Option',
77
+ control: 'Ctrl',
78
+ meta: 'Win',
79
+ command: 'Cmd',
80
+ shift: 'Shift',
81
+ tab: 'Tab',
82
+ space: 'Space',
83
+ enter: 'Enter',
84
+ escape: 'Esc',
85
+ backspace: 'Backspace',
86
+ delete: 'Delete',
87
+ home: 'Home',
88
+ end: 'End',
89
+ pageUp: 'Page Up',
90
+ pageDown: 'Page Down',
91
+ arrowUp: 'up arrow',
92
+ arrowDown: 'down arrow',
93
+ arrowLeft: 'left arrow',
94
+ arrowRight: 'right arrow',
95
+ },
96
+ es: {
97
+ alt: 'Alt',
98
+ option: 'Opción',
99
+ control: 'Ctrl',
100
+ meta: 'Win',
101
+ command: 'Cmd',
102
+ shift: 'Mayús',
103
+ tab: 'Tab',
104
+ space: 'Espacio',
105
+ enter: 'Intro',
106
+ escape: 'Esc',
107
+ backspace: 'Retroceso',
108
+ delete: 'Supr',
109
+ home: 'Inicio',
110
+ end: 'Fin',
111
+ pageUp: 'Re Pág',
112
+ pageDown: 'Av Pág',
113
+ arrowUp: 'flecha arriba',
114
+ arrowDown: 'flecha abajo',
115
+ arrowLeft: 'flecha izquierda',
116
+ arrowRight: 'flecha derecha',
117
+ },
118
+ it: {
119
+ alt: 'Alt',
120
+ option: 'Opzione',
121
+ control: 'Ctrl',
122
+ meta: 'Win',
123
+ command: 'Cmd',
124
+ shift: 'Maiusc',
125
+ tab: 'Tab',
126
+ space: 'Spazio',
127
+ enter: 'Invio',
128
+ escape: 'Esc',
129
+ backspace: 'Backspace',
130
+ delete: 'Canc',
131
+ home: 'Home',
132
+ end: 'Fine',
133
+ pageUp: 'Pag su',
134
+ pageDown: 'Pag giù',
135
+ arrowUp: 'freccia su',
136
+ arrowDown: 'freccia giù',
137
+ arrowLeft: 'freccia sinistra',
138
+ arrowRight: 'freccia destra',
139
+ },
140
+ nl: {
141
+ alt: 'Alt',
142
+ option: 'Option',
143
+ control: 'Ctrl',
144
+ meta: 'Win',
145
+ command: 'Cmd',
146
+ shift: 'Shift',
147
+ tab: 'Tab',
148
+ space: 'Spatie',
149
+ enter: 'Enter',
150
+ escape: 'Esc',
151
+ backspace: 'Backspace',
152
+ delete: 'Delete',
153
+ home: 'Home',
154
+ end: 'End',
155
+ pageUp: 'Page Up',
156
+ pageDown: 'Page Down',
157
+ arrowUp: 'pijl omhoog',
158
+ arrowDown: 'pijl omlaag',
159
+ arrowLeft: 'pijl naar links',
160
+ arrowRight: 'pijl naar rechts',
161
+ },
162
+ pt: {
163
+ alt: 'Alt',
164
+ option: 'Option',
165
+ control: 'Ctrl',
166
+ meta: 'Win',
167
+ command: 'Cmd',
168
+ shift: 'Shift',
169
+ tab: 'Tab',
170
+ space: 'Espaço',
171
+ enter: 'Enter',
172
+ escape: 'Esc',
173
+ backspace: 'Backspace',
174
+ delete: 'Delete',
175
+ home: 'Home',
176
+ end: 'End',
177
+ pageUp: 'Page Up',
178
+ pageDown: 'Page Down',
179
+ arrowUp: 'seta para cima',
180
+ arrowDown: 'seta para baixo',
181
+ arrowLeft: 'seta para a esquerda',
182
+ arrowRight: 'seta para a direita',
183
+ },
184
+ pl: {
185
+ alt: 'Alt',
186
+ option: 'Option',
187
+ control: 'Ctrl',
188
+ meta: 'Win',
189
+ command: 'Cmd',
190
+ shift: 'Shift',
191
+ tab: 'Tab',
192
+ space: 'Spacja',
193
+ enter: 'Enter',
194
+ escape: 'Esc',
195
+ backspace: 'Backspace',
196
+ delete: 'Delete',
197
+ home: 'Home',
198
+ end: 'End',
199
+ pageUp: 'Page Up',
200
+ pageDown: 'Page Down',
201
+ arrowUp: 'strzałka w górę',
202
+ arrowDown: 'strzałka w dół',
203
+ arrowLeft: 'strzałka w lewo',
204
+ arrowRight: 'strzałka w prawo',
205
+ },
206
+ };
207
+
208
+ const LU_KBD_TRANSLATIONS = new InjectionToken('LuKbdTranslations', {
209
+ factory: () => luKbdTranslations,
210
+ });
211
+ const luKbdTranslations = Translations;
212
+
213
+ const LABELS = {
214
+ Alt: 'alt',
215
+ Control: 'control',
216
+ Meta: 'meta',
217
+ ' ': 'space',
218
+ Escape: 'escape',
219
+ Home: 'home',
220
+ End: 'end',
221
+ };
222
+ const ICONS = {
223
+ Shift: ['arrowShift', 'shift'],
224
+ Tab: ['arrowLineRight', 'tab'],
225
+ Enter: ['arrowEnter', 'enter'],
226
+ Backspace: ['arrowBackspace', 'backspace'],
227
+ Delete: ['arrowDelete', 'delete'],
228
+ PageUp: ['arrowPageUp', 'pageUp'],
229
+ PageDown: ['arrowPageDown', 'pageDown'],
230
+ ArrowUp: ['arrowTop', 'arrowUp'],
231
+ ArrowDown: ['arrowBottom', 'arrowDown'],
232
+ ArrowLeft: ['arrowLeft', 'arrowLeft'],
233
+ ArrowRight: ['arrowRight', 'arrowRight'],
234
+ };
235
+ /**
236
+ * Apple displays its modifiers as symbols: ⌥ Option and ⌘ Command
237
+ */
238
+ const MAC_ICONS = {
239
+ ...ICONS,
240
+ Alt: ['keyboardOption', 'option'],
241
+ Meta: ['keyboardCommand', 'command'],
242
+ };
243
+ /**
244
+ * Conventional order of the modifiers, displayed before the other keys whatever their order in `keys`:
245
+ * Control, Option, Shift, Command on Mac (Apple Human Interface Guidelines), Windows key, Ctrl, Alt, Shift elsewhere
246
+ */
247
+ const MAC_MODIFIERS = ['Control', 'Alt', 'Shift', 'Meta'];
248
+ const MODIFIERS = ['Meta', 'Control', 'Alt', 'Shift'];
249
+
250
+ /**
251
+ * Whether the page runs on Apple platforms, whose modifiers differ (Option, Command)
252
+ */
253
+ function isMacPlatform() {
254
+ return typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.userAgent);
255
+ }
256
+
257
+ class KbdComponent {
258
+ constructor() {
259
+ this.#isMac = isMacPlatform();
260
+ /**
261
+ * Key, or combination of keys, to display, as named by `KeyboardEvent.key` (`'Escape'`, `['Control', 'n']`…).
262
+ * Keys follow the platform (Option and Command on Mac).
263
+ * Modifiers are displayed first, in the conventional order of the platform.
264
+ */
265
+ this.keys = input.required(/* @ts-ignore */
266
+ ...(ngDevMode ? [{ debugName: "keys" }] : /* istanbul ignore next */ []));
267
+ /**
268
+ * Overrides the default labels of the keys
269
+ */
270
+ this.intl = input(...intlInputOptions(LU_KBD_TRANSLATIONS), /* @ts-ignore */
271
+ ...(ngDevMode ? [{ debugName: "intl" }] : /* istanbul ignore next */ []));
272
+ this.displayedKeys = computed(() => {
273
+ const keys = this.keys();
274
+ const intl = this.intl();
275
+ const modifiers = this.#isMac ? MAC_MODIFIERS : MODIFIERS;
276
+ const given = typeof keys === 'string' ? [keys] : keys;
277
+ return [...modifiers.filter((modifier) => given.includes(modifier)), ...given.filter((key) => !modifiers.includes(key))].map((key) => this.#display(key, intl));
278
+ }, /* @ts-ignore */
279
+ ...(ngDevMode ? [{ debugName: "displayedKeys" }] : /* istanbul ignore next */ []));
280
+ }
281
+ #isMac;
282
+ #display(key, intl) {
283
+ const icon = (this.#isMac ? MAC_ICONS : ICONS)[key];
284
+ if (icon) {
285
+ return { type: 'icon', icon: icon[0], label: intl[icon[1]] };
286
+ }
287
+ const label = LABELS[key];
288
+ if (label) {
289
+ return { type: 'text', label: intl[label] };
290
+ }
291
+ return { type: 'text', label: key.length === 1 ? key.toUpperCase() : key };
292
+ }
293
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: KbdComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
294
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: KbdComponent, isStandalone: true, selector: "lu-kbd", inputs: { keys: { classPropertyName: "keys", publicName: "keys", isSignal: true, isRequired: true, transformFunction: null }, intl: { classPropertyName: "intl", publicName: "intl", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (displayedKeys().length === 1) {\n\t<span class=\"kbdWrapper\">\n\t\t<kbd class=\"kbd\">\n\t\t\t<ng-container *ngTemplateOutlet=\"content; context: { $implicit: displayedKeys()[0] }\" />\n\t\t</kbd>\n\t</span>\n} @else {\n\t<kbd class=\"kbdWrapper\">\n\t\t@for (key of displayedKeys(); track $index) {\n\t\t\t@if (!$first) {\n\t\t\t\t+\n\t\t\t}\n\t\t\t<kbd class=\"kbd\">\n\t\t\t\t<ng-container *ngTemplateOutlet=\"content; context: { $implicit: key }\" />\n\t\t\t</kbd>\n\t\t}\n\t</kbd>\n}\n\n<ng-template #content let-key>\n\t@switch (key.type) {\n\t\t@case (\"icon\") {\n\t\t\t<lu-icon [icon]=\"key.icon\" size=\"XXS\" [alt]=\"key.label\" />\n\t\t}\n\t\t@default {\n\t\t\t{{ key.label }}\n\t\t}\n\t}\n</ng-template>\n", styles: ["@layer components{.kbd{--components-kbd-paddingInline: var(--pr-t-spacings-50);--components-kbd-animationDelay: 0s;--components-kbd-animationDuration: calc(var(--components-kbd-animationPause) / .9);--components-kbd-animationName: var(--components-kbd-modifier-animationName);--components-kbd-animationOffset: 0s;--components-kbd-animationPause: calc(var(--commons-animations-durations-slow) * 3.5);--components-kbd-last-animationName: none;--components-kbd-modifier-animationName: none;align-items:center;background-color:var(--palettes-neutral-0);border:1px solid var(--palettes-neutral-200);border-radius:var(--pr-t-border-radius-small);box-shadow:inset 0 -1px 0 var(--palettes-neutral-200);color:var(--pr-t-color-text-subtle);display:inline-flex;font:var(--pr-t-font-body-XS);inset-block-start:0;justify-content:center;min-block-size:var(--pr-t-spacings-250);min-inline-size:var(--pr-t-spacings-250);padding-inline:var(--components-kbd-paddingInline);position:relative;white-space:nowrap;animation-delay:calc(var(--components-kbd-animationDelay) + var(--components-kbd-animationOffset));animation-duration:var(--components-kbd-animationDuration);animation-iteration-count:infinite;animation-name:var(--components-kbd-animationName);animation-timing-function:step-end}.kbd:has(.lucca-icon){--components-kbd-paddingInline: 0}.kbd:nth-of-type(2){--components-kbd-animationOffset: calc(var(--commons-animations-durations-fast) / 2 * 1)}.kbd:nth-of-type(3){--components-kbd-animationOffset: calc(var(--commons-animations-durations-fast) / 2 * 2)}.kbd:nth-of-type(4){--components-kbd-animationOffset: calc(var(--commons-animations-durations-fast) / 2 * 3)}.kbd:nth-of-type(5){--components-kbd-animationOffset: calc(var(--commons-animations-durations-fast) / 2 * 4)}.kbd:last-of-type{--components-kbd-animationName: var(--components-kbd-last-animationName)}@keyframes kbdHold{10%,35%{box-shadow:inset 0 0 0 var(--palettes-neutral-200);inset-block-start:1px}40%{box-shadow:inset 0 -1px 0 var(--palettes-neutral-200);inset-block-start:0}}@keyframes kbdTap{15%,25%{box-shadow:inset 0 -1px 0 var(--palettes-neutral-200);inset-block-start:0}20%{box-shadow:inset 0 0 0 var(--palettes-neutral-200);inset-block-start:1px}}}@layer mods{@media(prefers-reduced-motion:reduce){.kbd{--components-kbd-last-animationName: none;--components-kbd-modifier-animationName: none}}}@layer components{.kbdWrapper{align-items:center;color:var(--pr-t-color-text-subtle);display:inline-flex;font:var(--pr-t-font-body-S);gap:var(--pr-t-spacings-25);vertical-align:middle;white-space:nowrap}.kbdWrapper:has(.kbd:nth-of-type(2)) .kbd{--components-kbd-animationDuration: calc((var(--components-kbd-animationPause) + calc(var(--commons-animations-durations-fast) / 2 * 0)) / .6)}.kbdWrapper:has(.kbd:nth-of-type(3)) .kbd{--components-kbd-animationDuration: calc((var(--components-kbd-animationPause) + calc(var(--commons-animations-durations-fast) / 2 * 1)) / .6)}.kbdWrapper:has(.kbd:nth-of-type(4)) .kbd{--components-kbd-animationDuration: calc((var(--components-kbd-animationPause) + calc(var(--commons-animations-durations-fast) / 2 * 2)) / .6)}.kbdWrapper:has(.kbd:nth-of-type(5)) .kbd{--components-kbd-animationDuration: calc((var(--components-kbd-animationPause) + calc(var(--commons-animations-durations-fast) / 2 * 3)) / .6)}}lu-kbd{display:contents}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "lu-icon, pr-icon", inputs: ["icon", "alt", "size", "color", "AI"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
295
+ }
296
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: KbdComponent, decorators: [{
297
+ type: Component,
298
+ args: [{ selector: 'lu-kbd', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [IconComponent, NgTemplateOutlet], template: "@if (displayedKeys().length === 1) {\n\t<span class=\"kbdWrapper\">\n\t\t<kbd class=\"kbd\">\n\t\t\t<ng-container *ngTemplateOutlet=\"content; context: { $implicit: displayedKeys()[0] }\" />\n\t\t</kbd>\n\t</span>\n} @else {\n\t<kbd class=\"kbdWrapper\">\n\t\t@for (key of displayedKeys(); track $index) {\n\t\t\t@if (!$first) {\n\t\t\t\t+\n\t\t\t}\n\t\t\t<kbd class=\"kbd\">\n\t\t\t\t<ng-container *ngTemplateOutlet=\"content; context: { $implicit: key }\" />\n\t\t\t</kbd>\n\t\t}\n\t</kbd>\n}\n\n<ng-template #content let-key>\n\t@switch (key.type) {\n\t\t@case (\"icon\") {\n\t\t\t<lu-icon [icon]=\"key.icon\" size=\"XXS\" [alt]=\"key.label\" />\n\t\t}\n\t\t@default {\n\t\t\t{{ key.label }}\n\t\t}\n\t}\n</ng-template>\n", styles: ["@layer components{.kbd{--components-kbd-paddingInline: var(--pr-t-spacings-50);--components-kbd-animationDelay: 0s;--components-kbd-animationDuration: calc(var(--components-kbd-animationPause) / .9);--components-kbd-animationName: var(--components-kbd-modifier-animationName);--components-kbd-animationOffset: 0s;--components-kbd-animationPause: calc(var(--commons-animations-durations-slow) * 3.5);--components-kbd-last-animationName: none;--components-kbd-modifier-animationName: none;align-items:center;background-color:var(--palettes-neutral-0);border:1px solid var(--palettes-neutral-200);border-radius:var(--pr-t-border-radius-small);box-shadow:inset 0 -1px 0 var(--palettes-neutral-200);color:var(--pr-t-color-text-subtle);display:inline-flex;font:var(--pr-t-font-body-XS);inset-block-start:0;justify-content:center;min-block-size:var(--pr-t-spacings-250);min-inline-size:var(--pr-t-spacings-250);padding-inline:var(--components-kbd-paddingInline);position:relative;white-space:nowrap;animation-delay:calc(var(--components-kbd-animationDelay) + var(--components-kbd-animationOffset));animation-duration:var(--components-kbd-animationDuration);animation-iteration-count:infinite;animation-name:var(--components-kbd-animationName);animation-timing-function:step-end}.kbd:has(.lucca-icon){--components-kbd-paddingInline: 0}.kbd:nth-of-type(2){--components-kbd-animationOffset: calc(var(--commons-animations-durations-fast) / 2 * 1)}.kbd:nth-of-type(3){--components-kbd-animationOffset: calc(var(--commons-animations-durations-fast) / 2 * 2)}.kbd:nth-of-type(4){--components-kbd-animationOffset: calc(var(--commons-animations-durations-fast) / 2 * 3)}.kbd:nth-of-type(5){--components-kbd-animationOffset: calc(var(--commons-animations-durations-fast) / 2 * 4)}.kbd:last-of-type{--components-kbd-animationName: var(--components-kbd-last-animationName)}@keyframes kbdHold{10%,35%{box-shadow:inset 0 0 0 var(--palettes-neutral-200);inset-block-start:1px}40%{box-shadow:inset 0 -1px 0 var(--palettes-neutral-200);inset-block-start:0}}@keyframes kbdTap{15%,25%{box-shadow:inset 0 -1px 0 var(--palettes-neutral-200);inset-block-start:0}20%{box-shadow:inset 0 0 0 var(--palettes-neutral-200);inset-block-start:1px}}}@layer mods{@media(prefers-reduced-motion:reduce){.kbd{--components-kbd-last-animationName: none;--components-kbd-modifier-animationName: none}}}@layer components{.kbdWrapper{align-items:center;color:var(--pr-t-color-text-subtle);display:inline-flex;font:var(--pr-t-font-body-S);gap:var(--pr-t-spacings-25);vertical-align:middle;white-space:nowrap}.kbdWrapper:has(.kbd:nth-of-type(2)) .kbd{--components-kbd-animationDuration: calc((var(--components-kbd-animationPause) + calc(var(--commons-animations-durations-fast) / 2 * 0)) / .6)}.kbdWrapper:has(.kbd:nth-of-type(3)) .kbd{--components-kbd-animationDuration: calc((var(--components-kbd-animationPause) + calc(var(--commons-animations-durations-fast) / 2 * 1)) / .6)}.kbdWrapper:has(.kbd:nth-of-type(4)) .kbd{--components-kbd-animationDuration: calc((var(--components-kbd-animationPause) + calc(var(--commons-animations-durations-fast) / 2 * 2)) / .6)}.kbdWrapper:has(.kbd:nth-of-type(5)) .kbd{--components-kbd-animationDuration: calc((var(--components-kbd-animationPause) + calc(var(--commons-animations-durations-fast) / 2 * 3)) / .6)}}lu-kbd{display:contents}\n"] }]
299
+ }], propDecorators: { keys: [{ type: i0.Input, args: [{ isSignal: true, alias: "keys", required: true }] }], intl: [{ type: i0.Input, args: [{ isSignal: true, alias: "intl", required: false }] }] } });
300
+
301
+ /**
302
+ * Generated bundle index. Do not edit.
303
+ */
304
+
305
+ export { KbdComponent, LU_KBD_TRANSLATIONS, luKbdTranslations };
306
+ //# sourceMappingURL=lucca-front-ng-kbd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lucca-front-ng-kbd.mjs","sources":["../../../packages/ng/kbd/translations.ts","../../../packages/ng/kbd/kbd.translate.ts","../../../packages/ng/kbd/kbd.type.ts","../../../packages/ng/kbd/kbd.utils.ts","../../../packages/ng/kbd/kbd.component.ts","../../../packages/ng/kbd/kbd.component.html","../../../packages/ng/kbd/lucca-front-ng-kbd.ts"],"sourcesContent":["export const Translations = {\n\t'nl-BE': {\n\t\talt: 'Alt',\n\t\toption: 'Option',\n\t\tcontrol: 'Ctrl',\n\t\tmeta: 'Win',\n\t\tcommand: 'Cmd',\n\t\tshift: 'Shift',\n\t\ttab: 'Tab',\n\t\tspace: 'Spatie',\n\t\tenter: 'Enter',\n\t\tescape: 'Esc',\n\t\tbackspace: 'Backspace',\n\t\tdelete: 'Delete',\n\t\thome: 'Home',\n\t\tend: 'End',\n\t\tpageUp: 'Page Up',\n\t\tpageDown: 'Page Down',\n\t\tarrowUp: 'pijl omhoog',\n\t\tarrowDown: 'pijl omlaag',\n\t\tarrowLeft: 'pijl naar links',\n\t\tarrowRight: 'pijl naar rechts',\n\t},\n\tfr: {\n\t\talt: 'Alt',\n\t\toption: 'Option',\n\t\tcontrol: 'Ctrl',\n\t\tmeta: 'Win',\n\t\tcommand: 'Cmd',\n\t\tshift: 'Maj',\n\t\ttab: 'Tab',\n\t\tspace: 'Espace',\n\t\tenter: 'Entrée',\n\t\tescape: 'Échap',\n\t\tbackspace: 'Retour arrière',\n\t\tdelete: 'Suppr',\n\t\thome: 'Début',\n\t\tend: 'Fin',\n\t\tpageUp: 'Page préc',\n\t\tpageDown: 'Page suiv',\n\t\tarrowUp: 'flèche haut',\n\t\tarrowDown: 'flèche bas',\n\t\tarrowLeft: 'flèche gauche',\n\t\tarrowRight: 'flèche droite',\n\t},\n\tde: {\n\t\talt: 'Alt',\n\t\toption: 'Option',\n\t\tcontrol: 'Strg',\n\t\tmeta: 'Win',\n\t\tcommand: 'Cmd',\n\t\tshift: 'Umschalt',\n\t\ttab: 'Tab',\n\t\tspace: 'Leertaste',\n\t\tenter: 'Eingabe',\n\t\tescape: 'Esc',\n\t\tbackspace: 'Rücktaste',\n\t\tdelete: 'Entf',\n\t\thome: 'Pos1',\n\t\tend: 'Ende',\n\t\tpageUp: 'Bild auf',\n\t\tpageDown: 'Bild ab',\n\t\tarrowUp: 'Pfeil nach oben',\n\t\tarrowDown: 'Pfeil nach unten',\n\t\tarrowLeft: 'Pfeil nach links',\n\t\tarrowRight: 'Pfeil nach rechts',\n\t},\n\ten: {\n\t\talt: 'Alt',\n\t\toption: 'Option',\n\t\tcontrol: 'Ctrl',\n\t\tmeta: 'Win',\n\t\tcommand: 'Cmd',\n\t\tshift: 'Shift',\n\t\ttab: 'Tab',\n\t\tspace: 'Space',\n\t\tenter: 'Enter',\n\t\tescape: 'Esc',\n\t\tbackspace: 'Backspace',\n\t\tdelete: 'Delete',\n\t\thome: 'Home',\n\t\tend: 'End',\n\t\tpageUp: 'Page Up',\n\t\tpageDown: 'Page Down',\n\t\tarrowUp: 'up arrow',\n\t\tarrowDown: 'down arrow',\n\t\tarrowLeft: 'left arrow',\n\t\tarrowRight: 'right arrow',\n\t},\n\tes: {\n\t\talt: 'Alt',\n\t\toption: 'Opción',\n\t\tcontrol: 'Ctrl',\n\t\tmeta: 'Win',\n\t\tcommand: 'Cmd',\n\t\tshift: 'Mayús',\n\t\ttab: 'Tab',\n\t\tspace: 'Espacio',\n\t\tenter: 'Intro',\n\t\tescape: 'Esc',\n\t\tbackspace: 'Retroceso',\n\t\tdelete: 'Supr',\n\t\thome: 'Inicio',\n\t\tend: 'Fin',\n\t\tpageUp: 'Re Pág',\n\t\tpageDown: 'Av Pág',\n\t\tarrowUp: 'flecha arriba',\n\t\tarrowDown: 'flecha abajo',\n\t\tarrowLeft: 'flecha izquierda',\n\t\tarrowRight: 'flecha derecha',\n\t},\n\tit: {\n\t\talt: 'Alt',\n\t\toption: 'Opzione',\n\t\tcontrol: 'Ctrl',\n\t\tmeta: 'Win',\n\t\tcommand: 'Cmd',\n\t\tshift: 'Maiusc',\n\t\ttab: 'Tab',\n\t\tspace: 'Spazio',\n\t\tenter: 'Invio',\n\t\tescape: 'Esc',\n\t\tbackspace: 'Backspace',\n\t\tdelete: 'Canc',\n\t\thome: 'Home',\n\t\tend: 'Fine',\n\t\tpageUp: 'Pag su',\n\t\tpageDown: 'Pag giù',\n\t\tarrowUp: 'freccia su',\n\t\tarrowDown: 'freccia giù',\n\t\tarrowLeft: 'freccia sinistra',\n\t\tarrowRight: 'freccia destra',\n\t},\n\tnl: {\n\t\talt: 'Alt',\n\t\toption: 'Option',\n\t\tcontrol: 'Ctrl',\n\t\tmeta: 'Win',\n\t\tcommand: 'Cmd',\n\t\tshift: 'Shift',\n\t\ttab: 'Tab',\n\t\tspace: 'Spatie',\n\t\tenter: 'Enter',\n\t\tescape: 'Esc',\n\t\tbackspace: 'Backspace',\n\t\tdelete: 'Delete',\n\t\thome: 'Home',\n\t\tend: 'End',\n\t\tpageUp: 'Page Up',\n\t\tpageDown: 'Page Down',\n\t\tarrowUp: 'pijl omhoog',\n\t\tarrowDown: 'pijl omlaag',\n\t\tarrowLeft: 'pijl naar links',\n\t\tarrowRight: 'pijl naar rechts',\n\t},\n\tpt: {\n\t\talt: 'Alt',\n\t\toption: 'Option',\n\t\tcontrol: 'Ctrl',\n\t\tmeta: 'Win',\n\t\tcommand: 'Cmd',\n\t\tshift: 'Shift',\n\t\ttab: 'Tab',\n\t\tspace: 'Espaço',\n\t\tenter: 'Enter',\n\t\tescape: 'Esc',\n\t\tbackspace: 'Backspace',\n\t\tdelete: 'Delete',\n\t\thome: 'Home',\n\t\tend: 'End',\n\t\tpageUp: 'Page Up',\n\t\tpageDown: 'Page Down',\n\t\tarrowUp: 'seta para cima',\n\t\tarrowDown: 'seta para baixo',\n\t\tarrowLeft: 'seta para a esquerda',\n\t\tarrowRight: 'seta para a direita',\n\t},\n\tpl: {\n\t\talt: 'Alt',\n\t\toption: 'Option',\n\t\tcontrol: 'Ctrl',\n\t\tmeta: 'Win',\n\t\tcommand: 'Cmd',\n\t\tshift: 'Shift',\n\t\ttab: 'Tab',\n\t\tspace: 'Spacja',\n\t\tenter: 'Enter',\n\t\tescape: 'Esc',\n\t\tbackspace: 'Backspace',\n\t\tdelete: 'Delete',\n\t\thome: 'Home',\n\t\tend: 'End',\n\t\tpageUp: 'Page Up',\n\t\tpageDown: 'Page Down',\n\t\tarrowUp: 'strzałka w górę',\n\t\tarrowDown: 'strzałka w dół',\n\t\tarrowLeft: 'strzałka w lewo',\n\t\tarrowRight: 'strzałka w prawo',\n\t},\n};\n","import { InjectionToken } from '@angular/core';\nimport { LuTranslation } from '@lucca-front/ng/core';\nimport { Translations } from './translations';\n\nexport const LU_KBD_TRANSLATIONS = new InjectionToken('LuKbdTranslations', {\n\tfactory: () => luKbdTranslations,\n});\n\nexport interface LuKbdTranslations {\n\talt: string;\n\toption: string;\n\tcontrol: string;\n\tmeta: string;\n\tcommand: string;\n\tshift: string;\n\ttab: string;\n\tspace: string;\n\tenter: string;\n\tescape: string;\n\tbackspace: string;\n\tdelete: string;\n\thome: string;\n\tend: string;\n\tpageUp: string;\n\tpageDown: string;\n\tarrowUp: string;\n\tarrowDown: string;\n\tarrowLeft: string;\n\tarrowRight: string;\n}\n\nexport const luKbdTranslations: LuTranslation<LuKbdTranslations> = Translations;\n","import { LuccaIcon } from '@lucca-front/ng/icon';\nimport { LuKbdTranslations } from './kbd.translate';\n\nexport type KbdKey =\n\t| 'Alt'\n\t| 'Control'\n\t| 'Meta'\n\t| 'Shift'\n\t| 'Tab'\n\t| ' '\n\t| 'Enter'\n\t| 'Escape'\n\t| 'Backspace'\n\t| 'Delete'\n\t| 'Home'\n\t| 'End'\n\t| 'PageUp'\n\t| 'PageDown'\n\t| 'ArrowUp'\n\t| 'ArrowDown'\n\t| 'ArrowLeft'\n\t| 'ArrowRight'\n\t| (string & Record<never, never>);\n\nexport type DisplayedKey = { type: 'text'; label: string } | { type: 'icon'; label: string; icon: LuccaIcon };\n\nexport const LABELS: Partial<Record<KbdKey, keyof LuKbdTranslations>> = {\n\tAlt: 'alt',\n\tControl: 'control',\n\tMeta: 'meta',\n\t' ': 'space',\n\tEscape: 'escape',\n\tHome: 'home',\n\tEnd: 'end',\n};\n\nexport const ICONS: Partial<Record<KbdKey, [LuccaIcon, keyof LuKbdTranslations]>> = {\n\tShift: ['arrowShift', 'shift'],\n\tTab: ['arrowLineRight', 'tab'],\n\tEnter: ['arrowEnter', 'enter'],\n\tBackspace: ['arrowBackspace', 'backspace'],\n\tDelete: ['arrowDelete', 'delete'],\n\tPageUp: ['arrowPageUp', 'pageUp'],\n\tPageDown: ['arrowPageDown', 'pageDown'],\n\tArrowUp: ['arrowTop', 'arrowUp'],\n\tArrowDown: ['arrowBottom', 'arrowDown'],\n\tArrowLeft: ['arrowLeft', 'arrowLeft'],\n\tArrowRight: ['arrowRight', 'arrowRight'],\n};\n\n/**\n * Apple displays its modifiers as symbols: ⌥ Option and ⌘ Command\n */\nexport const MAC_ICONS: Partial<Record<KbdKey, [LuccaIcon, keyof LuKbdTranslations]>> = {\n\t...ICONS,\n\tAlt: ['keyboardOption', 'option'],\n\tMeta: ['keyboardCommand', 'command'],\n};\n\n/**\n * Conventional order of the modifiers, displayed before the other keys whatever their order in `keys`:\n * Control, Option, Shift, Command on Mac (Apple Human Interface Guidelines), Windows key, Ctrl, Alt, Shift elsewhere\n */\nexport const MAC_MODIFIERS: KbdKey[] = ['Control', 'Alt', 'Shift', 'Meta'];\nexport const MODIFIERS: KbdKey[] = ['Meta', 'Control', 'Alt', 'Shift'];\n","/**\n * Whether the page runs on Apple platforms, whose modifiers differ (Option, Command)\n */\nexport function isMacPlatform(): boolean {\n\treturn typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.userAgent);\n}\n","import { ChangeDetectionStrategy, Component, computed, input, ViewEncapsulation } from '@angular/core';\nimport { intlInputOptions } from '@lucca-front/ng/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { IconComponent } from '@lucca-front/ng/icon';\nimport { LU_KBD_TRANSLATIONS, LuKbdTranslations } from './kbd.translate';\nimport { DisplayedKey, ICONS, KbdKey, LABELS, MAC_ICONS, MAC_MODIFIERS, MODIFIERS } from './kbd.type';\nimport { isMacPlatform } from './kbd.utils';\n\n@Component({\n\tselector: 'lu-kbd',\n\ttemplateUrl: './kbd.component.html',\n\tstyleUrl: './kbd.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tencapsulation: ViewEncapsulation.None,\n\timports: [IconComponent, NgTemplateOutlet],\n})\nexport class KbdComponent {\n\treadonly #isMac = isMacPlatform();\n\n\t/**\n\t * Key, or combination of keys, to display, as named by `KeyboardEvent.key` (`'Escape'`, `['Control', 'n']`…).\n\t * Keys follow the platform (Option and Command on Mac).\n\t * Modifiers are displayed first, in the conventional order of the platform.\n\t */\n\treadonly keys = input.required<KbdKey | readonly KbdKey[]>();\n\n\t/**\n\t * Overrides the default labels of the keys\n\t */\n\treadonly intl = input(...intlInputOptions(LU_KBD_TRANSLATIONS));\n\n\treadonly displayedKeys = computed<DisplayedKey[]>(() => {\n\t\tconst keys = this.keys();\n\t\tconst intl = this.intl();\n\t\tconst modifiers = this.#isMac ? MAC_MODIFIERS : MODIFIERS;\n\t\tconst given = typeof keys === 'string' ? [keys] : keys;\n\t\treturn [...modifiers.filter((modifier) => given.includes(modifier)), ...given.filter((key) => !modifiers.includes(key))].map((key) => this.#display(key, intl));\n\t});\n\n\t#display(key: KbdKey, intl: LuKbdTranslations): DisplayedKey {\n\t\tconst icon = (this.#isMac ? MAC_ICONS : ICONS)[key];\n\t\tif (icon) {\n\t\t\treturn { type: 'icon', icon: icon[0], label: intl[icon[1]] };\n\t\t}\n\t\tconst label = LABELS[key];\n\t\tif (label) {\n\t\t\treturn { type: 'text', label: intl[label] };\n\t\t}\n\t\treturn { type: 'text', label: key.length === 1 ? key.toUpperCase() : key };\n\t}\n}\n","@if (displayedKeys().length === 1) {\n\t<span class=\"kbdWrapper\">\n\t\t<kbd class=\"kbd\">\n\t\t\t<ng-container *ngTemplateOutlet=\"content; context: { $implicit: displayedKeys()[0] }\" />\n\t\t</kbd>\n\t</span>\n} @else {\n\t<kbd class=\"kbdWrapper\">\n\t\t@for (key of displayedKeys(); track $index) {\n\t\t\t@if (!$first) {\n\t\t\t\t+\n\t\t\t}\n\t\t\t<kbd class=\"kbd\">\n\t\t\t\t<ng-container *ngTemplateOutlet=\"content; context: { $implicit: key }\" />\n\t\t\t</kbd>\n\t\t}\n\t</kbd>\n}\n\n<ng-template #content let-key>\n\t@switch (key.type) {\n\t\t@case (\"icon\") {\n\t\t\t<lu-icon [icon]=\"key.icon\" size=\"XXS\" [alt]=\"key.label\" />\n\t\t}\n\t\t@default {\n\t\t\t{{ key.label }}\n\t\t}\n\t}\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as i2 from '@angular/common';
2
2
  import { Location } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, Attribute, Directive, input, inject, Injector, ElementRef, effect, afterNextRender, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
4
+ import { InjectionToken, signal, linkedSignal, Attribute, Directive, input, inject, Injector, ElementRef, effect, afterNextRender, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
5
5
  import * as i1 from '@angular/router';
6
6
  import { RouterLink, Router, ActivatedRoute, UrlTree } from '@angular/router';
7
7
  import { intlInputOptions, luBooleanAttribute } from '@lucca-front/ng/core';
@@ -38,19 +38,40 @@ const LU_LINK_TRANSLATIONS = new InjectionToken('luLinkTranslations', {
38
38
  const luLinkTranslations = Translations;
39
39
 
40
40
  class LuRouterLink extends RouterLink {
41
+ // Field initializers run after `super()`, so this still references the router-computed `linkedSignal` of `RouterLink`.
42
+ #routerHref;
41
43
  // Workaround for a storybook bug = implement the constructor https://github.com/storybookjs/storybook/issues/23534#issuecomment-2042888436
42
44
  constructor(router, route, tabIndexAttribute, renderer, el, locationStrategy) {
43
45
  super(router, route, tabIndexAttribute, renderer, el, locationStrategy);
46
+ /**
47
+ * Href forced by `luLink` (raw `href`, external or disabled link). `undefined` lets the router compute it.
48
+ */
49
+ this.hrefOverride = signal(undefined, /* @ts-ignore */
50
+ ...(ngDevMode ? [{ debugName: "hrefOverride" }] : /* istanbul ignore next */ []));
51
+ // Field initializers run after `super()`, so this still references the router-computed `linkedSignal` of `RouterLink`.
52
+ this.#routerHref = this.reactiveHref;
53
+ // Since Angular 22, `reactiveHref` is a `linkedSignal` recomputed on every navigation, which wipes any value written with `set()`.
54
+ // Deriving it from `hrefOverride` keeps the forced href across navigations.
55
+ this.reactiveHref = linkedSignal(() => {
56
+ const hrefOverride = this.hrefOverride();
57
+ return hrefOverride === undefined ? this.#routerHref() : hrefOverride;
58
+ }, /* @ts-ignore */
59
+ ...(ngDevMode ? [{ debugName: "reactiveHref" }] : /* istanbul ignore next */ []));
60
+ /**
61
+ * Href bound to the host element: `hrefOverride` when set, the router-computed href otherwise.
62
+ */
63
+ this.resolvedHref = this.reactiveHref.asReadonly();
44
64
  }
45
- // With angular 20, RouterLink changed to use an internal, protected, readonly signal that is directly bound to `attr.href`, breaking any possibility to override it
46
- // So we had to do this to expose it to our `luLink` component.
65
+ /**
66
+ * @deprecated a value written with `set()` is wiped on every navigation, use `hrefOverride` to force the href and `resolvedHref` to read it instead
67
+ */
47
68
  get publicReactiveHref() {
48
69
  return this.reactiveHref;
49
70
  }
50
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: LuRouterLink, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: 'tabindex', attribute: true }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i2.LocationStrategy }], target: i0.ɵɵFactoryTarget.Directive }); }
51
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.4", type: LuRouterLink, isStandalone: true, selector: "[luRouterLink]", usesInheritance: true, ngImport: i0 }); }
71
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: LuRouterLink, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: 'tabindex', attribute: true }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i2.LocationStrategy }], target: i0.ɵɵFactoryTarget.Directive }); }
72
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.2.1", type: LuRouterLink, isStandalone: true, selector: "[luRouterLink]", usesInheritance: true, ngImport: i0 }); }
52
73
  }
53
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: LuRouterLink, decorators: [{
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: LuRouterLink, decorators: [{
54
75
  type: Directive,
55
76
  args: [{
56
77
  selector: '[luRouterLink]',
@@ -107,16 +128,17 @@ class LinkComponent {
107
128
  effect(() => {
108
129
  if (href()) {
109
130
  this.hrefBackup = href();
110
- this.routerLink.publicReactiveHref.set(this.hrefBackup);
131
+ this.routerLink.hrefOverride.set(this.hrefBackup);
111
132
  }
112
133
  if (this.disabled()) {
113
134
  if (this.routerLinkCommands()) {
114
135
  this.routerLink.routerLink = null;
115
136
  }
116
- this.routerLink.publicReactiveHref.set(null);
137
+ this.routerLink.hrefOverride.set(null);
117
138
  }
118
139
  else if (this.routerLinkCommands() && !this.external()) {
119
140
  this.routerLink.routerLink = this.routerLinkCommands();
141
+ this.routerLink.hrefOverride.set(undefined);
120
142
  // We need to do this in order to have `routerLink` update the value for `href`:
121
143
  // See https://github.com/angular/angular/blob/main/packages/router/src/directives/router_link.ts#L281
122
144
  this.routerLink.ngOnChanges({});
@@ -125,10 +147,12 @@ class LinkComponent {
125
147
  // External router links must not wire up the `RouterLink` directive (it would navigate in-place),
126
148
  // but they still need an `href` so the anchor is keyboard-focusable and its destination is previewable.
127
149
  // Actual navigation is handled natively by `target="_blank"` (anchors) or by `redirect()` (buttons).
128
- this.routerLink.publicReactiveHref.set(this.#serializeExternalUrl());
150
+ // Commands set while the link was internal are cleared, otherwise `RouterLink` keeps intercepting the click.
151
+ this.routerLink.routerLink = null;
152
+ this.routerLink.hrefOverride.set(this.#serializeExternalUrl());
129
153
  }
130
154
  else if (!href() && this.hrefBackup) {
131
- this.routerLink.publicReactiveHref.set(this.hrefBackup);
155
+ this.routerLink.hrefOverride.set(this.hrefBackup);
132
156
  }
133
157
  });
134
158
  }
@@ -165,14 +189,14 @@ class LinkComponent {
165
189
  // they all describe an internal route, so the serialized URL must carry the baseHref.
166
190
  return this.location.prepareExternalUrl(serializedUrl);
167
191
  }
168
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: LinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
169
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: LinkComponent, isStandalone: true, selector: "a[luLink], button[luLink]", inputs: { intl: { classPropertyName: "intl", publicName: "intl", isSignal: true, isRequired: false, transformFunction: null }, luHref: { classPropertyName: "luHref", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, routerLinkCommands: { classPropertyName: "routerLinkCommands", publicName: "luLink", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, decorationHover: { classPropertyName: "decorationHover", publicName: "decorationHover", isSignal: true, isRequired: false, transformFunction: null }, external: { classPropertyName: "external", publicName: "external", isSignal: true, isRequired: false, transformFunction: null }, hiddenIcon: { classPropertyName: "hiddenIcon", publicName: "hiddenIcon", isSignal: true, isRequired: false, transformFunction: null }, neutral: { classPropertyName: "neutral", publicName: "neutral", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "redirect()" }, properties: { "attr.href": "routerLink.publicReactiveHref()", "class.mod-decorationHover": "decorationHover()", "class.mod-icon": "external()", "class.mod-neutral": "neutral()", "class.mod-hiddenIcon": "hiddenIcon() || (this.insideIndexTable && external()) || (this.insideDataTable && external())", "class.is-disabled": "this.disabled()", "attr.rel": "external() && !disabled() ? \"noopener noreferrer\" : null", "attr.target": "external() && !disabled() ? \"_blank\" : null", "attr.role": "disabled() ? \"presentation\" : null" }, classAttribute: "link" }, hostDirectives: [{ directive: LuRouterLink, inputs: ["preserveFragment", "preserveFragment", "skipLocationChange", "skipLocationChange", "replaceUrl", "replaceUrl", "queryParams", "queryParams", "fragment", "fragment", "queryParamsHandling", "queryParamsHandling", "state", "state", "info", "info", "relativeTo", "relativeTo"] }], ngImport: i0, template: "<span class=\"link-text\"><ng-content /></span>\n@if (external()) {\n\t<span class=\"link-icon\">\n\t\t<span aria-hidden=\"true\" class=\"lucca-icon icon-arrowExternal\"></span>\n\t</span>\n\t<span class=\"pr-u-mask\">{{ intl().external }}</span>\n}\n", styles: ["@charset \"UTF-8\";@layer components{.link{--components-link-textDecoration: underline;--components-link-text-textDecoration: underline;--components-link-color: var(--commons-text-link-color);--components-link-color-hover: var(--commons-text-link-hover);--components-link-cursor: pointer;--components-link-icon-marginInlineStart: 0;--components-link-icon-opacity: 1;background-color:transparent;color:var(--components-link-color);cursor:var(--components-link-cursor);font-family:inherit;border:0;margin:0;padding:0;text-decoration:var(--components-link-textDecoration)}.link:not(:disabled,.is-disabled):hover{color:var(--components-link-color-hover)}.link:not(:disabled,.is-disabled):focus-visible{outline:2px solid var(--palettes-700, var(--palettes-product-700));outline-offset:2px;border-radius:var(--pr-t-border-radius-small)}.link .lucca-icon{text-decoration:none;font-size:1em;vertical-align:baseline;position:relative;inset-block-start:.075rem;margin-inline-start:var(--components-link-icon-marginInlineStart)}.link .link-text{text-decoration:var(--components-link-text-textDecoration)}.link-icon{white-space:nowrap;opacity:var(--components-link-icon-opacity);transition-property:opacity;transition-duration:var(--commons-animations-durations-fast)}.link-icon:before{content:\"\\a0\"/\"\"}}@layer mods{.link.mod-decorationHover{--components-link-textDecoration: none;--components-link-text-textDecoration: none}.link.mod-decorationHover:hover{--components-link-text-textDecoration: underline}.link.mod-decorationHover:hover:not(:has(.link-text)){--components-link-textDecoration: underline}.link.mod-neutral{--components-link-color: var(--pr-t-color-text);--components-link-color-hover: var(--palettes-neutral-900)}@media not (any-pointer:coarse){.link.mod-hiddenIcon:not(:hover,:focus-visible){--components-link-icon-opacity: 0}}.link:is(:disabled,.is-disabled){--components-link-color: var(--pr-t-color-text-disabled);--components-link-cursor: not-allowed}.link:has(.link-text){--components-link-textDecoration: none}.link:not(:has(.link-icon)){--components-link-icon-marginInlineStart: .2em}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
192
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: LinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
193
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: LinkComponent, isStandalone: true, selector: "a[luLink], button[luLink]", inputs: { intl: { classPropertyName: "intl", publicName: "intl", isSignal: true, isRequired: false, transformFunction: null }, luHref: { classPropertyName: "luHref", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, routerLinkCommands: { classPropertyName: "routerLinkCommands", publicName: "luLink", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, decorationHover: { classPropertyName: "decorationHover", publicName: "decorationHover", isSignal: true, isRequired: false, transformFunction: null }, external: { classPropertyName: "external", publicName: "external", isSignal: true, isRequired: false, transformFunction: null }, hiddenIcon: { classPropertyName: "hiddenIcon", publicName: "hiddenIcon", isSignal: true, isRequired: false, transformFunction: null }, neutral: { classPropertyName: "neutral", publicName: "neutral", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "redirect()" }, properties: { "attr.href": "routerLink.resolvedHref()", "class.mod-decorationHover": "decorationHover()", "class.mod-icon": "external()", "class.mod-neutral": "neutral()", "class.mod-hiddenIcon": "hiddenIcon() || (this.insideIndexTable && external()) || (this.insideDataTable && external())", "class.is-disabled": "this.disabled()", "attr.rel": "external() && !disabled() ? \"noopener noreferrer\" : null", "attr.target": "external() && !disabled() ? \"_blank\" : null", "attr.role": "disabled() ? \"presentation\" : null" }, classAttribute: "link" }, hostDirectives: [{ directive: LuRouterLink, inputs: ["preserveFragment", "preserveFragment", "skipLocationChange", "skipLocationChange", "replaceUrl", "replaceUrl", "queryParams", "queryParams", "fragment", "fragment", "queryParamsHandling", "queryParamsHandling", "state", "state", "info", "info", "relativeTo", "relativeTo"] }], ngImport: i0, template: "<span class=\"link-text\"><ng-content /></span>\n@if (external()) {\n\t<span class=\"link-icon\">\n\t\t<span aria-hidden=\"true\" class=\"lucca-icon icon-arrowExternal\"></span>\n\t</span>\n\t<span class=\"pr-u-mask\">{{ intl().external }}</span>\n}\n", styles: ["@charset \"UTF-8\";@layer components{.link{--components-link-textDecoration: underline;--components-link-text-textDecoration: underline;--components-link-color: var(--commons-text-link-color);--components-link-color-hover: var(--commons-text-link-hover);--components-link-cursor: pointer;--components-link-icon-marginInlineStart: 0;--components-link-icon-opacity: 1;background-color:transparent;color:var(--components-link-color);cursor:var(--components-link-cursor);font-family:inherit;border:0;margin:0;padding:0;text-decoration:var(--components-link-textDecoration)}.link:not(:disabled,.is-disabled):hover{color:var(--components-link-color-hover)}.link:not(:disabled,.is-disabled):focus-visible{outline:2px solid var(--palettes-700, var(--palettes-product-700));outline-offset:2px;border-radius:var(--pr-t-border-radius-small)}.link .lucca-icon{text-decoration:none;font-size:1em;vertical-align:baseline;position:relative;inset-block-start:.075rem;margin-inline-start:var(--components-link-icon-marginInlineStart)}.link .link-text{text-decoration:var(--components-link-text-textDecoration)}.link-icon{white-space:nowrap;opacity:var(--components-link-icon-opacity);transition-property:opacity;transition-duration:var(--commons-animations-durations-fast)}.link-icon:before{content:\"\\a0\"/\"\"}}@layer mods{.link.mod-decorationHover{--components-link-textDecoration: none;--components-link-text-textDecoration: none}.link.mod-decorationHover:hover{--components-link-text-textDecoration: underline}.link.mod-decorationHover:hover:not(:has(.link-text)){--components-link-textDecoration: underline}.link.mod-neutral{--components-link-color: var(--pr-t-color-text);--components-link-color-hover: var(--palettes-neutral-900)}@media not (any-pointer:coarse){.link.mod-hiddenIcon:not(:hover,:focus-visible){--components-link-icon-opacity: 0}}.link:is(:disabled,.is-disabled){--components-link-color: var(--pr-t-color-text-disabled);--components-link-cursor: not-allowed}.link:has(.link-text){--components-link-textDecoration: none}.link:not(:has(.link-icon)){--components-link-icon-marginInlineStart: .2em}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
170
194
  }
171
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: LinkComponent, decorators: [{
195
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: LinkComponent, decorators: [{
172
196
  type: Component,
173
197
  args: [{ selector: 'a[luLink], button[luLink]', standalone: true, encapsulation: ViewEncapsulation.None, host: {
174
198
  class: 'link',
175
- '[attr.href]': 'routerLink.publicReactiveHref()',
199
+ '[attr.href]': 'routerLink.resolvedHref()',
176
200
  '[class.mod-decorationHover]': 'decorationHover()',
177
201
  '[class.mod-icon]': 'external()',
178
202
  '[class.mod-neutral]': 'neutral()',
@@ -1 +1 @@
1
- {"version":3,"file":"lucca-front-ng-link.mjs","sources":["../../../packages/ng/link/translations.ts","../../../packages/ng/link/link.translate.ts","../../../packages/ng/link/lu-router-link.ts","../../../packages/ng/link/link.component.ts","../../../packages/ng/link/link.component.html","../../../packages/ng/link/link.token.ts","../../../packages/ng/link/lucca-front-ng-link.ts"],"sourcesContent":["export const Translations = {\n\ten: {\n\t\texternal: '(Open in a new window.)',\n\t},\n\tde: {\n\t\texternal: '(In einem neuen Fenster öffnen.)',\n\t},\n\tfr: {\n\t\texternal: '(Ouvrir dans une nouvelle fenêtre.)',\n\t},\n\tit: {\n\t\texternal: '(Aprire in una nuova finestra.)',\n\t},\n\tnl: {\n\t\texternal: '(Open in een nieuw venster.)',\n\t},\n\tes: {\n\t\texternal: '(Abrir en una nueva ventana.)',\n\t},\n\tpt: {\n\t\texternal: '(Abrir numa nova janela.)',\n\t},\n};\n","import { InjectionToken } from '@angular/core';\nimport { LuTranslation } from '@lucca-front/ng/core';\nimport { Translations } from './translations';\n\nexport const LU_LINK_TRANSLATIONS = new InjectionToken('luLinkTranslations', {\n\tfactory: () => luLinkTranslations,\n});\n\nexport interface LinkTranslate {\n\texternal: string;\n}\n\nexport const luLinkTranslations: LuTranslation<LinkTranslate> = Translations;\n","import { LocationStrategy } from '@angular/common';\nimport { Attribute, Directive, ElementRef, Renderer2, WritableSignal } from '@angular/core';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\n\n@Directive({\n\tselector: '[luRouterLink]',\n})\nexport class LuRouterLink extends RouterLink {\n\t// Workaround for a storybook bug = implement the constructor https://github.com/storybookjs/storybook/issues/23534#issuecomment-2042888436\n\tconstructor(router: Router, route: ActivatedRoute, @Attribute('tabindex') tabIndexAttribute: string | null | undefined, renderer: Renderer2, el: ElementRef, locationStrategy?: LocationStrategy) {\n\t\tsuper(router, route, tabIndexAttribute, renderer, el, locationStrategy);\n\t}\n\n\t// With angular 20, RouterLink changed to use an internal, protected, readonly signal that is directly bound to `attr.href`, breaking any possibility to override it\n\t// So we had to do this to expose it to our `luLink` component.\n\tget publicReactiveHref(): WritableSignal<string | null> {\n\t\treturn this.reactiveHref;\n\t}\n}\n","import { Location } from '@angular/common';\nimport { afterNextRender, ChangeDetectionStrategy, Component, effect, ElementRef, inject, Injector, input, ViewEncapsulation } from '@angular/core';\nimport { ActivatedRoute, Router, UrlTree } from '@angular/router';\nimport { intlInputOptions, luBooleanAttribute } from '@lucca-front/ng/core';\nimport { LU_INDEX_TABLE_INSTANCE } from '@lucca-front/ng/index-table';\n\nimport { LU_DATA_TABLE_INSTANCE } from '@lucca-front/ng/data-table';\nimport { LU_LINK_TRANSLATIONS } from './link.translate';\nimport { LuRouterLink } from './lu-router-link';\n\n@Component({\n\t// eslint-disable-next-line @angular-eslint/component-selector\n\tselector: 'a[luLink], button[luLink]',\n\tstandalone: true,\n\ttemplateUrl: './link.component.html',\n\tstyleUrl: './link.component.scss',\n\tencapsulation: ViewEncapsulation.None,\n\thost: {\n\t\tclass: 'link',\n\t\t'[attr.href]': 'routerLink.publicReactiveHref()',\n\t\t'[class.mod-decorationHover]': 'decorationHover()',\n\t\t'[class.mod-icon]': 'external()',\n\t\t'[class.mod-neutral]': 'neutral()',\n\t\t'[class.mod-hiddenIcon]': 'hiddenIcon() || (this.insideIndexTable && external()) || (this.insideDataTable && external())',\n\t\t'[class.is-disabled]': 'this.disabled()',\n\t\t'[attr.rel]': 'external() && !disabled() ? \"noopener noreferrer\" : null',\n\t\t'[attr.target]': 'external() && !disabled() ? \"_blank\" : null',\n\t\t'[attr.role]': 'disabled() ? \"presentation\" : null',\n\t\t'(click)': 'redirect()',\n\t},\n\thostDirectives: [\n\t\t{\n\t\t\tdirective: LuRouterLink,\n\t\t\tinputs: ['preserveFragment', 'skipLocationChange', 'replaceUrl', 'queryParams', 'fragment', 'queryParamsHandling', 'state', 'info', 'relativeTo'],\n\t\t},\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LinkComponent {\n\treadonly intl = input(...intlInputOptions(LU_LINK_TRANSLATIONS));\n\treadonly routerLink = inject(LuRouterLink);\n\t#injector = inject(Injector);\n\t#elementRef = inject(ElementRef);\n\treadonly router = inject(Router);\n\treadonly location = inject(Location);\n\treadonly #activatedRoute = inject(ActivatedRoute, { optional: true });\n\treadonly insideIndexTable = inject(LU_INDEX_TABLE_INSTANCE, { optional: true });\n\treadonly insideDataTable = inject(LU_DATA_TABLE_INSTANCE, { optional: true });\n\n\t/**\n\t * Target page address. Use only for external links or pages not recognized by the router.\n\t */\n\treadonly luHref = input('', { alias: 'href' });\n\n\t/**\n\t * Target page address\n\t */\n\treadonly routerLinkCommands = input<LuRouterLink['routerLink'] | null>(null, { alias: 'luLink' });\n\n\t/**\n\t * Disables the link\n\t */\n\treadonly disabled = input(false, { transform: luBooleanAttribute });\n\n\t/**\n\t * Underlines the link only on hover\n\t */\n\treadonly decorationHover = input(false, { transform: luBooleanAttribute });\n\n\t/**\n\t * Indicates that the link will open in a new tab\n\t */\n\treadonly external = input(false, { transform: luBooleanAttribute });\n\n\t/**\n\t * External icon only visible on hover/focus\n\t */\n\treadonly hiddenIcon = input(false, { transform: luBooleanAttribute });\n\n\t/**\n\t * Renders the link with the default text color instead of the link color\n\t */\n\treadonly neutral = input(false, { transform: luBooleanAttribute });\n\n\threfBackup: string;\n\n\tconstructor() {\n\t\tconst href = this.luHref;\n\n\t\teffect(() => {\n\t\t\tif (href()) {\n\t\t\t\tthis.hrefBackup = href();\n\t\t\t\tthis.routerLink.publicReactiveHref.set(this.hrefBackup);\n\t\t\t}\n\t\t\tif (this.disabled()) {\n\t\t\t\tif (this.routerLinkCommands()) {\n\t\t\t\t\tthis.routerLink.routerLink = null;\n\t\t\t\t}\n\t\t\t\tthis.routerLink.publicReactiveHref.set(null);\n\t\t\t} else if (this.routerLinkCommands() && !this.external()) {\n\t\t\t\tthis.routerLink.routerLink = this.routerLinkCommands();\n\t\t\t\t// We need to do this in order to have `routerLink` update the value for `href`:\n\t\t\t\t// See https://github.com/angular/angular/blob/main/packages/router/src/directives/router_link.ts#L281\n\t\t\t\tthis.routerLink.ngOnChanges({});\n\t\t\t} else if (this.routerLinkCommands() && this.external()) {\n\t\t\t\t// External router links must not wire up the `RouterLink` directive (it would navigate in-place),\n\t\t\t\t// but they still need an `href` so the anchor is keyboard-focusable and its destination is previewable.\n\t\t\t\t// Actual navigation is handled natively by `target=\"_blank\"` (anchors) or by `redirect()` (buttons).\n\t\t\t\tthis.routerLink.publicReactiveHref.set(this.#serializeExternalUrl());\n\t\t\t} else if (!href() && this.hrefBackup) {\n\t\t\t\tthis.routerLink.publicReactiveHref.set(this.hrefBackup);\n\t\t\t}\n\t\t});\n\t}\n\n\tredirect(): void {\n\t\t// Anchors carry an `href` with `target=\"_blank\"`, so the browser opens the new tab natively.\n\t\t// Only non-anchor hosts (e.g. `button[luLink]`) need us to open the window programmatically.\n\t\tif (!this.disabled() && this.routerLinkCommands() && this.external() && !this.#isAnchor()) {\n\t\t\tconst externalUrl = this.#serializeExternalUrl();\n\t\t\tafterNextRender(() => window.open(externalUrl ?? undefined, '_blank'), { injector: this.#injector });\n\t\t}\n\t}\n\n\t#isAnchor(): boolean {\n\t\treturn (this.#elementRef.nativeElement as HTMLElement).tagName === 'A';\n\t}\n\n\t#serializeExternalUrl(): string | null {\n\t\tconst routerLinkCommands = this.routerLinkCommands();\n\t\tif (!routerLinkCommands) {\n\t\t\treturn null;\n\t\t}\n\t\tconst urlTree =\n\t\t\trouterLinkCommands instanceof UrlTree\n\t\t\t\t? routerLinkCommands\n\t\t\t\t: this.router.createUrlTree(Array.isArray(routerLinkCommands) ? routerLinkCommands : [routerLinkCommands], {\n\t\t\t\t\t\t// Resolve relative commands against the current route, like Angular's `RouterLink` does.\n\t\t\t\t\t\t// An explicit `relativeTo` wins, including `null` which means \"resolve from the root\";\n\t\t\t\t\t\t// only `undefined` falls back to the injected `ActivatedRoute`.\n\t\t\t\t\t\trelativeTo: this.routerLink.relativeTo === undefined ? this.#activatedRoute : this.routerLink.relativeTo,\n\t\t\t\t\t\tqueryParams: this.routerLink.queryParams,\n\t\t\t\t\t\tfragment: this.routerLink.fragment,\n\t\t\t\t\t\tqueryParamsHandling: this.routerLink.queryParamsHandling,\n\t\t\t\t\t\tpreserveFragment: this.routerLink.preserveFragment,\n\t\t\t\t\t});\n\t\tconst serializedUrl = this.router.serializeUrl(urlTree);\n\t\t// Apply the app's baseHref regardless of the commands' shape (string, array or `UrlTree`):\n\t\t// they all describe an internal route, so the serialized URL must carry the baseHref.\n\t\treturn this.location.prepareExternalUrl(serializedUrl);\n\t}\n}\n","<span class=\"link-text\"><ng-content /></span>\n@if (external()) {\n\t<span class=\"link-icon\">\n\t\t<span aria-hidden=\"true\" class=\"lucca-icon icon-arrowExternal\"></span>\n\t</span>\n\t<span class=\"pr-u-mask\">{{ intl().external }}</span>\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const LU_LINK_INSTANCE = new InjectionToken<boolean>('LU_LINK_INSTANCE');\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lucca-front-ng-link.mjs","sources":["../../../packages/ng/link/translations.ts","../../../packages/ng/link/link.translate.ts","../../../packages/ng/link/lu-router-link.ts","../../../packages/ng/link/link.component.ts","../../../packages/ng/link/link.component.html","../../../packages/ng/link/link.token.ts","../../../packages/ng/link/lucca-front-ng-link.ts"],"sourcesContent":["export const Translations = {\n\ten: {\n\t\texternal: '(Open in a new window.)',\n\t},\n\tde: {\n\t\texternal: '(In einem neuen Fenster öffnen.)',\n\t},\n\tfr: {\n\t\texternal: '(Ouvrir dans une nouvelle fenêtre.)',\n\t},\n\tit: {\n\t\texternal: '(Aprire in una nuova finestra.)',\n\t},\n\tnl: {\n\t\texternal: '(Open in een nieuw venster.)',\n\t},\n\tes: {\n\t\texternal: '(Abrir en una nueva ventana.)',\n\t},\n\tpt: {\n\t\texternal: '(Abrir numa nova janela.)',\n\t},\n};\n","import { InjectionToken } from '@angular/core';\nimport { LuTranslation } from '@lucca-front/ng/core';\nimport { Translations } from './translations';\n\nexport const LU_LINK_TRANSLATIONS = new InjectionToken('luLinkTranslations', {\n\tfactory: () => luLinkTranslations,\n});\n\nexport interface LinkTranslate {\n\texternal: string;\n}\n\nexport const luLinkTranslations: LuTranslation<LinkTranslate> = Translations;\n","import { LocationStrategy } from '@angular/common';\nimport { Attribute, Directive, ElementRef, linkedSignal, Renderer2, signal, WritableSignal } from '@angular/core';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\n\n@Directive({\n\tselector: '[luRouterLink]',\n})\nexport class LuRouterLink extends RouterLink {\n\t/**\n\t * Href forced by `luLink` (raw `href`, external or disabled link). `undefined` lets the router compute it.\n\t */\n\treadonly hrefOverride = signal<string | null | undefined>(undefined);\n\n\t// Field initializers run after `super()`, so this still references the router-computed `linkedSignal` of `RouterLink`.\n\treadonly #routerHref: WritableSignal<string | null> = this.reactiveHref;\n\n\t// Since Angular 22, `reactiveHref` is a `linkedSignal` recomputed on every navigation, which wipes any value written with `set()`.\n\t// Deriving it from `hrefOverride` keeps the forced href across navigations.\n\tprotected override readonly reactiveHref = linkedSignal<string | null>(() => {\n\t\tconst hrefOverride = this.hrefOverride();\n\t\treturn hrefOverride === undefined ? this.#routerHref() : hrefOverride;\n\t});\n\n\t/**\n\t * Href bound to the host element: `hrefOverride` when set, the router-computed href otherwise.\n\t */\n\treadonly resolvedHref = this.reactiveHref.asReadonly();\n\n\t// Workaround for a storybook bug = implement the constructor https://github.com/storybookjs/storybook/issues/23534#issuecomment-2042888436\n\tconstructor(router: Router, route: ActivatedRoute, @Attribute('tabindex') tabIndexAttribute: string | null | undefined, renderer: Renderer2, el: ElementRef, locationStrategy?: LocationStrategy) {\n\t\tsuper(router, route, tabIndexAttribute, renderer, el, locationStrategy);\n\t}\n\n\t/**\n\t * @deprecated a value written with `set()` is wiped on every navigation, use `hrefOverride` to force the href and `resolvedHref` to read it instead\n\t */\n\tget publicReactiveHref(): WritableSignal<string | null> {\n\t\treturn this.reactiveHref;\n\t}\n}\n","import { Location } from '@angular/common';\nimport { afterNextRender, ChangeDetectionStrategy, Component, effect, ElementRef, inject, Injector, input, ViewEncapsulation } from '@angular/core';\nimport { ActivatedRoute, Router, UrlTree } from '@angular/router';\nimport { intlInputOptions, luBooleanAttribute } from '@lucca-front/ng/core';\nimport { LU_INDEX_TABLE_INSTANCE } from '@lucca-front/ng/index-table';\n\nimport { LU_DATA_TABLE_INSTANCE } from '@lucca-front/ng/data-table';\nimport { LU_LINK_TRANSLATIONS } from './link.translate';\nimport { LuRouterLink } from './lu-router-link';\n\n@Component({\n\t// eslint-disable-next-line @angular-eslint/component-selector\n\tselector: 'a[luLink], button[luLink]',\n\tstandalone: true,\n\ttemplateUrl: './link.component.html',\n\tstyleUrl: './link.component.scss',\n\tencapsulation: ViewEncapsulation.None,\n\thost: {\n\t\tclass: 'link',\n\t\t'[attr.href]': 'routerLink.resolvedHref()',\n\t\t'[class.mod-decorationHover]': 'decorationHover()',\n\t\t'[class.mod-icon]': 'external()',\n\t\t'[class.mod-neutral]': 'neutral()',\n\t\t'[class.mod-hiddenIcon]': 'hiddenIcon() || (this.insideIndexTable && external()) || (this.insideDataTable && external())',\n\t\t'[class.is-disabled]': 'this.disabled()',\n\t\t'[attr.rel]': 'external() && !disabled() ? \"noopener noreferrer\" : null',\n\t\t'[attr.target]': 'external() && !disabled() ? \"_blank\" : null',\n\t\t'[attr.role]': 'disabled() ? \"presentation\" : null',\n\t\t'(click)': 'redirect()',\n\t},\n\thostDirectives: [\n\t\t{\n\t\t\tdirective: LuRouterLink,\n\t\t\tinputs: ['preserveFragment', 'skipLocationChange', 'replaceUrl', 'queryParams', 'fragment', 'queryParamsHandling', 'state', 'info', 'relativeTo'],\n\t\t},\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LinkComponent {\n\treadonly intl = input(...intlInputOptions(LU_LINK_TRANSLATIONS));\n\treadonly routerLink = inject(LuRouterLink);\n\t#injector = inject(Injector);\n\t#elementRef = inject(ElementRef);\n\treadonly router = inject(Router);\n\treadonly location = inject(Location);\n\treadonly #activatedRoute = inject(ActivatedRoute, { optional: true });\n\treadonly insideIndexTable = inject(LU_INDEX_TABLE_INSTANCE, { optional: true });\n\treadonly insideDataTable = inject(LU_DATA_TABLE_INSTANCE, { optional: true });\n\n\t/**\n\t * Target page address. Use only for external links or pages not recognized by the router.\n\t */\n\treadonly luHref = input('', { alias: 'href' });\n\n\t/**\n\t * Target page address\n\t */\n\treadonly routerLinkCommands = input<LuRouterLink['routerLink'] | null>(null, { alias: 'luLink' });\n\n\t/**\n\t * Disables the link\n\t */\n\treadonly disabled = input(false, { transform: luBooleanAttribute });\n\n\t/**\n\t * Underlines the link only on hover\n\t */\n\treadonly decorationHover = input(false, { transform: luBooleanAttribute });\n\n\t/**\n\t * Indicates that the link will open in a new tab\n\t */\n\treadonly external = input(false, { transform: luBooleanAttribute });\n\n\t/**\n\t * External icon only visible on hover/focus\n\t */\n\treadonly hiddenIcon = input(false, { transform: luBooleanAttribute });\n\n\t/**\n\t * Renders the link with the default text color instead of the link color\n\t */\n\treadonly neutral = input(false, { transform: luBooleanAttribute });\n\n\threfBackup: string;\n\n\tconstructor() {\n\t\tconst href = this.luHref;\n\n\t\teffect(() => {\n\t\t\tif (href()) {\n\t\t\t\tthis.hrefBackup = href();\n\t\t\t\tthis.routerLink.hrefOverride.set(this.hrefBackup);\n\t\t\t}\n\t\t\tif (this.disabled()) {\n\t\t\t\tif (this.routerLinkCommands()) {\n\t\t\t\t\tthis.routerLink.routerLink = null;\n\t\t\t\t}\n\t\t\t\tthis.routerLink.hrefOverride.set(null);\n\t\t\t} else if (this.routerLinkCommands() && !this.external()) {\n\t\t\t\tthis.routerLink.routerLink = this.routerLinkCommands();\n\t\t\t\tthis.routerLink.hrefOverride.set(undefined);\n\t\t\t\t// We need to do this in order to have `routerLink` update the value for `href`:\n\t\t\t\t// See https://github.com/angular/angular/blob/main/packages/router/src/directives/router_link.ts#L281\n\t\t\t\tthis.routerLink.ngOnChanges({});\n\t\t\t} else if (this.routerLinkCommands() && this.external()) {\n\t\t\t\t// External router links must not wire up the `RouterLink` directive (it would navigate in-place),\n\t\t\t\t// but they still need an `href` so the anchor is keyboard-focusable and its destination is previewable.\n\t\t\t\t// Actual navigation is handled natively by `target=\"_blank\"` (anchors) or by `redirect()` (buttons).\n\t\t\t\t// Commands set while the link was internal are cleared, otherwise `RouterLink` keeps intercepting the click.\n\t\t\t\tthis.routerLink.routerLink = null;\n\t\t\t\tthis.routerLink.hrefOverride.set(this.#serializeExternalUrl());\n\t\t\t} else if (!href() && this.hrefBackup) {\n\t\t\t\tthis.routerLink.hrefOverride.set(this.hrefBackup);\n\t\t\t}\n\t\t});\n\t}\n\n\tredirect(): void {\n\t\t// Anchors carry an `href` with `target=\"_blank\"`, so the browser opens the new tab natively.\n\t\t// Only non-anchor hosts (e.g. `button[luLink]`) need us to open the window programmatically.\n\t\tif (!this.disabled() && this.routerLinkCommands() && this.external() && !this.#isAnchor()) {\n\t\t\tconst externalUrl = this.#serializeExternalUrl();\n\t\t\tafterNextRender(() => window.open(externalUrl ?? undefined, '_blank'), { injector: this.#injector });\n\t\t}\n\t}\n\n\t#isAnchor(): boolean {\n\t\treturn (this.#elementRef.nativeElement as HTMLElement).tagName === 'A';\n\t}\n\n\t#serializeExternalUrl(): string | null {\n\t\tconst routerLinkCommands = this.routerLinkCommands();\n\t\tif (!routerLinkCommands) {\n\t\t\treturn null;\n\t\t}\n\t\tconst urlTree =\n\t\t\trouterLinkCommands instanceof UrlTree\n\t\t\t\t? routerLinkCommands\n\t\t\t\t: this.router.createUrlTree(Array.isArray(routerLinkCommands) ? routerLinkCommands : [routerLinkCommands], {\n\t\t\t\t\t\t// Resolve relative commands against the current route, like Angular's `RouterLink` does.\n\t\t\t\t\t\t// An explicit `relativeTo` wins, including `null` which means \"resolve from the root\";\n\t\t\t\t\t\t// only `undefined` falls back to the injected `ActivatedRoute`.\n\t\t\t\t\t\trelativeTo: this.routerLink.relativeTo === undefined ? this.#activatedRoute : this.routerLink.relativeTo,\n\t\t\t\t\t\tqueryParams: this.routerLink.queryParams,\n\t\t\t\t\t\tfragment: this.routerLink.fragment,\n\t\t\t\t\t\tqueryParamsHandling: this.routerLink.queryParamsHandling,\n\t\t\t\t\t\tpreserveFragment: this.routerLink.preserveFragment,\n\t\t\t\t\t});\n\t\tconst serializedUrl = this.router.serializeUrl(urlTree);\n\t\t// Apply the app's baseHref regardless of the commands' shape (string, array or `UrlTree`):\n\t\t// they all describe an internal route, so the serialized URL must carry the baseHref.\n\t\treturn this.location.prepareExternalUrl(serializedUrl);\n\t}\n}\n","<span class=\"link-text\"><ng-content /></span>\n@if (external()) {\n\t<span class=\"link-icon\">\n\t\t<span aria-hidden=\"true\" class=\"lucca-icon icon-arrowExternal\"></span>\n\t</span>\n\t<span class=\"pr-u-mask\">{{ intl().external }}</span>\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const LU_LINK_INSTANCE = new InjectionToken<boolean>('LU_LINK_INSTANCE');\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;AAAO,MAAM,YAAY,GAAG;AAC3B,IAAA,EAAE,EAAE;AACH,QAAA,QAAQ,EAAE,yBAAyB;AACnC,KAAA;AACD,IAAA,EAAE,EAAE;AACH,QAAA,QAAQ,EAAE,kCAAkC;AAC5C,KAAA;AACD,IAAA,EAAE,EAAE;AACH,QAAA,QAAQ,EAAE,qCAAqC;AAC/C,KAAA;AACD,IAAA,EAAE,EAAE;AACH,QAAA,QAAQ,EAAE,iCAAiC;AAC3C,KAAA;AACD,IAAA,EAAE,EAAE;AACH,QAAA,QAAQ,EAAE,8BAA8B;AACxC,KAAA;AACD,IAAA,EAAE,EAAE;AACH,QAAA,QAAQ,EAAE,+BAA+B;AACzC,KAAA;AACD,IAAA,EAAE,EAAE;AACH,QAAA,QAAQ,EAAE,2BAA2B;AACrC,KAAA;CACD;;MClBY,oBAAoB,GAAG,IAAI,cAAc,CAAC,oBAAoB,EAAE;AAC5E,IAAA,OAAO,EAAE,MAAM,kBAAkB;AACjC,CAAA;AAMM,MAAM,kBAAkB,GAAiC;;ACL1D,MAAO,YAAa,SAAQ,UAAU,CAAA;;AAOlC,IAAA,WAAW;;IAepB,WAAA,CAAY,MAAc,EAAE,KAAqB,EAAyB,iBAA4C,EAAE,QAAmB,EAAE,EAAc,EAAE,gBAAmC,EAAA;AAC/L,QAAA,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,EAAE,EAAE,gBAAgB,CAAC;AAtBxE;;AAEG;QACM,IAAA,CAAA,YAAY,GAAG,MAAM,CAA4B,SAAS;yFAAC;;AAG3D,QAAA,IAAA,CAAA,WAAW,GAAkC,IAAI,CAAC,YAAY;;;AAI3C,QAAA,IAAA,CAAA,YAAY,GAAG,YAAY,CAAgB,MAAK;AAC3E,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AACxC,YAAA,OAAO,YAAY,KAAK,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,YAAY;QACtE,CAAC;yFAAC;AAEF;;AAEG;AACM,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;IAKtD;AAEA;;AAEG;AACH,IAAA,IAAI,kBAAkB,GAAA;QACrB,OAAO,IAAI,CAAC,YAAY;IACzB;AA/BY,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,sEAsBsC,UAAU,EAAA,SAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAtB5D,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,iBAAA;;0BAuBoD,SAAS;2BAAC,UAAU;;;MCS5D,aAAa,CAAA;AAGzB,IAAA,SAAS;AACT,IAAA,WAAW;AAGF,IAAA,eAAe;AAyCxB,IAAA,WAAA,GAAA;AA/CS,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,GAAG,gBAAgB,CAAC,oBAAoB,CAAC;iFAAC;AACvD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;AAC1C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC5B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AACvB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC3B,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5D,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACtE,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAE7E;;AAEG;QACM,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,EAAE,8EAAI,KAAK,EAAE,MAAM,EAAA,CAAG;AAE9C;;AAEG;QACM,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAoC,IAAI,0FAAI,KAAK,EAAE,QAAQ,EAAA,CAAG;AAEjG;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,kBAAkB,EAAA,CAAG;AAEnE;;AAEG;QACM,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,KAAK,uFAAI,SAAS,EAAE,kBAAkB,EAAA,CAAG;AAE1E;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,kBAAkB,EAAA,CAAG;AAEnE;;AAEG;QACM,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,kFAAI,SAAS,EAAE,kBAAkB,EAAA,CAAG;AAErE;;AAEG;QACM,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,kBAAkB,EAAA,CAAG;AAKjE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM;QAExB,MAAM,CAAC,MAAK;YACX,IAAI,IAAI,EAAE,EAAE;AACX,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,EAAE;gBACxB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;YAClD;AACA,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACpB,gBAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC9B,oBAAA,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,IAAI;gBAClC;gBACA,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YACvC;iBAAO,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACzD,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,EAAE;gBACtD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;;;AAG3C,gBAAA,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC;iBAAO,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;;;;;AAKxD,gBAAA,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,IAAI;AACjC,gBAAA,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/D;iBAAO,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;gBACtC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;YAClD;AACD,QAAA,CAAC,CAAC;IACH;IAEA,QAAQ,GAAA;;;QAGP,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AAC1F,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,EAAE;YAChD,eAAe,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACrG;IACD;IAEA,SAAS,GAAA;QACR,OAAQ,IAAI,CAAC,WAAW,CAAC,aAA6B,CAAC,OAAO,KAAK,GAAG;IACvE;IAEA,qBAAqB,GAAA;AACpB,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE;QACpD,IAAI,CAAC,kBAAkB,EAAE;AACxB,YAAA,OAAO,IAAI;QACZ;AACA,QAAA,MAAM,OAAO,GACZ,kBAAkB,YAAY;AAC7B,cAAE;cACA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,GAAG,CAAC,kBAAkB,CAAC,EAAE;;;;gBAIzG,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,SAAS,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU;AACxG,gBAAA,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW;AACxC,gBAAA,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ;AAClC,gBAAA,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,mBAAmB;AACxD,gBAAA,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,gBAAgB;AAClD,aAAA,CAAC;QACL,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC;;;QAGvD,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,aAAa,CAAC;IACvD;8GAnHY,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,giECtC1B,6PAOA,EAAA,MAAA,EAAA,CAAA,0jEAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FD+Ba,aAAa,EAAA,UAAA,EAAA,CAAA;kBA5BzB,SAAS;AAEC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,cACzB,IAAI,EAAA,aAAA,EAGD,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACL,wBAAA,KAAK,EAAE,MAAM;AACb,wBAAA,aAAa,EAAE,2BAA2B;AAC1C,wBAAA,6BAA6B,EAAE,mBAAmB;AAClD,wBAAA,kBAAkB,EAAE,YAAY;AAChC,wBAAA,qBAAqB,EAAE,WAAW;AAClC,wBAAA,wBAAwB,EAAE,+FAA+F;AACzH,wBAAA,qBAAqB,EAAE,iBAAiB;AACxC,wBAAA,YAAY,EAAE,0DAA0D;AACxE,wBAAA,eAAe,EAAE,6CAA6C;AAC9D,wBAAA,aAAa,EAAE,oCAAoC;AACnD,wBAAA,SAAS,EAAE,YAAY;qBACvB,EAAA,cAAA,EACe;AACf,wBAAA;AACC,4BAAA,SAAS,EAAE,YAAY;AACvB,4BAAA,MAAM,EAAE,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC;AACjJ,yBAAA;qBACD,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6PAAA,EAAA,MAAA,EAAA,CAAA,0jEAAA,CAAA,EAAA;;;MElCnC,gBAAgB,GAAG,IAAI,cAAc,CAAU,kBAAkB;;ACF9E;;AAEG;;"}