@forgeroute/ui 0.3.13 → 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.
@@ -13891,6 +13891,8 @@ var AlertComponent = class AlertComponent {
13891
13891
  this.variant = input("info", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
13892
13892
  this.title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
13893
13893
  this.dismissible = input(false, ...ngDevMode ? [{ debugName: "dismissible" }] : /* istanbul ignore next */ []);
13894
+ this.quiet = input(false, ...ngDevMode ? [{ debugName: "quiet" }] : /* istanbul ignore next */ []);
13895
+ this.compact = input(false, ...ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []);
13894
13896
  this.dismissed = output();
13895
13897
  }
13896
13898
  static {
@@ -13931,12 +13933,26 @@ var AlertComponent = class AlertComponent {
13931
13933
  isSignal: true,
13932
13934
  isRequired: false,
13933
13935
  transformFunction: null
13936
+ },
13937
+ quiet: {
13938
+ classPropertyName: "quiet",
13939
+ publicName: "quiet",
13940
+ isSignal: true,
13941
+ isRequired: false,
13942
+ transformFunction: null
13943
+ },
13944
+ compact: {
13945
+ classPropertyName: "compact",
13946
+ publicName: "compact",
13947
+ isSignal: true,
13948
+ isRequired: false,
13949
+ transformFunction: null
13934
13950
  }
13935
13951
  },
13936
13952
  outputs: { dismissed: "dismissed" },
13937
13953
  ngImport: i0,
13938
13954
  template: `
13939
- <div class="alert" [class]="'alert alert--' + variant()" [attr.role]="variant() === 'danger' ? 'alert' : 'status'">
13955
+ <div class="alert" [class]="'alert alert--' + variant()" [class.alert--compact]="compact()" [attr.role]="quiet() ? null : (variant() === 'danger' ? 'alert' : 'status')">
13940
13956
  <div class="alert-content">
13941
13957
  @if (title()) { <div class="alert-title">{{ title() }}</div> }
13942
13958
  <div class="alert-body"><ng-content /></div>
@@ -13951,7 +13967,7 @@ var AlertComponent = class AlertComponent {
13951
13967
  </div>
13952
13968
  `,
13953
13969
  isInline: true,
13954
- styles: [":host{display:block}.alert{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-radius:8px;border-left:4px solid transparent;font-size:13px;line-height:1.5}.alert--info{background:#dbeafe;border-color:#3b82f6;color:#1e3a8a}.alert--success{background:#dcfce7;border-color:#22c55e;color:#14532d}.alert--warning{background:#ffedd5;border-color:#f97316;color:#7c2d12}.alert--danger{background:#fee2e2;border-color:#ef4444;color:#7f1d1d}.alert-content{flex:1;display:flex;flex-direction:column;gap:2px}.alert-title{font-weight:700}.alert-body{opacity:.9;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.alert-dismiss{flex-shrink:0;background:none;border:none;cursor:pointer;padding:2px;border-radius:4px;color:inherit;opacity:.6;display:flex;align-items:center;transition:opacity .15s}.alert-dismiss:hover{opacity:1}\n"],
13970
+ styles: [":host{display:block}.alert{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-radius:8px;border-left:4px solid transparent;font-size:13px;line-height:1.5}.alert--info{background:#dbeafe;border-color:#3b82f6;color:#1e3a8a}.alert--success{background:#dcfce7;border-color:#22c55e;color:#14532d}.alert--warning{background:#ffedd5;border-color:#f97316;color:#7c2d12}.alert--danger{background:#fee2e2;border-color:#ef4444;color:#7f1d1d}.alert--compact{padding:8px 12px;gap:8px;font-size:12.5px;line-height:1.4}.alert-content{flex:1;display:flex;flex-direction:column;gap:2px}.alert-title{font-weight:700}.alert-body{opacity:.9;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.alert-dismiss{flex-shrink:0;background:none;border:none;cursor:pointer;padding:2px;border-radius:4px;color:inherit;opacity:.6;display:flex;align-items:center;transition:opacity .15s}.alert-dismiss:hover{opacity:1}\n"],
13955
13971
  changeDetection: i0.ChangeDetectionStrategy.OnPush
13956
13972
  });
13957
13973
  }
@@ -13968,7 +13984,7 @@ i0.ɵɵngDeclareClassMetadata({
13968
13984
  standalone: true,
13969
13985
  changeDetection: ChangeDetectionStrategy.OnPush,
13970
13986
  template: `
13971
- <div class="alert" [class]="'alert alert--' + variant()" [attr.role]="variant() === 'danger' ? 'alert' : 'status'">
13987
+ <div class="alert" [class]="'alert alert--' + variant()" [class.alert--compact]="compact()" [attr.role]="quiet() ? null : (variant() === 'danger' ? 'alert' : 'status')">
13972
13988
  <div class="alert-content">
13973
13989
  @if (title()) { <div class="alert-title">{{ title() }}</div> }
13974
13990
  <div class="alert-body"><ng-content /></div>
@@ -13982,7 +13998,7 @@ i0.ɵɵngDeclareClassMetadata({
13982
13998
  }
13983
13999
  </div>
13984
14000
  `,
13985
- styles: [":host{display:block}.alert{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-radius:8px;border-left:4px solid transparent;font-size:13px;line-height:1.5}.alert--info{background:#dbeafe;border-color:#3b82f6;color:#1e3a8a}.alert--success{background:#dcfce7;border-color:#22c55e;color:#14532d}.alert--warning{background:#ffedd5;border-color:#f97316;color:#7c2d12}.alert--danger{background:#fee2e2;border-color:#ef4444;color:#7f1d1d}.alert-content{flex:1;display:flex;flex-direction:column;gap:2px}.alert-title{font-weight:700}.alert-body{opacity:.9;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.alert-dismiss{flex-shrink:0;background:none;border:none;cursor:pointer;padding:2px;border-radius:4px;color:inherit;opacity:.6;display:flex;align-items:center;transition:opacity .15s}.alert-dismiss:hover{opacity:1}\n"]
14001
+ styles: [":host{display:block}.alert{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-radius:8px;border-left:4px solid transparent;font-size:13px;line-height:1.5}.alert--info{background:#dbeafe;border-color:#3b82f6;color:#1e3a8a}.alert--success{background:#dcfce7;border-color:#22c55e;color:#14532d}.alert--warning{background:#ffedd5;border-color:#f97316;color:#7c2d12}.alert--danger{background:#fee2e2;border-color:#ef4444;color:#7f1d1d}.alert--compact{padding:8px 12px;gap:8px;font-size:12.5px;line-height:1.4}.alert-content{flex:1;display:flex;flex-direction:column;gap:2px}.alert-title{font-weight:700}.alert-body{opacity:.9;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.alert-dismiss{flex-shrink:0;background:none;border:none;cursor:pointer;padding:2px;border-radius:4px;color:inherit;opacity:.6;display:flex;align-items:center;transition:opacity .15s}.alert-dismiss:hover{opacity:1}\n"]
13986
14002
  }]
13987
14003
  }],
13988
14004
  propDecorators: {
@@ -14010,6 +14026,22 @@ i0.ɵɵngDeclareClassMetadata({
14010
14026
  required: false
14011
14027
  }]
14012
14028
  }],
14029
+ quiet: [{
14030
+ type: i0.Input,
14031
+ args: [{
14032
+ isSignal: true,
14033
+ alias: "quiet",
14034
+ required: false
14035
+ }]
14036
+ }],
14037
+ compact: [{
14038
+ type: i0.Input,
14039
+ args: [{
14040
+ isSignal: true,
14041
+ alias: "compact",
14042
+ required: false
14043
+ }]
14044
+ }],
14013
14045
  dismissed: [{
14014
14046
  type: i0.Output,
14015
14047
  args: ["dismissed"]
@@ -14563,7 +14595,9 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
14563
14595
  inputs: [
14564
14596
  "variant",
14565
14597
  "title",
14566
- "dismissible"
14598
+ "dismissible",
14599
+ "quiet",
14600
+ "compact"
14567
14601
  ],
14568
14602
  outputs: ["dismissed"]
14569
14603
  },
@@ -22845,7 +22879,9 @@ var SendEmailComponent = class SendEmailComponent {
22845
22879
  inputs: [
22846
22880
  "variant",
22847
22881
  "title",
22848
- "dismissible"
22882
+ "dismissible",
22883
+ "quiet",
22884
+ "compact"
22849
22885
  ],
22850
22886
  outputs: ["dismissed"]
22851
22887
  }
@@ -24463,7 +24499,9 @@ var SendTextComponent = class SendTextComponent {
24463
24499
  inputs: [
24464
24500
  "variant",
24465
24501
  "title",
24466
- "dismissible"
24502
+ "dismissible",
24503
+ "quiet",
24504
+ "compact"
24467
24505
  ],
24468
24506
  outputs: ["dismissed"]
24469
24507
  }
@@ -26546,6 +26584,108 @@ i0.ɵɵngDeclareClassMetadata({
26546
26584
  }]
26547
26585
  }
26548
26586
  });
26587
+ const SIZE_REM = {
26588
+ sm: "0.8125rem",
26589
+ md: "0.875rem",
26590
+ lg: "1rem"
26591
+ };
26592
+ var TextComponent = class TextComponent {
26593
+ constructor() {
26594
+ this.text = input("", ...ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []);
26595
+ this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
26596
+ this.tone = input("default", ...ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []);
26597
+ this.fontSize = computed(() => SIZE_REM[this.size()] ?? SIZE_REM.md, ...ngDevMode ? [{ debugName: "fontSize" }] : /* istanbul ignore next */ []);
26598
+ }
26599
+ static {
26600
+ this.ɵfac = i0.ɵɵngDeclareFactory({
26601
+ minVersion: "12.0.0",
26602
+ version: "22.2.2",
26603
+ ngImport: i0,
26604
+ type: TextComponent,
26605
+ deps: [],
26606
+ target: i0.ɵɵFactoryTarget.Component
26607
+ });
26608
+ }
26609
+ static {
26610
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
26611
+ minVersion: "17.1.0",
26612
+ version: "22.2.2",
26613
+ type: TextComponent,
26614
+ isStandalone: true,
26615
+ selector: "ui-text",
26616
+ inputs: {
26617
+ text: {
26618
+ classPropertyName: "text",
26619
+ publicName: "text",
26620
+ isSignal: true,
26621
+ isRequired: false,
26622
+ transformFunction: null
26623
+ },
26624
+ size: {
26625
+ classPropertyName: "size",
26626
+ publicName: "size",
26627
+ isSignal: true,
26628
+ isRequired: false,
26629
+ transformFunction: null
26630
+ },
26631
+ tone: {
26632
+ classPropertyName: "tone",
26633
+ publicName: "tone",
26634
+ isSignal: true,
26635
+ isRequired: false,
26636
+ transformFunction: null
26637
+ }
26638
+ },
26639
+ ngImport: i0,
26640
+ template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [style.font-size]="fontSize()">{{ text() }}</div>`,
26641
+ isInline: true,
26642
+ styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}\n"],
26643
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
26644
+ });
26645
+ }
26646
+ };
26647
+ i0.ɵɵngDeclareClassMetadata({
26648
+ minVersion: "12.0.0",
26649
+ version: "22.2.2",
26650
+ ngImport: i0,
26651
+ type: TextComponent,
26652
+ decorators: [{
26653
+ type: Component,
26654
+ args: [{
26655
+ selector: "ui-text",
26656
+ standalone: true,
26657
+ changeDetection: ChangeDetectionStrategy.OnPush,
26658
+ template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [style.font-size]="fontSize()">{{ text() }}</div>`,
26659
+ styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}\n"]
26660
+ }]
26661
+ }],
26662
+ propDecorators: {
26663
+ text: [{
26664
+ type: i0.Input,
26665
+ args: [{
26666
+ isSignal: true,
26667
+ alias: "text",
26668
+ required: false
26669
+ }]
26670
+ }],
26671
+ size: [{
26672
+ type: i0.Input,
26673
+ args: [{
26674
+ isSignal: true,
26675
+ alias: "size",
26676
+ required: false
26677
+ }]
26678
+ }],
26679
+ tone: [{
26680
+ type: i0.Input,
26681
+ args: [{
26682
+ isSignal: true,
26683
+ alias: "tone",
26684
+ required: false
26685
+ }]
26686
+ }]
26687
+ }
26688
+ });
26549
26689
  var ImagePreviewComponent = class ImagePreviewComponent {
26550
26690
  constructor() {
26551
26691
  this.src = input(null, ...ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []);
@@ -29733,6 +29873,21 @@ function provideForgerouteToast(options = {}) {
29733
29873
  });
29734
29874
  })]);
29735
29875
  }
29876
+ const LAYOUT_GAP_PX = {
29877
+ none: 0,
29878
+ xs: 4,
29879
+ sm: 8,
29880
+ md: 16,
29881
+ lg: 24,
29882
+ xl: 32
29883
+ };
29884
+ const CSS_LENGTH = /^(?:0|-?(?:\d+\.?\d*|\.\d+)(?:px|rem|em|%|vh|vw|ch)|(?:calc|var)\([^;{}]*\))$/i;
29885
+ function resolveLayoutGap(gap, fallback) {
29886
+ const v = (gap ?? "").trim();
29887
+ if (Object.prototype.hasOwnProperty.call(LAYOUT_GAP_PX, v)) return `${LAYOUT_GAP_PX[v]}px`;
29888
+ if (v && CSS_LENGTH.test(v)) return v;
29889
+ return `${LAYOUT_GAP_PX[fallback]}px`;
29890
+ }
29736
29891
  function reorderItems(items, order) {
29737
29892
  return order.map((i) => items[i]);
29738
29893
  }
@@ -29752,30 +29907,69 @@ function defaultLabel(item, index) {
29752
29907
  if (typeof item === "number") return String(item);
29753
29908
  return `Item ${index + 1}`;
29754
29909
  }
29910
+ const DEFAULT_GAP_LIST = "0px";
29911
+ const DEFAULT_GAP_GRID = "12px";
29912
+ let nextId$2 = 0;
29755
29913
  var ListComponent = class ListComponent {
29756
29914
  constructor() {
29757
29915
  this.host = inject(ElementRef);
29758
29916
  this.injector = inject(Injector);
29759
29917
  this.items = input([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
29760
29918
  this.ordered = input(false, ...ngDevMode ? [{ debugName: "ordered" }] : /* istanbul ignore next */ []);
29919
+ this.layout = input("list", ...ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []);
29920
+ this.gridMin = input(130, ...ngDevMode ? [{ debugName: "gridMin" }] : /* istanbul ignore next */ []);
29921
+ this.gap = input(void 0, ...ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []);
29761
29922
  this.reorderable = input(false, ...ngDevMode ? [{ debugName: "reorderable" }] : /* istanbul ignore next */ []);
29762
29923
  this.disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
29924
+ this.moveControls = input("auto", ...ngDevMode ? [{ debugName: "moveControls" }] : /* istanbul ignore next */ []);
29925
+ this.dragDrop = input("auto", ...ngDevMode ? [{ debugName: "dragDrop" }] : /* istanbul ignore next */ []);
29763
29926
  this.ariaLabel = input(void 0, ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
29764
29927
  this.ariaLabelledby = input(void 0, ...ngDevMode ? [{ debugName: "ariaLabelledby" }] : /* istanbul ignore next */ []);
29765
29928
  this.itemLabelFn = input(defaultLabel, ...ngDevMode ? [{ debugName: "itemLabelFn" }] : /* istanbul ignore next */ []);
29766
29929
  this.trackBy = input((item) => item, ...ngDevMode ? [{ debugName: "trackBy" }] : /* istanbul ignore next */ []);
29930
+ this.moveEarlierLabel = input(void 0, ...ngDevMode ? [{ debugName: "moveEarlierLabel" }] : /* istanbul ignore next */ []);
29931
+ this.moveLaterLabel = input(void 0, ...ngDevMode ? [{ debugName: "moveLaterLabel" }] : /* istanbul ignore next */ []);
29932
+ this.helpText = input("Hold Shift and press the arrow keys to move this item. Shift plus Home or End moves it to the start or end.", ...ngDevMode ? [{ debugName: "helpText" }] : /* istanbul ignore next */ []);
29933
+ this.moveAnnouncement = input((label, position, total) => `${label} moved to position ${position} of ${total}`, ...ngDevMode ? [{ debugName: "moveAnnouncement" }] : /* istanbul ignore next */ []);
29934
+ this.itemsChange = output();
29767
29935
  this.reorder = output();
29768
29936
  this.rowTemplate = contentChild(TemplateRef, ...ngDevMode ? [{ debugName: "rowTemplate" }] : /* istanbul ignore next */ []);
29937
+ this.helpId = `ul-help-${nextId$2++}`;
29769
29938
  this.announcement = signal("", ...ngDevMode ? [{ debugName: "announcement" }] : /* istanbul ignore next */ []);
29770
29939
  this.movedKey = signal(void 0, ...ngDevMode ? [{ debugName: "movedKey" }] : /* istanbul ignore next */ []);
29940
+ this.dragIndex = signal(null, ...ngDevMode ? [{ debugName: "dragIndex" }] : /* istanbul ignore next */ []);
29941
+ this.overIndex = signal(null, ...ngDevMode ? [{ debugName: "overIndex" }] : /* istanbul ignore next */ []);
29771
29942
  this.pendingFocus = null;
29772
29943
  this.announceSeq = 0;
29773
29944
  this.dupTokens = /* @__PURE__ */ new Map();
29945
+ this.isGrid = computed(() => this.layout() === "grid", ...ngDevMode ? [{ debugName: "isGrid" }] : /* istanbul ignore next */ []);
29946
+ this.canReorder = computed(() => this.reorderable() && !this.disabled(), ...ngDevMode ? [{ debugName: "canReorder" }] : /* istanbul ignore next */ []);
29947
+ this.showControls = computed(() => {
29948
+ if (!this.reorderable()) return false;
29949
+ const m = this.moveControls();
29950
+ return m === true || m === "auto" && !this.isGrid();
29951
+ }, ...ngDevMode ? [{ debugName: "showControls" }] : /* istanbul ignore next */ []);
29952
+ this.direct = computed(() => {
29953
+ if (!this.canReorder()) return false;
29954
+ const d = this.dragDrop();
29955
+ return d === true || d === "auto" && this.isGrid();
29956
+ }, ...ngDevMode ? [{ debugName: "direct" }] : /* istanbul ignore next */ []);
29957
+ this.gapCss = computed(() => {
29958
+ const fallback = this.isGrid() ? DEFAULT_GAP_GRID : DEFAULT_GAP_LIST;
29959
+ const g = this.gap();
29960
+ if (g == null || String(g).trim() === "") return fallback;
29961
+ const a = resolveLayoutGap(g, "none");
29962
+ return a === resolveLayoutGap(g, "xl") ? a : fallback;
29963
+ }, ...ngDevMode ? [{ debugName: "gapCss" }] : /* istanbul ignore next */ []);
29774
29964
  this.rows = computed(() => {
29775
29965
  const items = this.items();
29776
29966
  const n = items.length;
29777
29967
  const keyFn = this.trackBy();
29778
29968
  const labelFn = this.itemLabelFn();
29969
+ const grid = this.isGrid();
29970
+ const earlier = this.moveEarlierLabel();
29971
+ const later = this.moveLaterLabel();
29972
+ const dragging = this.dragIndex();
29779
29973
  const out = new Array(n);
29780
29974
  const seen = /* @__PURE__ */ new Map();
29781
29975
  const nextTokens = /* @__PURE__ */ new Map();
@@ -29795,14 +29989,18 @@ var ListComponent = class ListComponent {
29795
29989
  key,
29796
29990
  index: i,
29797
29991
  label,
29798
- upLabel: `Move ${label} up`,
29799
- downLabel: `Move ${label} down`,
29992
+ earlierLabel: earlier !== void 0 ? `${earlier} ${label}` : grid ? `Move earlier ${label}` : `Move ${label} up`,
29993
+ laterLabel: later !== void 0 ? `${later} ${label}` : grid ? `Move later ${label}` : `Move ${label} down`,
29800
29994
  first: i === 0,
29801
29995
  last: i === n - 1,
29996
+ dragging: dragging === i,
29802
29997
  ctx: {
29803
29998
  $implicit: item,
29804
29999
  index: i,
29805
- count: n
30000
+ count: n,
30001
+ first: i === 0,
30002
+ last: i === n - 1,
30003
+ dragging: dragging === i
29806
30004
  }
29807
30005
  };
29808
30006
  }
@@ -29810,23 +30008,52 @@ var ListComponent = class ListComponent {
29810
30008
  return out;
29811
30009
  }, ...ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []);
29812
30010
  }
29813
- canReorder() {
29814
- return this.reorderable() && !this.disabled();
29815
- }
29816
30011
  rowIndexOf(el, list) {
29817
30012
  const li = el?.closest(".ul-item") ?? null;
29818
30013
  if (!li || li.parentElement !== list) return -1;
29819
30014
  return Number(li.getAttribute("data-index"));
29820
30015
  }
30016
+ move(from, to) {
30017
+ return this.apply(from, to, null);
30018
+ }
29821
30019
  onKeydown(e) {
29822
- if (!e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return;
29823
- if (e.key !== "ArrowUp" && e.key !== "ArrowDown") return;
29824
- if (!this.canReorder()) return;
30020
+ if (!this.canReorder() || e.ctrlKey || e.metaKey) return;
30021
+ const list = e.currentTarget;
29825
30022
  const target = e.target;
29826
- if (target?.closest("input, textarea, select, [contenteditable=\"\"], [contenteditable=\"true\"]")) return;
29827
- const idx = this.rowIndexOf(target, e.currentTarget);
29828
- if (idx < 0) return;
29829
- if (this.move(idx, e.key === "ArrowUp" ? -1 : 1)) e.preventDefault();
30023
+ if (e.altKey && !e.shiftKey) {
30024
+ if (e.key !== "ArrowUp" && e.key !== "ArrowDown") return;
30025
+ if (target?.closest("input, textarea, select, [contenteditable=\"\"], [contenteditable=\"true\"]")) return;
30026
+ const idx = this.rowIndexOf(target, list);
30027
+ if (idx < 0) return;
30028
+ const onRow = this.direct() && target?.classList.contains("ul-item") === true;
30029
+ if (this.apply(idx, idx + (e.key === "ArrowUp" ? -1 : 1), onRow ? "row" : "button")) e.preventDefault();
30030
+ return;
30031
+ }
30032
+ if (e.shiftKey && !e.altKey && this.direct()) {
30033
+ if (!target?.classList.contains("ul-item")) return;
30034
+ const idx = this.rowIndexOf(target, list);
30035
+ if (idx < 0) return;
30036
+ let to;
30037
+ switch (e.key) {
30038
+ case "ArrowUp":
30039
+ case "ArrowLeft":
30040
+ to = idx - 1;
30041
+ break;
30042
+ case "ArrowDown":
30043
+ case "ArrowRight":
30044
+ to = idx + 1;
30045
+ break;
30046
+ case "Home":
30047
+ to = 0;
30048
+ break;
30049
+ case "End":
30050
+ to = this.rows().length - 1;
30051
+ break;
30052
+ default: return;
30053
+ }
30054
+ e.preventDefault();
30055
+ this.apply(idx, to, "row");
30056
+ }
29830
30057
  }
29831
30058
  onClick(e) {
29832
30059
  if (!this.canReorder()) return;
@@ -29835,34 +30062,75 @@ var ListComponent = class ListComponent {
29835
30062
  if (btn.querySelector("button")?.disabled) return;
29836
30063
  const idx = this.rowIndexOf(btn, e.currentTarget);
29837
30064
  if (idx < 0) return;
29838
- this.move(idx, btn.getAttribute("data-move") === "up" ? -1 : 1);
30065
+ const dir = btn.getAttribute("data-move") === "up" ? -1 : 1;
30066
+ this.apply(idx, idx + dir, "button");
29839
30067
  }
29840
30068
  onFocusOut(e) {
29841
30069
  if (this.pendingFocus) return;
29842
30070
  const next = e.relatedTarget;
29843
30071
  if (!next || !e.currentTarget.contains(next)) this.movedKey.set(void 0);
29844
30072
  }
29845
- move(from, dir) {
30073
+ onDragStart(e) {
30074
+ if (!this.direct()) return;
30075
+ const idx = this.rowIndexOf(e.target, e.currentTarget);
30076
+ if (idx < 0) return;
30077
+ this.dragIndex.set(idx);
30078
+ if (e.dataTransfer) {
30079
+ e.dataTransfer.effectAllowed = "move";
30080
+ e.dataTransfer.setData("text/plain", String(idx));
30081
+ }
30082
+ }
30083
+ onDragOver(e) {
30084
+ if (!this.direct() || this.dragIndex() === null) return;
30085
+ const idx = this.rowIndexOf(e.target, e.currentTarget);
30086
+ if (idx < 0) return;
30087
+ e.preventDefault();
30088
+ if (e.dataTransfer) e.dataTransfer.dropEffect = "move";
30089
+ this.overIndex.set(idx);
30090
+ }
30091
+ onDrop(e) {
30092
+ const from = this.dragIndex();
30093
+ if (!this.direct() || from === null) return;
30094
+ const idx = this.rowIndexOf(e.target, e.currentTarget);
30095
+ if (idx < 0) return;
30096
+ e.preventDefault();
30097
+ this.onDragEnd();
30098
+ this.apply(from, idx, null);
30099
+ }
30100
+ onDragEnd() {
30101
+ this.dragIndex.set(null);
30102
+ this.overIndex.set(null);
30103
+ }
30104
+ apply(from, to, focus) {
29846
30105
  const rows = this.rows();
29847
- const to = from + dir;
29848
- if (to < 0 || to >= rows.length) return false;
30106
+ const n = rows.length;
30107
+ if (!this.canReorder() || !Number.isInteger(from) || from < 0 || from >= n) return false;
30108
+ const target = Math.max(0, Math.min(n - 1, Number.isFinite(to) ? to : from));
30109
+ if (target === from) return false;
29849
30110
  const order = rows.map((r) => r.index);
29850
30111
  const [moved] = order.splice(from, 1);
29851
- order.splice(to, 0, moved);
30112
+ order.splice(target, 0, moved);
29852
30113
  const row = rows[from];
29853
- this.movedKey.set(row.key);
29854
- this.announce(`${row.label} moved to position ${to + 1} of ${rows.length}`);
29855
- this.pendingFocus = {
29856
- key: row.key,
29857
- item: row.item,
29858
- to,
29859
- dir
29860
- };
29861
- afterNextRender(() => this.restoreFocus(), { injector: this.injector });
30114
+ const items = reorderItems(this.items(), order);
30115
+ this.announce(this.moveAnnouncement()(this.itemLabelFn()(row.item, target), target + 1, n));
30116
+ if (focus) {
30117
+ this.movedKey.set(row.key);
30118
+ this.pendingFocus = {
30119
+ key: row.key,
30120
+ item: row.item,
30121
+ to: target,
30122
+ dir: target < from ? -1 : 1,
30123
+ target: focus
30124
+ };
30125
+ afterNextRender(() => this.restoreFocus(), { injector: this.injector });
30126
+ }
30127
+ this.itemsChange.emit(items);
29862
30128
  this.reorder.emit({
30129
+ item: row.item,
29863
30130
  from,
29864
- to,
29865
- order
30131
+ to: target,
30132
+ order,
30133
+ items
29866
30134
  });
29867
30135
  return true;
29868
30136
  }
@@ -29886,9 +30154,15 @@ var ListComponent = class ListComponent {
29886
30154
  if (idx < 0) return;
29887
30155
  const li = this.host.nativeElement.querySelector(`:scope > .ul-list > .ul-item[data-index="${idx}"]`);
29888
30156
  if (!li) return;
30157
+ if (p.target === "row") {
30158
+ li.focus();
30159
+ return;
30160
+ }
29889
30161
  const pick = (d) => li.querySelector(`:scope > .ul-row > .ul-controls > [data-move="${d}"] button:not(:disabled)`);
29890
30162
  const preferred = p.dir === -1 ? "up" : "down";
29891
- (pick(preferred) ?? pick(preferred === "up" ? "down" : "up"))?.focus();
30163
+ const btn = pick(preferred) ?? pick(preferred === "up" ? "down" : "up");
30164
+ if (btn) btn.focus();
30165
+ else if (this.direct()) li.focus();
29892
30166
  }
29893
30167
  static {
29894
30168
  this.ɵfac = i0.ɵɵngDeclareFactory({
@@ -29922,6 +30196,27 @@ var ListComponent = class ListComponent {
29922
30196
  isRequired: false,
29923
30197
  transformFunction: null
29924
30198
  },
30199
+ layout: {
30200
+ classPropertyName: "layout",
30201
+ publicName: "layout",
30202
+ isSignal: true,
30203
+ isRequired: false,
30204
+ transformFunction: null
30205
+ },
30206
+ gridMin: {
30207
+ classPropertyName: "gridMin",
30208
+ publicName: "gridMin",
30209
+ isSignal: true,
30210
+ isRequired: false,
30211
+ transformFunction: null
30212
+ },
30213
+ gap: {
30214
+ classPropertyName: "gap",
30215
+ publicName: "gap",
30216
+ isSignal: true,
30217
+ isRequired: false,
30218
+ transformFunction: null
30219
+ },
29925
30220
  reorderable: {
29926
30221
  classPropertyName: "reorderable",
29927
30222
  publicName: "reorderable",
@@ -29936,6 +30231,20 @@ var ListComponent = class ListComponent {
29936
30231
  isRequired: false,
29937
30232
  transformFunction: null
29938
30233
  },
30234
+ moveControls: {
30235
+ classPropertyName: "moveControls",
30236
+ publicName: "moveControls",
30237
+ isSignal: true,
30238
+ isRequired: false,
30239
+ transformFunction: null
30240
+ },
30241
+ dragDrop: {
30242
+ classPropertyName: "dragDrop",
30243
+ publicName: "dragDrop",
30244
+ isSignal: true,
30245
+ isRequired: false,
30246
+ transformFunction: null
30247
+ },
29939
30248
  ariaLabel: {
29940
30249
  classPropertyName: "ariaLabel",
29941
30250
  publicName: "ariaLabel",
@@ -29963,9 +30272,40 @@ var ListComponent = class ListComponent {
29963
30272
  isSignal: true,
29964
30273
  isRequired: false,
29965
30274
  transformFunction: null
30275
+ },
30276
+ moveEarlierLabel: {
30277
+ classPropertyName: "moveEarlierLabel",
30278
+ publicName: "moveEarlierLabel",
30279
+ isSignal: true,
30280
+ isRequired: false,
30281
+ transformFunction: null
30282
+ },
30283
+ moveLaterLabel: {
30284
+ classPropertyName: "moveLaterLabel",
30285
+ publicName: "moveLaterLabel",
30286
+ isSignal: true,
30287
+ isRequired: false,
30288
+ transformFunction: null
30289
+ },
30290
+ helpText: {
30291
+ classPropertyName: "helpText",
30292
+ publicName: "helpText",
30293
+ isSignal: true,
30294
+ isRequired: false,
30295
+ transformFunction: null
30296
+ },
30297
+ moveAnnouncement: {
30298
+ classPropertyName: "moveAnnouncement",
30299
+ publicName: "moveAnnouncement",
30300
+ isSignal: true,
30301
+ isRequired: false,
30302
+ transformFunction: null
29966
30303
  }
29967
30304
  },
29968
- outputs: { reorder: "reorder" },
30305
+ outputs: {
30306
+ itemsChange: "itemsChange",
30307
+ reorder: "reorder"
30308
+ },
29969
30309
  queries: [{
29970
30310
  propertyName: "rowTemplate",
29971
30311
  first: true,
@@ -29977,7 +30317,17 @@ var ListComponent = class ListComponent {
29977
30317
  template: `
29978
30318
  <ng-template #rowsTpl>
29979
30319
  @for (row of rows(); track row.key) {
29980
- <li class="ul-item" [class.ul-item--moved]="row.key === movedKey()" [attr.data-index]="row.index">
30320
+ <li class="ul-item" role="listitem"
30321
+ [class.ul-item--moved]="row.key === movedKey()"
30322
+ [class.ul-item--draggable]="direct()"
30323
+ [class.ul-item--dragging]="row.dragging"
30324
+ [class.ul-item--over]="dragIndex() !== null && dragIndex() !== row.index && overIndex() === row.index"
30325
+ [attr.data-index]="row.index"
30326
+ [attr.draggable]="direct() ? 'true' : null"
30327
+ [attr.tabindex]="direct() ? 0 : null"
30328
+ [attr.aria-roledescription]="direct() ? 'sortable item' : null"
30329
+ [attr.aria-label]="direct() ? row.label : null"
30330
+ [attr.aria-describedby]="direct() ? helpId : null">
29981
30331
  <div class="ul-row">
29982
30332
  <div class="ul-content">
29983
30333
  @if (rowTemplate(); as tpl) {
@@ -29986,12 +30336,12 @@ var ListComponent = class ListComponent {
29986
30336
  {{ row.label }}
29987
30337
  }
29988
30338
  </div>
29989
- @if (reorderable()) {
30339
+ @if (showControls()) {
29990
30340
  <div class="ul-controls">
29991
- <ui-button variant="icon" data-move="up" [ariaLabel]="row.upLabel" [disabled]="disabled() || row.first">
30341
+ <ui-button variant="icon" data-move="up" [ariaLabel]="row.earlierLabel" [disabled]="disabled() || row.first">
29992
30342
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M18 15l-6-6-6 6"/></svg>
29993
30343
  </ui-button>
29994
- <ui-button variant="icon" data-move="down" [ariaLabel]="row.downLabel" [disabled]="disabled() || row.last">
30344
+ <ui-button variant="icon" data-move="down" [ariaLabel]="row.laterLabel" [disabled]="disabled() || row.last">
29995
30345
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M6 9l6 6 6-6"/></svg>
29996
30346
  </ui-button>
29997
30347
  </div>
@@ -30003,15 +30353,19 @@ var ListComponent = class ListComponent {
30003
30353
 
30004
30354
  @if (rows().length) {
30005
30355
  @if (ordered()) {
30006
- <ol class="ul-list ul-list--ordered" role="list"
30356
+ <ol class="ul-list ul-list--ordered" role="list" [class.ul-list--grid]="isGrid()"
30357
+ [style.--ul-gap]="gapCss()" [style.--ul-min.px]="isGrid() ? gridMin() : null"
30007
30358
  [attr.aria-label]="ariaLabel() || null" [attr.aria-labelledby]="ariaLabelledby() || null"
30008
- (keydown)="onKeydown($event)" (click)="onClick($event)" (focusout)="onFocusOut($event)">
30359
+ (keydown)="onKeydown($event)" (click)="onClick($event)" (focusout)="onFocusOut($event)"
30360
+ (dragstart)="onDragStart($event)" (dragover)="onDragOver($event)" (drop)="onDrop($event)" (dragend)="onDragEnd()">
30009
30361
  <ng-container [ngTemplateOutlet]="rowsTpl" />
30010
30362
  </ol>
30011
30363
  } @else {
30012
- <ul class="ul-list ul-list--unordered" role="list"
30364
+ <ul class="ul-list ul-list--unordered" role="list" [class.ul-list--grid]="isGrid()"
30365
+ [style.--ul-gap]="gapCss()" [style.--ul-min.px]="isGrid() ? gridMin() : null"
30013
30366
  [attr.aria-label]="ariaLabel() || null" [attr.aria-labelledby]="ariaLabelledby() || null"
30014
- (keydown)="onKeydown($event)" (click)="onClick($event)" (focusout)="onFocusOut($event)">
30367
+ (keydown)="onKeydown($event)" (click)="onClick($event)" (focusout)="onFocusOut($event)"
30368
+ (dragstart)="onDragStart($event)" (dragover)="onDragOver($event)" (drop)="onDrop($event)" (dragend)="onDragEnd()">
30015
30369
  <ng-container [ngTemplateOutlet]="rowsTpl" />
30016
30370
  </ul>
30017
30371
  }
@@ -30019,12 +30373,15 @@ var ListComponent = class ListComponent {
30019
30373
  <ng-content select="[list-empty]" />
30020
30374
  }
30021
30375
 
30376
+ @if (direct() && rows().length) {
30377
+ <span class="ul-sr" [id]="helpId">{{ helpText() }}</span>
30378
+ }
30022
30379
  @if (reorderable()) {
30023
- <div class="ul-sr" aria-live="polite" aria-atomic="true">{{ announcement() }}</div>
30380
+ <div class="ul-sr" role="status" aria-live="polite" aria-atomic="true">{{ announcement() }}</div>
30024
30381
  }
30025
30382
  `,
30026
30383
  isInline: true,
30027
- styles: [":host{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"],
30384
+ styles: [":host{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}:host ::ng-deep .ul-item--draggable img,:host ::ng-deep .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"],
30028
30385
  dependencies: [{
30029
30386
  kind: "directive",
30030
30387
  type: NgTemplateOutlet,
@@ -30079,7 +30436,17 @@ i0.ɵɵngDeclareClassMetadata({
30079
30436
  template: `
30080
30437
  <ng-template #rowsTpl>
30081
30438
  @for (row of rows(); track row.key) {
30082
- <li class="ul-item" [class.ul-item--moved]="row.key === movedKey()" [attr.data-index]="row.index">
30439
+ <li class="ul-item" role="listitem"
30440
+ [class.ul-item--moved]="row.key === movedKey()"
30441
+ [class.ul-item--draggable]="direct()"
30442
+ [class.ul-item--dragging]="row.dragging"
30443
+ [class.ul-item--over]="dragIndex() !== null && dragIndex() !== row.index && overIndex() === row.index"
30444
+ [attr.data-index]="row.index"
30445
+ [attr.draggable]="direct() ? 'true' : null"
30446
+ [attr.tabindex]="direct() ? 0 : null"
30447
+ [attr.aria-roledescription]="direct() ? 'sortable item' : null"
30448
+ [attr.aria-label]="direct() ? row.label : null"
30449
+ [attr.aria-describedby]="direct() ? helpId : null">
30083
30450
  <div class="ul-row">
30084
30451
  <div class="ul-content">
30085
30452
  @if (rowTemplate(); as tpl) {
@@ -30088,12 +30455,12 @@ i0.ɵɵngDeclareClassMetadata({
30088
30455
  {{ row.label }}
30089
30456
  }
30090
30457
  </div>
30091
- @if (reorderable()) {
30458
+ @if (showControls()) {
30092
30459
  <div class="ul-controls">
30093
- <ui-button variant="icon" data-move="up" [ariaLabel]="row.upLabel" [disabled]="disabled() || row.first">
30460
+ <ui-button variant="icon" data-move="up" [ariaLabel]="row.earlierLabel" [disabled]="disabled() || row.first">
30094
30461
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M18 15l-6-6-6 6"/></svg>
30095
30462
  </ui-button>
30096
- <ui-button variant="icon" data-move="down" [ariaLabel]="row.downLabel" [disabled]="disabled() || row.last">
30463
+ <ui-button variant="icon" data-move="down" [ariaLabel]="row.laterLabel" [disabled]="disabled() || row.last">
30097
30464
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M6 9l6 6 6-6"/></svg>
30098
30465
  </ui-button>
30099
30466
  </div>
@@ -30105,15 +30472,19 @@ i0.ɵɵngDeclareClassMetadata({
30105
30472
 
30106
30473
  @if (rows().length) {
30107
30474
  @if (ordered()) {
30108
- <ol class="ul-list ul-list--ordered" role="list"
30475
+ <ol class="ul-list ul-list--ordered" role="list" [class.ul-list--grid]="isGrid()"
30476
+ [style.--ul-gap]="gapCss()" [style.--ul-min.px]="isGrid() ? gridMin() : null"
30109
30477
  [attr.aria-label]="ariaLabel() || null" [attr.aria-labelledby]="ariaLabelledby() || null"
30110
- (keydown)="onKeydown($event)" (click)="onClick($event)" (focusout)="onFocusOut($event)">
30478
+ (keydown)="onKeydown($event)" (click)="onClick($event)" (focusout)="onFocusOut($event)"
30479
+ (dragstart)="onDragStart($event)" (dragover)="onDragOver($event)" (drop)="onDrop($event)" (dragend)="onDragEnd()">
30111
30480
  <ng-container [ngTemplateOutlet]="rowsTpl" />
30112
30481
  </ol>
30113
30482
  } @else {
30114
- <ul class="ul-list ul-list--unordered" role="list"
30483
+ <ul class="ul-list ul-list--unordered" role="list" [class.ul-list--grid]="isGrid()"
30484
+ [style.--ul-gap]="gapCss()" [style.--ul-min.px]="isGrid() ? gridMin() : null"
30115
30485
  [attr.aria-label]="ariaLabel() || null" [attr.aria-labelledby]="ariaLabelledby() || null"
30116
- (keydown)="onKeydown($event)" (click)="onClick($event)" (focusout)="onFocusOut($event)">
30486
+ (keydown)="onKeydown($event)" (click)="onClick($event)" (focusout)="onFocusOut($event)"
30487
+ (dragstart)="onDragStart($event)" (dragover)="onDragOver($event)" (drop)="onDrop($event)" (dragend)="onDragEnd()">
30117
30488
  <ng-container [ngTemplateOutlet]="rowsTpl" />
30118
30489
  </ul>
30119
30490
  }
@@ -30121,11 +30492,14 @@ i0.ɵɵngDeclareClassMetadata({
30121
30492
  <ng-content select="[list-empty]" />
30122
30493
  }
30123
30494
 
30495
+ @if (direct() && rows().length) {
30496
+ <span class="ul-sr" [id]="helpId">{{ helpText() }}</span>
30497
+ }
30124
30498
  @if (reorderable()) {
30125
- <div class="ul-sr" aria-live="polite" aria-atomic="true">{{ announcement() }}</div>
30499
+ <div class="ul-sr" role="status" aria-live="polite" aria-atomic="true">{{ announcement() }}</div>
30126
30500
  }
30127
30501
  `,
30128
- styles: [":host{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"]
30502
+ styles: [":host{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}:host ::ng-deep .ul-item--draggable img,:host ::ng-deep .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"]
30129
30503
  }]
30130
30504
  }],
30131
30505
  propDecorators: {
@@ -30145,6 +30519,30 @@ i0.ɵɵngDeclareClassMetadata({
30145
30519
  required: false
30146
30520
  }]
30147
30521
  }],
30522
+ layout: [{
30523
+ type: i0.Input,
30524
+ args: [{
30525
+ isSignal: true,
30526
+ alias: "layout",
30527
+ required: false
30528
+ }]
30529
+ }],
30530
+ gridMin: [{
30531
+ type: i0.Input,
30532
+ args: [{
30533
+ isSignal: true,
30534
+ alias: "gridMin",
30535
+ required: false
30536
+ }]
30537
+ }],
30538
+ gap: [{
30539
+ type: i0.Input,
30540
+ args: [{
30541
+ isSignal: true,
30542
+ alias: "gap",
30543
+ required: false
30544
+ }]
30545
+ }],
30148
30546
  reorderable: [{
30149
30547
  type: i0.Input,
30150
30548
  args: [{
@@ -30161,6 +30559,22 @@ i0.ɵɵngDeclareClassMetadata({
30161
30559
  required: false
30162
30560
  }]
30163
30561
  }],
30562
+ moveControls: [{
30563
+ type: i0.Input,
30564
+ args: [{
30565
+ isSignal: true,
30566
+ alias: "moveControls",
30567
+ required: false
30568
+ }]
30569
+ }],
30570
+ dragDrop: [{
30571
+ type: i0.Input,
30572
+ args: [{
30573
+ isSignal: true,
30574
+ alias: "dragDrop",
30575
+ required: false
30576
+ }]
30577
+ }],
30164
30578
  ariaLabel: [{
30165
30579
  type: i0.Input,
30166
30580
  args: [{
@@ -30193,8 +30607,44 @@ i0.ɵɵngDeclareClassMetadata({
30193
30607
  required: false
30194
30608
  }]
30195
30609
  }],
30196
- reorder: [{
30197
- type: i0.Output,
30610
+ moveEarlierLabel: [{
30611
+ type: i0.Input,
30612
+ args: [{
30613
+ isSignal: true,
30614
+ alias: "moveEarlierLabel",
30615
+ required: false
30616
+ }]
30617
+ }],
30618
+ moveLaterLabel: [{
30619
+ type: i0.Input,
30620
+ args: [{
30621
+ isSignal: true,
30622
+ alias: "moveLaterLabel",
30623
+ required: false
30624
+ }]
30625
+ }],
30626
+ helpText: [{
30627
+ type: i0.Input,
30628
+ args: [{
30629
+ isSignal: true,
30630
+ alias: "helpText",
30631
+ required: false
30632
+ }]
30633
+ }],
30634
+ moveAnnouncement: [{
30635
+ type: i0.Input,
30636
+ args: [{
30637
+ isSignal: true,
30638
+ alias: "moveAnnouncement",
30639
+ required: false
30640
+ }]
30641
+ }],
30642
+ itemsChange: [{
30643
+ type: i0.Output,
30644
+ args: ["itemsChange"]
30645
+ }],
30646
+ reorder: [{
30647
+ type: i0.Output,
30198
30648
  args: ["reorder"]
30199
30649
  }],
30200
30650
  rowTemplate: [{
@@ -32985,448 +33435,6 @@ i0.ɵɵngDeclareClassMetadata({
32985
33435
  }]
32986
33436
  }
32987
33437
  });
32988
- var SortableItemDirective = class SortableItemDirective {
32989
- constructor() {
32990
- this.template = inject(TemplateRef);
32991
- }
32992
- static ngTemplateContextGuard(_dir, _ctx) {
32993
- return true;
32994
- }
32995
- static {
32996
- this.ɵfac = i0.ɵɵngDeclareFactory({
32997
- minVersion: "12.0.0",
32998
- version: "22.2.2",
32999
- ngImport: i0,
33000
- type: SortableItemDirective,
33001
- deps: [],
33002
- target: i0.ɵɵFactoryTarget.Directive
33003
- });
33004
- }
33005
- static {
33006
- this.ɵdir = i0.ɵɵngDeclareDirective({
33007
- minVersion: "14.0.0",
33008
- version: "22.2.2",
33009
- type: SortableItemDirective,
33010
- isStandalone: true,
33011
- selector: "ng-template[uiSortableItem]",
33012
- ngImport: i0
33013
- });
33014
- }
33015
- };
33016
- i0.ɵɵngDeclareClassMetadata({
33017
- minVersion: "12.0.0",
33018
- version: "22.2.2",
33019
- ngImport: i0,
33020
- type: SortableItemDirective,
33021
- decorators: [{
33022
- type: Directive,
33023
- args: [{
33024
- selector: "ng-template[uiSortableItem]",
33025
- standalone: true
33026
- }]
33027
- }]
33028
- });
33029
- let nextId$2 = 0;
33030
- var SortableListComponent = class SortableListComponent {
33031
- constructor() {
33032
- this.items = model([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
33033
- this.sortable = input(false, ...ngDevMode ? [{ debugName: "sortable" }] : /* istanbul ignore next */ []);
33034
- this.layout = input("list", ...ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []);
33035
- this.gridMin = input(130, ...ngDevMode ? [{ debugName: "gridMin" }] : /* istanbul ignore next */ []);
33036
- this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
33037
- this.itemLabel = input((_item, index) => `Item ${index + 1}`, ...ngDevMode ? [{ debugName: "itemLabel" }] : /* istanbul ignore next */ []);
33038
- this.moveControls = input(false, ...ngDevMode ? [{ debugName: "moveControls" }] : /* istanbul ignore next */ []);
33039
- this.moveEarlierLabel = input("Move earlier", ...ngDevMode ? [{ debugName: "moveEarlierLabel" }] : /* istanbul ignore next */ []);
33040
- this.moveLaterLabel = input("Move later", ...ngDevMode ? [{ debugName: "moveLaterLabel" }] : /* istanbul ignore next */ []);
33041
- this.helpText = input("Hold Shift and press the arrow keys to move this item. Shift plus Home or End moves it to the start or end.", ...ngDevMode ? [{ debugName: "helpText" }] : /* istanbul ignore next */ []);
33042
- this.moveAnnouncement = input((label, position, total) => `${label} moved to position ${position} of ${total}`, ...ngDevMode ? [{ debugName: "moveAnnouncement" }] : /* istanbul ignore next */ []);
33043
- this.orderChange = output();
33044
- this.itemTemplate = contentChild.required(SortableItemDirective, ...ngDevMode ? [{ debugName: "itemTemplate" }] : /* istanbul ignore next */ []);
33045
- this._helpId = `sl-help-${nextId$2++}`;
33046
- this._dragIndex = signal(null, ...ngDevMode ? [{ debugName: "_dragIndex" }] : /* istanbul ignore next */ []);
33047
- this._overIndex = signal(null, ...ngDevMode ? [{ debugName: "_overIndex" }] : /* istanbul ignore next */ []);
33048
- this._announcement = signal("", ...ngDevMode ? [{ debugName: "_announcement" }] : /* istanbul ignore next */ []);
33049
- this._count = computed(() => this.items().length, ...ngDevMode ? [{ debugName: "_count" }] : /* istanbul ignore next */ []);
33050
- }
33051
- move(from, to) {
33052
- const list = this.items();
33053
- if (!this.sortable() || from < 0 || from >= list.length) return;
33054
- const target = Math.max(0, Math.min(list.length - 1, to));
33055
- if (target === from) return;
33056
- const next = [...list];
33057
- const [item] = next.splice(from, 1);
33058
- next.splice(target, 0, item);
33059
- this.items.set(next);
33060
- this._announcement.set(this.moveAnnouncement()(this.itemLabel()(item, target), target + 1, next.length));
33061
- this.orderChange.emit({
33062
- item,
33063
- from,
33064
- to: target,
33065
- items: next
33066
- });
33067
- }
33068
- onDragStart(event, index) {
33069
- if (!this.sortable()) return;
33070
- this._dragIndex.set(index);
33071
- if (event.dataTransfer) {
33072
- event.dataTransfer.effectAllowed = "move";
33073
- event.dataTransfer.setData("text/plain", String(index));
33074
- }
33075
- }
33076
- onDragOver(event, index) {
33077
- if (!this.sortable() || this._dragIndex() === null) return;
33078
- event.preventDefault();
33079
- if (event.dataTransfer) event.dataTransfer.dropEffect = "move";
33080
- this._overIndex.set(index);
33081
- }
33082
- onDrop(event, index) {
33083
- const from = this._dragIndex();
33084
- if (!this.sortable() || from === null) return;
33085
- event.preventDefault();
33086
- this.onDragEnd();
33087
- this.move(from, index);
33088
- }
33089
- onDragEnd() {
33090
- this._dragIndex.set(null);
33091
- this._overIndex.set(null);
33092
- }
33093
- onKeydown(event, index) {
33094
- if (!this.sortable() || event.target !== event.currentTarget || !event.shiftKey) return;
33095
- let to = null;
33096
- switch (event.key) {
33097
- case "ArrowUp":
33098
- case "ArrowLeft":
33099
- to = index - 1;
33100
- break;
33101
- case "ArrowDown":
33102
- case "ArrowRight":
33103
- to = index + 1;
33104
- break;
33105
- case "Home":
33106
- to = 0;
33107
- break;
33108
- case "End": to = this._count() - 1;
33109
- }
33110
- if (to === null) return;
33111
- event.preventDefault();
33112
- this.move(index, to);
33113
- }
33114
- static {
33115
- this.ɵfac = i0.ɵɵngDeclareFactory({
33116
- minVersion: "12.0.0",
33117
- version: "22.2.2",
33118
- ngImport: i0,
33119
- type: SortableListComponent,
33120
- deps: [],
33121
- target: i0.ɵɵFactoryTarget.Component
33122
- });
33123
- }
33124
- static {
33125
- this.ɵcmp = i0.ɵɵngDeclareComponent({
33126
- minVersion: "17.0.0",
33127
- version: "22.2.2",
33128
- type: SortableListComponent,
33129
- isStandalone: true,
33130
- selector: "ui-sortable-list",
33131
- inputs: {
33132
- items: {
33133
- classPropertyName: "items",
33134
- publicName: "items",
33135
- isSignal: true,
33136
- isRequired: false,
33137
- transformFunction: null
33138
- },
33139
- sortable: {
33140
- classPropertyName: "sortable",
33141
- publicName: "sortable",
33142
- isSignal: true,
33143
- isRequired: false,
33144
- transformFunction: null
33145
- },
33146
- layout: {
33147
- classPropertyName: "layout",
33148
- publicName: "layout",
33149
- isSignal: true,
33150
- isRequired: false,
33151
- transformFunction: null
33152
- },
33153
- gridMin: {
33154
- classPropertyName: "gridMin",
33155
- publicName: "gridMin",
33156
- isSignal: true,
33157
- isRequired: false,
33158
- transformFunction: null
33159
- },
33160
- ariaLabel: {
33161
- classPropertyName: "ariaLabel",
33162
- publicName: "ariaLabel",
33163
- isSignal: true,
33164
- isRequired: false,
33165
- transformFunction: null
33166
- },
33167
- itemLabel: {
33168
- classPropertyName: "itemLabel",
33169
- publicName: "itemLabel",
33170
- isSignal: true,
33171
- isRequired: false,
33172
- transformFunction: null
33173
- },
33174
- moveControls: {
33175
- classPropertyName: "moveControls",
33176
- publicName: "moveControls",
33177
- isSignal: true,
33178
- isRequired: false,
33179
- transformFunction: null
33180
- },
33181
- moveEarlierLabel: {
33182
- classPropertyName: "moveEarlierLabel",
33183
- publicName: "moveEarlierLabel",
33184
- isSignal: true,
33185
- isRequired: false,
33186
- transformFunction: null
33187
- },
33188
- moveLaterLabel: {
33189
- classPropertyName: "moveLaterLabel",
33190
- publicName: "moveLaterLabel",
33191
- isSignal: true,
33192
- isRequired: false,
33193
- transformFunction: null
33194
- },
33195
- helpText: {
33196
- classPropertyName: "helpText",
33197
- publicName: "helpText",
33198
- isSignal: true,
33199
- isRequired: false,
33200
- transformFunction: null
33201
- },
33202
- moveAnnouncement: {
33203
- classPropertyName: "moveAnnouncement",
33204
- publicName: "moveAnnouncement",
33205
- isSignal: true,
33206
- isRequired: false,
33207
- transformFunction: null
33208
- }
33209
- },
33210
- outputs: {
33211
- items: "itemsChange",
33212
- orderChange: "orderChange"
33213
- },
33214
- queries: [{
33215
- propertyName: "itemTemplate",
33216
- first: true,
33217
- predicate: SortableItemDirective,
33218
- descendants: true,
33219
- isSignal: true
33220
- }],
33221
- ngImport: i0,
33222
- template: `
33223
- <div class="sl" [class.sl-grid]="layout() === 'grid'" [style.--sl-min.px]="gridMin()" role="list" [attr.aria-label]="ariaLabel() || null">
33224
- @for (item of items(); track item; let i = $index; let first = $first; let last = $last) {
33225
- <div class="sl-item" role="listitem"
33226
- [class.sl-sortable]="sortable()"
33227
- [class.sl-dragging]="_dragIndex() === i"
33228
- [class.sl-over]="_overIndex() === i && _dragIndex() !== null && _dragIndex() !== i"
33229
- [attr.draggable]="sortable() ? 'true' : null"
33230
- [attr.tabindex]="sortable() ? 0 : null"
33231
- [attr.aria-roledescription]="sortable() ? 'sortable item' : null"
33232
- [attr.aria-label]="sortable() ? itemLabel()(item, i) : null"
33233
- [attr.aria-describedby]="sortable() ? _helpId : null"
33234
- (dragstart)="onDragStart($event, i)" (dragover)="onDragOver($event, i)" (drop)="onDrop($event, i)" (dragend)="onDragEnd()"
33235
- (keydown)="onKeydown($event, i)">
33236
- <ng-container [ngTemplateOutlet]="itemTemplate().template"
33237
- [ngTemplateOutletContext]="{ $implicit: item, index: i, first: first, last: last, dragging: _dragIndex() === i }" />
33238
- @if (sortable() && moveControls()) {
33239
- <div class="sl-move">
33240
- <ui-icon name="chevron-up" [size]="16" [disabled]="first" [tooltip]="moveEarlierLabel() + ' ' + itemLabel()(item, i)" (iconClick)="move(i, i - 1)" />
33241
- <ui-icon name="chevron-down" [size]="16" [disabled]="last" [tooltip]="moveLaterLabel() + ' ' + itemLabel()(item, i)" (iconClick)="move(i, i + 1)" />
33242
- </div>
33243
- }
33244
- </div>
33245
- }
33246
- </div>
33247
- @if (sortable()) {
33248
- <span class="sl-sr" [id]="_helpId">{{ helpText() }}</span>
33249
- }
33250
- <span class="sl-sr" role="status" aria-live="polite">{{ _announcement() }}</span>
33251
- `,
33252
- isInline: true,
33253
- styles: [":host{display:block}.sl{display:flex;flex-direction:column;gap:12px}.sl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--sl-min, 130px),1fr));gap:12px}.sl-item{position:relative;min-width:0}.sl-sortable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.sl-sortable{cursor:grab}.sl-sortable:active{cursor:grabbing}}.sl-sortable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}:host ::ng-deep .sl-sortable img,:host ::ng-deep .sl-sortable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.sl-dragging{opacity:.5}.sl-over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}.sl-move{display:flex;justify-content:center;gap:4px;margin-top:6px}.sl-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n"],
33254
- dependencies: [{
33255
- kind: "directive",
33256
- type: NgTemplateOutlet,
33257
- selector: "[ngTemplateOutlet]",
33258
- inputs: [
33259
- "ngTemplateOutletContext",
33260
- "ngTemplateOutlet",
33261
- "ngTemplateOutletInjector"
33262
- ]
33263
- }, {
33264
- kind: "component",
33265
- type: IconComponent,
33266
- selector: "ui-icon",
33267
- inputs: [
33268
- "name",
33269
- "tooltip",
33270
- "ariaLabel",
33271
- "size",
33272
- "variant",
33273
- "disabled",
33274
- "loading",
33275
- "interactive"
33276
- ],
33277
- outputs: ["iconClick"]
33278
- }],
33279
- changeDetection: i0.ChangeDetectionStrategy.OnPush
33280
- });
33281
- }
33282
- };
33283
- i0.ɵɵngDeclareClassMetadata({
33284
- minVersion: "12.0.0",
33285
- version: "22.2.2",
33286
- ngImport: i0,
33287
- type: SortableListComponent,
33288
- decorators: [{
33289
- type: Component,
33290
- args: [{
33291
- selector: "ui-sortable-list",
33292
- standalone: true,
33293
- changeDetection: ChangeDetectionStrategy.OnPush,
33294
- imports: [NgTemplateOutlet, IconComponent],
33295
- template: `
33296
- <div class="sl" [class.sl-grid]="layout() === 'grid'" [style.--sl-min.px]="gridMin()" role="list" [attr.aria-label]="ariaLabel() || null">
33297
- @for (item of items(); track item; let i = $index; let first = $first; let last = $last) {
33298
- <div class="sl-item" role="listitem"
33299
- [class.sl-sortable]="sortable()"
33300
- [class.sl-dragging]="_dragIndex() === i"
33301
- [class.sl-over]="_overIndex() === i && _dragIndex() !== null && _dragIndex() !== i"
33302
- [attr.draggable]="sortable() ? 'true' : null"
33303
- [attr.tabindex]="sortable() ? 0 : null"
33304
- [attr.aria-roledescription]="sortable() ? 'sortable item' : null"
33305
- [attr.aria-label]="sortable() ? itemLabel()(item, i) : null"
33306
- [attr.aria-describedby]="sortable() ? _helpId : null"
33307
- (dragstart)="onDragStart($event, i)" (dragover)="onDragOver($event, i)" (drop)="onDrop($event, i)" (dragend)="onDragEnd()"
33308
- (keydown)="onKeydown($event, i)">
33309
- <ng-container [ngTemplateOutlet]="itemTemplate().template"
33310
- [ngTemplateOutletContext]="{ $implicit: item, index: i, first: first, last: last, dragging: _dragIndex() === i }" />
33311
- @if (sortable() && moveControls()) {
33312
- <div class="sl-move">
33313
- <ui-icon name="chevron-up" [size]="16" [disabled]="first" [tooltip]="moveEarlierLabel() + ' ' + itemLabel()(item, i)" (iconClick)="move(i, i - 1)" />
33314
- <ui-icon name="chevron-down" [size]="16" [disabled]="last" [tooltip]="moveLaterLabel() + ' ' + itemLabel()(item, i)" (iconClick)="move(i, i + 1)" />
33315
- </div>
33316
- }
33317
- </div>
33318
- }
33319
- </div>
33320
- @if (sortable()) {
33321
- <span class="sl-sr" [id]="_helpId">{{ helpText() }}</span>
33322
- }
33323
- <span class="sl-sr" role="status" aria-live="polite">{{ _announcement() }}</span>
33324
- `,
33325
- styles: [":host{display:block}.sl{display:flex;flex-direction:column;gap:12px}.sl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--sl-min, 130px),1fr));gap:12px}.sl-item{position:relative;min-width:0}.sl-sortable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.sl-sortable{cursor:grab}.sl-sortable:active{cursor:grabbing}}.sl-sortable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}:host ::ng-deep .sl-sortable img,:host ::ng-deep .sl-sortable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.sl-dragging{opacity:.5}.sl-over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}.sl-move{display:flex;justify-content:center;gap:4px;margin-top:6px}.sl-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n"]
33326
- }]
33327
- }],
33328
- propDecorators: {
33329
- items: [{
33330
- type: i0.Input,
33331
- args: [{
33332
- isSignal: true,
33333
- alias: "items",
33334
- required: false
33335
- }]
33336
- }, {
33337
- type: i0.Output,
33338
- args: ["itemsChange"]
33339
- }],
33340
- sortable: [{
33341
- type: i0.Input,
33342
- args: [{
33343
- isSignal: true,
33344
- alias: "sortable",
33345
- required: false
33346
- }]
33347
- }],
33348
- layout: [{
33349
- type: i0.Input,
33350
- args: [{
33351
- isSignal: true,
33352
- alias: "layout",
33353
- required: false
33354
- }]
33355
- }],
33356
- gridMin: [{
33357
- type: i0.Input,
33358
- args: [{
33359
- isSignal: true,
33360
- alias: "gridMin",
33361
- required: false
33362
- }]
33363
- }],
33364
- ariaLabel: [{
33365
- type: i0.Input,
33366
- args: [{
33367
- isSignal: true,
33368
- alias: "ariaLabel",
33369
- required: false
33370
- }]
33371
- }],
33372
- itemLabel: [{
33373
- type: i0.Input,
33374
- args: [{
33375
- isSignal: true,
33376
- alias: "itemLabel",
33377
- required: false
33378
- }]
33379
- }],
33380
- moveControls: [{
33381
- type: i0.Input,
33382
- args: [{
33383
- isSignal: true,
33384
- alias: "moveControls",
33385
- required: false
33386
- }]
33387
- }],
33388
- moveEarlierLabel: [{
33389
- type: i0.Input,
33390
- args: [{
33391
- isSignal: true,
33392
- alias: "moveEarlierLabel",
33393
- required: false
33394
- }]
33395
- }],
33396
- moveLaterLabel: [{
33397
- type: i0.Input,
33398
- args: [{
33399
- isSignal: true,
33400
- alias: "moveLaterLabel",
33401
- required: false
33402
- }]
33403
- }],
33404
- helpText: [{
33405
- type: i0.Input,
33406
- args: [{
33407
- isSignal: true,
33408
- alias: "helpText",
33409
- required: false
33410
- }]
33411
- }],
33412
- moveAnnouncement: [{
33413
- type: i0.Input,
33414
- args: [{
33415
- isSignal: true,
33416
- alias: "moveAnnouncement",
33417
- required: false
33418
- }]
33419
- }],
33420
- orderChange: [{
33421
- type: i0.Output,
33422
- args: ["orderChange"]
33423
- }],
33424
- itemTemplate: [{
33425
- type: i0.ContentChild,
33426
- args: [i0.forwardRef(() => SortableItemDirective), { isSignal: true }]
33427
- }]
33428
- }
33429
- });
33430
33438
  var KpiCardComponent = class KpiCardComponent {
33431
33439
  constructor() {
33432
33440
  this.sanitizer = inject(DomSanitizer);
@@ -37339,21 +37347,6 @@ i0.ɵɵngDeclareClassMetadata({
37339
37347
  }]
37340
37348
  }
37341
37349
  });
37342
- const LAYOUT_GAP_PX = {
37343
- none: 0,
37344
- xs: 4,
37345
- sm: 8,
37346
- md: 16,
37347
- lg: 24,
37348
- xl: 32
37349
- };
37350
- const CSS_LENGTH = /^(?:0|-?(?:\d+\.?\d*|\.\d+)(?:px|rem|em|%|vh|vw|ch)|(?:calc|var)\([^;{}]*\))$/i;
37351
- function resolveLayoutGap(gap, fallback) {
37352
- const v = (gap ?? "").trim();
37353
- if (Object.prototype.hasOwnProperty.call(LAYOUT_GAP_PX, v)) return `${LAYOUT_GAP_PX[v]}px`;
37354
- if (v && CSS_LENGTH.test(v)) return v;
37355
- return `${LAYOUT_GAP_PX[fallback]}px`;
37356
- }
37357
37350
  var ColumnsComponent = class ColumnsComponent {
37358
37351
  constructor() {
37359
37352
  this.count = input(2, ...ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []);
@@ -37807,6 +37800,6 @@ i0.ɵɵngDeclareClassMetadata({
37807
37800
  }]
37808
37801
  }
37809
37802
  });
37810
- export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CheckboxComponent, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DEFAULT_DOCUMENT_SUBJECT, DEFAULT_SIGNING_OPTIONS, DOCUMENT_PROVIDER_OPTIONS, DOCUMENT_PURPOSE_OPTIONS, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DocumentMergeCheckComponent, DocumentSendOptionsComponent, DocumentSignersComponent, DropdownComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FileInputComponent, FormRowComponent, FormSectionComponent, HintComponent, IconComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, MAX_CC, MERGE_CHECK_DEBOUNCE_MS, ModalComponent, MoreMenuComponent, MultiSelectComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PaginationComponent, PanelInfoListComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, ReadonlyFieldsetComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SIGNER_ROLES, SIGNER_ROLE_LABEL_DEFAULT, SIGNING_LIMITS, SearchInputComponent, SectionHeaderComponent, SelectComponent, SendMessagePanelComponent, SidePanelComponent, SkeletonComponent, SortableItemDirective, SortableListComponent, StackComponent, StepperComponent, TableToolbarComponent, TemplatePickerComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, VideoPickerComponent, acceptLabel, appShellGroupsStorageKey, appendVideoLink, applyVideoLine, autoVariant, buildDefaultSchedule, buildSigners, buildVideoLink, builtInActionIcon, businessTimeOptions, countersignLine, countersignPlaceLabel, createFieldReveal, decodeFilterValues, describeDocumentSigners, digitsOnly, effectiveRoles, encodeFilterValue, encodeFilterValues, errorContextInterceptor, fileMatchesAccept, formatFileSize, formatIsoDate, formatIsoDateTime, formatTime, forwardContext, getEligibleIds, getEligibleOptions, getErrorMessage, hasMappedDataFields, humanReadableMessage, iconPath, isoKey, issueToErrors, maxLengthIssue, mergeFieldText, mergeWarningLines, messagePreviewHtml, normalizeHexColor, normalizeRoles, parseBizHours, parseCcList, parseIso, parseTime, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, roleNumber, sendExistingEnvelope, serializeBizHours, signerProblems, signerRoleLabel, stripVideoLink, suggestDocumentSubject, videoMessageLine };
37803
+ export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CheckboxComponent, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DEFAULT_DOCUMENT_SUBJECT, DEFAULT_SIGNING_OPTIONS, DOCUMENT_PROVIDER_OPTIONS, DOCUMENT_PURPOSE_OPTIONS, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DocumentMergeCheckComponent, DocumentSendOptionsComponent, DocumentSignersComponent, DropdownComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FileInputComponent, FormRowComponent, FormSectionComponent, HintComponent, IconComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, MAX_CC, MERGE_CHECK_DEBOUNCE_MS, ModalComponent, MoreMenuComponent, MultiSelectComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PaginationComponent, PanelInfoListComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, ReadonlyFieldsetComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SIGNER_ROLES, SIGNER_ROLE_LABEL_DEFAULT, SIGNING_LIMITS, SearchInputComponent, SectionHeaderComponent, SelectComponent, SendMessagePanelComponent, SidePanelComponent, SkeletonComponent, StackComponent, StepperComponent, TableToolbarComponent, TemplatePickerComponent, TextComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, VideoPickerComponent, acceptLabel, appShellGroupsStorageKey, appendVideoLink, applyVideoLine, autoVariant, buildDefaultSchedule, buildSigners, buildVideoLink, builtInActionIcon, businessTimeOptions, countersignLine, countersignPlaceLabel, createFieldReveal, decodeFilterValues, describeDocumentSigners, digitsOnly, effectiveRoles, encodeFilterValue, encodeFilterValues, errorContextInterceptor, fileMatchesAccept, formatFileSize, formatIsoDate, formatIsoDateTime, formatTime, forwardContext, getEligibleIds, getEligibleOptions, getErrorMessage, hasMappedDataFields, humanReadableMessage, iconPath, isoKey, issueToErrors, maxLengthIssue, mergeFieldText, mergeWarningLines, messagePreviewHtml, normalizeHexColor, normalizeRoles, parseBizHours, parseCcList, parseIso, parseTime, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, roleNumber, sendExistingEnvelope, serializeBizHours, signerProblems, signerRoleLabel, stripVideoLink, suggestDocumentSubject, videoMessageLine };
37811
37804
 
37812
37805
  //# sourceMappingURL=forgeroute-ui.mjs.map