@neuravision/ng-construct 0.3.1 → 0.3.3

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.
@@ -78,7 +78,7 @@ class AfAlertComponent {
78
78
  class="af-alert__dismiss"
79
79
  aria-label="Dismiss alert"
80
80
  (click)="dismiss()">
81
- ×
81
+ <span class="ct-icon ct-icon--sm" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></span>
82
82
  </button>
83
83
  }
84
84
  </div>
@@ -113,7 +113,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
113
113
  class="af-alert__dismiss"
114
114
  aria-label="Dismiss alert"
115
115
  (click)="dismiss()">
116
- ×
116
+ <span class="ct-icon ct-icon--sm" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></span>
117
117
  </button>
118
118
  }
119
119
  </div>
@@ -2081,10 +2081,11 @@ class AfModalComponent {
2081
2081
  <h2 [id]="titleId">{{ title() }}</h2>
2082
2082
  @if (showCloseButton()) {
2083
2083
  <button
2084
- class="ct-button ct-button--ghost"
2084
+ class="ct-button ct-button--ghost ct-button--icon"
2085
+ type="button"
2085
2086
  aria-label="Close"
2086
2087
  (click)="close()">
2087
- ×
2088
+ <span class="ct-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></span>
2088
2089
  </button>
2089
2090
  }
2090
2091
  </div>
@@ -2123,10 +2124,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
2123
2124
  <h2 [id]="titleId">{{ title() }}</h2>
2124
2125
  @if (showCloseButton()) {
2125
2126
  <button
2126
- class="ct-button ct-button--ghost"
2127
+ class="ct-button ct-button--ghost ct-button--icon"
2128
+ type="button"
2127
2129
  aria-label="Close"
2128
2130
  (click)="close()">
2129
- ×
2131
+ <span class="ct-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></span>
2130
2132
  </button>
2131
2133
  }
2132
2134
  </div>
@@ -2260,10 +2262,11 @@ class AfToastContainerComponent {
2260
2262
  </button>
2261
2263
  }
2262
2264
  <button
2263
- class="ct-button ct-button--ghost"
2265
+ class="ct-button ct-button--ghost ct-button--icon ct-button--sm"
2266
+ type="button"
2264
2267
  aria-label="Close"
2265
2268
  (click)="toastService.dismiss(toast.id)">
2266
- ×
2269
+ <span class="ct-icon ct-icon--sm" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></span>
2267
2270
  </button>
2268
2271
  </div>
2269
2272
  }
@@ -2294,10 +2297,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
2294
2297
  </button>
2295
2298
  }
2296
2299
  <button
2297
- class="ct-button ct-button--ghost"
2300
+ class="ct-button ct-button--ghost ct-button--icon ct-button--sm"
2301
+ type="button"
2298
2302
  aria-label="Close"
2299
2303
  (click)="toastService.dismiss(toast.id)">
2300
- ×
2304
+ <span class="ct-icon ct-icon--sm" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></span>
2301
2305
  </button>
2302
2306
  </div>
2303
2307
  }
@@ -2517,15 +2521,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
2517
2521
  */
2518
2522
  class AfDropdownComponent {
2519
2523
  static nextId = 0;
2524
+ hostRef = inject(ElementRef);
2520
2525
  /** Dropdown button label. */
2521
2526
  label = input('Actions', ...(ngDevMode ? [{ debugName: "label" }] : []));
2527
+ /** Trigger button size. */
2528
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
2522
2529
  /** Menu items. */
2523
2530
  items = input([], ...(ngDevMode ? [{ debugName: "items" }] : []));
2524
2531
  /** Emits the selected item's value. */
2525
2532
  itemSelected = output();
2533
+ /** Computed CSS classes for the trigger button. */
2534
+ triggerClasses = computed(() => {
2535
+ const classes = ['ct-button', 'ct-button--secondary', 'ct-dropdown__trigger'];
2536
+ if (this.size() !== 'md') {
2537
+ classes.push(`ct-button--${this.size()}`);
2538
+ }
2539
+ return classes.join(' ');
2540
+ }, ...(ngDevMode ? [{ debugName: "triggerClasses" }] : []));
2526
2541
  triggerRef = viewChild('trigger', ...(ngDevMode ? [{ debugName: "triggerRef" }] : []));
2527
2542
  menuRef = viewChild('menu', ...(ngDevMode ? [{ debugName: "menuRef" }] : []));
2528
2543
  itemButtons = viewChildren('itemButton', ...(ngDevMode ? [{ debugName: "itemButtons" }] : []));
2544
+ /** Non-separator items that can receive focus and be selected. */
2545
+ actionableItems = computed(() => this.items().filter((item) => !item.separator), ...(ngDevMode ? [{ debugName: "actionableItems" }] : []));
2529
2546
  isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
2530
2547
  focusedItemIndex = signal(0, ...(ngDevMode ? [{ debugName: "focusedItemIndex" }] : []));
2531
2548
  instanceId = AfDropdownComponent.nextId++;
@@ -2568,7 +2585,7 @@ class AfDropdownComponent {
2568
2585
  }
2569
2586
  /** Handles keyboard events within the open menu. */
2570
2587
  onMenuKeydown(event) {
2571
- const actionableItems = this.getActionableItems();
2588
+ const actionableItems = this.actionableItems();
2572
2589
  if (actionableItems.length === 0)
2573
2590
  return;
2574
2591
  switch (event.key) {
@@ -2619,8 +2636,7 @@ class AfDropdownComponent {
2619
2636
  }
2620
2637
  }
2621
2638
  onDocumentClick(event) {
2622
- const target = event.target;
2623
- if (!target.closest('.ct-dropdown')) {
2639
+ if (!this.hostRef.nativeElement.contains(event.target)) {
2624
2640
  this.close(false);
2625
2641
  }
2626
2642
  }
@@ -2629,11 +2645,11 @@ class AfDropdownComponent {
2629
2645
  * actionable (non-separator) items.
2630
2646
  */
2631
2647
  getActionableIndex(item) {
2632
- return this.getActionableItems().indexOf(item);
2648
+ return this.actionableItems().indexOf(item);
2633
2649
  }
2634
2650
  open(focusLast = false) {
2635
2651
  this.isOpen.set(true);
2636
- const actionableItems = this.getActionableItems();
2652
+ const actionableItems = this.actionableItems();
2637
2653
  const startIndex = focusLast
2638
2654
  ? this.nextEnabledIndex(actionableItems.length, -1)
2639
2655
  : this.nextEnabledIndex(-1, 1);
@@ -2659,7 +2675,7 @@ class AfDropdownComponent {
2659
2675
  buttons[idx]?.nativeElement.focus();
2660
2676
  }
2661
2677
  nextEnabledIndex(from, direction) {
2662
- const actionableItems = this.getActionableItems();
2678
+ const actionableItems = this.actionableItems();
2663
2679
  const len = actionableItems.length;
2664
2680
  if (len === 0)
2665
2681
  return 0;
@@ -2675,9 +2691,6 @@ class AfDropdownComponent {
2675
2691
  }
2676
2692
  return from;
2677
2693
  }
2678
- getActionableItems() {
2679
- return this.items().filter((item) => !item.separator);
2680
- }
2681
2694
  handleTypeAhead(char) {
2682
2695
  if (this.typeAheadTimer) {
2683
2696
  clearTimeout(this.typeAheadTimer);
@@ -2687,7 +2700,7 @@ class AfDropdownComponent {
2687
2700
  this.typeAheadBuffer = '';
2688
2701
  this.typeAheadTimer = null;
2689
2702
  }, 500);
2690
- const actionableItems = this.getActionableItems();
2703
+ const actionableItems = this.actionableItems();
2691
2704
  const startIndex = this.focusedItemIndex() + 1;
2692
2705
  for (let i = 0; i < actionableItems.length; i++) {
2693
2706
  const idx = (startIndex + i) % actionableItems.length;
@@ -2699,11 +2712,12 @@ class AfDropdownComponent {
2699
2712
  }
2700
2713
  }
2701
2714
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: AfDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2702
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: AfDropdownComponent, isStandalone: true, selector: "af-dropdown", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelected: "itemSelected" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "menuRef", first: true, predicate: ["menu"], descendants: true, isSignal: true }, { propertyName: "itemButtons", predicate: ["itemButton"], descendants: true, isSignal: true }], ngImport: i0, template: `
2715
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: AfDropdownComponent, isStandalone: true, selector: "af-dropdown", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelected: "itemSelected" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "menuRef", first: true, predicate: ["menu"], descendants: true, isSignal: true }, { propertyName: "itemButtons", predicate: ["itemButton"], descendants: true, isSignal: true }], ngImport: i0, template: `
2703
2716
  <div class="ct-dropdown" [attr.data-state]="isOpen() ? 'open' : 'closed'">
2704
2717
  <button
2705
2718
  #trigger
2706
- class="ct-button ct-button--secondary ct-dropdown__trigger"
2719
+ [id]="triggerId"
2720
+ [class]="triggerClasses()"
2707
2721
  [attr.aria-expanded]="isOpen()"
2708
2722
  [attr.aria-controls]="menuId"
2709
2723
  aria-haspopup="menu"
@@ -2750,7 +2764,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
2750
2764
  <div class="ct-dropdown" [attr.data-state]="isOpen() ? 'open' : 'closed'">
2751
2765
  <button
2752
2766
  #trigger
2753
- class="ct-button ct-button--secondary ct-dropdown__trigger"
2767
+ [id]="triggerId"
2768
+ [class]="triggerClasses()"
2754
2769
  [attr.aria-expanded]="isOpen()"
2755
2770
  [attr.aria-controls]="menuId"
2756
2771
  aria-haspopup="menu"
@@ -2788,7 +2803,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
2788
2803
  }
2789
2804
  </div>
2790
2805
  `, styles: [":host{display:inline-block}\n"] }]
2791
- }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }], triggerRef: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], menuRef: [{ type: i0.ViewChild, args: ['menu', { isSignal: true }] }], itemButtons: [{ type: i0.ViewChildren, args: ['itemButton', { isSignal: true }] }] } });
2806
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }], triggerRef: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], menuRef: [{ type: i0.ViewChild, args: ['menu', { isSignal: true }] }], itemButtons: [{ type: i0.ViewChildren, args: ['itemButton', { isSignal: true }] }] } });
2792
2807
 
2793
2808
  /**
2794
2809
  * Pagination component
@@ -3620,7 +3635,7 @@ class AfChipInputComponent {
3620
3635
  class="ct-chip__remove"
3621
3636
  [attr.aria-label]="'Remove ' + chip"
3622
3637
  (click)="remove(chip, $event)">
3623
- &times;
3638
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
3624
3639
  </button>
3625
3640
  }
3626
3641
  </span>
@@ -3691,7 +3706,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
3691
3706
  class="ct-chip__remove"
3692
3707
  [attr.aria-label]="'Remove ' + chip"
3693
3708
  (click)="remove(chip, $event)">
3694
- &times;
3709
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
3695
3710
  </button>
3696
3711
  }
3697
3712
  </span>
@@ -4215,7 +4230,7 @@ class AfSidebarComponent {
4215
4230
  type="button"
4216
4231
  aria-label="Close menu"
4217
4232
  (click)="close()">
4218
- <span class="ct-icon ct-icon--sm" aria-hidden="true">&times;</span>
4233
+ <span class="ct-icon ct-icon--sm" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></span>
4219
4234
  </button>
4220
4235
  }
4221
4236
  </div>
@@ -4246,7 +4261,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
4246
4261
  type="button"
4247
4262
  aria-label="Close menu"
4248
4263
  (click)="close()">
4249
- <span class="ct-icon ct-icon--sm" aria-hidden="true">&times;</span>
4264
+ <span class="ct-icon ct-icon--sm" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></span>
4250
4265
  </button>
4251
4266
  }
4252
4267
  </div>
@@ -4262,38 +4277,52 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
4262
4277
  }], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], showCloseButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCloseButton", required: false }] }] } });
4263
4278
 
4264
4279
  /**
4265
- * Icon component that abstracts the icon rendering strategy.
4280
+ * Icon wrapper that applies Construct Design System sizing via `ct-icon` classes.
4266
4281
  *
4267
- * Currently uses Material Icons font ligatures. The icon strategy
4268
- * can be changed centrally without modifying consumers.
4282
+ * Uses content projection so any icon source can be used:
4283
+ * Lucide, custom SVGs, or other icon libraries.
4269
4284
  *
4270
- * @example
4271
- * <af-icon name="delete" />
4272
- * <af-icon name="edit" size="sm" />
4285
+ * @example Using with Lucide
4286
+ * ```html
4287
+ * <af-icon size="sm">
4288
+ * <lucide-x />
4289
+ * </af-icon>
4290
+ * ```
4291
+ *
4292
+ * @example Using with inline SVG
4293
+ * ```html
4294
+ * <af-icon size="lg">
4295
+ * <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
4296
+ * <circle cx="12" cy="12" r="10" />
4297
+ * </svg>
4298
+ * </af-icon>
4299
+ * ```
4273
4300
  */
4274
4301
  class AfIconComponent {
4275
- /** Material Icon name (ligature) */
4276
- name = input.required(...(ngDevMode ? [{ debugName: "name" }] : []));
4277
4302
  /** Icon size variant */
4278
4303
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
4279
4304
  iconClasses = computed(() => {
4280
- const classes = ['ct-icon', 'material-icons'];
4305
+ const classes = ['ct-icon'];
4281
4306
  if (this.size() !== 'md') {
4282
4307
  classes.push(`ct-icon--${this.size()}`);
4283
4308
  }
4284
4309
  return classes.join(' ');
4285
4310
  }, ...(ngDevMode ? [{ debugName: "iconClasses" }] : []));
4286
4311
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: AfIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4287
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.2", type: AfIconComponent, isStandalone: true, selector: "af-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
4288
- <span [class]="iconClasses()" aria-hidden="true">{{ name() }}</span>
4312
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.2", type: AfIconComponent, isStandalone: true, selector: "af-icon", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
4313
+ <span [class]="iconClasses()" aria-hidden="true">
4314
+ <ng-content />
4315
+ </span>
4289
4316
  `, isInline: true, styles: [":host{display:inline-flex;align-items:center;justify-content:center}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4290
4317
  }
4291
4318
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: AfIconComponent, decorators: [{
4292
4319
  type: Component,
4293
4320
  args: [{ selector: 'af-icon', changeDetection: ChangeDetectionStrategy.OnPush, template: `
4294
- <span [class]="iconClasses()" aria-hidden="true">{{ name() }}</span>
4321
+ <span [class]="iconClasses()" aria-hidden="true">
4322
+ <ng-content />
4323
+ </span>
4295
4324
  `, styles: [":host{display:inline-flex;align-items:center;justify-content:center}\n"] }]
4296
- }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
4325
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
4297
4326
 
4298
4327
  /**
4299
4328
  * Slider component with full form control and accessibility support.
@@ -4601,7 +4630,7 @@ class AfDrawerComponent {
4601
4630
  type="button"
4602
4631
  [attr.aria-label]="closeButtonAriaLabel()"
4603
4632
  (click)="close()">
4604
- <span class="ct-icon ct-icon--sm" aria-hidden="true">&times;</span>
4633
+ <span class="ct-icon ct-icon--sm" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></span>
4605
4634
  </button>
4606
4635
  }
4607
4636
  </div>
@@ -4643,7 +4672,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
4643
4672
  type="button"
4644
4673
  [attr.aria-label]="closeButtonAriaLabel()"
4645
4674
  (click)="close()">
4646
- <span class="ct-icon ct-icon--sm" aria-hidden="true">&times;</span>
4675
+ <span class="ct-icon ct-icon--sm" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></span>
4647
4676
  </button>
4648
4677
  }
4649
4678
  </div>
@@ -7046,7 +7075,7 @@ class AfBannerComponent {
7046
7075
  type="button"
7047
7076
  [attr.aria-label]="closeAriaLabel()"
7048
7077
  (click)="dismiss()">
7049
- &times;
7078
+ <span class="ct-icon ct-icon--sm" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></span>
7050
7079
  </button>
7051
7080
  }
7052
7081
  </div>
@@ -7081,7 +7110,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
7081
7110
  type="button"
7082
7111
  [attr.aria-label]="closeAriaLabel()"
7083
7112
  (click)="dismiss()">
7084
- &times;
7113
+ <span class="ct-icon ct-icon--sm" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></span>
7085
7114
  </button>
7086
7115
  }
7087
7116
  </div>