@besaitech/ng-design-system 0.0.29 → 0.0.33

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.
@@ -141,7 +141,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
141
141
  }]
142
142
  }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }] } });
143
143
 
144
- const BASE = 'inline-flex items-center justify-center gap-2 font-medium rounded-control ' +
144
+ const BASE = 'inline-flex items-center justify-center gap-2 font-medium ' +
145
145
  'transition-colors duration-150 select-none whitespace-nowrap cursor-pointer ' +
146
146
  'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 ' +
147
147
  'focus-visible:ring-brand-500 disabled:opacity-50 disabled:pointer-events-none';
@@ -172,6 +172,13 @@ const ICON_ONLY = {
172
172
  class SdsButton {
173
173
  variant = input('primary', ...(ngDevMode ? [{ debugName: "variant" }] : []));
174
174
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
175
+ /**
176
+ * `pill` fully rounds the button. It is the shape a consumer-facing surface tends to want for its
177
+ * primary action, and the same axis {@link SdsInput} exposes — a design system with pill inputs and
178
+ * no pill buttons would force any app that wants one back onto hand-rolled classes for its single
179
+ * most important control.
180
+ */
181
+ shape = input('control', ...(ngDevMode ? [{ debugName: "shape" }] : []));
175
182
  type = input('button', ...(ngDevMode ? [{ debugName: "type" }] : []));
176
183
  disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
177
184
  loading = input(false, ...(ngDevMode ? [{ debugName: "loading", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
@@ -203,6 +210,7 @@ class SdsButton {
203
210
  const size = this.size();
204
211
  return [
205
212
  BASE,
213
+ this.shape() === 'pill' ? 'rounded-full' : 'rounded-control',
206
214
  VARIANTS$2[this.variant()],
207
215
  SIZES$9[size],
208
216
  this.iconOnly() ? ICON_ONLY[size] : '',
@@ -212,7 +220,7 @@ class SdsButton {
212
220
  .join(' ');
213
221
  }, ...(ngDevMode ? [{ debugName: "classes" }] : []));
214
222
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
215
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsButton, isStandalone: true, selector: "sds-button", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, block: { classPropertyName: "block", publicName: "block", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onHostClick($event)" }, properties: { "class": "hostClass()", "attr.aria-disabled": "(disabled() || loading()) ? \"true\" : null", "style.pointer-events": "(disabled() || loading()) ? \"none\" : null" } }, ngImport: i0, template: `
223
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsButton, isStandalone: true, selector: "sds-button", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, block: { classPropertyName: "block", publicName: "block", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onHostClick($event)" }, properties: { "class": "hostClass()", "attr.aria-disabled": "(disabled() || loading()) ? \"true\" : null", "style.pointer-events": "(disabled() || loading()) ? \"none\" : null" } }, ngImport: i0, template: `
216
224
  <button
217
225
  [type]="type()"
218
226
  [disabled]="disabled() || loading()"
@@ -254,7 +262,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
254
262
  <ng-content select="[sdsIconTrailing]" />
255
263
  </button>
256
264
  `, styles: [".sds-spinner{width:1em;height:1em;border:2px solid currentColor;border-right-color:transparent;border-radius:9999px;animation:sds-spin .6s linear infinite}@keyframes sds-spin{to{transform:rotate(360deg)}}\n"] }]
257
- }], ctorParameters: () => [], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], block: [{ type: i0.Input, args: [{ isSignal: true, alias: "block", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
265
+ }], ctorParameters: () => [], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], block: [{ type: i0.Input, args: [{ isSignal: true, alias: "block", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
258
266
 
259
267
  let nextId$a = 0;
260
268
  const SIZES$8 = {
@@ -490,23 +498,17 @@ class SdsInput {
490
498
  {{ hint() }}
491
499
  </p>
492
500
  }
493
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
501
+ `, isInline: true, styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 100000s ease-in-out 0s;-webkit-text-fill-color:currentColor;caret-color:currentColor}\n"], dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
494
502
  }
495
503
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsInput, decorators: [{
496
504
  type: Component,
497
- args: [{
498
- selector: 'sds-input',
499
- changeDetection: ChangeDetectionStrategy.OnPush,
500
- imports: [SdsIcon],
501
- providers: [
505
+ args: [{ selector: 'sds-input', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SdsIcon], providers: [
502
506
  {
503
507
  provide: NG_VALUE_ACCESSOR,
504
508
  useExisting: forwardRef(() => SdsInput),
505
509
  multi: true,
506
510
  },
507
- ],
508
- host: { class: 'block' },
509
- template: `
511
+ ], host: { class: 'block' }, template: `
510
512
  @if (label()) {
511
513
  <label
512
514
  [for]="inputId"
@@ -593,8 +595,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
593
595
  {{ hint() }}
594
596
  </p>
595
597
  }
596
- `,
597
- }]
598
+ `, styles: ["input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{transition:background-color 100000s ease-in-out 0s;-webkit-text-fill-color:currentColor;caret-color:currentColor}\n"] }]
598
599
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], leadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "leadingIcon", required: false }] }], trailingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingIcon", required: false }] }], trailingAction: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingAction", required: false }] }], trailingActionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingActionLabel", required: false }] }], trailingActionPressed: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingActionPressed", required: false }] }], trailingActionClick: [{ type: i0.Output, args: ["trailingActionClick"] }] } });
599
600
 
600
601
  let nextId$9 = 0;
@@ -1473,6 +1474,26 @@ class SdsCalendar {
1473
1474
  firstDayOfWeek = input(1, ...(ngDevMode ? [{ debugName: "firstDayOfWeek" }] : []));
1474
1475
  locale = input('fr-FR', ...(ngDevMode ? [{ debugName: "locale" }] : []));
1475
1476
  showActions = input(true, ...(ngDevMode ? [{ debugName: "showActions" }] : []));
1477
+ /**
1478
+ * Accessible name for the calendar container. French default so existing consumers are unchanged,
1479
+ * but an app serving more than one language MUST translate it.
1480
+ */
1481
+ calendarLabel = input('Calendrier', ...(ngDevMode ? [{ debugName: "calendarLabel" }] : []));
1482
+ /**
1483
+ * Accessible name for the "previous" nav button. It is icon-only, so this string is its ONLY
1484
+ * accessible name — a hardcoded French one is simply wrong in every other locale. Translate it in
1485
+ * the consuming app.
1486
+ */
1487
+ previousLabel = input('Précédent', ...(ngDevMode ? [{ debugName: "previousLabel" }] : []));
1488
+ /** Accessible name for the icon-only "next" nav button. See {@link previousLabel}. */
1489
+ nextLabel = input('Suivant', ...(ngDevMode ? [{ debugName: "nextLabel" }] : []));
1490
+ /**
1491
+ * Visible text of the "today" action (shown when {@link showActions} is true). Translate it in the
1492
+ * consuming app — the library ships no i18n of its own.
1493
+ */
1494
+ todayActionLabel = input("Aujourd'hui", ...(ngDevMode ? [{ debugName: "todayActionLabel" }] : []));
1495
+ /** Visible text of the "clear" action. See {@link todayActionLabel}. */
1496
+ clearActionLabel = input('Effacer', ...(ngDevMode ? [{ debugName: "clearActionLabel" }] : []));
1476
1497
  /** Emitted when a concrete date is picked (day click or "Aujourd'hui"). */
1477
1498
  dateSelect = output();
1478
1499
  view = signal('day', ...(ngDevMode ? [{ debugName: "view" }] : []));
@@ -1706,15 +1727,15 @@ class SdsCalendar {
1706
1727
  return cls;
1707
1728
  }
1708
1729
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsCalendar, deps: [], target: i0.ɵɵFactoryTarget.Component });
1709
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsCalendar, isStandalone: true, selector: "sds-calendar", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, showActions: { classPropertyName: "showActions", publicName: "showActions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", dateSelect: "dateSelect" }, host: { classAttribute: "block" }, ngImport: i0, template: `
1730
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsCalendar, isStandalone: true, selector: "sds-calendar", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, showActions: { classPropertyName: "showActions", publicName: "showActions", isSignal: true, isRequired: false, transformFunction: null }, calendarLabel: { classPropertyName: "calendarLabel", publicName: "calendarLabel", isSignal: true, isRequired: false, transformFunction: null }, previousLabel: { classPropertyName: "previousLabel", publicName: "previousLabel", isSignal: true, isRequired: false, transformFunction: null }, nextLabel: { classPropertyName: "nextLabel", publicName: "nextLabel", isSignal: true, isRequired: false, transformFunction: null }, todayActionLabel: { classPropertyName: "todayActionLabel", publicName: "todayActionLabel", isSignal: true, isRequired: false, transformFunction: null }, clearActionLabel: { classPropertyName: "clearActionLabel", publicName: "clearActionLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", dateSelect: "dateSelect" }, host: { classAttribute: "block" }, ngImport: i0, template: `
1710
1731
  <div
1711
1732
  class="w-[20rem] select-none rounded-card border border-border bg-surface p-3 shadow-lg"
1712
1733
  role="group"
1713
- aria-label="Calendrier"
1734
+ [attr.aria-label]="calendarLabel()"
1714
1735
  >
1715
1736
  <!-- Header -->
1716
1737
  <div class="mb-2 flex items-center justify-between">
1717
- <button type="button" [class]="navBtn" aria-label="Précédent" (click)="prev()">
1738
+ <button type="button" [class]="navBtn" [attr.aria-label]="previousLabel()" (click)="prev()">
1718
1739
  <sds-icon name="chevron-left" [size]="18" />
1719
1740
  </button>
1720
1741
 
@@ -1739,7 +1760,7 @@ class SdsCalendar {
1739
1760
  }
1740
1761
  </div>
1741
1762
 
1742
- <button type="button" [class]="navBtn" aria-label="Suivant" (click)="next()">
1763
+ <button type="button" [class]="navBtn" [attr.aria-label]="nextLabel()" (click)="next()">
1743
1764
  <sds-icon name="chevron-right" [size]="18" />
1744
1765
  </button>
1745
1766
  </div>
@@ -1823,9 +1844,9 @@ class SdsCalendar {
1823
1844
  [disabled]="todayDisabled()"
1824
1845
  (click)="goToday()"
1825
1846
  >
1826
- Aujourd'hui
1847
+ {{ todayActionLabel() }}
1827
1848
  </button>
1828
- <button type="button" [class]="actionBtn" (click)="clear()">Effacer</button>
1849
+ <button type="button" [class]="actionBtn" (click)="clear()">{{ clearActionLabel() }}</button>
1829
1850
  </div>
1830
1851
  }
1831
1852
  </div>
@@ -1842,11 +1863,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
1842
1863
  <div
1843
1864
  class="w-[20rem] select-none rounded-card border border-border bg-surface p-3 shadow-lg"
1844
1865
  role="group"
1845
- aria-label="Calendrier"
1866
+ [attr.aria-label]="calendarLabel()"
1846
1867
  >
1847
1868
  <!-- Header -->
1848
1869
  <div class="mb-2 flex items-center justify-between">
1849
- <button type="button" [class]="navBtn" aria-label="Précédent" (click)="prev()">
1870
+ <button type="button" [class]="navBtn" [attr.aria-label]="previousLabel()" (click)="prev()">
1850
1871
  <sds-icon name="chevron-left" [size]="18" />
1851
1872
  </button>
1852
1873
 
@@ -1871,7 +1892,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
1871
1892
  }
1872
1893
  </div>
1873
1894
 
1874
- <button type="button" [class]="navBtn" aria-label="Suivant" (click)="next()">
1895
+ <button type="button" [class]="navBtn" [attr.aria-label]="nextLabel()" (click)="next()">
1875
1896
  <sds-icon name="chevron-right" [size]="18" />
1876
1897
  </button>
1877
1898
  </div>
@@ -1955,15 +1976,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
1955
1976
  [disabled]="todayDisabled()"
1956
1977
  (click)="goToday()"
1957
1978
  >
1958
- Aujourd'hui
1979
+ {{ todayActionLabel() }}
1959
1980
  </button>
1960
- <button type="button" [class]="actionBtn" (click)="clear()">Effacer</button>
1981
+ <button type="button" [class]="actionBtn" (click)="clear()">{{ clearActionLabel() }}</button>
1961
1982
  </div>
1962
1983
  }
1963
1984
  </div>
1964
1985
  `,
1965
1986
  }]
1966
- }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], showActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showActions", required: false }] }], dateSelect: [{ type: i0.Output, args: ["dateSelect"] }] } });
1987
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], showActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showActions", required: false }] }], calendarLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "calendarLabel", required: false }] }], previousLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousLabel", required: false }] }], nextLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextLabel", required: false }] }], todayActionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "todayActionLabel", required: false }] }], clearActionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearActionLabel", required: false }] }], dateSelect: [{ type: i0.Output, args: ["dateSelect"] }] } });
1967
1988
 
1968
1989
  const SIZES$5 = {
1969
1990
  sm: 'h-9 text-sm',
@@ -1998,6 +2019,31 @@ class SdsDatePicker {
1998
2019
  disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
1999
2020
  /** Custom display formatter (default dd/MM/yyyy). */
2000
2021
  format = input(formatDdMmYyyy, ...(ngDevMode ? [{ debugName: "format" }] : []));
2022
+ /**
2023
+ * Accessible name for the clear button. French default so existing consumers are unchanged, but an
2024
+ * app serving more than one language MUST translate it — it is an icon-only control, so this string
2025
+ * is its only name.
2026
+ */
2027
+ clearLabel = input('Effacer la date', ...(ngDevMode ? [{ debugName: "clearLabel" }] : []));
2028
+ /**
2029
+ * Accessible name for the icon-only calendar toggle while the panel is CLOSED. See
2030
+ * {@link clearLabel} for why this has to be translatable.
2031
+ */
2032
+ openCalendarLabel = input('Ouvrir le calendrier', ...(ngDevMode ? [{ debugName: "openCalendarLabel" }] : []));
2033
+ /** Accessible name for the calendar toggle while the panel is OPEN. See {@link openCalendarLabel}. */
2034
+ closeCalendarLabel = input('Fermer le calendrier', ...(ngDevMode ? [{ debugName: "closeCalendarLabel" }] : []));
2035
+ /** Accessible name for the overlay dialog that holds the calendar. */
2036
+ panelLabel = input('Sélection de date', ...(ngDevMode ? [{ debugName: "panelLabel" }] : []));
2037
+ /**
2038
+ * Labels forwarded to the embedded <sds-calendar>. They live here because the picker is how the
2039
+ * calendar is normally reached — without forwarding, a consumer could translate the field but not
2040
+ * the panel it opens. Defaults match SdsCalendar's own, so nothing changes for existing consumers.
2041
+ */
2042
+ calendarLabel = input('Calendrier', ...(ngDevMode ? [{ debugName: "calendarLabel" }] : []));
2043
+ previousLabel = input('Précédent', ...(ngDevMode ? [{ debugName: "previousLabel" }] : []));
2044
+ nextLabel = input('Suivant', ...(ngDevMode ? [{ debugName: "nextLabel" }] : []));
2045
+ todayActionLabel = input("Aujourd'hui", ...(ngDevMode ? [{ debugName: "todayActionLabel" }] : []));
2046
+ clearActionLabel = input('Effacer', ...(ngDevMode ? [{ debugName: "clearActionLabel" }] : []));
2001
2047
  value = signal(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
2002
2048
  open = signal(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
2003
2049
  cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "cvaDisabled" }] : []));
@@ -2145,7 +2191,7 @@ class SdsDatePicker {
2145
2191
  this.cvaDisabled.set(isDisabled);
2146
2192
  }
2147
2193
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsDatePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
2148
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsDatePicker, isStandalone: true, selector: "sds-date-picker", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, showActions: { classPropertyName: "showActions", publicName: "showActions", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "document:click": "onDocumentClick($event)", "keydown.escape": "close(true)" }, classAttribute: "block" }, providers: [
2194
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsDatePicker, isStandalone: true, selector: "sds-date-picker", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, showActions: { classPropertyName: "showActions", publicName: "showActions", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, openCalendarLabel: { classPropertyName: "openCalendarLabel", publicName: "openCalendarLabel", isSignal: true, isRequired: false, transformFunction: null }, closeCalendarLabel: { classPropertyName: "closeCalendarLabel", publicName: "closeCalendarLabel", isSignal: true, isRequired: false, transformFunction: null }, panelLabel: { classPropertyName: "panelLabel", publicName: "panelLabel", isSignal: true, isRequired: false, transformFunction: null }, calendarLabel: { classPropertyName: "calendarLabel", publicName: "calendarLabel", isSignal: true, isRequired: false, transformFunction: null }, previousLabel: { classPropertyName: "previousLabel", publicName: "previousLabel", isSignal: true, isRequired: false, transformFunction: null }, nextLabel: { classPropertyName: "nextLabel", publicName: "nextLabel", isSignal: true, isRequired: false, transformFunction: null }, todayActionLabel: { classPropertyName: "todayActionLabel", publicName: "todayActionLabel", isSignal: true, isRequired: false, transformFunction: null }, clearActionLabel: { classPropertyName: "clearActionLabel", publicName: "clearActionLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "document:click": "onDocumentClick($event)", "keydown.escape": "close(true)" }, classAttribute: "block" }, providers: [
2149
2195
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SdsDatePicker), multi: true },
2150
2196
  ], viewQueries: [{ propertyName: "calendar", first: true, predicate: SdsCalendar, descendants: true, isSignal: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }], ngImport: i0, template: `
2151
2197
  @if (label()) {
@@ -2162,6 +2208,11 @@ class SdsDatePicker {
2162
2208
  [firstDayOfWeek]="firstDayOfWeek()"
2163
2209
  [locale]="locale()"
2164
2210
  [showActions]="showActions()"
2211
+ [calendarLabel]="calendarLabel()"
2212
+ [previousLabel]="previousLabel()"
2213
+ [nextLabel]="nextLabel()"
2214
+ [todayActionLabel]="todayActionLabel()"
2215
+ [clearActionLabel]="clearActionLabel()"
2165
2216
  (valueChange)="onCalendarValue($event)"
2166
2217
  />
2167
2218
  } @else {
@@ -2191,7 +2242,7 @@ class SdsDatePicker {
2191
2242
  <button
2192
2243
  type="button"
2193
2244
  tabindex="-1"
2194
- aria-label="Effacer la date"
2245
+ [attr.aria-label]="clearLabel()"
2195
2246
  class="absolute right-10 inline-flex h-6 w-6 items-center justify-center rounded-full text-ink-faint hover:bg-black/5 hover:text-ink-soft"
2196
2247
  (click)="clear($event)"
2197
2248
  >
@@ -2202,7 +2253,7 @@ class SdsDatePicker {
2202
2253
  <button
2203
2254
  type="button"
2204
2255
  tabindex="-1"
2205
- [attr.aria-label]="open() ? 'Fermer le calendrier' : 'Ouvrir le calendrier'"
2256
+ [attr.aria-label]="open() ? closeCalendarLabel() : openCalendarLabel()"
2206
2257
  class="absolute right-2 inline-flex h-7 w-7 items-center justify-center rounded-control text-ink-soft hover:bg-muted"
2207
2258
  (click)="toggle($event)"
2208
2259
  >
@@ -2217,7 +2268,7 @@ class SdsDatePicker {
2217
2268
  class="fixed z-[1000]"
2218
2269
  role="dialog"
2219
2270
  aria-modal="false"
2220
- aria-label="Sélection de date"
2271
+ [attr.aria-label]="panelLabel()"
2221
2272
  (keydown.escape)="close(true)"
2222
2273
  >
2223
2274
  <sds-calendar
@@ -2227,6 +2278,11 @@ class SdsDatePicker {
2227
2278
  [firstDayOfWeek]="firstDayOfWeek()"
2228
2279
  [locale]="locale()"
2229
2280
  [showActions]="showActions()"
2281
+ [calendarLabel]="calendarLabel()"
2282
+ [previousLabel]="previousLabel()"
2283
+ [nextLabel]="nextLabel()"
2284
+ [todayActionLabel]="todayActionLabel()"
2285
+ [clearActionLabel]="clearActionLabel()"
2230
2286
  (valueChange)="onCalendarValue($event)"
2231
2287
  (dateSelect)="close(true)"
2232
2288
  />
@@ -2241,7 +2297,7 @@ class SdsDatePicker {
2241
2297
  @if (error()) {
2242
2298
  <p class="mt-1.5 text-xs font-medium text-danger">{{ error() }}</p>
2243
2299
  }
2244
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }, { kind: "component", type: SdsCalendar, selector: "sds-calendar", inputs: ["value", "min", "max", "firstDayOfWeek", "locale", "showActions"], outputs: ["valueChange", "dateSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2300
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }, { kind: "component", type: SdsCalendar, selector: "sds-calendar", inputs: ["value", "min", "max", "firstDayOfWeek", "locale", "showActions", "calendarLabel", "previousLabel", "nextLabel", "todayActionLabel", "clearActionLabel"], outputs: ["valueChange", "dateSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2245
2301
  }
2246
2302
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsDatePicker, decorators: [{
2247
2303
  type: Component,
@@ -2272,6 +2328,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2272
2328
  [firstDayOfWeek]="firstDayOfWeek()"
2273
2329
  [locale]="locale()"
2274
2330
  [showActions]="showActions()"
2331
+ [calendarLabel]="calendarLabel()"
2332
+ [previousLabel]="previousLabel()"
2333
+ [nextLabel]="nextLabel()"
2334
+ [todayActionLabel]="todayActionLabel()"
2335
+ [clearActionLabel]="clearActionLabel()"
2275
2336
  (valueChange)="onCalendarValue($event)"
2276
2337
  />
2277
2338
  } @else {
@@ -2301,7 +2362,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2301
2362
  <button
2302
2363
  type="button"
2303
2364
  tabindex="-1"
2304
- aria-label="Effacer la date"
2365
+ [attr.aria-label]="clearLabel()"
2305
2366
  class="absolute right-10 inline-flex h-6 w-6 items-center justify-center rounded-full text-ink-faint hover:bg-black/5 hover:text-ink-soft"
2306
2367
  (click)="clear($event)"
2307
2368
  >
@@ -2312,7 +2373,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2312
2373
  <button
2313
2374
  type="button"
2314
2375
  tabindex="-1"
2315
- [attr.aria-label]="open() ? 'Fermer le calendrier' : 'Ouvrir le calendrier'"
2376
+ [attr.aria-label]="open() ? closeCalendarLabel() : openCalendarLabel()"
2316
2377
  class="absolute right-2 inline-flex h-7 w-7 items-center justify-center rounded-control text-ink-soft hover:bg-muted"
2317
2378
  (click)="toggle($event)"
2318
2379
  >
@@ -2327,7 +2388,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2327
2388
  class="fixed z-[1000]"
2328
2389
  role="dialog"
2329
2390
  aria-modal="false"
2330
- aria-label="Sélection de date"
2391
+ [attr.aria-label]="panelLabel()"
2331
2392
  (keydown.escape)="close(true)"
2332
2393
  >
2333
2394
  <sds-calendar
@@ -2337,6 +2398,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2337
2398
  [firstDayOfWeek]="firstDayOfWeek()"
2338
2399
  [locale]="locale()"
2339
2400
  [showActions]="showActions()"
2401
+ [calendarLabel]="calendarLabel()"
2402
+ [previousLabel]="previousLabel()"
2403
+ [nextLabel]="nextLabel()"
2404
+ [todayActionLabel]="todayActionLabel()"
2405
+ [clearActionLabel]="clearActionLabel()"
2340
2406
  (valueChange)="onCalendarValue($event)"
2341
2407
  (dateSelect)="close(true)"
2342
2408
  />
@@ -2353,7 +2419,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2353
2419
  }
2354
2420
  `,
2355
2421
  }]
2356
- }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], inline: [{ type: i0.Input, args: [{ isSignal: true, alias: "inline", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], showActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showActions", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], calendar: [{ type: i0.ViewChild, args: [i0.forwardRef(() => SdsCalendar), { isSignal: true }] }], trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }] } });
2422
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], inline: [{ type: i0.Input, args: [{ isSignal: true, alias: "inline", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], showActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showActions", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], openCalendarLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "openCalendarLabel", required: false }] }], closeCalendarLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeCalendarLabel", required: false }] }], panelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelLabel", required: false }] }], calendarLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "calendarLabel", required: false }] }], previousLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousLabel", required: false }] }], nextLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextLabel", required: false }] }], todayActionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "todayActionLabel", required: false }] }], clearActionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearActionLabel", required: false }] }], calendar: [{ type: i0.ViewChild, args: [i0.forwardRef(() => SdsCalendar), { isSignal: true }] }], trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }] } });
2357
2423
  let nextId$6 = 0;
2358
2424
 
2359
2425
  const SIZES$4 = {
@@ -3781,6 +3847,40 @@ class SdsPhoneInput {
3781
3847
  /** Show an example number as a hint when no [hint] is provided. */
3782
3848
  showExampleHint = input(true, ...(ngDevMode ? [{ debugName: "showExampleHint", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
3783
3849
  requiredMessage = input('Numéro de téléphone requis', ...(ngDevMode ? [{ debugName: "requiredMessage" }] : []));
3850
+ /**
3851
+ * Accessible name of the country selector. `{country}` is replaced with the selected country's
3852
+ * name. A token rather than a prefix because word order differs per language. French default so
3853
+ * existing consumers are unchanged; translate it in any app serving more than one language.
3854
+ *
3855
+ * Note the interpolated country NAME still comes from the library's built-in country table, which
3856
+ * is French-only — translating this template fixes the wrapper, not the name inside it.
3857
+ */
3858
+ countryLabel = input('Indicatif pays : {country}', ...(ngDevMode ? [{ debugName: "countryLabel" }] : []));
3859
+ /**
3860
+ * Accessible name for the clear button. It is icon-only, so this string is its ONLY accessible
3861
+ * name — a hardcoded French one is simply wrong in every other locale.
3862
+ */
3863
+ clearLabel = input('Effacer', ...(ngDevMode ? [{ debugName: "clearLabel" }] : []));
3864
+ /** Accessible name for the country-search field inside the dropdown. */
3865
+ searchLabel = input('Rechercher un pays', ...(ngDevMode ? [{ debugName: "searchLabel" }] : []));
3866
+ /** Placeholder text of the country-search field. */
3867
+ searchPlaceholder = input('Rechercher un pays…', ...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : []));
3868
+ /** Shown in place of the list when no country matches the filter. */
3869
+ noResultsLabel = input('Aucun pays', ...(ngDevMode ? [{ debugName: "noResultsLabel" }] : []));
3870
+ /**
3871
+ * Built-in validation messages. `{lengths}` is replaced with the country's accepted national
3872
+ * lengths, joined with {@link lengthSeparator}. Siblings of {@link requiredMessage}, which was
3873
+ * already translatable — these two were not, so an English or Dutch app showed French errors.
3874
+ */
3875
+ incompleteMessage = input('Numéro incomplet — {lengths} chiffres attendus', ...(ngDevMode ? [{ debugName: "incompleteMessage" }] : []));
3876
+ invalidMessage = input('Numéro invalide — {lengths} chiffres attendus', ...(ngDevMode ? [{ debugName: "invalidMessage" }] : []));
3877
+ /** Joins the accepted lengths when a country allows more than one (e.g. "8 ou 9"). */
3878
+ lengthSeparator = input(' ou ', ...(ngDevMode ? [{ debugName: "lengthSeparator" }] : []));
3879
+ /**
3880
+ * Auto-generated example hint (see {@link showExampleHint}). `{number}` is replaced with the
3881
+ * formatted international example number.
3882
+ */
3883
+ exampleHintTemplate = input('Ex. {number}', ...(ngDevMode ? [{ debugName: "exampleHintTemplate" }] : []));
3784
3884
  /** Emitted with the parsed parts whenever the number or country changes. */
3785
3885
  phoneChange = output();
3786
3886
  national = signal('', ...(ngDevMode ? [{ debugName: "national" }] : []));
@@ -3831,8 +3931,10 @@ class SdsPhoneInput {
3831
3931
  if (!this.showExampleHint())
3832
3932
  return '';
3833
3933
  const c = this.country();
3834
- return `Ex. +${c.dialCode} ${sdsFormatNational(c.example, c.format)}`;
3934
+ const number = `+${c.dialCode} ${sdsFormatNational(c.example, c.format)}`;
3935
+ return this.exampleHintTemplate().replace('{number}', number);
3835
3936
  }, ...(ngDevMode ? [{ debugName: "autoHint" }] : []));
3937
+ countryAriaLabel = computed(() => this.countryLabel().replace('{country}', this.country().name), ...(ngDevMode ? [{ debugName: "countryAriaLabel" }] : []));
3836
3938
  e164 = computed(() => {
3837
3939
  const d = this.national();
3838
3940
  return d ? `+${this.country().dialCode}${d}` : '';
@@ -3860,12 +3962,12 @@ class SdsPhoneInput {
3860
3962
  if (this.required() && !this.national())
3861
3963
  return this.requiredMessage();
3862
3964
  const lengths = this.country().lengths;
3863
- const expected = lengths.join(' ou ');
3965
+ const expected = lengths.join(this.lengthSeparator());
3864
3966
  const len = this.national().length;
3865
3967
  const min = Math.min(...lengths);
3866
3968
  if (len < min)
3867
- return `Numéro incomplet — ${expected} chiffres attendus`;
3868
- return `Numéro invalide — ${expected} chiffres attendus`;
3969
+ return this.incompleteMessage().replace('{lengths}', expected);
3970
+ return this.invalidMessage().replace('{lengths}', expected);
3869
3971
  }, ...(ngDevMode ? [{ debugName: "errorMessage" }] : []));
3870
3972
  describedBy = computed(() => {
3871
3973
  if (this.showError())
@@ -4148,7 +4250,7 @@ class SdsPhoneInput {
4148
4250
  this.onValidatorChange = fn;
4149
4251
  }
4150
4252
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsPhoneInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
4151
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsPhoneInput, isStandalone: true, selector: "sds-phone-input", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, defaultCountry: { classPropertyName: "defaultCountry", publicName: "defaultCountry", isSignal: true, isRequired: false, transformFunction: null }, preferredCountries: { classPropertyName: "preferredCountries", publicName: "preferredCountries", isSignal: true, isRequired: false, transformFunction: null }, onlyCountries: { classPropertyName: "onlyCountries", publicName: "onlyCountries", isSignal: true, isRequired: false, transformFunction: null }, showExampleHint: { classPropertyName: "showExampleHint", publicName: "showExampleHint", isSignal: true, isRequired: false, transformFunction: null }, requiredMessage: { classPropertyName: "requiredMessage", publicName: "requiredMessage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { phoneChange: "phoneChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, classAttribute: "block" }, providers: [
4253
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsPhoneInput, isStandalone: true, selector: "sds-phone-input", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, defaultCountry: { classPropertyName: "defaultCountry", publicName: "defaultCountry", isSignal: true, isRequired: false, transformFunction: null }, preferredCountries: { classPropertyName: "preferredCountries", publicName: "preferredCountries", isSignal: true, isRequired: false, transformFunction: null }, onlyCountries: { classPropertyName: "onlyCountries", publicName: "onlyCountries", isSignal: true, isRequired: false, transformFunction: null }, showExampleHint: { classPropertyName: "showExampleHint", publicName: "showExampleHint", isSignal: true, isRequired: false, transformFunction: null }, requiredMessage: { classPropertyName: "requiredMessage", publicName: "requiredMessage", isSignal: true, isRequired: false, transformFunction: null }, countryLabel: { classPropertyName: "countryLabel", publicName: "countryLabel", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, searchLabel: { classPropertyName: "searchLabel", publicName: "searchLabel", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, noResultsLabel: { classPropertyName: "noResultsLabel", publicName: "noResultsLabel", isSignal: true, isRequired: false, transformFunction: null }, incompleteMessage: { classPropertyName: "incompleteMessage", publicName: "incompleteMessage", isSignal: true, isRequired: false, transformFunction: null }, invalidMessage: { classPropertyName: "invalidMessage", publicName: "invalidMessage", isSignal: true, isRequired: false, transformFunction: null }, lengthSeparator: { classPropertyName: "lengthSeparator", publicName: "lengthSeparator", isSignal: true, isRequired: false, transformFunction: null }, exampleHintTemplate: { classPropertyName: "exampleHintTemplate", publicName: "exampleHintTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { phoneChange: "phoneChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, classAttribute: "block" }, providers: [
4152
4254
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SdsPhoneInput), multi: true },
4153
4255
  { provide: NG_VALIDATORS, useExisting: forwardRef(() => SdsPhoneInput), multi: true },
4154
4256
  ], viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true, isSignal: true }, { propertyName: "field", first: true, predicate: ["field"], descendants: true, isSignal: true }], ngImport: i0, template: `
@@ -4171,7 +4273,7 @@ class SdsPhoneInput {
4171
4273
  [attr.aria-expanded]="open()"
4172
4274
  [attr.aria-controls]="listId"
4173
4275
  aria-haspopup="listbox"
4174
- [attr.aria-label]="'Indicatif pays : ' + country().name"
4276
+ [attr.aria-label]="countryAriaLabel()"
4175
4277
  class="flex shrink-0 items-center gap-1.5 rounded-l-control pl-2.5 pr-2 focus:outline-none"
4176
4278
  [class.cursor-not-allowed]="isDisabled()"
4177
4279
  (click)="toggle()"
@@ -4212,7 +4314,7 @@ class SdsPhoneInput {
4212
4314
  <button
4213
4315
  type="button"
4214
4316
  tabindex="-1"
4215
- aria-label="Effacer"
4317
+ [attr.aria-label]="clearLabel()"
4216
4318
  class="mr-1.5 inline-flex w-7 shrink-0 items-center justify-center rounded-full text-ink-faint hover:bg-black/5 hover:text-ink-soft"
4217
4319
  (click)="clear()"
4218
4320
  >
@@ -4234,8 +4336,8 @@ class SdsPhoneInput {
4234
4336
  type="text"
4235
4337
  [attr.aria-controls]="listId"
4236
4338
  [value]="filterText()"
4237
- placeholder="Rechercher un pays…"
4238
- aria-label="Rechercher un pays"
4339
+ [placeholder]="searchPlaceholder()"
4340
+ [attr.aria-label]="searchLabel()"
4239
4341
  class="h-9 w-full bg-transparent pl-8 pr-2 text-sm text-ink outline-none placeholder:text-ink-faint"
4240
4342
  (input)="onFilter($event)"
4241
4343
  (keydown)="onFilterKeydown($event)"
@@ -4261,7 +4363,7 @@ class SdsPhoneInput {
4261
4363
  <span class="text-ink-faint">+{{ c.dialCode }}</span>
4262
4364
  </li>
4263
4365
  } @empty {
4264
- <li class="px-3 py-2 text-sm text-ink-faint">Aucun pays</li>
4366
+ <li class="px-3 py-2 text-sm text-ink-faint">{{ noResultsLabel() }}</li>
4265
4367
  }
4266
4368
  </ul>
4267
4369
  </div>
@@ -4312,7 +4414,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4312
4414
  [attr.aria-expanded]="open()"
4313
4415
  [attr.aria-controls]="listId"
4314
4416
  aria-haspopup="listbox"
4315
- [attr.aria-label]="'Indicatif pays : ' + country().name"
4417
+ [attr.aria-label]="countryAriaLabel()"
4316
4418
  class="flex shrink-0 items-center gap-1.5 rounded-l-control pl-2.5 pr-2 focus:outline-none"
4317
4419
  [class.cursor-not-allowed]="isDisabled()"
4318
4420
  (click)="toggle()"
@@ -4353,7 +4455,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4353
4455
  <button
4354
4456
  type="button"
4355
4457
  tabindex="-1"
4356
- aria-label="Effacer"
4458
+ [attr.aria-label]="clearLabel()"
4357
4459
  class="mr-1.5 inline-flex w-7 shrink-0 items-center justify-center rounded-full text-ink-faint hover:bg-black/5 hover:text-ink-soft"
4358
4460
  (click)="clear()"
4359
4461
  >
@@ -4375,8 +4477,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4375
4477
  type="text"
4376
4478
  [attr.aria-controls]="listId"
4377
4479
  [value]="filterText()"
4378
- placeholder="Rechercher un pays…"
4379
- aria-label="Rechercher un pays"
4480
+ [placeholder]="searchPlaceholder()"
4481
+ [attr.aria-label]="searchLabel()"
4380
4482
  class="h-9 w-full bg-transparent pl-8 pr-2 text-sm text-ink outline-none placeholder:text-ink-faint"
4381
4483
  (input)="onFilter($event)"
4382
4484
  (keydown)="onFilterKeydown($event)"
@@ -4402,7 +4504,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4402
4504
  <span class="text-ink-faint">+{{ c.dialCode }}</span>
4403
4505
  </li>
4404
4506
  } @empty {
4405
- <li class="px-3 py-2 text-sm text-ink-faint">Aucun pays</li>
4507
+ <li class="px-3 py-2 text-sm text-ink-faint">{{ noResultsLabel() }}</li>
4406
4508
  }
4407
4509
  </ul>
4408
4510
  </div>
@@ -4419,7 +4521,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4419
4521
  }
4420
4522
  `,
4421
4523
  }]
4422
- }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], defaultCountry: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultCountry", required: false }] }], preferredCountries: [{ type: i0.Input, args: [{ isSignal: true, alias: "preferredCountries", required: false }] }], onlyCountries: [{ type: i0.Input, args: [{ isSignal: true, alias: "onlyCountries", required: false }] }], showExampleHint: [{ type: i0.Input, args: [{ isSignal: true, alias: "showExampleHint", required: false }] }], requiredMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "requiredMessage", required: false }] }], phoneChange: [{ type: i0.Output, args: ["phoneChange"] }], anchor: [{ type: i0.ViewChild, args: ['anchor', { isSignal: true }] }], field: [{ type: i0.ViewChild, args: ['field', { isSignal: true }] }] } });
4524
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], defaultCountry: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultCountry", required: false }] }], preferredCountries: [{ type: i0.Input, args: [{ isSignal: true, alias: "preferredCountries", required: false }] }], onlyCountries: [{ type: i0.Input, args: [{ isSignal: true, alias: "onlyCountries", required: false }] }], showExampleHint: [{ type: i0.Input, args: [{ isSignal: true, alias: "showExampleHint", required: false }] }], requiredMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "requiredMessage", required: false }] }], countryLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "countryLabel", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], searchLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchLabel", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], noResultsLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultsLabel", required: false }] }], incompleteMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "incompleteMessage", required: false }] }], invalidMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalidMessage", required: false }] }], lengthSeparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "lengthSeparator", required: false }] }], exampleHintTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "exampleHintTemplate", required: false }] }], phoneChange: [{ type: i0.Output, args: ["phoneChange"] }], anchor: [{ type: i0.ViewChild, args: ['anchor', { isSignal: true }] }], field: [{ type: i0.ViewChild, args: ['field', { isSignal: true }] }] } });
4423
4525
 
4424
4526
  const SIZES$1 = {
4425
4527
  sm: 'h-8 min-w-8 text-xs',
@@ -4468,6 +4570,28 @@ class SdsPaginator {
4468
4570
  showJumpToPageInput = input(false, ...(ngDevMode ? [{ debugName: "showJumpToPageInput", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
4469
4571
  rowsPerPageLabel = input('Lignes par page', ...(ngDevMode ? [{ debugName: "rowsPerPageLabel" }] : []));
4470
4572
  jumpToPageLabel = input('Aller à', ...(ngDevMode ? [{ debugName: "jumpToPageLabel" }] : []));
4573
+ /**
4574
+ * Accessible name for the <nav> wrapping the page controls, and for the four icon-only
4575
+ * first/prev/next/last buttons. Those buttons have no text, so these strings are their ONLY
4576
+ * accessible names — the French defaults keep existing consumers unchanged, but an app serving more
4577
+ * than one language MUST pass translated values.
4578
+ */
4579
+ paginationLabel = input('Pagination', ...(ngDevMode ? [{ debugName: "paginationLabel" }] : []));
4580
+ firstPageLabel = input('Première page', ...(ngDevMode ? [{ debugName: "firstPageLabel" }] : []));
4581
+ previousPageLabel = input('Page précédente', ...(ngDevMode ? [{ debugName: "previousPageLabel" }] : []));
4582
+ nextPageLabel = input('Page suivante', ...(ngDevMode ? [{ debugName: "nextPageLabel" }] : []));
4583
+ lastPageLabel = input('Dernière page', ...(ngDevMode ? [{ debugName: "lastPageLabel" }] : []));
4584
+ /**
4585
+ * Accessible name of a numbered page link. `{page}` is replaced with the 1-based page number —
4586
+ * a token rather than a prefix because word order is not the same in every language.
4587
+ */
4588
+ pageLinkLabel = input('Page {page}', ...(ngDevMode ? [{ debugName: "pageLinkLabel" }] : []));
4589
+ /**
4590
+ * Accessible name of the jump-to-page field. Separate from the visible {@link jumpToPageLabel}
4591
+ * ("Aller à") on purpose: the visible text is terse because it sits next to the field, while the
4592
+ * accessible name has to stand alone.
4593
+ */
4594
+ jumpToPageAriaLabel = input('Aller à la page', ...(ngDevMode ? [{ debugName: "jumpToPageAriaLabel" }] : []));
4471
4595
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
4472
4596
  disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
4473
4597
  /** Fires after any page or page-size change with the full paginator state. */
@@ -4503,6 +4627,9 @@ class SdsPaginator {
4503
4627
  const justify = this.showCurrentPageReport() ? 'justify-between' : 'justify-center';
4504
4628
  return `${base} ${justify}`;
4505
4629
  }, ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
4630
+ pageLinkAriaLabel(page) {
4631
+ return this.pageLinkLabel().replace('{page}', String(page + 1));
4632
+ }
4506
4633
  navClass(isDisabled) {
4507
4634
  const cls = `${BTN_BASE} ${SIZES$1[this.size()]} px-0`;
4508
4635
  return isDisabled
@@ -4570,20 +4697,20 @@ class SdsPaginator {
4570
4697
  });
4571
4698
  }
4572
4699
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsPaginator, deps: [], target: i0.ɵɵFactoryTarget.Component });
4573
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsPaginator, isStandalone: true, selector: "sds-paginator", inputs: { totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: true, isRequired: false, transformFunction: null }, first: { classPropertyName: "first", publicName: "first", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, rowsPerPageOptions: { classPropertyName: "rowsPerPageOptions", publicName: "rowsPerPageOptions", isSignal: true, isRequired: false, transformFunction: null }, pageLinkSize: { classPropertyName: "pageLinkSize", publicName: "pageLinkSize", isSignal: true, isRequired: false, transformFunction: null }, showFirstLastIcon: { classPropertyName: "showFirstLastIcon", publicName: "showFirstLastIcon", isSignal: true, isRequired: false, transformFunction: null }, showPageLinks: { classPropertyName: "showPageLinks", publicName: "showPageLinks", isSignal: true, isRequired: false, transformFunction: null }, showCurrentPageReport: { classPropertyName: "showCurrentPageReport", publicName: "showCurrentPageReport", isSignal: true, isRequired: false, transformFunction: null }, currentPageReportTemplate: { classPropertyName: "currentPageReportTemplate", publicName: "currentPageReportTemplate", isSignal: true, isRequired: false, transformFunction: null }, showJumpToPageInput: { classPropertyName: "showJumpToPageInput", publicName: "showJumpToPageInput", isSignal: true, isRequired: false, transformFunction: null }, rowsPerPageLabel: { classPropertyName: "rowsPerPageLabel", publicName: "rowsPerPageLabel", isSignal: true, isRequired: false, transformFunction: null }, jumpToPageLabel: { classPropertyName: "jumpToPageLabel", publicName: "jumpToPageLabel", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { first: "firstChange", rows: "rowsChange", pageChange: "pageChange" }, host: { properties: { "class": "hostClass()" } }, ngImport: i0, template: `
4700
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsPaginator, isStandalone: true, selector: "sds-paginator", inputs: { totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: true, isRequired: false, transformFunction: null }, first: { classPropertyName: "first", publicName: "first", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, rowsPerPageOptions: { classPropertyName: "rowsPerPageOptions", publicName: "rowsPerPageOptions", isSignal: true, isRequired: false, transformFunction: null }, pageLinkSize: { classPropertyName: "pageLinkSize", publicName: "pageLinkSize", isSignal: true, isRequired: false, transformFunction: null }, showFirstLastIcon: { classPropertyName: "showFirstLastIcon", publicName: "showFirstLastIcon", isSignal: true, isRequired: false, transformFunction: null }, showPageLinks: { classPropertyName: "showPageLinks", publicName: "showPageLinks", isSignal: true, isRequired: false, transformFunction: null }, showCurrentPageReport: { classPropertyName: "showCurrentPageReport", publicName: "showCurrentPageReport", isSignal: true, isRequired: false, transformFunction: null }, currentPageReportTemplate: { classPropertyName: "currentPageReportTemplate", publicName: "currentPageReportTemplate", isSignal: true, isRequired: false, transformFunction: null }, showJumpToPageInput: { classPropertyName: "showJumpToPageInput", publicName: "showJumpToPageInput", isSignal: true, isRequired: false, transformFunction: null }, rowsPerPageLabel: { classPropertyName: "rowsPerPageLabel", publicName: "rowsPerPageLabel", isSignal: true, isRequired: false, transformFunction: null }, jumpToPageLabel: { classPropertyName: "jumpToPageLabel", publicName: "jumpToPageLabel", isSignal: true, isRequired: false, transformFunction: null }, paginationLabel: { classPropertyName: "paginationLabel", publicName: "paginationLabel", isSignal: true, isRequired: false, transformFunction: null }, firstPageLabel: { classPropertyName: "firstPageLabel", publicName: "firstPageLabel", isSignal: true, isRequired: false, transformFunction: null }, previousPageLabel: { classPropertyName: "previousPageLabel", publicName: "previousPageLabel", isSignal: true, isRequired: false, transformFunction: null }, nextPageLabel: { classPropertyName: "nextPageLabel", publicName: "nextPageLabel", isSignal: true, isRequired: false, transformFunction: null }, lastPageLabel: { classPropertyName: "lastPageLabel", publicName: "lastPageLabel", isSignal: true, isRequired: false, transformFunction: null }, pageLinkLabel: { classPropertyName: "pageLinkLabel", publicName: "pageLinkLabel", isSignal: true, isRequired: false, transformFunction: null }, jumpToPageAriaLabel: { classPropertyName: "jumpToPageAriaLabel", publicName: "jumpToPageAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { first: "firstChange", rows: "rowsChange", pageChange: "pageChange" }, host: { properties: { "class": "hostClass()" } }, ngImport: i0, template: `
4574
4701
  @if (showCurrentPageReport()) {
4575
4702
  <span class="text-sm text-ink-soft">{{ reportText() }}</span>
4576
4703
  }
4577
4704
 
4578
4705
  <div class="flex flex-wrap items-center gap-x-4 gap-y-2">
4579
4706
  <!-- page navigation -->
4580
- <nav class="flex items-center gap-1" aria-label="Pagination">
4707
+ <nav class="flex items-center gap-1" [attr.aria-label]="paginationLabel()">
4581
4708
  @if (showFirstLastIcon()) {
4582
4709
  <button
4583
4710
  type="button"
4584
4711
  [class]="navClass(firstDisabled())"
4585
4712
  [disabled]="firstDisabled()"
4586
- aria-label="Première page"
4713
+ [attr.aria-label]="firstPageLabel()"
4587
4714
  (click)="firstPage()"
4588
4715
  >
4589
4716
  <sds-icon name="chevrons-left" [size]="iconSize()" />
@@ -4593,7 +4720,7 @@ class SdsPaginator {
4593
4720
  type="button"
4594
4721
  [class]="navClass(firstDisabled())"
4595
4722
  [disabled]="firstDisabled()"
4596
- aria-label="Page précédente"
4723
+ [attr.aria-label]="previousPageLabel()"
4597
4724
  (click)="prevPage()"
4598
4725
  >
4599
4726
  <sds-icon name="chevron-left" [size]="iconSize()" />
@@ -4604,7 +4731,7 @@ class SdsPaginator {
4604
4731
  <button
4605
4732
  type="button"
4606
4733
  [class]="linkClass(p === page())"
4607
- [attr.aria-label]="'Page ' + (p + 1)"
4734
+ [attr.aria-label]="pageLinkAriaLabel(p)"
4608
4735
  [attr.aria-current]="p === page() ? 'page' : null"
4609
4736
  [disabled]="disabled()"
4610
4737
  (click)="changePage(p)"
@@ -4618,7 +4745,7 @@ class SdsPaginator {
4618
4745
  type="button"
4619
4746
  [class]="navClass(lastDisabled())"
4620
4747
  [disabled]="lastDisabled()"
4621
- aria-label="Page suivante"
4748
+ [attr.aria-label]="nextPageLabel()"
4622
4749
  (click)="nextPage()"
4623
4750
  >
4624
4751
  <sds-icon name="chevron-right" [size]="iconSize()" />
@@ -4628,7 +4755,7 @@ class SdsPaginator {
4628
4755
  type="button"
4629
4756
  [class]="navClass(lastDisabled())"
4630
4757
  [disabled]="lastDisabled()"
4631
- aria-label="Dernière page"
4758
+ [attr.aria-label]="lastPageLabel()"
4632
4759
  (click)="lastPage()"
4633
4760
  >
4634
4761
  <sds-icon name="chevrons-right" [size]="iconSize()" />
@@ -4643,7 +4770,7 @@ class SdsPaginator {
4643
4770
  <span class="w-20">
4644
4771
  <sds-select
4645
4772
  size="sm"
4646
- ariaLabel="Lignes par page"
4773
+ [ariaLabel]="rowsPerPageLabel()"
4647
4774
  [options]="rowsPerPageOptions()"
4648
4775
  [ngModel]="rows()"
4649
4776
  (ngModelChange)="onRowsChange($event)"
@@ -4663,7 +4790,7 @@ class SdsPaginator {
4663
4790
  [max]="pageCount()"
4664
4791
  [value]="page() + 1"
4665
4792
  [disabled]="disabled()"
4666
- aria-label="Aller à la page"
4793
+ [attr.aria-label]="jumpToPageAriaLabel()"
4667
4794
  (change)="onJump($event)"
4668
4795
  class="h-9 w-16 rounded-control border border-border bg-white px-2 text-center text-sm text-ink outline-none transition-colors focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25 disabled:opacity-60"
4669
4796
  />
@@ -4686,13 +4813,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4686
4813
 
4687
4814
  <div class="flex flex-wrap items-center gap-x-4 gap-y-2">
4688
4815
  <!-- page navigation -->
4689
- <nav class="flex items-center gap-1" aria-label="Pagination">
4816
+ <nav class="flex items-center gap-1" [attr.aria-label]="paginationLabel()">
4690
4817
  @if (showFirstLastIcon()) {
4691
4818
  <button
4692
4819
  type="button"
4693
4820
  [class]="navClass(firstDisabled())"
4694
4821
  [disabled]="firstDisabled()"
4695
- aria-label="Première page"
4822
+ [attr.aria-label]="firstPageLabel()"
4696
4823
  (click)="firstPage()"
4697
4824
  >
4698
4825
  <sds-icon name="chevrons-left" [size]="iconSize()" />
@@ -4702,7 +4829,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4702
4829
  type="button"
4703
4830
  [class]="navClass(firstDisabled())"
4704
4831
  [disabled]="firstDisabled()"
4705
- aria-label="Page précédente"
4832
+ [attr.aria-label]="previousPageLabel()"
4706
4833
  (click)="prevPage()"
4707
4834
  >
4708
4835
  <sds-icon name="chevron-left" [size]="iconSize()" />
@@ -4713,7 +4840,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4713
4840
  <button
4714
4841
  type="button"
4715
4842
  [class]="linkClass(p === page())"
4716
- [attr.aria-label]="'Page ' + (p + 1)"
4843
+ [attr.aria-label]="pageLinkAriaLabel(p)"
4717
4844
  [attr.aria-current]="p === page() ? 'page' : null"
4718
4845
  [disabled]="disabled()"
4719
4846
  (click)="changePage(p)"
@@ -4727,7 +4854,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4727
4854
  type="button"
4728
4855
  [class]="navClass(lastDisabled())"
4729
4856
  [disabled]="lastDisabled()"
4730
- aria-label="Page suivante"
4857
+ [attr.aria-label]="nextPageLabel()"
4731
4858
  (click)="nextPage()"
4732
4859
  >
4733
4860
  <sds-icon name="chevron-right" [size]="iconSize()" />
@@ -4737,7 +4864,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4737
4864
  type="button"
4738
4865
  [class]="navClass(lastDisabled())"
4739
4866
  [disabled]="lastDisabled()"
4740
- aria-label="Dernière page"
4867
+ [attr.aria-label]="lastPageLabel()"
4741
4868
  (click)="lastPage()"
4742
4869
  >
4743
4870
  <sds-icon name="chevrons-right" [size]="iconSize()" />
@@ -4752,7 +4879,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4752
4879
  <span class="w-20">
4753
4880
  <sds-select
4754
4881
  size="sm"
4755
- ariaLabel="Lignes par page"
4882
+ [ariaLabel]="rowsPerPageLabel()"
4756
4883
  [options]="rowsPerPageOptions()"
4757
4884
  [ngModel]="rows()"
4758
4885
  (ngModelChange)="onRowsChange($event)"
@@ -4772,7 +4899,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4772
4899
  [max]="pageCount()"
4773
4900
  [value]="page() + 1"
4774
4901
  [disabled]="disabled()"
4775
- aria-label="Aller à la page"
4902
+ [attr.aria-label]="jumpToPageAriaLabel()"
4776
4903
  (change)="onJump($event)"
4777
4904
  class="h-9 w-16 rounded-control border border-border bg-white px-2 text-center text-sm text-ink outline-none transition-colors focus:border-brand-500 focus:ring-2 focus:ring-brand-500/25 disabled:opacity-60"
4778
4905
  />
@@ -4781,7 +4908,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4781
4908
  </div>
4782
4909
  `,
4783
4910
  }]
4784
- }], propDecorators: { totalRecords: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalRecords", required: false }] }], first: [{ type: i0.Input, args: [{ isSignal: true, alias: "first", required: false }] }, { type: i0.Output, args: ["firstChange"] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }, { type: i0.Output, args: ["rowsChange"] }], rowsPerPageOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowsPerPageOptions", required: false }] }], pageLinkSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageLinkSize", required: false }] }], showFirstLastIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFirstLastIcon", required: false }] }], showPageLinks: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPageLinks", required: false }] }], showCurrentPageReport: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCurrentPageReport", required: false }] }], currentPageReportTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentPageReportTemplate", required: false }] }], showJumpToPageInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "showJumpToPageInput", required: false }] }], rowsPerPageLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowsPerPageLabel", required: false }] }], jumpToPageLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "jumpToPageLabel", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }] } });
4911
+ }], propDecorators: { totalRecords: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalRecords", required: false }] }], first: [{ type: i0.Input, args: [{ isSignal: true, alias: "first", required: false }] }, { type: i0.Output, args: ["firstChange"] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }, { type: i0.Output, args: ["rowsChange"] }], rowsPerPageOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowsPerPageOptions", required: false }] }], pageLinkSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageLinkSize", required: false }] }], showFirstLastIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFirstLastIcon", required: false }] }], showPageLinks: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPageLinks", required: false }] }], showCurrentPageReport: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCurrentPageReport", required: false }] }], currentPageReportTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentPageReportTemplate", required: false }] }], showJumpToPageInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "showJumpToPageInput", required: false }] }], rowsPerPageLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowsPerPageLabel", required: false }] }], jumpToPageLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "jumpToPageLabel", required: false }] }], paginationLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "paginationLabel", required: false }] }], firstPageLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstPageLabel", required: false }] }], previousPageLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousPageLabel", required: false }] }], nextPageLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextPageLabel", required: false }] }], lastPageLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "lastPageLabel", required: false }] }], pageLinkLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageLinkLabel", required: false }] }], jumpToPageAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "jumpToPageAriaLabel", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }] } });
4785
4912
 
4786
4913
  let nextId$2 = 0;
4787
4914
  /**
@@ -6225,7 +6352,7 @@ class SdsTable {
6225
6352
  </div>
6226
6353
  }
6227
6354
  </div>
6228
- `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }, { kind: "component", type: SdsPaginator, selector: "sds-paginator", inputs: ["totalRecords", "first", "rows", "rowsPerPageOptions", "pageLinkSize", "showFirstLastIcon", "showPageLinks", "showCurrentPageReport", "currentPageReportTemplate", "showJumpToPageInput", "rowsPerPageLabel", "jumpToPageLabel", "size", "disabled"], outputs: ["firstChange", "rowsChange", "pageChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6355
+ `, isInline: true, dependencies: [{ kind: "component", type: SdsIcon, selector: "sds-icon", inputs: ["name", "size", "strokeWidth"] }, { kind: "component", type: SdsPaginator, selector: "sds-paginator", inputs: ["totalRecords", "first", "rows", "rowsPerPageOptions", "pageLinkSize", "showFirstLastIcon", "showPageLinks", "showCurrentPageReport", "currentPageReportTemplate", "showJumpToPageInput", "rowsPerPageLabel", "jumpToPageLabel", "paginationLabel", "firstPageLabel", "previousPageLabel", "nextPageLabel", "lastPageLabel", "pageLinkLabel", "jumpToPageAriaLabel", "size", "disabled"], outputs: ["firstChange", "rowsChange", "pageChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6229
6356
  }
6230
6357
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsTable, decorators: [{
6231
6358
  type: Component,