ps-helix 4.1.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ps-helix",
3
- "version": "4.1.0",
3
+ "version": "5.0.0",
4
4
  "description": "Helix Design System - A comprehensive Angular component library",
5
5
  "author": "Fabrice PEREZ - Product designer at PACK Solutions",
6
6
  "license": "MIT",
@@ -139,28 +139,28 @@
139
139
  --text-on-dark: #FFFFFF;
140
140
  --text-on-light: #0a0d16;
141
141
 
142
- /* Primary Colors - Use insurer context with fallbacks (lighter shades for dark theme contrast) */
143
- --primary-color: var(--insurer-primary-color, #8178F7);
144
- --primary-color-light: var(--insurer-primary-color-light, #8A7FED);
145
- --primary-color-lighter: var(--insurer-primary-color-lighter, #A99FF7);
146
- --primary-color-dark: var(--insurer-primary-color-dark, #4A3FD9);
147
- --primary-color-darker: var(--insurer-primary-color-darker, #3730A3);
148
- --primary-color-text: var(--insurer-primary-color-text, #FFFFFF);
149
- --primary-color-rgb: var(--insurer-primary-color-rgb, 107, 95, 227);
142
+ /* Primary Colors - Use customer context with fallbacks (lighter shades for dark theme contrast) */
143
+ --primary-color: var(--customer-primary-color, #8178F7);
144
+ --primary-color-light: var(--customer-primary-color-light, #8A7FED);
145
+ --primary-color-lighter: var(--customer-primary-color-lighter, #A99FF7);
146
+ --primary-color-dark: var(--customer-primary-color-dark, #4A3FD9);
147
+ --primary-color-darker: var(--customer-primary-color-darker, #3730A3);
148
+ --primary-color-text: var(--customer-primary-color-text, #FFFFFF);
149
+ --primary-color-rgb: var(--customer-primary-color-rgb, 107, 95, 227);
150
150
 
151
151
  /* Primary Gradients - Automatically adapt to custom colors */
152
152
  --primary-gradient: linear-gradient(to right, var(--primary-color), var(--primary-color-light));
153
153
  --primary-gradient-hover: linear-gradient(to right, var(--primary-color), var(--primary-color-lighter));
154
154
  --primary-gradient-reversed: linear-gradient(to left, var(--primary-color-dark), var(--primary-color-light));
155
155
 
156
- /* Secondary Colors - Use insurer context with fallbacks (gray tones for dark theme) */
157
- --secondary-color: var(--insurer-secondary-color, #5B5A5A);
158
- --secondary-color-light: var(--insurer-secondary-color-light, #838181);
159
- --secondary-color-lighter: var(--insurer-secondary-color-lighter, #9E9D9D);
160
- --secondary-color-dark: var(--insurer-secondary-color-dark, #4E4D4D);
161
- --secondary-color-darker: var(--insurer-secondary-color-darker, #3D3838);
162
- --secondary-color-text: var(--insurer-secondary-color-text, #FFFFFF);
163
- --secondary-color-rgb: var(--insurer-secondary-color-rgb, 48, 48, 48);
156
+ /* Secondary Colors - Use customer context with fallbacks (gray tones for dark theme) */
157
+ --secondary-color: var(--customer-secondary-color, #5B5A5A);
158
+ --secondary-color-light: var(--customer-secondary-color-light, #838181);
159
+ --secondary-color-lighter: var(--customer-secondary-color-lighter, #9E9D9D);
160
+ --secondary-color-dark: var(--customer-secondary-color-dark, #4E4D4D);
161
+ --secondary-color-darker: var(--customer-secondary-color-darker, #3D3838);
162
+ --secondary-color-text: var(--customer-secondary-color-text, #FFFFFF);
163
+ --secondary-color-rgb: var(--customer-secondary-color-rgb, 48, 48, 48);
164
164
 
165
165
  /* Success Colors */
166
166
  --success-color: #12B94F;
@@ -223,28 +223,28 @@
223
223
  --pink-800: #9D174D;
224
224
  --pink-900: #831843;
225
225
 
226
- /* Primary Colors - Use insurer context with fallbacks */
227
- --primary-color: var(--insurer-primary-color, #0B0191);
228
- --primary-color-light: var(--insurer-primary-color-light, #0F02C4);
229
- --primary-color-lighter: var(--insurer-primary-color-lighter, #4A3FD9);
230
- --primary-color-dark: var(--insurer-primary-color-dark, #09017A);
231
- --primary-color-darker: var(--insurer-primary-color-darker, #07015E);
232
- --primary-color-text: var(--insurer-primary-color-text, #FFFFFF);
233
- --primary-color-rgb: var(--insurer-primary-color-rgb, 11, 1, 145);
226
+ /* Primary Colors - Use customer context with fallbacks */
227
+ --primary-color: var(--customer-primary-color, #0B0191);
228
+ --primary-color-light: var(--customer-primary-color-light, #0F02C4);
229
+ --primary-color-lighter: var(--customer-primary-color-lighter, #4A3FD9);
230
+ --primary-color-dark: var(--customer-primary-color-dark, #09017A);
231
+ --primary-color-darker: var(--customer-primary-color-darker, #07015E);
232
+ --primary-color-text: var(--customer-primary-color-text, #FFFFFF);
233
+ --primary-color-rgb: var(--customer-primary-color-rgb, 11, 1, 145);
234
234
 
235
235
  /* Primary Gradients - Automatically adapt to custom colors */
236
236
  --primary-gradient: linear-gradient(to right, var(--primary-color-darker), var(--primary-color-light));
237
237
  --primary-gradient-hover: linear-gradient(to right, var(--primary-color-dark), var(--primary-color-lighter));
238
238
  --primary-gradient-reversed: linear-gradient(to left, var(--primary-color-darker), var(--primary-color-light));
239
239
 
240
- /* Secondary Colors - Use insurer context with fallbacks (gray tones for light theme) */
241
- --secondary-color: var(--insurer-secondary-color, #5E5E5E);
242
- --secondary-color-light: var(--insurer-secondary-color-light, #7B7B7B);
243
- --secondary-color-lighter: var(--insurer-secondary-color-lighter, #969696);
244
- --secondary-color-dark: var(--insurer-secondary-color-dark, #404040);
245
- --secondary-color-darker: var(--insurer-secondary-color-darker, #2B2B2B);
246
- --secondary-color-text: var(--insurer-secondary-color-text, #FFFFFF);
247
- --secondary-color-rgb: var(--insurer-secondary-color-rgb, 94, 94, 94);
240
+ /* Secondary Colors - Use customer context with fallbacks (gray tones for light theme) */
241
+ --secondary-color: var(--customer-secondary-color, #5E5E5E);
242
+ --secondary-color-light: var(--customer-secondary-color-light, #7B7B7B);
243
+ --secondary-color-lighter: var(--customer-secondary-color-lighter, #969696);
244
+ --secondary-color-dark: var(--customer-secondary-color-dark, #404040);
245
+ --secondary-color-darker: var(--customer-secondary-color-darker, #2B2B2B);
246
+ --secondary-color-text: var(--customer-secondary-color-text, #FFFFFF);
247
+ --secondary-color-rgb: var(--customer-secondary-color-rgb, 94, 94, 94);
248
248
 
249
249
  /* Success Colors */
250
250
  --success-color: #0F853A;
@@ -12,6 +12,10 @@
12
12
  --spacing-3xl: 4rem; /* 64px */
13
13
  --spacing-4xl: 5rem; /* 80px */
14
14
 
15
+ /* Form field semantic spacing */
16
+ --form-field-gap: var(--spacing-xs); /* label <-> control <-> message */
17
+ --form-label-gap: var(--spacing-sm); /* control <-> inline label (checkbox/radio/switch) */
18
+
15
19
  /* Negative spacing scale (for negative margins) */
16
20
  --negative-spacing-xxs: -0.125rem;
17
21
  --negative-spacing-xs: -0.25rem;
@@ -167,7 +167,7 @@ declare class PshBadgeComponent<T = number> {
167
167
  /**
168
168
  * Apparences disponibles pour le bouton
169
169
  */
170
- type ButtonAppearance = 'filled' | 'outline' | 'rounded' | 'text';
170
+ type ButtonAppearance = 'filled' | 'outline' | 'text';
171
171
  /**
172
172
  * Variantes disponibles pour le bouton
173
173
  */
@@ -705,6 +705,14 @@ interface DropdownItem<T = string> {
705
705
  /** État actif */
706
706
  active?: boolean;
707
707
  }
708
+ /**
709
+ * Apparences disponibles pour le dropdown
710
+ */
711
+ type DropdownAppearance = 'filled' | 'outline' | 'text';
712
+ /**
713
+ * Variantes disponibles pour le dropdown
714
+ */
715
+ type DropdownVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'danger';
708
716
  /**
709
717
  * Tailles disponibles pour le dropdown
710
718
  */
@@ -717,26 +725,35 @@ type DropdownPlacement = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end'
717
725
  * Configuration complète du dropdown
718
726
  */
719
727
  interface DropdownConfig {
720
- /** Variante visuelle */
721
- variant?: 'primary' | 'secondary' | 'outline' | 'text';
728
+ /** Apparence visuelle */
729
+ appearance?: DropdownAppearance;
730
+ /** Variante de couleur */
731
+ variant?: DropdownVariant;
722
732
  /** Taille du dropdown */
723
733
  size?: DropdownSize;
724
734
  /** Position du menu */
725
735
  placement?: DropdownPlacement;
726
736
  /** État désactivé */
727
737
  disabled?: boolean;
738
+ /** Mode icône seule (masque le label et le caret) */
739
+ iconOnly?: boolean;
740
+ /** Texte accessible (aria-label) quand iconOnly est actif */
741
+ iconOnlyText?: string;
728
742
  }
729
743
 
730
744
  declare class PshDropdownComponent<T = string> implements OnDestroy {
731
745
  private elementRef;
732
746
  private clickOutsideHandler;
733
- variant: _angular_core.InputSignal<"primary" | "secondary" | "text" | "outline">;
747
+ appearance: _angular_core.InputSignal<DropdownAppearance>;
748
+ variant: _angular_core.InputSignal<DropdownVariant>;
734
749
  size: _angular_core.InputSignal<DropdownSize>;
735
750
  placement: _angular_core.InputSignal<DropdownPlacement>;
736
751
  items: _angular_core.InputSignal<DropdownItem<T>[]>;
737
752
  label: _angular_core.InputSignal<string>;
738
753
  icon: _angular_core.InputSignal<string | undefined>;
739
754
  ariaLabel: _angular_core.InputSignal<string | undefined>;
755
+ iconOnly: _angular_core.InputSignal<boolean>;
756
+ iconOnlyText: _angular_core.InputSignal<string | undefined>;
740
757
  disabled: _angular_core.ModelSignal<boolean>;
741
758
  private isOpenSignal;
742
759
  private selectedItemSignal;
@@ -746,6 +763,7 @@ declare class PshDropdownComponent<T = string> implements OnDestroy {
746
763
  closed: _angular_core.OutputEmitterRef<void>;
747
764
  isOpen: _angular_core.Signal<boolean>;
748
765
  selectedItem: _angular_core.Signal<DropdownItem<T> | null>;
766
+ isIconOnly: _angular_core.Signal<boolean>;
749
767
  computedAriaLabel: _angular_core.Signal<string>;
750
768
  state: _angular_core.Signal<string>;
751
769
  private getState;
@@ -763,7 +781,7 @@ declare class PshDropdownComponent<T = string> implements OnDestroy {
763
781
  private focusItemAtIndex;
764
782
  ngOnDestroy(): void;
765
783
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PshDropdownComponent<any>, never>;
766
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PshDropdownComponent<any>, "psh-dropdown", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "disabled": "disabledChange"; "selected": "selected"; "opened": "opened"; "closed": "closed"; }, never, ["[dropdown-trigger]", "[dropdown-menu]"], true, never>;
784
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PshDropdownComponent<any>, "psh-dropdown", never, { "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "iconOnly": { "alias": "iconOnly"; "required": false; "isSignal": true; }; "iconOnlyText": { "alias": "iconOnlyText"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "disabled": "disabledChange"; "selected": "selected"; "opened": "opened"; "closed": "closed"; }, never, ["[dropdown-trigger]", "[dropdown-menu]"], true, never>;
767
785
  }
768
786
 
769
787
  type InputType = 'text' | 'password' | 'email' | 'tel' | 'url' | 'search' | 'date' | 'number';
@@ -866,6 +884,94 @@ declare class PshInputComponent implements ControlValueAccessor, FormValueContro
866
884
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<PshInputComponent, "psh-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "iconStart": { "alias": "iconStart"; "required": false; "isSignal": true; }; "iconEnd": { "alias": "iconEnd"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "success": { "alias": "success"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "autocompleteConfig": { "alias": "autocompleteConfig"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "readonly": "readonlyChange"; "loading": "loadingChange"; "touched": "touchedChange"; "inputFocus": "inputFocus"; "inputBlur": "inputBlur"; "suggestionSelect": "suggestionSelect"; }, never, ["[input-label]", "[input-error]", "[input-success]", "[input-hint]"], true, never>;
867
885
  }
868
886
 
887
+ type TextareaVariant = 'outlined' | 'filled';
888
+ type TextareaSize = 'small' | 'medium' | 'large';
889
+ type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';
890
+ interface TextareaConfig {
891
+ variant: TextareaVariant;
892
+ size: TextareaSize;
893
+ resize: TextareaResize;
894
+ disabled: boolean;
895
+ required: boolean;
896
+ readonly: boolean;
897
+ fullWidth: boolean;
898
+ showLabel: boolean;
899
+ showCharacterCount: boolean;
900
+ autoSize: boolean;
901
+ rows: number;
902
+ maxLength?: number;
903
+ label: string;
904
+ placeholder: string;
905
+ hint: string | null | undefined;
906
+ error: string | null | undefined;
907
+ success: string | null | undefined;
908
+ ariaLabel: string | null;
909
+ }
910
+ declare const TEXTAREA_LABELS: {
911
+ readonly characterCountSuffix: "caractères";
912
+ readonly characterCountSeparator: "/";
913
+ };
914
+
915
+ declare class PshTextareaComponent implements ControlValueAccessor, FormValueControl<string> {
916
+ private readonly elementRef;
917
+ private readonly cdr;
918
+ private static nextId;
919
+ readonly textareaId: string;
920
+ readonly value: _angular_core.ModelSignal<string>;
921
+ readonly disabled: _angular_core.ModelSignal<boolean>;
922
+ readonly readonly: _angular_core.ModelSignal<boolean>;
923
+ readonly touched: _angular_core.ModelSignal<boolean>;
924
+ variant: _angular_core.InputSignal<TextareaVariant>;
925
+ size: _angular_core.InputSignal<TextareaSize>;
926
+ resize: _angular_core.InputSignal<TextareaResize>;
927
+ rows: _angular_core.InputSignal<number>;
928
+ maxLength: _angular_core.InputSignal<number | undefined>;
929
+ autoSize: _angular_core.InputSignal<boolean>;
930
+ showCharacterCount: _angular_core.InputSignal<boolean>;
931
+ fullWidth: _angular_core.InputSignal<boolean>;
932
+ required: _angular_core.InputSignal<boolean>;
933
+ showLabel: _angular_core.InputSignal<boolean>;
934
+ label: _angular_core.InputSignal<string>;
935
+ placeholder: _angular_core.InputSignal<string>;
936
+ hint: _angular_core.InputSignal<string | null | undefined>;
937
+ error: _angular_core.InputSignal<string | null | undefined>;
938
+ success: _angular_core.InputSignal<string | null | undefined>;
939
+ ariaLabel: _angular_core.InputSignal<string | null>;
940
+ private readonly focusedSignal;
941
+ inputFocus: _angular_core.OutputEmitterRef<void>;
942
+ inputBlur: _angular_core.OutputEmitterRef<void>;
943
+ private textareaRef?;
944
+ focused: _angular_core.Signal<boolean>;
945
+ effectiveResize: _angular_core.Signal<TextareaResize>;
946
+ characterCount: _angular_core.Signal<{
947
+ current: number;
948
+ max: number | undefined;
949
+ }>;
950
+ isOverLimit: _angular_core.Signal<boolean>;
951
+ isAtLimit: _angular_core.Signal<boolean>;
952
+ shouldShowCount: _angular_core.Signal<boolean>;
953
+ hasError: _angular_core.Signal<boolean>;
954
+ computedAriaLabel: _angular_core.Signal<string | null>;
955
+ describedBy: _angular_core.Signal<string | null>;
956
+ state: _angular_core.Signal<"success" | "default" | "disabled" | "error" | "readonly" | "focused">;
957
+ characterCountLabel: "caractères";
958
+ constructor();
959
+ private onChange;
960
+ private onTouched;
961
+ writeValue(value: unknown): void;
962
+ registerOnChange(fn: (value: string) => void): void;
963
+ registerOnTouched(fn: () => void): void;
964
+ setDisabledState(isDisabled: boolean): void;
965
+ handleInput(event: Event): void;
966
+ handleFocus(): void;
967
+ handleBlur(): void;
968
+ focus(): void;
969
+ private applyAutoSize;
970
+ protected hasLabelContent(): boolean;
971
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PshTextareaComponent, never>;
972
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PshTextareaComponent, "psh-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "resize": { "alias": "resize"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "autoSize": { "alias": "autoSize"; "required": false; "isSignal": true; }; "showCharacterCount": { "alias": "showCharacterCount"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "success": { "alias": "success"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "readonly": "readonlyChange"; "touched": "touchedChange"; "inputFocus": "inputFocus"; "inputBlur": "inputBlur"; }, never, ["[textarea-label]", "[textarea-error]", "[textarea-success]", "[textarea-hint]"], true, never>;
973
+ }
974
+
869
975
  /**
870
976
  * Type pour le mode d'affichage du menu
871
977
  */
@@ -1472,6 +1578,7 @@ interface SelectOptionGroup<T> {
1472
1578
  disabled?: boolean;
1473
1579
  }
1474
1580
  type SelectSize = 'small' | 'medium' | 'large';
1581
+ type SelectVariant = 'outlined' | 'filled';
1475
1582
  interface SearchConfig {
1476
1583
  debounceTime: number;
1477
1584
  placeholder: string;
@@ -1490,6 +1597,7 @@ declare class PshSelectComponent<T = unknown> implements ControlValueAccessor, F
1490
1597
  readonly disabled: _angular_core.ModelSignal<boolean>;
1491
1598
  readonly touched: _angular_core.ModelSignal<boolean>;
1492
1599
  size: _angular_core.InputSignal<SelectSize>;
1600
+ variant: _angular_core.InputSignal<SelectVariant>;
1493
1601
  searchable: _angular_core.InputSignal<boolean>;
1494
1602
  multiple: _angular_core.InputSignal<boolean>;
1495
1603
  clearable: _angular_core.InputSignal<boolean>;
@@ -1549,7 +1657,7 @@ declare class PshSelectComponent<T = unknown> implements ControlValueAccessor, F
1549
1657
  private focusFirst;
1550
1658
  private focusLast;
1551
1659
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PshSelectComponent<any>, never>;
1552
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PshSelectComponent<any>, "psh-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiplePlaceholder": { "alias": "multiplePlaceholder"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "success": { "alias": "success"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "maxSelections": { "alias": "maxSelections"; "required": false; "isSignal": true; }; "minSelections": { "alias": "minSelections"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "searchConfig": { "alias": "searchConfig"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "touched": "touchedChange"; "opened": "opened"; "closed": "closed"; "searched": "searched"; "scrollEnd": "scrollEnd"; }, never, never, true, never>;
1660
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PshSelectComponent<any>, "psh-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiplePlaceholder": { "alias": "multiplePlaceholder"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "success": { "alias": "success"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "maxSelections": { "alias": "maxSelections"; "required": false; "isSignal": true; }; "minSelections": { "alias": "minSelections"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "searchConfig": { "alias": "searchConfig"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "touched": "touchedChange"; "opened": "opened"; "closed": "closed"; "searched": "searched"; "scrollEnd": "scrollEnd"; }, never, never, true, never>;
1553
1661
  }
1554
1662
 
1555
1663
  /**
@@ -2100,7 +2208,7 @@ declare class PshTableComponent {
2100
2208
  emptyMessage: _angular_core.InputSignal<string>;
2101
2209
  noResultsMessage: _angular_core.InputSignal<string>;
2102
2210
  globalSearchPlaceholder: _angular_core.InputSignal<string>;
2103
- tableLayout: _angular_core.InputSignal<"fixed" | "auto">;
2211
+ tableLayout: _angular_core.InputSignal<"auto" | "fixed">;
2104
2212
  truncateText: _angular_core.InputSignal<boolean>;
2105
2213
  expandable: _angular_core.InputSignal<boolean>;
2106
2214
  singleExpand: _angular_core.InputSignal<boolean>;
@@ -2403,19 +2511,30 @@ type Theme = 'light' | 'dark';
2403
2511
  interface ThemeConfig {
2404
2512
  isDark: boolean;
2405
2513
  name: Theme;
2406
- insurerTheme?: {
2514
+ customerTheme?: {
2407
2515
  primaryColor: string;
2408
2516
  secondaryColor?: string;
2409
2517
  };
2410
2518
  }
2411
2519
 
2412
- interface InsurerContextService {
2520
+ type ContrastTarget = 'AA' | 'AAA';
2521
+
2522
+ /**
2523
+ * Contract for applications that want to override brand colors.
2524
+ * Kept generic (customer) so it can fit any vertical.
2525
+ */
2526
+ interface CustomerContextService {
2413
2527
  primaryColor(): string;
2414
2528
  secondaryColor(): string;
2415
2529
  }
2416
- declare const INSURER_CONTEXT_SERVICE: InjectionToken<InsurerContextService>;
2530
+ declare const CUSTOMER_CONTEXT_SERVICE: InjectionToken<CustomerContextService>;
2531
+ interface PshThemeOptions {
2532
+ targetContrast?: ContrastTarget;
2533
+ }
2534
+ declare const PSH_THEME_OPTIONS: InjectionToken<PshThemeOptions>;
2417
2535
  declare class ThemeService {
2418
- private insurerContext;
2536
+ private customerContext;
2537
+ private options;
2419
2538
  private isDarkThemeSignal;
2420
2539
  private themeNameSignal;
2421
2540
  private lastChangeSignal;
@@ -2431,19 +2550,18 @@ declare class ThemeService {
2431
2550
  toggleTheme(): void;
2432
2551
  updateTheme(name: Theme): void;
2433
2552
  /**
2434
- * Applique les couleurs de l'assureur aux variables CSS
2435
- * Génère automatiquement toutes les variantes et les gradients
2436
- * Si aucun contexte assureur n'est fourni, les fallbacks CSS des thèmes sont utilisés
2437
- */
2438
- applyInsurerTheme(): void;
2439
- /**
2440
- * Initialise le thème au démarrage de l'application
2441
- * Utilise la préférence stockée ou le thème par défaut 'light'
2553
+ * Applies the customer brand colors to CSS variables, automatically
2554
+ * deriving variants in OKLCH and enforcing WCAG contrast against the
2555
+ * current theme background. If the provided color is not accessible
2556
+ * as a UI color, it is silently adjusted so UI components stay readable.
2557
+ * The original brand color is preserved in --customer-*-color-source
2558
+ * for purely decorative use (logos, marketing surfaces).
2442
2559
  */
2560
+ applyCustomerTheme(): void;
2561
+ private applyPalette;
2562
+ private derivePalette;
2563
+ private ensureIfInteractive;
2443
2564
  private initializeTheme;
2444
- /**
2445
- * Sauvegarde la préférence de thème dans le localStorage
2446
- */
2447
2565
  private saveThemePreference;
2448
2566
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ThemeService, never>;
2449
2567
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ThemeService>;
@@ -2488,5 +2606,5 @@ declare class ScrollService {
2488
2606
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ScrollService>;
2489
2607
  }
2490
2608
 
2491
- export { CHECKBOX_CONFIG, INPUT_LABELS, INSURER_CONTEXT_SERVICE, MODAL_CONFIG, ModalService, NgxTranslateProvider, PAGINATION_CONFIG, PROGRESSBAR_CONFIG, PshAlertComponent, PshAvatarComponent, PshBadgeComponent, PshButtonComponent, PshCardComponent, PshCheckboxComponent, PshCollapseComponent, PshDropdownComponent, PshFlowStepComponent, PshHorizontalCardComponent, PshInfoCardComponent, PshInputComponent, PshMenuComponent, PshModalComponent, PshPaginationComponent, PshProgressbarComponent, PshRadioComponent, PshSelectComponent, PshSidebarComponent, PshSpinLoaderComponent, PshStatCardComponent, PshStateFlowIndicatorComponent, PshStepComponent, PshStepperComponent, PshSwitchComponent, PshTabBarComponent, PshTabComponent, PshTableComponent, PshTabsComponent, PshTagComponent, PshToastComponent, PshToastService, PshTooltipComponent, RADIO_CONFIG, RADIO_STYLES, SIDEBAR_CONFIG, SPINLOADER_CONFIG, STATE_FLOW_INDICATOR_CONFIG, STEPPER_CONFIG, SWITCH_CONFIG, ScrollService, TABLE_CONFIG, TABS_CONFIG, TAB_BAR_CONFIG, TAG_CONFIG, TOAST_CONFIG, TOOLTIP_CONFIG, TRANSLATION_PROVIDER, ThemeService, ToastComponent, ToastService, provideTranslation };
2492
- export type { AlertConfig, AlertLabels, AlertRole, AlertSize, AlertType, AutocompleteConfig, AvatarConfig, AvatarShape, AvatarSize, AvatarStatus, BadgeDisplayType, BadgePosition, BadgeSize, BadgeVariant, ButtonAppearance, ButtonIconPosition, ButtonSize, ButtonVariant, CardActionsAlignment, CardColorVariant, CardDensity, CardVariant, CheckboxConfig, CheckboxLabelPosition, CheckboxSize, CollapseSize, CollapseVariant, DropdownConfig, DropdownItem, DropdownPlacement, DropdownSize, FlowStepConfig, IconPosition, InfoCardData, InfoCardOptions, InfoCardVariant, InputConfig, InputSize, InputType, InputVariant, InsurerContextService, MenuItem, MenuMode, MenuVariant, ModalConfig, ModalSize, PaginationConfig, PaginationSize, PaginationVariant, ProgressbarConfig, ProgressbarLabelPosition, ProgressbarMode, ProgressbarSize, ProgressbarVariant, RadioConfig, RadioSize, SearchConfig, SelectOption, SelectOptionGroup, SelectSize, SidebarConfig, SidebarMode, SidebarPosition, SpinLoaderColor, SpinLoaderConfig, SpinLoaderSize, SpinLoaderVariant, StatCardLayout, StatCardVariant, StatTagVariant, StateFlowIndicatorAriaLabels, StateFlowIndicatorConfig, StateFlowIndicatorSize, StepConfig, StepperAriaLabels, StepperConfig, StepperVariant, SuggestionResult, SwitchConfig, SwitchSize, Tab, TabBarChangeEvent, TabBarConfig, TabBarItem, TabChangeEvent, TableCellContext, TableColumn, TableConfig, TableExpandedRowContext, TableRow, TableRowClickEvent, TableRowExpandEvent, TableSort, TabsConfig, TabsSize, TabsVariant, TagConfig, TagSize, TagVariant, Theme, ThemeConfig, Toast, ToastConfig, ToastPosition, ToastType, TooltipConfig, TooltipPosition, TooltipVariant, TranslationConfig, TranslationEntry, TranslationProvider };
2609
+ export { CHECKBOX_CONFIG, CUSTOMER_CONTEXT_SERVICE, INPUT_LABELS, MODAL_CONFIG, ModalService, NgxTranslateProvider, PAGINATION_CONFIG, PROGRESSBAR_CONFIG, PSH_THEME_OPTIONS, PshAlertComponent, PshAvatarComponent, PshBadgeComponent, PshButtonComponent, PshCardComponent, PshCheckboxComponent, PshCollapseComponent, PshDropdownComponent, PshFlowStepComponent, PshHorizontalCardComponent, PshInfoCardComponent, PshInputComponent, PshMenuComponent, PshModalComponent, PshPaginationComponent, PshProgressbarComponent, PshRadioComponent, PshSelectComponent, PshSidebarComponent, PshSpinLoaderComponent, PshStatCardComponent, PshStateFlowIndicatorComponent, PshStepComponent, PshStepperComponent, PshSwitchComponent, PshTabBarComponent, PshTabComponent, PshTableComponent, PshTabsComponent, PshTagComponent, PshTextareaComponent, PshToastComponent, PshToastService, PshTooltipComponent, RADIO_CONFIG, RADIO_STYLES, SIDEBAR_CONFIG, SPINLOADER_CONFIG, STATE_FLOW_INDICATOR_CONFIG, STEPPER_CONFIG, SWITCH_CONFIG, ScrollService, TABLE_CONFIG, TABS_CONFIG, TAB_BAR_CONFIG, TAG_CONFIG, TEXTAREA_LABELS, TOAST_CONFIG, TOOLTIP_CONFIG, TRANSLATION_PROVIDER, ThemeService, ToastComponent, ToastService, provideTranslation };
2610
+ export type { AlertConfig, AlertLabels, AlertRole, AlertSize, AlertType, AutocompleteConfig, AvatarConfig, AvatarShape, AvatarSize, AvatarStatus, BadgeDisplayType, BadgePosition, BadgeSize, BadgeVariant, ButtonAppearance, ButtonIconPosition, ButtonSize, ButtonVariant, CardActionsAlignment, CardColorVariant, CardDensity, CardVariant, CheckboxConfig, CheckboxLabelPosition, CheckboxSize, CollapseSize, CollapseVariant, CustomerContextService, DropdownAppearance, DropdownConfig, DropdownItem, DropdownPlacement, DropdownSize, DropdownVariant, FlowStepConfig, IconPosition, InfoCardData, InfoCardOptions, InfoCardVariant, InputConfig, InputSize, InputType, InputVariant, MenuItem, MenuMode, MenuVariant, ModalConfig, ModalSize, PaginationConfig, PaginationSize, PaginationVariant, ProgressbarConfig, ProgressbarLabelPosition, ProgressbarMode, ProgressbarSize, ProgressbarVariant, PshThemeOptions, RadioConfig, RadioSize, SearchConfig, SelectOption, SelectOptionGroup, SelectSize, SelectVariant, SidebarConfig, SidebarMode, SidebarPosition, SpinLoaderColor, SpinLoaderConfig, SpinLoaderSize, SpinLoaderVariant, StatCardLayout, StatCardVariant, StatTagVariant, StateFlowIndicatorAriaLabels, StateFlowIndicatorConfig, StateFlowIndicatorSize, StepConfig, StepperAriaLabels, StepperConfig, StepperVariant, SuggestionResult, SwitchConfig, SwitchSize, Tab, TabBarChangeEvent, TabBarConfig, TabBarItem, TabChangeEvent, TableCellContext, TableColumn, TableConfig, TableExpandedRowContext, TableRow, TableRowClickEvent, TableRowExpandEvent, TableSort, TabsConfig, TabsSize, TabsVariant, TagConfig, TagSize, TagVariant, TextareaConfig, TextareaResize, TextareaSize, TextareaVariant, Theme, ThemeConfig, Toast, ToastConfig, ToastPosition, ToastType, TooltipConfig, TooltipPosition, TooltipVariant, TranslationConfig, TranslationEntry, TranslationProvider };