@koobiq/components 18.33.0 → 18.34.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 (235) hide show
  1. package/actions-panel/actions-panel-config.d.ts +4 -3
  2. package/actions-panel/actions-panel-container.scss +0 -6
  3. package/actions-panel/actions-panel-ref.d.ts +13 -0
  4. package/actions-panel/actions-panel.d.ts +1 -7
  5. package/clamped-text/clamped-text.d.ts +61 -0
  6. package/clamped-text/clamped-text.scss +17 -0
  7. package/clamped-text/constants.d.ts +14 -0
  8. package/clamped-text/index.d.ts +3 -0
  9. package/clamped-text/module.d.ts +7 -0
  10. package/content-panel/content-panel-aside.scss +9 -0
  11. package/content-panel/content-panel-body.scss +9 -0
  12. package/content-panel/content-panel-container.scss +32 -0
  13. package/content-panel/content-panel-footer.scss +5 -0
  14. package/content-panel/content-panel-header.scss +30 -0
  15. package/content-panel/content-panel-tokens.scss +9 -0
  16. package/content-panel/content-panel.d.ts +149 -0
  17. package/content-panel/content-panel.scss +25 -0
  18. package/content-panel/index.d.ts +3 -0
  19. package/content-panel/module.d.ts +7 -0
  20. package/content-panel/resizable.d.ts +70 -0
  21. package/core/locales/en-US.d.ts +4 -0
  22. package/core/locales/es-LA.d.ts +4 -0
  23. package/core/locales/fa-IR.d.ts +4 -0
  24. package/core/locales/locale-service.d.ts +28 -0
  25. package/core/locales/pt-BR.d.ts +4 -0
  26. package/core/locales/ru-RU.d.ts +4 -0
  27. package/core/locales/tk-TM.d.ts +4 -0
  28. package/core/locales/types.d.ts +5 -0
  29. package/core/locales/zh-CN.d.ts +4 -0
  30. package/core/styles/common/_select.scss +6 -3
  31. package/datepicker/calendar.component.d.ts +1 -1
  32. package/datepicker/datepicker-input.directive.d.ts +1 -1
  33. package/datepicker/datepicker-toggle.component.d.ts +1 -1
  34. package/datepicker/datepicker.component.d.ts +2 -2
  35. package/dynamic-translation/dynamic-translation.d.ts +72 -0
  36. package/dynamic-translation/index.d.ts +2 -0
  37. package/dynamic-translation/module.d.ts +7 -0
  38. package/esm2022/actions-panel/actions-panel-config.mjs +1 -1
  39. package/esm2022/actions-panel/actions-panel-container.mjs +7 -7
  40. package/esm2022/actions-panel/actions-panel-ref.mjs +17 -1
  41. package/esm2022/actions-panel/actions-panel.mjs +34 -24
  42. package/esm2022/button-toggle/button-toggle.component.mjs +9 -9
  43. package/esm2022/clamped-text/clamped-text.mjs +202 -0
  44. package/esm2022/clamped-text/constants.mjs +20 -0
  45. package/esm2022/clamped-text/index.mjs +4 -0
  46. package/esm2022/clamped-text/koobiq-components-clamped-text.mjs +5 -0
  47. package/esm2022/clamped-text/module.mjs +19 -0
  48. package/esm2022/content-panel/content-panel.mjs +432 -0
  49. package/esm2022/content-panel/index.mjs +4 -0
  50. package/esm2022/content-panel/koobiq-components-content-panel.mjs +5 -0
  51. package/esm2022/content-panel/module.mjs +42 -0
  52. package/esm2022/content-panel/resizable.mjs +138 -0
  53. package/esm2022/core/locales/en-US.mjs +5 -1
  54. package/esm2022/core/locales/es-LA.mjs +5 -1
  55. package/esm2022/core/locales/fa-IR.mjs +5 -1
  56. package/esm2022/core/locales/pt-BR.mjs +5 -1
  57. package/esm2022/core/locales/ru-RU.mjs +5 -1
  58. package/esm2022/core/locales/tk-TM.mjs +5 -1
  59. package/esm2022/core/locales/types.mjs +1 -1
  60. package/esm2022/core/locales/zh-CN.mjs +5 -1
  61. package/esm2022/core/version.mjs +2 -2
  62. package/esm2022/datepicker/calendar-header.component.mjs +5 -2
  63. package/esm2022/datepicker/calendar.component.mjs +9 -9
  64. package/esm2022/datepicker/datepicker-input.directive.mjs +1 -1
  65. package/esm2022/datepicker/datepicker-toggle.component.mjs +8 -8
  66. package/esm2022/datepicker/datepicker.component.mjs +3 -3
  67. package/esm2022/dropdown/dropdown.component.mjs +3 -3
  68. package/esm2022/dynamic-translation/dynamic-translation.mjs +175 -0
  69. package/esm2022/dynamic-translation/index.mjs +3 -0
  70. package/esm2022/dynamic-translation/koobiq-components-dynamic-translation.mjs +5 -0
  71. package/esm2022/dynamic-translation/module.mjs +25 -0
  72. package/esm2022/file-upload/file-drop.mjs +1 -1
  73. package/esm2022/file-upload/multiple-file-upload.component.mjs +11 -11
  74. package/esm2022/file-upload/single-file-upload.component.mjs +11 -11
  75. package/esm2022/filter-bar/filter-refresher.mjs +5 -5
  76. package/esm2022/filter-bar/filter-reset.mjs +3 -3
  77. package/esm2022/filter-bar/filter-search.mjs +11 -11
  78. package/esm2022/filter-bar/filters.mjs +3 -3
  79. package/esm2022/filter-bar/pipe-add.mjs +5 -5
  80. package/esm2022/filter-bar/pipes/base-pipe.mjs +2 -2
  81. package/esm2022/filter-bar/pipes/pipe-button.mjs +7 -7
  82. package/esm2022/filter-bar/pipes/pipe-date.mjs +9 -1
  83. package/esm2022/filter-bar/pipes/pipe-datetime.mjs +9 -1
  84. package/esm2022/filter-bar/pipes/pipe-multi-select.mjs +4 -10
  85. package/esm2022/filter-bar/pipes/pipe-multi-tree-select.mjs +10 -9
  86. package/esm2022/filter-bar/pipes/pipe-readonly.mjs +7 -7
  87. package/esm2022/filter-bar/pipes/pipe-select.mjs +3 -4
  88. package/esm2022/filter-bar/pipes/pipe-text.mjs +8 -2
  89. package/esm2022/filter-bar/pipes/pipe-tree-select.mjs +9 -3
  90. package/esm2022/form-field/cleaner.mjs +16 -11
  91. package/esm2022/form-field/fieldset.mjs +2 -2
  92. package/esm2022/form-field/form-field.mjs +5 -5
  93. package/esm2022/form-field/password-hint.mjs +14 -3
  94. package/esm2022/form-field/password-toggle.mjs +45 -10
  95. package/esm2022/form-field/reactive-password-hint.mjs +18 -17
  96. package/esm2022/form-field/stepper.mjs +9 -9
  97. package/esm2022/icon/icon-button.component.mjs +2 -2
  98. package/esm2022/input/input-number.mjs +15 -10
  99. package/esm2022/markdown/markdown.component.mjs +3 -3
  100. package/esm2022/modal/modal.component.mjs +14 -14
  101. package/esm2022/modal/modal.directive.mjs +7 -5
  102. package/esm2022/navbar/navbar-item.component.mjs +3 -3
  103. package/esm2022/popover/popover-confirm.component.mjs +3 -3
  104. package/esm2022/popover/popover.component.mjs +3 -3
  105. package/esm2022/scrollbar/scrollbar.component.mjs +5 -5
  106. package/esm2022/select/select.component.mjs +24 -11
  107. package/esm2022/sidebar/sidebar.component.mjs +46 -27
  108. package/esm2022/sidepanel/sidepanel-container.component.mjs +15 -4
  109. package/esm2022/sidepanel/sidepanel-directives.mjs +5 -5
  110. package/esm2022/sidepanel/sidepanel-ref.mjs +8 -6
  111. package/esm2022/splitter/splitter.component.mjs +1 -1
  112. package/esm2022/tabs/tab-body.component.mjs +3 -3
  113. package/esm2022/tabs/tab-group.component.mjs +27 -27
  114. package/esm2022/tabs/tab.component.mjs +4 -4
  115. package/esm2022/tags/tag-input.mjs +2 -2
  116. package/esm2022/tags/tag-list.component.mjs +13 -13
  117. package/esm2022/textarea/textarea.component.mjs +6 -4
  118. package/esm2022/timepicker/timepicker.directive.mjs +1 -1
  119. package/esm2022/timezone/timezone-select.component.mjs +3 -3
  120. package/esm2022/tooltip/tooltip.component.mjs +3 -3
  121. package/esm2022/tree/tree-selection.component.mjs +4 -4
  122. package/esm2022/tree-select/tree-select.component.mjs +11 -9
  123. package/esm2022/username/constants.mjs +25 -0
  124. package/esm2022/username/index.mjs +6 -0
  125. package/esm2022/username/koobiq-components-username.mjs +5 -0
  126. package/esm2022/username/module.mjs +35 -0
  127. package/esm2022/username/types.mjs +32 -0
  128. package/esm2022/username/username.mjs +129 -0
  129. package/esm2022/username/username.pipe.mjs +92 -0
  130. package/fesm2022/koobiq-components-actions-panel.mjs +56 -31
  131. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  132. package/fesm2022/koobiq-components-button-toggle.mjs +8 -8
  133. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  134. package/fesm2022/koobiq-components-clamped-text.mjs +242 -0
  135. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -0
  136. package/fesm2022/koobiq-components-content-panel.mjs +612 -0
  137. package/fesm2022/koobiq-components-content-panel.mjs.map +1 -0
  138. package/fesm2022/koobiq-components-core.mjs +29 -1
  139. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  140. package/fesm2022/koobiq-components-datepicker.mjs +21 -18
  141. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  142. package/fesm2022/koobiq-components-dropdown.mjs +2 -2
  143. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  144. package/fesm2022/koobiq-components-dynamic-translation.mjs +204 -0
  145. package/fesm2022/koobiq-components-dynamic-translation.mjs.map +1 -0
  146. package/fesm2022/koobiq-components-file-upload.mjs +20 -20
  147. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  148. package/fesm2022/koobiq-components-filter-bar.mjs +75 -58
  149. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  150. package/fesm2022/koobiq-components-form-field.mjs +100 -49
  151. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  152. package/fesm2022/koobiq-components-icon.mjs +2 -2
  153. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  154. package/fesm2022/koobiq-components-input.mjs +14 -9
  155. package/fesm2022/koobiq-components-input.mjs.map +1 -1
  156. package/fesm2022/koobiq-components-markdown.mjs +2 -2
  157. package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
  158. package/fesm2022/koobiq-components-modal.mjs +19 -17
  159. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  160. package/fesm2022/koobiq-components-navbar.mjs +2 -2
  161. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  162. package/fesm2022/koobiq-components-popover.mjs +4 -4
  163. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  164. package/fesm2022/koobiq-components-scrollbar.mjs +4 -4
  165. package/fesm2022/koobiq-components-scrollbar.mjs.map +1 -1
  166. package/fesm2022/koobiq-components-select.mjs +23 -10
  167. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  168. package/fesm2022/koobiq-components-sidebar.mjs +45 -26
  169. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  170. package/fesm2022/koobiq-components-sidepanel.mjs +24 -12
  171. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  172. package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
  173. package/fesm2022/koobiq-components-tabs.mjs +31 -31
  174. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  175. package/fesm2022/koobiq-components-tags.mjs +13 -13
  176. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  177. package/fesm2022/koobiq-components-textarea.mjs +5 -3
  178. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  179. package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
  180. package/fesm2022/koobiq-components-timezone.mjs +2 -2
  181. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  182. package/fesm2022/koobiq-components-tooltip.mjs +2 -2
  183. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  184. package/fesm2022/koobiq-components-tree-select.mjs +10 -8
  185. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  186. package/fesm2022/koobiq-components-tree.mjs +3 -3
  187. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  188. package/fesm2022/koobiq-components-username.mjs +308 -0
  189. package/fesm2022/koobiq-components-username.mjs.map +1 -0
  190. package/file-upload/_file-upload-theme.scss +1 -1
  191. package/file-upload/file-drop.d.ts +1 -1
  192. package/file-upload/multiple-file-upload.component.d.ts +1 -1
  193. package/file-upload/single-file-upload.component.d.ts +2 -2
  194. package/filter-bar/pipes/pipe-date.d.ts +3 -1
  195. package/filter-bar/pipes/pipe-datetime.d.ts +3 -1
  196. package/filter-bar/pipes/pipe-multi-select.d.ts +0 -1
  197. package/filter-bar/pipes/pipe-multi-tree-select.d.ts +3 -2
  198. package/filter-bar/pipes/pipe-select.d.ts +0 -1
  199. package/filter-bar/pipes/pipe-tree-select.d.ts +3 -2
  200. package/form-field/_form-field-theme.scss +27 -18
  201. package/form-field/cleaner.d.ts +4 -2
  202. package/form-field/cleaner.scss +6 -2
  203. package/form-field/form-field.scss +5 -1
  204. package/form-field/password-hint.d.ts +7 -0
  205. package/form-field/password-toggle.d.ts +23 -3
  206. package/form-field/password-toggle.scss +4 -8
  207. package/form-field/reactive-password-hint.d.ts +1 -0
  208. package/icon/_icon-button-theme.scss +8 -2
  209. package/modal/modal.component.d.ts +6 -6
  210. package/package.json +28 -4
  211. package/popover/popover-confirm.component.d.ts +1 -1
  212. package/popover/popover.component.d.ts +2 -2
  213. package/schematics/ng-add/index.js +3 -3
  214. package/scrollbar/scrollbar.component.d.ts +4 -4
  215. package/select/select.component.d.ts +14 -2
  216. package/sidebar/sidebar.component.d.ts +31 -5
  217. package/sidepanel/sidepanel-container.component.d.ts +9 -0
  218. package/sidepanel/sidepanel-ref.d.ts +3 -3
  219. package/splitter/splitter.component.d.ts +2 -2
  220. package/tabs/tab-group.component.d.ts +1 -1
  221. package/tabs/tab.component.d.ts +1 -1
  222. package/tags/tag-input.d.ts +1 -1
  223. package/tags/tag-list.component.d.ts +1 -1
  224. package/timepicker/timepicker.directive.d.ts +1 -1
  225. package/tooltip/tooltip.component.d.ts +2 -2
  226. package/tree/tree-selection.component.d.ts +1 -1
  227. package/tree-select/tree-select.component.d.ts +1 -1
  228. package/username/constants.d.ts +15 -0
  229. package/username/index.d.ts +5 -0
  230. package/username/module.d.ts +8 -0
  231. package/username/types.d.ts +62 -0
  232. package/username/username-tokens.scss +6 -0
  233. package/username/username.d.ts +68 -0
  234. package/username/username.pipe.d.ts +23 -0
  235. package/username/username.scss +107 -0
@@ -0,0 +1,204 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { input, inject, TemplateRef, Directive, contentChildren, computed, Component, ChangeDetectionStrategy, Renderer2, viewChildren, effect, afterNextRender, NgModule } from '@angular/core';
4
+
5
+ /**
6
+ * Directive for defining a dynamic translation slot.
7
+ */
8
+ class KbqDynamicTranslationSlot {
9
+ constructor() {
10
+ /**
11
+ * The name of the dynamic translation slot.
12
+ */
13
+ this.name = input.required({ alias: 'kbqDynamicTranslationSlot' });
14
+ /**
15
+ * @docs-private
16
+ */
17
+ this.templateRef = inject(TemplateRef);
18
+ }
19
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationSlot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
20
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: KbqDynamicTranslationSlot, isStandalone: true, selector: "[kbqDynamicTranslationSlot]", inputs: { name: { classPropertyName: "name", publicName: "kbqDynamicTranslationSlot", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 }); }
21
+ }
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationSlot, decorators: [{
23
+ type: Directive,
24
+ args: [{
25
+ standalone: true,
26
+ selector: '[kbqDynamicTranslationSlot]'
27
+ }]
28
+ }] });
29
+ /**
30
+ * Component for dynamic translation.
31
+ */
32
+ class KbqDynamicTranslation {
33
+ constructor() {
34
+ this.slots = contentChildren(KbqDynamicTranslationSlot);
35
+ /**
36
+ * The text which will be translated.
37
+ */
38
+ this.text = input.required();
39
+ /**
40
+ * @docs-private
41
+ */
42
+ this.parsedSlots = computed(() => this.parseSlots(this.text(), this.slots()));
43
+ }
44
+ parseSlots(text, slots) {
45
+ const slotTemplatesByName = slots.reduce((map, { name, templateRef }) => {
46
+ const slotName = name();
47
+ if (slotName)
48
+ map[slotName] = templateRef;
49
+ return map;
50
+ }, {});
51
+ const parsedSlots = [];
52
+ const slotSelector = new RegExp(`\\[\\[(${Object.keys(slotTemplatesByName).join('|')})(?::(.+?))?\\]\\]`, 'g');
53
+ let match;
54
+ let lastIndex = 0;
55
+ while ((match = slotSelector.exec(text)) !== null) {
56
+ const [slotMatch, slotName, slotText] = match;
57
+ const [listMatch, listString] = new RegExp('^\\((.*?)\\)$', 'g').exec(slotText) ?? [];
58
+ const textBeforeSlot = text.substring(lastIndex, +match.index);
59
+ if (textBeforeSlot) {
60
+ parsedSlots.push({ type: 'text', text: textBeforeSlot, template: null });
61
+ }
62
+ parsedSlots.push({
63
+ type: 'slot',
64
+ template: slotTemplatesByName[slotName] || null,
65
+ context: { $implicit: listMatch && listString ? listString.split(',') : slotText }
66
+ });
67
+ lastIndex = match.index + slotMatch.length;
68
+ }
69
+ const textAfterLastSlot = text.substring(lastIndex);
70
+ if (textAfterLastSlot) {
71
+ parsedSlots.push({ type: 'text', text: textAfterLastSlot, template: null });
72
+ }
73
+ return parsedSlots;
74
+ }
75
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslation, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
76
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: KbqDynamicTranslation, isStandalone: true, selector: "kbq-dynamic-translation", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null } }, queries: [{ propertyName: "slots", predicate: KbqDynamicTranslationSlot, isSignal: true }], ngImport: i0, template: `
77
+ @for (slot of parsedSlots(); track $index) {
78
+ @switch (slot.type) {
79
+ @case ('slot') {
80
+ <ng-container *ngTemplateOutlet="slot.template; context: slot.context" />
81
+ }
82
+ @default {
83
+ <ng-container>{{ slot.text }}</ng-container>
84
+ }
85
+ }
86
+ }
87
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
88
+ }
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslation, decorators: [{
90
+ type: Component,
91
+ args: [{
92
+ standalone: true,
93
+ imports: [NgTemplateOutlet],
94
+ selector: 'kbq-dynamic-translation',
95
+ template: `
96
+ @for (slot of parsedSlots(); track $index) {
97
+ @switch (slot.type) {
98
+ @case ('slot') {
99
+ <ng-container *ngTemplateOutlet="slot.template; context: slot.context" />
100
+ }
101
+ @default {
102
+ <ng-container>{{ slot.text }}</ng-container>
103
+ }
104
+ }
105
+ }
106
+ `,
107
+ changeDetection: ChangeDetectionStrategy.OnPush
108
+ }]
109
+ }] });
110
+ /**
111
+ * @docs-private
112
+ */
113
+ class KbqDynamicTranslationHelper {
114
+ constructor() {
115
+ this.renderer = inject(Renderer2);
116
+ this.replaceableSlotContainers = viewChildren('replaceableSlotContainer');
117
+ this.slotsByName = new Map();
118
+ this.text = input.required();
119
+ this.slots = input.required();
120
+ effect(() => {
121
+ this.slotsByName.clear();
122
+ this.slots().forEach((slot) => this.slotsByName.set(slot.name, slot));
123
+ });
124
+ afterNextRender(() => {
125
+ this.replaceSlots();
126
+ });
127
+ }
128
+ replaceSlots() {
129
+ this.replaceableSlotContainers().forEach(({ nativeElement }) => {
130
+ const slotName = nativeElement.getAttribute('data-slot-name');
131
+ const slotContent = nativeElement.getAttribute('data-slot-content');
132
+ const { tag, attributes } = this.slotsByName.get(slotName);
133
+ const elementToRender = this.renderer.createElement(tag);
134
+ this.renderer.appendChild(elementToRender, this.renderer.createText(slotContent));
135
+ attributes?.forEach(({ key, value }) => this.renderer.setAttribute(elementToRender, key, value));
136
+ nativeElement.replaceWith(elementToRender);
137
+ });
138
+ }
139
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationHelper, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
140
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: KbqDynamicTranslationHelper, isStandalone: true, selector: "kbq-dynamic-translation-with-dynamic-component-creation", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, slots: { classPropertyName: "slots", publicName: "slots", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "replaceableSlotContainers", predicate: ["replaceableSlotContainer"], descendants: true, isSignal: true }], ngImport: i0, template: `
141
+ <kbq-dynamic-translation [text]="text()">
142
+ @for (slot of slots(); track $index) {
143
+ <ng-container *kbqDynamicTranslationSlot="slot.name; let content">
144
+ <span
145
+ #replaceableSlotContainer
146
+ [attr.data-slot-name]="slot.name"
147
+ [attr.data-slot-content]="slot.content || content"
148
+ ></span>
149
+ </ng-container>
150
+ }
151
+ </kbq-dynamic-translation>
152
+ `, isInline: true, dependencies: [{ kind: "component", type: KbqDynamicTranslation, selector: "kbq-dynamic-translation", inputs: ["text"] }, { kind: "directive", type: KbqDynamicTranslationSlot, selector: "[kbqDynamicTranslationSlot]", inputs: ["kbqDynamicTranslationSlot"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
153
+ }
154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationHelper, decorators: [{
155
+ type: Component,
156
+ args: [{
157
+ standalone: true,
158
+ imports: [KbqDynamicTranslation, KbqDynamicTranslationSlot],
159
+ selector: 'kbq-dynamic-translation-with-dynamic-component-creation',
160
+ template: `
161
+ <kbq-dynamic-translation [text]="text()">
162
+ @for (slot of slots(); track $index) {
163
+ <ng-container *kbqDynamicTranslationSlot="slot.name; let content">
164
+ <span
165
+ #replaceableSlotContainer
166
+ [attr.data-slot-name]="slot.name"
167
+ [attr.data-slot-content]="slot.content || content"
168
+ ></span>
169
+ </ng-container>
170
+ }
171
+ </kbq-dynamic-translation>
172
+ `,
173
+ changeDetection: ChangeDetectionStrategy.OnPush
174
+ }]
175
+ }], ctorParameters: () => [] });
176
+
177
+ const COMPONENTS = [
178
+ KbqDynamicTranslationSlot,
179
+ KbqDynamicTranslationHelper,
180
+ KbqDynamicTranslation
181
+ ];
182
+ class KbqDynamicTranslationModule {
183
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
184
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationModule, imports: [KbqDynamicTranslationSlot,
185
+ KbqDynamicTranslationHelper,
186
+ KbqDynamicTranslation], exports: [KbqDynamicTranslationSlot,
187
+ KbqDynamicTranslationHelper,
188
+ KbqDynamicTranslation] }); }
189
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationModule }); }
190
+ }
191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationModule, decorators: [{
192
+ type: NgModule,
193
+ args: [{
194
+ imports: COMPONENTS,
195
+ exports: COMPONENTS
196
+ }]
197
+ }] });
198
+
199
+ /**
200
+ * Generated bundle index. Do not edit.
201
+ */
202
+
203
+ export { KbqDynamicTranslation, KbqDynamicTranslationHelper, KbqDynamicTranslationModule, KbqDynamicTranslationSlot };
204
+ //# sourceMappingURL=koobiq-components-dynamic-translation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"koobiq-components-dynamic-translation.mjs","sources":["../../../packages/components/dynamic-translation/dynamic-translation.ts","../../../packages/components/dynamic-translation/module.ts","../../../packages/components/dynamic-translation/koobiq-components-dynamic-translation.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n Renderer2,\n Signal,\n TemplateRef,\n viewChildren\n} from '@angular/core';\n\n/**\n * @docs-private\n */\ntype KbqDynamicTranslationParsedSlot = {\n type: 'text' | 'slot';\n template: TemplateRef<unknown> | null;\n context?: { $implicit: unknown };\n text?: string;\n};\n\n/**\n * @docs-private\n */\nexport interface KbqDynamicTranslationHelperSlot {\n name: string;\n tag: string;\n attributes?: { key: string; value: string }[];\n content?: string;\n}\n\n/**\n * Directive for defining a dynamic translation slot.\n */\n@Directive({\n standalone: true,\n selector: '[kbqDynamicTranslationSlot]'\n})\nexport class KbqDynamicTranslationSlot {\n /**\n * The name of the dynamic translation slot.\n */\n readonly name = input.required<string>({ alias: 'kbqDynamicTranslationSlot' });\n\n /**\n * @docs-private\n */\n readonly templateRef = inject(TemplateRef);\n}\n\n/**\n * Component for dynamic translation.\n */\n@Component({\n standalone: true,\n imports: [NgTemplateOutlet],\n selector: 'kbq-dynamic-translation',\n template: `\n @for (slot of parsedSlots(); track $index) {\n @switch (slot.type) {\n @case ('slot') {\n <ng-container *ngTemplateOutlet=\"slot.template; context: slot.context\" />\n }\n @default {\n <ng-container>{{ slot.text }}</ng-container>\n }\n }\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class KbqDynamicTranslation {\n private readonly slots = contentChildren(KbqDynamicTranslationSlot);\n\n /**\n * The text which will be translated.\n */\n readonly text = input.required<string>();\n\n /**\n * @docs-private\n */\n protected readonly parsedSlots: Signal<KbqDynamicTranslationParsedSlot[]> = computed(() =>\n this.parseSlots(this.text(), this.slots())\n );\n\n private parseSlots(\n text: string,\n slots: ReadonlyArray<KbqDynamicTranslationSlot>\n ): KbqDynamicTranslationParsedSlot[] {\n const slotTemplatesByName = slots.reduce<Record<string, TemplateRef<unknown>>>((map, { name, templateRef }) => {\n const slotName = name();\n\n if (slotName) map[slotName] = templateRef;\n\n return map;\n }, {});\n const parsedSlots: KbqDynamicTranslationParsedSlot[] = [];\n const slotSelector = new RegExp(`\\\\[\\\\[(${Object.keys(slotTemplatesByName).join('|')})(?::(.+?))?\\\\]\\\\]`, 'g');\n let match: RegExpExecArray | null;\n let lastIndex = 0;\n\n while ((match = slotSelector.exec(text)) !== null) {\n const [slotMatch, slotName, slotText] = match;\n const [listMatch, listString] = new RegExp('^\\\\((.*?)\\\\)$', 'g').exec(slotText) ?? [];\n const textBeforeSlot = text.substring(lastIndex, +match.index);\n\n if (textBeforeSlot) {\n parsedSlots.push({ type: 'text', text: textBeforeSlot, template: null });\n }\n\n parsedSlots.push({\n type: 'slot',\n template: slotTemplatesByName[slotName] || null,\n context: { $implicit: listMatch && listString ? listString.split(',') : slotText }\n });\n\n lastIndex = match.index + slotMatch.length;\n }\n\n const textAfterLastSlot = text.substring(lastIndex);\n\n if (textAfterLastSlot) {\n parsedSlots.push({ type: 'text', text: textAfterLastSlot, template: null });\n }\n\n return parsedSlots;\n }\n}\n\n/**\n * @docs-private\n */\n@Component({\n standalone: true,\n imports: [KbqDynamicTranslation, KbqDynamicTranslationSlot],\n selector: 'kbq-dynamic-translation-with-dynamic-component-creation',\n template: `\n <kbq-dynamic-translation [text]=\"text()\">\n @for (slot of slots(); track $index) {\n <ng-container *kbqDynamicTranslationSlot=\"slot.name; let content\">\n <span\n #replaceableSlotContainer\n [attr.data-slot-name]=\"slot.name\"\n [attr.data-slot-content]=\"slot.content || content\"\n ></span>\n </ng-container>\n }\n </kbq-dynamic-translation>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class KbqDynamicTranslationHelper {\n private readonly renderer = inject(Renderer2);\n private readonly replaceableSlotContainers = viewChildren<ElementRef<HTMLElement>>('replaceableSlotContainer');\n private readonly slotsByName = new Map<string, KbqDynamicTranslationHelperSlot>();\n\n readonly text = input.required<string>();\n\n readonly slots = input.required<KbqDynamicTranslationHelperSlot[]>();\n\n constructor() {\n effect(() => {\n this.slotsByName.clear();\n this.slots().forEach((slot) => this.slotsByName.set(slot.name, slot));\n });\n\n afterNextRender(() => {\n this.replaceSlots();\n });\n }\n\n private replaceSlots(): void {\n this.replaceableSlotContainers().forEach(({ nativeElement }: ElementRef<HTMLElement>) => {\n const slotName = nativeElement.getAttribute('data-slot-name')!;\n const slotContent = nativeElement.getAttribute('data-slot-content')!;\n const { tag, attributes } = this.slotsByName.get(slotName)!;\n const elementToRender = this.renderer.createElement(tag);\n\n this.renderer.appendChild(elementToRender, this.renderer.createText(slotContent));\n\n attributes?.forEach(({ key, value }) => this.renderer.setAttribute(elementToRender, key, value));\n\n nativeElement.replaceWith(elementToRender);\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { KbqDynamicTranslation, KbqDynamicTranslationHelper, KbqDynamicTranslationSlot } from './dynamic-translation';\n\nconst COMPONENTS = [\n KbqDynamicTranslationSlot,\n KbqDynamicTranslationHelper,\n KbqDynamicTranslation\n];\n\n@NgModule({\n imports: COMPONENTS,\n exports: COMPONENTS\n})\nexport class KbqDynamicTranslationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}