@besaitech/ng-design-system 0.0.26 → 0.0.29

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.
@@ -29,6 +29,9 @@ const SDS_ICONS = {
29
29
  'user-plus': '<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><line x1="19" x2="19" y1="8" y2="14"/><line x1="22" x2="16" y1="11" y2="11"/>',
30
30
  hand: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-hand-icon lucide-hand"><path d="M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2"/><path d="M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2"/><path d="M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8"/><path d="M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15"/></svg>',
31
31
  users: '<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M22 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/>',
32
+ // Couriers. The back-office and the courier-facing screens both name a rider, and every Belvigo
33
+ // surface that does should draw the same one.
34
+ bike: '<circle cx="18.5" cy="17.5" r="3.5"/><circle cx="5.5" cy="17.5" r="3.5"/><circle cx="15" cy="5" r="1"/><path d="M12 17.5V14l-3-3 4-3 2 3h2"/>',
32
35
  'building-2': '<path d="M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z"/><path d="M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2"/><path d="M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2"/><path d="M10 6h4"/><path d="M10 10h4"/><path d="M10 14h4"/><path d="M10 18h4"/>',
33
36
  package: '<path d="M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z"/><path d="M12 22V12"/><polyline points="3.29 7 12 12 20.71 7"/><path d="m7.5 4.27 9 5.15"/>',
34
37
  'package-plus': '<path d="M16 16h6"/><path d="M19 13v6"/><path d="M21 10V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0"/><path d="m7.5 4.27 9 5.15"/><polyline points="3.29 7 12 12 20.71 7"/><path d="M12 22V12"/>',
@@ -273,11 +276,33 @@ class SdsInput {
273
276
  placeholder = input('', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
274
277
  hint = input('', ...(ngDevMode ? [{ debugName: "hint" }] : []));
275
278
  error = input('', ...(ngDevMode ? [{ debugName: "error" }] : []));
279
+ /**
280
+ * `search` is the semantically right type for a search field, and the template strips the WebKit
281
+ * search decorations that come with it. Without that, a `search` field with {@link clearable} draws
282
+ * TWO clear buttons — the component's and the browser's own, which no stylesheet can reach and which
283
+ * sits outside the field's own padding.
284
+ */
276
285
  type = input('text', ...(ngDevMode ? [{ debugName: "type" }] : []));
277
286
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
287
+ /**
288
+ * `filled` is a borderless field on a muted ground, for a search box that has to sit inside a page
289
+ * rather than announce itself as a form control — a storefront's search pill above all.
290
+ * `on-brand` is the same field tuned for a dark surface.
291
+ */
278
292
  appearance = input('default', ...(ngDevMode ? [{ debugName: "appearance" }] : []));
293
+ /**
294
+ * `pill` fully rounds the field. Separate from {@link appearance} on purpose: a bordered pill and a
295
+ * filled box are both real designs, and folding the two axes into one enum would forbid half of them.
296
+ */
297
+ shape = input('control', ...(ngDevMode ? [{ debugName: "shape" }] : []));
279
298
  disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
280
299
  clearable = input(false, ...(ngDevMode ? [{ debugName: "clearable", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
300
+ /**
301
+ * Accessible name for the clear button. French default so existing consumers are unchanged, but an
302
+ * app serving more than one language MUST translate it — it is an icon-only control, so this string
303
+ * is its only name.
304
+ */
305
+ clearLabel = input('Effacer', ...(ngDevMode ? [{ debugName: "clearLabel" }] : []));
281
306
  leadingIcon = input(null, ...(ngDevMode ? [{ debugName: "leadingIcon" }] : []));
282
307
  trailingIcon = input(null, ...(ngDevMode ? [{ debugName: "trailingIcon" }] : []));
283
308
  /**
@@ -299,6 +324,8 @@ class SdsInput {
299
324
  value = signal('', ...(ngDevMode ? [{ debugName: "value" }] : []));
300
325
  cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "cvaDisabled" }] : []));
301
326
  onBrand = computed(() => this.appearance() === 'on-brand', ...(ngDevMode ? [{ debugName: "onBrand" }] : []));
327
+ filled = computed(() => this.appearance() === 'filled', ...(ngDevMode ? [{ debugName: "filled" }] : []));
328
+ pill = computed(() => this.shape() === 'pill', ...(ngDevMode ? [{ debugName: "pill" }] : []));
302
329
  isDisabled = computed(() => this.disabled() || this.cvaDisabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
303
330
  describedBy = computed(() => {
304
331
  if (this.error())
@@ -308,15 +335,29 @@ class SdsInput {
308
335
  return null;
309
336
  }, ...(ngDevMode ? [{ debugName: "describedBy" }] : []));
310
337
  fieldPadding = computed(() => {
311
- const left = this.leadingIcon() ? 'pl-10' : 'pl-3.5';
312
- const right = this.trailingIcon() || this.clearable() || this.trailingAction() ? 'pr-10' : 'pr-3.5';
338
+ const inset = this.pill() ? 'pl-11' : 'pl-10';
339
+ const bare = this.pill() ? 'pl-5' : 'pl-3.5';
340
+ const left = this.leadingIcon() ? inset : bare;
341
+ const right = this.trailingIcon() || this.clearable() || this.trailingAction()
342
+ ? 'pr-10'
343
+ : this.pill()
344
+ ? 'pr-5'
345
+ : 'pr-3.5';
313
346
  return `${left} ${right}`;
314
347
  }, ...(ngDevMode ? [{ debugName: "fieldPadding" }] : []));
315
348
  wrapperClasses = computed(() => {
316
- const parts = [SIZES$8[this.size()]];
349
+ const parts = [SIZES$8[this.size()], this.pill() ? 'rounded-full' : 'rounded-control'];
317
350
  if (this.isDisabled())
318
351
  parts.push('opacity-60 cursor-not-allowed');
319
- if (this.onBrand()) {
352
+ if (this.filled()) {
353
+ // border-transparent, not border-0: the border box is what keeps a filled field the same height
354
+ // as a bordered one, so the two sit level when a toolbar mixes them.
355
+ parts.push('border-transparent bg-muted text-ink');
356
+ parts.push(this.error()
357
+ ? 'border-danger focus-within:ring-2 focus-within:ring-danger/30'
358
+ : 'focus-within:ring-2 focus-within:ring-brand-500/25');
359
+ }
360
+ else if (this.onBrand()) {
320
361
  parts.push('bg-white/10 text-white');
321
362
  parts.push(this.error()
322
363
  ? 'border-danger focus-within:ring-2 focus-within:ring-danger/30'
@@ -356,7 +397,7 @@ class SdsInput {
356
397
  this.onTouched();
357
398
  }
358
399
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
359
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsInput, isStandalone: true, selector: "sds-input", 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 }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, leadingIcon: { classPropertyName: "leadingIcon", publicName: "leadingIcon", isSignal: true, isRequired: false, transformFunction: null }, trailingIcon: { classPropertyName: "trailingIcon", publicName: "trailingIcon", isSignal: true, isRequired: false, transformFunction: null }, trailingAction: { classPropertyName: "trailingAction", publicName: "trailingAction", isSignal: true, isRequired: false, transformFunction: null }, trailingActionLabel: { classPropertyName: "trailingActionLabel", publicName: "trailingActionLabel", isSignal: true, isRequired: false, transformFunction: null }, trailingActionPressed: { classPropertyName: "trailingActionPressed", publicName: "trailingActionPressed", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { trailingActionClick: "trailingActionClick" }, host: { classAttribute: "block" }, providers: [
400
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsInput, isStandalone: true, selector: "sds-input", 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 }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, leadingIcon: { classPropertyName: "leadingIcon", publicName: "leadingIcon", isSignal: true, isRequired: false, transformFunction: null }, trailingIcon: { classPropertyName: "trailingIcon", publicName: "trailingIcon", isSignal: true, isRequired: false, transformFunction: null }, trailingAction: { classPropertyName: "trailingAction", publicName: "trailingAction", isSignal: true, isRequired: false, transformFunction: null }, trailingActionLabel: { classPropertyName: "trailingActionLabel", publicName: "trailingActionLabel", isSignal: true, isRequired: false, transformFunction: null }, trailingActionPressed: { classPropertyName: "trailingActionPressed", publicName: "trailingActionPressed", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { trailingActionClick: "trailingActionClick" }, host: { classAttribute: "block" }, providers: [
360
401
  {
361
402
  provide: NG_VALUE_ACCESSOR,
362
403
  useExisting: forwardRef(() => SdsInput),
@@ -374,14 +415,17 @@ class SdsInput {
374
415
  }
375
416
 
376
417
  <div
377
- class="relative flex items-center rounded-control border transition-colors"
418
+ class="relative flex items-center border transition-colors"
378
419
  [class]="wrapperClasses()"
379
420
  >
380
421
  @if (leadingIcon()) {
422
+ <!-- A pill needs its icon further in: on a fully-rounded field an icon at left-3 sits over
423
+ the curve rather than inside the field. -->
381
424
  <sds-icon
382
425
  [name]="leadingIcon()!"
383
426
  [size]="18"
384
- class="pointer-events-none absolute left-3 opacity-70"
427
+ class="pointer-events-none absolute opacity-70"
428
+ [class]="pill() ? 'left-4' : 'left-3'"
385
429
  />
386
430
  }
387
431
 
@@ -394,7 +438,9 @@ class SdsInput {
394
438
  [attr.aria-label]="!label() && ariaLabel() ? ariaLabel() : null"
395
439
  [attr.aria-invalid]="error() ? 'true' : null"
396
440
  [attr.aria-describedby]="describedBy()"
397
- class="w-full bg-transparent outline-none placeholder:text-current/50 disabled:cursor-not-allowed"
441
+ class="w-full bg-transparent outline-none placeholder:text-current/50 disabled:cursor-not-allowed
442
+ [&::-webkit-search-cancel-button]:appearance-none
443
+ [&::-webkit-search-decoration]:appearance-none"
398
444
  [class]="fieldPadding()"
399
445
  (input)="onInput($event)"
400
446
  (blur)="onTouched()"
@@ -404,7 +450,7 @@ class SdsInput {
404
450
  <button
405
451
  type="button"
406
452
  tabindex="-1"
407
- aria-label="Effacer"
453
+ [attr.aria-label]="clearLabel()"
408
454
  class="absolute right-2.5 inline-flex h-6 w-6 items-center justify-center rounded-full opacity-60 hover:opacity-100 hover:bg-black/5"
409
455
  (click)="clear()"
410
456
  >
@@ -472,14 +518,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
472
518
  }
473
519
 
474
520
  <div
475
- class="relative flex items-center rounded-control border transition-colors"
521
+ class="relative flex items-center border transition-colors"
476
522
  [class]="wrapperClasses()"
477
523
  >
478
524
  @if (leadingIcon()) {
525
+ <!-- A pill needs its icon further in: on a fully-rounded field an icon at left-3 sits over
526
+ the curve rather than inside the field. -->
479
527
  <sds-icon
480
528
  [name]="leadingIcon()!"
481
529
  [size]="18"
482
- class="pointer-events-none absolute left-3 opacity-70"
530
+ class="pointer-events-none absolute opacity-70"
531
+ [class]="pill() ? 'left-4' : 'left-3'"
483
532
  />
484
533
  }
485
534
 
@@ -492,7 +541,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
492
541
  [attr.aria-label]="!label() && ariaLabel() ? ariaLabel() : null"
493
542
  [attr.aria-invalid]="error() ? 'true' : null"
494
543
  [attr.aria-describedby]="describedBy()"
495
- class="w-full bg-transparent outline-none placeholder:text-current/50 disabled:cursor-not-allowed"
544
+ class="w-full bg-transparent outline-none placeholder:text-current/50 disabled:cursor-not-allowed
545
+ [&::-webkit-search-cancel-button]:appearance-none
546
+ [&::-webkit-search-decoration]:appearance-none"
496
547
  [class]="fieldPadding()"
497
548
  (input)="onInput($event)"
498
549
  (blur)="onTouched()"
@@ -502,7 +553,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
502
553
  <button
503
554
  type="button"
504
555
  tabindex="-1"
505
- aria-label="Effacer"
556
+ [attr.aria-label]="clearLabel()"
506
557
  class="absolute right-2.5 inline-flex h-6 w-6 items-center justify-center rounded-full opacity-60 hover:opacity-100 hover:bg-black/5"
507
558
  (click)="clear()"
508
559
  >
@@ -544,7 +595,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
544
595
  }
545
596
  `,
546
597
  }]
547
- }], 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 }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", 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"] }] } });
598
+ }], 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"] }] } });
548
599
 
549
600
  let nextId$9 = 0;
550
601
  const SIZES$7 = {
@@ -6632,9 +6683,19 @@ class SdsTopbar {
6632
6683
  </button>
6633
6684
  }
6634
6685
  <ng-content select="[sdsLogo]" />
6686
+ <!--
6687
+ shrink-0 + whitespace-nowrap, both required. The left block is a flex row, so without them a
6688
+ two-word app name wraps to a second line INSIDE a bar whose height is fixed at
6689
+ --sds-topbar-h, and the name is clipped by its own bar. It surfaced at 375px on a bar
6690
+ carrying a logo, a wordmark and a two-syllable name; it is wrong at every width.
6691
+
6692
+ The name never truncates and never hides: it is the answer to "which app am I in", which on a
6693
+ platform of five same-branded apps is the one thing the bar must not drop. An app whose left
6694
+ block is too crowded for a phone hides ITS OWN wordmark under sm and keeps the mark.
6695
+ -->
6635
6696
  @if (appName()) {
6636
- <span class="h-7 w-px" [class]="appearance() === 'brand' ? 'bg-white/30' : 'bg-border'"></span>
6637
- <span class="text-xl font-bold tracking-tight">{{ appName() }}</span>
6697
+ <span class="h-7 w-px shrink-0" [class]="appearance() === 'brand' ? 'bg-white/30' : 'bg-border'"></span>
6698
+ <span class="shrink-0 whitespace-nowrap text-xl font-bold tracking-tight">{{ appName() }}</span>
6638
6699
  }
6639
6700
  <ng-content select="[sdsLead]" />
6640
6701
  </div>
@@ -6721,9 +6782,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
6721
6782
  </button>
6722
6783
  }
6723
6784
  <ng-content select="[sdsLogo]" />
6785
+ <!--
6786
+ shrink-0 + whitespace-nowrap, both required. The left block is a flex row, so without them a
6787
+ two-word app name wraps to a second line INSIDE a bar whose height is fixed at
6788
+ --sds-topbar-h, and the name is clipped by its own bar. It surfaced at 375px on a bar
6789
+ carrying a logo, a wordmark and a two-syllable name; it is wrong at every width.
6790
+
6791
+ The name never truncates and never hides: it is the answer to "which app am I in", which on a
6792
+ platform of five same-branded apps is the one thing the bar must not drop. An app whose left
6793
+ block is too crowded for a phone hides ITS OWN wordmark under sm and keeps the mark.
6794
+ -->
6724
6795
  @if (appName()) {
6725
- <span class="h-7 w-px" [class]="appearance() === 'brand' ? 'bg-white/30' : 'bg-border'"></span>
6726
- <span class="text-xl font-bold tracking-tight">{{ appName() }}</span>
6796
+ <span class="h-7 w-px shrink-0" [class]="appearance() === 'brand' ? 'bg-white/30' : 'bg-border'"></span>
6797
+ <span class="shrink-0 whitespace-nowrap text-xl font-bold tracking-tight">{{ appName() }}</span>
6727
6798
  }
6728
6799
  <ng-content select="[sdsLead]" />
6729
6800
  </div>