@ngneers/controls 0.0.1-next.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 (186) hide show
  1. package/fesm2022/ngneers-controls-accordion.mjs +234 -0
  2. package/fesm2022/ngneers-controls-accordion.mjs.map +1 -0
  3. package/fesm2022/ngneers-controls-api-ng.mjs +959 -0
  4. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -0
  5. package/fesm2022/ngneers-controls-api-resize.mjs +712 -0
  6. package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -0
  7. package/fesm2022/ngneers-controls-api.mjs +347 -0
  8. package/fesm2022/ngneers-controls-api.mjs.map +1 -0
  9. package/fesm2022/ngneers-controls-avatar.mjs +77 -0
  10. package/fesm2022/ngneers-controls-avatar.mjs.map +1 -0
  11. package/fesm2022/ngneers-controls-base.mjs +620 -0
  12. package/fesm2022/ngneers-controls-base.mjs.map +1 -0
  13. package/fesm2022/ngneers-controls-breadcrumb.mjs +100 -0
  14. package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -0
  15. package/fesm2022/ngneers-controls-button-group.mjs +110 -0
  16. package/fesm2022/ngneers-controls-button-group.mjs.map +1 -0
  17. package/fesm2022/ngneers-controls-button.mjs +83 -0
  18. package/fesm2022/ngneers-controls-button.mjs.map +1 -0
  19. package/fesm2022/ngneers-controls-calendar-time-CJT5AFlA.mjs +74 -0
  20. package/fesm2022/ngneers-controls-calendar-time-CJT5AFlA.mjs.map +1 -0
  21. package/fesm2022/ngneers-controls-calendar.mjs +801 -0
  22. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -0
  23. package/fesm2022/ngneers-controls-checkbox.mjs +63 -0
  24. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -0
  25. package/fesm2022/ngneers-controls-chip.mjs +55 -0
  26. package/fesm2022/ngneers-controls-chip.mjs.map +1 -0
  27. package/fesm2022/ngneers-controls-default-icons.mjs +82 -0
  28. package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -0
  29. package/fesm2022/ngneers-controls-defer.mjs +72 -0
  30. package/fesm2022/ngneers-controls-defer.mjs.map +1 -0
  31. package/fesm2022/ngneers-controls-dialog.mjs +407 -0
  32. package/fesm2022/ngneers-controls-dialog.mjs.map +1 -0
  33. package/fesm2022/ngneers-controls-directives.mjs +498 -0
  34. package/fesm2022/ngneers-controls-directives.mjs.map +1 -0
  35. package/fesm2022/ngneers-controls-drawer.mjs +271 -0
  36. package/fesm2022/ngneers-controls-drawer.mjs.map +1 -0
  37. package/fesm2022/ngneers-controls-edit-inplace.mjs +127 -0
  38. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -0
  39. package/fesm2022/ngneers-controls-errors.mjs +329 -0
  40. package/fesm2022/ngneers-controls-errors.mjs.map +1 -0
  41. package/fesm2022/ngneers-controls-filter.mjs +708 -0
  42. package/fesm2022/ngneers-controls-filter.mjs.map +1 -0
  43. package/fesm2022/ngneers-controls-hint.mjs +153 -0
  44. package/fesm2022/ngneers-controls-hint.mjs.map +1 -0
  45. package/fesm2022/ngneers-controls-i18n-translations-de.mjs +170 -0
  46. package/fesm2022/ngneers-controls-i18n-translations-de.mjs.map +1 -0
  47. package/fesm2022/ngneers-controls-i18n-translations-en.mjs +170 -0
  48. package/fesm2022/ngneers-controls-i18n-translations-en.mjs.map +1 -0
  49. package/fesm2022/ngneers-controls-i18n.mjs +57 -0
  50. package/fesm2022/ngneers-controls-i18n.mjs.map +1 -0
  51. package/fesm2022/ngneers-controls-icon.mjs +195 -0
  52. package/fesm2022/ngneers-controls-icon.mjs.map +1 -0
  53. package/fesm2022/ngneers-controls-inplace.mjs +150 -0
  54. package/fesm2022/ngneers-controls-inplace.mjs.map +1 -0
  55. package/fesm2022/ngneers-controls-input-field.mjs +165 -0
  56. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -0
  57. package/fesm2022/ngneers-controls-input.mjs +72 -0
  58. package/fesm2022/ngneers-controls-input.mjs.map +1 -0
  59. package/fesm2022/ngneers-controls-item-view.mjs +473 -0
  60. package/fesm2022/ngneers-controls-item-view.mjs.map +1 -0
  61. package/fesm2022/ngneers-controls-list-box.mjs +281 -0
  62. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -0
  63. package/fesm2022/ngneers-controls-mask-input.mjs +888 -0
  64. package/fesm2022/ngneers-controls-mask-input.mjs.map +1 -0
  65. package/fesm2022/ngneers-controls-menu.mjs +371 -0
  66. package/fesm2022/ngneers-controls-menu.mjs.map +1 -0
  67. package/fesm2022/ngneers-controls-message.mjs +30 -0
  68. package/fesm2022/ngneers-controls-message.mjs.map +1 -0
  69. package/fesm2022/ngneers-controls-number-input.mjs +366 -0
  70. package/fesm2022/ngneers-controls-number-input.mjs.map +1 -0
  71. package/fesm2022/ngneers-controls-paginator.mjs +129 -0
  72. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -0
  73. package/fesm2022/ngneers-controls-popover.mjs +215 -0
  74. package/fesm2022/ngneers-controls-popover.mjs.map +1 -0
  75. package/fesm2022/ngneers-controls-progress.mjs +98 -0
  76. package/fesm2022/ngneers-controls-progress.mjs.map +1 -0
  77. package/fesm2022/ngneers-controls-radio.mjs +152 -0
  78. package/fesm2022/ngneers-controls-radio.mjs.map +1 -0
  79. package/fesm2022/ngneers-controls-roving-focus.mjs +323 -0
  80. package/fesm2022/ngneers-controls-roving-focus.mjs.map +1 -0
  81. package/fesm2022/ngneers-controls-scroll-shadow.mjs +65 -0
  82. package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -0
  83. package/fesm2022/ngneers-controls-scroller.mjs +308 -0
  84. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -0
  85. package/fesm2022/ngneers-controls-select-button.mjs +58 -0
  86. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -0
  87. package/fesm2022/ngneers-controls-select.mjs +417 -0
  88. package/fesm2022/ngneers-controls-select.mjs.map +1 -0
  89. package/fesm2022/ngneers-controls-slider.mjs +167 -0
  90. package/fesm2022/ngneers-controls-slider.mjs.map +1 -0
  91. package/fesm2022/ngneers-controls-snackbar.mjs +414 -0
  92. package/fesm2022/ngneers-controls-snackbar.mjs.map +1 -0
  93. package/fesm2022/ngneers-controls-spin-buttons.mjs +126 -0
  94. package/fesm2022/ngneers-controls-spin-buttons.mjs.map +1 -0
  95. package/fesm2022/ngneers-controls-spinner.mjs +184 -0
  96. package/fesm2022/ngneers-controls-spinner.mjs.map +1 -0
  97. package/fesm2022/ngneers-controls-splitter.mjs +604 -0
  98. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -0
  99. package/fesm2022/ngneers-controls-state.mjs +185 -0
  100. package/fesm2022/ngneers-controls-state.mjs.map +1 -0
  101. package/fesm2022/ngneers-controls-switch.mjs +39 -0
  102. package/fesm2022/ngneers-controls-switch.mjs.map +1 -0
  103. package/fesm2022/ngneers-controls-table.mjs +2634 -0
  104. package/fesm2022/ngneers-controls-table.mjs.map +1 -0
  105. package/fesm2022/ngneers-controls-tabs.mjs +336 -0
  106. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -0
  107. package/fesm2022/ngneers-controls-tag.mjs +30 -0
  108. package/fesm2022/ngneers-controls-tag.mjs.map +1 -0
  109. package/fesm2022/ngneers-controls-toast.mjs +350 -0
  110. package/fesm2022/ngneers-controls-toast.mjs.map +1 -0
  111. package/fesm2022/ngneers-controls-toggle-button.mjs +70 -0
  112. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -0
  113. package/fesm2022/ngneers-controls-tooltip.mjs +506 -0
  114. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -0
  115. package/fesm2022/ngneers-controls-tree.mjs +599 -0
  116. package/fesm2022/ngneers-controls-tree.mjs.map +1 -0
  117. package/fesm2022/ngneers-controls-upload.mjs +377 -0
  118. package/fesm2022/ngneers-controls-upload.mjs.map +1 -0
  119. package/fesm2022/ngneers-controls-utils-ng.mjs +411 -0
  120. package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -0
  121. package/fesm2022/ngneers-controls-utils.mjs +261 -0
  122. package/fesm2022/ngneers-controls-utils.mjs.map +1 -0
  123. package/fesm2022/ngneers-controls.mjs +6 -0
  124. package/fesm2022/ngneers-controls.mjs.map +1 -0
  125. package/package.json +302 -0
  126. package/types/ngneers-controls-accordion.d.ts +139 -0
  127. package/types/ngneers-controls-api-ng.d.ts +364 -0
  128. package/types/ngneers-controls-api-resize.d.ts +318 -0
  129. package/types/ngneers-controls-api.d.ts +145 -0
  130. package/types/ngneers-controls-avatar.d.ts +54 -0
  131. package/types/ngneers-controls-base.d.ts +277 -0
  132. package/types/ngneers-controls-breadcrumb.d.ts +272 -0
  133. package/types/ngneers-controls-button-group.d.ts +46 -0
  134. package/types/ngneers-controls-button.d.ts +48 -0
  135. package/types/ngneers-controls-calendar.d.ts +466 -0
  136. package/types/ngneers-controls-checkbox.d.ts +40 -0
  137. package/types/ngneers-controls-chip.d.ts +202 -0
  138. package/types/ngneers-controls-default-icons.d.ts +5 -0
  139. package/types/ngneers-controls-defer.d.ts +48 -0
  140. package/types/ngneers-controls-dialog.d.ts +399 -0
  141. package/types/ngneers-controls-directives.d.ts +171 -0
  142. package/types/ngneers-controls-drawer.d.ts +308 -0
  143. package/types/ngneers-controls-edit-inplace.d.ts +263 -0
  144. package/types/ngneers-controls-errors.d.ts +155 -0
  145. package/types/ngneers-controls-filter.d.ts +609 -0
  146. package/types/ngneers-controls-hint.d.ts +88 -0
  147. package/types/ngneers-controls-i18n-translations-de.d.ts +164 -0
  148. package/types/ngneers-controls-i18n-translations-en.d.ts +164 -0
  149. package/types/ngneers-controls-i18n.d.ts +186 -0
  150. package/types/ngneers-controls-icon.d.ts +68 -0
  151. package/types/ngneers-controls-inplace.d.ts +98 -0
  152. package/types/ngneers-controls-input-field.d.ts +248 -0
  153. package/types/ngneers-controls-input.d.ts +30 -0
  154. package/types/ngneers-controls-item-view.d.ts +215 -0
  155. package/types/ngneers-controls-list-box.d.ts +334 -0
  156. package/types/ngneers-controls-mask-input.d.ts +434 -0
  157. package/types/ngneers-controls-menu.d.ts +192 -0
  158. package/types/ngneers-controls-message.d.ts +21 -0
  159. package/types/ngneers-controls-number-input.d.ts +146 -0
  160. package/types/ngneers-controls-paginator.d.ts +255 -0
  161. package/types/ngneers-controls-popover.d.ts +116 -0
  162. package/types/ngneers-controls-progress.d.ts +49 -0
  163. package/types/ngneers-controls-radio.d.ts +91 -0
  164. package/types/ngneers-controls-roving-focus.d.ts +107 -0
  165. package/types/ngneers-controls-scroll-shadow.d.ts +25 -0
  166. package/types/ngneers-controls-scroller.d.ts +151 -0
  167. package/types/ngneers-controls-select-button.d.ts +51 -0
  168. package/types/ngneers-controls-select.d.ts +409 -0
  169. package/types/ngneers-controls-slider.d.ts +57 -0
  170. package/types/ngneers-controls-snackbar.d.ts +330 -0
  171. package/types/ngneers-controls-spin-buttons.d.ts +69 -0
  172. package/types/ngneers-controls-spinner.d.ts +117 -0
  173. package/types/ngneers-controls-splitter.d.ts +465 -0
  174. package/types/ngneers-controls-state.d.ts +102 -0
  175. package/types/ngneers-controls-switch.d.ts +18 -0
  176. package/types/ngneers-controls-table.d.ts +3127 -0
  177. package/types/ngneers-controls-tabs.d.ts +118 -0
  178. package/types/ngneers-controls-tag.d.ts +21 -0
  179. package/types/ngneers-controls-toast.d.ts +298 -0
  180. package/types/ngneers-controls-toggle-button.d.ts +48 -0
  181. package/types/ngneers-controls-tooltip.d.ts +189 -0
  182. package/types/ngneers-controls-tree.d.ts +409 -0
  183. package/types/ngneers-controls-upload.d.ts +347 -0
  184. package/types/ngneers-controls-utils-ng.d.ts +129 -0
  185. package/types/ngneers-controls-utils.d.ts +130 -0
  186. package/types/ngneers-controls.d.ts +2 -0
@@ -0,0 +1,170 @@
1
+ const en = {
2
+ calendar: {
3
+ today: 'Today',
4
+ input: 'Date',
5
+ selectYear: 'Select year',
6
+ selectMonth: 'Select month',
7
+ previousMonth: 'Previous month',
8
+ nextMonth: 'Next month',
9
+ weekdays: {
10
+ monday: 'Monday',
11
+ tuesday: 'Tuesday',
12
+ wednesday: 'Wednesday',
13
+ thursday: 'Thursday',
14
+ friday: 'Friday',
15
+ saturday: 'Saturday',
16
+ sunday: 'Sunday',
17
+ },
18
+ weekdaysShort: {
19
+ monday: 'Mo',
20
+ tuesday: 'Tu',
21
+ wednesday: 'We',
22
+ thursday: 'Th',
23
+ friday: 'Fr',
24
+ saturday: 'Sa',
25
+ sunday: 'Su',
26
+ },
27
+ months: {
28
+ january: 'January',
29
+ february: 'February',
30
+ march: 'March',
31
+ april: 'April',
32
+ may: 'May',
33
+ june: 'June',
34
+ july: 'July',
35
+ august: 'August',
36
+ september: 'September',
37
+ october: 'October',
38
+ november: 'November',
39
+ december: 'December',
40
+ },
41
+ },
42
+ editInplace: {
43
+ placeholder: 'Click to edit',
44
+ confirm: 'Confirm',
45
+ },
46
+ filter: {
47
+ noFilter: 'No filter',
48
+ addCondition: 'Add condition',
49
+ removeCondition: 'Remove condition',
50
+ operator: 'Operator',
51
+ value: 'Value',
52
+ clear: 'Clear',
53
+ apply: 'Apply',
54
+ cancel: 'Cancel',
55
+ matchModeLabel: 'Match mode',
56
+ match: {
57
+ all: 'Match all',
58
+ any: 'Match any',
59
+ and: 'and',
60
+ or: 'or',
61
+ },
62
+ selected: 'selected',
63
+ conditions: 'conditions',
64
+ operators: {
65
+ isEqual: 'Is equal',
66
+ isNotEqual: 'Is not equal',
67
+ contains: 'Contains',
68
+ startsWith: 'Starts with',
69
+ endsWith: 'Ends with',
70
+ in: 'Is one of',
71
+ isEmpty: 'Is empty',
72
+ isNotEmpty: 'Is not empty',
73
+ greaterThan: 'Greater than',
74
+ greaterThanOrEqual: 'Greater than or equal',
75
+ lessThan: 'Less than',
76
+ lessThanOrEqual: 'Less than or equal',
77
+ after: 'After',
78
+ onOrAfter: 'On or after',
79
+ before: 'Before',
80
+ onOrBefore: 'On or before',
81
+ isTrue: 'Yes',
82
+ isFalse: 'No',
83
+ custom: 'Custom',
84
+ },
85
+ },
86
+ splitter: {
87
+ handleLabel: 'Drag to resize',
88
+ },
89
+ inputField: {
90
+ clearInput: 'Clear input',
91
+ },
92
+ maskInput: {
93
+ roleDescription: 'formatted input',
94
+ segmentRange: '{{ name }}, {{ min }} to {{ max }}',
95
+ optionSeparator: ' or ',
96
+ },
97
+ drawer: {
98
+ close: 'Close',
99
+ },
100
+ dialog: {
101
+ close: 'Close',
102
+ },
103
+ chip: {
104
+ close: 'Remove',
105
+ },
106
+ breadcrumb: {
107
+ overflow: 'Show more',
108
+ },
109
+ toast: {
110
+ close: 'Close',
111
+ region: 'Notifications',
112
+ },
113
+ snackbar: {
114
+ close: 'Close',
115
+ region: 'Notifications',
116
+ severity: {
117
+ error: 'Error:',
118
+ warning: 'Warning:',
119
+ success: 'Success:',
120
+ info: 'Info:',
121
+ },
122
+ },
123
+ upload: {
124
+ upload: 'Upload',
125
+ // Per-item action labels are parameterized so locales control word order.
126
+ uploadNamed: 'Upload {{ name }}',
127
+ retryNamed: 'Retry {{ name }}',
128
+ cancelNamed: 'Cancel {{ name }}',
129
+ removeNamed: 'Remove {{ name }}',
130
+ progressNamed: 'Upload progress for {{ name }}',
131
+ },
132
+ select: {
133
+ filterOptions: 'Filter options',
134
+ },
135
+ paginator: {
136
+ previousPage: 'Previous page',
137
+ nextPage: 'Next page',
138
+ },
139
+ listBox: {
140
+ noItemsFound: 'No items found',
141
+ },
142
+ tree: {
143
+ noItemsFound: 'No items found',
144
+ },
145
+ table: {
146
+ selectAllRows: 'Select all rows',
147
+ selectRow: 'Select row',
148
+ sortedBy: 'Sorted by {{ column }}, {{ direction }}',
149
+ sortAscending: 'ascending',
150
+ sortDescending: 'descending',
151
+ sortCleared: 'Sorting cleared',
152
+ selectedCount: '{{ count }} of {{ total }} selected',
153
+ page: 'Page {{ page }} of {{ pages }}',
154
+ resultCount: '{{ count }} results',
155
+ },
156
+ state: {
157
+ loading: 'Loading',
158
+ success: 'Success',
159
+ warning: 'Warning',
160
+ error: 'Error',
161
+ cancelled: 'Cancelled',
162
+ },
163
+ };
164
+
165
+ /**
166
+ * Generated bundle index. Do not edit.
167
+ */
168
+
169
+ export { en };
170
+ //# sourceMappingURL=ngneers-controls-i18n-translations-en.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-i18n-translations-en.mjs","sources":["../../src/i18n/translations/en/index.ts","../../src/i18n/translations/en/ngneers-controls-i18n-translations-en.ts"],"sourcesContent":["export const en = {\n calendar: {\n today: 'Today',\n input: 'Date',\n selectYear: 'Select year',\n selectMonth: 'Select month',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n weekdays: {\n monday: 'Monday',\n tuesday: 'Tuesday',\n wednesday: 'Wednesday',\n thursday: 'Thursday',\n friday: 'Friday',\n saturday: 'Saturday',\n sunday: 'Sunday',\n },\n weekdaysShort: {\n monday: 'Mo',\n tuesday: 'Tu',\n wednesday: 'We',\n thursday: 'Th',\n friday: 'Fr',\n saturday: 'Sa',\n sunday: 'Su',\n },\n months: {\n january: 'January',\n february: 'February',\n march: 'March',\n april: 'April',\n may: 'May',\n june: 'June',\n july: 'July',\n august: 'August',\n september: 'September',\n october: 'October',\n november: 'November',\n december: 'December',\n },\n },\n editInplace: {\n placeholder: 'Click to edit',\n confirm: 'Confirm',\n },\n filter: {\n noFilter: 'No filter',\n addCondition: 'Add condition',\n removeCondition: 'Remove condition',\n operator: 'Operator',\n value: 'Value',\n clear: 'Clear',\n apply: 'Apply',\n cancel: 'Cancel',\n matchModeLabel: 'Match mode',\n match: {\n all: 'Match all',\n any: 'Match any',\n and: 'and',\n or: 'or',\n },\n selected: 'selected',\n conditions: 'conditions',\n operators: {\n isEqual: 'Is equal',\n isNotEqual: 'Is not equal',\n contains: 'Contains',\n startsWith: 'Starts with',\n endsWith: 'Ends with',\n in: 'Is one of',\n isEmpty: 'Is empty',\n isNotEmpty: 'Is not empty',\n greaterThan: 'Greater than',\n greaterThanOrEqual: 'Greater than or equal',\n lessThan: 'Less than',\n lessThanOrEqual: 'Less than or equal',\n after: 'After',\n onOrAfter: 'On or after',\n before: 'Before',\n onOrBefore: 'On or before',\n isTrue: 'Yes',\n isFalse: 'No',\n custom: 'Custom',\n },\n },\n splitter: {\n handleLabel: 'Drag to resize',\n },\n inputField: {\n clearInput: 'Clear input',\n },\n maskInput: {\n roleDescription: 'formatted input',\n segmentRange: '{{ name }}, {{ min }} to {{ max }}',\n optionSeparator: ' or ',\n },\n drawer: {\n close: 'Close',\n },\n dialog: {\n close: 'Close',\n },\n chip: {\n close: 'Remove',\n },\n breadcrumb: {\n overflow: 'Show more',\n },\n toast: {\n close: 'Close',\n region: 'Notifications',\n },\n snackbar: {\n close: 'Close',\n region: 'Notifications',\n severity: {\n error: 'Error:',\n warning: 'Warning:',\n success: 'Success:',\n info: 'Info:',\n },\n },\n upload: {\n upload: 'Upload',\n // Per-item action labels are parameterized so locales control word order.\n uploadNamed: 'Upload {{ name }}',\n retryNamed: 'Retry {{ name }}',\n cancelNamed: 'Cancel {{ name }}',\n removeNamed: 'Remove {{ name }}',\n progressNamed: 'Upload progress for {{ name }}',\n },\n select: {\n filterOptions: 'Filter options',\n },\n paginator: {\n previousPage: 'Previous page',\n nextPage: 'Next page',\n },\n listBox: {\n noItemsFound: 'No items found',\n },\n tree: {\n noItemsFound: 'No items found',\n },\n table: {\n selectAllRows: 'Select all rows',\n selectRow: 'Select row',\n sortedBy: 'Sorted by {{ column }}, {{ direction }}',\n sortAscending: 'ascending',\n sortDescending: 'descending',\n sortCleared: 'Sorting cleared',\n selectedCount: '{{ count }} of {{ total }} selected',\n page: 'Page {{ page }} of {{ pages }}',\n resultCount: '{{ count }} results',\n },\n state: {\n loading: 'Loading',\n success: 'Success',\n warning: 'Warning',\n error: 'Error',\n cancelled: 'Cancelled',\n },\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable } from '@angular/core';
3
+ import { BaseTranslateService } from '@ngneers/signal-translate';
4
+ import { NgnError } from '@ngneers/controls/utils';
5
+
6
+ const customLanguages = {};
7
+ function registerCustomLanguage(language, translations) {
8
+ customLanguages[language] = translations;
9
+ }
10
+ function registerCustomLanguages(languages) {
11
+ Object.entries(languages).forEach(([lang, translations]) => {
12
+ registerCustomLanguage(lang, translations);
13
+ });
14
+ }
15
+ async function loadLanguage(language) {
16
+ switch (language) {
17
+ case 'en': {
18
+ const m = await import('@ngneers/controls/i18n/translations/en');
19
+ return m.en;
20
+ }
21
+ case 'de': {
22
+ const m = await import('@ngneers/controls/i18n/translations/de');
23
+ return m.de;
24
+ }
25
+ default:
26
+ if (customLanguages[language]) {
27
+ return customLanguages[language]();
28
+ }
29
+ return Promise.reject(new NgnError('i18n', `Unsupported language: ${language}`));
30
+ }
31
+ }
32
+
33
+ const supportedLanguages = ['en', 'de'];
34
+
35
+ class I18n extends BaseTranslateService {
36
+ constructor() {
37
+ super(supportedLanguages, 'en');
38
+ }
39
+ loadTranslations(lang) {
40
+ return loadLanguage(lang);
41
+ }
42
+ unsafe(key) {
43
+ return this.translations._unsafe[key];
44
+ }
45
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: I18n, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
46
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: I18n });
47
+ }
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: I18n, decorators: [{
49
+ type: Injectable
50
+ }], ctorParameters: () => [] });
51
+
52
+ /**
53
+ * Generated bundle index. Do not edit.
54
+ */
55
+
56
+ export { I18n, loadLanguage, registerCustomLanguage, registerCustomLanguages, supportedLanguages };
57
+ //# sourceMappingURL=ngneers-controls-i18n.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-i18n.mjs","sources":["../../src/i18n/load-language.ts","../../src/i18n/types.ts","../../src/i18n/i18n.ts","../../src/i18n/ngneers-controls-i18n.ts"],"sourcesContent":["import { NgnError } from '@ngneers/controls/utils';\n\nimport type { SupportedLanguage, Translations } from './types';\n\nconst customLanguages: Record<string, (() => Promise<Translations>) | undefined> = {};\n\nexport function registerCustomLanguage(\n language: string,\n translations: () => Promise<Translations>\n): void {\n customLanguages[language] = translations;\n}\n\nexport function registerCustomLanguages(\n languages: Record<string, () => Promise<Translations>>\n): void {\n Object.entries(languages).forEach(([lang, translations]) => {\n registerCustomLanguage(lang, translations);\n });\n}\n\nexport async function loadLanguage(language: SupportedLanguage): Promise<Translations> {\n switch (language) {\n case 'en': {\n const m = await import('@ngneers/controls/i18n/translations/en');\n return m.en;\n }\n case 'de': {\n const m = await import('@ngneers/controls/i18n/translations/de');\n return m.de;\n }\n default:\n if (customLanguages[language]) {\n return customLanguages[language]();\n }\n return Promise.reject(new NgnError('i18n', `Unsupported language: ${language}`));\n }\n}\n","export const supportedLanguages = ['en', 'de'] as const;\nimport type { en as En } from './translations/en';\n\nexport type SupportedLanguage = (typeof supportedLanguages)[number];\n\nexport type Translations = typeof En;\n","import { Injectable, type Signal } from '@angular/core';\nimport { BaseTranslateService } from '@ngneers/signal-translate';\n\nimport { loadLanguage } from './load-language';\nimport { type SupportedLanguage, supportedLanguages, type Translations } from './types';\n\n@Injectable()\nexport class I18n extends BaseTranslateService<Translations> {\n constructor() {\n super(supportedLanguages, 'en');\n }\n\n protected loadTranslations(lang: string): Promise<Translations> {\n return loadLanguage(lang as SupportedLanguage);\n }\n\n public unsafe(key: string): Signal<string> {\n return this.translations._unsafe[key] as unknown as Signal<string>;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAIA,MAAM,eAAe,GAA8D,EAAE;AAE/E,SAAU,sBAAsB,CACpC,QAAgB,EAChB,YAAyC,EAAA;AAEzC,IAAA,eAAe,CAAC,QAAQ,CAAC,GAAG,YAAY;AAC1C;AAEM,SAAU,uBAAuB,CACrC,SAAsD,EAAA;AAEtD,IAAA,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,KAAI;AACzD,QAAA,sBAAsB,CAAC,IAAI,EAAE,YAAY,CAAC;AAC5C,IAAA,CAAC,CAAC;AACJ;AAEO,eAAe,YAAY,CAAC,QAA2B,EAAA;IAC5D,QAAQ,QAAQ;QACd,KAAK,IAAI,EAAE;AACT,YAAA,MAAM,CAAC,GAAG,MAAM,OAAO,wCAAwC,CAAC;YAChE,OAAO,CAAC,CAAC,EAAE;QACb;QACA,KAAK,IAAI,EAAE;AACT,YAAA,MAAM,CAAC,GAAG,MAAM,OAAO,wCAAwC,CAAC;YAChE,OAAO,CAAC,CAAC,EAAE;QACb;AACA,QAAA;AACE,YAAA,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE;AAC7B,gBAAA,OAAO,eAAe,CAAC,QAAQ,CAAC,EAAE;YACpC;AACA,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAE,CAAC,CAAC;;AAEtF;;MCrCa,kBAAkB,GAAG,CAAC,IAAI,EAAE,IAAI;;ACOvC,MAAO,IAAK,SAAQ,oBAAkC,CAAA;AAC1D,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC;IACjC;AAEU,IAAA,gBAAgB,CAAC,IAAY,EAAA;AACrC,QAAA,OAAO,YAAY,CAAC,IAAyB,CAAC;IAChD;AAEO,IAAA,MAAM,CAAC,GAAW,EAAA;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAA8B;IACpE;uGAXW,IAAI,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAJ,IAAI,EAAA,CAAA;;2FAAJ,IAAI,EAAA,UAAA,EAAA,CAAA;kBADhB;;;ACND;;AAEG;;;;"}
@@ -0,0 +1,195 @@
1
+ import * as i0 from '@angular/core';
2
+ import { signal, Service, InjectionToken, inject, input, computed, afterRenderEffect, Component } from '@angular/core';
3
+ import { NgTemplateOutlet } from '@angular/common';
4
+ import { DomSanitizer } from '@angular/platform-browser';
5
+ import { NgnBase, NgnPt, provideSelf } from '@ngneers/controls/base';
6
+ import { NgnError } from '@ngneers/controls/utils';
7
+ import { iconControlTemplate } from '@ngneers/controls-themes/templates/icon';
8
+
9
+ class GlobalIconTemplate {
10
+ _globalIconTemplate = signal(null, /* @ts-ignore */
11
+ ...(ngDevMode ? [{ debugName: "_globalIconTemplate" }] : /* istanbul ignore next */ []));
12
+ globalIconTemplate = this._globalIconTemplate.asReadonly();
13
+ setGlobalIconTemplate(template) {
14
+ this._globalIconTemplate.set(template);
15
+ }
16
+ ngOnDestroy() {
17
+ this._globalIconTemplate.set(null);
18
+ }
19
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GlobalIconTemplate, deps: [], target: i0.ɵɵFactoryTarget.Service });
20
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.5", ngImport: i0, type: GlobalIconTemplate });
21
+ }
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GlobalIconTemplate, decorators: [{
23
+ type: Service
24
+ }] });
25
+
26
+ const NGN_ICON_KEYS = [
27
+ 'accordion-collapse',
28
+ 'accordion-expand',
29
+ 'breadcrumb-separator',
30
+ 'breadcrumb-overflow',
31
+ 'calendar-trigger',
32
+ 'calendar-previous-month',
33
+ 'calendar-next-month',
34
+ 'checkbox-checked',
35
+ 'checkbox-indeterminate',
36
+ 'chip-remove',
37
+ 'dialog-close',
38
+ 'drawer-close',
39
+ 'dropdown-toggle',
40
+ 'edit-confirm',
41
+ 'filter-active',
42
+ 'filter-inactive',
43
+ 'filter-remove',
44
+ 'hint-info',
45
+ 'hint-success',
46
+ 'hint-warning',
47
+ 'hint-error',
48
+ 'input-clear',
49
+ 'menu-submenu',
50
+ 'paginator-previous',
51
+ 'paginator-next',
52
+ 'search',
53
+ 'sort-neutral',
54
+ 'sort-ascending',
55
+ 'sort-descending',
56
+ 'spin-decrement',
57
+ 'spin-increment',
58
+ 'table-group-toggle',
59
+ 'tabs-scroll-left',
60
+ 'tabs-scroll-right',
61
+ 'toast-close',
62
+ 'snackbar-close',
63
+ 'upload-trigger',
64
+ 'upload-done',
65
+ 'upload-failed',
66
+ 'upload-retry',
67
+ 'upload-cancel',
68
+ 'upload-remove',
69
+ ];
70
+ const NGN_ICON_REGISTRY = new InjectionToken('NGN_ICON_REGISTRY');
71
+ const NGN_CUSTOM_ICONS = new InjectionToken('NGN_CUSTOM_ICONS');
72
+ function withCustomIcons(registry) {
73
+ return {
74
+ providers: [
75
+ { provide: NGN_ICON_REGISTRY, useValue: registry },
76
+ { provide: NGN_CUSTOM_ICONS, useValue: true },
77
+ ],
78
+ };
79
+ }
80
+
81
+ function generateIconSvg(sanitizer, iconData, scale) {
82
+ // Note: @iconify/types documents default as 16, but we default to 24 to match Tabler.
83
+ // All Tabler icons provide explicit dimensions, so this fallback rarely triggers.
84
+ const width = iconData.width ?? 24;
85
+ const height = iconData.height ?? 24;
86
+ const insetX = scale === 1 ? 0 : ((scale - 1) / scale) * (width / 2);
87
+ const insetY = scale === 1 ? 0 : ((scale - 1) / scale) * (height / 2);
88
+ const vbX = insetX;
89
+ const vbY = insetY;
90
+ const vbW = width - insetX * 2;
91
+ const vbH = height - insetY * 2;
92
+ return sanitizer.bypassSecurityTrustHtml(`<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="${vbX} ${vbY} ${vbW} ${vbH}">${iconData.body}</svg>`);
93
+ }
94
+ /**
95
+ * @category control
96
+ */
97
+ class NgnIcon extends NgnBase {
98
+ theme = this.injectThemeTemplate(iconControlTemplate, 'root');
99
+ _globalIconTemplate = inject(GlobalIconTemplate).globalIconTemplate;
100
+ _sanitizer = inject(DomSanitizer);
101
+ _registry = inject(NGN_ICON_REGISTRY, { optional: true });
102
+ _isCustom = inject(NGN_CUSTOM_ICONS, { optional: true }) ?? false;
103
+ /**
104
+ * A key into the registered icon set (from `withDefaultIcons()` or `withCustomIcons()`).
105
+ * Used as a fallback when {@link icon} is not provided; requires an icon registry.
106
+ * @default undefined
107
+ */
108
+ defaultIcon = input(/* @ts-ignore */
109
+ ...(ngDevMode ? [undefined, { debugName: "defaultIcon" }] : /* istanbul ignore next */ []));
110
+ /**
111
+ * The icon to render. Accepts an Iconify data object, a registered icon entry, or a
112
+ * custom value resolved via the {@link GlobalIconTemplate}. Takes precedence over {@link defaultIcon}.
113
+ * @default undefined
114
+ */
115
+ icon = input(/* @ts-ignore */
116
+ ...(ngDevMode ? [undefined, { debugName: "icon" }] : /* istanbul ignore next */ []));
117
+ iconSvg = computed(() => {
118
+ const value = this.icon();
119
+ if (!value || typeof value !== 'object')
120
+ return null;
121
+ let iconData;
122
+ let scale = 1;
123
+ if ('body' in value) {
124
+ iconData = value;
125
+ }
126
+ else if ('icon' in value && typeof value.icon === 'object' && 'body' in value.icon) {
127
+ const entry = value;
128
+ iconData = entry.icon;
129
+ scale = entry.scale ?? 1;
130
+ }
131
+ else {
132
+ return null;
133
+ }
134
+ return generateIconSvg(this._sanitizer, iconData, scale);
135
+ }, /* @ts-ignore */
136
+ ...(ngDevMode ? [{ debugName: "iconSvg" }] : /* istanbul ignore next */ []));
137
+ defaultIconSvg = computed(() => {
138
+ const key = this.defaultIcon();
139
+ if (!key || this._isCustom || !this._registry)
140
+ return null;
141
+ const raw = this._registry[key];
142
+ const entry = 'body' in raw ? { icon: raw, scale: 1 } : raw;
143
+ return generateIconSvg(this._sanitizer, entry.icon, entry.scale ?? 1);
144
+ }, /* @ts-ignore */
145
+ ...(ngDevMode ? [{ debugName: "defaultIconSvg" }] : /* istanbul ignore next */ []));
146
+ customDefaultIcon = computed(() => {
147
+ const key = this.defaultIcon();
148
+ if (!key || !this._isCustom || !this._registry)
149
+ return null;
150
+ return this._registry[key];
151
+ }, /* @ts-ignore */
152
+ ...(ngDevMode ? [{ debugName: "customDefaultIcon" }] : /* istanbul ignore next */ []));
153
+ iconTemplate = computed(() => this._globalIconTemplate(), /* @ts-ignore */
154
+ ...(ngDevMode ? [{ debugName: "iconTemplate" }] : /* istanbul ignore next */ []));
155
+ constructor() {
156
+ super();
157
+ // Invariant checks live here — NOT inside the computeds above.
158
+ // Throwing inside a computed() is swallowed by Angular's reactive graph:
159
+ // producerRecomputeValue caches the error and only re-throws on a direct
160
+ // getter read, so a recompute during change-detection producer polling
161
+ // runs the body (firing the NgnError constructor's fancy log) without ever
162
+ // surfacing the error. afterRenderEffect throws surface reliably.
163
+ afterRenderEffect(() => {
164
+ const icon = this.icon();
165
+ const defaultIcon = this.defaultIcon();
166
+ if (!icon && !defaultIcon) {
167
+ throw new NgnError('icon', 'Icon component requires either an icon or a default icon to be set.');
168
+ }
169
+ if (defaultIcon && !this._registry) {
170
+ throw new NgnError('icon', 'No icon registry provided. Add withDefaultIcons() or withCustomIcons() to your provideNgnControls() call.');
171
+ }
172
+ // The template path is used for non-Iconify [icon] values and for custom
173
+ // default icons; both require a registered GlobalIconTemplate.
174
+ const needsTemplate = (!!icon && !this.iconSvg()) || !!this.customDefaultIcon();
175
+ if (needsTemplate && !this._globalIconTemplate()) {
176
+ throw new NgnError('icon', 'No GlobalIconTemplate registered. Required when using [icon] with non-Iconify values or withCustomIcons() with [defaultIcon]. If using Iconify, pass an IconifyIcon data object (e.g., import tablerUser from "@iconify/icons-tabler/user").');
177
+ }
178
+ });
179
+ }
180
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnIcon, deps: [], target: i0.ɵɵFactoryTarget.Component });
181
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: NgnIcon, isStandalone: true, selector: "ngn-icon", inputs: { defaultIcon: { classPropertyName: "defaultIcon", publicName: "defaultIcon", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "ngSkipHydration": "true" } }, providers: [provideSelf(NgnIcon)], usesInheritance: true, ngImport: i0, template: "@if (iconSvg(); as svg) {\n <div [ptInt]=\"this\" [ptClass]=\"'default'\" [innerHtml]=\"svg\"></div>\n} @else if (icon()) {\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate();\n context: {\n $implicit: {\n icon: icon(),\n },\n }\n \"\n >\n </ng-container>\n} @else if (customDefaultIcon(); as customIcon) {\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate();\n context: {\n $implicit: {\n icon: customIcon,\n },\n }\n \"\n >\n </ng-container>\n} @else {\n @if (defaultIconSvg(); as defaultIcon) {\n <div [ptInt]=\"this\" [ptClass]=\"'default'\" [innerHtml]=\"defaultIcon\"></div>\n }\n}\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
182
+ }
183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnIcon, decorators: [{
184
+ type: Component,
185
+ args: [{ selector: 'ngn-icon', imports: [NgnPt, NgTemplateOutlet], providers: [provideSelf(NgnIcon)], host: {
186
+ ngSkipHydration: 'true',
187
+ }, template: "@if (iconSvg(); as svg) {\n <div [ptInt]=\"this\" [ptClass]=\"'default'\" [innerHtml]=\"svg\"></div>\n} @else if (icon()) {\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate();\n context: {\n $implicit: {\n icon: icon(),\n },\n }\n \"\n >\n </ng-container>\n} @else if (customDefaultIcon(); as customIcon) {\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate();\n context: {\n $implicit: {\n icon: customIcon,\n },\n }\n \"\n >\n </ng-container>\n} @else {\n @if (defaultIconSvg(); as defaultIcon) {\n <div [ptInt]=\"this\" [ptClass]=\"'default'\" [innerHtml]=\"defaultIcon\"></div>\n }\n}\n" }]
188
+ }], ctorParameters: () => [], propDecorators: { defaultIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultIcon", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }] } });
189
+
190
+ /**
191
+ * Generated bundle index. Do not edit.
192
+ */
193
+
194
+ export { GlobalIconTemplate, NGN_CUSTOM_ICONS, NGN_ICON_KEYS, NGN_ICON_REGISTRY, NgnIcon, withCustomIcons };
195
+ //# sourceMappingURL=ngneers-controls-icon.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-icon.mjs","sources":["../../src/icon/global-icon-template.ts","../../src/icon/icon-registry.ts","../../src/icon/icon.ts","../../src/icon/icon.html","../../src/icon/ngneers-controls-icon.ts"],"sourcesContent":["import { signal, TemplateRef, type OnDestroy, Service } from '@angular/core';\n\nimport type { IconTemplateContext } from './types';\n\nexport type IconTemplateType = TemplateRef<IconTemplateContext>;\n\n@Service()\nexport class GlobalIconTemplate implements OnDestroy {\n private readonly _globalIconTemplate = signal<IconTemplateType | null>(null);\n\n public readonly globalIconTemplate = this._globalIconTemplate.asReadonly();\n\n public setGlobalIconTemplate(template: IconTemplateType) {\n this._globalIconTemplate.set(template);\n }\n\n public ngOnDestroy() {\n this._globalIconTemplate.set(null);\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nimport type { IconifyIcon } from '@iconify/types';\nimport type { NgnFeature } from '@ngneers/controls/api/ng';\nimport type { IconType, NgnIconEntry } from '@ngneers/controls-custom-types';\n\nexport type { NgnIconEntry } from '@ngneers/controls-custom-types';\n\nexport const NGN_ICON_KEYS = [\n 'accordion-collapse',\n 'accordion-expand',\n 'breadcrumb-separator',\n 'breadcrumb-overflow',\n 'calendar-trigger',\n 'calendar-previous-month',\n 'calendar-next-month',\n 'checkbox-checked',\n 'checkbox-indeterminate',\n 'chip-remove',\n 'dialog-close',\n 'drawer-close',\n 'dropdown-toggle',\n 'edit-confirm',\n 'filter-active',\n 'filter-inactive',\n 'filter-remove',\n 'hint-info',\n 'hint-success',\n 'hint-warning',\n 'hint-error',\n 'input-clear',\n 'menu-submenu',\n 'paginator-previous',\n 'paginator-next',\n 'search',\n 'sort-neutral',\n 'sort-ascending',\n 'sort-descending',\n 'spin-decrement',\n 'spin-increment',\n 'table-group-toggle',\n 'tabs-scroll-left',\n 'tabs-scroll-right',\n 'toast-close',\n 'snackbar-close',\n 'upload-trigger',\n 'upload-done',\n 'upload-failed',\n 'upload-retry',\n 'upload-cancel',\n 'upload-remove',\n] as const;\n\nexport type NgnIconKey = (typeof NGN_ICON_KEYS)[number];\n\nexport type NgnIconRegistry = Record<NgnIconKey, IconifyIcon | NgnIconEntry>;\n\nexport type NgnCustomIconRegistry = Record<NgnIconKey, IconType>;\n\nexport const NGN_ICON_REGISTRY = new InjectionToken<NgnIconRegistry | NgnCustomIconRegistry>(\n 'NGN_ICON_REGISTRY'\n);\n\nexport const NGN_CUSTOM_ICONS = new InjectionToken<boolean>('NGN_CUSTOM_ICONS');\n\nexport function withCustomIcons(registry: NgnCustomIconRegistry): NgnFeature {\n return {\n providers: [\n { provide: NGN_ICON_REGISTRY, useValue: registry },\n { provide: NGN_CUSTOM_ICONS, useValue: true },\n ],\n };\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { afterRenderEffect, Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\nimport { NgnError } from '@ngneers/controls/utils';\nimport { iconControlTemplate } from '@ngneers/controls-themes/templates/icon';\n\nimport { GlobalIconTemplate } from './global-icon-template';\nimport { NGN_CUSTOM_ICONS, NGN_ICON_REGISTRY } from './icon-registry';\n\nimport type { NgnIconEntry, NgnIconKey, NgnIconRegistry } from './icon-registry';\nimport type { IconifyIcon } from '@iconify/types';\nimport type { IconType } from '@ngneers/controls-custom-types';\n\nfunction generateIconSvg(sanitizer: DomSanitizer, iconData: IconifyIcon, scale: number): SafeHtml {\n // Note: @iconify/types documents default as 16, but we default to 24 to match Tabler.\n // All Tabler icons provide explicit dimensions, so this fallback rarely triggers.\n const width = iconData.width ?? 24;\n const height = iconData.height ?? 24;\n\n const insetX = scale === 1 ? 0 : ((scale - 1) / scale) * (width / 2);\n const insetY = scale === 1 ? 0 : ((scale - 1) / scale) * (height / 2);\n const vbX = insetX;\n const vbY = insetY;\n const vbW = width - insetX * 2;\n const vbH = height - insetY * 2;\n\n return sanitizer.bypassSecurityTrustHtml(\n `<svg xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" viewBox=\"${vbX} ${vbY} ${vbW} ${vbH}\">${iconData.body}</svg>`\n );\n}\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-icon',\n templateUrl: './icon.html',\n imports: [NgnPt, NgTemplateOutlet],\n providers: [provideSelf(NgnIcon)],\n host: {\n ngSkipHydration: 'true',\n },\n})\nexport class NgnIcon extends NgnBase<'icon'> {\n protected readonly theme = this.injectThemeTemplate(iconControlTemplate, 'root');\n private readonly _globalIconTemplate = inject(GlobalIconTemplate).globalIconTemplate;\n private readonly _sanitizer = inject(DomSanitizer);\n private readonly _registry = inject(NGN_ICON_REGISTRY, { optional: true });\n private readonly _isCustom = inject(NGN_CUSTOM_ICONS, { optional: true }) ?? false;\n\n /**\n * A key into the registered icon set (from `withDefaultIcons()` or `withCustomIcons()`).\n * Used as a fallback when {@link icon} is not provided; requires an icon registry.\n * @default undefined\n */\n public readonly defaultIcon = input<NgnIconKey>();\n /**\n * The icon to render. Accepts an Iconify data object, a registered icon entry, or a\n * custom value resolved via the {@link GlobalIconTemplate}. Takes precedence over {@link defaultIcon}.\n * @default undefined\n */\n public readonly icon = input<IconType>();\n\n protected readonly iconSvg = computed(() => {\n const value = this.icon();\n if (!value || typeof value !== 'object') return null;\n\n let iconData: IconifyIcon;\n let scale = 1;\n\n if ('body' in value) {\n iconData = value as IconifyIcon;\n } else if ('icon' in value && typeof value.icon === 'object' && 'body' in value.icon) {\n const entry = value as NgnIconEntry;\n iconData = entry.icon;\n scale = entry.scale ?? 1;\n } else {\n return null;\n }\n\n return generateIconSvg(this._sanitizer, iconData, scale);\n });\n\n protected readonly defaultIconSvg = computed(() => {\n const key = this.defaultIcon();\n if (!key || this._isCustom || !this._registry) return null;\n const raw = (this._registry as NgnIconRegistry)[key];\n const entry: NgnIconEntry =\n 'body' in raw ? { icon: raw as IconifyIcon, scale: 1 } : (raw as NgnIconEntry);\n\n return generateIconSvg(this._sanitizer, entry.icon, entry.scale ?? 1);\n });\n\n protected readonly customDefaultIcon = computed(() => {\n const key = this.defaultIcon();\n if (!key || !this._isCustom || !this._registry) return null;\n return this._registry[key] as IconType;\n });\n\n protected readonly iconTemplate = computed(() => this._globalIconTemplate());\n\n constructor() {\n super();\n // Invariant checks live here — NOT inside the computeds above.\n // Throwing inside a computed() is swallowed by Angular's reactive graph:\n // producerRecomputeValue caches the error and only re-throws on a direct\n // getter read, so a recompute during change-detection producer polling\n // runs the body (firing the NgnError constructor's fancy log) without ever\n // surfacing the error. afterRenderEffect throws surface reliably.\n afterRenderEffect(() => {\n const icon = this.icon();\n const defaultIcon = this.defaultIcon();\n\n if (!icon && !defaultIcon) {\n throw new NgnError(\n 'icon',\n 'Icon component requires either an icon or a default icon to be set.'\n );\n }\n\n if (defaultIcon && !this._registry) {\n throw new NgnError(\n 'icon',\n 'No icon registry provided. Add withDefaultIcons() or withCustomIcons() to your provideNgnControls() call.'\n );\n }\n\n // The template path is used for non-Iconify [icon] values and for custom\n // default icons; both require a registered GlobalIconTemplate.\n const needsTemplate = (!!icon && !this.iconSvg()) || !!this.customDefaultIcon();\n if (needsTemplate && !this._globalIconTemplate()) {\n throw new NgnError(\n 'icon',\n 'No GlobalIconTemplate registered. Required when using [icon] with non-Iconify values or withCustomIcons() with [defaultIcon]. If using Iconify, pass an IconifyIcon data object (e.g., import tablerUser from \"@iconify/icons-tabler/user\").'\n );\n }\n });\n }\n}\n","@if (iconSvg(); as svg) {\n <div [ptInt]=\"this\" [ptClass]=\"'default'\" [innerHtml]=\"svg\"></div>\n} @else if (icon()) {\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate();\n context: {\n $implicit: {\n icon: icon(),\n },\n }\n \"\n >\n </ng-container>\n} @else if (customDefaultIcon(); as customIcon) {\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate();\n context: {\n $implicit: {\n icon: customIcon,\n },\n }\n \"\n >\n </ng-container>\n} @else {\n @if (defaultIconSvg(); as defaultIcon) {\n <div [ptInt]=\"this\" [ptClass]=\"'default'\" [innerHtml]=\"defaultIcon\"></div>\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { contentChild, input, computed, Directive, viewChild, afterRenderEffect, model, booleanAttribute, Component } from '@angular/core';
4
+ import { NgnBase, NgnPt, provideSelf } from '@ngneers/controls/base';
5
+ import { NgnDefer } from '@ngneers/controls/defer';
6
+ import { signalWithPrevious } from '@ngneers/controls/utils-ng';
7
+ import { inplaceControlTemplate } from '@ngneers/controls-themes/templates/inplace';
8
+ import { templateTypesFn } from '@ngneers/controls/api/ng';
9
+
10
+ class InplaceTemplates extends NgnBase {
11
+ // Display template
12
+ _userDisplayTemplate = contentChild('display', /* @ts-ignore */
13
+ ...(ngDevMode ? [{ debugName: "_userDisplayTemplate" }] : /* istanbul ignore next */ []));
14
+ /**
15
+ * Set a custom template for the display.
16
+ * Can also be set using an `<ng-template>` element with `#display` template reference variable.
17
+ */
18
+ templateDisplay = input(null, /* @ts-ignore */
19
+ ...(ngDevMode ? [{ debugName: "templateDisplay" }] : /* istanbul ignore next */ []));
20
+ displayTemplate = computed(() => this._userDisplayTemplate() ?? this.templateDisplay(), /* @ts-ignore */
21
+ ...(ngDevMode ? [{ debugName: "displayTemplate" }] : /* istanbul ignore next */ []));
22
+ /**
23
+ * Context for the display template.
24
+ */
25
+ templateDisplayContext = input(/* @ts-ignore */
26
+ ...(ngDevMode ? [undefined, { debugName: "templateDisplayContext" }] : /* istanbul ignore next */ []));
27
+ // Content template
28
+ _userContentTemplate = contentChild('content', /* @ts-ignore */
29
+ ...(ngDevMode ? [{ debugName: "_userContentTemplate" }] : /* istanbul ignore next */ []));
30
+ /**
31
+ * Set a custom template for the content.
32
+ * Can also be set using an `<ng-template>` element with `#content` template reference variable.
33
+ */
34
+ templateContent = input(null, /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "templateContent" }] : /* istanbul ignore next */ []));
36
+ contentTemplate = computed(() => this._userContentTemplate() ?? this.templateContent(), /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "contentTemplate" }] : /* istanbul ignore next */ []));
38
+ /**
39
+ * Context for the content template.
40
+ */
41
+ templateContentContext = input(/* @ts-ignore */
42
+ ...(ngDevMode ? [undefined, { debugName: "templateContentContext" }] : /* istanbul ignore next */ []));
43
+ /**
44
+ * Types for the inplace templates.
45
+ */
46
+ templateTypes = templateTypesFn();
47
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: InplaceTemplates, deps: null, target: i0.ɵɵFactoryTarget.Directive });
48
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.0.5", type: InplaceTemplates, isStandalone: true, inputs: { templateDisplay: { classPropertyName: "templateDisplay", publicName: "templateDisplay", isSignal: true, isRequired: false, transformFunction: null }, templateDisplayContext: { classPropertyName: "templateDisplayContext", publicName: "templateDisplayContext", isSignal: true, isRequired: false, transformFunction: null }, templateContent: { classPropertyName: "templateContent", publicName: "templateContent", isSignal: true, isRequired: false, transformFunction: null }, templateContentContext: { classPropertyName: "templateContentContext", publicName: "templateContentContext", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "_userDisplayTemplate", first: true, predicate: ["display"], descendants: true, isSignal: true }, { propertyName: "_userContentTemplate", first: true, predicate: ["content"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 });
49
+ }
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: InplaceTemplates, decorators: [{
51
+ type: Directive
52
+ }], propDecorators: { _userDisplayTemplate: [{ type: i0.ContentChild, args: ['display', { isSignal: true }] }], templateDisplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateDisplay", required: false }] }], templateDisplayContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateDisplayContext", required: false }] }], _userContentTemplate: [{ type: i0.ContentChild, args: ['content', { isSignal: true }] }], templateContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateContent", required: false }] }], templateContentContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateContentContext", required: false }] }] } });
53
+
54
+ /**
55
+ * @category control
56
+ */
57
+ class NgnInplace extends InplaceTemplates {
58
+ theme = this.injectThemeTemplate(inplaceControlTemplate, {
59
+ root: true,
60
+ disabled: () => this.disabled(),
61
+ });
62
+ closeContent = this.switchToDisplay.bind(this);
63
+ _displayTrigger = viewChild('displayTrigger', /* @ts-ignore */
64
+ ...(ngDevMode ? [{ debugName: "_displayTrigger" }] : /* istanbul ignore next */ []));
65
+ _contentRef = viewChild('contentRef', /* @ts-ignore */
66
+ ...(ngDevMode ? [{ debugName: "_contentRef" }] : /* istanbul ignore next */ []));
67
+ constructor() {
68
+ super();
69
+ // `contentVisible` is declared below; its field initializer has already run by
70
+ // the time this constructor body executes, so it is safe to read here.
71
+ const contentVisibleWithPrevious = signalWithPrevious(this.contentVisible);
72
+ // Keep focus with the user across the display↔content swap — the outgoing view
73
+ // is unmounted, which would otherwise drop focus to the document body. Both
74
+ // directions only act when focus WAS dropped to the body, never when the content
75
+ // (or something else on the page) already claimed it — so a content control that
76
+ // autofocuses itself (e.g. edit-inplace's input) keeps focus. Runs after render
77
+ // so the target element exists.
78
+ afterRenderEffect(() => {
79
+ const { current: visible, previous } = contentVisibleWithPrevious();
80
+ const doc = this.element.nativeElement.ownerDocument;
81
+ const active = doc.activeElement;
82
+ const droppedToBody = active === null || active === doc.body;
83
+ if (!droppedToBody) {
84
+ return;
85
+ }
86
+ if (visible && previous === false) {
87
+ // Opened: move focus into the content region so it is not stranded.
88
+ this._contentRef()?.nativeElement.focus();
89
+ }
90
+ else if (!visible && previous === true) {
91
+ // Closed: return focus to the display trigger.
92
+ this._displayTrigger()?.nativeElement.focus();
93
+ }
94
+ });
95
+ }
96
+ /**
97
+ * Controls the visibility of the content.
98
+ */
99
+ contentVisible = model(false, /* @ts-ignore */
100
+ ...(ngDevMode ? [{ debugName: "contentVisible" }] : /* istanbul ignore next */ []));
101
+ /**
102
+ * Whether the content is loaded lazily.
103
+ * @default true
104
+ */
105
+ lazy = input(true, { ...(ngDevMode ? { debugName: "lazy" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
106
+ /**
107
+ * Whether the content is cached when closed.
108
+ * @default false
109
+ */
110
+ cache = input(false, { ...(ngDevMode ? { debugName: "cache" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
111
+ /**
112
+ * Explicitly apply disabled state styling
113
+ * @default false
114
+ */
115
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
116
+ /**
117
+ * Switches to the content view.
118
+ */
119
+ switchToContent() {
120
+ if (this.disabled()) {
121
+ return;
122
+ }
123
+ this.contentVisible.set(true);
124
+ }
125
+ /**
126
+ * Switches to the display view.
127
+ */
128
+ switchToDisplay() {
129
+ this.contentVisible.set(false);
130
+ }
131
+ /**
132
+ * Toggles between the display and content views.
133
+ */
134
+ toggle() {
135
+ this.contentVisible.update(v => !v);
136
+ }
137
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnInplace, deps: [], target: i0.ɵɵFactoryTarget.Component });
138
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: NgnInplace, isStandalone: true, selector: "ngn-inplace", inputs: { contentVisible: { classPropertyName: "contentVisible", publicName: "contentVisible", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, cache: { classPropertyName: "cache", publicName: "cache", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { contentVisible: "contentVisibleChange" }, providers: [provideSelf(NgnInplace)], viewQueries: [{ propertyName: "_displayTrigger", first: true, predicate: ["displayTrigger"], descendants: true, isSignal: true }, { propertyName: "_contentRef", first: true, predicate: ["contentRef"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (contentVisible()) {\n <div #contentRef tabindex=\"-1\" [ptInt]=\"this\" [ptClass]=\"'content'\">\n <ngn-defer\n [open]=\"contentVisible()\"\n [lazyContent]=\"contentTemplate()\"\n [lazyContentContext]=\"templateContentContext() ?? { $implicit: { close: closeContent } }\"\n [lazy]=\"lazy()\"\n [cache]=\"cache()\"\n />\n </div>\n} @else {\n <button\n #displayTrigger\n type=\"button\"\n [ptInt]=\"this\"\n [ptClass]=\"'display'\"\n (click)=\"switchToContent()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"displayTemplate()\"\n [ngTemplateOutletContext]=\"templateDisplayContext()\"\n />\n </button>\n}\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgnDefer, selector: "ngn-defer", inputs: ["lazyContent", "lazyContentContext", "open", "lazy", "cache", "hiddenOnClosed"] }] });
139
+ }
140
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnInplace, decorators: [{
141
+ type: Component,
142
+ args: [{ selector: 'ngn-inplace', imports: [NgnPt, NgTemplateOutlet, NgnDefer], providers: [provideSelf(NgnInplace)], template: "@if (contentVisible()) {\n <div #contentRef tabindex=\"-1\" [ptInt]=\"this\" [ptClass]=\"'content'\">\n <ngn-defer\n [open]=\"contentVisible()\"\n [lazyContent]=\"contentTemplate()\"\n [lazyContentContext]=\"templateContentContext() ?? { $implicit: { close: closeContent } }\"\n [lazy]=\"lazy()\"\n [cache]=\"cache()\"\n />\n </div>\n} @else {\n <button\n #displayTrigger\n type=\"button\"\n [ptInt]=\"this\"\n [ptClass]=\"'display'\"\n (click)=\"switchToContent()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"displayTemplate()\"\n [ngTemplateOutletContext]=\"templateDisplayContext()\"\n />\n </button>\n}\n" }]
143
+ }], ctorParameters: () => [], propDecorators: { _displayTrigger: [{ type: i0.ViewChild, args: ['displayTrigger', { isSignal: true }] }], _contentRef: [{ type: i0.ViewChild, args: ['contentRef', { isSignal: true }] }], contentVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentVisible", required: false }] }, { type: i0.Output, args: ["contentVisibleChange"] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], cache: [{ type: i0.Input, args: [{ isSignal: true, alias: "cache", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
144
+
145
+ /**
146
+ * Generated bundle index. Do not edit.
147
+ */
148
+
149
+ export { NgnInplace };
150
+ //# sourceMappingURL=ngneers-controls-inplace.mjs.map