@kksdev/ds-angular 1.1.0 → 1.2.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/index.d.ts CHANGED
@@ -4187,6 +4187,135 @@ interface CalendarDay {
4187
4187
  ariaLabel: string;
4188
4188
  }
4189
4189
 
4190
+ type AvatarShape = 'circle' | 'rounded' | 'square';
4191
+ type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';
4192
+ declare class DsAvatar {
4193
+ /** URL de l'image avatar */
4194
+ readonly src: _angular_core.InputSignal<string | undefined>;
4195
+ /** Texte alternatif pour l'image */
4196
+ readonly alt: _angular_core.InputSignal<string>;
4197
+ /** Nom complet pour générer les initiales */
4198
+ readonly name: _angular_core.InputSignal<string>;
4199
+ /** Initiales personnalisées (priorité sur name) */
4200
+ readonly initials: _angular_core.InputSignal<string | undefined>;
4201
+ /** Forme de l'avatar */
4202
+ readonly shape: _angular_core.InputSignal<AvatarShape>;
4203
+ /** Taille de l'avatar */
4204
+ readonly size: _angular_core.InputSignal<AvatarSize>;
4205
+ /** Générer automatiquement une couleur de fond à partir des initiales */
4206
+ readonly autoColor: _angular_core.InputSignal<boolean>;
4207
+ /** État interne pour l'erreur de chargement d'image */
4208
+ private readonly imageError;
4209
+ /** Indique si l'image doit être affichée */
4210
+ readonly showImage: _angular_core.Signal<boolean>;
4211
+ /** Initiales à afficher (générées ou fournies) */
4212
+ readonly displayInitials: _angular_core.Signal<string>;
4213
+ /** Classes CSS du conteneur */
4214
+ readonly containerClasses: _angular_core.Signal<{
4215
+ [x: string]: boolean;
4216
+ 'ds-avatar': boolean;
4217
+ 'ds-avatar--has-image': boolean;
4218
+ 'ds-avatar--initials': boolean;
4219
+ }>;
4220
+ /** Couleur de fond auto-générée */
4221
+ readonly generatedBgColor: _angular_core.Signal<string | null>;
4222
+ /** Label ARIA pour l'accessibilité */
4223
+ readonly ariaLabel: _angular_core.Signal<string>;
4224
+ /** Gestionnaire d'erreur de chargement d'image */
4225
+ onImageError(): void;
4226
+ /** Gestionnaire de chargement réussi d'image */
4227
+ onImageLoad(): void;
4228
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsAvatar, never>;
4229
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsAvatar, "ds-avatar", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "initials": { "alias": "initials"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "autoColor": { "alias": "autoColor"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4230
+ }
4231
+
4232
+ interface MenuItem {
4233
+ /** Identifiant unique de l'item */
4234
+ id: string;
4235
+ /** Label affiché */
4236
+ label: string;
4237
+ /** Icône FontAwesome optionnelle */
4238
+ icon?: IconDefinition;
4239
+ /** Item désactivé */
4240
+ disabled?: boolean;
4241
+ /** Séparateur avant cet item */
4242
+ dividerBefore?: boolean;
4243
+ }
4244
+ type MenuTrigger = 'click' | 'contextmenu';
4245
+ type MenuSize = 'sm' | 'md' | 'lg';
4246
+ declare class DsMenu implements OnDestroy {
4247
+ /** Liste des items du menu */
4248
+ readonly items: _angular_core.InputSignal<MenuItem[]>;
4249
+ /** Taille du menu */
4250
+ readonly size: _angular_core.InputSignal<MenuSize>;
4251
+ /** Événement déclencheur */
4252
+ readonly trigger: _angular_core.InputSignal<MenuTrigger>;
4253
+ /** Fermer le menu après sélection */
4254
+ readonly closeOnSelect: _angular_core.InputSignal<boolean>;
4255
+ /** Label ARIA pour l'accessibilité */
4256
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
4257
+ /** Événement émis lors de la sélection d'un item */
4258
+ readonly itemSelected: _angular_core.OutputEmitterRef<MenuItem>;
4259
+ /** Événement émis à l'ouverture du menu */
4260
+ readonly opened: _angular_core.OutputEmitterRef<void>;
4261
+ /** Événement émis à la fermeture du menu */
4262
+ readonly closed: _angular_core.OutputEmitterRef<void>;
4263
+ triggerElement?: ElementRef;
4264
+ menuItemsRef?: QueryList<ElementRef<HTMLButtonElement>>;
4265
+ /** État interne d'ouverture */
4266
+ private readonly menuOpen;
4267
+ /** Index de l'item actif pour la navigation clavier */
4268
+ private readonly internalActiveIndex;
4269
+ /** Exposition en lecture seule de l'index actif */
4270
+ readonly activeIndex: _angular_core.Signal<number>;
4271
+ /** État d'ouverture du menu (lecture seule) */
4272
+ readonly isOpen: _angular_core.Signal<boolean>;
4273
+ /** Positions pour l'overlay CDK */
4274
+ readonly overlayPositions: _angular_cdk_overlay.ConnectedPosition[];
4275
+ /** Classes CSS du panel menu */
4276
+ readonly menuClasses: _angular_core.Signal<{
4277
+ [x: string]: boolean;
4278
+ 'ds-menu__panel': boolean;
4279
+ }>;
4280
+ /** ID de l'item actif pour aria-activedescendant */
4281
+ readonly activeDescendantId: _angular_core.Signal<string | undefined>;
4282
+ /** Ouvre le menu */
4283
+ open(): void;
4284
+ /** Ferme le menu */
4285
+ close(refocusTrigger?: boolean): void;
4286
+ /** Bascule l'état du menu */
4287
+ toggle(): void;
4288
+ /** Sélectionne un item */
4289
+ selectItem(item: MenuItem): void;
4290
+ /** Gestionnaire de clic sur le trigger */
4291
+ onTriggerClick(event: MouseEvent): void;
4292
+ /** Gestionnaire de clic droit sur le trigger */
4293
+ onTriggerContextMenu(event: MouseEvent): void;
4294
+ /** Gestionnaire de clavier sur le trigger */
4295
+ onTriggerKeydown(event: KeyboardEvent): void;
4296
+ /** Gestionnaire de clavier dans le menu */
4297
+ onMenuKeydown(event: KeyboardEvent): void;
4298
+ /** Met à jour l'index actif au survol */
4299
+ onItemMouseEnter(index: number): void;
4300
+ /** Gestionnaire de clic sur le backdrop */
4301
+ onBackdropClick(): void;
4302
+ ngOnDestroy(): void;
4303
+ /** Trouve l'index du premier item activable */
4304
+ private findFirstEnabledIndex;
4305
+ /** Trouve l'index du dernier item activable */
4306
+ private findLastEnabledIndex;
4307
+ /** Navigue vers le prochain item activable */
4308
+ private moveToNextEnabled;
4309
+ /** Définit l'index actif et focus l'élément */
4310
+ private setActiveIndex;
4311
+ /** Focus l'item actif */
4312
+ private focusActiveItem;
4313
+ /** Sélectionne l'item actuellement actif */
4314
+ private selectActiveItem;
4315
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMenu, never>;
4316
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMenu, "ds-menu", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "itemSelected": "itemSelected"; "opened": "opened"; "closed": "closed"; }, never, ["[dsMenuTrigger]"], true, never>;
4317
+ }
4318
+
4190
4319
  /**
4191
4320
  * Positions standard pour dropdowns (menus déroulants, select, etc.)
4192
4321
  *
@@ -4555,5 +4684,5 @@ declare class DsI18nService {
4555
4684
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<DsI18nService>;
4556
4685
  }
4557
4686
 
4558
- export { AUTOCOMPLETE_POSITIONS, BUTTON_APPEARANCE_OPTIONS, BUTTON_SIZE_OPTIONS, BUTTON_VARIANT_OPTIONS, DROPDOWN_POSITIONS, DsAccordion, DsAlert, DsBadge, DsBreadcrumb, DsButton, DsCard, DsCheckbox, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDropdown, DsI18nService, DsInputField, DsInputTextarea, DsModalComponent, DsPagination, DsPopover, DsPopoverComponent, DsProgressBar, DsRadioGroup, DsSearchInput, DsSelect, DsSkeleton, DsStepper, DsTable, DsTabs, DsToastComponent, DsToastContainerComponent, DsToastService, DsToggle, DsTooltip, DsTooltipComponent, IconRegistryService, POPOVER_POSITIONS, PrimitiveBadge, PrimitiveButton, PrimitiveCheckbox, PrimitiveInput, PrimitiveRadio, PrimitiveTextarea, PrimitiveToggle, TOOLTIP_POSITIONS, buildButtonArgTypes, buildButtonArgs, createSizeRender, createVariantRender };
4559
- export type { AccordionChangeEvent, AccordionItem, AccordionSize, AccordionVariant, AlertSize, AlertType, BadgeAppearance, BadgeShape, BadgeSize, BadgeType, BadgeVariant, BreadcrumbItem, ButtonAppearance, ButtonSize, ButtonType, ButtonVariant, CardSize, CardVariant, CheckboxSize, CheckboxState, ContainerGutter, ContainerMaxWidth, DatePickerMode, DatePickerSize, DateRange, DividerLabelPosition, DividerOrientation, DividerSize, DividerVariant, DropdownItem, DropdownItemDTO, DsComboboxOption, DsComboboxSize, DsSelectOption, DsSelectSize, DsTableColumn, DsTableSize, DsTableVariant, I18nLabels, InputAppearance, InputSize, InputState, InputType, PageChangeEvent, PageSizeOption, PaginationSize, PopoverTrigger, ProgressBarMode, ProgressBarSize, ProgressBarVariant, RadioGroupLayout, RadioOption, RadioSize, SearchInputSize, SkeletonSize, SkeletonVariant, SortDirection, SortEvent, Step, StepChangeEvent, StepState, StepperOrientation, StepperSize, SupportedLocale, TabItem, TableState, TextareaAppearance, TextareaResize, TextareaSize, TextareaState, ToastInstance, ToastOptions, ToastPosition, ToastType, ToggleSize };
4687
+ export { AUTOCOMPLETE_POSITIONS, BUTTON_APPEARANCE_OPTIONS, BUTTON_SIZE_OPTIONS, BUTTON_VARIANT_OPTIONS, DROPDOWN_POSITIONS, DsAccordion, DsAlert, DsAvatar, DsBadge, DsBreadcrumb, DsButton, DsCard, DsCheckbox, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDropdown, DsI18nService, DsInputField, DsInputTextarea, DsMenu, DsModalComponent, DsPagination, DsPopover, DsPopoverComponent, DsProgressBar, DsRadioGroup, DsSearchInput, DsSelect, DsSkeleton, DsStepper, DsTable, DsTabs, DsToastComponent, DsToastContainerComponent, DsToastService, DsToggle, DsTooltip, DsTooltipComponent, IconRegistryService, POPOVER_POSITIONS, PrimitiveBadge, PrimitiveButton, PrimitiveCheckbox, PrimitiveInput, PrimitiveRadio, PrimitiveTextarea, PrimitiveToggle, TOOLTIP_POSITIONS, buildButtonArgTypes, buildButtonArgs, createSizeRender, createVariantRender };
4688
+ export type { AccordionChangeEvent, AccordionItem, AccordionSize, AccordionVariant, AlertSize, AlertType, AvatarShape, AvatarSize, BadgeAppearance, BadgeShape, BadgeSize, BadgeType, BadgeVariant, BreadcrumbItem, ButtonAppearance, ButtonSize, ButtonType, ButtonVariant, CardSize, CardVariant, CheckboxSize, CheckboxState, ContainerGutter, ContainerMaxWidth, DatePickerMode, DatePickerSize, DateRange, DividerLabelPosition, DividerOrientation, DividerSize, DividerVariant, DropdownItem, DropdownItemDTO, DsComboboxOption, DsComboboxSize, DsSelectOption, DsSelectSize, DsTableColumn, DsTableSize, DsTableVariant, I18nLabels, InputAppearance, InputSize, InputState, InputType, MenuItem, MenuSize, MenuTrigger, PageChangeEvent, PageSizeOption, PaginationSize, PopoverTrigger, ProgressBarMode, ProgressBarSize, ProgressBarVariant, RadioGroupLayout, RadioOption, RadioSize, SearchInputSize, SkeletonSize, SkeletonVariant, SortDirection, SortEvent, Step, StepChangeEvent, StepState, StepperOrientation, StepperSize, SupportedLocale, TabItem, TableState, TextareaAppearance, TextareaResize, TextareaSize, TextareaState, ToastInstance, ToastOptions, ToastPosition, ToastType, ToggleSize };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kksdev/ds-angular",
3
- "version": "1.1.0",
4
- "description": "Angular 20 standalone component library - Design System with 28 components, 7 primitives, 3 themes, i18n support",
3
+ "version": "1.2.0",
4
+ "description": "Angular 20 standalone component library - Design System with 30 components, 7 primitives, 3 themes, i18n support",
5
5
  "keywords": [
6
6
  "angular",
7
7
  "angular20",
@@ -412,4 +412,30 @@
412
412
  --accordion-icon-color: var(--gray-400);
413
413
  --accordion-focus-color: var(--color-primary);
414
414
  --accordion-expanded-border-color: var(--color-primary);
415
+
416
+ /* ==========================================================================
417
+ * SÉMANTIQUES DS AVATAR
418
+ * ======================================================================== */
419
+ --avatar-bg: var(--gray-700);
420
+ --avatar-text: var(--gray-200);
421
+ --avatar-border: var(--gray-600);
422
+ --avatar-placeholder-bg: var(--color-primary);
423
+ --avatar-placeholder-text: var(--gray-900);
424
+
425
+ /* ==========================================================================
426
+ * SÉMANTIQUES DS MENU
427
+ * ======================================================================== */
428
+ --menu-bg: var(--gray-800);
429
+ --menu-border: var(--gray-700);
430
+ --menu-shadow: var(--shadow-3);
431
+ --menu-item-text: var(--gray-100);
432
+ --menu-item-icon: var(--gray-400);
433
+ --menu-item-hover-bg: var(--gray-700);
434
+ --menu-item-hover-text: var(--gray-50);
435
+ --menu-item-active-bg: color-mix(in oklab, var(--color-primary) 20%, transparent);
436
+ --menu-item-active-text: var(--color-primary);
437
+ --menu-item-disabled-text: var(--gray-500);
438
+ --menu-item-disabled-icon: var(--gray-600);
439
+ --menu-divider: var(--gray-700);
440
+ --menu-backdrop: transparent;
415
441
  }
@@ -402,4 +402,30 @@
402
402
  --accordion-icon-color: var(--text-muted);
403
403
  --accordion-focus-color: var(--color-primary);
404
404
  --accordion-expanded-border-color: var(--color-primary);
405
+
406
+ /* ==========================================================================
407
+ * SÉMANTIQUES DS AVATAR
408
+ * ======================================================================== */
409
+ --avatar-bg: var(--gray-200);
410
+ --avatar-text: var(--gray-700);
411
+ --avatar-border: var(--gray-300);
412
+ --avatar-placeholder-bg: var(--color-primary);
413
+ --avatar-placeholder-text: var(--gray-50);
414
+
415
+ /* ==========================================================================
416
+ * SÉMANTIQUES DS MENU
417
+ * ======================================================================== */
418
+ --menu-bg: var(--surface-default);
419
+ --menu-border: var(--border-color);
420
+ --menu-shadow: var(--shadow-2);
421
+ --menu-item-text: var(--text-default);
422
+ --menu-item-icon: var(--text-muted);
423
+ --menu-item-hover-bg: var(--surface-hover);
424
+ --menu-item-hover-text: var(--text-default);
425
+ --menu-item-active-bg: color-mix(in oklab, var(--color-primary) 15%, transparent);
426
+ --menu-item-active-text: var(--color-primary);
427
+ --menu-item-disabled-text: var(--text-disabled);
428
+ --menu-item-disabled-icon: var(--text-disabled-alt);
429
+ --menu-divider: var(--border-subtle);
430
+ --menu-backdrop: transparent;
405
431
  }
@@ -361,3 +361,43 @@ $combobox-font-size-lg: $font-size-4;
361
361
  $combobox-radius: $radius-2;
362
362
  $combobox-dropdown-shadow: $shadow-2;
363
363
  $combobox-max-height: 250px;
364
+
365
+ // === AVATAR ===
366
+
367
+ $avatar-size-sm: 32px;
368
+ $avatar-size-md: 40px;
369
+ $avatar-size-lg: 48px;
370
+ $avatar-size-xl: 56px;
371
+
372
+ $avatar-font-size-sm: $font-size-1;
373
+ $avatar-font-size-md: $font-size-2;
374
+ $avatar-font-size-lg: $font-size-3;
375
+ $avatar-font-size-xl: $font-size-4;
376
+
377
+ $avatar-radius-circle: $radius-round;
378
+ $avatar-radius-rounded: $radius-2;
379
+ $avatar-radius-square: 0;
380
+
381
+ $avatar-border-width: 2px;
382
+
383
+ // === MENU ===
384
+
385
+ $menu-min-width: 160px;
386
+ $menu-max-width: 280px;
387
+ $menu-padding: $space-2;
388
+ $menu-radius: $radius-2;
389
+
390
+ $menu-item-height-sm: 28px;
391
+ $menu-item-height-md: 36px;
392
+ $menu-item-height-lg: 44px;
393
+
394
+ $menu-item-padding-x: $space-3;
395
+ $menu-item-padding-y: $space-2;
396
+ $menu-item-radius: $radius-1-5;
397
+ $menu-item-gap: $space-2;
398
+
399
+ $menu-font-size-sm: $font-size-1;
400
+ $menu-font-size-md: $font-size-2;
401
+ $menu-font-size-lg: $font-size-3;
402
+
403
+ $menu-divider-margin: $space-2;
@@ -436,4 +436,35 @@
436
436
  --font-size-sm: var(--font-size-2);
437
437
  --font-size-base: var(--font-size-3);
438
438
  --font-size-lg: var(--font-size-4);
439
+
440
+ /* === AVATAR === */
441
+ --avatar-size-sm: #{$avatar-size-sm};
442
+ --avatar-size-md: #{$avatar-size-md};
443
+ --avatar-size-lg: #{$avatar-size-lg};
444
+ --avatar-size-xl: #{$avatar-size-xl};
445
+ --avatar-font-size-sm: #{$avatar-font-size-sm};
446
+ --avatar-font-size-md: #{$avatar-font-size-md};
447
+ --avatar-font-size-lg: #{$avatar-font-size-lg};
448
+ --avatar-font-size-xl: #{$avatar-font-size-xl};
449
+ --avatar-radius-circle: #{$avatar-radius-circle};
450
+ --avatar-radius-rounded: #{$avatar-radius-rounded};
451
+ --avatar-radius-square: #{$avatar-radius-square};
452
+ --avatar-border-width: #{$avatar-border-width};
453
+
454
+ /* === MENU === */
455
+ --menu-min-width: #{$menu-min-width};
456
+ --menu-max-width: #{$menu-max-width};
457
+ --menu-padding: #{$menu-padding};
458
+ --menu-radius: #{$menu-radius};
459
+ --menu-item-height-sm: #{$menu-item-height-sm};
460
+ --menu-item-height-md: #{$menu-item-height-md};
461
+ --menu-item-height-lg: #{$menu-item-height-lg};
462
+ --menu-item-padding-x: #{$menu-item-padding-x};
463
+ --menu-item-padding-y: #{$menu-item-padding-y};
464
+ --menu-item-radius: #{$menu-item-radius};
465
+ --menu-item-gap: #{$menu-item-gap};
466
+ --menu-font-size-sm: #{$menu-font-size-sm};
467
+ --menu-font-size-md: #{$menu-font-size-md};
468
+ --menu-font-size-lg: #{$menu-font-size-lg};
469
+ --menu-divider-margin: #{$menu-divider-margin};
439
470
  }