@bitforgehq/ui 0.3.3 → 0.4.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.
Files changed (39) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +4 -4
  3. package/ai/MANIFEST.index.json +36 -0
  4. package/ai/MANIFEST.json +414 -14
  5. package/ai/REFERENCE.index.json +35 -0
  6. package/ai/REFERENCE.json +184 -8
  7. package/ai/UI_GUIDE.md +25 -4
  8. package/ai/components/badge.md +39 -2
  9. package/ai/components/list-item.md +105 -9
  10. package/ai/components/step.md +112 -0
  11. package/ai/components/steps.md +124 -0
  12. package/ai/components/table.md +98 -2
  13. package/ai/components/timeline-event.md +144 -0
  14. package/ai/components/timeline.md +201 -0
  15. package/ai/components/toggle.md +11 -1
  16. package/ai/reference/bf-action-directive.md +3 -1
  17. package/ai/reference/bf-badge-emphasis.md +27 -0
  18. package/ai/reference/bf-labels.md +1 -0
  19. package/ai/reference/bf-step-heading-level.md +28 -0
  20. package/ai/reference/bf-table-align.md +1 -1
  21. package/ai/reference/bf-table-column-align.md +33 -0
  22. package/ai/reference/bf-table-column.md +7 -7
  23. package/ai/reference/bf-table-harness.md +12 -0
  24. package/ai/reference/bf-timeline-tone.md +31 -0
  25. package/ai/reference/bf-toggle-harness.md +55 -0
  26. package/ai/reference/provide-bf-labels.md +1 -1
  27. package/dark-ink.css +124 -0
  28. package/fesm2022/bitforgehq-ui-mobile.mjs +2 -1
  29. package/fesm2022/bitforgehq-ui-mobile.mjs.map +1 -1
  30. package/fesm2022/bitforgehq-ui-testing.mjs +51 -2
  31. package/fesm2022/bitforgehq-ui-testing.mjs.map +1 -1
  32. package/fesm2022/bitforgehq-ui.mjs +682 -32
  33. package/fesm2022/bitforgehq-ui.mjs.map +1 -1
  34. package/llms-full.txt +1072 -15
  35. package/llms.txt +9 -0
  36. package/package.json +2 -1
  37. package/theme.css +24 -0
  38. package/types/bitforgehq-ui-testing.d.ts +76 -1
  39. package/types/bitforgehq-ui.d.ts +288 -8
@@ -1,5 +1,5 @@
1
1
  import * as i0 from "@angular/core";
2
- import { Component, DOCUMENT, DestroyRef, Directive, ElementRef, HostAttributeToken, Injectable, InjectionToken, Injector, PLATFORM_ID, TemplateRef, afterNextRender, afterRenderEffect, booleanAttribute, computed, contentChild, contentChildren, effect, inject, input, linkedSignal, makeEnvironmentProviders, model, numberAttribute, output, provideEnvironmentInitializer, signal, untracked, viewChild, viewChildren } from "@angular/core";
2
+ import { Component, DOCUMENT, DestroyRef, Directive, ElementRef, HostAttributeToken, Injectable, InjectionToken, Injector, LOCALE_ID, PLATFORM_ID, TemplateRef, afterNextRender, afterRenderEffect, booleanAttribute, computed, contentChild, contentChildren, effect, inject, input, linkedSignal, makeEnvironmentProviders, model, numberAttribute, output, provideEnvironmentInitializer, signal, untracked, viewChild, viewChildren } from "@angular/core";
3
3
  import { NgTemplateOutlet, isPlatformBrowser } from "@angular/common";
4
4
  const BF_DEFAULT_VALUES = {
5
5
  fieldSize: "md",
@@ -96,6 +96,7 @@ const BF_DEFAULT_LABELS = {
96
96
  chartValue: "Value",
97
97
  chartEmpty: "No data to show",
98
98
  chartError: "The data could not be loaded",
99
+ listItemUnread: "Unread",
99
100
  validation: {
100
101
  required: "Fill in this field",
101
102
  email: "Enter a valid email address",
@@ -198,6 +199,7 @@ function mergeLabels(parent, o) {
198
199
  chartValue: o.chartValue ?? parent.chartValue,
199
200
  chartEmpty: o.chartEmpty ?? parent.chartEmpty,
200
201
  chartError: o.chartError ?? parent.chartError,
202
+ listItemUnread: o.listItemUnread ?? parent.listItemUnread,
201
203
  validation: {
202
204
  required: v.required ?? pv.required,
203
205
  email: v.email ?? pv.email,
@@ -1129,7 +1131,9 @@ i0.ɵɵngDeclareClassMetadata({
1129
1131
  }
1130
1132
  });
1131
1133
  const LABEL_BASE$1 = "inline-flex items-center rounded-control px-2.5 py-1.25 text-micro font-bold leading-none";
1132
- const COUNT_BASE = "inline-flex h-box min-w-box items-center justify-center rounded-control bg-primary px-1.75 text-micro font-bold leading-none text-on-primary";
1134
+ const COUNT_BASE = "inline-flex h-box min-w-box items-center justify-center rounded-control px-1.75 text-micro font-bold leading-none";
1135
+ const COUNT_SOFT = "bg-primary text-on-primary";
1136
+ const STRONG_FORCED = "forced-colors:outline forced-colors:outline-[CanvasText]";
1133
1137
  const VARIANT$4 = {
1134
1138
  neutral: "bg-neutral-soft text-neutral",
1135
1139
  primary: "bg-primary-soft text-primary-strong",
@@ -1138,16 +1142,25 @@ const VARIANT$4 = {
1138
1142
  danger: "bg-danger-soft text-danger",
1139
1143
  info: "bg-info-soft text-info"
1140
1144
  };
1145
+ const STRONG = {
1146
+ neutral: "bg-neutral-strong text-on-neutral-strong",
1147
+ primary: "bg-primary text-on-primary",
1148
+ success: "bg-success-strong text-on-success-strong",
1149
+ warning: "bg-warning-strong text-on-warning-strong",
1150
+ danger: "bg-danger-strong text-on-danger-strong",
1151
+ info: "bg-info-strong text-on-info-strong"
1152
+ };
1141
1153
  var BfBadgeComponent = class BfBadgeComponent {
1142
1154
  variant = input("neutral", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
1155
+ emphasis = input("soft", ...ngDevMode ? [{ debugName: "emphasis" }] : /* istanbul ignore next */ []);
1143
1156
  count = input(void 0, ...ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []);
1144
1157
  countLabel = input("", ...ngDevMode ? [{ debugName: "countLabel" }] : /* istanbul ignore next */ []);
1145
- classes = computed(() => `${LABEL_BASE$1} ${VARIANT$4[this.variant()]}`, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
1158
+ classes = computed(() => this.emphasis() === "strong" ? `${LABEL_BASE$1} ${STRONG[this.variant()]} ${STRONG_FORCED}` : `${LABEL_BASE$1} ${VARIANT$4[this.variant()]}`, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
1146
1159
  countText = computed(() => {
1147
1160
  const c = this.count();
1148
1161
  return c === void 0 ? null : c > 99 ? "99+" : String(c);
1149
1162
  }, ...ngDevMode ? [{ debugName: "countText" }] : /* istanbul ignore next */ []);
1150
- countClasses = COUNT_BASE;
1163
+ countClasses = computed(() => this.emphasis() === "strong" ? `${COUNT_BASE} ${STRONG[this.variant()]} ${STRONG_FORCED}` : `${COUNT_BASE} ${COUNT_SOFT}`, ...ngDevMode ? [{ debugName: "countClasses" }] : /* istanbul ignore next */ []);
1151
1164
  static ɵfac = i0.ɵɵngDeclareFactory({
1152
1165
  minVersion: "12.0.0",
1153
1166
  version: "22.1.7",
@@ -1170,6 +1183,13 @@ var BfBadgeComponent = class BfBadgeComponent {
1170
1183
  isRequired: false,
1171
1184
  transformFunction: null
1172
1185
  },
1186
+ emphasis: {
1187
+ classPropertyName: "emphasis",
1188
+ publicName: "emphasis",
1189
+ isSignal: true,
1190
+ isRequired: false,
1191
+ transformFunction: null
1192
+ },
1173
1193
  count: {
1174
1194
  classPropertyName: "count",
1175
1195
  publicName: "count",
@@ -1189,7 +1209,7 @@ var BfBadgeComponent = class BfBadgeComponent {
1189
1209
  ngImport: i0,
1190
1210
  template: `
1191
1211
  @if (countText(); as text) {
1192
- <span [class]="countClasses"
1212
+ <span [class]="countClasses()"
1193
1213
  >{{ text }}
1194
1214
  @if (countLabel()) {
1195
1215
  <span class="sr-only"> {{ countLabel() }}</span>
@@ -1214,7 +1234,7 @@ i0.ɵɵngDeclareClassMetadata({
1214
1234
  host: { class: "inline-flex" },
1215
1235
  template: `
1216
1236
  @if (countText(); as text) {
1217
- <span [class]="countClasses"
1237
+ <span [class]="countClasses()"
1218
1238
  >{{ text }}
1219
1239
  @if (countLabel()) {
1220
1240
  <span class="sr-only"> {{ countLabel() }}</span>
@@ -1235,6 +1255,14 @@ i0.ɵɵngDeclareClassMetadata({
1235
1255
  required: false
1236
1256
  }]
1237
1257
  }],
1258
+ emphasis: [{
1259
+ type: i0.Input,
1260
+ args: [{
1261
+ isSignal: true,
1262
+ alias: "emphasis",
1263
+ required: false
1264
+ }]
1265
+ }],
1238
1266
  count: [{
1239
1267
  type: i0.Input,
1240
1268
  args: [{
@@ -3516,7 +3544,7 @@ const ROW$4 = {
3516
3544
  md: "min-h-10 pointer-coarse:min-h-hit",
3517
3545
  lg: "min-h-12"
3518
3546
  };
3519
- const TEXT$3 = {
3547
+ const TEXT$4 = {
3520
3548
  sm: "text-label-sm",
3521
3549
  md: "text-label",
3522
3550
  lg: "text-label"
@@ -3593,7 +3621,7 @@ var BfCheckboxComponent = class BfCheckboxComponent {
3593
3621
  ROW$4[this.resolvedSize()],
3594
3622
  LABEL_MODE$1[this.mode()]
3595
3623
  ].join(" "), ...ngDevMode ? [{ debugName: "labelClasses" }] : /* istanbul ignore next */ []);
3596
- textClasses = computed(() => `text-text peer-disabled:text-text-disabled font-semibold empty:hidden ${TEXT$3[this.resolvedSize()]}`, ...ngDevMode ? [{ debugName: "textClasses" }] : /* istanbul ignore next */ []);
3624
+ textClasses = computed(() => `text-text peer-disabled:text-text-disabled font-semibold empty:hidden ${TEXT$4[this.resolvedSize()]}`, ...ngDevMode ? [{ debugName: "textClasses" }] : /* istanbul ignore next */ []);
3597
3625
  errorClasses = computed(() => `text-danger text-micro ${ERROR_INDENT[this.resolvedSize()]}`, ...ngDevMode ? [{ debugName: "errorClasses" }] : /* istanbul ignore next */ []);
3598
3626
  boxClasses = computed(() => {
3599
3627
  const state = this.checked() || this.indeterminate() ? this.readonly() ? "readonlyOn" : "on" : this.showError() ? "error" : this.readonly() ? "readonly" : "off";
@@ -3985,7 +4013,7 @@ i0.ɵɵngDeclareClassMetadata({
3985
4013
  const TRACK_BASE$1 = "relative flex shrink-0 items-center rounded-control border-[1.5px] p-[1.5px] transition-colors peer-focus-visible:ring-4 peer-focus-visible:ring-ring peer-focus-visible:outline-hidden";
3986
4014
  const KNOB_BASE = "block rounded-control border-[1.5px] border-transparent shadow-segment transition-transform";
3987
4015
  const ROW$3 = {
3988
- sm: "min-h-8 pointer-coarse:min-h-hit",
4016
+ sm: "min-h-8 pointer-coarse:min-h-hit pointer-coarse:min-w-hit",
3989
4017
  md: "min-h-10 pointer-coarse:min-h-hit",
3990
4018
  lg: "min-h-12"
3991
4019
  };
@@ -4013,7 +4041,7 @@ const KNOB_TRAVEL = {
4013
4041
  off: "translate-x-0"
4014
4042
  }
4015
4043
  };
4016
- const TEXT$2 = {
4044
+ const TEXT$3 = {
4017
4045
  sm: "text-label-sm",
4018
4046
  md: "text-label",
4019
4047
  lg: "text-label"
@@ -4094,7 +4122,7 @@ var BfToggleComponent = class BfToggleComponent {
4094
4122
  resolvedSize = computed(() => this.size() ?? this.defaults.controlSize, ...ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []);
4095
4123
  mode = computed(() => this.disabled() ? "disabled" : this.readonly() ? "readonly" : "editable", ...ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []);
4096
4124
  labelClasses = computed(() => [
4097
- this.labelPosition() === "start" ? "flex w-full flex-row-reverse items-center justify-between gap-2.5" : "inline-flex items-center gap-2.5",
4125
+ this.labelPosition() === "start" ? "flex w-full flex-row-reverse items-center justify-between gap-2.5" : "inline-flex items-center justify-center gap-2.5",
4098
4126
  ROW$3[this.resolvedSize()],
4099
4127
  LABEL_MODE[this.mode()]
4100
4128
  ].join(" "), ...ngDevMode ? [{ debugName: "labelClasses" }] : /* istanbul ignore next */ []);
@@ -4104,7 +4132,7 @@ var BfToggleComponent = class BfToggleComponent {
4104
4132
  TRACK_FILL$1[this.mode()][this.checked() ? "on" : "off"],
4105
4133
  TRACK_PRESSED[this.mode()]
4106
4134
  ].filter(Boolean).join(" "), ...ngDevMode ? [{ debugName: "trackClasses" }] : /* istanbul ignore next */ []);
4107
- textClasses = computed(() => `text-text peer-disabled:text-text-disabled min-w-0 font-semibold wrap-anywhere ${TEXT$2[this.resolvedSize()]}`, ...ngDevMode ? [{ debugName: "textClasses" }] : /* istanbul ignore next */ []);
4135
+ textClasses = computed(() => `text-text peer-disabled:text-text-disabled min-w-0 font-semibold wrap-anywhere ${TEXT$3[this.resolvedSize()]}`, ...ngDevMode ? [{ debugName: "textClasses" }] : /* istanbul ignore next */ []);
4108
4136
  knobClasses = computed(() => {
4109
4137
  const on = this.checked();
4110
4138
  const fill = KNOB_FILL[this.mode()][on ? "on" : "off"];
@@ -4518,7 +4546,7 @@ const DOT_SIZE = {
4518
4546
  md: "size-3",
4519
4547
  lg: "size-3.5"
4520
4548
  };
4521
- const TEXT$1 = {
4549
+ const TEXT$2 = {
4522
4550
  sm: "text-label-sm",
4523
4551
  md: "text-label",
4524
4552
  lg: "text-label"
@@ -4580,7 +4608,7 @@ var BfRadioGroupComponent = class BfRadioGroupComponent {
4580
4608
  defaults = inject(BF_DEFAULTS);
4581
4609
  selectedIndex = computed(() => choiceIndex(this.options(), this.value(), this.compareWith()), ...ngDevMode ? [{ debugName: "selectedIndex" }] : /* istanbul ignore next */ []);
4582
4610
  resolvedSize = computed(() => this.size() ?? this.defaults.controlSize, ...ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []);
4583
- textClasses = computed(() => `font-semibold ${TEXT$1[this.resolvedSize()]}`, ...ngDevMode ? [{ debugName: "textClasses" }] : /* istanbul ignore next */ []);
4611
+ textClasses = computed(() => `font-semibold ${TEXT$2[this.resolvedSize()]}`, ...ngDevMode ? [{ debugName: "textClasses" }] : /* istanbul ignore next */ []);
4584
4612
  errorText = computed(() => fieldErrorText(this.errorMessage(), this.touched(), this.errors(), this.labels.validation), ...ngDevMode ? [{ debugName: "errorText" }] : /* istanbul ignore next */ []);
4585
4613
  showError = computed(() => fieldShowsError(this.errorText(), this.invalid(), this.touched()), ...ngDevMode ? [{ debugName: "showError" }] : /* istanbul ignore next */ []);
4586
4614
  message = heldMessage(this.errorText);
@@ -6443,10 +6471,11 @@ const ACTION$1 = {
6443
6471
  action: "cursor-pointer hover:bg-surface-muted has-[[data-bf-action]:active]:bg-surface-pressed has-[[data-bf-action]:active]:after:border-text-muted",
6444
6472
  focused: "cursor-pointer hover:bg-surface-muted has-[[data-bf-action]:active]:bg-surface-pressed has-[[data-bf-action]:active]:after:border-text-muted ring-4 ring-ring"
6445
6473
  };
6446
- const TEXT = {
6474
+ const TEXT$1 = {
6447
6475
  wrap: "wrap-anywhere",
6448
6476
  truncate: "truncate"
6449
6477
  };
6478
+ const UNREAD_DOT = "absolute -start-2.5 mt-[7px] size-1.5 rounded-full bg-primary forced-colors:bg-[CanvasText]";
6450
6479
  const CHEVRON$2 = "after:ms-auto after:h-2.5 after:w-2.5 after:shrink-0 after:-translate-x-1 after:rotate-45 rtl:after:translate-x-1 rtl:after:-rotate-135 after:border-t-[1.5px] after:border-r-[1.5px] after:border-text-subtle after:content-['']";
6451
6480
  var BfListItemComponent = class BfListItemComponent {
6452
6481
  title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
@@ -6467,15 +6496,26 @@ var BfListItemComponent = class BfListItemComponent {
6467
6496
  ...ngDevMode ? { debugName: "truncate" } : /* istanbul ignore next */ {},
6468
6497
  transform: booleanAttribute
6469
6498
  });
6499
+ unread = input(false, {
6500
+ ...ngDevMode ? { debugName: "unread" } : /* istanbul ignore next */ {},
6501
+ transform: booleanAttribute
6502
+ });
6470
6503
  clicked = output();
6471
6504
  role = inject(BF_LIST, { optional: true }) ? "listitem" : null;
6505
+ labels = inject(BF_LABELS);
6506
+ unreadDot = UNREAD_DOT;
6472
6507
  actions = signal(0, ...ngDevMode ? [{ debugName: "actions" }] : /* istanbul ignore next */ []);
6473
6508
  actionFocusVisible = signal(false, ...ngDevMode ? [{ debugName: "actionFocusVisible" }] : /* istanbul ignore next */ []);
6474
6509
  actionState = computed(() => {
6475
6510
  if (this.actions() === 0) return "none";
6476
6511
  return this.actionFocusVisible() ? "focused" : "action";
6477
6512
  }, ...ngDevMode ? [{ debugName: "actionState" }] : /* istanbul ignore next */ []);
6478
- textClasses = computed(() => TEXT[this.truncate() ? "truncate" : "wrap"], ...ngDevMode ? [{ debugName: "textClasses" }] : /* istanbul ignore next */ []);
6513
+ hasAction = computed(() => this.actions() > 0, ...ngDevMode ? [{ debugName: "hasAction" }] : /* istanbul ignore next */ []);
6514
+ unreadIdValue;
6515
+ unreadId = computed(() => this.unread() ? this.unreadIdValue ??= uniqueId("bf-list-item-unread") : null, ...ngDevMode ? [{ debugName: "unreadId" }] : /* istanbul ignore next */ []);
6516
+ actionLabelPrefix = computed(() => this.hasAction() ? this.unreadId() : null, ...ngDevMode ? [{ debugName: "actionLabelPrefix" }] : /* istanbul ignore next */ []);
6517
+ titleWeight = computed(() => this.unread() ? "font-extrabold" : "font-bold", ...ngDevMode ? [{ debugName: "titleWeight" }] : /* istanbul ignore next */ []);
6518
+ textClasses = computed(() => TEXT$1[this.truncate() ? "truncate" : "wrap"], ...ngDevMode ? [{ debugName: "textClasses" }] : /* istanbul ignore next */ []);
6479
6519
  classes = computed(() => [
6480
6520
  ROW$1,
6481
6521
  this.interactive() ? INTERACTIVE$1 : ACTION$1[this.actionState()],
@@ -6544,6 +6584,13 @@ var BfListItemComponent = class BfListItemComponent {
6544
6584
  isSignal: true,
6545
6585
  isRequired: false,
6546
6586
  transformFunction: null
6587
+ },
6588
+ unread: {
6589
+ classPropertyName: "unread",
6590
+ publicName: "unread",
6591
+ isSignal: true,
6592
+ isRequired: false,
6593
+ transformFunction: null
6547
6594
  }
6548
6595
  },
6549
6596
  outputs: { clicked: "clicked" },
@@ -6571,11 +6618,20 @@ var BfListItemComponent = class BfListItemComponent {
6571
6618
  }
6572
6619
  <ng-template #content>
6573
6620
  <ng-content select="[bfSlot=leading]" />
6574
- <span class="flex min-w-0 flex-1 flex-col">
6621
+ <span class="relative flex min-w-0 flex-1 flex-col">
6622
+ @if (unreadId(); as id) {
6623
+ <!-- Read before the title; with a bfAction the link's name takes it (aria-labelledby),
6624
+ so the text itself is hidden from the tree to be read once. -->
6625
+ <span [class]="unreadDot"
6626
+ ><span [id]="id" class="sr-only" [attr.aria-hidden]="hasAction() ? 'true' : null"
6627
+ >{{ labels.listItemUnread }},
6628
+ </span></span
6629
+ >
6630
+ }
6575
6631
  @if (title()) {
6576
- <span class="text-label font-bold {{ textClasses() }}">{{ title() }}</span>
6632
+ <span class="text-label {{ titleWeight() }} {{ textClasses() }}">{{ title() }}</span>
6577
6633
  }
6578
- <span class="text-label font-bold empty:hidden {{ textClasses() }}"
6634
+ <span class="text-label {{ titleWeight() }} empty:hidden {{ textClasses() }}"
6579
6635
  ><ng-content select="[bfSlot=title]"
6580
6636
  /></span>
6581
6637
  @if (subtitle()) {
@@ -6635,11 +6691,20 @@ i0.ɵɵngDeclareClassMetadata({
6635
6691
  }
6636
6692
  <ng-template #content>
6637
6693
  <ng-content select="[bfSlot=leading]" />
6638
- <span class="flex min-w-0 flex-1 flex-col">
6694
+ <span class="relative flex min-w-0 flex-1 flex-col">
6695
+ @if (unreadId(); as id) {
6696
+ <!-- Read before the title; with a bfAction the link's name takes it (aria-labelledby),
6697
+ so the text itself is hidden from the tree to be read once. -->
6698
+ <span [class]="unreadDot"
6699
+ ><span [id]="id" class="sr-only" [attr.aria-hidden]="hasAction() ? 'true' : null"
6700
+ >{{ labels.listItemUnread }},
6701
+ </span></span
6702
+ >
6703
+ }
6639
6704
  @if (title()) {
6640
- <span class="text-label font-bold {{ textClasses() }}">{{ title() }}</span>
6705
+ <span class="text-label {{ titleWeight() }} {{ textClasses() }}">{{ title() }}</span>
6641
6706
  }
6642
- <span class="text-label font-bold empty:hidden {{ textClasses() }}"
6707
+ <span class="text-label {{ titleWeight() }} empty:hidden {{ textClasses() }}"
6643
6708
  ><ng-content select="[bfSlot=title]"
6644
6709
  /></span>
6645
6710
  @if (subtitle()) {
@@ -6704,6 +6769,14 @@ i0.ɵɵngDeclareClassMetadata({
6704
6769
  required: false
6705
6770
  }]
6706
6771
  }],
6772
+ unread: [{
6773
+ type: i0.Input,
6774
+ args: [{
6775
+ isSignal: true,
6776
+ alias: "unread",
6777
+ required: false
6778
+ }]
6779
+ }],
6707
6780
  clicked: [{
6708
6781
  type: i0.Output,
6709
6782
  args: ["clicked"]
@@ -6892,7 +6965,7 @@ const SIZE$1 = {
6892
6965
  sm: "h-2",
6893
6966
  md: "h-2.5"
6894
6967
  };
6895
- const TONE = {
6968
+ const TONE$1 = {
6896
6969
  primary: "[&::-webkit-progress-value]:bg-primary-strong [&::-moz-progress-bar]:bg-primary-strong",
6897
6970
  success: "[&::-webkit-progress-value]:bg-success [&::-moz-progress-bar]:bg-success",
6898
6971
  warning: "[&::-webkit-progress-value]:bg-warning [&::-moz-progress-bar]:bg-warning",
@@ -6920,7 +6993,7 @@ var BfProgressComponent = class BfProgressComponent {
6920
6993
  if (raw === void 0 || !Number.isFinite(raw)) return 0;
6921
6994
  return Math.min(100, Math.max(0, Math.round(raw)));
6922
6995
  }, ...ngDevMode ? [{ debugName: "percent" }] : /* istanbul ignore next */ []);
6923
- classes = computed(() => `${TRACK} ${SIZE$1[this.size()]} ${TONE[this.tone()]}`, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
6996
+ classes = computed(() => `${TRACK} ${SIZE$1[this.size()]} ${TONE$1[this.tone()]}`, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
6924
6997
  stripeClasses = computed(() => `${STRIPE} ${STRIPE_TONE[this.tone()]}`, ...ngDevMode ? [{ debugName: "stripeClasses" }] : /* istanbul ignore next */ []);
6925
6998
  static ɵfac = i0.ɵɵngDeclareFactory({
6926
6999
  minVersion: "12.0.0",
@@ -8263,6 +8336,20 @@ var BfActionDirective = class BfActionDirective {
8263
8336
  host = inject(BF_ACTION_HOST, { optional: true });
8264
8337
  element = inject(ElementRef).nativeElement;
8265
8338
  constructor() {
8339
+ const own = this.element.getAttribute("aria-labelledby");
8340
+ let prefixed = false;
8341
+ afterRenderEffect({ write: () => {
8342
+ const prefix = this.host?.actionLabelPrefix?.() ?? null;
8343
+ if (prefix) {
8344
+ this.element.id ||= uniqueId("bf-action");
8345
+ this.element.setAttribute("aria-labelledby", `${prefix} ${own ?? this.element.id}`);
8346
+ prefixed = true;
8347
+ } else if (prefixed) {
8348
+ if (own === null) this.element.removeAttribute("aria-labelledby");
8349
+ else this.element.setAttribute("aria-labelledby", own);
8350
+ prefixed = false;
8351
+ }
8352
+ } });
8266
8353
  const unregister = this.host?.registerAction();
8267
8354
  inject(DestroyRef).onDestroy(() => {
8268
8355
  this.host?.setActionFocusVisible(false);
@@ -9219,7 +9306,13 @@ const BODY_TOUCH = {
9219
9306
  };
9220
9307
  const ALIGN = {
9221
9308
  start: "text-start",
9222
- end: "text-end tabular-nums"
9309
+ end: "text-end tabular-nums",
9310
+ center: "text-center"
9311
+ };
9312
+ const CENTER_CELL = {
9313
+ never: "[&>*]:mx-auto [&>*]:w-fit",
9314
+ narrow: "@min-xl:[&>*]:mx-auto [&>*]:w-fit @max-xl:items-center",
9315
+ coarse: "not-pointer-coarse:[&>*]:mx-auto [&>*]:w-fit pointer-coarse:items-center"
9223
9316
  };
9224
9317
  const HEAD_BASE = "px-3 py-0 align-middle text-label-xs font-bold text-text-muted";
9225
9318
  const BODY_BASE = "px-3 align-middle font-medium text-text";
@@ -9308,8 +9401,13 @@ const STACK_FIRST_CELL = {
9308
9401
  };
9309
9402
  const STACK_CELL = {
9310
9403
  never: "",
9311
- narrow: "@max-xl:col-span-full @max-xl:flex @max-xl:h-auto @max-xl:items-baseline @max-xl:justify-between @max-xl:gap-3 @max-xl:px-0 @max-xl:py-1 @max-xl:text-end @max-xl:before:shrink-0 @max-xl:before:text-start @max-xl:before:text-label-xs @max-xl:before:font-bold @max-xl:before:text-text-muted @max-xl:before:content-data-label",
9312
- coarse: "pointer-coarse:col-span-full pointer-coarse:flex pointer-coarse:h-auto pointer-coarse:items-baseline pointer-coarse:justify-between pointer-coarse:gap-3 pointer-coarse:px-0 pointer-coarse:py-1 pointer-coarse:text-end pointer-coarse:before:shrink-0 pointer-coarse:before:text-start pointer-coarse:before:text-label-xs pointer-coarse:before:font-bold pointer-coarse:before:text-text-muted pointer-coarse:before:content-data-label"
9404
+ narrow: "@max-xl:col-span-full @max-xl:flex @max-xl:h-auto @max-xl:justify-between @max-xl:gap-3 @max-xl:px-0 @max-xl:py-1 @max-xl:text-end @max-xl:before:shrink-0 @max-xl:before:text-start @max-xl:before:text-label-xs @max-xl:before:font-bold @max-xl:before:text-text-muted @max-xl:before:content-data-label",
9405
+ coarse: "pointer-coarse:col-span-full pointer-coarse:flex pointer-coarse:h-auto pointer-coarse:justify-between pointer-coarse:gap-3 pointer-coarse:px-0 pointer-coarse:py-1 pointer-coarse:text-end pointer-coarse:before:shrink-0 pointer-coarse:before:text-start pointer-coarse:before:text-label-xs pointer-coarse:before:font-bold pointer-coarse:before:text-text-muted pointer-coarse:before:content-data-label"
9406
+ };
9407
+ const STACK_CELL_BASELINE = {
9408
+ never: "",
9409
+ narrow: "@max-xl:items-baseline",
9410
+ coarse: "pointer-coarse:items-baseline"
9313
9411
  };
9314
9412
  const SORT_NONE = "";
9315
9413
  const STACK_EMPTY = {
@@ -9398,8 +9496,11 @@ var BfTableComponent = class BfTableComponent {
9398
9496
  return `${HEAD_BASE} ${HEAD_CELL[this.resolvedSize()]} ${ALIGN[column.align ?? "start"]}`;
9399
9497
  }
9400
9498
  bodyClasses(column, first) {
9401
- const stacked = (first ? STACK_FIRST_CELL : STACK_CELL)[this.stack()];
9402
- return `${BODY_BASE} ${this.bodyHeight()} ${ALIGN[column.align ?? "start"]} ${stacked}`.trim();
9499
+ const stack = this.stack();
9500
+ const align = column.align ?? "start";
9501
+ const center = align === "center" ? CENTER_CELL[stack] : "";
9502
+ const stacked = first ? STACK_FIRST_CELL[stack] : `${STACK_CELL[stack]} ${center ? "" : STACK_CELL_BASELINE[stack]}`;
9503
+ return `${BODY_BASE} ${this.bodyHeight()} ${ALIGN[align]} ${center} ${stacked}`.replace(/\s+/g, " ").trim();
9403
9504
  }
9404
9505
  rowClasses(key) {
9405
9506
  const state = this.selectedKeys().has(key) ? "selected" : this.selectable() ? "selectable" : "static";
@@ -10408,6 +10509,320 @@ i0.ɵɵngDeclareClassMetadata({
10408
10509
  }]
10409
10510
  }
10410
10511
  });
10512
+ const TIMELINE_TIME_FORMAT = {
10513
+ dateStyle: "medium",
10514
+ timeStyle: "short"
10515
+ };
10516
+ const BF_TIMELINE = new InjectionToken("BF_TIMELINE");
10517
+ var BfTimelineComponent = class BfTimelineComponent {
10518
+ label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
10519
+ timeFormat = input(TIMELINE_TIME_FORMAT, ...ngDevMode ? [{ debugName: "timeFormat" }] : /* istanbul ignore next */ []);
10520
+ locale = input("", ...ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []);
10521
+ static ɵfac = i0.ɵɵngDeclareFactory({
10522
+ minVersion: "12.0.0",
10523
+ version: "22.1.7",
10524
+ ngImport: i0,
10525
+ type: BfTimelineComponent,
10526
+ deps: [],
10527
+ target: i0.ɵɵFactoryTarget.Component
10528
+ });
10529
+ static ɵcmp = i0.ɵɵngDeclareComponent({
10530
+ minVersion: "17.1.0",
10531
+ version: "22.1.7",
10532
+ type: BfTimelineComponent,
10533
+ isStandalone: true,
10534
+ selector: "bf-timeline",
10535
+ inputs: {
10536
+ label: {
10537
+ classPropertyName: "label",
10538
+ publicName: "label",
10539
+ isSignal: true,
10540
+ isRequired: false,
10541
+ transformFunction: null
10542
+ },
10543
+ timeFormat: {
10544
+ classPropertyName: "timeFormat",
10545
+ publicName: "timeFormat",
10546
+ isSignal: true,
10547
+ isRequired: false,
10548
+ transformFunction: null
10549
+ },
10550
+ locale: {
10551
+ classPropertyName: "locale",
10552
+ publicName: "locale",
10553
+ isSignal: true,
10554
+ isRequired: false,
10555
+ transformFunction: null
10556
+ }
10557
+ },
10558
+ host: { classAttribute: "block" },
10559
+ providers: [{
10560
+ provide: BF_TIMELINE,
10561
+ useExisting: BfTimelineComponent
10562
+ }],
10563
+ ngImport: i0,
10564
+ template: `<div role="list" class="flex flex-col" [attr.aria-label]="label() || null">
10565
+ <ng-content />
10566
+ </div>`,
10567
+ isInline: true
10568
+ });
10569
+ };
10570
+ i0.ɵɵngDeclareClassMetadata({
10571
+ minVersion: "12.0.0",
10572
+ version: "22.1.7",
10573
+ ngImport: i0,
10574
+ type: BfTimelineComponent,
10575
+ decorators: [{
10576
+ type: Component,
10577
+ args: [{
10578
+ selector: "bf-timeline",
10579
+ host: { class: "block" },
10580
+ providers: [{
10581
+ provide: BF_TIMELINE,
10582
+ useExisting: BfTimelineComponent
10583
+ }],
10584
+ template: `<div role="list" class="flex flex-col" [attr.aria-label]="label() || null">
10585
+ <ng-content />
10586
+ </div>`
10587
+ }]
10588
+ }],
10589
+ propDecorators: {
10590
+ label: [{
10591
+ type: i0.Input,
10592
+ args: [{
10593
+ isSignal: true,
10594
+ alias: "label",
10595
+ required: false
10596
+ }]
10597
+ }],
10598
+ timeFormat: [{
10599
+ type: i0.Input,
10600
+ args: [{
10601
+ isSignal: true,
10602
+ alias: "timeFormat",
10603
+ required: false
10604
+ }]
10605
+ }],
10606
+ locale: [{
10607
+ type: i0.Input,
10608
+ args: [{
10609
+ isSignal: true,
10610
+ alias: "locale",
10611
+ required: false
10612
+ }]
10613
+ }]
10614
+ }
10615
+ });
10616
+ const TONE = {
10617
+ neutral: "bg-text-subtle",
10618
+ primary: "bg-primary",
10619
+ success: "bg-success",
10620
+ warning: "bg-warning",
10621
+ danger: "bg-danger",
10622
+ info: "bg-info"
10623
+ };
10624
+ const DOT = "relative mt-[calc(0.75rem-5px)] size-2.5 shrink-0 rounded-control forced-colors:bg-[CanvasText]";
10625
+ const MARKER$1 = "relative flex w-2.5 shrink-0 justify-center before:absolute before:top-3 before:-bottom-3 before:start-[calc(50%-0.5px)] before:border-s before:border-border before:content-[''] group-last/bf-timeline-event:before:hidden";
10626
+ const TEXT = "text-body text-text wrap-anywhere [&_a]:rounded-tile [&_a]:text-primary-text [&_a]:underline [&_a]:underline-offset-2 [&_a]:hover:decoration-2 [&_a]:focus-visible:ring-4 [&_a]:focus-visible:ring-ring [&_a]:focus-visible:outline-hidden";
10627
+ function toDate(time) {
10628
+ if (time === null || time === "") return null;
10629
+ const date = typeof time === "string" ? new Date(time) : time;
10630
+ return Number.isNaN(date.getTime()) ? null : date;
10631
+ }
10632
+ function formatDate(date, locales, options) {
10633
+ for (const locale of locales) for (const format of [options, TIMELINE_TIME_FORMAT]) try {
10634
+ return new Intl.DateTimeFormat(locale, format).format(date);
10635
+ } catch {}
10636
+ return "";
10637
+ }
10638
+ var BfTimelineEventComponent = class BfTimelineEventComponent {
10639
+ actor = input("", ...ngDevMode ? [{ debugName: "actor" }] : /* istanbul ignore next */ []);
10640
+ time = input(null, ...ngDevMode ? [{ debugName: "time" }] : /* istanbul ignore next */ []);
10641
+ timeText = input("", ...ngDevMode ? [{ debugName: "timeText" }] : /* istanbul ignore next */ []);
10642
+ tone = input("neutral", ...ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []);
10643
+ timeline = inject(BF_TIMELINE, { optional: true });
10644
+ appLocale = inject(LOCALE_ID);
10645
+ role = this.timeline ? "listitem" : null;
10646
+ date = computed(() => toDate(this.time()), ...ngDevMode ? [{ debugName: "date" }] : /* istanbul ignore next */ []);
10647
+ datetime = computed(() => {
10648
+ const date = this.date();
10649
+ if (!date) return null;
10650
+ const time = this.time();
10651
+ return typeof time === "string" ? time : date.toISOString();
10652
+ }, ...ngDevMode ? [{ debugName: "datetime" }] : /* istanbul ignore next */ []);
10653
+ timeLabel = computed(() => {
10654
+ const date = this.date();
10655
+ if (this.timeText()) return this.timeText();
10656
+ if (!date) return "";
10657
+ return formatDate(date, [
10658
+ this.timeline?.locale() ?? "",
10659
+ this.appLocale,
10660
+ "en"
10661
+ ].filter(Boolean), this.timeline?.timeFormat() ?? TIMELINE_TIME_FORMAT);
10662
+ }, ...ngDevMode ? [{ debugName: "timeLabel" }] : /* istanbul ignore next */ []);
10663
+ markerClasses = MARKER$1;
10664
+ textClasses = TEXT;
10665
+ dotClasses = computed(() => `${DOT} ${TONE[this.tone()]}`, ...ngDevMode ? [{ debugName: "dotClasses" }] : /* istanbul ignore next */ []);
10666
+ static ɵfac = i0.ɵɵngDeclareFactory({
10667
+ minVersion: "12.0.0",
10668
+ version: "22.1.7",
10669
+ ngImport: i0,
10670
+ type: BfTimelineEventComponent,
10671
+ deps: [],
10672
+ target: i0.ɵɵFactoryTarget.Component
10673
+ });
10674
+ static ɵcmp = i0.ɵɵngDeclareComponent({
10675
+ minVersion: "17.0.0",
10676
+ version: "22.1.7",
10677
+ type: BfTimelineEventComponent,
10678
+ isStandalone: true,
10679
+ selector: "bf-timeline-event",
10680
+ inputs: {
10681
+ actor: {
10682
+ classPropertyName: "actor",
10683
+ publicName: "actor",
10684
+ isSignal: true,
10685
+ isRequired: false,
10686
+ transformFunction: null
10687
+ },
10688
+ time: {
10689
+ classPropertyName: "time",
10690
+ publicName: "time",
10691
+ isSignal: true,
10692
+ isRequired: false,
10693
+ transformFunction: null
10694
+ },
10695
+ timeText: {
10696
+ classPropertyName: "timeText",
10697
+ publicName: "timeText",
10698
+ isSignal: true,
10699
+ isRequired: false,
10700
+ transformFunction: null
10701
+ },
10702
+ tone: {
10703
+ classPropertyName: "tone",
10704
+ publicName: "tone",
10705
+ isSignal: true,
10706
+ isRequired: false,
10707
+ transformFunction: null
10708
+ }
10709
+ },
10710
+ host: {
10711
+ properties: { "attr.role": "role" },
10712
+ classAttribute: "group/bf-timeline-event flex gap-3"
10713
+ },
10714
+ ngImport: i0,
10715
+ template: `
10716
+ <span aria-hidden="true" [class]="markerClasses"><span [class]="dotClasses()"></span></span>
10717
+ <!-- The end slot wraps under the text once the text would get narrower than 16rem. -->
10718
+ <div
10719
+ class="flex min-w-0 flex-1 flex-wrap items-start gap-x-3 gap-y-2 pb-5 group-last/bf-timeline-event:pb-0"
10720
+ >
10721
+ <div class="min-w-0 flex-[1_1_16rem]">
10722
+ <div [class]="textClasses"><ng-content /></div>
10723
+ @if (actor() || timeLabel()) {
10724
+ <p class="text-caption text-text-muted mt-0.5 wrap-anywhere">
10725
+ @if (actor()) {
10726
+ <span>{{ actor() }}</span>
10727
+ }
10728
+ @if (actor() && timeLabel()) {
10729
+ <span aria-hidden="true"> · </span>
10730
+ }
10731
+ @if (datetime(); as machine) {
10732
+ <time [attr.datetime]="machine">{{ timeLabel() }}</time>
10733
+ } @else if (timeLabel()) {
10734
+ <span>{{ timeLabel() }}</span>
10735
+ }
10736
+ </p>
10737
+ }
10738
+ </div>
10739
+ <div class="flex shrink-0 items-center gap-2 empty:hidden">
10740
+ <ng-content select="[bfSlot=end]" />
10741
+ </div>
10742
+ </div>
10743
+ `,
10744
+ isInline: true
10745
+ });
10746
+ };
10747
+ i0.ɵɵngDeclareClassMetadata({
10748
+ minVersion: "12.0.0",
10749
+ version: "22.1.7",
10750
+ ngImport: i0,
10751
+ type: BfTimelineEventComponent,
10752
+ decorators: [{
10753
+ type: Component,
10754
+ args: [{
10755
+ selector: "bf-timeline-event",
10756
+ host: {
10757
+ class: "group/bf-timeline-event flex gap-3",
10758
+ "[attr.role]": "role"
10759
+ },
10760
+ template: `
10761
+ <span aria-hidden="true" [class]="markerClasses"><span [class]="dotClasses()"></span></span>
10762
+ <!-- The end slot wraps under the text once the text would get narrower than 16rem. -->
10763
+ <div
10764
+ class="flex min-w-0 flex-1 flex-wrap items-start gap-x-3 gap-y-2 pb-5 group-last/bf-timeline-event:pb-0"
10765
+ >
10766
+ <div class="min-w-0 flex-[1_1_16rem]">
10767
+ <div [class]="textClasses"><ng-content /></div>
10768
+ @if (actor() || timeLabel()) {
10769
+ <p class="text-caption text-text-muted mt-0.5 wrap-anywhere">
10770
+ @if (actor()) {
10771
+ <span>{{ actor() }}</span>
10772
+ }
10773
+ @if (actor() && timeLabel()) {
10774
+ <span aria-hidden="true"> · </span>
10775
+ }
10776
+ @if (datetime(); as machine) {
10777
+ <time [attr.datetime]="machine">{{ timeLabel() }}</time>
10778
+ } @else if (timeLabel()) {
10779
+ <span>{{ timeLabel() }}</span>
10780
+ }
10781
+ </p>
10782
+ }
10783
+ </div>
10784
+ <div class="flex shrink-0 items-center gap-2 empty:hidden">
10785
+ <ng-content select="[bfSlot=end]" />
10786
+ </div>
10787
+ </div>
10788
+ `
10789
+ }]
10790
+ }],
10791
+ propDecorators: {
10792
+ actor: [{
10793
+ type: i0.Input,
10794
+ args: [{
10795
+ isSignal: true,
10796
+ alias: "actor",
10797
+ required: false
10798
+ }]
10799
+ }],
10800
+ time: [{
10801
+ type: i0.Input,
10802
+ args: [{
10803
+ isSignal: true,
10804
+ alias: "time",
10805
+ required: false
10806
+ }]
10807
+ }],
10808
+ timeText: [{
10809
+ type: i0.Input,
10810
+ args: [{
10811
+ isSignal: true,
10812
+ alias: "timeText",
10813
+ required: false
10814
+ }]
10815
+ }],
10816
+ tone: [{
10817
+ type: i0.Input,
10818
+ args: [{
10819
+ isSignal: true,
10820
+ alias: "tone",
10821
+ required: false
10822
+ }]
10823
+ }]
10824
+ }
10825
+ });
10411
10826
  const BF_BREADCRUMB = new InjectionToken("BF_BREADCRUMB");
10412
10827
  const CONTENT = {
10413
10828
  ancestor: "inline-flex min-w-0 items-center px-1 wrap-anywhere text-text-muted [&>a]:-mx-1 [&>a]:inline-flex [&>a]:min-h-6 [&>a]:items-center [&>a]:rounded-tile [&>a]:px-1 [&>a]:text-text-muted [&>a]:underline-offset-4 [&>a]:transition-colors [&>a]:hover:text-text [&>a]:hover:underline [&>a]:focus-visible:ring-4 [&>a]:focus-visible:ring-ring [&>a]:focus-visible:outline-hidden [&>a]:pointer-coarse:min-h-hit",
@@ -11424,7 +11839,7 @@ const HOST = {
11424
11839
  rect: `${BAR} block h-[var(--bf-skeleton-height,6rem)] rounded-field`,
11425
11840
  circle: `${BAR} inline-block size-10 shrink-0 rounded-full`
11426
11841
  };
11427
- const LINE = `${BAR} block h-[var(--bf-skeleton-height,0.75rem)] w-full rounded-full`;
11842
+ const LINE$1 = `${BAR} block h-[var(--bf-skeleton-height,0.75rem)] w-full rounded-full`;
11428
11843
  const LAST_LINE = `${BAR} block h-[var(--bf-skeleton-height,0.75rem)] w-3/5 rounded-full`;
11429
11844
  var BfSkeletonComponent = class BfSkeletonComponent {
11430
11845
  shape = input("text", ...ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []);
@@ -11434,7 +11849,7 @@ var BfSkeletonComponent = class BfSkeletonComponent {
11434
11849
  });
11435
11850
  width = input("", ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
11436
11851
  height = input("", ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
11437
- lineClasses = LINE;
11852
+ lineClasses = LINE$1;
11438
11853
  lastLineClasses = LAST_LINE;
11439
11854
  lineList = computed(() => {
11440
11855
  const count = Math.max(1, Math.floor(this.lines()) || 1);
@@ -13338,6 +13753,241 @@ i0.ɵɵngDeclareClassMetadata({
13338
13753
  }]
13339
13754
  }
13340
13755
  });
13756
+ const BF_STEPS = new InjectionToken("BF_STEPS");
13757
+ const MARKER = "flex size-6 shrink-0 items-center justify-center rounded-full bg-primary-soft text-label-sm font-bold text-primary-strong forced-colors:outline forced-colors:outline-[CanvasText]";
13758
+ const LINE = "my-1 w-0 flex-1 border-s border-border group-last/bf-step:hidden";
13759
+ const TITLE = "pt-0.5 text-label font-bold text-text wrap-anywhere";
13760
+ var BfStepComponent = class BfStepComponent {
13761
+ steps = inject(BF_STEPS, { optional: true });
13762
+ title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
13763
+ headingLevel = input(void 0, ...ngDevMode ? [{ debugName: "headingLevel" }] : /* istanbul ignore next */ []);
13764
+ role = this.steps ? "listitem" : null;
13765
+ markerClasses = MARKER;
13766
+ lineClasses = LINE;
13767
+ titleClasses = TITLE;
13768
+ number = computed(() => {
13769
+ const steps = this.steps;
13770
+ return steps ? steps.start() + Math.max(steps.indexOf(this), 0) : 1;
13771
+ }, ...ngDevMode ? [{ debugName: "number" }] : /* istanbul ignore next */ []);
13772
+ positionInSet = computed(() => this.steps && this.steps.start() !== 1 ? this.number() : null, ...ngDevMode ? [{ debugName: "positionInSet" }] : /* istanbul ignore next */ []);
13773
+ setSize = computed(() => {
13774
+ const steps = this.steps;
13775
+ return steps && steps.start() !== 1 ? steps.start() - 1 + steps.count() : null;
13776
+ }, ...ngDevMode ? [{ debugName: "setSize" }] : /* istanbul ignore next */ []);
13777
+ static ɵfac = i0.ɵɵngDeclareFactory({
13778
+ minVersion: "12.0.0",
13779
+ version: "22.1.7",
13780
+ ngImport: i0,
13781
+ type: BfStepComponent,
13782
+ deps: [],
13783
+ target: i0.ɵɵFactoryTarget.Component
13784
+ });
13785
+ static ɵcmp = i0.ɵɵngDeclareComponent({
13786
+ minVersion: "17.0.0",
13787
+ version: "22.1.7",
13788
+ type: BfStepComponent,
13789
+ isStandalone: true,
13790
+ selector: "bf-step",
13791
+ inputs: {
13792
+ title: {
13793
+ classPropertyName: "title",
13794
+ publicName: "title",
13795
+ isSignal: true,
13796
+ isRequired: false,
13797
+ transformFunction: null
13798
+ },
13799
+ headingLevel: {
13800
+ classPropertyName: "headingLevel",
13801
+ publicName: "headingLevel",
13802
+ isSignal: true,
13803
+ isRequired: false,
13804
+ transformFunction: null
13805
+ }
13806
+ },
13807
+ host: {
13808
+ properties: {
13809
+ "attr.role": "role",
13810
+ "attr.aria-posinset": "positionInSet()",
13811
+ "attr.aria-setsize": "setSize()"
13812
+ },
13813
+ classAttribute: "group/bf-step block"
13814
+ },
13815
+ ngImport: i0,
13816
+ template: `
13817
+ <div class="flex gap-3">
13818
+ <div class="flex shrink-0 flex-col items-center">
13819
+ <span aria-hidden="true" [class]="markerClasses">{{ number() }}</span>
13820
+ <span [class]="lineClasses"></span>
13821
+ </div>
13822
+ <div class="min-w-0 flex-1 pb-6 group-last/bf-step:pb-0">
13823
+ @if (title()) {
13824
+ @switch (headingLevel()) {
13825
+ @case (2) {
13826
+ <h2 [class]="titleClasses">{{ title() }}</h2>
13827
+ }
13828
+ @case (3) {
13829
+ <h3 [class]="titleClasses">{{ title() }}</h3>
13830
+ }
13831
+ @case (4) {
13832
+ <h4 [class]="titleClasses">{{ title() }}</h4>
13833
+ }
13834
+ @default {
13835
+ <p [class]="titleClasses">{{ title() }}</p>
13836
+ }
13837
+ }
13838
+ }
13839
+ <div class="text-body text-text-secondary mt-1 wrap-anywhere empty:hidden">
13840
+ <ng-content />
13841
+ </div>
13842
+ </div>
13843
+ </div>
13844
+ `,
13845
+ isInline: true
13846
+ });
13847
+ };
13848
+ i0.ɵɵngDeclareClassMetadata({
13849
+ minVersion: "12.0.0",
13850
+ version: "22.1.7",
13851
+ ngImport: i0,
13852
+ type: BfStepComponent,
13853
+ decorators: [{
13854
+ type: Component,
13855
+ args: [{
13856
+ selector: "bf-step",
13857
+ host: {
13858
+ class: "group/bf-step block",
13859
+ "[attr.role]": "role",
13860
+ "[attr.aria-posinset]": "positionInSet()",
13861
+ "[attr.aria-setsize]": "setSize()"
13862
+ },
13863
+ template: `
13864
+ <div class="flex gap-3">
13865
+ <div class="flex shrink-0 flex-col items-center">
13866
+ <span aria-hidden="true" [class]="markerClasses">{{ number() }}</span>
13867
+ <span [class]="lineClasses"></span>
13868
+ </div>
13869
+ <div class="min-w-0 flex-1 pb-6 group-last/bf-step:pb-0">
13870
+ @if (title()) {
13871
+ @switch (headingLevel()) {
13872
+ @case (2) {
13873
+ <h2 [class]="titleClasses">{{ title() }}</h2>
13874
+ }
13875
+ @case (3) {
13876
+ <h3 [class]="titleClasses">{{ title() }}</h3>
13877
+ }
13878
+ @case (4) {
13879
+ <h4 [class]="titleClasses">{{ title() }}</h4>
13880
+ }
13881
+ @default {
13882
+ <p [class]="titleClasses">{{ title() }}</p>
13883
+ }
13884
+ }
13885
+ }
13886
+ <div class="text-body text-text-secondary mt-1 wrap-anywhere empty:hidden">
13887
+ <ng-content />
13888
+ </div>
13889
+ </div>
13890
+ </div>
13891
+ `
13892
+ }]
13893
+ }],
13894
+ propDecorators: {
13895
+ title: [{
13896
+ type: i0.Input,
13897
+ args: [{
13898
+ isSignal: true,
13899
+ alias: "title",
13900
+ required: false
13901
+ }]
13902
+ }],
13903
+ headingLevel: [{
13904
+ type: i0.Input,
13905
+ args: [{
13906
+ isSignal: true,
13907
+ alias: "headingLevel",
13908
+ required: false
13909
+ }]
13910
+ }]
13911
+ }
13912
+ });
13913
+ var BfStepsComponent = class BfStepsComponent {
13914
+ start = input(1, {
13915
+ ...ngDevMode ? { debugName: "start" } : /* istanbul ignore next */ {},
13916
+ transform: numberAttribute
13917
+ });
13918
+ steps = contentChildren(BfStepComponent, ...ngDevMode ? [{ debugName: "steps" }] : /* istanbul ignore next */ []);
13919
+ count = computed(() => this.steps().length, ...ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []);
13920
+ indexOf(step) {
13921
+ return this.steps().findIndex((item) => item === step);
13922
+ }
13923
+ static ɵfac = i0.ɵɵngDeclareFactory({
13924
+ minVersion: "12.0.0",
13925
+ version: "22.1.7",
13926
+ ngImport: i0,
13927
+ type: BfStepsComponent,
13928
+ deps: [],
13929
+ target: i0.ɵɵFactoryTarget.Component
13930
+ });
13931
+ static ɵcmp = i0.ɵɵngDeclareComponent({
13932
+ minVersion: "17.2.0",
13933
+ version: "22.1.7",
13934
+ type: BfStepsComponent,
13935
+ isStandalone: true,
13936
+ selector: "bf-steps",
13937
+ inputs: { start: {
13938
+ classPropertyName: "start",
13939
+ publicName: "start",
13940
+ isSignal: true,
13941
+ isRequired: false,
13942
+ transformFunction: null
13943
+ } },
13944
+ host: { classAttribute: "block" },
13945
+ providers: [{
13946
+ provide: BF_STEPS,
13947
+ useExisting: BfStepsComponent
13948
+ }],
13949
+ queries: [{
13950
+ propertyName: "steps",
13951
+ predicate: BfStepComponent,
13952
+ isSignal: true
13953
+ }],
13954
+ ngImport: i0,
13955
+ template: `<div role="list" class="flex flex-col"><ng-content /></div>`,
13956
+ isInline: true
13957
+ });
13958
+ };
13959
+ i0.ɵɵngDeclareClassMetadata({
13960
+ minVersion: "12.0.0",
13961
+ version: "22.1.7",
13962
+ ngImport: i0,
13963
+ type: BfStepsComponent,
13964
+ decorators: [{
13965
+ type: Component,
13966
+ args: [{
13967
+ selector: "bf-steps",
13968
+ host: { class: "block" },
13969
+ providers: [{
13970
+ provide: BF_STEPS,
13971
+ useExisting: BfStepsComponent
13972
+ }],
13973
+ template: `<div role="list" class="flex flex-col"><ng-content /></div>`
13974
+ }]
13975
+ }],
13976
+ propDecorators: {
13977
+ start: [{
13978
+ type: i0.Input,
13979
+ args: [{
13980
+ isSignal: true,
13981
+ alias: "start",
13982
+ required: false
13983
+ }]
13984
+ }],
13985
+ steps: [{
13986
+ type: i0.ContentChildren,
13987
+ args: [i0.forwardRef(() => BfStepComponent), { isSignal: true }]
13988
+ }]
13989
+ }
13990
+ });
13341
13991
  function resetBfDocument(document) {
13342
13992
  document.documentElement.classList.remove("dark", "cdk-global-scrollblock");
13343
13993
  for (const child of Array.from(document.body.children)) child.removeAttribute("inert");
@@ -13349,6 +13999,6 @@ function provideBfDocumentReset() {
13349
13999
  inject(DestroyRef).onDestroy(() => resetBfDocument(document));
13350
14000
  });
13351
14001
  }
13352
- export { BF_COLOR_SCHEME_STORAGE, BF_DEFAULTS, BF_DEFAULT_LABELS, BF_DEFAULT_VALUES, BF_LABELS, BF_SIDEBAR_STATE_STORAGE, BF_TAB_BAR, BF_TAB_BAR_CONTROLLER, BF_TAB_LINKS, BfActionBarComponent, BfActionDirective, BfAlertComponent, BfAppFrameComponent, BfAvatarComponent, BfBadgeComponent, BfBreadcrumbComponent, BfBreadcrumbItemComponent, BfButtonComponent, BfCalendarComponent, BfCardComponent, BfCheckboxComponent, BfChipComponent, BfChipGroupComponent, BfColorSchemeService, BfDescriptionItemComponent, BfDescriptionListComponent, BfEmptyStateComponent, BfFieldComponent, BfIconButtonComponent, BfInputComponent, BfListComponent, BfListItemComponent, BfNavGroupComponent, BfNavItemComponent, BfPageHeaderComponent, BfPaginationComponent, BfProgressComponent, BfRadioGroupComponent, BfSegmentedComponent, BfSelectComponent, BfSidebarComponent, BfSidebarStateService, BfSkeletonComponent, BfSpinnerComponent, BfStatComponent, BfTabBarComponent, BfTabComponent, BfTabGroupComponent, BfTabPanelComponent, BfTableCellDirective, BfTableComponent, BfTextareaComponent, BfThemeSwitchComponent, BfToggleComponent, BfToolbarComponent, BfTopNavComponent, bfFieldControlClass, bfValidationMessage, provideBfColorScheme, provideBfDefaults, provideBfLabels, provideBfSidebarState, BUTTON_CLASSES as ɵBF_BUTTON_CLASSES, ICON_BUTTON_CLASSES as ɵBF_ICON_BUTTON_CLASSES, BF_NAV as ɵBF_NAV, FIELD_BOX as ɵFIELD_BOX, FIELD_ICON_END as ɵFIELD_ICON_END, FIELD_ICON_START as ɵFIELD_ICON_START, FIELD_PADDING_END as ɵFIELD_PADDING_END, FIELD_PADDING_START as ɵFIELD_PADDING_START, PILL_HIT as ɵPILL_HIT, compareIso as ɵcompareIso, createMemoryColorSchemeStorage as ɵcreateMemoryColorSchemeStorage, daysInMonth as ɵdaysInMonth, fieldDescribedBy as ɵfieldDescribedBy, fieldErrorMessageId as ɵfieldErrorMessageId, fieldErrorText as ɵfieldErrorText, fieldShowsError as ɵfieldShowsError, formatIsoDate as ɵformatIsoDate, localIsoDate as ɵlocalIsoDate, parseIsoDate as ɵparseIsoDate, provideBfDocumentReset as ɵprovideBfDocumentReset, uniqueId as ɵuniqueId, validIsoDate as ɵvalidIsoDate };
14002
+ export { BF_COLOR_SCHEME_STORAGE, BF_DEFAULTS, BF_DEFAULT_LABELS, BF_DEFAULT_VALUES, BF_LABELS, BF_SIDEBAR_STATE_STORAGE, BF_TAB_BAR, BF_TAB_BAR_CONTROLLER, BF_TAB_LINKS, BfActionBarComponent, BfActionDirective, BfAlertComponent, BfAppFrameComponent, BfAvatarComponent, BfBadgeComponent, BfBreadcrumbComponent, BfBreadcrumbItemComponent, BfButtonComponent, BfCalendarComponent, BfCardComponent, BfCheckboxComponent, BfChipComponent, BfChipGroupComponent, BfColorSchemeService, BfDescriptionItemComponent, BfDescriptionListComponent, BfEmptyStateComponent, BfFieldComponent, BfIconButtonComponent, BfInputComponent, BfListComponent, BfListItemComponent, BfNavGroupComponent, BfNavItemComponent, BfPageHeaderComponent, BfPaginationComponent, BfProgressComponent, BfRadioGroupComponent, BfSegmentedComponent, BfSelectComponent, BfSidebarComponent, BfSidebarStateService, BfSkeletonComponent, BfSpinnerComponent, BfStatComponent, BfStepComponent, BfStepsComponent, BfTabBarComponent, BfTabComponent, BfTabGroupComponent, BfTabPanelComponent, BfTableCellDirective, BfTableComponent, BfTextareaComponent, BfThemeSwitchComponent, BfTimelineComponent, BfTimelineEventComponent, BfToggleComponent, BfToolbarComponent, BfTopNavComponent, bfFieldControlClass, bfValidationMessage, provideBfColorScheme, provideBfDefaults, provideBfLabels, provideBfSidebarState, BUTTON_CLASSES as ɵBF_BUTTON_CLASSES, ICON_BUTTON_CLASSES as ɵBF_ICON_BUTTON_CLASSES, BF_NAV as ɵBF_NAV, FIELD_BOX as ɵFIELD_BOX, FIELD_ICON_END as ɵFIELD_ICON_END, FIELD_ICON_START as ɵFIELD_ICON_START, FIELD_PADDING_END as ɵFIELD_PADDING_END, FIELD_PADDING_START as ɵFIELD_PADDING_START, PILL_HIT as ɵPILL_HIT, compareIso as ɵcompareIso, createMemoryColorSchemeStorage as ɵcreateMemoryColorSchemeStorage, daysInMonth as ɵdaysInMonth, fieldDescribedBy as ɵfieldDescribedBy, fieldErrorMessageId as ɵfieldErrorMessageId, fieldErrorText as ɵfieldErrorText, fieldShowsError as ɵfieldShowsError, formatIsoDate as ɵformatIsoDate, localIsoDate as ɵlocalIsoDate, parseIsoDate as ɵparseIsoDate, provideBfDocumentReset as ɵprovideBfDocumentReset, uniqueId as ɵuniqueId, validIsoDate as ɵvalidIsoDate };
13353
14003
 
13354
14004
  //# sourceMappingURL=bitforgehq-ui.mjs.map