@forgeroute/ui 0.4.1 → 0.4.2

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.
@@ -4,7 +4,7 @@ import { HttpClient, HttpErrorResponse, HttpParams } from "@angular/common/http"
4
4
  import { takeUntilDestroyed, toObservable } from "@angular/core/rxjs-interop";
5
5
  import { catchError, debounceTime, distinctUntilChanged, skip, switchMap } from "rxjs/operators";
6
6
  import { Subject, catchError as catchError$1, debounceTime as debounceTime$1, defer, distinctUntilChanged as distinctUntilChanged$1, filter, map, of, switchMap as switchMap$1, take, throwError } from "rxjs";
7
- import { DOCUMENT, DatePipe, DecimalPipe, NgTemplateOutlet, isPlatformBrowser } from "@angular/common";
7
+ import { DOCUMENT, DatePipe, DecimalPipe, Location, NgTemplateOutlet, isPlatformBrowser } from "@angular/common";
8
8
  import * as i1 from "@angular/forms";
9
9
  import { FormControl, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ReactiveFormsModule } from "@angular/forms";
10
10
  import { NavigationEnd, Router, RouterLink, RouterLinkActive } from "@angular/router";
@@ -3511,6 +3511,7 @@ var TextInputComponent = class TextInputComponent {
3511
3511
  this.min = input(void 0, ...ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []);
3512
3512
  this.max = input(void 0, ...ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []);
3513
3513
  this.maxDecimals = input(void 0, ...ngDevMode ? [{ debugName: "maxDecimals" }] : /* istanbul ignore next */ []);
3514
+ this.step = input(void 0, ...ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []);
3514
3515
  this.valueType = input("string", ...ngDevMode ? [{ debugName: "valueType" }] : /* istanbul ignore next */ []);
3515
3516
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
3516
3517
  this.focused = output();
@@ -3525,6 +3526,10 @@ var TextInputComponent = class TextInputComponent {
3525
3526
  this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
3526
3527
  this._reveal = createFieldReveal(this.showErrors);
3527
3528
  this._numeric = computed(() => this.valueType() === "number" && this.type() === "number", ...ngDevMode ? [{ debugName: "_numeric" }] : /* istanbul ignore next */ []);
3529
+ this._stepAttr = computed(() => {
3530
+ const step = this.step();
3531
+ return this.type() === "number" && typeof step === "number" && Number.isFinite(step) && step > 0 ? String(step) : null;
3532
+ }, ...ngDevMode ? [{ debugName: "_stepAttr" }] : /* istanbul ignore next */ []);
3528
3533
  this._warned = false;
3529
3534
  this._formatting = computed(() => this.phoneFormat() || this.type() === "tel", ...ngDevMode ? [{ debugName: "_formatting" }] : /* istanbul ignore next */ []);
3530
3535
  this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
@@ -3779,6 +3784,13 @@ var TextInputComponent = class TextInputComponent {
3779
3784
  isRequired: false,
3780
3785
  transformFunction: null
3781
3786
  },
3787
+ step: {
3788
+ classPropertyName: "step",
3789
+ publicName: "step",
3790
+ isSignal: true,
3791
+ isRequired: false,
3792
+ transformFunction: null
3793
+ },
3782
3794
  valueType: {
3783
3795
  classPropertyName: "valueType",
3784
3796
  publicName: "valueType",
@@ -3842,6 +3854,7 @@ var TextInputComponent = class TextInputComponent {
3842
3854
  [disabled]="disabled()"
3843
3855
  [readOnly]="readonly()"
3844
3856
  [attr.maxlength]="maxlength() ?? null"
3857
+ [attr.step]="_stepAttr()"
3845
3858
  [attr.autocomplete]="autocomplete()"
3846
3859
  [attr.required]="required() || null"
3847
3860
  [attr.aria-label]="ariaLabel() || null"
@@ -3909,6 +3922,7 @@ i0.ɵɵngDeclareClassMetadata({
3909
3922
  [disabled]="disabled()"
3910
3923
  [readOnly]="readonly()"
3911
3924
  [attr.maxlength]="maxlength() ?? null"
3925
+ [attr.step]="_stepAttr()"
3912
3926
  [attr.autocomplete]="autocomplete()"
3913
3927
  [attr.required]="required() || null"
3914
3928
  [attr.aria-label]="ariaLabel() || null"
@@ -4050,6 +4064,14 @@ i0.ɵɵngDeclareClassMetadata({
4050
4064
  required: false
4051
4065
  }]
4052
4066
  }],
4067
+ step: [{
4068
+ type: i0.Input,
4069
+ args: [{
4070
+ isSignal: true,
4071
+ alias: "step",
4072
+ required: false
4073
+ }]
4074
+ }],
4053
4075
  valueType: [{
4054
4076
  type: i0.Input,
4055
4077
  args: [{
@@ -4536,6 +4558,7 @@ var TableToolbarComponent = class TableToolbarComponent {
4536
4558
  "min",
4537
4559
  "max",
4538
4560
  "maxDecimals",
4561
+ "step",
4539
4562
  "valueType",
4540
4563
  "showErrors",
4541
4564
  "disabled"
@@ -5019,6 +5042,253 @@ function getEligibleIds(items, selectedIds, action, options = {}) {
5019
5042
  skippedCount: selected.length - eligible.length
5020
5043
  };
5021
5044
  }
5045
+ let nextTooltipId = 0;
5046
+ var TooltipDirective = class TooltipDirective {
5047
+ constructor() {
5048
+ this.uiTooltip = input("", ...ngDevMode ? [{ debugName: "uiTooltip" }] : /* istanbul ignore next */ []);
5049
+ this.tooltipPosition = input("top", ...ngDevMode ? [{ debugName: "tooltipPosition" }] : /* istanbul ignore next */ []);
5050
+ this.host = inject(ElementRef).nativeElement;
5051
+ this.doc = inject(DOCUMENT);
5052
+ this.bubble = null;
5053
+ this.id = `ui-tooltip-${nextTooltipId++}`;
5054
+ inject(DestroyRef).onDestroy(() => this.hide());
5055
+ }
5056
+ show() {
5057
+ const text = this.uiTooltip();
5058
+ if (!text || this.bubble) return;
5059
+ const el = this.doc.createElement("div");
5060
+ el.id = this.id;
5061
+ el.setAttribute("role", "tooltip");
5062
+ el.textContent = text;
5063
+ Object.assign(el.style, {
5064
+ position: "fixed",
5065
+ zIndex: "10000",
5066
+ maxWidth: "280px",
5067
+ padding: "6px 10px",
5068
+ background: "#0f172a",
5069
+ color: "#fff",
5070
+ fontSize: "0.75rem",
5071
+ lineHeight: "1.4",
5072
+ borderRadius: "6px",
5073
+ boxShadow: "0 4px 12px rgba(15,23,42,.25)",
5074
+ whiteSpace: "pre-line",
5075
+ pointerEvents: "none",
5076
+ visibility: "hidden"
5077
+ });
5078
+ this.doc.body.appendChild(el);
5079
+ this.bubble = el;
5080
+ this.host.setAttribute("aria-describedby", this.id);
5081
+ const r = this.host.getBoundingClientRect();
5082
+ const b = el.getBoundingClientRect();
5083
+ const gap = 6;
5084
+ let top = this.tooltipPosition() === "top" ? r.top - b.height - gap : r.bottom + gap;
5085
+ if (top < 4) top = r.bottom + gap;
5086
+ else if (top + b.height > window.innerHeight - 4) top = r.top - b.height - gap;
5087
+ const left = Math.min(Math.max(4, r.left + r.width / 2 - b.width / 2), window.innerWidth - b.width - 4);
5088
+ el.style.top = `${top}px`;
5089
+ el.style.left = `${left}px`;
5090
+ el.style.visibility = "visible";
5091
+ }
5092
+ hide() {
5093
+ this.bubble?.remove();
5094
+ this.bubble = null;
5095
+ this.host.removeAttribute("aria-describedby");
5096
+ }
5097
+ static {
5098
+ this.ɵfac = i0.ɵɵngDeclareFactory({
5099
+ minVersion: "12.0.0",
5100
+ version: "22.2.2",
5101
+ ngImport: i0,
5102
+ type: TooltipDirective,
5103
+ deps: [],
5104
+ target: i0.ɵɵFactoryTarget.Directive
5105
+ });
5106
+ }
5107
+ static {
5108
+ this.ɵdir = i0.ɵɵngDeclareDirective({
5109
+ minVersion: "17.1.0",
5110
+ version: "22.2.2",
5111
+ type: TooltipDirective,
5112
+ isStandalone: true,
5113
+ selector: "[uiTooltip]",
5114
+ inputs: {
5115
+ uiTooltip: {
5116
+ classPropertyName: "uiTooltip",
5117
+ publicName: "uiTooltip",
5118
+ isSignal: true,
5119
+ isRequired: false,
5120
+ transformFunction: null
5121
+ },
5122
+ tooltipPosition: {
5123
+ classPropertyName: "tooltipPosition",
5124
+ publicName: "tooltipPosition",
5125
+ isSignal: true,
5126
+ isRequired: false,
5127
+ transformFunction: null
5128
+ }
5129
+ },
5130
+ host: { listeners: {
5131
+ "mouseenter": "show()",
5132
+ "mouseleave": "hide()",
5133
+ "focusin": "show()",
5134
+ "focusout": "hide()",
5135
+ "keydown.escape": "hide()",
5136
+ "click": "hide()"
5137
+ } },
5138
+ ngImport: i0
5139
+ });
5140
+ }
5141
+ };
5142
+ i0.ɵɵngDeclareClassMetadata({
5143
+ minVersion: "12.0.0",
5144
+ version: "22.2.2",
5145
+ ngImport: i0,
5146
+ type: TooltipDirective,
5147
+ decorators: [{
5148
+ type: Directive,
5149
+ args: [{
5150
+ selector: "[uiTooltip]",
5151
+ standalone: true,
5152
+ host: {
5153
+ "(mouseenter)": "show()",
5154
+ "(mouseleave)": "hide()",
5155
+ "(focusin)": "show()",
5156
+ "(focusout)": "hide()",
5157
+ "(keydown.escape)": "hide()",
5158
+ "(click)": "hide()"
5159
+ }
5160
+ }]
5161
+ }],
5162
+ ctorParameters: () => [],
5163
+ propDecorators: {
5164
+ uiTooltip: [{
5165
+ type: i0.Input,
5166
+ args: [{
5167
+ isSignal: true,
5168
+ alias: "uiTooltip",
5169
+ required: false
5170
+ }]
5171
+ }],
5172
+ tooltipPosition: [{
5173
+ type: i0.Input,
5174
+ args: [{
5175
+ isSignal: true,
5176
+ alias: "tooltipPosition",
5177
+ required: false
5178
+ }]
5179
+ }]
5180
+ }
5181
+ });
5182
+ var StarComponent = class StarComponent {
5183
+ constructor() {
5184
+ this.tooltip = input("", ...ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []);
5185
+ this.size = input(16, ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
5186
+ this.hasTooltip = computed(() => !!this.tooltip(), ...ngDevMode ? [{ debugName: "hasTooltip" }] : /* istanbul ignore next */ []);
5187
+ }
5188
+ static {
5189
+ this.ɵfac = i0.ɵɵngDeclareFactory({
5190
+ minVersion: "12.0.0",
5191
+ version: "22.2.2",
5192
+ ngImport: i0,
5193
+ type: StarComponent,
5194
+ deps: [],
5195
+ target: i0.ɵɵFactoryTarget.Component
5196
+ });
5197
+ }
5198
+ static {
5199
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
5200
+ minVersion: "17.1.0",
5201
+ version: "22.2.2",
5202
+ type: StarComponent,
5203
+ isStandalone: true,
5204
+ selector: "ui-star",
5205
+ inputs: {
5206
+ tooltip: {
5207
+ classPropertyName: "tooltip",
5208
+ publicName: "tooltip",
5209
+ isSignal: true,
5210
+ isRequired: false,
5211
+ transformFunction: null
5212
+ },
5213
+ size: {
5214
+ classPropertyName: "size",
5215
+ publicName: "size",
5216
+ isSignal: true,
5217
+ isRequired: false,
5218
+ transformFunction: null
5219
+ }
5220
+ },
5221
+ ngImport: i0,
5222
+ template: `
5223
+ <span class="star"
5224
+ [uiTooltip]="tooltip()"
5225
+ [attr.role]="hasTooltip() ? 'img' : null"
5226
+ [attr.aria-label]="hasTooltip() ? tooltip() : null"
5227
+ [attr.aria-hidden]="hasTooltip() ? null : 'true'"
5228
+ [attr.tabindex]="hasTooltip() ? 0 : null">
5229
+ <svg [attr.width]="size()" [attr.height]="size()" viewBox="0 0 20 20" aria-hidden="true" focusable="false">
5230
+ <path class="star-shape" d="M10 1.5l2.6 5.3 5.9.9-4.25 4.15 1 5.85L10 14.9l-5.25 2.8 1-5.85L1.5 7.7l5.9-.9L10 1.5z" />
5231
+ </svg>
5232
+ </span>
5233
+ `,
5234
+ isInline: true,
5235
+ styles: [":host{display:inline-flex;vertical-align:middle;line-height:1}.star{display:inline-flex;align-items:center;justify-content:center;border-radius:3px}.star:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.star-shape{fill:#f5b301;stroke:#d99a00;stroke-width:.75;stroke-linejoin:round}\n"],
5236
+ dependencies: [{
5237
+ kind: "directive",
5238
+ type: TooltipDirective,
5239
+ selector: "[uiTooltip]",
5240
+ inputs: ["uiTooltip", "tooltipPosition"]
5241
+ }],
5242
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
5243
+ });
5244
+ }
5245
+ };
5246
+ i0.ɵɵngDeclareClassMetadata({
5247
+ minVersion: "12.0.0",
5248
+ version: "22.2.2",
5249
+ ngImport: i0,
5250
+ type: StarComponent,
5251
+ decorators: [{
5252
+ type: Component,
5253
+ args: [{
5254
+ selector: "ui-star",
5255
+ standalone: true,
5256
+ changeDetection: ChangeDetectionStrategy.OnPush,
5257
+ imports: [TooltipDirective],
5258
+ template: `
5259
+ <span class="star"
5260
+ [uiTooltip]="tooltip()"
5261
+ [attr.role]="hasTooltip() ? 'img' : null"
5262
+ [attr.aria-label]="hasTooltip() ? tooltip() : null"
5263
+ [attr.aria-hidden]="hasTooltip() ? null : 'true'"
5264
+ [attr.tabindex]="hasTooltip() ? 0 : null">
5265
+ <svg [attr.width]="size()" [attr.height]="size()" viewBox="0 0 20 20" aria-hidden="true" focusable="false">
5266
+ <path class="star-shape" d="M10 1.5l2.6 5.3 5.9.9-4.25 4.15 1 5.85L10 14.9l-5.25 2.8 1-5.85L1.5 7.7l5.9-.9L10 1.5z" />
5267
+ </svg>
5268
+ </span>
5269
+ `,
5270
+ styles: [":host{display:inline-flex;vertical-align:middle;line-height:1}.star{display:inline-flex;align-items:center;justify-content:center;border-radius:3px}.star:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.star-shape{fill:#f5b301;stroke:#d99a00;stroke-width:.75;stroke-linejoin:round}\n"]
5271
+ }]
5272
+ }],
5273
+ propDecorators: {
5274
+ tooltip: [{
5275
+ type: i0.Input,
5276
+ args: [{
5277
+ isSignal: true,
5278
+ alias: "tooltip",
5279
+ required: false
5280
+ }]
5281
+ }],
5282
+ size: [{
5283
+ type: i0.Input,
5284
+ args: [{
5285
+ isSignal: true,
5286
+ alias: "size",
5287
+ required: false
5288
+ }]
5289
+ }]
5290
+ }
5291
+ });
5022
5292
  var SkeletonComponent = class SkeletonComponent {
5023
5293
  constructor() {
5024
5294
  this.height = input(20, ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
@@ -5166,143 +5436,6 @@ i0.ɵɵngDeclareClassMetadata({
5166
5436
  }]
5167
5437
  }
5168
5438
  });
5169
- let nextTooltipId = 0;
5170
- var TooltipDirective = class TooltipDirective {
5171
- constructor() {
5172
- this.uiTooltip = input("", ...ngDevMode ? [{ debugName: "uiTooltip" }] : /* istanbul ignore next */ []);
5173
- this.tooltipPosition = input("top", ...ngDevMode ? [{ debugName: "tooltipPosition" }] : /* istanbul ignore next */ []);
5174
- this.host = inject(ElementRef).nativeElement;
5175
- this.doc = inject(DOCUMENT);
5176
- this.bubble = null;
5177
- this.id = `ui-tooltip-${nextTooltipId++}`;
5178
- inject(DestroyRef).onDestroy(() => this.hide());
5179
- }
5180
- show() {
5181
- const text = this.uiTooltip();
5182
- if (!text || this.bubble) return;
5183
- const el = this.doc.createElement("div");
5184
- el.id = this.id;
5185
- el.setAttribute("role", "tooltip");
5186
- el.textContent = text;
5187
- Object.assign(el.style, {
5188
- position: "fixed",
5189
- zIndex: "10000",
5190
- maxWidth: "280px",
5191
- padding: "6px 10px",
5192
- background: "#0f172a",
5193
- color: "#fff",
5194
- fontSize: "0.75rem",
5195
- lineHeight: "1.4",
5196
- borderRadius: "6px",
5197
- boxShadow: "0 4px 12px rgba(15,23,42,.25)",
5198
- whiteSpace: "pre-line",
5199
- pointerEvents: "none",
5200
- visibility: "hidden"
5201
- });
5202
- this.doc.body.appendChild(el);
5203
- this.bubble = el;
5204
- this.host.setAttribute("aria-describedby", this.id);
5205
- const r = this.host.getBoundingClientRect();
5206
- const b = el.getBoundingClientRect();
5207
- const gap = 6;
5208
- let top = this.tooltipPosition() === "top" ? r.top - b.height - gap : r.bottom + gap;
5209
- if (top < 4) top = r.bottom + gap;
5210
- else if (top + b.height > window.innerHeight - 4) top = r.top - b.height - gap;
5211
- const left = Math.min(Math.max(4, r.left + r.width / 2 - b.width / 2), window.innerWidth - b.width - 4);
5212
- el.style.top = `${top}px`;
5213
- el.style.left = `${left}px`;
5214
- el.style.visibility = "visible";
5215
- }
5216
- hide() {
5217
- this.bubble?.remove();
5218
- this.bubble = null;
5219
- this.host.removeAttribute("aria-describedby");
5220
- }
5221
- static {
5222
- this.ɵfac = i0.ɵɵngDeclareFactory({
5223
- minVersion: "12.0.0",
5224
- version: "22.2.2",
5225
- ngImport: i0,
5226
- type: TooltipDirective,
5227
- deps: [],
5228
- target: i0.ɵɵFactoryTarget.Directive
5229
- });
5230
- }
5231
- static {
5232
- this.ɵdir = i0.ɵɵngDeclareDirective({
5233
- minVersion: "17.1.0",
5234
- version: "22.2.2",
5235
- type: TooltipDirective,
5236
- isStandalone: true,
5237
- selector: "[uiTooltip]",
5238
- inputs: {
5239
- uiTooltip: {
5240
- classPropertyName: "uiTooltip",
5241
- publicName: "uiTooltip",
5242
- isSignal: true,
5243
- isRequired: false,
5244
- transformFunction: null
5245
- },
5246
- tooltipPosition: {
5247
- classPropertyName: "tooltipPosition",
5248
- publicName: "tooltipPosition",
5249
- isSignal: true,
5250
- isRequired: false,
5251
- transformFunction: null
5252
- }
5253
- },
5254
- host: { listeners: {
5255
- "mouseenter": "show()",
5256
- "mouseleave": "hide()",
5257
- "focusin": "show()",
5258
- "focusout": "hide()",
5259
- "keydown.escape": "hide()",
5260
- "click": "hide()"
5261
- } },
5262
- ngImport: i0
5263
- });
5264
- }
5265
- };
5266
- i0.ɵɵngDeclareClassMetadata({
5267
- minVersion: "12.0.0",
5268
- version: "22.2.2",
5269
- ngImport: i0,
5270
- type: TooltipDirective,
5271
- decorators: [{
5272
- type: Directive,
5273
- args: [{
5274
- selector: "[uiTooltip]",
5275
- standalone: true,
5276
- host: {
5277
- "(mouseenter)": "show()",
5278
- "(mouseleave)": "hide()",
5279
- "(focusin)": "show()",
5280
- "(focusout)": "hide()",
5281
- "(keydown.escape)": "hide()",
5282
- "(click)": "hide()"
5283
- }
5284
- }]
5285
- }],
5286
- ctorParameters: () => [],
5287
- propDecorators: {
5288
- uiTooltip: [{
5289
- type: i0.Input,
5290
- args: [{
5291
- isSignal: true,
5292
- alias: "uiTooltip",
5293
- required: false
5294
- }]
5295
- }],
5296
- tooltipPosition: [{
5297
- type: i0.Input,
5298
- args: [{
5299
- isSignal: true,
5300
- alias: "tooltipPosition",
5301
- required: false
5302
- }]
5303
- }]
5304
- }
5305
- });
5306
5439
  const MIN_VISIBLE_PERCENT = 2;
5307
5440
  var ProgressBarComponent = class ProgressBarComponent {
5308
5441
  constructor() {
@@ -8266,6 +8399,7 @@ var DataTableComponent = class DataTableComponent {
8266
8399
  this.itemLabelPlural = input("", ...ngDevMode ? [{ debugName: "itemLabelPlural" }] : /* istanbul ignore next */ []);
8267
8400
  this.bulkUpdateOptions = input([], ...ngDevMode ? [{ debugName: "bulkUpdateOptions" }] : /* istanbul ignore next */ []);
8268
8401
  this.rowClick = output();
8402
+ this.linkClick = output();
8269
8403
  this.rowClickableFn = input(null, ...ngDevMode ? [{ debugName: "rowClickableFn" }] : /* istanbul ignore next */ []);
8270
8404
  this.rowLabelFn = input(null, ...ngDevMode ? [{ debugName: "rowLabelFn" }] : /* istanbul ignore next */ []);
8271
8405
  this.tableButtonClick = output();
@@ -8524,6 +8658,7 @@ var DataTableComponent = class DataTableComponent {
8524
8658
  })).filter((f) => f.cf !== null), ...ngDevMode ? [{ debugName: "_phoneFilterCols" }] : /* istanbul ignore next */ []);
8525
8659
  this._showColumnControls = computed(() => !this._error() && (this._items().length > 0 || !!this._sortField() || Object.values(this._colFilterValues()).some((v) => v.length > 0)), ...ngDevMode ? [{ debugName: "_showColumnControls" }] : /* istanbul ignore next */ []);
8526
8660
  this._hasPhoneControls = computed(() => this._phoneSortOptions().length > 1 || this._phoneFilterCols().length > 0, ...ngDevMode ? [{ debugName: "_hasPhoneControls" }] : /* istanbul ignore next */ []);
8661
+ this._injector = inject(Injector);
8527
8662
  this._silentNext = false;
8528
8663
  if (typeof window !== "undefined" && typeof window.matchMedia === "function") {
8529
8664
  const mq = window.matchMedia("(max-width: 640px)");
@@ -8978,6 +9113,80 @@ var DataTableComponent = class DataTableComponent {
8978
9113
  phoneCell(value) {
8979
9114
  return formatPhone$2(value);
8980
9115
  }
9116
+ _safeHref(raw) {
9117
+ if (typeof raw !== "string") return null;
9118
+ const h = raw.trim();
9119
+ if (!h || /[\u0000-\u001f\u007f]/.test(h)) return null;
9120
+ if (/^(mailto|tel):\S/i.test(h) || /^https?:\/\/\S/i.test(h) || /^\/(?![\/\\])/.test(h)) return h;
9121
+ return null;
9122
+ }
9123
+ linkView(col, item) {
9124
+ let target = null;
9125
+ try {
9126
+ const r = col.linkFn?.(item, item[col.key]);
9127
+ if (typeof r === "string") target = r.trim() ? { href: r } : null;
9128
+ else if (r && typeof r === "object") target = r;
9129
+ } catch {
9130
+ target = null;
9131
+ }
9132
+ let raw;
9133
+ try {
9134
+ raw = col.render ? col.render(item) : item[col.key];
9135
+ } catch {
9136
+ raw = item[col.key];
9137
+ }
9138
+ const own = raw === null || raw === void 0 ? "" : String(raw);
9139
+ const text = own !== "" ? own : typeof target?.label === "string" && target.label !== "" ? target.label : "—";
9140
+ if (!target || text === "—") return {
9141
+ text,
9142
+ link: null
9143
+ };
9144
+ let href = null;
9145
+ let tree = null;
9146
+ const rl = target.routerLink;
9147
+ if (rl !== void 0 && rl !== null && (typeof rl === "string" ? rl.trim() !== "" : rl.length > 0)) try {
9148
+ const router = this._injector.get(Router);
9149
+ tree = router.createUrlTree(typeof rl === "string" ? [rl] : [...rl], { queryParams: target.queryParams });
9150
+ href = this._injector.get(Location).prepareExternalUrl(router.serializeUrl(tree));
9151
+ } catch {
9152
+ return {
9153
+ text,
9154
+ link: null
9155
+ };
9156
+ }
9157
+ else href = this._safeHref(target.href);
9158
+ if (!href) return {
9159
+ text,
9160
+ link: null
9161
+ };
9162
+ const blank = target.target === "_blank";
9163
+ const external = /^https?:/i.test(href);
9164
+ const label = typeof target.ariaLabel === "string" && target.ariaLabel !== "" ? target.ariaLabel : null;
9165
+ return {
9166
+ text,
9167
+ link: {
9168
+ href,
9169
+ tree,
9170
+ blank,
9171
+ rel: blank || external ? "noopener noreferrer" : null,
9172
+ download: target.download === true,
9173
+ ariaLabel: label === null ? null : blank ? `${label} (opens in a new tab)` : label
9174
+ }
9175
+ };
9176
+ }
9177
+ onLinkClick(e, link, col, item) {
9178
+ e.stopPropagation();
9179
+ this.linkClick.emit({
9180
+ item,
9181
+ column: col,
9182
+ href: link.href
9183
+ });
9184
+ const plain = e.button === 0 && !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey;
9185
+ if (link.tree && plain && !link.blank && !e.defaultPrevented) {
9186
+ e.preventDefault();
9187
+ this._injector.get(Router).navigateByUrl(link.tree);
9188
+ }
9189
+ }
8981
9190
  getInitials(name) {
8982
9191
  return name.split(" ").filter(Boolean).map((p) => p[0]).slice(0, 2).join("").toUpperCase();
8983
9192
  }
@@ -8992,6 +9201,7 @@ var DataTableComponent = class DataTableComponent {
8992
9201
  return v ? this._datePipe.transform(v, col.dateFormat ?? "MMM d, y") ?? "—" : "—";
8993
9202
  }
8994
9203
  case "phone": return formatPhone$2(item[col.key]);
9204
+ case "link": return this.linkView(col, item).text;
8995
9205
  case "days-ago": {
8996
9206
  const days = item[col.daysKey ?? col.key];
8997
9207
  return days != null ? `${days}d ago` : "Never";
@@ -9222,6 +9432,7 @@ var DataTableComponent = class DataTableComponent {
9222
9432
  },
9223
9433
  outputs: {
9224
9434
  rowClick: "rowClick",
9435
+ linkClick: "linkClick",
9225
9436
  tableButtonClick: "tableButtonClick",
9226
9437
  panelActionClick: "panelActionClick",
9227
9438
  saveViewClick: "saveViewClick",
@@ -9363,6 +9574,23 @@ var DataTableComponent = class DataTableComponent {
9363
9574
  }
9364
9575
  </ng-template>
9365
9576
 
9577
+ <!-- Shared link-cell markup (table cell + mobile card). Real anchor; text is escaped by interpolation. -->
9578
+ <ng-template #linkCell let-col="col" let-item="item">
9579
+ @let lv = linkView(col, item);
9580
+ @if (lv.link; as lk) {
9581
+ <a class="dt-link"
9582
+ [attr.href]="lk.href"
9583
+ [attr.target]="lk.blank ? '_blank' : null"
9584
+ [attr.rel]="lk.rel"
9585
+ [attr.download]="lk.download ? '' : null"
9586
+ [attr.aria-label]="lk.ariaLabel"
9587
+ (click)="onLinkClick($event, lk, col, item)"
9588
+ (keydown)="$event.stopPropagation()">{{ lv.text }}@if (lk.blank && !lk.ariaLabel) {<span class="dt-sr-only"> (opens in a new tab)</span>}</a>
9589
+ } @else {
9590
+ {{ lv.text }}
9591
+ }
9592
+ </ng-template>
9593
+
9366
9594
  <!-- ── TABLE ─────────────────────────────────────────────── -->
9367
9595
  @if (!_isPhone()) {
9368
9596
  <div class="dt-table-wrap">
@@ -9571,6 +9799,11 @@ var DataTableComponent = class DataTableComponent {
9571
9799
  <ng-container [ngTemplateOutlet]="imageCell" [ngTemplateOutletContext]="{ col: col, item: item }" />
9572
9800
  }
9573
9801
 
9802
+ <!-- Link cell -->
9803
+ @case ('link') {
9804
+ <ng-container [ngTemplateOutlet]="linkCell" [ngTemplateOutletContext]="{ col: col, item: item }" />
9805
+ }
9806
+
9574
9807
  <!-- Actions cell -->
9575
9808
  @case ('actions') {
9576
9809
  <span class="dt-actions-cell" (click)="$event.stopPropagation()">
@@ -9586,6 +9819,9 @@ var DataTableComponent = class DataTableComponent {
9586
9819
 
9587
9820
  <!-- Default: plain text -->
9588
9821
  @default {
9822
+ @if (col.starFn?.(item); as starTip) {
9823
+ <ui-star class="dt-cell-star" [tooltip]="starTip" />
9824
+ }
9589
9825
  {{ col.render ? col.render(item) : (item[col.key] ?? '—') }}
9590
9826
  }
9591
9827
 
@@ -9703,8 +9939,15 @@ var DataTableComponent = class DataTableComponent {
9703
9939
  <ui-avatar [initials]="initials" [name]="displayName" [size]="32" />
9704
9940
  <span class="dt-card-name">{{ displayName }}</span>
9705
9941
  </span>
9942
+ } @else if (tc.cellType === 'link') {
9943
+ <span class="dt-card-name dt-card-name-plain">
9944
+ <ng-container [ngTemplateOutlet]="linkCell" [ngTemplateOutletContext]="{ col: tc, item: item }" />
9945
+ </span>
9706
9946
  } @else {
9707
9947
  <span class="dt-card-name dt-card-name-plain">
9948
+ @if (tc.starFn?.(item); as starTip) {
9949
+ <ui-star class="dt-cell-star" [tooltip]="starTip" />
9950
+ }
9708
9951
  {{ tc.render ? tc.render(item) : (item[tc.key] ?? '—') }}
9709
9952
  </span>
9710
9953
  }
@@ -9754,7 +9997,11 @@ var DataTableComponent = class DataTableComponent {
9754
9997
  <span class="dt-card-detail-label">{{ dc.label }}</span>
9755
9998
  <span class="dt-card-detail-value"
9756
9999
  [class.dt-overdue]="dc.cellType === 'days-ago' && isCardOverdue(dc, item)">
9757
- {{ val }}</span>
10000
+ @if (dc.cellType === 'link') {
10001
+ <ng-container [ngTemplateOutlet]="linkCell" [ngTemplateOutletContext]="{ col: dc, item: item }" />
10002
+ } @else {
10003
+ {{ val }}
10004
+ }</span>
9758
10005
  </div>
9759
10006
  }
9760
10007
  }
@@ -9826,7 +10073,7 @@ var DataTableComponent = class DataTableComponent {
9826
10073
  </div>
9827
10074
  `,
9828
10075
  isInline: true,
9829
- styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0}.dt-host{display:flex;flex-direction:column;height:100%;min-height:0}.dt-header{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap;justify-content:space-between;position:relative;z-index:10}.dt-header-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.dt-header-right{display:flex;align-items:center;gap:8px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}.dt-sk-shimmer{position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-shimmer:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}@keyframes dt-shimmer{to{transform:translate(200%)}}.dt-sk-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}.dt-sk-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.dt-sk-toolbar-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.dt-sk-search{display:flex;align-items:center;gap:10px;width:380px;height:36px;padding:0 12px;border:1px solid #e2e8f0;border-radius:6px;background:#f8fafc;box-sizing:border-box}.dt-sk-search-icon{width:16px;height:16px;border-radius:50%;flex-shrink:0}.dt-sk-search-text{flex:1;height:11px;border-radius:4px}.dt-sk-tab-strip{display:flex;gap:2px;padding:3px;background:#f1f5f9;border-radius:8px}.dt-sk-tab{height:28px;width:70px;border-radius:6px}.dt-sk-icon-btn{width:32px;height:32px;border-radius:6px}.dt-skeleton{border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dt-sk-header{display:flex;gap:24px;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.dt-sk-row{display:flex;gap:24px;padding:13px 16px;border-bottom:1px solid #f1f5f9}.dt-sk-row:last-child{border-bottom:none}.dt-sk-cell{flex:1;height:13px;border-radius:4px;position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-cell:first-child{max-width:100px}.dt-sk-cell:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}.dt-sk-head{height:10px}.dt-table-wrap{flex:1;min-height:0;overflow:auto;border:1px solid #e2e8f0;border-radius:10px 10px 0 0}.dt-sk-reload-row td{padding:10px 14px;border-bottom:1px solid #f1f5f9}table{width:100%;border-collapse:collapse;font-size:.875rem}thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}thead{position:sticky;top:0;z-index:2}th{padding:10px 14px;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;border-right:1px solid #e2e8f0;text-align:center;background:#f8fafc}th:last-child{border-right:none}th.dt-th-sorted{background:#f1f5f9}th.dt-th-actions{width:48px}.dt-th-inner{display:flex;align-items:center;justify-content:center;gap:4px}.dt-sort-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;font-size:inherit;font-weight:inherit;color:inherit;font-family:inherit;padding:0;text-transform:inherit;letter-spacing:inherit}.dt-sort-btn:hover{color:#1e293b}.dt-sort-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:2px}@media(pointer:coarse){.dt-sort-btn{position:relative}.dt-sort-btn:after{content:\"\";position:absolute;left:-4px;right:-4px;top:50%;height:44px;transform:translateY(-50%)}}.dt-sort-icon{transition:transform .15s}.dt-sort-desc{transform:rotate(180deg)}.dt-sort-inactive{opacity:.4}tbody tr{border-bottom:1px solid #f1f5f9;background:#fff;transition:background .1s}tbody tr:last-child{border-bottom:none}tbody tr:hover{background:#f8fafc}.dt-row-clickable{cursor:pointer}.dt-row-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}td{padding:10px 14px;color:#334155;vertical-align:middle;white-space:nowrap;border-right:1px solid #f1f5f9}td:last-child{border-right:none}.dt-td-actions{text-align:center;padding:6px 8px}.dt-td-width{overflow:hidden;text-overflow:ellipsis}.dt-img{display:inline-block;vertical-align:middle;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;flex-shrink:0}.dt-img-ph{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;color:#94a3b8;background:#f1f5f9;border:1px solid #e2e8f0;flex-shrink:0}.dt-img-ph svg{width:55%;height:55%}.dt-img-circle-md{width:40px;height:40px;border-radius:50%}.dt-img-circle-sm{width:28px;height:28px;border-radius:50%}.dt-img-rounded-md{width:48px;height:32px;border-radius:6px}.dt-img-rounded-sm{width:36px;height:24px;border-radius:5px}.dt-avatar-name{display:flex;align-items:center;gap:8px}.dt-name-text{color:#1e293b}.dt-overdue{color:#dc2626;font-weight:500}.dt-none{color:#94a3b8}.dt-tags{display:flex;align-items:center;gap:4px}.dt-tags-more{font-size:.75rem;font-weight:600;color:#475569;background:#f1f5f9;border-radius:999px;padding:2px 7px;cursor:default;-webkit-user-select:none;user-select:none;border:1px solid #e2e8f0}.dt-tags-more:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:999px}.dt-tag-tooltip{position:fixed;z-index:9999;pointer-events:none;background:#1e293b;border-radius:10px;padding:8px 10px;display:flex;flex-direction:column;gap:5px;box-shadow:0 4px 6px #0000000f,0 10px 24px #00000024;transform:translate(-50%) translateY(-100%);animation:dt-tip-in .12s ease;max-width:220px}@keyframes dt-tip-in{0%{opacity:0;transform:translate(-50%) translateY(calc(-100% + 4px))}to{opacity:1;transform:translate(-50%) translateY(-100%)}}.dt-actions-cell{display:flex;align-items:center;justify-content:center}.dt-bulk-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;align-self:flex-start;padding:10px 14px;margin-bottom:8px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px}.dt-bulk-count{font-size:.875rem;font-weight:600;color:#1e40af;white-space:nowrap;flex-shrink:0}.dt-bulk-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:1;min-width:0}.dt-bulk-actions ui-select{max-width:180px;min-width:120px}.dt-bulk-hint{font-size:.8125rem;line-height:1.35;color:#475569}.dt-card-cb{display:flex;align-items:center;padding:0 0 6px}.dt-card-selected{background:#eff6ff!important;border-color:#bfdbfe!important}.dt-th-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-row-selected{background:#eff6ff!important}.dt-row-selected:hover{background:#dbeafe!important}.dt-state-cell{padding:0!important;border:none!important;background:#fff!important}@media(max-width:1024px){th{padding:10px 12px}td{padding:11px 12px}.dt-sort-btn{padding:4px 0}.dt-td-actions{padding:6px}.dt-bulk-bar{align-self:stretch}}@media(max-width:768px){th{padding:9px 10px;font-size:.8125rem}td{padding:10px;font-size:.8125rem}.dt-sk-search{width:100%}}@media(max-width:640px){.dt-header{flex-direction:column;align-items:stretch}.dt-header-left,.dt-header-right{width:100%}.dt-table-wrap{display:none}.dt-sk-search{width:100%}.dt-sk-toolbar{flex-direction:column;align-items:stretch;gap:8px}.dt-sk-toolbar-right{align-self:flex-end}.dt-bulk-bar{align-self:stretch;padding:10px 12px;row-gap:8px}.dt-bulk-count{flex:1}.dt-bulk-actions{width:100%}.dt-bulk-hint{flex-basis:100%}.dt-bulk-actions ui-select{max-width:100%;flex:1}}.dt-confirm-msg{margin:0;font-size:.9375rem;color:#334155;line-height:1.5;overflow-wrap:anywhere;word-break:break-word;white-space:pre-line}.dt-confirm-details{margin:10px 0 0;padding-left:20px;font-size:.875rem;color:#64748b;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}.dt-confirm-details li+li{margin-top:4px}ui-pagination{flex-shrink:0}.dt-phone-controls{display:flex;flex-direction:column;gap:8px;margin-bottom:8px;flex-shrink:0}.dt-phone-sort{display:flex;align-items:center;gap:8px}.dt-phone-sort-label{font-size:.8125rem;font-weight:600;color:#64748b;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 12px;font-family:inherit;font-size:1rem;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px}.dt-phone-filters{display:flex;flex-wrap:wrap;gap:8px}.dt-card-list{display:none;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}@media(max-width:640px){.dt-card-list{display:flex;padding-bottom:8px}}.dt-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;contain:layout style;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:background .1s}.dt-card:has(.mm-dropdown){position:relative;z-index:1}.dt-card-clickable{cursor:pointer}.dt-card-clickable:active{background:#f8fafc}.dt-card-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.dt-card-header{display:flex;align-items:center;gap:10px}.dt-card-title{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.dt-card-name{min-width:0;font-weight:600;color:#1e293b;font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-card-name-plain{flex:1}.dt-card-actions{margin-left:auto;flex-shrink:0}.dt-card-badges{display:flex;flex-wrap:wrap;gap:6px}.dt-card-tags{display:flex;flex-wrap:wrap;gap:4px}.dt-card-details{display:flex;flex-direction:column;gap:5px}.dt-card-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.8125rem}.dt-card-detail-label{color:#64748b;flex-shrink:0}.dt-card-detail-value{color:#334155;font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere;word-break:break-word}.dt-card-sk{gap:12px}.dt-card-sk-header{display:flex;align-items:center;gap:10px}.dt-card-sk-badges{display:flex;gap:6px}.dt-card-sk-rows{display:flex;flex-direction:column;gap:8px}\n"],
10076
+ styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0}.dt-host{display:flex;flex-direction:column;height:100%;min-height:0}.dt-header{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap;justify-content:space-between;position:relative;z-index:10}.dt-header-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.dt-header-right{display:flex;align-items:center;gap:8px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}.dt-sk-shimmer{position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-shimmer:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}@keyframes dt-shimmer{to{transform:translate(200%)}}.dt-sk-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}.dt-sk-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.dt-sk-toolbar-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.dt-sk-search{display:flex;align-items:center;gap:10px;width:380px;height:36px;padding:0 12px;border:1px solid #e2e8f0;border-radius:6px;background:#f8fafc;box-sizing:border-box}.dt-sk-search-icon{width:16px;height:16px;border-radius:50%;flex-shrink:0}.dt-sk-search-text{flex:1;height:11px;border-radius:4px}.dt-sk-tab-strip{display:flex;gap:2px;padding:3px;background:#f1f5f9;border-radius:8px}.dt-sk-tab{height:28px;width:70px;border-radius:6px}.dt-sk-icon-btn{width:32px;height:32px;border-radius:6px}.dt-skeleton{border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dt-sk-header{display:flex;gap:24px;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.dt-sk-row{display:flex;gap:24px;padding:13px 16px;border-bottom:1px solid #f1f5f9}.dt-sk-row:last-child{border-bottom:none}.dt-sk-cell{flex:1;height:13px;border-radius:4px;position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-cell:first-child{max-width:100px}.dt-sk-cell:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}.dt-sk-head{height:10px}.dt-table-wrap{flex:1;min-height:0;overflow:auto;border:1px solid #e2e8f0;border-radius:10px 10px 0 0}.dt-sk-reload-row td{padding:10px 14px;border-bottom:1px solid #f1f5f9}table{width:100%;border-collapse:collapse;font-size:.875rem}thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}thead{position:sticky;top:0;z-index:2}th{padding:10px 14px;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;border-right:1px solid #e2e8f0;text-align:center;background:#f8fafc}th:last-child{border-right:none}th.dt-th-sorted{background:#f1f5f9}th.dt-th-actions{width:48px}.dt-th-inner{display:flex;align-items:center;justify-content:center;gap:4px}.dt-sort-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;font-size:inherit;font-weight:inherit;color:inherit;font-family:inherit;padding:0;text-transform:inherit;letter-spacing:inherit}.dt-sort-btn:hover{color:#1e293b}.dt-sort-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:2px}@media(pointer:coarse){.dt-sort-btn{position:relative}.dt-sort-btn:after{content:\"\";position:absolute;left:-4px;right:-4px;top:50%;height:44px;transform:translateY(-50%)}}.dt-sort-icon{transition:transform .15s}.dt-sort-desc{transform:rotate(180deg)}.dt-sort-inactive{opacity:.4}tbody tr{border-bottom:1px solid #f1f5f9;background:#fff;transition:background .1s}tbody tr:last-child{border-bottom:none}tbody tr:hover{background:#f8fafc}.dt-row-clickable{cursor:pointer}.dt-row-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}td{padding:10px 14px;color:#334155;vertical-align:middle;white-space:nowrap;border-right:1px solid #f1f5f9}td:last-child{border-right:none}.dt-td-actions{text-align:center;padding:6px 8px}.dt-td-width{overflow:hidden;text-overflow:ellipsis}.dt-img{display:inline-block;vertical-align:middle;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;flex-shrink:0}.dt-img-ph{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;color:#94a3b8;background:#f1f5f9;border:1px solid #e2e8f0;flex-shrink:0}.dt-img-ph svg{width:55%;height:55%}.dt-img-circle-md{width:40px;height:40px;border-radius:50%}.dt-img-circle-sm{width:28px;height:28px;border-radius:50%}.dt-img-rounded-md{width:48px;height:32px;border-radius:6px}.dt-img-rounded-sm{width:36px;height:24px;border-radius:5px}.dt-avatar-name{display:flex;align-items:center;gap:8px}.dt-name-text{color:#1e293b}.dt-overdue{color:#dc2626;font-weight:500}.dt-none{color:#94a3b8}.dt-link{position:relative;display:inline-block;max-width:100%;padding:1px 2px;vertical-align:bottom;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#2563eb;text-decoration:none;border-radius:3px;cursor:pointer}.dt-link:hover{text-decoration:underline;color:#1d4ed8}.dt-link:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px;text-decoration:underline}.dt-card-detail-value .dt-link,.dt-card-name .dt-link{white-space:normal;overflow-wrap:anywhere}.dt-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.dt-tags{display:flex;align-items:center;gap:4px}.dt-tags-more{font-size:.75rem;font-weight:600;color:#475569;background:#f1f5f9;border-radius:999px;padding:2px 7px;cursor:default;-webkit-user-select:none;user-select:none;border:1px solid #e2e8f0}.dt-tags-more:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:999px}.dt-tag-tooltip{position:fixed;z-index:9999;pointer-events:none;background:#1e293b;border-radius:10px;padding:8px 10px;display:flex;flex-direction:column;gap:5px;box-shadow:0 4px 6px #0000000f,0 10px 24px #00000024;transform:translate(-50%) translateY(-100%);animation:dt-tip-in .12s ease;max-width:220px}@keyframes dt-tip-in{0%{opacity:0;transform:translate(-50%) translateY(calc(-100% + 4px))}to{opacity:1;transform:translate(-50%) translateY(-100%)}}.dt-cell-star{margin-right:6px}.dt-actions-cell{display:flex;align-items:center;justify-content:center}.dt-bulk-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;align-self:flex-start;padding:10px 14px;margin-bottom:8px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px}.dt-bulk-count{font-size:.875rem;font-weight:600;color:#1e40af;white-space:nowrap;flex-shrink:0}.dt-bulk-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:1;min-width:0}.dt-bulk-actions ui-select{max-width:180px;min-width:120px}.dt-bulk-hint{font-size:.8125rem;line-height:1.35;color:#475569}.dt-card-cb{display:flex;align-items:center;padding:0 0 6px}.dt-card-selected{background:#eff6ff!important;border-color:#bfdbfe!important}.dt-th-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-row-selected{background:#eff6ff!important}.dt-row-selected:hover{background:#dbeafe!important}.dt-state-cell{padding:0!important;border:none!important;background:#fff!important}@media(max-width:1024px){th{padding:10px 12px}td{padding:11px 12px}.dt-sort-btn{padding:4px 0}.dt-td-actions{padding:6px}.dt-bulk-bar{align-self:stretch}}@media(max-width:768px){th{padding:9px 10px;font-size:.8125rem}td{padding:10px;font-size:.8125rem}.dt-sk-search{width:100%}}@media(max-width:640px){.dt-header{flex-direction:column;align-items:stretch}.dt-header-left,.dt-header-right{width:100%}.dt-table-wrap{display:none}.dt-sk-search{width:100%}.dt-sk-toolbar{flex-direction:column;align-items:stretch;gap:8px}.dt-sk-toolbar-right{align-self:flex-end}.dt-bulk-bar{align-self:stretch;padding:10px 12px;row-gap:8px}.dt-bulk-count{flex:1}.dt-bulk-actions{width:100%}.dt-bulk-hint{flex-basis:100%}.dt-bulk-actions ui-select{max-width:100%;flex:1}}.dt-confirm-msg{margin:0;font-size:.9375rem;color:#334155;line-height:1.5;overflow-wrap:anywhere;word-break:break-word;white-space:pre-line}.dt-confirm-details{margin:10px 0 0;padding-left:20px;font-size:.875rem;color:#64748b;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}.dt-confirm-details li+li{margin-top:4px}ui-pagination{flex-shrink:0}.dt-phone-controls{display:flex;flex-direction:column;gap:8px;margin-bottom:8px;flex-shrink:0}.dt-phone-sort{display:flex;align-items:center;gap:8px}.dt-phone-sort-label{font-size:.8125rem;font-weight:600;color:#64748b;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 12px;font-family:inherit;font-size:1rem;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px}.dt-phone-filters{display:flex;flex-wrap:wrap;gap:8px}.dt-card-list{display:none;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}@media(max-width:640px){.dt-card-list{display:flex;padding-bottom:8px}}.dt-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;contain:layout style;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:background .1s}.dt-card:has(.mm-dropdown){position:relative;z-index:1}.dt-card-clickable{cursor:pointer}.dt-card-clickable:active{background:#f8fafc}.dt-card-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.dt-card-header{display:flex;align-items:center;gap:10px}.dt-card-title{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.dt-card-name{min-width:0;font-weight:600;color:#1e293b;font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-card-name-plain{flex:1}.dt-card-actions{margin-left:auto;flex-shrink:0}.dt-card-badges{display:flex;flex-wrap:wrap;gap:6px}.dt-card-tags{display:flex;flex-wrap:wrap;gap:4px}.dt-card-details{display:flex;flex-direction:column;gap:5px}.dt-card-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.8125rem}.dt-card-detail-label{color:#64748b;flex-shrink:0}.dt-card-detail-value{color:#334155;font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere;word-break:break-word}.dt-card-sk{gap:12px}.dt-card-sk-header{display:flex;align-items:center;gap:10px}.dt-card-sk-badges{display:flex;gap:6px}.dt-card-sk-rows{display:flex;flex-direction:column;gap:8px}\n"],
9830
10077
  dependencies: [
9831
10078
  {
9832
10079
  kind: "directive",
@@ -9965,6 +10212,12 @@ var DataTableComponent = class DataTableComponent {
9965
10212
  "size"
9966
10213
  ]
9967
10214
  },
10215
+ {
10216
+ kind: "component",
10217
+ type: StarComponent,
10218
+ selector: "ui-star",
10219
+ inputs: ["tooltip", "size"]
10220
+ },
9968
10221
  {
9969
10222
  kind: "component",
9970
10223
  type: MoreMenuComponent,
@@ -10158,6 +10411,7 @@ i0.ɵɵngDeclareClassMetadata({
10158
10411
  FormsModule,
10159
10412
  BadgeComponent,
10160
10413
  AvatarComponent,
10414
+ StarComponent,
10161
10415
  MoreMenuComponent,
10162
10416
  SkeletonComponent,
10163
10417
  ProgressBarComponent,
@@ -10289,6 +10543,23 @@ i0.ɵɵngDeclareClassMetadata({
10289
10543
  }
10290
10544
  </ng-template>
10291
10545
 
10546
+ <!-- Shared link-cell markup (table cell + mobile card). Real anchor; text is escaped by interpolation. -->
10547
+ <ng-template #linkCell let-col="col" let-item="item">
10548
+ @let lv = linkView(col, item);
10549
+ @if (lv.link; as lk) {
10550
+ <a class="dt-link"
10551
+ [attr.href]="lk.href"
10552
+ [attr.target]="lk.blank ? '_blank' : null"
10553
+ [attr.rel]="lk.rel"
10554
+ [attr.download]="lk.download ? '' : null"
10555
+ [attr.aria-label]="lk.ariaLabel"
10556
+ (click)="onLinkClick($event, lk, col, item)"
10557
+ (keydown)="$event.stopPropagation()">{{ lv.text }}@if (lk.blank && !lk.ariaLabel) {<span class="dt-sr-only"> (opens in a new tab)</span>}</a>
10558
+ } @else {
10559
+ {{ lv.text }}
10560
+ }
10561
+ </ng-template>
10562
+
10292
10563
  <!-- ── TABLE ─────────────────────────────────────────────── -->
10293
10564
  @if (!_isPhone()) {
10294
10565
  <div class="dt-table-wrap">
@@ -10497,6 +10768,11 @@ i0.ɵɵngDeclareClassMetadata({
10497
10768
  <ng-container [ngTemplateOutlet]="imageCell" [ngTemplateOutletContext]="{ col: col, item: item }" />
10498
10769
  }
10499
10770
 
10771
+ <!-- Link cell -->
10772
+ @case ('link') {
10773
+ <ng-container [ngTemplateOutlet]="linkCell" [ngTemplateOutletContext]="{ col: col, item: item }" />
10774
+ }
10775
+
10500
10776
  <!-- Actions cell -->
10501
10777
  @case ('actions') {
10502
10778
  <span class="dt-actions-cell" (click)="$event.stopPropagation()">
@@ -10512,6 +10788,9 @@ i0.ɵɵngDeclareClassMetadata({
10512
10788
 
10513
10789
  <!-- Default: plain text -->
10514
10790
  @default {
10791
+ @if (col.starFn?.(item); as starTip) {
10792
+ <ui-star class="dt-cell-star" [tooltip]="starTip" />
10793
+ }
10515
10794
  {{ col.render ? col.render(item) : (item[col.key] ?? '—') }}
10516
10795
  }
10517
10796
 
@@ -10629,8 +10908,15 @@ i0.ɵɵngDeclareClassMetadata({
10629
10908
  <ui-avatar [initials]="initials" [name]="displayName" [size]="32" />
10630
10909
  <span class="dt-card-name">{{ displayName }}</span>
10631
10910
  </span>
10911
+ } @else if (tc.cellType === 'link') {
10912
+ <span class="dt-card-name dt-card-name-plain">
10913
+ <ng-container [ngTemplateOutlet]="linkCell" [ngTemplateOutletContext]="{ col: tc, item: item }" />
10914
+ </span>
10632
10915
  } @else {
10633
10916
  <span class="dt-card-name dt-card-name-plain">
10917
+ @if (tc.starFn?.(item); as starTip) {
10918
+ <ui-star class="dt-cell-star" [tooltip]="starTip" />
10919
+ }
10634
10920
  {{ tc.render ? tc.render(item) : (item[tc.key] ?? '—') }}
10635
10921
  </span>
10636
10922
  }
@@ -10680,7 +10966,11 @@ i0.ɵɵngDeclareClassMetadata({
10680
10966
  <span class="dt-card-detail-label">{{ dc.label }}</span>
10681
10967
  <span class="dt-card-detail-value"
10682
10968
  [class.dt-overdue]="dc.cellType === 'days-ago' && isCardOverdue(dc, item)">
10683
- {{ val }}</span>
10969
+ @if (dc.cellType === 'link') {
10970
+ <ng-container [ngTemplateOutlet]="linkCell" [ngTemplateOutletContext]="{ col: dc, item: item }" />
10971
+ } @else {
10972
+ {{ val }}
10973
+ }</span>
10684
10974
  </div>
10685
10975
  }
10686
10976
  }
@@ -10751,7 +11041,7 @@ i0.ɵɵngDeclareClassMetadata({
10751
11041
  }
10752
11042
  </div>
10753
11043
  `,
10754
- styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0}.dt-host{display:flex;flex-direction:column;height:100%;min-height:0}.dt-header{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap;justify-content:space-between;position:relative;z-index:10}.dt-header-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.dt-header-right{display:flex;align-items:center;gap:8px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}.dt-sk-shimmer{position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-shimmer:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}@keyframes dt-shimmer{to{transform:translate(200%)}}.dt-sk-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}.dt-sk-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.dt-sk-toolbar-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.dt-sk-search{display:flex;align-items:center;gap:10px;width:380px;height:36px;padding:0 12px;border:1px solid #e2e8f0;border-radius:6px;background:#f8fafc;box-sizing:border-box}.dt-sk-search-icon{width:16px;height:16px;border-radius:50%;flex-shrink:0}.dt-sk-search-text{flex:1;height:11px;border-radius:4px}.dt-sk-tab-strip{display:flex;gap:2px;padding:3px;background:#f1f5f9;border-radius:8px}.dt-sk-tab{height:28px;width:70px;border-radius:6px}.dt-sk-icon-btn{width:32px;height:32px;border-radius:6px}.dt-skeleton{border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dt-sk-header{display:flex;gap:24px;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.dt-sk-row{display:flex;gap:24px;padding:13px 16px;border-bottom:1px solid #f1f5f9}.dt-sk-row:last-child{border-bottom:none}.dt-sk-cell{flex:1;height:13px;border-radius:4px;position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-cell:first-child{max-width:100px}.dt-sk-cell:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}.dt-sk-head{height:10px}.dt-table-wrap{flex:1;min-height:0;overflow:auto;border:1px solid #e2e8f0;border-radius:10px 10px 0 0}.dt-sk-reload-row td{padding:10px 14px;border-bottom:1px solid #f1f5f9}table{width:100%;border-collapse:collapse;font-size:.875rem}thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}thead{position:sticky;top:0;z-index:2}th{padding:10px 14px;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;border-right:1px solid #e2e8f0;text-align:center;background:#f8fafc}th:last-child{border-right:none}th.dt-th-sorted{background:#f1f5f9}th.dt-th-actions{width:48px}.dt-th-inner{display:flex;align-items:center;justify-content:center;gap:4px}.dt-sort-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;font-size:inherit;font-weight:inherit;color:inherit;font-family:inherit;padding:0;text-transform:inherit;letter-spacing:inherit}.dt-sort-btn:hover{color:#1e293b}.dt-sort-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:2px}@media(pointer:coarse){.dt-sort-btn{position:relative}.dt-sort-btn:after{content:\"\";position:absolute;left:-4px;right:-4px;top:50%;height:44px;transform:translateY(-50%)}}.dt-sort-icon{transition:transform .15s}.dt-sort-desc{transform:rotate(180deg)}.dt-sort-inactive{opacity:.4}tbody tr{border-bottom:1px solid #f1f5f9;background:#fff;transition:background .1s}tbody tr:last-child{border-bottom:none}tbody tr:hover{background:#f8fafc}.dt-row-clickable{cursor:pointer}.dt-row-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}td{padding:10px 14px;color:#334155;vertical-align:middle;white-space:nowrap;border-right:1px solid #f1f5f9}td:last-child{border-right:none}.dt-td-actions{text-align:center;padding:6px 8px}.dt-td-width{overflow:hidden;text-overflow:ellipsis}.dt-img{display:inline-block;vertical-align:middle;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;flex-shrink:0}.dt-img-ph{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;color:#94a3b8;background:#f1f5f9;border:1px solid #e2e8f0;flex-shrink:0}.dt-img-ph svg{width:55%;height:55%}.dt-img-circle-md{width:40px;height:40px;border-radius:50%}.dt-img-circle-sm{width:28px;height:28px;border-radius:50%}.dt-img-rounded-md{width:48px;height:32px;border-radius:6px}.dt-img-rounded-sm{width:36px;height:24px;border-radius:5px}.dt-avatar-name{display:flex;align-items:center;gap:8px}.dt-name-text{color:#1e293b}.dt-overdue{color:#dc2626;font-weight:500}.dt-none{color:#94a3b8}.dt-tags{display:flex;align-items:center;gap:4px}.dt-tags-more{font-size:.75rem;font-weight:600;color:#475569;background:#f1f5f9;border-radius:999px;padding:2px 7px;cursor:default;-webkit-user-select:none;user-select:none;border:1px solid #e2e8f0}.dt-tags-more:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:999px}.dt-tag-tooltip{position:fixed;z-index:9999;pointer-events:none;background:#1e293b;border-radius:10px;padding:8px 10px;display:flex;flex-direction:column;gap:5px;box-shadow:0 4px 6px #0000000f,0 10px 24px #00000024;transform:translate(-50%) translateY(-100%);animation:dt-tip-in .12s ease;max-width:220px}@keyframes dt-tip-in{0%{opacity:0;transform:translate(-50%) translateY(calc(-100% + 4px))}to{opacity:1;transform:translate(-50%) translateY(-100%)}}.dt-actions-cell{display:flex;align-items:center;justify-content:center}.dt-bulk-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;align-self:flex-start;padding:10px 14px;margin-bottom:8px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px}.dt-bulk-count{font-size:.875rem;font-weight:600;color:#1e40af;white-space:nowrap;flex-shrink:0}.dt-bulk-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:1;min-width:0}.dt-bulk-actions ui-select{max-width:180px;min-width:120px}.dt-bulk-hint{font-size:.8125rem;line-height:1.35;color:#475569}.dt-card-cb{display:flex;align-items:center;padding:0 0 6px}.dt-card-selected{background:#eff6ff!important;border-color:#bfdbfe!important}.dt-th-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-row-selected{background:#eff6ff!important}.dt-row-selected:hover{background:#dbeafe!important}.dt-state-cell{padding:0!important;border:none!important;background:#fff!important}@media(max-width:1024px){th{padding:10px 12px}td{padding:11px 12px}.dt-sort-btn{padding:4px 0}.dt-td-actions{padding:6px}.dt-bulk-bar{align-self:stretch}}@media(max-width:768px){th{padding:9px 10px;font-size:.8125rem}td{padding:10px;font-size:.8125rem}.dt-sk-search{width:100%}}@media(max-width:640px){.dt-header{flex-direction:column;align-items:stretch}.dt-header-left,.dt-header-right{width:100%}.dt-table-wrap{display:none}.dt-sk-search{width:100%}.dt-sk-toolbar{flex-direction:column;align-items:stretch;gap:8px}.dt-sk-toolbar-right{align-self:flex-end}.dt-bulk-bar{align-self:stretch;padding:10px 12px;row-gap:8px}.dt-bulk-count{flex:1}.dt-bulk-actions{width:100%}.dt-bulk-hint{flex-basis:100%}.dt-bulk-actions ui-select{max-width:100%;flex:1}}.dt-confirm-msg{margin:0;font-size:.9375rem;color:#334155;line-height:1.5;overflow-wrap:anywhere;word-break:break-word;white-space:pre-line}.dt-confirm-details{margin:10px 0 0;padding-left:20px;font-size:.875rem;color:#64748b;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}.dt-confirm-details li+li{margin-top:4px}ui-pagination{flex-shrink:0}.dt-phone-controls{display:flex;flex-direction:column;gap:8px;margin-bottom:8px;flex-shrink:0}.dt-phone-sort{display:flex;align-items:center;gap:8px}.dt-phone-sort-label{font-size:.8125rem;font-weight:600;color:#64748b;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 12px;font-family:inherit;font-size:1rem;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px}.dt-phone-filters{display:flex;flex-wrap:wrap;gap:8px}.dt-card-list{display:none;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}@media(max-width:640px){.dt-card-list{display:flex;padding-bottom:8px}}.dt-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;contain:layout style;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:background .1s}.dt-card:has(.mm-dropdown){position:relative;z-index:1}.dt-card-clickable{cursor:pointer}.dt-card-clickable:active{background:#f8fafc}.dt-card-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.dt-card-header{display:flex;align-items:center;gap:10px}.dt-card-title{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.dt-card-name{min-width:0;font-weight:600;color:#1e293b;font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-card-name-plain{flex:1}.dt-card-actions{margin-left:auto;flex-shrink:0}.dt-card-badges{display:flex;flex-wrap:wrap;gap:6px}.dt-card-tags{display:flex;flex-wrap:wrap;gap:4px}.dt-card-details{display:flex;flex-direction:column;gap:5px}.dt-card-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.8125rem}.dt-card-detail-label{color:#64748b;flex-shrink:0}.dt-card-detail-value{color:#334155;font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere;word-break:break-word}.dt-card-sk{gap:12px}.dt-card-sk-header{display:flex;align-items:center;gap:10px}.dt-card-sk-badges{display:flex;gap:6px}.dt-card-sk-rows{display:flex;flex-direction:column;gap:8px}\n"]
11044
+ styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0}.dt-host{display:flex;flex-direction:column;height:100%;min-height:0}.dt-header{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap;justify-content:space-between;position:relative;z-index:10}.dt-header-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.dt-header-right{display:flex;align-items:center;gap:8px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}.dt-sk-shimmer{position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-shimmer:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}@keyframes dt-shimmer{to{transform:translate(200%)}}.dt-sk-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}.dt-sk-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.dt-sk-toolbar-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.dt-sk-search{display:flex;align-items:center;gap:10px;width:380px;height:36px;padding:0 12px;border:1px solid #e2e8f0;border-radius:6px;background:#f8fafc;box-sizing:border-box}.dt-sk-search-icon{width:16px;height:16px;border-radius:50%;flex-shrink:0}.dt-sk-search-text{flex:1;height:11px;border-radius:4px}.dt-sk-tab-strip{display:flex;gap:2px;padding:3px;background:#f1f5f9;border-radius:8px}.dt-sk-tab{height:28px;width:70px;border-radius:6px}.dt-sk-icon-btn{width:32px;height:32px;border-radius:6px}.dt-skeleton{border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dt-sk-header{display:flex;gap:24px;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.dt-sk-row{display:flex;gap:24px;padding:13px 16px;border-bottom:1px solid #f1f5f9}.dt-sk-row:last-child{border-bottom:none}.dt-sk-cell{flex:1;height:13px;border-radius:4px;position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-cell:first-child{max-width:100px}.dt-sk-cell:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}.dt-sk-head{height:10px}.dt-table-wrap{flex:1;min-height:0;overflow:auto;border:1px solid #e2e8f0;border-radius:10px 10px 0 0}.dt-sk-reload-row td{padding:10px 14px;border-bottom:1px solid #f1f5f9}table{width:100%;border-collapse:collapse;font-size:.875rem}thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}thead{position:sticky;top:0;z-index:2}th{padding:10px 14px;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;border-right:1px solid #e2e8f0;text-align:center;background:#f8fafc}th:last-child{border-right:none}th.dt-th-sorted{background:#f1f5f9}th.dt-th-actions{width:48px}.dt-th-inner{display:flex;align-items:center;justify-content:center;gap:4px}.dt-sort-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;font-size:inherit;font-weight:inherit;color:inherit;font-family:inherit;padding:0;text-transform:inherit;letter-spacing:inherit}.dt-sort-btn:hover{color:#1e293b}.dt-sort-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:2px}@media(pointer:coarse){.dt-sort-btn{position:relative}.dt-sort-btn:after{content:\"\";position:absolute;left:-4px;right:-4px;top:50%;height:44px;transform:translateY(-50%)}}.dt-sort-icon{transition:transform .15s}.dt-sort-desc{transform:rotate(180deg)}.dt-sort-inactive{opacity:.4}tbody tr{border-bottom:1px solid #f1f5f9;background:#fff;transition:background .1s}tbody tr:last-child{border-bottom:none}tbody tr:hover{background:#f8fafc}.dt-row-clickable{cursor:pointer}.dt-row-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}td{padding:10px 14px;color:#334155;vertical-align:middle;white-space:nowrap;border-right:1px solid #f1f5f9}td:last-child{border-right:none}.dt-td-actions{text-align:center;padding:6px 8px}.dt-td-width{overflow:hidden;text-overflow:ellipsis}.dt-img{display:inline-block;vertical-align:middle;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;flex-shrink:0}.dt-img-ph{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;color:#94a3b8;background:#f1f5f9;border:1px solid #e2e8f0;flex-shrink:0}.dt-img-ph svg{width:55%;height:55%}.dt-img-circle-md{width:40px;height:40px;border-radius:50%}.dt-img-circle-sm{width:28px;height:28px;border-radius:50%}.dt-img-rounded-md{width:48px;height:32px;border-radius:6px}.dt-img-rounded-sm{width:36px;height:24px;border-radius:5px}.dt-avatar-name{display:flex;align-items:center;gap:8px}.dt-name-text{color:#1e293b}.dt-overdue{color:#dc2626;font-weight:500}.dt-none{color:#94a3b8}.dt-link{position:relative;display:inline-block;max-width:100%;padding:1px 2px;vertical-align:bottom;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#2563eb;text-decoration:none;border-radius:3px;cursor:pointer}.dt-link:hover{text-decoration:underline;color:#1d4ed8}.dt-link:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px;text-decoration:underline}.dt-card-detail-value .dt-link,.dt-card-name .dt-link{white-space:normal;overflow-wrap:anywhere}.dt-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.dt-tags{display:flex;align-items:center;gap:4px}.dt-tags-more{font-size:.75rem;font-weight:600;color:#475569;background:#f1f5f9;border-radius:999px;padding:2px 7px;cursor:default;-webkit-user-select:none;user-select:none;border:1px solid #e2e8f0}.dt-tags-more:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:999px}.dt-tag-tooltip{position:fixed;z-index:9999;pointer-events:none;background:#1e293b;border-radius:10px;padding:8px 10px;display:flex;flex-direction:column;gap:5px;box-shadow:0 4px 6px #0000000f,0 10px 24px #00000024;transform:translate(-50%) translateY(-100%);animation:dt-tip-in .12s ease;max-width:220px}@keyframes dt-tip-in{0%{opacity:0;transform:translate(-50%) translateY(calc(-100% + 4px))}to{opacity:1;transform:translate(-50%) translateY(-100%)}}.dt-cell-star{margin-right:6px}.dt-actions-cell{display:flex;align-items:center;justify-content:center}.dt-bulk-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;align-self:flex-start;padding:10px 14px;margin-bottom:8px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px}.dt-bulk-count{font-size:.875rem;font-weight:600;color:#1e40af;white-space:nowrap;flex-shrink:0}.dt-bulk-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:1;min-width:0}.dt-bulk-actions ui-select{max-width:180px;min-width:120px}.dt-bulk-hint{font-size:.8125rem;line-height:1.35;color:#475569}.dt-card-cb{display:flex;align-items:center;padding:0 0 6px}.dt-card-selected{background:#eff6ff!important;border-color:#bfdbfe!important}.dt-th-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-row-selected{background:#eff6ff!important}.dt-row-selected:hover{background:#dbeafe!important}.dt-state-cell{padding:0!important;border:none!important;background:#fff!important}@media(max-width:1024px){th{padding:10px 12px}td{padding:11px 12px}.dt-sort-btn{padding:4px 0}.dt-td-actions{padding:6px}.dt-bulk-bar{align-self:stretch}}@media(max-width:768px){th{padding:9px 10px;font-size:.8125rem}td{padding:10px;font-size:.8125rem}.dt-sk-search{width:100%}}@media(max-width:640px){.dt-header{flex-direction:column;align-items:stretch}.dt-header-left,.dt-header-right{width:100%}.dt-table-wrap{display:none}.dt-sk-search{width:100%}.dt-sk-toolbar{flex-direction:column;align-items:stretch;gap:8px}.dt-sk-toolbar-right{align-self:flex-end}.dt-bulk-bar{align-self:stretch;padding:10px 12px;row-gap:8px}.dt-bulk-count{flex:1}.dt-bulk-actions{width:100%}.dt-bulk-hint{flex-basis:100%}.dt-bulk-actions ui-select{max-width:100%;flex:1}}.dt-confirm-msg{margin:0;font-size:.9375rem;color:#334155;line-height:1.5;overflow-wrap:anywhere;word-break:break-word;white-space:pre-line}.dt-confirm-details{margin:10px 0 0;padding-left:20px;font-size:.875rem;color:#64748b;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}.dt-confirm-details li+li{margin-top:4px}ui-pagination{flex-shrink:0}.dt-phone-controls{display:flex;flex-direction:column;gap:8px;margin-bottom:8px;flex-shrink:0}.dt-phone-sort{display:flex;align-items:center;gap:8px}.dt-phone-sort-label{font-size:.8125rem;font-weight:600;color:#64748b;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 12px;font-family:inherit;font-size:1rem;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px}.dt-phone-filters{display:flex;flex-wrap:wrap;gap:8px}.dt-card-list{display:none;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}@media(max-width:640px){.dt-card-list{display:flex;padding-bottom:8px}}.dt-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;contain:layout style;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:background .1s}.dt-card:has(.mm-dropdown){position:relative;z-index:1}.dt-card-clickable{cursor:pointer}.dt-card-clickable:active{background:#f8fafc}.dt-card-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.dt-card-header{display:flex;align-items:center;gap:10px}.dt-card-title{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.dt-card-name{min-width:0;font-weight:600;color:#1e293b;font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-card-name-plain{flex:1}.dt-card-actions{margin-left:auto;flex-shrink:0}.dt-card-badges{display:flex;flex-wrap:wrap;gap:6px}.dt-card-tags{display:flex;flex-wrap:wrap;gap:4px}.dt-card-details{display:flex;flex-direction:column;gap:5px}.dt-card-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.8125rem}.dt-card-detail-label{color:#64748b;flex-shrink:0}.dt-card-detail-value{color:#334155;font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere;word-break:break-word}.dt-card-sk{gap:12px}.dt-card-sk-header{display:flex;align-items:center;gap:10px}.dt-card-sk-badges{display:flex;gap:6px}.dt-card-sk-rows{display:flex;flex-direction:column;gap:8px}\n"]
10755
11045
  }]
10756
11046
  }],
10757
11047
  ctorParameters: () => [],
@@ -10944,6 +11234,10 @@ i0.ɵɵngDeclareClassMetadata({
10944
11234
  type: i0.Output,
10945
11235
  args: ["rowClick"]
10946
11236
  }],
11237
+ linkClick: [{
11238
+ type: i0.Output,
11239
+ args: ["linkClick"]
11240
+ }],
10947
11241
  rowClickableFn: [{
10948
11242
  type: i0.Input,
10949
11243
  args: [{
@@ -14614,6 +14908,7 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
14614
14908
  "min",
14615
14909
  "max",
14616
14910
  "maxDecimals",
14911
+ "step",
14617
14912
  "valueType",
14618
14913
  "showErrors",
14619
14914
  "disabled"
@@ -17988,6 +18283,7 @@ var TextareaInputComponent = class TextareaInputComponent {
17988
18283
  this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
17989
18284
  this.hintAsDescription = input(false, ...ngDevMode ? [{ debugName: "hintAsDescription" }] : /* istanbul ignore next */ []);
17990
18285
  this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
18286
+ this.monospace = input(false, ...ngDevMode ? [{ debugName: "monospace" }] : /* istanbul ignore next */ []);
17991
18287
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
17992
18288
  this._disabledInput = input(false, {
17993
18289
  ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
@@ -18143,6 +18439,13 @@ var TextareaInputComponent = class TextareaInputComponent {
18143
18439
  isRequired: false,
18144
18440
  transformFunction: null
18145
18441
  },
18442
+ monospace: {
18443
+ classPropertyName: "monospace",
18444
+ publicName: "monospace",
18445
+ isSignal: true,
18446
+ isRequired: false,
18447
+ transformFunction: null
18448
+ },
18146
18449
  showErrors: {
18147
18450
  classPropertyName: "showErrors",
18148
18451
  publicName: "showErrors",
@@ -18195,6 +18498,7 @@ var TextareaInputComponent = class TextareaInputComponent {
18195
18498
  }
18196
18499
  <textarea
18197
18500
  class="ta-input"
18501
+ [class.ta-mono]="monospace()"
18198
18502
  [id]="_inputId"
18199
18503
  [placeholder]="placeholder()"
18200
18504
  [value]="_value()"
@@ -18218,7 +18522,7 @@ var TextareaInputComponent = class TextareaInputComponent {
18218
18522
  </div>
18219
18523
  `,
18220
18524
  isInline: true,
18221
- styles: [":host{display:block}.ta-field{display:flex;flex-direction:column;gap:6px}.ta-head{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:4px;row-gap:2px}.ta-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ta-required{color:#ef4444;margin-left:2px}.ta-hint-inline{font-size:.75rem;color:#64748b;font-weight:400;margin-left:4px}.ta-head .ta-hint-inline{margin-left:0;line-height:1}.ta-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;resize:vertical;transition:border-color .15s,box-shadow .15s}.ta-input::placeholder{color:#94a3b8}.ta-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ta-input:read-only{background:#f8fafc;cursor:default}.ta-error .ta-input{border-color:#ef4444}.ta-error .ta-input:focus{box-shadow:0 0 0 3px #ef44441f}.ta-disabled .ta-input{opacity:.5;cursor:not-allowed}.ta-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ta-desc-error{color:#ef4444}@media(max-width:480px){.ta-input{font-size:1rem}}\n"],
18525
+ styles: [":host{display:block}.ta-field{display:flex;flex-direction:column;gap:6px}.ta-head{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:4px;row-gap:2px}.ta-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ta-required{color:#ef4444;margin-left:2px}.ta-hint-inline{font-size:.75rem;color:#64748b;font-weight:400;margin-left:4px}.ta-head .ta-hint-inline{margin-left:0;line-height:1}.ta-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;resize:vertical;transition:border-color .15s,box-shadow .15s}.ta-input::placeholder{color:#94a3b8}.ta-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ta-input:read-only{background:#f8fafc;cursor:default}.ta-input.ta-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,Liberation Mono,monospace}@media(min-width:481px){.ta-input.ta-mono{font-size:.8125rem}}.ta-error .ta-input{border-color:#ef4444}.ta-error .ta-input:focus{box-shadow:0 0 0 3px #ef44441f}.ta-disabled .ta-input{opacity:.5;cursor:not-allowed}.ta-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ta-desc-error{color:#ef4444}@media(max-width:480px){.ta-input{font-size:1rem}}\n"],
18222
18526
  changeDetection: i0.ChangeDetectionStrategy.OnPush
18223
18527
  });
18224
18528
  }
@@ -18268,6 +18572,7 @@ i0.ɵɵngDeclareClassMetadata({
18268
18572
  }
18269
18573
  <textarea
18270
18574
  class="ta-input"
18575
+ [class.ta-mono]="monospace()"
18271
18576
  [id]="_inputId"
18272
18577
  [placeholder]="placeholder()"
18273
18578
  [value]="_value()"
@@ -18290,7 +18595,7 @@ i0.ɵɵngDeclareClassMetadata({
18290
18595
  }
18291
18596
  </div>
18292
18597
  `,
18293
- styles: [":host{display:block}.ta-field{display:flex;flex-direction:column;gap:6px}.ta-head{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:4px;row-gap:2px}.ta-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ta-required{color:#ef4444;margin-left:2px}.ta-hint-inline{font-size:.75rem;color:#64748b;font-weight:400;margin-left:4px}.ta-head .ta-hint-inline{margin-left:0;line-height:1}.ta-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;resize:vertical;transition:border-color .15s,box-shadow .15s}.ta-input::placeholder{color:#94a3b8}.ta-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ta-input:read-only{background:#f8fafc;cursor:default}.ta-error .ta-input{border-color:#ef4444}.ta-error .ta-input:focus{box-shadow:0 0 0 3px #ef44441f}.ta-disabled .ta-input{opacity:.5;cursor:not-allowed}.ta-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ta-desc-error{color:#ef4444}@media(max-width:480px){.ta-input{font-size:1rem}}\n"]
18598
+ styles: [":host{display:block}.ta-field{display:flex;flex-direction:column;gap:6px}.ta-head{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:4px;row-gap:2px}.ta-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ta-required{color:#ef4444;margin-left:2px}.ta-hint-inline{font-size:.75rem;color:#64748b;font-weight:400;margin-left:4px}.ta-head .ta-hint-inline{margin-left:0;line-height:1}.ta-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;resize:vertical;transition:border-color .15s,box-shadow .15s}.ta-input::placeholder{color:#94a3b8}.ta-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ta-input:read-only{background:#f8fafc;cursor:default}.ta-input.ta-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,Liberation Mono,monospace}@media(min-width:481px){.ta-input.ta-mono{font-size:.8125rem}}.ta-error .ta-input{border-color:#ef4444}.ta-error .ta-input:focus{box-shadow:0 0 0 3px #ef44441f}.ta-disabled .ta-input{opacity:.5;cursor:not-allowed}.ta-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ta-desc-error{color:#ef4444}@media(max-width:480px){.ta-input{font-size:1rem}}\n"]
18294
18599
  }]
18295
18600
  }],
18296
18601
  ctorParameters: () => [],
@@ -18375,6 +18680,14 @@ i0.ɵɵngDeclareClassMetadata({
18375
18680
  required: false
18376
18681
  }]
18377
18682
  }],
18683
+ monospace: [{
18684
+ type: i0.Input,
18685
+ args: [{
18686
+ isSignal: true,
18687
+ alias: "monospace",
18688
+ required: false
18689
+ }]
18690
+ }],
18378
18691
  showErrors: [{
18379
18692
  type: i0.Input,
18380
18693
  args: [{
@@ -20231,6 +20544,7 @@ var DocumentSendOptionsComponent = class DocumentSendOptionsComponent {
20231
20544
  "min",
20232
20545
  "max",
20233
20546
  "maxDecimals",
20547
+ "step",
20234
20548
  "valueType",
20235
20549
  "showErrors",
20236
20550
  "disabled"
@@ -21426,6 +21740,7 @@ var VideoLinkSettingsComponent = class VideoLinkSettingsComponent {
21426
21740
  "min",
21427
21741
  "max",
21428
21742
  "maxDecimals",
21743
+ "step",
21429
21744
  "valueType",
21430
21745
  "showErrors",
21431
21746
  "disabled"
@@ -22832,6 +23147,7 @@ var SendEmailComponent = class SendEmailComponent {
22832
23147
  "min",
22833
23148
  "max",
22834
23149
  "maxDecimals",
23150
+ "step",
22835
23151
  "valueType",
22836
23152
  "showErrors",
22837
23153
  "disabled"
@@ -22857,6 +23173,7 @@ var SendEmailComponent = class SendEmailComponent {
22857
23173
  "hint",
22858
23174
  "hintAsDescription",
22859
23175
  "error",
23176
+ "monospace",
22860
23177
  "showErrors",
22861
23178
  "disabled"
22862
23179
  ],
@@ -24475,6 +24792,7 @@ var SendTextComponent = class SendTextComponent {
24475
24792
  "min",
24476
24793
  "max",
24477
24794
  "maxDecimals",
24795
+ "step",
24478
24796
  "valueType",
24479
24797
  "showErrors",
24480
24798
  "disabled"
@@ -24500,6 +24818,7 @@ var SendTextComponent = class SendTextComponent {
24500
24818
  "hint",
24501
24819
  "hintAsDescription",
24502
24820
  "error",
24821
+ "monospace",
24503
24822
  "showErrors",
24504
24823
  "disabled"
24505
24824
  ],
@@ -26523,6 +26842,7 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
26523
26842
  "min",
26524
26843
  "max",
26525
26844
  "maxDecimals",
26845
+ "step",
26526
26846
  "valueType",
26527
26847
  "showErrors",
26528
26848
  "disabled"
@@ -26548,6 +26868,7 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
26548
26868
  "hint",
26549
26869
  "hintAsDescription",
26550
26870
  "error",
26871
+ "monospace",
26551
26872
  "showErrors",
26552
26873
  "disabled"
26553
26874
  ],
@@ -33858,7 +34179,8 @@ var KpiCardComponent = class KpiCardComponent {
33858
34179
  }
33859
34180
  <span class="kpi-value"
33860
34181
  [class.green-value]="highlight() || valueColor() === 'green'"
33861
- [class.blue-value]="valueColor() === 'blue'">{{ value() }}</span>
34182
+ [class.blue-value]="valueColor() === 'blue'"
34183
+ [class.red-value]="valueColor() === 'red'">{{ value() }}</span>
33862
34184
  @if (subtitle()) {
33863
34185
  <span class="kpi-subtitle">{{ subtitle() }}</span>
33864
34186
  }
@@ -33869,7 +34191,7 @@ var KpiCardComponent = class KpiCardComponent {
33869
34191
  </div>
33870
34192
  `,
33871
34193
  isInline: true,
33872
- styles: [":host{display:block;height:100%}.kpi-card{position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:4px;min-width:0;height:100%;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease}:host(:focus){outline:none}:host(:focus-visible) .kpi-card{outline:2px solid #3b82f6;outline-offset:2px}.kpi-card.clickable{cursor:pointer}.kpi-card.clickable:hover{border-color:#93c5fd;box-shadow:0 2px 8px #3b82f614}.kpi-card.clickable:hover .kpi-arrow{color:#3b82f6;transform:translate(2px)}.kpi-arrow{position:absolute;bottom:14px;right:14px;color:#94a3b8;transition:color .15s ease,transform .15s ease}.kpi-icon{flex-shrink:0;width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-bottom:8px}.green-icon{background:#dcfce7;color:#16a34a}.blue-icon{background:#dbeafe;color:#2563eb}.amber-icon{background:#fef3c7;color:#d97706}.orange-icon{background:#ffedd5;color:#c2410c}.red-icon{background:#fee2e2;color:#dc2626}.slate-icon{background:#f1f5f9;color:#475569}.kpi-label{font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em}.kpi-top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-height:36px;margin-bottom:4px}.kpi-ring{flex-shrink:0}.kpi-value{font-size:1.5rem;font-weight:700;color:#111827;line-height:1.1}.kpi-value.green-value{color:#16a34a}.kpi-value.blue-value{color:#3b82f6}.kpi-subtitle{font-size:.75rem;color:#64748b;margin-top:2px}\n"],
34194
+ styles: [":host{display:block;height:100%}.kpi-card{position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:4px;min-width:0;height:100%;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease}:host(:focus){outline:none}:host(:focus-visible) .kpi-card{outline:2px solid #3b82f6;outline-offset:2px}.kpi-card.clickable{cursor:pointer}.kpi-card.clickable:hover{border-color:#93c5fd;box-shadow:0 2px 8px #3b82f614}.kpi-card.clickable:hover .kpi-arrow{color:#3b82f6;transform:translate(2px)}.kpi-arrow{position:absolute;bottom:14px;right:14px;color:#94a3b8;transition:color .15s ease,transform .15s ease}.kpi-icon{flex-shrink:0;width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-bottom:8px}.green-icon{background:#dcfce7;color:#16a34a}.blue-icon{background:#dbeafe;color:#2563eb}.amber-icon{background:#fef3c7;color:#d97706}.orange-icon{background:#ffedd5;color:#c2410c}.red-icon{background:#fee2e2;color:#dc2626}.slate-icon{background:#f1f5f9;color:#475569}.kpi-label{font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em}.kpi-top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-height:36px;margin-bottom:4px}.kpi-ring{flex-shrink:0}.kpi-value{font-size:1.5rem;font-weight:700;color:#111827;line-height:1.1}.kpi-value.green-value{color:#16a34a}.kpi-value.blue-value{color:#3b82f6}.kpi-value.red-value{color:#dc2626}.kpi-subtitle{font-size:.75rem;color:#64748b;margin-top:2px}\n"],
33873
34195
  dependencies: [{
33874
34196
  kind: "component",
33875
34197
  type: ProgressRingComponent,
@@ -33925,7 +34247,8 @@ i0.ɵɵngDeclareClassMetadata({
33925
34247
  }
33926
34248
  <span class="kpi-value"
33927
34249
  [class.green-value]="highlight() || valueColor() === 'green'"
33928
- [class.blue-value]="valueColor() === 'blue'">{{ value() }}</span>
34250
+ [class.blue-value]="valueColor() === 'blue'"
34251
+ [class.red-value]="valueColor() === 'red'">{{ value() }}</span>
33929
34252
  @if (subtitle()) {
33930
34253
  <span class="kpi-subtitle">{{ subtitle() }}</span>
33931
34254
  }
@@ -33935,7 +34258,7 @@ i0.ɵɵngDeclareClassMetadata({
33935
34258
  }
33936
34259
  </div>
33937
34260
  `,
33938
- styles: [":host{display:block;height:100%}.kpi-card{position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:4px;min-width:0;height:100%;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease}:host(:focus){outline:none}:host(:focus-visible) .kpi-card{outline:2px solid #3b82f6;outline-offset:2px}.kpi-card.clickable{cursor:pointer}.kpi-card.clickable:hover{border-color:#93c5fd;box-shadow:0 2px 8px #3b82f614}.kpi-card.clickable:hover .kpi-arrow{color:#3b82f6;transform:translate(2px)}.kpi-arrow{position:absolute;bottom:14px;right:14px;color:#94a3b8;transition:color .15s ease,transform .15s ease}.kpi-icon{flex-shrink:0;width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-bottom:8px}.green-icon{background:#dcfce7;color:#16a34a}.blue-icon{background:#dbeafe;color:#2563eb}.amber-icon{background:#fef3c7;color:#d97706}.orange-icon{background:#ffedd5;color:#c2410c}.red-icon{background:#fee2e2;color:#dc2626}.slate-icon{background:#f1f5f9;color:#475569}.kpi-label{font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em}.kpi-top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-height:36px;margin-bottom:4px}.kpi-ring{flex-shrink:0}.kpi-value{font-size:1.5rem;font-weight:700;color:#111827;line-height:1.1}.kpi-value.green-value{color:#16a34a}.kpi-value.blue-value{color:#3b82f6}.kpi-subtitle{font-size:.75rem;color:#64748b;margin-top:2px}\n"]
34261
+ styles: [":host{display:block;height:100%}.kpi-card{position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:4px;min-width:0;height:100%;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease}:host(:focus){outline:none}:host(:focus-visible) .kpi-card{outline:2px solid #3b82f6;outline-offset:2px}.kpi-card.clickable{cursor:pointer}.kpi-card.clickable:hover{border-color:#93c5fd;box-shadow:0 2px 8px #3b82f614}.kpi-card.clickable:hover .kpi-arrow{color:#3b82f6;transform:translate(2px)}.kpi-arrow{position:absolute;bottom:14px;right:14px;color:#94a3b8;transition:color .15s ease,transform .15s ease}.kpi-icon{flex-shrink:0;width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-bottom:8px}.green-icon{background:#dcfce7;color:#16a34a}.blue-icon{background:#dbeafe;color:#2563eb}.amber-icon{background:#fef3c7;color:#d97706}.orange-icon{background:#ffedd5;color:#c2410c}.red-icon{background:#fee2e2;color:#dc2626}.slate-icon{background:#f1f5f9;color:#475569}.kpi-label{font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em}.kpi-top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-height:36px;margin-bottom:4px}.kpi-ring{flex-shrink:0}.kpi-value{font-size:1.5rem;font-weight:700;color:#111827;line-height:1.1}.kpi-value.green-value{color:#16a34a}.kpi-value.blue-value{color:#3b82f6}.kpi-value.red-value{color:#dc2626}.kpi-subtitle{font-size:.75rem;color:#64748b;margin-top:2px}\n"]
33939
34262
  }]
33940
34263
  }],
33941
34264
  propDecorators: {
@@ -39014,6 +39337,6 @@ i0.ɵɵngDeclareClassMetadata({
39014
39337
  }]
39015
39338
  }
39016
39339
  });
39017
- 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, UsStateMapComponent, 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 };
39340
+ 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, StarComponent, StepperComponent, TableToolbarComponent, TemplatePickerComponent, TextComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, UsStateMapComponent, 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 };
39018
39341
 
39019
39342
  //# sourceMappingURL=forgeroute-ui.mjs.map