@besaitech/ng-design-system 0.0.46 → 0.0.48

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.
@@ -10260,26 +10260,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
10260
10260
  }], propDecorators: { trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], email: [{ type: i0.Input, args: [{ isSignal: true, alias: "email", required: false }] }], initials: [{ type: i0.Input, args: [{ isSignal: true, alias: "initials", required: false }] }], src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], showDetails: [{ type: i0.Input, args: [{ isSignal: true, alias: "showDetails", required: false }] }], avatarSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarSize", required: false }] }], avatarBgClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarBgClass", required: false }] }], menuLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuLabel", required: false }] }], openChange: [{ type: i0.Output, args: ["openChange"] }] } });
10261
10261
 
10262
10262
  /**
10263
- * A single row inside a menu surface (the {@link SdsUserMenu} dropdown, or any custom popover). Renders
10264
- * an anchor when [link] is set — with the Router — or a button otherwise, and emits {@link select} on
10265
- * activation. The parent menu closes itself when an item is activated, so an item never has to reach
10266
- * back into the menu.
10263
+ * A single row inside a menu surface (the {@link SdsUserMenu} dropdown, or any custom popover). Renders,
10264
+ * in order of precedence: a plain anchor when [href] is set (an EXTERNAL or cross-origin URL), a
10265
+ * Router anchor when [link] is set (an in-app route), or a button otherwise. It always emits
10266
+ * {@link select} on activation. The parent menu closes itself when an item is activated, so an item
10267
+ * never has to reach back into the menu.
10267
10268
  *
10268
10269
  * `tone="danger"` paints a destructive action (sign out, delete). Trailing content (a shortcut hint, a
10269
10270
  * count) projects into the default slot after the label.
10270
10271
  *
10271
10272
  * @example
10272
- * <sds-menu-item icon="user" label="Profil" link="/profile" />
10273
+ * <sds-menu-item icon="user" label="Profil" link="/profile" /> <!-- in-app route -->
10274
+ * <sds-menu-item icon="external-link" label="Site public" href="https://…" target="_blank" />
10273
10275
  * <sds-menu-item icon="log-out" label="Se déconnecter" tone="danger" (select)="signOut()" />
10274
10276
  */
10275
10277
  class SdsMenuItem {
10276
10278
  icon = input(null, ...(ngDevMode ? [{ debugName: "icon" }] : []));
10277
10279
  label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
10278
- /** Router link target; when null (default) the item renders as a button. */
10280
+ /** Router link target for an in-app route; when null (default) the item is not a Router link. */
10279
10281
  link = input(null, ...(ngDevMode ? [{ debugName: "link" }] : []));
10282
+ /**
10283
+ * External / cross-origin URL. When set, the item renders a plain `<a [href]>` (NOT a Router link),
10284
+ * so it works for another app's origin. Takes precedence over {@link link}.
10285
+ */
10286
+ href = input(null, ...(ngDevMode ? [{ debugName: "href" }] : []));
10287
+ /** Anchor target for {@link href}, e.g. `_blank` to open the destination in a new tab. */
10288
+ target = input(null, ...(ngDevMode ? [{ debugName: "target" }] : []));
10289
+ /**
10290
+ * `rel` for {@link href}. Defaults to `noopener noreferrer` when {@link target} is `_blank` (the safe
10291
+ * default for a new-tab external link); pass a value to override, or `''` to clear it.
10292
+ */
10293
+ rel = input(null, ...(ngDevMode ? [{ debugName: "rel" }] : []));
10280
10294
  tone = input('default', ...(ngDevMode ? [{ debugName: "tone" }] : []));
10281
10295
  disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
10282
10296
  select = output();
10297
+ /** `noopener noreferrer` is forced for a `_blank` external link unless the consumer set `rel` explicitly. */
10298
+ resolvedRel = computed(() => this.rel() !== null ? this.rel() : this.target() === '_blank' ? 'noopener noreferrer' : null, ...(ngDevMode ? [{ debugName: "resolvedRel" }] : []));
10283
10299
  rowClass = computed(() => {
10284
10300
  const base = 'flex w-full items-center gap-3 px-4 py-2.5 text-sm font-medium transition-colors ' +
10285
10301
  'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset ' +
@@ -10290,8 +10306,18 @@ class SdsMenuItem {
10290
10306
  return `${base} ${tone}`;
10291
10307
  }, ...(ngDevMode ? [{ debugName: "rowClass" }] : []));
10292
10308
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsMenuItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
10293
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsMenuItem, isStandalone: true, selector: "sds-menu-item", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, link: { classPropertyName: "link", publicName: "link", isSignal: true, isRequired: false, transformFunction: null }, tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { select: "select" }, host: { classAttribute: "block" }, ngImport: i0, template: `
10294
- @if (link() !== null) {
10309
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsMenuItem, isStandalone: true, selector: "sds-menu-item", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, link: { classPropertyName: "link", publicName: "link", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null }, rel: { classPropertyName: "rel", publicName: "rel", isSignal: true, isRequired: false, transformFunction: null }, tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { select: "select" }, host: { classAttribute: "block" }, ngImport: i0, template: `
10310
+ @if (href() !== null) {
10311
+ <a
10312
+ [href]="href()"
10313
+ [attr.target]="target()"
10314
+ [attr.rel]="resolvedRel()"
10315
+ [class]="rowClass()"
10316
+ (click)="select.emit()"
10317
+ >
10318
+ <ng-container [ngTemplateOutlet]="content" />
10319
+ </a>
10320
+ } @else if (link() !== null) {
10295
10321
  <a [routerLink]="link()" [class]="rowClass()" (click)="select.emit()">
10296
10322
  <ng-container [ngTemplateOutlet]="content" />
10297
10323
  </a>
@@ -10318,7 +10344,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
10318
10344
  imports: [NgTemplateOutlet, RouterLink, SdsIcon],
10319
10345
  host: { class: 'block' },
10320
10346
  template: `
10321
- @if (link() !== null) {
10347
+ @if (href() !== null) {
10348
+ <a
10349
+ [href]="href()"
10350
+ [attr.target]="target()"
10351
+ [attr.rel]="resolvedRel()"
10352
+ [class]="rowClass()"
10353
+ (click)="select.emit()"
10354
+ >
10355
+ <ng-container [ngTemplateOutlet]="content" />
10356
+ </a>
10357
+ } @else if (link() !== null) {
10322
10358
  <a [routerLink]="link()" [class]="rowClass()" (click)="select.emit()">
10323
10359
  <ng-container [ngTemplateOutlet]="content" />
10324
10360
  </a>
@@ -10337,7 +10373,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
10337
10373
  </ng-template>
10338
10374
  `,
10339
10375
  }]
10340
- }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], link: [{ type: i0.Input, args: [{ isSignal: true, alias: "link", required: false }] }], tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], select: [{ type: i0.Output, args: ["select"] }] } });
10376
+ }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], link: [{ type: i0.Input, args: [{ isSignal: true, alias: "link", required: false }] }], href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], target: [{ type: i0.Input, args: [{ isSignal: true, alias: "target", required: false }] }], rel: [{ type: i0.Input, args: [{ isSignal: true, alias: "rel", required: false }] }], tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], select: [{ type: i0.Output, args: ["select"] }] } });
10341
10377
 
10342
10378
  const norm = (s) => s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();
10343
10379
  /**