@lucca-front/ng 21.4.0 → 21.4.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 (150) hide show
  1. package/fesm2022/lucca-front-ng-a11y.mjs +9 -9
  2. package/fesm2022/lucca-front-ng-activity-feed.mjs +9 -9
  3. package/fesm2022/lucca-front-ng-api.mjs +40 -40
  4. package/fesm2022/lucca-front-ng-app-layout.mjs +3 -3
  5. package/fesm2022/lucca-front-ng-box.mjs +3 -3
  6. package/fesm2022/lucca-front-ng-breadcrumbs.mjs +6 -6
  7. package/fesm2022/lucca-front-ng-bubble-icon.mjs +3 -3
  8. package/fesm2022/lucca-front-ng-bubble-illustration.mjs +3 -3
  9. package/fesm2022/lucca-front-ng-callout.mjs +24 -24
  10. package/fesm2022/lucca-front-ng-chip.mjs +3 -3
  11. package/fesm2022/lucca-front-ng-clear.mjs +3 -3
  12. package/fesm2022/lucca-front-ng-code.mjs +3 -3
  13. package/fesm2022/lucca-front-ng-color.mjs +3 -3
  14. package/fesm2022/lucca-front-ng-comment.mjs +9 -9
  15. package/fesm2022/lucca-front-ng-container.mjs +3 -3
  16. package/fesm2022/lucca-front-ng-core-select-api.mjs +20 -16
  17. package/fesm2022/lucca-front-ng-core-select-api.mjs.map +1 -1
  18. package/fesm2022/lucca-front-ng-core-select-department.mjs +6 -6
  19. package/fesm2022/lucca-front-ng-core-select-establishment.mjs +9 -9
  20. package/fesm2022/lucca-front-ng-core-select-job-qualification.mjs +6 -6
  21. package/fesm2022/lucca-front-ng-core-select-occupation-category.mjs +3 -3
  22. package/fesm2022/lucca-front-ng-core-select-user.mjs +21 -19
  23. package/fesm2022/lucca-front-ng-core-select-user.mjs.map +1 -1
  24. package/fesm2022/lucca-front-ng-core-select.mjs +51 -51
  25. package/fesm2022/lucca-front-ng-core.mjs +15 -15
  26. package/fesm2022/lucca-front-ng-data-table.mjs +24 -24
  27. package/fesm2022/lucca-front-ng-date.mjs +40 -40
  28. package/fesm2022/lucca-front-ng-date2.mjs +20 -20
  29. package/fesm2022/lucca-front-ng-date2.mjs.map +1 -1
  30. package/fesm2022/lucca-front-ng-department.mjs +24 -24
  31. package/fesm2022/lucca-front-ng-dialog.mjs +69 -52
  32. package/fesm2022/lucca-front-ng-dialog.mjs.map +1 -1
  33. package/fesm2022/lucca-front-ng-divider.mjs +3 -3
  34. package/fesm2022/lucca-front-ng-dropdown.mjs +40 -40
  35. package/fesm2022/lucca-front-ng-empty-state.mjs +9 -9
  36. package/fesm2022/lucca-front-ng-error-page.mjs +4 -4
  37. package/fesm2022/lucca-front-ng-error-page.mjs.map +1 -1
  38. package/fesm2022/lucca-front-ng-establishment.mjs +33 -33
  39. package/fesm2022/lucca-front-ng-fancy-box.mjs +3 -3
  40. package/fesm2022/lucca-front-ng-file-upload.mjs +15 -15
  41. package/fesm2022/lucca-front-ng-filter-pills.mjs +22 -22
  42. package/fesm2022/lucca-front-ng-filter-pills.mjs.map +1 -1
  43. package/fesm2022/lucca-front-ng-footer.mjs +4 -4
  44. package/fesm2022/lucca-front-ng-footer.mjs.map +1 -1
  45. package/fesm2022/lucca-front-ng-form-field.mjs +20 -20
  46. package/fesm2022/lucca-front-ng-form-field.mjs.map +1 -1
  47. package/fesm2022/lucca-front-ng-form-header.mjs +3 -3
  48. package/fesm2022/lucca-front-ng-form-label.mjs +3 -3
  49. package/fesm2022/lucca-front-ng-form.mjs +3 -3
  50. package/fesm2022/lucca-front-ng-formly.mjs +58 -58
  51. package/fesm2022/lucca-front-ng-forms-phone-number-input.mjs +6 -6
  52. package/fesm2022/lucca-front-ng-forms-rich-text-input-formatters-html.mjs +3 -3
  53. package/fesm2022/lucca-front-ng-forms-rich-text-input-formatters-markdown.mjs +6 -6
  54. package/fesm2022/lucca-front-ng-forms-rich-text-input-formatters-plain-text.mjs +3 -3
  55. package/fesm2022/lucca-front-ng-forms-rich-text-input.mjs +53 -38
  56. package/fesm2022/lucca-front-ng-forms-rich-text-input.mjs.map +1 -1
  57. package/fesm2022/lucca-front-ng-forms.mjs +59 -48
  58. package/fesm2022/lucca-front-ng-forms.mjs.map +1 -1
  59. package/fesm2022/lucca-front-ng-gauge.mjs +3 -3
  60. package/fesm2022/lucca-front-ng-grid.mjs +6 -6
  61. package/fesm2022/lucca-front-ng-highlight-data.mjs +4 -4
  62. package/fesm2022/lucca-front-ng-highlight-data.mjs.map +1 -1
  63. package/fesm2022/lucca-front-ng-highlight-text.mjs +3 -3
  64. package/fesm2022/lucca-front-ng-horizontal-navigation.mjs +11 -11
  65. package/fesm2022/lucca-front-ng-horizontal-navigation.mjs.map +1 -1
  66. package/fesm2022/lucca-front-ng-impersonation.mjs +3 -3
  67. package/fesm2022/lucca-front-ng-index-table.mjs +30 -30
  68. package/fesm2022/lucca-front-ng-inline-message.mjs +3 -3
  69. package/fesm2022/lucca-front-ng-input.mjs +21 -21
  70. package/fesm2022/lucca-front-ng-link.mjs +16 -8
  71. package/fesm2022/lucca-front-ng-link.mjs.map +1 -1
  72. package/fesm2022/lucca-front-ng-listbox.mjs +9 -9
  73. package/fesm2022/lucca-front-ng-listing.mjs +6 -6
  74. package/fesm2022/lucca-front-ng-loading.mjs +3 -3
  75. package/fesm2022/lucca-front-ng-main-layout.mjs +6 -6
  76. package/fesm2022/lucca-front-ng-mobile-push.mjs +3 -3
  77. package/fesm2022/lucca-front-ng-modal.mjs +22 -22
  78. package/fesm2022/lucca-front-ng-multi-select.mjs +95 -78
  79. package/fesm2022/lucca-front-ng-multi-select.mjs.map +1 -1
  80. package/fesm2022/lucca-front-ng-new-badge.mjs +3 -3
  81. package/fesm2022/lucca-front-ng-number-format.mjs +6 -6
  82. package/fesm2022/lucca-front-ng-number.mjs +7 -7
  83. package/fesm2022/lucca-front-ng-numeric-badge.mjs +3 -3
  84. package/fesm2022/lucca-front-ng-option.mjs +126 -126
  85. package/fesm2022/lucca-front-ng-page-header.mjs +3 -3
  86. package/fesm2022/lucca-front-ng-pagination.mjs +3 -3
  87. package/fesm2022/lucca-front-ng-plg-push.mjs +3 -3
  88. package/fesm2022/lucca-front-ng-popover.mjs +17 -17
  89. package/fesm2022/lucca-front-ng-popover2.mjs +6 -6
  90. package/fesm2022/lucca-front-ng-popup.mjs +10 -10
  91. package/fesm2022/lucca-front-ng-progress-bar.mjs +3 -3
  92. package/fesm2022/lucca-front-ng-progress-stepper.mjs +6 -6
  93. package/fesm2022/lucca-front-ng-read-more.mjs +3 -3
  94. package/fesm2022/lucca-front-ng-resource-card.mjs +12 -12
  95. package/fesm2022/lucca-front-ng-safe-content.mjs +10 -10
  96. package/fesm2022/lucca-front-ng-scroll-box.mjs +3 -3
  97. package/fesm2022/lucca-front-ng-scroll.mjs +7 -7
  98. package/fesm2022/lucca-front-ng-segmented-control-tabs.mjs +6 -6
  99. package/fesm2022/lucca-front-ng-segmented-control.mjs +6 -6
  100. package/fesm2022/lucca-front-ng-select.mjs +14 -14
  101. package/fesm2022/lucca-front-ng-sidepanel.mjs +7 -7
  102. package/fesm2022/lucca-front-ng-simple-select.mjs +12 -12
  103. package/fesm2022/lucca-front-ng-skeleton.mjs +25 -25
  104. package/fesm2022/lucca-front-ng-skeleton.mjs.map +1 -1
  105. package/fesm2022/lucca-front-ng-software-icon-wrapper.mjs +6 -6
  106. package/fesm2022/lucca-front-ng-software-icon.mjs +3 -3
  107. package/fesm2022/lucca-front-ng-sortable-list.mjs +6 -6
  108. package/fesm2022/lucca-front-ng-status-badge.mjs +3 -3
  109. package/fesm2022/lucca-front-ng-table-of-content.mjs +6 -6
  110. package/fesm2022/lucca-front-ng-tag.mjs +3 -3
  111. package/fesm2022/lucca-front-ng-text-flow.mjs +3 -3
  112. package/fesm2022/lucca-front-ng-time.mjs +18 -18
  113. package/fesm2022/lucca-front-ng-title.mjs +22 -13
  114. package/fesm2022/lucca-front-ng-title.mjs.map +1 -1
  115. package/fesm2022/lucca-front-ng-toast.mjs +10 -10
  116. package/fesm2022/lucca-front-ng-tooltip.mjs +28 -22
  117. package/fesm2022/lucca-front-ng-tooltip.mjs.map +1 -1
  118. package/fesm2022/lucca-front-ng-tree-select.mjs +6 -6
  119. package/fesm2022/lucca-front-ng-user-popover.mjs +18 -18
  120. package/fesm2022/lucca-front-ng-user.mjs +59 -59
  121. package/fesm2022/lucca-front-ng-vertical-navigation.mjs +12 -12
  122. package/package.json +4 -4
  123. package/schematics/action-icon/migration.spec.js +2 -2
  124. package/schematics/alignment-utilities/migration.spec.js +2 -2
  125. package/schematics/cdn-urls/migration.spec.js +2 -2
  126. package/schematics/class-prefix/migration.spec.js +2 -2
  127. package/schematics/color-text/migration.spec.js +2 -2
  128. package/schematics/component-path/migration.spec.js +2 -2
  129. package/schematics/deprecated-resolver/migration.spec.js +1 -1
  130. package/schematics/empty-state-title/migration.spec.js +1 -1
  131. package/schematics/lib/migration-test.js +6 -1
  132. package/schematics/lu-button/migration.spec.js +1 -1
  133. package/schematics/lu-container/migration.spec.js +1 -1
  134. package/schematics/lu-grid/migration.js +24 -16
  135. package/schematics/lu-grid/migration.spec.js +1 -1
  136. package/schematics/lu-icon/migration.spec.js +1 -1
  137. package/schematics/lu-loading/migration.spec.js +1 -1
  138. package/schematics/lu-select/migration.spec.js +1 -1
  139. package/schematics/lu-text-input/migration.spec.js +1 -1
  140. package/schematics/new-icons/migration.spec.js +2 -2
  141. package/schematics/palettes/index.js +28 -8
  142. package/schematics/palettes/migration.spec.js +2 -2
  143. package/schematics/tokens-radius/migration.spec.js +2 -2
  144. package/schematics/tokens-spacing/migration.spec.js +2 -2
  145. package/schematics/tokens-typo/migration.spec.js +2 -2
  146. package/types/lucca-front-ng-dialog.d.ts +4 -3
  147. package/types/lucca-front-ng-forms-rich-text-input.d.ts +5 -1
  148. package/types/lucca-front-ng-forms.d.ts +12 -2
  149. package/types/lucca-front-ng-multi-select.d.ts +13 -1
  150. package/types/lucca-front-ng-title.d.ts +5 -5
@@ -47,7 +47,7 @@ describe('Class prefix Migration', () => {
47
47
  const expectedTree = (0, lib_1.createTreeFromFiles)(testsRoot, files, '.output.');
48
48
  // Act
49
49
  try {
50
- await (0, lib_1.runSchematic)('collection', collectionPath, 'class-prefix', { skipInstallation: true }, tree);
50
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'class-prefix', { skipInstall: true }, tree);
51
51
  }
52
52
  catch (error) {
53
53
  // eslint-disable-next-line no-console
@@ -69,7 +69,7 @@ describe('Class prefix Migration', () => {
69
69
  const treeOriginalTree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
70
70
  const tree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
71
71
  // Act
72
- await (0, lib_1.runSchematic)('collection', collectionPath, 'class-prefix', { skipInstallation: true }, tree);
72
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'class-prefix', { skipInstall: true }, tree);
73
73
  // Assert
74
74
  tree.visit((p, entry) => {
75
75
  const original = treeOriginalTree.get(p)?.content.toString() || '';
@@ -47,7 +47,7 @@ describe('Color Text Migration', () => {
47
47
  const expectedTree = (0, lib_1.createTreeFromFiles)(testsRoot, files, '.output.');
48
48
  // Act
49
49
  try {
50
- await (0, lib_1.runSchematic)('collection', collectionPath, 'color-text', { skipInstallation: true }, tree);
50
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'color-text', { skipInstall: true }, tree);
51
51
  }
52
52
  catch (error) {
53
53
  // eslint-disable-next-line no-console
@@ -69,7 +69,7 @@ describe('Color Text Migration', () => {
69
69
  const treeOriginalTree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
70
70
  const tree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
71
71
  // Act
72
- await (0, lib_1.runSchematic)('collection', collectionPath, 'color-text', { skipInstallation: true }, tree);
72
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'color-text', { skipInstall: true }, tree);
73
73
  // Assert
74
74
  tree.visit((p, entry) => {
75
75
  const original = treeOriginalTree.get(p)?.content.toString() || '';
@@ -47,7 +47,7 @@ describe('Component path Migration', () => {
47
47
  const expectedTree = (0, lib_1.createTreeFromFiles)(testsRoot, files, '.output.');
48
48
  // Act
49
49
  try {
50
- await (0, lib_1.runSchematic)('collection', collectionPath, 'component-path', { skipInstallation: true }, tree);
50
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'component-path', { skipInstall: true }, tree);
51
51
  }
52
52
  catch (error) {
53
53
  //eslint-disable-next-line no-console
@@ -69,7 +69,7 @@ describe('Component path Migration', () => {
69
69
  const treeOriginalTree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
70
70
  const tree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
71
71
  // Act
72
- await (0, lib_1.runSchematic)('collection', collectionPath, 'component-path', { skipInstallation: true }, tree);
72
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'component-path', { skipInstall: true }, tree);
73
73
  // Assert
74
74
  tree.visit((p, entry) => {
75
75
  const original = treeOriginalTree.get(p)?.content.toString() || '';
@@ -46,7 +46,7 @@ describe('Deprecated Resolver Migration', () => {
46
46
  const expectedTree = (0, lib_1.createTreeFromFiles)(testsRoot, files, '.output.');
47
47
  // Act
48
48
  try {
49
- await (0, lib_1.runSchematic)('collection', collectionPath, 'deprecated-resolver', { skipInstallation: true }, tree);
49
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'deprecated-resolver', { skipInstall: true }, tree);
50
50
  }
51
51
  catch (error) {
52
52
  // eslint-disable-next-line no-console
@@ -46,7 +46,7 @@ describe('Empty state title migration', () => {
46
46
  const expectedTree = (0, lib_1.createTreeFromFiles)(testsRoot, files, '.output.');
47
47
  // Act
48
48
  try {
49
- await (0, lib_1.runSchematic)('collection', collectionPath, 'empty-state-heading', { skipInstallation: true }, tree);
49
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'empty-state-heading', { skipInstall: true }, tree);
50
50
  }
51
51
  catch (error) {
52
52
  // eslint-disable-next-line no-console
@@ -48,7 +48,12 @@ function expectTree(tree) {
48
48
  expect(stripLastNewLine(actualContent)).toEqual(stripLastNewLine(expectedContent));
49
49
  }
50
50
  catch (error) {
51
- throw error instanceof Error ? new Error(`Expected file content to match for ${path}: \n${error.message}`) : error;
51
+ if (error instanceof Error) {
52
+ // Mutate the message in place (rather than re-throwing a new Error) so the original
53
+ // stack trace and Vitest's expected/actual diff properties are preserved.
54
+ error.message = `Expected file content to match for ${path}: \n${error.message}`;
55
+ }
56
+ throw error;
52
57
  }
53
58
  });
54
59
  // Ensure all files in expected tree exist in actual tree
@@ -44,7 +44,7 @@ describe('luButton Migration', () => {
44
44
  const expectedTree = (0, lib_1.createTreeFromFolder)(path.join(testsRoot, 'output'));
45
45
  // Act
46
46
  try {
47
- await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-button', { skipInstallation: true }, tree);
47
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-button', { skipInstall: true }, tree);
48
48
  }
49
49
  catch (error) {
50
50
  // eslint-disable-next-line no-console
@@ -44,7 +44,7 @@ describe('lu-container Migration', () => {
44
44
  const expectedTree = (0, lib_1.createTreeFromFolder)(path.join(testsRoot, 'output'));
45
45
  // Act
46
46
  try {
47
- await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-container', { skipInstallation: true }, tree);
47
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-container', { skipInstall: true }, tree);
48
48
  }
49
49
  catch (error) {
50
50
  // eslint-disable-next-line no-console
@@ -158,22 +158,37 @@ function gridHasNonNeutralColumnChildren(node) {
158
158
  return !!childClasses?.match(/(^|\s)grid-column(\s|$)/);
159
159
  });
160
160
  }
161
+ // A grid is migratable only when the migration can be fully carried out. If any
162
+ // class other than `grid`/`mod-auto`/`mod-form` would remain on the element, the
163
+ // migration is considered incomplete: we leave the grid — and therefore its
164
+ // `grid-column` children — untouched for manual review.
165
+ // This is the single source of truth for both grid and grid-column finders so a
166
+ // `grid-column` is never migrated without its parent grid being migrated too.
167
+ function isMigratableGrid(node) {
168
+ if (!(0, lib_1.isInterestingNode)(node) || !(0, migration_utils_1.isNeutralElement)(node.name)) {
169
+ return false;
170
+ }
171
+ const classes = node.attributes.find((attr) => attr.name === 'class')?.value;
172
+ if (!classes?.match(/(^|\s)grid(\s|$)/)) {
173
+ return false;
174
+ }
175
+ if (gridHasNonNeutralColumnChildren(node)) {
176
+ return false;
177
+ }
178
+ // Any leftover class means the migration would keep a `class=` attribute → skip.
179
+ const extraClasses = classes.split(' ').filter((c) => c && c !== 'grid' && c !== 'mod-auto' && c !== 'mod-form');
180
+ return extraClasses.length === 0;
181
+ }
161
182
  function findHTMLGrids(sourceFile, basePath, tree) {
162
183
  const results = [];
163
184
  const ngTemplates = (0, lib_1.extractNgTemplatesIncludingHtml)(sourceFile, tree, basePath);
164
185
  ngTemplates.forEach((template) => {
165
186
  const htmlAst = new lib_1.HtmlAst(template.content);
166
187
  htmlAst.visitNodes((node) => {
167
- if (!(0, lib_1.isInterestingNode)(node) || !(0, migration_utils_1.isNeutralElement)(node.name)) {
168
- return;
169
- }
170
- const classes = node.attributes.find((attr) => attr.name === 'class')?.value;
171
- if (!classes?.match(/(^|\s)grid(\s|$)/)) {
172
- return;
173
- }
174
- if (gridHasNonNeutralColumnChildren(node)) {
188
+ if (!isMigratableGrid(node)) {
175
189
  return;
176
190
  }
191
+ const classes = node.attributes.find((attr) => attr.name === 'class')?.value || '';
177
192
  const styleAttr = node.attributes.find((attr) => attr.name === 'style')?.value || '';
178
193
  const cssProps = (0, migration_utils_1.parseCssCustomProperties)(styleAttr);
179
194
  const classParts = classes.split(' ');
@@ -208,14 +223,7 @@ function findHTMLGridColumns(sourceFile, basePath, tree) {
208
223
  return;
209
224
  }
210
225
  // Only migrate grid-column if its parent grid container is also being migrated
211
- if (!(0, lib_1.isInterestingNode)(parent) || !(0, migration_utils_1.isNeutralElement)(parent.name)) {
212
- return;
213
- }
214
- const parentClasses = parent.attributes.find((attr) => attr.name === 'class')?.value;
215
- if (!parentClasses?.match(/(^|\s)grid(\s|$)/)) {
216
- return;
217
- }
218
- if (gridHasNonNeutralColumnChildren(parent)) {
226
+ if (!isMigratableGrid(parent)) {
219
227
  return;
220
228
  }
221
229
  const styleAttr = node.attributes.find((attr) => attr.name === 'style')?.value || '';
@@ -44,7 +44,7 @@ describe('lu-grid Migration', () => {
44
44
  const expectedTree = (0, lib_1.createTreeFromFolder)(path.join(testsRoot, 'output'));
45
45
  // Act
46
46
  try {
47
- await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-grid', { skipInstallation: true }, tree);
47
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-grid', { skipInstall: true }, tree);
48
48
  }
49
49
  catch (error) {
50
50
  // eslint-disable-next-line no-console
@@ -44,7 +44,7 @@ describe('lu-icon Migration', () => {
44
44
  const expectedTree = (0, lib_1.createTreeFromFolder)(path.join(testsRoot, 'output'));
45
45
  // Act
46
46
  try {
47
- await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-icon', { skipInstallation: true }, tree);
47
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-icon', { skipInstall: true }, tree);
48
48
  }
49
49
  catch (error) {
50
50
  // eslint-disable-next-line no-console
@@ -44,7 +44,7 @@ describe('lu-loading Migration', () => {
44
44
  const expectedTree = (0, lib_1.createTreeFromFolder)(path.join(testsRoot, 'output'));
45
45
  // Act
46
46
  try {
47
- await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-loading', { skipInstallation: true }, tree);
47
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-loading', { skipInstall: true }, tree);
48
48
  }
49
49
  catch (error) {
50
50
  // eslint-disable-next-line no-console
@@ -44,7 +44,7 @@ describe('lu-select Migration', () => {
44
44
  const expectedTree = (0, lib_1.createTreeFromFolder)(path.join(testsRoot, 'output'));
45
45
  // Act
46
46
  try {
47
- await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-select', { skipInstallation: true }, tree);
47
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-select', { skipInstall: true }, tree);
48
48
  }
49
49
  catch (error) {
50
50
  // eslint-disable-next-line no-console
@@ -44,7 +44,7 @@ describe('Textfield Migration', () => {
44
44
  const expectedTree = (0, lib_1.createTreeFromFolder)(path.join(testsRoot, 'output'));
45
45
  // Act
46
46
  try {
47
- await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-text-input', { skipInstallation: true }, tree);
47
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'lu-text-input', { skipInstall: true }, tree);
48
48
  }
49
49
  catch (error) {
50
50
  // eslint-disable-next-line no-console
@@ -47,7 +47,7 @@ describe('New icons Migration', () => {
47
47
  const expectedTree = (0, lib_1.createTreeFromFiles)(testsRoot, files, '.output.');
48
48
  // Act
49
49
  try {
50
- await (0, lib_1.runSchematic)('collection', collectionPath, 'new-icons', { skipInstallation: true }, tree);
50
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'new-icons', { skipInstall: true }, tree);
51
51
  }
52
52
  catch (error) {
53
53
  // eslint-disable-next-line no-console
@@ -69,7 +69,7 @@ describe('New icons Migration', () => {
69
69
  const treeOriginalTree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
70
70
  const tree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
71
71
  // Act
72
- await (0, lib_1.runSchematic)('collection', collectionPath, 'new-icons', { skipInstallation: true }, tree);
72
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'new-icons', { skipInstall: true }, tree);
73
73
  // Assert
74
74
  tree.visit((p, entry) => {
75
75
  const original = treeOriginalTree.get(p)?.content.toString() || '';
@@ -9,16 +9,20 @@ exports.default = (options) => {
9
9
  await lib_1.currentSchematicContext.init(context, options);
10
10
  await new lib_1.CssMapper(tree, {
11
11
  classes: {
12
- 'palette-grey': 'palette-neutral',
13
- 'palette-primary': 'palette-product',
14
- 'palette-secondary': 'palette-product',
15
- 'palette-lucca': 'palette-brand',
12
+ // Palette classes (Button, Callout, Gauge, Clear, Numeric Badge, Status Badge, …)
13
+ 'palette-{palette}': 'palette-{palette}',
14
+ // Component color modifier (Box, Card, Section) — only `grey` existed
15
+ 'mod-grey': 'mod-neutral',
16
+ // Icon color classes — only `primary`/`secondary` existed
17
+ 'icon-color-primary': 'icon-color-product',
18
+ 'icon-color-secondary': 'icon-color-product',
19
+ // Text color utilities generated from the palette list
20
+ 'u-text{Palette}': 'pr-u-text{Palette}',
21
+ 'pr-u-text{Palette}': 'pr-u-text{Palette}',
22
+ 'pr-u-colorText{Palette}': 'pr-u-colorText{Palette}',
16
23
  },
17
24
  variables: {
18
- '--palettes-grey-{val}': `--palettes-neutral-{val}`,
19
- '--palettes-primary-{val}': `--palettes-product-{val}`,
20
- '--palettes-secondary-{val}': `--palettes-product-{val}`,
21
- '--palettes-lucca-{val}': `--palettes-brand-{val}`,
25
+ '--palettes-{palette}-{val}': `--palettes-{palette}-{val}`,
22
26
  '--colors-grey-{val}': `--palettes-neutral-{val}`,
23
27
  '--colors-white-color': '--palettes-neutral-0',
24
28
  '--colors-black-color': '--palettes-neutral-900',
@@ -36,6 +40,13 @@ exports.default = (options) => {
36
40
  },
37
41
  mixins: {}
38
42
  }, {
43
+ // Deprecated palette -> new palette (used by both classes and CSS vars)
44
+ palette: {
45
+ grey: 'neutral',
46
+ primary: 'product',
47
+ secondary: 'product',
48
+ lucca: 'brand',
49
+ },
39
50
  val: {
40
51
  25: '25',
41
52
  50: '50',
@@ -50,5 +61,14 @@ exports.default = (options) => {
50
61
  900: '900'
51
62
  }
52
63
  }).run();
64
+ new lib_1.DeprecatedMapper(tree, {
65
+ modules: {},
66
+ types: {},
67
+ inputsOutputs: {
68
+ // The `lu-icon` component `color` input is not a CSS class, so it isn't handled by CssMapper.
69
+ // Deprecated `primary`/`secondary` values → `product` (handles both `color="primary"` and `[color]="'primary'"`).
70
+ 'lu-icon': { color: { primary: 'product', secondary: 'product' } },
71
+ },
72
+ }).run();
53
73
  };
54
74
  };
@@ -47,7 +47,7 @@ describe('Palettes Migration', () => {
47
47
  const expectedTree = (0, lib_1.createTreeFromFiles)(testsRoot, files, '.output.');
48
48
  // Act
49
49
  try {
50
- await (0, lib_1.runSchematic)('collection', collectionPath, 'palettes', { skipInstallation: true }, tree);
50
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'palettes', { skipInstall: true }, tree);
51
51
  }
52
52
  catch (error) {
53
53
  // eslint-disable-next-line no-console
@@ -69,7 +69,7 @@ describe('Palettes Migration', () => {
69
69
  const treeOriginalTree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
70
70
  const tree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
71
71
  // Act
72
- await (0, lib_1.runSchematic)('collection', collectionPath, 'palettes', { skipInstallation: true }, tree);
72
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'palettes', { skipInstall: true }, tree);
73
73
  // Assert
74
74
  tree.visit((p, entry) => {
75
75
  const original = treeOriginalTree.get(p)?.content.toString() || '';
@@ -47,7 +47,7 @@ describe('Tokens radius Migration', () => {
47
47
  const expectedTree = (0, lib_1.createTreeFromFiles)(testsRoot, files, '.output.');
48
48
  // Act
49
49
  try {
50
- await (0, lib_1.runSchematic)('collection', collectionPath, 'tokens-radius', { skipInstallation: true }, tree);
50
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'tokens-radius', { skipInstall: true }, tree);
51
51
  }
52
52
  catch (error) {
53
53
  // eslint-disable-next-line no-console
@@ -69,7 +69,7 @@ describe('Tokens radius Migration', () => {
69
69
  const treeOriginalTree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
70
70
  const tree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
71
71
  // Act
72
- await (0, lib_1.runSchematic)('collection', collectionPath, 'tokens-radius', { skipInstallation: true }, tree);
72
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'tokens-radius', { skipInstall: true }, tree);
73
73
  // Assert
74
74
  tree.visit((p, entry) => {
75
75
  const original = treeOriginalTree.get(p)?.content.toString() || '';
@@ -47,7 +47,7 @@ describe('Tokens spacing Migration', () => {
47
47
  const expectedTree = (0, lib_1.createTreeFromFiles)(testsRoot, files, '.output.');
48
48
  // Act
49
49
  try {
50
- await (0, lib_1.runSchematic)('collection', collectionPath, 'tokens-spacings', { skipInstallation: true }, tree);
50
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'tokens-spacings', { skipInstall: true }, tree);
51
51
  }
52
52
  catch (error) {
53
53
  // eslint-disable-next-line no-console
@@ -69,7 +69,7 @@ describe('Tokens spacing Migration', () => {
69
69
  const treeOriginalTree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
70
70
  const tree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
71
71
  // Act
72
- await (0, lib_1.runSchematic)('collection', collectionPath, 'tokens-spacings', { skipInstallation: true }, tree);
72
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'tokens-spacings', { skipInstall: true }, tree);
73
73
  // Assert
74
74
  tree.visit((p, entry) => {
75
75
  const original = treeOriginalTree.get(p)?.content.toString() || '';
@@ -47,7 +47,7 @@ describe('Tokens typo Migration', () => {
47
47
  const expectedTree = (0, lib_1.createTreeFromFiles)(testsRoot, files, '.output.');
48
48
  // Act
49
49
  try {
50
- await (0, lib_1.runSchematic)('collection', collectionPath, 'tokens-typo', { skipInstallation: true }, tree);
50
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'tokens-typo', { skipInstall: true }, tree);
51
51
  }
52
52
  catch (error) {
53
53
  // eslint-disable-next-line no-console
@@ -69,7 +69,7 @@ describe('Tokens typo Migration', () => {
69
69
  const treeOriginalTree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
70
70
  const tree = (0, lib_1.createTreeFromFiles)(lfRoot, lfFiles, '.');
71
71
  // Act
72
- await (0, lib_1.runSchematic)('collection', collectionPath, 'tokens-typo', { skipInstallation: true }, tree);
72
+ await (0, lib_1.runSchematic)('collection', collectionPath, 'tokens-typo', { skipInstall: true }, tree);
73
73
  // Assert
74
74
  tree.visit((p, entry) => {
75
75
  const original = treeOriginalTree.get(p)?.content.toString() || '';
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnInit, InjectionToken, EnvironmentProviders, OnDestroy, Injector, TemplateRef, Provider, AfterViewInit } from '@angular/core';
2
+ import { OnDestroy, InjectionToken, EnvironmentProviders, OnInit, Injector, TemplateRef, Provider, AfterViewInit } from '@angular/core';
3
3
  import * as _lucca_front_ng_dialog from '@lucca-front/ng/dialog';
4
4
  import { LuTranslation } from '@lucca-front/ng/core';
5
5
  import { BaseRouteReuseStrategy, ActivatedRouteSnapshot, CanDeactivateFn, DeprecatedGuard, GuardResult, Route } from '@angular/router';
@@ -28,14 +28,15 @@ declare class DialogHeaderSubtitle {
28
28
  static ɵfac: i0.ɵɵFactoryDeclaration<DialogHeaderSubtitle, never>;
29
29
  static ɵdir: i0.ɵɵDirectiveDeclaration<DialogHeaderSubtitle, "[dialogHeaderSubtitle]", never, {}, {}, never, never, true, never>;
30
30
  }
31
- declare class DialogHeaderComponent implements OnInit {
31
+ declare class DialogHeaderComponent implements OnDestroy {
32
32
  #private;
33
33
  intl: i0.InputSignalWithTransform<_lucca_front_ng_dialog.LuDialogHeaderTranslations, Partial<_lucca_front_ng_dialog.LuDialogHeaderTranslations>>;
34
34
  dismissible: boolean;
35
+ constructor();
35
36
  close(): void;
36
37
  optionalAction: i0.Signal<DialogHeaderAction>;
37
38
  optionalSubtitle: i0.Signal<DialogHeaderSubtitle>;
38
- ngOnInit(): void;
39
+ ngOnDestroy(): void;
39
40
  static ɵfac: i0.ɵɵFactoryDeclaration<DialogHeaderComponent, never>;
40
41
  static ɵcmp: i0.ɵɵComponentDeclaration<DialogHeaderComponent, "lu-dialog-header", never, { "intl": { "alias": "intl"; "required": false; "isSignal": true; }; }, {}, ["optionalAction", "optionalSubtitle"], ["[dialogHeaderAction]", "*", "[dialogHeaderSubtitle]", "[dialogHeaderContent]"], true, never>;
41
42
  }
@@ -1,7 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { InjectionToken, Signal, WritableSignal, OnInit, OnDestroy, ElementRef, ViewContainerRef, TemplateRef } from '@angular/core';
3
3
  import * as lexical from 'lexical';
4
- import { LexicalEditor, Klass, LexicalNode, LexicalNodeReplacement, NodeKey, EditorConfig, DOMExportOutput, DecoratorNode, DOMConversionMap, Spread, SerializedLexicalNode, LexicalUpdateJSON, TextFormatType } from 'lexical';
4
+ import { LexicalEditor, Klass, LexicalNode, LexicalNodeReplacement, NodeKey, EditorConfig, ElementDOMSlot, DOMExportOutput, DecoratorNode, DOMConversionMap, Spread, SerializedLexicalNode, LexicalUpdateJSON, TextFormatType } from 'lexical';
5
5
  import { ControlValueAccessor, FormControl } from '@angular/forms';
6
6
  import { DomPortal } from '@angular/cdk/portal';
7
7
  import { LuSimpleSelectInputComponent } from '@lucca-front/ng/simple-select';
@@ -132,8 +132,10 @@ declare class PopoverLinkNode extends LinkNode {
132
132
  templateRef?: TemplateRef<LinkTemplateContext>;
133
133
  }, key?: NodeKey);
134
134
  createDOM(config: EditorConfig): HTMLElement;
135
+ getDOMSlot(element: HTMLElement): ElementDOMSlot;
135
136
  updateDOM(prevNode: this): boolean;
136
137
  exportDOM(editor: LexicalEditor): DOMExportOutput;
138
+ static importDOM(): lexical.DOMConversionMap;
137
139
  remove(preserveEmptyParent?: boolean): void;
138
140
  static importJSON(serializedNode: SerializedLinkNode): PopoverLinkNode;
139
141
  static clone(node: PopoverLinkNode): PopoverLinkNode;
@@ -151,8 +153,10 @@ declare class PopoverAutoLinkNode extends AutoLinkNode {
151
153
  templateRef?: TemplateRef<LinkTemplateContext>;
152
154
  }, key?: NodeKey);
153
155
  createDOM(config: EditorConfig): HTMLElement;
156
+ getDOMSlot(element: HTMLElement): ElementDOMSlot;
154
157
  updateDOM(prevNode: this): boolean;
155
158
  exportDOM(editor: LexicalEditor): DOMExportOutput;
159
+ static importDOM(): null;
156
160
  remove(preserveEmptyParent?: boolean): void;
157
161
  static importJSON(serializedNode: SerializedAutoLinkNode): PopoverAutoLinkNode;
158
162
  static clone(node: PopoverAutoLinkNode): PopoverAutoLinkNode;
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnDestroy, Signal, WritableSignal, AfterViewInit, ElementRef, OnInit, InjectionToken } from '@angular/core';
2
+ import { OnDestroy, OnInit, Signal, WritableSignal, AfterViewInit, ElementRef, InjectionToken } from '@angular/core';
3
3
  import * as _angular_forms from '@angular/forms';
4
4
  import { NgModel, FormControlDirective, FormControlName, NgControl, FormControl, ControlValueAccessor, ValidatorFn } from '@angular/forms';
5
5
  import { FilterPillInputComponent, FilterPillLayout } from '@lucca-front/ng/filter-pills';
@@ -39,7 +39,8 @@ declare class NoopValueAccessorDirective implements ControlValueAccessor {
39
39
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NoopValueAccessorDirective, "[luNoopValueAccessor]", never, {}, {}, never, never, true, never>;
40
40
  }
41
41
 
42
- declare class CheckboxInputComponent implements FilterPillInputComponent {
42
+ declare class CheckboxInputComponent implements FilterPillInputComponent, OnInit {
43
+ #private;
43
44
  framed: boolean;
44
45
  parentInput: FilterPillInputComponent;
45
46
  formField: FormFieldComponent;
@@ -62,7 +63,16 @@ declare class CheckboxInputComponent implements FilterPillInputComponent {
62
63
  ngControl: _angular_forms.NgModel | _angular_forms.FormControlDirective | _angular_forms.FormControlName | (_angular_forms.NgControl & {
63
64
  control: _angular_forms.FormControl<any>;
64
65
  });
66
+ /**
67
+ * Reactive mirrors of the control's value/disabled state, so the filter pill button
68
+ * (rendered with OnPush) reflects programmatic changes such as a form reset without
69
+ * needing a DOM event to trigger change detection. Initialized in `ngOnInit` because
70
+ * `ngControl.control` is only wired once the control directive's `ngOnChanges` has run.
71
+ */
72
+ protected checkboxValue: Signal<boolean>;
73
+ protected isCheckboxDisabled: Signal<boolean>;
65
74
  constructor();
75
+ ngOnInit(): void;
66
76
  clearFilterPillValue(): void;
67
77
  registerFilterPillClosePopover(_closeFn: () => void): void;
68
78
  enableFilterPillMode?(): void;
@@ -51,6 +51,7 @@ declare class LuMultiSelectPanelRefFactory {
51
51
  }
52
52
 
53
53
  declare class LuMultiSelectInputComponent<T> extends ALuSelectInputComponent<T, T[]> implements ControlValueAccessor, OnDestroy, OnInit {
54
+ #private;
54
55
  intl: i0.InputSignalWithTransform<_lucca_front_ng_core_select.LuCoreSelectLabel & _lucca_front_ng_multi_select.ILuMultiSelectLabel, Partial<_lucca_front_ng_core_select.LuCoreSelectLabel & _lucca_front_ng_multi_select.ILuMultiSelectLabel>>;
55
56
  showColon: false;
56
57
  valuesTpl: i0.ModelSignal<Type<unknown> | TemplateRef<LuOptionContext<T[]>>>;
@@ -66,6 +67,7 @@ declare class LuMultiSelectInputComponent<T> extends ALuSelectInputComponent<T,
66
67
  valueLength: Signal<number>;
67
68
  useSingleOptionDisplayer: Signal<boolean>;
68
69
  _value: T[];
70
+ protected readonly presentationSeparators: Signal<string[]>;
69
71
  get panelRef(): LuMultiSelectPanelRef<T> | undefined;
70
72
  protected _panelRef?: LuMultiSelectPanelRef<T>;
71
73
  protected panelRefFactory: LuMultiSelectPanelRefFactory;
@@ -222,6 +224,16 @@ declare class LuMultiDisplayerDirective<T> {
222
224
  static ɵdir: i0.ɵɵDirectiveDeclaration<LuMultiDisplayerDirective<any>, "[luMultiDisplayer]", never, { "select": { "alias": "luMultiDisplayerSelect"; "required": false; }; }, {}, never, never, true, never>;
223
225
  }
224
226
 
227
+ /**
228
+ * Returns the `itemCount - 1` separators `Intl.ListFormat` puts between `itemCount` items, so they can be
229
+ * interleaved with values rendered by a template rather than by `format()`.
230
+ *
231
+ * @example
232
+ * ```ts
233
+ * listSeparators(new Intl.ListFormat('fr-FR'), 3); // [', ', ' et ']
234
+ * ```
235
+ */
236
+ declare function listSeparators(listFormat: Intl.ListFormat, itemCount: number): string[];
225
237
  declare function selectionToQueryParams<T, Key extends string>(key: Key, value: LuMultiSelection<T>, selector: (value: T) => unknown): Partial<Record<Key | `-${Key}`, string>>;
226
238
  /**
227
239
  * Transforms a selection from withSelectAll, the complete list of options and a getKey function to a list of options.
@@ -240,5 +252,5 @@ declare const LuMultiSelectionValidators: {
240
252
  required: (control: AbstractControl<LuMultiSelection<unknown>>) => ValidationErrors | null;
241
253
  };
242
254
 
243
- export { LU_MULTI_SELECT_DISPLAYER_TRANSLATIONS, LU_MULTI_SELECT_TRANSLATIONS, LuMultiDisplayerDirective, LuMultiSelectContentDisplayerComponent, LuMultiSelectCounterDisplayerComponent, LuMultiSelectDefaultDisplayerComponent, LuMultiSelectDisplayerInputDirective, LuMultiSelectInputComponent, LuMultiSelectWithSelectAllDirective, LuMultiSelectionValidators, luMultiSelectDisplayerTranslations, luMultiSelectTranslations, selectionToOptions, selectionToQueryParams };
255
+ export { LU_MULTI_SELECT_DISPLAYER_TRANSLATIONS, LU_MULTI_SELECT_TRANSLATIONS, LuMultiDisplayerDirective, LuMultiSelectContentDisplayerComponent, LuMultiSelectCounterDisplayerComponent, LuMultiSelectDefaultDisplayerComponent, LuMultiSelectDisplayerInputDirective, LuMultiSelectInputComponent, LuMultiSelectWithSelectAllDirective, LuMultiSelectionValidators, listSeparators, luMultiSelectDisplayerTranslations, luMultiSelectTranslations, selectionToOptions, selectionToQueryParams };
244
256
  export type { ILuMultiSelectDisplayerLabel, ILuMultiSelectLabel, LuMultiSelection, LuMultiSelectionMode };
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Provider } from '@angular/core';
2
+ import { InjectionToken, Signal, Provider } from '@angular/core';
3
3
  import * as rxjs from 'rxjs';
4
4
  import { Observable, ObservableInput } from 'rxjs';
5
5
  import * as i1 from '@angular/router';
@@ -47,14 +47,14 @@ declare class LuTitleService {
47
47
  static ɵprov: i0.ɵɵInjectableDeclaration<LuTitleService>;
48
48
  }
49
49
 
50
- declare const ɵAPP_TITLE: InjectionToken<string | Observable<string>>;
50
+ declare const ɵAPP_TITLE: InjectionToken<string | Observable<string> | Signal<string>>;
51
51
  type LuTitleNamingStrategy = 'product' | 'other';
52
52
  declare const ɵNAMING_STRATEGY: InjectionToken<LuTitleNamingStrategy>;
53
53
  declare const ɵREAD_TITLE_BY_LIVE_ANNOUNCER: InjectionToken<boolean>;
54
54
  /**
55
55
  * @deprecated Use `provideLuTitleStrategy` instead.
56
56
  */
57
- declare const APP_TITLE: InjectionToken<string | Observable<string>>;
57
+ declare const APP_TITLE: InjectionToken<string | Observable<string> | Signal<string>>;
58
58
  declare class LuTitleStrategy extends TitleStrategy {
59
59
  #private;
60
60
  private title;
@@ -63,7 +63,7 @@ declare class LuTitleStrategy extends TitleStrategy {
63
63
  private namingStrategy;
64
64
  private readTitleByLiveAnnouncer;
65
65
  private liveAnnouncer;
66
- private luccaTitle$;
66
+ private readonly luccaTitle$;
67
67
  private titlePartsSubject;
68
68
  titleParts$: Observable<(string | ObservableInput<string>)[]>;
69
69
  title$: Observable<string>;
@@ -75,7 +75,7 @@ declare class LuTitleStrategy extends TitleStrategy {
75
75
  static ɵprov: i0.ɵɵInjectableDeclaration<LuTitleStrategy>;
76
76
  }
77
77
  interface LuTitleStrategyOptions {
78
- appTitle?: () => string | Observable<string>;
78
+ appTitle?: () => string | Observable<string> | Signal<string>;
79
79
  translateService?: () => ILuTitleTranslateService;
80
80
  namingStrategy?: LuTitleNamingStrategy;
81
81
  readTitleByLiveAnnouncer?: boolean;