@forgeroute/ui 0.4.14 → 0.4.16

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.
@@ -826,7 +826,7 @@ var QuickFilterTabsComponent = class QuickFilterTabsComponent {
826
826
  </div>
827
827
  `,
828
828
  isInline: true,
829
- styles: [":host{display:block;min-width:0}.tabs-outer{position:relative;display:inline-flex;align-items:center}.tabs{display:flex;align-items:center;gap:2px;background:#f1f5f9;border-radius:8px;padding:3px;overflow-x:auto;scrollbar-width:none}.tabs::-webkit-scrollbar{display:none}.tab{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:6px;border:none;background:transparent;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;font-family:inherit;transition:background .1s,color .1s;white-space:nowrap;flex-shrink:0}.tab:hover{color:#1e293b}.tab.active{background:#fff;color:#1e293b;box-shadow:0 1px 3px #00000014}.tab:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.tab.tab-disabled{opacity:.45;cursor:default;pointer-events:none}.tab-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;font-size:.6875rem;font-weight:700;background:#e2e8f0;color:#475569;line-height:1}.active .tab-count,.active-count{background:#1e293b;color:#fff}.more-btn{gap:4px}.more-dropdown{position:absolute;top:calc(100% + 4px);right:0;z-index:100;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:180px;padding:4px;max-height:260px;overflow-y:auto}.more-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;border-radius:5px;transition:background .1s;text-align:left;gap:12px}.more-option:hover{background:#f8fafc}.more-option.more-option-active{background:#f1f5f9;color:#1e293b;font-weight:500}.more-option:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.more-option-label{flex:1}.more-option-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:.6875rem;font-weight:700;line-height:1;background:#e2e8f0;color:#475569}.more-option-active .more-option-count{background:#1e293b;color:#fff}@media(max-width:1024px){.tab{padding:7px 12px}}@media(pointer:coarse){.tab{min-height:44px}}@media(max-width:640px){:host{align-self:flex-start}.tab{padding:10px 12px;font-size:.8125rem;min-height:44px}.more-option{padding:12px 14px}}\n"],
829
+ styles: [":host{display:block;min-width:0}.tabs-outer{position:relative;display:inline-flex;align-items:center;max-width:100%;min-width:0}.tabs{display:flex;align-items:center;gap:2px;background:#f1f5f9;border-radius:8px;padding:3px;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;min-width:0;max-width:100%}.tabs::-webkit-scrollbar{display:none}.tab{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:6px;border:none;background:transparent;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;font-family:inherit;transition:background .1s,color .1s;white-space:nowrap;flex-shrink:0}.tab:hover{color:#1e293b}.tab.active{background:#fff;color:#1e293b;box-shadow:0 1px 3px #00000014}.tab:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.tab.tab-disabled{opacity:.45;cursor:default;pointer-events:none}.tab-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;font-size:.6875rem;font-weight:700;background:#e2e8f0;color:#475569;line-height:1}.active .tab-count,.active-count{background:#1e293b;color:#fff}.more-btn{gap:4px}.more-dropdown{position:absolute;top:calc(100% + 4px);right:0;z-index:100;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:180px;padding:4px;max-height:260px;overflow-y:auto}.more-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;border-radius:5px;transition:background .1s;text-align:left;gap:12px}.more-option:hover{background:#f8fafc}.more-option.more-option-active{background:#f1f5f9;color:#1e293b;font-weight:500}.more-option:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.more-option-label{flex:1}.more-option-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:.6875rem;font-weight:700;line-height:1;background:#e2e8f0;color:#475569}.more-option-active .more-option-count{background:#1e293b;color:#fff}@media(max-width:1024px){.tab{padding:7px 12px}}@media(pointer:coarse){.tab{min-height:44px}}@media(max-width:640px){:host{align-self:flex-start;max-width:100%}.tab{padding:10px 12px;font-size:.8125rem;min-height:44px}.more-option{padding:12px 14px}}\n"],
830
830
  dependencies: [{
831
831
  kind: "pipe",
832
832
  type: DecimalPipe,
@@ -916,7 +916,7 @@ i0.ɵɵngDeclareClassMetadata({
916
916
  }
917
917
  </div>
918
918
  `,
919
- styles: [":host{display:block;min-width:0}.tabs-outer{position:relative;display:inline-flex;align-items:center}.tabs{display:flex;align-items:center;gap:2px;background:#f1f5f9;border-radius:8px;padding:3px;overflow-x:auto;scrollbar-width:none}.tabs::-webkit-scrollbar{display:none}.tab{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:6px;border:none;background:transparent;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;font-family:inherit;transition:background .1s,color .1s;white-space:nowrap;flex-shrink:0}.tab:hover{color:#1e293b}.tab.active{background:#fff;color:#1e293b;box-shadow:0 1px 3px #00000014}.tab:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.tab.tab-disabled{opacity:.45;cursor:default;pointer-events:none}.tab-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;font-size:.6875rem;font-weight:700;background:#e2e8f0;color:#475569;line-height:1}.active .tab-count,.active-count{background:#1e293b;color:#fff}.more-btn{gap:4px}.more-dropdown{position:absolute;top:calc(100% + 4px);right:0;z-index:100;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:180px;padding:4px;max-height:260px;overflow-y:auto}.more-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;border-radius:5px;transition:background .1s;text-align:left;gap:12px}.more-option:hover{background:#f8fafc}.more-option.more-option-active{background:#f1f5f9;color:#1e293b;font-weight:500}.more-option:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.more-option-label{flex:1}.more-option-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:.6875rem;font-weight:700;line-height:1;background:#e2e8f0;color:#475569}.more-option-active .more-option-count{background:#1e293b;color:#fff}@media(max-width:1024px){.tab{padding:7px 12px}}@media(pointer:coarse){.tab{min-height:44px}}@media(max-width:640px){:host{align-self:flex-start}.tab{padding:10px 12px;font-size:.8125rem;min-height:44px}.more-option{padding:12px 14px}}\n"]
919
+ styles: [":host{display:block;min-width:0}.tabs-outer{position:relative;display:inline-flex;align-items:center;max-width:100%;min-width:0}.tabs{display:flex;align-items:center;gap:2px;background:#f1f5f9;border-radius:8px;padding:3px;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;min-width:0;max-width:100%}.tabs::-webkit-scrollbar{display:none}.tab{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:6px;border:none;background:transparent;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;font-family:inherit;transition:background .1s,color .1s;white-space:nowrap;flex-shrink:0}.tab:hover{color:#1e293b}.tab.active{background:#fff;color:#1e293b;box-shadow:0 1px 3px #00000014}.tab:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.tab.tab-disabled{opacity:.45;cursor:default;pointer-events:none}.tab-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;font-size:.6875rem;font-weight:700;background:#e2e8f0;color:#475569;line-height:1}.active .tab-count,.active-count{background:#1e293b;color:#fff}.more-btn{gap:4px}.more-dropdown{position:absolute;top:calc(100% + 4px);right:0;z-index:100;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:180px;padding:4px;max-height:260px;overflow-y:auto}.more-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;border-radius:5px;transition:background .1s;text-align:left;gap:12px}.more-option:hover{background:#f8fafc}.more-option.more-option-active{background:#f1f5f9;color:#1e293b;font-weight:500}.more-option:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.more-option-label{flex:1}.more-option-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:.6875rem;font-weight:700;line-height:1;background:#e2e8f0;color:#475569}.more-option-active .more-option-count{background:#1e293b;color:#fff}@media(max-width:1024px){.tab{padding:7px 12px}}@media(pointer:coarse){.tab{min-height:44px}}@media(max-width:640px){:host{align-self:flex-start;max-width:100%}.tab{padding:10px 12px;font-size:.8125rem;min-height:44px}.more-option{padding:12px 14px}}\n"]
920
920
  }]
921
921
  }],
922
922
  ctorParameters: () => [],
@@ -3912,6 +3912,583 @@ i0.ɵɵngDeclareClassMetadata({
3912
3912
  }]
3913
3913
  }
3914
3914
  });
3915
+ let nextTooltipId = 0;
3916
+ var TooltipDirective = class TooltipDirective {
3917
+ constructor() {
3918
+ this.uiTooltip = input("", ...ngDevMode ? [{ debugName: "uiTooltip" }] : /* istanbul ignore next */ []);
3919
+ this.tooltipPosition = input("top", ...ngDevMode ? [{ debugName: "tooltipPosition" }] : /* istanbul ignore next */ []);
3920
+ this.host = inject(ElementRef).nativeElement;
3921
+ this.doc = inject(DOCUMENT);
3922
+ this.bubble = null;
3923
+ this.id = `ui-tooltip-${nextTooltipId++}`;
3924
+ inject(DestroyRef).onDestroy(() => this.hide());
3925
+ }
3926
+ show() {
3927
+ const text = this.uiTooltip();
3928
+ if (!text || this.bubble) return;
3929
+ const el = this.doc.createElement("div");
3930
+ el.id = this.id;
3931
+ el.setAttribute("role", "tooltip");
3932
+ el.textContent = text;
3933
+ Object.assign(el.style, {
3934
+ position: "fixed",
3935
+ zIndex: "10000",
3936
+ maxWidth: "280px",
3937
+ padding: "6px 10px",
3938
+ background: "#0f172a",
3939
+ color: "#fff",
3940
+ fontSize: "0.75rem",
3941
+ lineHeight: "1.4",
3942
+ borderRadius: "6px",
3943
+ boxShadow: "0 4px 12px rgba(15,23,42,.25)",
3944
+ whiteSpace: "pre-line",
3945
+ pointerEvents: "none",
3946
+ visibility: "hidden"
3947
+ });
3948
+ this.doc.body.appendChild(el);
3949
+ this.bubble = el;
3950
+ this.host.setAttribute("aria-describedby", this.id);
3951
+ const r = this.host.getBoundingClientRect();
3952
+ const b = el.getBoundingClientRect();
3953
+ const gap = 6;
3954
+ let top = this.tooltipPosition() === "top" ? r.top - b.height - gap : r.bottom + gap;
3955
+ if (top < 4) top = r.bottom + gap;
3956
+ else if (top + b.height > window.innerHeight - 4) top = r.top - b.height - gap;
3957
+ const left = Math.min(Math.max(4, r.left + r.width / 2 - b.width / 2), window.innerWidth - b.width - 4);
3958
+ el.style.top = `${top}px`;
3959
+ el.style.left = `${left}px`;
3960
+ el.style.visibility = "visible";
3961
+ }
3962
+ hide() {
3963
+ this.bubble?.remove();
3964
+ this.bubble = null;
3965
+ this.host.removeAttribute("aria-describedby");
3966
+ }
3967
+ static {
3968
+ this.ɵfac = i0.ɵɵngDeclareFactory({
3969
+ minVersion: "12.0.0",
3970
+ version: "22.2.2",
3971
+ ngImport: i0,
3972
+ type: TooltipDirective,
3973
+ deps: [],
3974
+ target: i0.ɵɵFactoryTarget.Directive
3975
+ });
3976
+ }
3977
+ static {
3978
+ this.ɵdir = i0.ɵɵngDeclareDirective({
3979
+ minVersion: "17.1.0",
3980
+ version: "22.2.2",
3981
+ type: TooltipDirective,
3982
+ isStandalone: true,
3983
+ selector: "[uiTooltip]",
3984
+ inputs: {
3985
+ uiTooltip: {
3986
+ classPropertyName: "uiTooltip",
3987
+ publicName: "uiTooltip",
3988
+ isSignal: true,
3989
+ isRequired: false,
3990
+ transformFunction: null
3991
+ },
3992
+ tooltipPosition: {
3993
+ classPropertyName: "tooltipPosition",
3994
+ publicName: "tooltipPosition",
3995
+ isSignal: true,
3996
+ isRequired: false,
3997
+ transformFunction: null
3998
+ }
3999
+ },
4000
+ host: { listeners: {
4001
+ "mouseenter": "show()",
4002
+ "mouseleave": "hide()",
4003
+ "focusin": "show()",
4004
+ "focusout": "hide()",
4005
+ "keydown.escape": "hide()",
4006
+ "click": "hide()"
4007
+ } },
4008
+ ngImport: i0
4009
+ });
4010
+ }
4011
+ };
4012
+ i0.ɵɵngDeclareClassMetadata({
4013
+ minVersion: "12.0.0",
4014
+ version: "22.2.2",
4015
+ ngImport: i0,
4016
+ type: TooltipDirective,
4017
+ decorators: [{
4018
+ type: Directive,
4019
+ args: [{
4020
+ selector: "[uiTooltip]",
4021
+ standalone: true,
4022
+ host: {
4023
+ "(mouseenter)": "show()",
4024
+ "(mouseleave)": "hide()",
4025
+ "(focusin)": "show()",
4026
+ "(focusout)": "hide()",
4027
+ "(keydown.escape)": "hide()",
4028
+ "(click)": "hide()"
4029
+ }
4030
+ }]
4031
+ }],
4032
+ ctorParameters: () => [],
4033
+ propDecorators: {
4034
+ uiTooltip: [{
4035
+ type: i0.Input,
4036
+ args: [{
4037
+ isSignal: true,
4038
+ alias: "uiTooltip",
4039
+ required: false
4040
+ }]
4041
+ }],
4042
+ tooltipPosition: [{
4043
+ type: i0.Input,
4044
+ args: [{
4045
+ isSignal: true,
4046
+ alias: "tooltipPosition",
4047
+ required: false
4048
+ }]
4049
+ }]
4050
+ }
4051
+ });
4052
+ const EXTRA_ICONS = {
4053
+ "delete": "M3 6h18 M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2 M5 6l1 14a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2l1-14 M10 11v6 M14 11v6",
4054
+ "add": "M12 5v14 M5 12h14",
4055
+ "close": "M18 6L6 18 M6 6l12 12",
4056
+ "check": "M20 6L9 17l-5-5",
4057
+ "upload": "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4 M17 8l-5-5-5 5 M12 3v12",
4058
+ "image": "M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z M8.5 8.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3z M21 15l-5-5L5 21",
4059
+ "chevron-up": "M18 15l-6-6-6 6",
4060
+ "chevron-down": "M6 9l6 6 6-6",
4061
+ "arrow-left": "M19 12H5 M12 19l-7-7 7-7",
4062
+ "bell": "M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9 M13.73 21a2 2 0 0 1-3.46 0",
4063
+ "print": "M6 9V2h12v7 M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2 M6 14h12v8H6z",
4064
+ "shield": "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",
4065
+ "lock": "M5 11h14a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2z M7 11V7a5 5 0 0 1 10 0v4",
4066
+ "arrow-up": "M12 19V5 M5 12l7-7 7 7",
4067
+ "arrow-down": "M12 5v14 M19 12l-7 7-7-7",
4068
+ "arrow-right": "M5 12h14 M12 5l7 7-7 7",
4069
+ "document": "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6 M16 13H8 M16 17H8 M10 9H8",
4070
+ "grip": "M9 5h.01 M15 5h.01 M9 12h.01 M15 12h.01 M9 19h.01 M15 19h.01",
4071
+ "card": "M3 4h18a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z M1 10h22",
4072
+ "view-off": "M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z M12 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6z M3 3l18 18",
4073
+ "bank": "M3 21h18 M3 10h18 M5 6l7-3 7 3 M4 10v11 M20 10v11 M8 14v3 M12 14v3 M16 14v3"
4074
+ };
4075
+ function iconPath(name) {
4076
+ return Object.prototype.hasOwnProperty.call(EXTRA_ICONS, name) ? EXTRA_ICONS[name] : builtInActionIcon(name);
4077
+ }
4078
+ var IconComponent = class IconComponent {
4079
+ constructor() {
4080
+ this.name = input.required(...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
4081
+ this.tooltip = input("", ...ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []);
4082
+ this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
4083
+ this.size = input(16, ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
4084
+ this.variant = input("default", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
4085
+ this.disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
4086
+ this.loading = input(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
4087
+ this.interactive = input(true, ...ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []);
4088
+ this.iconClick = output();
4089
+ this.accessibleName = computed(() => this.ariaLabel() || this.tooltip(), ...ngDevMode ? [{ debugName: "accessibleName" }] : /* istanbul ignore next */ []);
4090
+ this.path = computed(() => iconPath(this.name()), ...ngDevMode ? [{ debugName: "path" }] : /* istanbul ignore next */ []);
4091
+ }
4092
+ onClick(event) {
4093
+ event.stopPropagation();
4094
+ this.iconClick.emit(event);
4095
+ }
4096
+ static {
4097
+ this.ɵfac = i0.ɵɵngDeclareFactory({
4098
+ minVersion: "12.0.0",
4099
+ version: "22.2.2",
4100
+ ngImport: i0,
4101
+ type: IconComponent,
4102
+ deps: [],
4103
+ target: i0.ɵɵFactoryTarget.Component
4104
+ });
4105
+ }
4106
+ static {
4107
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
4108
+ minVersion: "17.0.0",
4109
+ version: "22.2.2",
4110
+ type: IconComponent,
4111
+ isStandalone: true,
4112
+ selector: "ui-icon",
4113
+ inputs: {
4114
+ name: {
4115
+ classPropertyName: "name",
4116
+ publicName: "name",
4117
+ isSignal: true,
4118
+ isRequired: true,
4119
+ transformFunction: null
4120
+ },
4121
+ tooltip: {
4122
+ classPropertyName: "tooltip",
4123
+ publicName: "tooltip",
4124
+ isSignal: true,
4125
+ isRequired: false,
4126
+ transformFunction: null
4127
+ },
4128
+ ariaLabel: {
4129
+ classPropertyName: "ariaLabel",
4130
+ publicName: "ariaLabel",
4131
+ isSignal: true,
4132
+ isRequired: false,
4133
+ transformFunction: null
4134
+ },
4135
+ size: {
4136
+ classPropertyName: "size",
4137
+ publicName: "size",
4138
+ isSignal: true,
4139
+ isRequired: false,
4140
+ transformFunction: null
4141
+ },
4142
+ variant: {
4143
+ classPropertyName: "variant",
4144
+ publicName: "variant",
4145
+ isSignal: true,
4146
+ isRequired: false,
4147
+ transformFunction: null
4148
+ },
4149
+ disabled: {
4150
+ classPropertyName: "disabled",
4151
+ publicName: "disabled",
4152
+ isSignal: true,
4153
+ isRequired: false,
4154
+ transformFunction: null
4155
+ },
4156
+ loading: {
4157
+ classPropertyName: "loading",
4158
+ publicName: "loading",
4159
+ isSignal: true,
4160
+ isRequired: false,
4161
+ transformFunction: null
4162
+ },
4163
+ interactive: {
4164
+ classPropertyName: "interactive",
4165
+ publicName: "interactive",
4166
+ isSignal: true,
4167
+ isRequired: false,
4168
+ transformFunction: null
4169
+ }
4170
+ },
4171
+ outputs: { iconClick: "iconClick" },
4172
+ ngImport: i0,
4173
+ template: `
4174
+ @if (interactive()) {
4175
+ <button type="button" class="icon-btn" [class.danger]="variant() === 'danger'"
4176
+ [class.loading]="loading()" [disabled]="disabled() || loading()" [attr.aria-busy]="loading() ? 'true' : null"
4177
+ [attr.aria-label]="accessibleName() || null" [uiTooltip]="tooltip()" (click)="onClick($event)">
4178
+ <ng-container *ngTemplateOutlet="glyph" />
4179
+ </button>
4180
+ } @else {
4181
+ <span class="icon-static" [class.danger]="variant() === 'danger'" [attr.aria-busy]="loading() ? 'true' : null"
4182
+ [attr.role]="accessibleName() ? 'img' : null" [attr.aria-label]="accessibleName() || null" [uiTooltip]="tooltip()" [attr.aria-hidden]="accessibleName() ? null : 'true'">
4183
+ <ng-container *ngTemplateOutlet="glyph" />
4184
+ </span>
4185
+ }
4186
+ <ng-template #glyph>
4187
+ @if (loading()) {
4188
+ <span class="spinner" [style.width.px]="size()" [style.height.px]="size()" aria-hidden="true"></span>
4189
+ } @else if (path(); as d) {
4190
+ <svg viewBox="0 0 24 24" [attr.width]="size()" [attr.height]="size()" fill="none" stroke="currentColor"
4191
+ stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
4192
+ <path [attr.d]="d" />
4193
+ </svg>
4194
+ }
4195
+ </ng-template>
4196
+ `,
4197
+ isInline: true,
4198
+ styles: [":host{display:inline-flex}.icon-static{display:inline-flex;align-items:center;justify-content:center;color:inherit}.icon-static.danger{color:#b91c1c}.icon-static svg{display:block}.icon-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:6px;background:transparent;color:#475569;cursor:pointer;-webkit-appearance:none;appearance:none;font:inherit;transition:background .15s ease,color .15s ease}.icon-btn:hover:not(:disabled){background:#f1f5f9;color:#0f172a}.icon-btn.danger{color:#b91c1c}.icon-btn.danger:hover:not(:disabled){background:#fef2f2;color:#991b1b}.icon-btn:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.icon-btn:disabled{opacity:.5;cursor:not-allowed}.icon-btn.loading:disabled{opacity:1;cursor:progress}.spinner{display:block;box-sizing:border-box;border:2px solid rgba(100,116,139,.3);border-top-color:currentColor;border-radius:50%;animation:ui-icon-spin .6s linear infinite}@keyframes ui-icon-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.spinner{animation-duration:2s}}.icon-btn:after{content:\"\";position:absolute;inset:-8px}\n"],
4199
+ dependencies: [{
4200
+ kind: "directive",
4201
+ type: NgTemplateOutlet,
4202
+ selector: "[ngTemplateOutlet]",
4203
+ inputs: [
4204
+ "ngTemplateOutletContext",
4205
+ "ngTemplateOutlet",
4206
+ "ngTemplateOutletInjector"
4207
+ ]
4208
+ }, {
4209
+ kind: "directive",
4210
+ type: TooltipDirective,
4211
+ selector: "[uiTooltip]",
4212
+ inputs: ["uiTooltip", "tooltipPosition"]
4213
+ }],
4214
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
4215
+ });
4216
+ }
4217
+ };
4218
+ i0.ɵɵngDeclareClassMetadata({
4219
+ minVersion: "12.0.0",
4220
+ version: "22.2.2",
4221
+ ngImport: i0,
4222
+ type: IconComponent,
4223
+ decorators: [{
4224
+ type: Component,
4225
+ args: [{
4226
+ selector: "ui-icon",
4227
+ standalone: true,
4228
+ imports: [NgTemplateOutlet, TooltipDirective],
4229
+ changeDetection: ChangeDetectionStrategy.OnPush,
4230
+ template: `
4231
+ @if (interactive()) {
4232
+ <button type="button" class="icon-btn" [class.danger]="variant() === 'danger'"
4233
+ [class.loading]="loading()" [disabled]="disabled() || loading()" [attr.aria-busy]="loading() ? 'true' : null"
4234
+ [attr.aria-label]="accessibleName() || null" [uiTooltip]="tooltip()" (click)="onClick($event)">
4235
+ <ng-container *ngTemplateOutlet="glyph" />
4236
+ </button>
4237
+ } @else {
4238
+ <span class="icon-static" [class.danger]="variant() === 'danger'" [attr.aria-busy]="loading() ? 'true' : null"
4239
+ [attr.role]="accessibleName() ? 'img' : null" [attr.aria-label]="accessibleName() || null" [uiTooltip]="tooltip()" [attr.aria-hidden]="accessibleName() ? null : 'true'">
4240
+ <ng-container *ngTemplateOutlet="glyph" />
4241
+ </span>
4242
+ }
4243
+ <ng-template #glyph>
4244
+ @if (loading()) {
4245
+ <span class="spinner" [style.width.px]="size()" [style.height.px]="size()" aria-hidden="true"></span>
4246
+ } @else if (path(); as d) {
4247
+ <svg viewBox="0 0 24 24" [attr.width]="size()" [attr.height]="size()" fill="none" stroke="currentColor"
4248
+ stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
4249
+ <path [attr.d]="d" />
4250
+ </svg>
4251
+ }
4252
+ </ng-template>
4253
+ `,
4254
+ styles: [":host{display:inline-flex}.icon-static{display:inline-flex;align-items:center;justify-content:center;color:inherit}.icon-static.danger{color:#b91c1c}.icon-static svg{display:block}.icon-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:6px;background:transparent;color:#475569;cursor:pointer;-webkit-appearance:none;appearance:none;font:inherit;transition:background .15s ease,color .15s ease}.icon-btn:hover:not(:disabled){background:#f1f5f9;color:#0f172a}.icon-btn.danger{color:#b91c1c}.icon-btn.danger:hover:not(:disabled){background:#fef2f2;color:#991b1b}.icon-btn:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.icon-btn:disabled{opacity:.5;cursor:not-allowed}.icon-btn.loading:disabled{opacity:1;cursor:progress}.spinner{display:block;box-sizing:border-box;border:2px solid rgba(100,116,139,.3);border-top-color:currentColor;border-radius:50%;animation:ui-icon-spin .6s linear infinite}@keyframes ui-icon-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.spinner{animation-duration:2s}}.icon-btn:after{content:\"\";position:absolute;inset:-8px}\n"]
4255
+ }]
4256
+ }],
4257
+ propDecorators: {
4258
+ name: [{
4259
+ type: i0.Input,
4260
+ args: [{
4261
+ isSignal: true,
4262
+ alias: "name",
4263
+ required: true
4264
+ }]
4265
+ }],
4266
+ tooltip: [{
4267
+ type: i0.Input,
4268
+ args: [{
4269
+ isSignal: true,
4270
+ alias: "tooltip",
4271
+ required: false
4272
+ }]
4273
+ }],
4274
+ ariaLabel: [{
4275
+ type: i0.Input,
4276
+ args: [{
4277
+ isSignal: true,
4278
+ alias: "ariaLabel",
4279
+ required: false
4280
+ }]
4281
+ }],
4282
+ size: [{
4283
+ type: i0.Input,
4284
+ args: [{
4285
+ isSignal: true,
4286
+ alias: "size",
4287
+ required: false
4288
+ }]
4289
+ }],
4290
+ variant: [{
4291
+ type: i0.Input,
4292
+ args: [{
4293
+ isSignal: true,
4294
+ alias: "variant",
4295
+ required: false
4296
+ }]
4297
+ }],
4298
+ disabled: [{
4299
+ type: i0.Input,
4300
+ args: [{
4301
+ isSignal: true,
4302
+ alias: "disabled",
4303
+ required: false
4304
+ }]
4305
+ }],
4306
+ loading: [{
4307
+ type: i0.Input,
4308
+ args: [{
4309
+ isSignal: true,
4310
+ alias: "loading",
4311
+ required: false
4312
+ }]
4313
+ }],
4314
+ interactive: [{
4315
+ type: i0.Input,
4316
+ args: [{
4317
+ isSignal: true,
4318
+ alias: "interactive",
4319
+ required: false
4320
+ }]
4321
+ }],
4322
+ iconClick: [{
4323
+ type: i0.Output,
4324
+ args: ["iconClick"]
4325
+ }]
4326
+ }
4327
+ });
4328
+ const DEFAULT_PASSWORD_RULES = [
4329
+ {
4330
+ id: "length",
4331
+ label: "At least 8 characters",
4332
+ test: (p) => p.length >= 8
4333
+ },
4334
+ {
4335
+ id: "uppercase",
4336
+ label: "One uppercase letter",
4337
+ test: (p) => /[A-Z]/.test(p)
4338
+ },
4339
+ {
4340
+ id: "lowercase",
4341
+ label: "One lowercase letter",
4342
+ test: (p) => /[a-z]/.test(p)
4343
+ },
4344
+ {
4345
+ id: "digit",
4346
+ label: "One digit",
4347
+ test: (p) => /[0-9]/.test(p)
4348
+ },
4349
+ {
4350
+ id: "special",
4351
+ label: "One special character (!@#$%^&*...)",
4352
+ test: (p) => /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(p)
4353
+ }
4354
+ ];
4355
+ function passwordMeetsRules(password, rules = DEFAULT_PASSWORD_RULES) {
4356
+ return rules.every((r) => r.test(password));
4357
+ }
4358
+ var PasswordRequirementsComponent = class PasswordRequirementsComponent {
4359
+ constructor() {
4360
+ this.value = input("", ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
4361
+ this.rules = input(DEFAULT_PASSWORD_RULES, ...ngDevMode ? [{ debugName: "rules" }] : /* istanbul ignore next */ []);
4362
+ this.title = input("Password Requirements:", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
4363
+ this._check = iconPath("check");
4364
+ this._results = computed(() => this.rules().map((r) => ({
4365
+ id: r.id,
4366
+ label: r.label,
4367
+ met: r.test(this.value() ?? "")
4368
+ })), ...ngDevMode ? [{ debugName: "_results" }] : /* istanbul ignore next */ []);
4369
+ }
4370
+ static {
4371
+ this.ɵfac = i0.ɵɵngDeclareFactory({
4372
+ minVersion: "12.0.0",
4373
+ version: "22.2.2",
4374
+ ngImport: i0,
4375
+ type: PasswordRequirementsComponent,
4376
+ deps: [],
4377
+ target: i0.ɵɵFactoryTarget.Component
4378
+ });
4379
+ }
4380
+ static {
4381
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
4382
+ minVersion: "17.0.0",
4383
+ version: "22.2.2",
4384
+ type: PasswordRequirementsComponent,
4385
+ isStandalone: true,
4386
+ selector: "ui-password-requirements",
4387
+ inputs: {
4388
+ value: {
4389
+ classPropertyName: "value",
4390
+ publicName: "value",
4391
+ isSignal: true,
4392
+ isRequired: false,
4393
+ transformFunction: null
4394
+ },
4395
+ rules: {
4396
+ classPropertyName: "rules",
4397
+ publicName: "rules",
4398
+ isSignal: true,
4399
+ isRequired: false,
4400
+ transformFunction: null
4401
+ },
4402
+ title: {
4403
+ classPropertyName: "title",
4404
+ publicName: "title",
4405
+ isSignal: true,
4406
+ isRequired: false,
4407
+ transformFunction: null
4408
+ }
4409
+ },
4410
+ ngImport: i0,
4411
+ template: `
4412
+ <div class="pr" role="group" [attr.aria-label]="title()" data-testid="password-requirements">
4413
+ <p class="pr-title">{{ title() }}</p>
4414
+ <ul class="pr-list">
4415
+ @for (r of _results(); track r.id) {
4416
+ <li class="pr-item" [class.pr-met]="r.met" [attr.data-testid]="'password-requirement-' + r.id" [attr.data-met]="r.met">
4417
+ <svg class="pr-icon" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.5"
4418
+ stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
4419
+ @if (r.met) { <path [attr.d]="_check" /> } @else { <circle cx="12" cy="12" r="8" /> }
4420
+ </svg>
4421
+ <span>{{ r.label }}</span>
4422
+ <span class="pr-sr">{{ r.met ? ', met' : ', not met' }}</span>
4423
+ </li>
4424
+ }
4425
+ </ul>
4426
+ </div>
4427
+ `,
4428
+ isInline: true,
4429
+ styles: [":host{display:block}.pr-title{margin:0 0 6px;font-size:.8125rem;color:#64748b}.pr-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.pr-item{display:flex;align-items:center;gap:8px;font-size:.8125rem;line-height:1.3;color:#64748b;transition:color .15s}.pr-icon{flex:0 0 auto}.pr-met{color:#15803d;font-weight:500}.pr-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}\n"],
4430
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
4431
+ });
4432
+ }
4433
+ };
4434
+ i0.ɵɵngDeclareClassMetadata({
4435
+ minVersion: "12.0.0",
4436
+ version: "22.2.2",
4437
+ ngImport: i0,
4438
+ type: PasswordRequirementsComponent,
4439
+ decorators: [{
4440
+ type: Component,
4441
+ args: [{
4442
+ selector: "ui-password-requirements",
4443
+ standalone: true,
4444
+ changeDetection: ChangeDetectionStrategy.OnPush,
4445
+ template: `
4446
+ <div class="pr" role="group" [attr.aria-label]="title()" data-testid="password-requirements">
4447
+ <p class="pr-title">{{ title() }}</p>
4448
+ <ul class="pr-list">
4449
+ @for (r of _results(); track r.id) {
4450
+ <li class="pr-item" [class.pr-met]="r.met" [attr.data-testid]="'password-requirement-' + r.id" [attr.data-met]="r.met">
4451
+ <svg class="pr-icon" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.5"
4452
+ stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
4453
+ @if (r.met) { <path [attr.d]="_check" /> } @else { <circle cx="12" cy="12" r="8" /> }
4454
+ </svg>
4455
+ <span>{{ r.label }}</span>
4456
+ <span class="pr-sr">{{ r.met ? ', met' : ', not met' }}</span>
4457
+ </li>
4458
+ }
4459
+ </ul>
4460
+ </div>
4461
+ `,
4462
+ styles: [":host{display:block}.pr-title{margin:0 0 6px;font-size:.8125rem;color:#64748b}.pr-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.pr-item{display:flex;align-items:center;gap:8px;font-size:.8125rem;line-height:1.3;color:#64748b;transition:color .15s}.pr-icon{flex:0 0 auto}.pr-met{color:#15803d;font-weight:500}.pr-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}\n"]
4463
+ }]
4464
+ }],
4465
+ propDecorators: {
4466
+ value: [{
4467
+ type: i0.Input,
4468
+ args: [{
4469
+ isSignal: true,
4470
+ alias: "value",
4471
+ required: false
4472
+ }]
4473
+ }],
4474
+ rules: [{
4475
+ type: i0.Input,
4476
+ args: [{
4477
+ isSignal: true,
4478
+ alias: "rules",
4479
+ required: false
4480
+ }]
4481
+ }],
4482
+ title: [{
4483
+ type: i0.Input,
4484
+ args: [{
4485
+ isSignal: true,
4486
+ alias: "title",
4487
+ required: false
4488
+ }]
4489
+ }]
4490
+ }
4491
+ });
3915
4492
  var TextInputComponent = class TextInputComponent {
3916
4493
  static {
3917
4494
  this._EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
@@ -3921,6 +4498,9 @@ var TextInputComponent = class TextInputComponent {
3921
4498
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
3922
4499
  this.placeholder = input("", ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
3923
4500
  this.prefix = input("", ...ngDevMode ? [{ debugName: "prefix" }] : /* istanbul ignore next */ []);
4501
+ this.revealable = input(false, ...ngDevMode ? [{ debugName: "revealable" }] : /* istanbul ignore next */ []);
4502
+ this.passwordRequirements = input(false, ...ngDevMode ? [{ debugName: "passwordRequirements" }] : /* istanbul ignore next */ []);
4503
+ this.passwordRules = input(void 0, ...ngDevMode ? [{ debugName: "passwordRules" }] : /* istanbul ignore next */ []);
3924
4504
  this.type = input("text", ...ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []);
3925
4505
  this.maxlength = input(void 0, ...ngDevMode ? [{ debugName: "maxlength" }] : /* istanbul ignore next */ []);
3926
4506
  this.required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
@@ -3957,6 +4537,18 @@ var TextInputComponent = class TextInputComponent {
3957
4537
  if (this.type() === "number" && typeof step === "number" && Number.isFinite(step) && step > 0) return String(step);
3958
4538
  return this.type() === "number" && this.integer() ? "1" : null;
3959
4539
  }, ...ngDevMode ? [{ debugName: "_stepAttr" }] : /* istanbul ignore next */ []);
4540
+ this._revealable = computed(() => this.revealable() && this.type() === "password", ...ngDevMode ? [{ debugName: "_revealable" }] : /* istanbul ignore next */ []);
4541
+ this._shown = signal(false, ...ngDevMode ? [{ debugName: "_shown" }] : /* istanbul ignore next */ []);
4542
+ this._inputType = computed(() => this._revealable() && this._shown() ? "text" : this.type(), ...ngDevMode ? [{ debugName: "_inputType" }] : /* istanbul ignore next */ []);
4543
+ this._eyePath = iconPath("view");
4544
+ this._eyeOffPath = iconPath("view-off");
4545
+ this._showRequirements = computed(() => this.passwordRequirements() && this.type() === "password" && this._typed(), ...ngDevMode ? [{ debugName: "_showRequirements" }] : /* istanbul ignore next */ []);
4546
+ this._describedBy = computed(() => {
4547
+ const ids = [this._activeError() || this.hint() ? this._inputId + "-desc" : "", this._showRequirements() ? this._inputId + "-req" : ""].filter(Boolean);
4548
+ return ids.length ? ids.join(" ") : null;
4549
+ }, ...ngDevMode ? [{ debugName: "_describedBy" }] : /* istanbul ignore next */ []);
4550
+ this._typed = signal(false, ...ngDevMode ? [{ debugName: "_typed" }] : /* istanbul ignore next */ []);
4551
+ this._defaultRules = DEFAULT_PASSWORD_RULES;
3960
4552
  this._warned = false;
3961
4553
  this._formatting = computed(() => this.phoneFormat() || this.type() === "tel", ...ngDevMode ? [{ debugName: "_formatting" }] : /* istanbul ignore next */ []);
3962
4554
  this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
@@ -3983,6 +4575,7 @@ var TextInputComponent = class TextInputComponent {
3983
4575
  writeValue(val) {
3984
4576
  const text = val == null || typeof val === "number" && Number.isNaN(val) && this._numeric() ? "" : String(val);
3985
4577
  this._value.set(this._formatting() ? TextInputComponent._formatPhone(text) : text);
4578
+ if (text === "") this._typed.set(false);
3986
4579
  }
3987
4580
  validate(control) {
3988
4581
  const v = control.value;
@@ -4006,6 +4599,7 @@ var TextInputComponent = class TextInputComponent {
4006
4599
  this._cvaDisabled.set(d);
4007
4600
  }
4008
4601
  onInput(event) {
4602
+ this._typed.set(true);
4009
4603
  const input = event.target;
4010
4604
  const raw = input.value;
4011
4605
  let val = this._formatting() ? TextInputComponent._formatPhone(raw) : raw;
@@ -4147,6 +4741,27 @@ var TextInputComponent = class TextInputComponent {
4147
4741
  isRequired: false,
4148
4742
  transformFunction: null
4149
4743
  },
4744
+ revealable: {
4745
+ classPropertyName: "revealable",
4746
+ publicName: "revealable",
4747
+ isSignal: true,
4748
+ isRequired: false,
4749
+ transformFunction: null
4750
+ },
4751
+ passwordRequirements: {
4752
+ classPropertyName: "passwordRequirements",
4753
+ publicName: "passwordRequirements",
4754
+ isSignal: true,
4755
+ isRequired: false,
4756
+ transformFunction: null
4757
+ },
4758
+ passwordRules: {
4759
+ classPropertyName: "passwordRules",
4760
+ publicName: "passwordRules",
4761
+ isSignal: true,
4762
+ isRequired: false,
4763
+ transformFunction: null
4764
+ },
4150
4765
  type: {
4151
4766
  classPropertyName: "type",
4152
4767
  publicName: "type",
@@ -4300,7 +4915,7 @@ var TextInputComponent = class TextInputComponent {
4300
4915
  ngImport: i0,
4301
4916
  template: `
4302
4917
  <div class="ti-field" [class.ti-error]="_activeError()" [class.ti-disabled]="disabled()"
4303
- [class.ti-prefixed]="!!prefix()" [style.--ti-input-row]="prefix() ? (label() ? 2 : 1) : null">
4918
+ [class.ti-prefixed]="!!prefix() || _revealable()" [style.--ti-input-row]="(prefix() || _revealable()) ? (label() ? 2 : 1) : null">
4304
4919
  @if (label()) {
4305
4920
  <label class="ti-label" [for]="_inputId">
4306
4921
  {{ label() }}
@@ -4310,8 +4925,9 @@ var TextInputComponent = class TextInputComponent {
4310
4925
  <input
4311
4926
  class="ti-input"
4312
4927
  [style.padding-left]="_prefixPadding()"
4928
+ [style.padding-right]="_revealable() ? '44px' : null"
4313
4929
  [id]="_inputId"
4314
- [type]="type()"
4930
+ [type]="_inputType()"
4315
4931
  [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : integer() ? 'numeric' : null)"
4316
4932
  [placeholder]="placeholder()"
4317
4933
  [value]="_value()"
@@ -4323,7 +4939,7 @@ var TextInputComponent = class TextInputComponent {
4323
4939
  [attr.required]="required() || null"
4324
4940
  [attr.aria-label]="ariaLabel() || null"
4325
4941
  [attr.aria-invalid]="_activeError() ? 'true' : null"
4326
- [attr.aria-describedby]="(_activeError() || hint()) ? _inputId + '-desc' : null"
4942
+ [attr.aria-describedby]="_describedBy()"
4327
4943
  (input)="onInput($event)"
4328
4944
  (focus)="onFocus()"
4329
4945
  (blur)="onBlur()"
@@ -4332,6 +4948,18 @@ var TextInputComponent = class TextInputComponent {
4332
4948
  <!-- Optional leading mark ("$"): a sibling after the input, laid over it by the grid of .ti-prefixed, so toggling it never recreates the input (focus and caret stay). -->
4333
4949
  <span class="ti-prefix" aria-hidden="true">{{ prefix() }}</span>
4334
4950
  }
4951
+ @if (_revealable()) {
4952
+ <!-- Show / hide toggle laid over the end of the input by the grid of .ti-prefixed. The name stays "Show password"; aria-pressed carries the state. -->
4953
+ <button type="button" class="ti-reveal" data-testid="ti-reveal" aria-label="Show password"
4954
+ [attr.aria-pressed]="_shown()" [attr.aria-controls]="_inputId" [disabled]="disabled()" (click)="_shown.set(!_shown())">
4955
+ <svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
4956
+ <path [attr.d]="_shown() ? _eyeOffPath : _eyePath" />
4957
+ </svg>
4958
+ </button>
4959
+ }
4960
+ @if (_showRequirements()) {
4961
+ <ui-password-requirements [attr.id]="_inputId + '-req'" [value]="_value()" [rules]="passwordRules() ?? _defaultRules" />
4962
+ }
4335
4963
  @if (_activeError()) {
4336
4964
  <p class="ti-desc ti-desc-error" [id]="_inputId + '-desc'" role="alert">{{ _activeError() }}</p>
4337
4965
  } @else if (hint()) {
@@ -4340,7 +4968,17 @@ var TextInputComponent = class TextInputComponent {
4340
4968
  </div>
4341
4969
  `,
4342
4970
  isInline: true,
4343
- styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#ef4444;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-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;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#94a3b8}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#ef4444}@media(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"],
4971
+ styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#ef4444;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-reveal{grid-row:var(--ti-input-row);grid-column:1;justify-self:end;align-self:center;margin-right:6px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:6px;background:transparent;color:#64748b;cursor:pointer}.ti-reveal:hover:not(:disabled){color:#1e293b;background:#f1f5f9}.ti-reveal:focus-visible{outline:2px solid #3b82f6;outline-offset:0}.ti-reveal:disabled{opacity:.5;cursor:not-allowed}@media(pointer:coarse),(max-width:480px){.ti-reveal{width:44px;height:44px;margin-right:0}}.ti-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;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#94a3b8}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#ef4444}@media(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"],
4972
+ dependencies: [{
4973
+ kind: "component",
4974
+ type: PasswordRequirementsComponent,
4975
+ selector: "ui-password-requirements",
4976
+ inputs: [
4977
+ "value",
4978
+ "rules",
4979
+ "title"
4980
+ ]
4981
+ }],
4344
4982
  changeDetection: i0.ChangeDetectionStrategy.OnPush
4345
4983
  });
4346
4984
  }
@@ -4356,6 +4994,7 @@ i0.ɵɵngDeclareClassMetadata({
4356
4994
  selector: "ui-text-input",
4357
4995
  standalone: true,
4358
4996
  changeDetection: ChangeDetectionStrategy.OnPush,
4997
+ imports: [PasswordRequirementsComponent],
4359
4998
  providers: [
4360
4999
  {
4361
5000
  provide: NG_VALUE_ACCESSOR,
@@ -4374,7 +5013,7 @@ i0.ɵɵngDeclareClassMetadata({
4374
5013
  ],
4375
5014
  template: `
4376
5015
  <div class="ti-field" [class.ti-error]="_activeError()" [class.ti-disabled]="disabled()"
4377
- [class.ti-prefixed]="!!prefix()" [style.--ti-input-row]="prefix() ? (label() ? 2 : 1) : null">
5016
+ [class.ti-prefixed]="!!prefix() || _revealable()" [style.--ti-input-row]="(prefix() || _revealable()) ? (label() ? 2 : 1) : null">
4378
5017
  @if (label()) {
4379
5018
  <label class="ti-label" [for]="_inputId">
4380
5019
  {{ label() }}
@@ -4384,8 +5023,9 @@ i0.ɵɵngDeclareClassMetadata({
4384
5023
  <input
4385
5024
  class="ti-input"
4386
5025
  [style.padding-left]="_prefixPadding()"
5026
+ [style.padding-right]="_revealable() ? '44px' : null"
4387
5027
  [id]="_inputId"
4388
- [type]="type()"
5028
+ [type]="_inputType()"
4389
5029
  [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : integer() ? 'numeric' : null)"
4390
5030
  [placeholder]="placeholder()"
4391
5031
  [value]="_value()"
@@ -4397,7 +5037,7 @@ i0.ɵɵngDeclareClassMetadata({
4397
5037
  [attr.required]="required() || null"
4398
5038
  [attr.aria-label]="ariaLabel() || null"
4399
5039
  [attr.aria-invalid]="_activeError() ? 'true' : null"
4400
- [attr.aria-describedby]="(_activeError() || hint()) ? _inputId + '-desc' : null"
5040
+ [attr.aria-describedby]="_describedBy()"
4401
5041
  (input)="onInput($event)"
4402
5042
  (focus)="onFocus()"
4403
5043
  (blur)="onBlur()"
@@ -4406,6 +5046,18 @@ i0.ɵɵngDeclareClassMetadata({
4406
5046
  <!-- Optional leading mark ("$"): a sibling after the input, laid over it by the grid of .ti-prefixed, so toggling it never recreates the input (focus and caret stay). -->
4407
5047
  <span class="ti-prefix" aria-hidden="true">{{ prefix() }}</span>
4408
5048
  }
5049
+ @if (_revealable()) {
5050
+ <!-- Show / hide toggle laid over the end of the input by the grid of .ti-prefixed. The name stays "Show password"; aria-pressed carries the state. -->
5051
+ <button type="button" class="ti-reveal" data-testid="ti-reveal" aria-label="Show password"
5052
+ [attr.aria-pressed]="_shown()" [attr.aria-controls]="_inputId" [disabled]="disabled()" (click)="_shown.set(!_shown())">
5053
+ <svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
5054
+ <path [attr.d]="_shown() ? _eyeOffPath : _eyePath" />
5055
+ </svg>
5056
+ </button>
5057
+ }
5058
+ @if (_showRequirements()) {
5059
+ <ui-password-requirements [attr.id]="_inputId + '-req'" [value]="_value()" [rules]="passwordRules() ?? _defaultRules" />
5060
+ }
4409
5061
  @if (_activeError()) {
4410
5062
  <p class="ti-desc ti-desc-error" [id]="_inputId + '-desc'" role="alert">{{ _activeError() }}</p>
4411
5063
  } @else if (hint()) {
@@ -4413,7 +5065,7 @@ i0.ɵɵngDeclareClassMetadata({
4413
5065
  }
4414
5066
  </div>
4415
5067
  `,
4416
- styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#ef4444;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-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;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#94a3b8}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#ef4444}@media(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"]
5068
+ styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#ef4444;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-reveal{grid-row:var(--ti-input-row);grid-column:1;justify-self:end;align-self:center;margin-right:6px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:6px;background:transparent;color:#64748b;cursor:pointer}.ti-reveal:hover:not(:disabled){color:#1e293b;background:#f1f5f9}.ti-reveal:focus-visible{outline:2px solid #3b82f6;outline-offset:0}.ti-reveal:disabled{opacity:.5;cursor:not-allowed}@media(pointer:coarse),(max-width:480px){.ti-reveal{width:44px;height:44px;margin-right:0}}.ti-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;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#94a3b8}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#ef4444}@media(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"]
4417
5069
  }]
4418
5070
  }],
4419
5071
  ctorParameters: () => [],
@@ -4450,6 +5102,30 @@ i0.ɵɵngDeclareClassMetadata({
4450
5102
  required: false
4451
5103
  }]
4452
5104
  }],
5105
+ revealable: [{
5106
+ type: i0.Input,
5107
+ args: [{
5108
+ isSignal: true,
5109
+ alias: "revealable",
5110
+ required: false
5111
+ }]
5112
+ }],
5113
+ passwordRequirements: [{
5114
+ type: i0.Input,
5115
+ args: [{
5116
+ isSignal: true,
5117
+ alias: "passwordRequirements",
5118
+ required: false
5119
+ }]
5120
+ }],
5121
+ passwordRules: [{
5122
+ type: i0.Input,
5123
+ args: [{
5124
+ isSignal: true,
5125
+ alias: "passwordRules",
5126
+ required: false
5127
+ }]
5128
+ }],
4453
5129
  type: [{
4454
5130
  type: i0.Input,
4455
5131
  args: [{
@@ -5066,6 +5742,9 @@ var TableToolbarComponent = class TableToolbarComponent {
5066
5742
  "ariaLabel",
5067
5743
  "placeholder",
5068
5744
  "prefix",
5745
+ "revealable",
5746
+ "passwordRequirements",
5747
+ "passwordRules",
5069
5748
  "type",
5070
5749
  "maxlength",
5071
5750
  "required",
@@ -5565,147 +6244,13 @@ function getEligibleIds(items, selectedIds, action, options = {}) {
5565
6244
  skippedCount: selected.length - eligible.length
5566
6245
  };
5567
6246
  }
5568
- let nextTooltipId = 0;
5569
- var TooltipDirective = class TooltipDirective {
5570
- constructor() {
5571
- this.uiTooltip = input("", ...ngDevMode ? [{ debugName: "uiTooltip" }] : /* istanbul ignore next */ []);
5572
- this.tooltipPosition = input("top", ...ngDevMode ? [{ debugName: "tooltipPosition" }] : /* istanbul ignore next */ []);
5573
- this.host = inject(ElementRef).nativeElement;
5574
- this.doc = inject(DOCUMENT);
5575
- this.bubble = null;
5576
- this.id = `ui-tooltip-${nextTooltipId++}`;
5577
- inject(DestroyRef).onDestroy(() => this.hide());
5578
- }
5579
- show() {
5580
- const text = this.uiTooltip();
5581
- if (!text || this.bubble) return;
5582
- const el = this.doc.createElement("div");
5583
- el.id = this.id;
5584
- el.setAttribute("role", "tooltip");
5585
- el.textContent = text;
5586
- Object.assign(el.style, {
5587
- position: "fixed",
5588
- zIndex: "10000",
5589
- maxWidth: "280px",
5590
- padding: "6px 10px",
5591
- background: "#0f172a",
5592
- color: "#fff",
5593
- fontSize: "0.75rem",
5594
- lineHeight: "1.4",
5595
- borderRadius: "6px",
5596
- boxShadow: "0 4px 12px rgba(15,23,42,.25)",
5597
- whiteSpace: "pre-line",
5598
- pointerEvents: "none",
5599
- visibility: "hidden"
5600
- });
5601
- this.doc.body.appendChild(el);
5602
- this.bubble = el;
5603
- this.host.setAttribute("aria-describedby", this.id);
5604
- const r = this.host.getBoundingClientRect();
5605
- const b = el.getBoundingClientRect();
5606
- const gap = 6;
5607
- let top = this.tooltipPosition() === "top" ? r.top - b.height - gap : r.bottom + gap;
5608
- if (top < 4) top = r.bottom + gap;
5609
- else if (top + b.height > window.innerHeight - 4) top = r.top - b.height - gap;
5610
- const left = Math.min(Math.max(4, r.left + r.width / 2 - b.width / 2), window.innerWidth - b.width - 4);
5611
- el.style.top = `${top}px`;
5612
- el.style.left = `${left}px`;
5613
- el.style.visibility = "visible";
5614
- }
5615
- hide() {
5616
- this.bubble?.remove();
5617
- this.bubble = null;
5618
- this.host.removeAttribute("aria-describedby");
5619
- }
5620
- static {
5621
- this.ɵfac = i0.ɵɵngDeclareFactory({
5622
- minVersion: "12.0.0",
5623
- version: "22.2.2",
5624
- ngImport: i0,
5625
- type: TooltipDirective,
5626
- deps: [],
5627
- target: i0.ɵɵFactoryTarget.Directive
5628
- });
5629
- }
5630
- static {
5631
- this.ɵdir = i0.ɵɵngDeclareDirective({
5632
- minVersion: "17.1.0",
5633
- version: "22.2.2",
5634
- type: TooltipDirective,
5635
- isStandalone: true,
5636
- selector: "[uiTooltip]",
5637
- inputs: {
5638
- uiTooltip: {
5639
- classPropertyName: "uiTooltip",
5640
- publicName: "uiTooltip",
5641
- isSignal: true,
5642
- isRequired: false,
5643
- transformFunction: null
5644
- },
5645
- tooltipPosition: {
5646
- classPropertyName: "tooltipPosition",
5647
- publicName: "tooltipPosition",
5648
- isSignal: true,
5649
- isRequired: false,
5650
- transformFunction: null
5651
- }
5652
- },
5653
- host: { listeners: {
5654
- "mouseenter": "show()",
5655
- "mouseleave": "hide()",
5656
- "focusin": "show()",
5657
- "focusout": "hide()",
5658
- "keydown.escape": "hide()",
5659
- "click": "hide()"
5660
- } },
5661
- ngImport: i0
5662
- });
5663
- }
5664
- };
5665
- i0.ɵɵngDeclareClassMetadata({
5666
- minVersion: "12.0.0",
5667
- version: "22.2.2",
5668
- ngImport: i0,
5669
- type: TooltipDirective,
5670
- decorators: [{
5671
- type: Directive,
5672
- args: [{
5673
- selector: "[uiTooltip]",
5674
- standalone: true,
5675
- host: {
5676
- "(mouseenter)": "show()",
5677
- "(mouseleave)": "hide()",
5678
- "(focusin)": "show()",
5679
- "(focusout)": "hide()",
5680
- "(keydown.escape)": "hide()",
5681
- "(click)": "hide()"
5682
- }
5683
- }]
5684
- }],
5685
- ctorParameters: () => [],
5686
- propDecorators: {
5687
- uiTooltip: [{
5688
- type: i0.Input,
5689
- args: [{
5690
- isSignal: true,
5691
- alias: "uiTooltip",
5692
- required: false
5693
- }]
5694
- }],
5695
- tooltipPosition: [{
5696
- type: i0.Input,
5697
- args: [{
5698
- isSignal: true,
5699
- alias: "tooltipPosition",
5700
- required: false
5701
- }]
5702
- }]
5703
- }
5704
- });
5705
6247
  var StarComponent = class StarComponent {
5706
6248
  constructor() {
5707
6249
  this.tooltip = input("", ...ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []);
5708
6250
  this.size = input(16, ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
6251
+ this.filled = input(true, ...ngDevMode ? [{ debugName: "filled" }] : /* istanbul ignore next */ []);
6252
+ this.interactive = input(false, ...ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []);
6253
+ this.starClick = output();
5709
6254
  this.hasTooltip = computed(() => !!this.tooltip(), ...ngDevMode ? [{ debugName: "hasTooltip" }] : /* istanbul ignore next */ []);
5710
6255
  }
5711
6256
  static {
@@ -5720,7 +6265,7 @@ var StarComponent = class StarComponent {
5720
6265
  }
5721
6266
  static {
5722
6267
  this.ɵcmp = i0.ɵɵngDeclareComponent({
5723
- minVersion: "17.1.0",
6268
+ minVersion: "17.0.0",
5724
6269
  version: "22.2.2",
5725
6270
  type: StarComponent,
5726
6271
  isStandalone: true,
@@ -5739,28 +6284,62 @@ var StarComponent = class StarComponent {
5739
6284
  isSignal: true,
5740
6285
  isRequired: false,
5741
6286
  transformFunction: null
6287
+ },
6288
+ filled: {
6289
+ classPropertyName: "filled",
6290
+ publicName: "filled",
6291
+ isSignal: true,
6292
+ isRequired: false,
6293
+ transformFunction: null
6294
+ },
6295
+ interactive: {
6296
+ classPropertyName: "interactive",
6297
+ publicName: "interactive",
6298
+ isSignal: true,
6299
+ isRequired: false,
6300
+ transformFunction: null
5742
6301
  }
5743
6302
  },
6303
+ outputs: { starClick: "starClick" },
5744
6304
  ngImport: i0,
5745
6305
  template: `
5746
- <span class="star"
5747
- [uiTooltip]="tooltip()"
5748
- [attr.role]="hasTooltip() ? 'img' : null"
5749
- [attr.aria-label]="hasTooltip() ? tooltip() : null"
5750
- [attr.aria-hidden]="hasTooltip() ? null : 'true'"
5751
- [attr.tabindex]="hasTooltip() ? 0 : null">
6306
+ @if (interactive()) {
6307
+ <button type="button" class="star star-btn" [class.star-off]="!filled()" [uiTooltip]="tooltip()"
6308
+ [attr.aria-label]="tooltip() || null" (click)="starClick.emit($event)">
6309
+ <ng-container *ngTemplateOutlet="shape" />
6310
+ </button>
6311
+ } @else {
6312
+ <span class="star" [class.star-off]="!filled()"
6313
+ [uiTooltip]="tooltip()"
6314
+ [attr.role]="hasTooltip() ? 'img' : null"
6315
+ [attr.aria-label]="hasTooltip() ? tooltip() : null"
6316
+ [attr.aria-hidden]="hasTooltip() ? null : 'true'"
6317
+ [attr.tabindex]="hasTooltip() ? 0 : null">
6318
+ <ng-container *ngTemplateOutlet="shape" />
6319
+ </span>
6320
+ }
6321
+ <ng-template #shape>
5752
6322
  <svg [attr.width]="size()" [attr.height]="size()" viewBox="0 0 20 20" aria-hidden="true" focusable="false">
5753
6323
  <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" />
5754
6324
  </svg>
5755
- </span>
6325
+ </ng-template>
5756
6326
  `,
5757
6327
  isInline: true,
5758
- 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"],
6328
+ 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-btn{border:0;background:none;padding:0;margin:0;cursor:pointer;font:inherit}.star-off .star-shape{fill:none;stroke:#94a3b8;stroke-width:1.25}.star-btn.star-off:hover .star-shape{stroke:#64748b}.star:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.star-shape{fill:#f5b301;stroke:#d99a00;stroke-width:.75;stroke-linejoin:round}\n"],
5759
6329
  dependencies: [{
5760
6330
  kind: "directive",
5761
6331
  type: TooltipDirective,
5762
6332
  selector: "[uiTooltip]",
5763
6333
  inputs: ["uiTooltip", "tooltipPosition"]
6334
+ }, {
6335
+ kind: "directive",
6336
+ type: NgTemplateOutlet,
6337
+ selector: "[ngTemplateOutlet]",
6338
+ inputs: [
6339
+ "ngTemplateOutletContext",
6340
+ "ngTemplateOutlet",
6341
+ "ngTemplateOutletInjector"
6342
+ ]
5764
6343
  }],
5765
6344
  changeDetection: i0.ChangeDetectionStrategy.OnPush
5766
6345
  });
@@ -5777,20 +6356,30 @@ i0.ɵɵngDeclareClassMetadata({
5777
6356
  selector: "ui-star",
5778
6357
  standalone: true,
5779
6358
  changeDetection: ChangeDetectionStrategy.OnPush,
5780
- imports: [TooltipDirective],
6359
+ imports: [TooltipDirective, NgTemplateOutlet],
5781
6360
  template: `
5782
- <span class="star"
5783
- [uiTooltip]="tooltip()"
5784
- [attr.role]="hasTooltip() ? 'img' : null"
5785
- [attr.aria-label]="hasTooltip() ? tooltip() : null"
5786
- [attr.aria-hidden]="hasTooltip() ? null : 'true'"
5787
- [attr.tabindex]="hasTooltip() ? 0 : null">
6361
+ @if (interactive()) {
6362
+ <button type="button" class="star star-btn" [class.star-off]="!filled()" [uiTooltip]="tooltip()"
6363
+ [attr.aria-label]="tooltip() || null" (click)="starClick.emit($event)">
6364
+ <ng-container *ngTemplateOutlet="shape" />
6365
+ </button>
6366
+ } @else {
6367
+ <span class="star" [class.star-off]="!filled()"
6368
+ [uiTooltip]="tooltip()"
6369
+ [attr.role]="hasTooltip() ? 'img' : null"
6370
+ [attr.aria-label]="hasTooltip() ? tooltip() : null"
6371
+ [attr.aria-hidden]="hasTooltip() ? null : 'true'"
6372
+ [attr.tabindex]="hasTooltip() ? 0 : null">
6373
+ <ng-container *ngTemplateOutlet="shape" />
6374
+ </span>
6375
+ }
6376
+ <ng-template #shape>
5788
6377
  <svg [attr.width]="size()" [attr.height]="size()" viewBox="0 0 20 20" aria-hidden="true" focusable="false">
5789
6378
  <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" />
5790
6379
  </svg>
5791
- </span>
6380
+ </ng-template>
5792
6381
  `,
5793
- 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"]
6382
+ 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-btn{border:0;background:none;padding:0;margin:0;cursor:pointer;font:inherit}.star-off .star-shape{fill:none;stroke:#94a3b8;stroke-width:1.25}.star-btn.star-off:hover .star-shape{stroke:#64748b}.star:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.star-shape{fill:#f5b301;stroke:#d99a00;stroke-width:.75;stroke-linejoin:round}\n"]
5794
6383
  }]
5795
6384
  }],
5796
6385
  propDecorators: {
@@ -5809,6 +6398,26 @@ i0.ɵɵngDeclareClassMetadata({
5809
6398
  alias: "size",
5810
6399
  required: false
5811
6400
  }]
6401
+ }],
6402
+ filled: [{
6403
+ type: i0.Input,
6404
+ args: [{
6405
+ isSignal: true,
6406
+ alias: "filled",
6407
+ required: false
6408
+ }]
6409
+ }],
6410
+ interactive: [{
6411
+ type: i0.Input,
6412
+ args: [{
6413
+ isSignal: true,
6414
+ alias: "interactive",
6415
+ required: false
6416
+ }]
6417
+ }],
6418
+ starClick: [{
6419
+ type: i0.Output,
6420
+ args: ["starClick"]
5812
6421
  }]
5813
6422
  }
5814
6423
  });
@@ -8631,6 +9240,7 @@ i0.ɵɵngDeclareClassMetadata({
8631
9240
  }]
8632
9241
  }
8633
9242
  });
9243
+ let reorderHelpSeq = 0;
8634
9244
  function formatPhone$1(raw) {
8635
9245
  if (!raw) return "—";
8636
9246
  const digits = raw.replace(/\D/g, "");
@@ -8676,6 +9286,96 @@ var DataTableComponent = class DataTableComponent {
8676
9286
  const listeners = this.rowClick.listeners;
8677
9287
  return listeners === void 0 ? true : (listeners?.length ?? 0) > 0;
8678
9288
  }
9289
+ reorderLabel(item) {
9290
+ const name = this.rowAccessibleName(item);
9291
+ return name ? `Reorder ${name}` : "Reorder row";
9292
+ }
9293
+ onGripDragStart(e, index) {
9294
+ if (!this._reorderActive()) {
9295
+ e.preventDefault();
9296
+ return;
9297
+ }
9298
+ this._dragFrom.set(index);
9299
+ this._dragKey = this.trackItem(this._items()[index], index);
9300
+ if (e.dataTransfer) {
9301
+ e.dataTransfer.effectAllowed = "move";
9302
+ e.dataTransfer.setData("text/plain", String(index));
9303
+ const row = e.target.closest("tr, .dt-card");
9304
+ if (row) e.dataTransfer.setDragImage(row, 16, 16);
9305
+ }
9306
+ }
9307
+ onGripDragEnd() {
9308
+ this._dragFrom.set(null);
9309
+ this._dragOver.set(null);
9310
+ this._dragKey = null;
9311
+ }
9312
+ onRowDragOver(e, index) {
9313
+ if (this._dragFrom() === null) return;
9314
+ e.preventDefault();
9315
+ if (e.dataTransfer) e.dataTransfer.dropEffect = "move";
9316
+ this._dragOver.set(index);
9317
+ }
9318
+ onRowDrop(e, index) {
9319
+ const dragged = this._dragFrom();
9320
+ if (dragged === null) return;
9321
+ e.preventDefault();
9322
+ const key = this._dragKey;
9323
+ const from = key === null ? dragged : this._items().findIndex((item, i) => this.trackItem(item, i) === key);
9324
+ this.onGripDragEnd();
9325
+ if (from >= 0) this.moveRow(from, index);
9326
+ }
9327
+ onGripKeydown(e, index) {
9328
+ if (!this._reorderActive()) return;
9329
+ const last = this._items().length - 1;
9330
+ if (e.key === "Enter" || e.key === " ") {
9331
+ e.preventDefault();
9332
+ e.stopPropagation();
9333
+ const name = this.rowAccessibleName(this._items()[index]) || "Row";
9334
+ this._reorderAnnouncement.set("");
9335
+ afterNextRender(() => this._reorderAnnouncement.set(`${name} is at position ${index + 1} of ${last + 1}. Use the up and down arrow keys to move it, Home for the top, End for the bottom.`), { injector: this._injector });
9336
+ return;
9337
+ }
9338
+ const target = e.key === "ArrowUp" ? index - 1 : e.key === "ArrowDown" ? index + 1 : e.key === "Home" ? 0 : e.key === "End" ? last : null;
9339
+ if (target === null) return;
9340
+ e.preventDefault();
9341
+ e.stopPropagation();
9342
+ if (this.moveRow(index, target)) {
9343
+ const key = String(this._items()[Math.max(0, Math.min(last, target))]["id"] ?? target);
9344
+ afterNextRender(() => {
9345
+ this._host.nativeElement.querySelector(`[data-row-key="${CSS.escape(key)}"] .dt-grip`)?.focus();
9346
+ }, { injector: this._injector });
9347
+ }
9348
+ }
9349
+ moveByButton(index, direction) {
9350
+ const key = String(this.trackItem(this._items()[index], index));
9351
+ if (!this.moveRow(index, index + direction)) return;
9352
+ afterNextRender(() => {
9353
+ const row = this._host.nativeElement.querySelector(`[data-row-key="${CSS.escape(key)}"]`);
9354
+ const suffix = direction === -1 ? " up" : " down";
9355
+ (row?.querySelector(`button[aria-label$="${suffix}"]:not(:disabled)`) ?? row?.querySelector(".dt-row-move button:not(:disabled), .dt-card-move button:not(:disabled)"))?.focus();
9356
+ }, { injector: this._injector });
9357
+ }
9358
+ moveRow(from, to) {
9359
+ const items = this._items();
9360
+ if (!this._reorderActive() || !Number.isInteger(from) || from < 0 || from >= items.length) return false;
9361
+ const target = Math.max(0, Math.min(items.length - 1, to));
9362
+ if (target === from) return false;
9363
+ const next = [...items];
9364
+ const [moved] = next.splice(from, 1);
9365
+ next.splice(target, 0, moved);
9366
+ this._items.set(next);
9367
+ const name = this.rowAccessibleName(moved) || "Row";
9368
+ this._reorderAnnouncement.set("");
9369
+ afterNextRender(() => this._reorderAnnouncement.set(`${name} moved to position ${target + 1} of ${next.length}`), { injector: this._injector });
9370
+ this.rowReorder.emit({
9371
+ item: moved,
9372
+ from,
9373
+ to: target,
9374
+ items: next,
9375
+ offset: (this._page() - 1) * this.pageSize()
9376
+ });
9377
+ return true;
9378
+ }
8679
9379
  _bulkOptionsFor(def) {
8680
9380
  const opts = this._getOptionsForField(def.field);
8681
9381
  return def.exclude?.length ? opts.filter((o) => !this._isBulkExcluded(def, o.value)) : opts;
@@ -9036,6 +9736,8 @@ var DataTableComponent = class DataTableComponent {
9036
9736
  this.tabChange = output();
9037
9737
  this.bulkAction = output();
9038
9738
  this.rowDeleted = output();
9739
+ this.reorderable = input(false, ...ngDevMode ? [{ debugName: "reorderable" }] : /* istanbul ignore next */ []);
9740
+ this.rowReorder = output();
9039
9741
  this.config = inject(FORGEROUTE_CONFIG);
9040
9742
  this.http = inject(HttpClient);
9041
9743
  this.destroyRef = inject(DestroyRef);
@@ -9132,6 +9834,15 @@ var DataTableComponent = class DataTableComponent {
9132
9834
  this._emptyUnfiltered = computed(() => this._hasLoaded() && !this._loading() && !this._error() && this._items().length === 0 && !this._hasActiveFilters(), ...ngDevMode ? [{ debugName: "_emptyUnfiltered" }] : /* istanbul ignore next */ []);
9133
9835
  this._toolbarButtons = computed(() => this._emptyUnfiltered() ? this._effectiveButtons().filter((b) => b.variant === "primary" || b.keepWhenEmpty) : this._effectiveButtons(), ...ngDevMode ? [{ debugName: "_toolbarButtons" }] : /* istanbul ignore next */ []);
9134
9836
  this._keepMoreActions = computed(() => this._emptyUnfiltered() && this._toolbarButtons().some((b) => !b.variant && !b.hidden), ...ngDevMode ? [{ debugName: "_keepMoreActions" }] : /* istanbul ignore next */ []);
9837
+ this._reorderOn = computed(() => this.reorderable() && this._canEdit(), ...ngDevMode ? [{ debugName: "_reorderOn" }] : /* istanbul ignore next */ []);
9838
+ this._reorderActive = computed(() => this._reorderOn() && !this._loading() && !this._error() && !this._sortField() && !this._hasActiveFilters() && this._items().length > 1, ...ngDevMode ? [{ debugName: "_reorderActive" }] : /* istanbul ignore next */ []);
9839
+ this._reorderHint = computed(() => this._items().length < 2 ? "There is nothing to reorder" : "Clear the sort, search and filters to change the order", ...ngDevMode ? [{ debugName: "_reorderHint" }] : /* istanbul ignore next */ []);
9840
+ this._reorderHelpId = `dt-reorder-help-${++reorderHelpSeq}`;
9841
+ this._dragFrom = signal(null, ...ngDevMode ? [{ debugName: "_dragFrom" }] : /* istanbul ignore next */ []);
9842
+ this._dragKey = null;
9843
+ this._dragOver = signal(null, ...ngDevMode ? [{ debugName: "_dragOver" }] : /* istanbul ignore next */ []);
9844
+ this._reorderAnnouncement = signal("", ...ngDevMode ? [{ debugName: "_reorderAnnouncement" }] : /* istanbul ignore next */ []);
9845
+ this._host = inject(ElementRef);
9135
9846
  this._hasActiveFilters = computed(() => {
9136
9847
  const cf = this._colFilterValues();
9137
9848
  return !!this._search() || !!this._activeTab() || Object.values(cf).some((v) => v.length > 0);
@@ -10052,6 +10763,13 @@ var DataTableComponent = class DataTableComponent {
10052
10763
  isSignal: true,
10053
10764
  isRequired: false,
10054
10765
  transformFunction: null
10766
+ },
10767
+ reorderable: {
10768
+ classPropertyName: "reorderable",
10769
+ publicName: "reorderable",
10770
+ isSignal: true,
10771
+ isRequired: false,
10772
+ transformFunction: null
10055
10773
  }
10056
10774
  },
10057
10775
  outputs: {
@@ -10066,7 +10784,8 @@ var DataTableComponent = class DataTableComponent {
10066
10784
  selectionChange: "selectionChange",
10067
10785
  tabChange: "tabChange",
10068
10786
  bulkAction: "bulkAction",
10069
- rowDeleted: "rowDeleted"
10787
+ rowDeleted: "rowDeleted",
10788
+ rowReorder: "rowReorder"
10070
10789
  },
10071
10790
  providers: [DatePipe, {
10072
10791
  provide: DROPDOWN_GROUP,
@@ -10221,6 +10940,9 @@ var DataTableComponent = class DataTableComponent {
10221
10940
  <table [attr.aria-label]="tableLabel()" [attr.aria-busy]="_loading()">
10222
10941
  <thead>
10223
10942
  <tr>
10943
+ @if (_reorderOn()) {
10944
+ <th class="dt-th-grip" scope="col"><span class="dt-sr-only">Reorder</span></th>
10945
+ }
10224
10946
  @if (_isSelectable()) {
10225
10947
  <th class="dt-th-cb" scope="col">
10226
10948
  <ui-checkbox
@@ -10275,6 +10997,9 @@ var DataTableComponent = class DataTableComponent {
10275
10997
  @if (_loading()) {
10276
10998
  @for (_ of skeletonRows(); track $index) {
10277
10999
  <tr class="dt-sk-reload-row">
11000
+ @if (_reorderOn()) {
11001
+ <td class="dt-td-grip"></td>
11002
+ }
10278
11003
  @if (_isSelectable()) {
10279
11004
  <td class="dt-td-cb"></td>
10280
11005
  }
@@ -10288,7 +11013,7 @@ var DataTableComponent = class DataTableComponent {
10288
11013
  <!-- Error -->
10289
11014
  @else if (_error()) {
10290
11015
  <tr>
10291
- <td [attr.colspan]="visibleCols().length + (_isSelectable() ? 1 : 0)" class="dt-state-cell">
11016
+ <td [attr.colspan]="visibleCols().length + (_isSelectable() ? 1 : 0) + (_reorderOn() ? 1 : 0)" class="dt-state-cell">
10292
11017
  <ui-error-state [message]="_error()!" [retryLabel]="_retryLabel()" (retry)="load()" />
10293
11018
  </td>
10294
11019
  </tr>
@@ -10297,7 +11022,7 @@ var DataTableComponent = class DataTableComponent {
10297
11022
  <!-- Empty (no filters active) -->
10298
11023
  @else if (_items().length === 0 && !_hasActiveFilters()) {
10299
11024
  <tr>
10300
- <td [attr.colspan]="visibleCols().length + (_isSelectable() ? 1 : 0)" class="dt-state-cell">
11025
+ <td [attr.colspan]="visibleCols().length + (_isSelectable() ? 1 : 0) + (_reorderOn() ? 1 : 0)" class="dt-state-cell">
10301
11026
  <ui-empty-state iconType="table" [message]="emptyMessage()" />
10302
11027
  </td>
10303
11028
  </tr>
@@ -10306,7 +11031,7 @@ var DataTableComponent = class DataTableComponent {
10306
11031
  <!-- No match -->
10307
11032
  @else if (_items().length === 0 && _hasActiveFilters()) {
10308
11033
  <tr>
10309
- <td [attr.colspan]="visibleCols().length + (_isSelectable() ? 1 : 0)" class="dt-state-cell">
11034
+ <td [attr.colspan]="visibleCols().length + (_isSelectable() ? 1 : 0) + (_reorderOn() ? 1 : 0)" class="dt-state-cell">
10310
11035
  <ui-empty-state iconType="search" message="No results match your search or filters.">
10311
11036
  <ui-button variant="secondary" size="sm" (click)="clearFilters()">Clear filters</ui-button>
10312
11037
  </ui-empty-state>
@@ -10322,10 +11047,44 @@ var DataTableComponent = class DataTableComponent {
10322
11047
  [style.--i]="$index < 8 ? $index : 8"
10323
11048
  [class.dt-row-clickable]="isRowClickable(item)"
10324
11049
  [class.dt-row-selected]="_isSelectable() && _selectedIds().has(item['id'])"
11050
+ [class.dt-row-dragging]="_dragFrom() === $index"
11051
+ [class.dt-row-over-before]="_reorderOn() && _dragFrom() !== null && _dragOver() === $index && _dragFrom()! > $index"
11052
+ [class.dt-row-over-after]="_reorderOn() && _dragFrom() !== null && _dragOver() === $index && _dragFrom()! < $index"
11053
+ [attr.data-row-key]="_reorderOn() ? trackItem(item, $index) : null"
10325
11054
  [attr.tabindex]="isRowClickable(item) ? 0 : null"
10326
11055
  [attr.aria-label]="rowLabel(item)"
10327
11056
  (keydown)="onRowKeydown($event, item)"
11057
+ (dragover)="onRowDragOver($event, $index)"
11058
+ (drop)="onRowDrop($event, $index)"
10328
11059
  (click)="onRowClick(item)">
11060
+ @if (_reorderOn()) {
11061
+ <td class="dt-td-grip" (click)="$event.stopPropagation()">
11062
+ <span class="dt-grip" role="button" [attr.tabindex]="_reorderActive() ? 0 : null"
11063
+ [attr.draggable]="_reorderActive() ? 'true' : null"
11064
+ [attr.aria-label]="reorderLabel(item)"
11065
+ [attr.aria-disabled]="_reorderActive() ? null : 'true'"
11066
+ [attr.aria-roledescription]="'drag handle'"
11067
+ [attr.aria-describedby]="_reorderHelpId"
11068
+ [attr.title]="_reorderActive() ? 'Drag to reorder, or use the up and down arrow keys' : _reorderHint()"
11069
+ [class.dt-grip-off]="!_reorderActive()"
11070
+ (dragstart)="onGripDragStart($event, $index)"
11071
+ (dragend)="onGripDragEnd()"
11072
+ (keydown)="onGripKeydown($event, $index)">
11073
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true" focusable="false"><circle cx="9" cy="6" r="1.6"/><circle cx="15" cy="6" r="1.6"/><circle cx="9" cy="12" r="1.6"/><circle cx="15" cy="12" r="1.6"/><circle cx="9" cy="18" r="1.6"/><circle cx="15" cy="18" r="1.6"/></svg>
11074
+ </span>
11075
+ <!-- Touch screens (coarse primary pointer, e.g. a tablet) cannot rely on native drag: they get Move up / Move down instead of the grip. -->
11076
+ <span class="dt-row-move">
11077
+ <ui-button variant="icon" size="sm" [ariaLabel]="'Move ' + (rowAccessibleName(item) || 'row') + ' up'"
11078
+ [disabled]="!_reorderActive() || $first" (click)="moveByButton($index, -1)">
11079
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 15l6-6 6 6"/></svg>
11080
+ </ui-button>
11081
+ <ui-button variant="icon" size="sm" [ariaLabel]="'Move ' + (rowAccessibleName(item) || 'row') + ' down'"
11082
+ [disabled]="!_reorderActive() || $last" (click)="moveByButton($index, 1)">
11083
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
11084
+ </ui-button>
11085
+ </span>
11086
+ </td>
11087
+ }
10329
11088
  @if (_isSelectable()) {
10330
11089
  <td class="dt-td-cb" (click)="$event.stopPropagation()">
10331
11090
  <ui-checkbox
@@ -10531,6 +11290,7 @@ var DataTableComponent = class DataTableComponent {
10531
11290
  @for (item of _items(); track trackItem(item, $index)) {
10532
11291
  <div
10533
11292
  class="dt-card alive-row"
11293
+ [attr.data-row-key]="_reorderOn() ? trackItem(item, $index) : null"
10534
11294
  [style.--i]="$index < 8 ? $index : 8"
10535
11295
  role="listitem"
10536
11296
  [class.dt-card-clickable]="isRowClickable(item)"
@@ -10576,6 +11336,18 @@ var DataTableComponent = class DataTableComponent {
10576
11336
  </span>
10577
11337
  }
10578
11338
  }
11339
+ @if (_reorderOn()) {
11340
+ <span class="dt-card-move" (click)="$event.stopPropagation()">
11341
+ <ui-button variant="icon" size="sm" [ariaLabel]="'Move ' + (rowAccessibleName(item) || 'row') + ' up'"
11342
+ [disabled]="!_reorderActive() || $first" (click)="moveByButton($index, -1)">
11343
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 15l6-6 6 6"/></svg>
11344
+ </ui-button>
11345
+ <ui-button variant="icon" size="sm" [ariaLabel]="'Move ' + (rowAccessibleName(item) || 'row') + ' down'"
11346
+ [disabled]="!_reorderActive() || $last" (click)="moveByButton($index, 1)">
11347
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
11348
+ </ui-button>
11349
+ </span>
11350
+ }
10579
11351
  @if (_cardCols().actionsCol; as ac) {
10580
11352
  @let cardActions = _rowActions(ac, item);
10581
11353
  @if (cardActions.length) {
@@ -10639,6 +11411,13 @@ var DataTableComponent = class DataTableComponent {
10639
11411
  </div>
10640
11412
  }
10641
11413
 
11414
+ @if (_reorderOn()) {
11415
+ <span class="dt-sr-only" [id]="_reorderHelpId">{{ _reorderActive()
11416
+ ? 'Drag to reorder with a mouse, or use the up and down arrow keys; Home moves to the top and End to the bottom.'
11417
+ : _reorderHint() }}</span>
11418
+ <span class="dt-sr-only" role="status" aria-live="polite" aria-atomic="true">{{ _reorderAnnouncement() }}</span>
11419
+ }
11420
+
10642
11421
  <!-- ── PAGINATION ─────────────────────────────────────────── -->
10643
11422
  @if (_total() > pageSize()) {
10644
11423
  <ui-pagination
@@ -10697,7 +11476,7 @@ var DataTableComponent = class DataTableComponent {
10697
11476
  </div>
10698
11477
  `,
10699
11478
  isInline: true,
10700
- 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"],
11479
+ 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-th-grip{width:36px;padding:0!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-grip{width:36px;padding:0!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-grip{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#64748b;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.dt-grip:hover{background:#f1f5f9;color:#334155}.dt-grip:active{cursor:grabbing}.dt-grip:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.dt-grip-off{color:#cbd5e1;cursor:not-allowed}.dt-grip-off:hover{background:none;color:#cbd5e1}.dt-row-move{display:none}@media(pointer:coarse){.dt-grip{display:none}.dt-row-move{display:inline-flex;flex-direction:column;align-items:center}.dt-th-grip,.dt-td-grip{width:56px}}.dt-row-dragging{opacity:.45}.dt-row-over-before>td{box-shadow:inset 0 2px #3b82f6}.dt-row-over-after>td{box-shadow:inset 0 -2px #3b82f6}.dt-card-move{display:inline-flex;align-items:center;gap:2px;flex-shrink:0}@media(forced-colors:active){.dt-row-over-before>td{box-shadow:inset 0 2px 0 Highlight}.dt-row-over-after>td{box-shadow:inset 0 -2px 0 Highlight}.dt-grip:focus-visible{outline-color:Highlight}}.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:820px){.dt-header-left{flex-basis:100%}.dt-header-right{flex-basis:100%;justify-content:flex-start}}@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"],
10701
11480
  dependencies: [
10702
11481
  {
10703
11482
  kind: "directive",
@@ -10840,7 +11619,13 @@ var DataTableComponent = class DataTableComponent {
10840
11619
  kind: "component",
10841
11620
  type: StarComponent,
10842
11621
  selector: "ui-star",
10843
- inputs: ["tooltip", "size"]
11622
+ inputs: [
11623
+ "tooltip",
11624
+ "size",
11625
+ "filled",
11626
+ "interactive"
11627
+ ],
11628
+ outputs: ["starClick"]
10844
11629
  },
10845
11630
  {
10846
11631
  kind: "component",
@@ -11208,6 +11993,9 @@ i0.ɵɵngDeclareClassMetadata({
11208
11993
  <table [attr.aria-label]="tableLabel()" [attr.aria-busy]="_loading()">
11209
11994
  <thead>
11210
11995
  <tr>
11996
+ @if (_reorderOn()) {
11997
+ <th class="dt-th-grip" scope="col"><span class="dt-sr-only">Reorder</span></th>
11998
+ }
11211
11999
  @if (_isSelectable()) {
11212
12000
  <th class="dt-th-cb" scope="col">
11213
12001
  <ui-checkbox
@@ -11262,6 +12050,9 @@ i0.ɵɵngDeclareClassMetadata({
11262
12050
  @if (_loading()) {
11263
12051
  @for (_ of skeletonRows(); track $index) {
11264
12052
  <tr class="dt-sk-reload-row">
12053
+ @if (_reorderOn()) {
12054
+ <td class="dt-td-grip"></td>
12055
+ }
11265
12056
  @if (_isSelectable()) {
11266
12057
  <td class="dt-td-cb"></td>
11267
12058
  }
@@ -11275,7 +12066,7 @@ i0.ɵɵngDeclareClassMetadata({
11275
12066
  <!-- Error -->
11276
12067
  @else if (_error()) {
11277
12068
  <tr>
11278
- <td [attr.colspan]="visibleCols().length + (_isSelectable() ? 1 : 0)" class="dt-state-cell">
12069
+ <td [attr.colspan]="visibleCols().length + (_isSelectable() ? 1 : 0) + (_reorderOn() ? 1 : 0)" class="dt-state-cell">
11279
12070
  <ui-error-state [message]="_error()!" [retryLabel]="_retryLabel()" (retry)="load()" />
11280
12071
  </td>
11281
12072
  </tr>
@@ -11284,7 +12075,7 @@ i0.ɵɵngDeclareClassMetadata({
11284
12075
  <!-- Empty (no filters active) -->
11285
12076
  @else if (_items().length === 0 && !_hasActiveFilters()) {
11286
12077
  <tr>
11287
- <td [attr.colspan]="visibleCols().length + (_isSelectable() ? 1 : 0)" class="dt-state-cell">
12078
+ <td [attr.colspan]="visibleCols().length + (_isSelectable() ? 1 : 0) + (_reorderOn() ? 1 : 0)" class="dt-state-cell">
11288
12079
  <ui-empty-state iconType="table" [message]="emptyMessage()" />
11289
12080
  </td>
11290
12081
  </tr>
@@ -11293,7 +12084,7 @@ i0.ɵɵngDeclareClassMetadata({
11293
12084
  <!-- No match -->
11294
12085
  @else if (_items().length === 0 && _hasActiveFilters()) {
11295
12086
  <tr>
11296
- <td [attr.colspan]="visibleCols().length + (_isSelectable() ? 1 : 0)" class="dt-state-cell">
12087
+ <td [attr.colspan]="visibleCols().length + (_isSelectable() ? 1 : 0) + (_reorderOn() ? 1 : 0)" class="dt-state-cell">
11297
12088
  <ui-empty-state iconType="search" message="No results match your search or filters.">
11298
12089
  <ui-button variant="secondary" size="sm" (click)="clearFilters()">Clear filters</ui-button>
11299
12090
  </ui-empty-state>
@@ -11309,10 +12100,44 @@ i0.ɵɵngDeclareClassMetadata({
11309
12100
  [style.--i]="$index < 8 ? $index : 8"
11310
12101
  [class.dt-row-clickable]="isRowClickable(item)"
11311
12102
  [class.dt-row-selected]="_isSelectable() && _selectedIds().has(item['id'])"
12103
+ [class.dt-row-dragging]="_dragFrom() === $index"
12104
+ [class.dt-row-over-before]="_reorderOn() && _dragFrom() !== null && _dragOver() === $index && _dragFrom()! > $index"
12105
+ [class.dt-row-over-after]="_reorderOn() && _dragFrom() !== null && _dragOver() === $index && _dragFrom()! < $index"
12106
+ [attr.data-row-key]="_reorderOn() ? trackItem(item, $index) : null"
11312
12107
  [attr.tabindex]="isRowClickable(item) ? 0 : null"
11313
12108
  [attr.aria-label]="rowLabel(item)"
11314
12109
  (keydown)="onRowKeydown($event, item)"
12110
+ (dragover)="onRowDragOver($event, $index)"
12111
+ (drop)="onRowDrop($event, $index)"
11315
12112
  (click)="onRowClick(item)">
12113
+ @if (_reorderOn()) {
12114
+ <td class="dt-td-grip" (click)="$event.stopPropagation()">
12115
+ <span class="dt-grip" role="button" [attr.tabindex]="_reorderActive() ? 0 : null"
12116
+ [attr.draggable]="_reorderActive() ? 'true' : null"
12117
+ [attr.aria-label]="reorderLabel(item)"
12118
+ [attr.aria-disabled]="_reorderActive() ? null : 'true'"
12119
+ [attr.aria-roledescription]="'drag handle'"
12120
+ [attr.aria-describedby]="_reorderHelpId"
12121
+ [attr.title]="_reorderActive() ? 'Drag to reorder, or use the up and down arrow keys' : _reorderHint()"
12122
+ [class.dt-grip-off]="!_reorderActive()"
12123
+ (dragstart)="onGripDragStart($event, $index)"
12124
+ (dragend)="onGripDragEnd()"
12125
+ (keydown)="onGripKeydown($event, $index)">
12126
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true" focusable="false"><circle cx="9" cy="6" r="1.6"/><circle cx="15" cy="6" r="1.6"/><circle cx="9" cy="12" r="1.6"/><circle cx="15" cy="12" r="1.6"/><circle cx="9" cy="18" r="1.6"/><circle cx="15" cy="18" r="1.6"/></svg>
12127
+ </span>
12128
+ <!-- Touch screens (coarse primary pointer, e.g. a tablet) cannot rely on native drag: they get Move up / Move down instead of the grip. -->
12129
+ <span class="dt-row-move">
12130
+ <ui-button variant="icon" size="sm" [ariaLabel]="'Move ' + (rowAccessibleName(item) || 'row') + ' up'"
12131
+ [disabled]="!_reorderActive() || $first" (click)="moveByButton($index, -1)">
12132
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 15l6-6 6 6"/></svg>
12133
+ </ui-button>
12134
+ <ui-button variant="icon" size="sm" [ariaLabel]="'Move ' + (rowAccessibleName(item) || 'row') + ' down'"
12135
+ [disabled]="!_reorderActive() || $last" (click)="moveByButton($index, 1)">
12136
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
12137
+ </ui-button>
12138
+ </span>
12139
+ </td>
12140
+ }
11316
12141
  @if (_isSelectable()) {
11317
12142
  <td class="dt-td-cb" (click)="$event.stopPropagation()">
11318
12143
  <ui-checkbox
@@ -11518,6 +12343,7 @@ i0.ɵɵngDeclareClassMetadata({
11518
12343
  @for (item of _items(); track trackItem(item, $index)) {
11519
12344
  <div
11520
12345
  class="dt-card alive-row"
12346
+ [attr.data-row-key]="_reorderOn() ? trackItem(item, $index) : null"
11521
12347
  [style.--i]="$index < 8 ? $index : 8"
11522
12348
  role="listitem"
11523
12349
  [class.dt-card-clickable]="isRowClickable(item)"
@@ -11563,6 +12389,18 @@ i0.ɵɵngDeclareClassMetadata({
11563
12389
  </span>
11564
12390
  }
11565
12391
  }
12392
+ @if (_reorderOn()) {
12393
+ <span class="dt-card-move" (click)="$event.stopPropagation()">
12394
+ <ui-button variant="icon" size="sm" [ariaLabel]="'Move ' + (rowAccessibleName(item) || 'row') + ' up'"
12395
+ [disabled]="!_reorderActive() || $first" (click)="moveByButton($index, -1)">
12396
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 15l6-6 6 6"/></svg>
12397
+ </ui-button>
12398
+ <ui-button variant="icon" size="sm" [ariaLabel]="'Move ' + (rowAccessibleName(item) || 'row') + ' down'"
12399
+ [disabled]="!_reorderActive() || $last" (click)="moveByButton($index, 1)">
12400
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
12401
+ </ui-button>
12402
+ </span>
12403
+ }
11566
12404
  @if (_cardCols().actionsCol; as ac) {
11567
12405
  @let cardActions = _rowActions(ac, item);
11568
12406
  @if (cardActions.length) {
@@ -11626,6 +12464,13 @@ i0.ɵɵngDeclareClassMetadata({
11626
12464
  </div>
11627
12465
  }
11628
12466
 
12467
+ @if (_reorderOn()) {
12468
+ <span class="dt-sr-only" [id]="_reorderHelpId">{{ _reorderActive()
12469
+ ? 'Drag to reorder with a mouse, or use the up and down arrow keys; Home moves to the top and End to the bottom.'
12470
+ : _reorderHint() }}</span>
12471
+ <span class="dt-sr-only" role="status" aria-live="polite" aria-atomic="true">{{ _reorderAnnouncement() }}</span>
12472
+ }
12473
+
11629
12474
  <!-- ── PAGINATION ─────────────────────────────────────────── -->
11630
12475
  @if (_total() > pageSize()) {
11631
12476
  <ui-pagination
@@ -11683,7 +12528,7 @@ i0.ɵɵngDeclareClassMetadata({
11683
12528
  }
11684
12529
  </div>
11685
12530
  `,
11686
- 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"]
12531
+ 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-th-grip{width:36px;padding:0!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-grip{width:36px;padding:0!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-grip{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#64748b;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.dt-grip:hover{background:#f1f5f9;color:#334155}.dt-grip:active{cursor:grabbing}.dt-grip:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.dt-grip-off{color:#cbd5e1;cursor:not-allowed}.dt-grip-off:hover{background:none;color:#cbd5e1}.dt-row-move{display:none}@media(pointer:coarse){.dt-grip{display:none}.dt-row-move{display:inline-flex;flex-direction:column;align-items:center}.dt-th-grip,.dt-td-grip{width:56px}}.dt-row-dragging{opacity:.45}.dt-row-over-before>td{box-shadow:inset 0 2px #3b82f6}.dt-row-over-after>td{box-shadow:inset 0 -2px #3b82f6}.dt-card-move{display:inline-flex;align-items:center;gap:2px;flex-shrink:0}@media(forced-colors:active){.dt-row-over-before>td{box-shadow:inset 0 2px 0 Highlight}.dt-row-over-after>td{box-shadow:inset 0 -2px 0 Highlight}.dt-grip:focus-visible{outline-color:Highlight}}.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:820px){.dt-header-left{flex-basis:100%}.dt-header-right{flex-basis:100%;justify-content:flex-start}}@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"]
11687
12532
  }]
11688
12533
  }],
11689
12534
  ctorParameters: () => [],
@@ -11936,6 +12781,18 @@ i0.ɵɵngDeclareClassMetadata({
11936
12781
  type: i0.Output,
11937
12782
  args: ["rowDeleted"]
11938
12783
  }],
12784
+ reorderable: [{
12785
+ type: i0.Input,
12786
+ args: [{
12787
+ isSignal: true,
12788
+ alias: "reorderable",
12789
+ required: false
12790
+ }]
12791
+ }],
12792
+ rowReorder: [{
12793
+ type: i0.Output,
12794
+ args: ["rowReorder"]
12795
+ }],
11939
12796
  _ieRef: [{
11940
12797
  type: i0.ViewChild,
11941
12798
  args: ["ieRef", { isSignal: true }]
@@ -15963,6 +16820,9 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
15963
16820
  "ariaLabel",
15964
16821
  "placeholder",
15965
16822
  "prefix",
16823
+ "revealable",
16824
+ "passwordRequirements",
16825
+ "passwordRules",
15966
16826
  "type",
15967
16827
  "maxlength",
15968
16828
  "required",
@@ -16516,7 +17376,7 @@ var PillTabsComponent = class PillTabsComponent {
16516
17376
  </div>
16517
17377
  `,
16518
17378
  isInline: true,
16519
- styles: [".pill-wrap{position:relative}.pill-fade{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;opacity:0;transition:opacity .15s}.pill-fade.visible{opacity:1}.pill-fade--start{left:0;background:linear-gradient(to right,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-fade--end{right:0;background:linear-gradient(to left,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-tabs{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:768px){.pill-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;scrollbar-width:none}.pill-tabs::-webkit-scrollbar{display:none}}.pill-tab{position:relative;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;transition:all .15s;font-family:inherit}.pill-tab:hover:not(.disabled):not(.active){background:#f8fafc;border-color:#94a3b8}.pill-tab:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pill-tab .pill-count{background:#e2e8f0;color:#475569;font-size:.7rem;font-weight:600;padding:1px 6px;border-radius:999px;line-height:1.4}.pill-tab.active{background:#1e293b;color:#fff;border-color:#1e293b}.pill-tab.active .pill-count{background:#fff3;color:#fff}.pill-tab.active:hover{background:#1e293b;color:#fff}.pill-tab.disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.pill-tab .pill-info-icon{flex-shrink:0;opacity:.7}.pill-tab:hover .pill-info-icon,.pill-tab:focus-visible .pill-info-icon{opacity:1}.pill-tab .pill-info-tip{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;max-width:280px;padding:8px 12px;border-radius:8px;background:#1e293b;color:#fff;font-size:.75rem;font-weight:400;line-height:1.45;text-align:left;white-space:normal;box-shadow:0 4px 12px #0f172a40;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s,visibility .12s}.pill-tab:hover .pill-info-tip,.pill-tab:focus-visible .pill-info-tip{opacity:1;visibility:visible}@media(pointer:coarse),(max-width:480px){.pill-tab{min-height:44px}}\n"],
17379
+ styles: [".pill-wrap{position:relative}.pill-fade{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;opacity:0;transition:opacity .15s}.pill-fade.visible{opacity:1}.pill-fade--start{left:0;background:linear-gradient(to right,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-fade--end{right:0;background:linear-gradient(to left,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-tabs{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:768px){.pill-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;scrollbar-width:none}.pill-tabs::-webkit-scrollbar{display:none}}.pill-tab{position:relative;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;transition:all .15s;font-family:inherit}.pill-tab:hover:not(.disabled):not(.active){background:#f8fafc;border-color:#94a3b8}.pill-tab:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pill-tab .pill-count{background:#e2e8f0;color:#475569;font-size:.7rem;font-weight:600;padding:1px 6px;border-radius:999px;line-height:1.4}.pill-tab.active{background:#1e293b;color:#fff;border-color:#1e293b}.pill-tab.active .pill-count{background:#fff3;color:#fff}.pill-tab.active:hover{background:#1e293b;color:#fff}.pill-tab.disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.pill-tab .pill-info-icon{flex-shrink:0;opacity:.7}.pill-tab:hover .pill-info-icon,.pill-tab:focus-visible .pill-info-icon{opacity:1}.pill-tab .pill-info-tip{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;max-width:280px;padding:8px 12px;border-radius:8px;background:#1e293b;color:#fff;font-size:.75rem;font-weight:400;line-height:1.45;text-align:left;white-space:normal;box-shadow:0 4px 12px #0f172a40;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s,visibility .12s}.pill-tab:hover .pill-info-tip,.pill-tab:focus-visible .pill-info-tip{opacity:1;visibility:visible}.pill-tab:last-child .pill-info-tip{left:auto;right:0}@media(pointer:coarse),(max-width:480px){.pill-tab{min-height:44px}}\n"],
16520
17380
  changeDetection: i0.ChangeDetectionStrategy.OnPush
16521
17381
  });
16522
17382
  }
@@ -16562,7 +17422,7 @@ i0.ɵɵngDeclareClassMetadata({
16562
17422
  <span class="pill-fade pill-fade--end" [class.visible]="canScrollEnd()" aria-hidden="true" data-testid="pill-fade-end"></span>
16563
17423
  </div>
16564
17424
  `,
16565
- styles: [".pill-wrap{position:relative}.pill-fade{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;opacity:0;transition:opacity .15s}.pill-fade.visible{opacity:1}.pill-fade--start{left:0;background:linear-gradient(to right,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-fade--end{right:0;background:linear-gradient(to left,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-tabs{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:768px){.pill-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;scrollbar-width:none}.pill-tabs::-webkit-scrollbar{display:none}}.pill-tab{position:relative;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;transition:all .15s;font-family:inherit}.pill-tab:hover:not(.disabled):not(.active){background:#f8fafc;border-color:#94a3b8}.pill-tab:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pill-tab .pill-count{background:#e2e8f0;color:#475569;font-size:.7rem;font-weight:600;padding:1px 6px;border-radius:999px;line-height:1.4}.pill-tab.active{background:#1e293b;color:#fff;border-color:#1e293b}.pill-tab.active .pill-count{background:#fff3;color:#fff}.pill-tab.active:hover{background:#1e293b;color:#fff}.pill-tab.disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.pill-tab .pill-info-icon{flex-shrink:0;opacity:.7}.pill-tab:hover .pill-info-icon,.pill-tab:focus-visible .pill-info-icon{opacity:1}.pill-tab .pill-info-tip{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;max-width:280px;padding:8px 12px;border-radius:8px;background:#1e293b;color:#fff;font-size:.75rem;font-weight:400;line-height:1.45;text-align:left;white-space:normal;box-shadow:0 4px 12px #0f172a40;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s,visibility .12s}.pill-tab:hover .pill-info-tip,.pill-tab:focus-visible .pill-info-tip{opacity:1;visibility:visible}@media(pointer:coarse),(max-width:480px){.pill-tab{min-height:44px}}\n"]
17425
+ styles: [".pill-wrap{position:relative}.pill-fade{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;opacity:0;transition:opacity .15s}.pill-fade.visible{opacity:1}.pill-fade--start{left:0;background:linear-gradient(to right,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-fade--end{right:0;background:linear-gradient(to left,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-tabs{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:768px){.pill-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;scrollbar-width:none}.pill-tabs::-webkit-scrollbar{display:none}}.pill-tab{position:relative;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;transition:all .15s;font-family:inherit}.pill-tab:hover:not(.disabled):not(.active){background:#f8fafc;border-color:#94a3b8}.pill-tab:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pill-tab .pill-count{background:#e2e8f0;color:#475569;font-size:.7rem;font-weight:600;padding:1px 6px;border-radius:999px;line-height:1.4}.pill-tab.active{background:#1e293b;color:#fff;border-color:#1e293b}.pill-tab.active .pill-count{background:#fff3;color:#fff}.pill-tab.active:hover{background:#1e293b;color:#fff}.pill-tab.disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.pill-tab .pill-info-icon{flex-shrink:0;opacity:.7}.pill-tab:hover .pill-info-icon,.pill-tab:focus-visible .pill-info-icon{opacity:1}.pill-tab .pill-info-tip{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;max-width:280px;padding:8px 12px;border-radius:8px;background:#1e293b;color:#fff;font-size:.75rem;font-weight:400;line-height:1.45;text-align:left;white-space:normal;box-shadow:0 4px 12px #0f172a40;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s,visibility .12s}.pill-tab:hover .pill-info-tip,.pill-tab:focus-visible .pill-info-tip{opacity:1;visibility:visible}.pill-tab:last-child .pill-info-tip{left:auto;right:0}@media(pointer:coarse),(max-width:480px){.pill-tab{min-height:44px}}\n"]
16566
17426
  }]
16567
17427
  }],
16568
17428
  ctorParameters: () => [],
@@ -18103,6 +18963,9 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
18103
18963
  "ariaLabel",
18104
18964
  "placeholder",
18105
18965
  "prefix",
18966
+ "revealable",
18967
+ "passwordRequirements",
18968
+ "passwordRules",
18106
18969
  "type",
18107
18970
  "maxlength",
18108
18971
  "required",
@@ -26969,281 +27832,6 @@ i0.ɵɵngDeclareClassMetadata({
26969
27832
  }]
26970
27833
  }]
26971
27834
  });
26972
- const EXTRA_ICONS = {
26973
- "delete": "M3 6h18 M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2 M5 6l1 14a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2l1-14 M10 11v6 M14 11v6",
26974
- "add": "M12 5v14 M5 12h14",
26975
- "close": "M18 6L6 18 M6 6l12 12",
26976
- "check": "M20 6L9 17l-5-5",
26977
- "upload": "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4 M17 8l-5-5-5 5 M12 3v12",
26978
- "image": "M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z M8.5 8.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3z M21 15l-5-5L5 21",
26979
- "chevron-up": "M18 15l-6-6-6 6",
26980
- "chevron-down": "M6 9l6 6 6-6",
26981
- "arrow-left": "M19 12H5 M12 19l-7-7 7-7",
26982
- "bell": "M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9 M13.73 21a2 2 0 0 1-3.46 0",
26983
- "print": "M6 9V2h12v7 M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2 M6 14h12v8H6z",
26984
- "shield": "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",
26985
- "lock": "M5 11h14a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2z M7 11V7a5 5 0 0 1 10 0v4",
26986
- "arrow-up": "M12 19V5 M5 12l7-7 7 7",
26987
- "arrow-down": "M12 5v14 M19 12l-7 7-7-7",
26988
- "arrow-right": "M5 12h14 M12 5l7 7-7 7",
26989
- "document": "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6 M16 13H8 M16 17H8 M10 9H8",
26990
- "grip": "M9 5h.01 M15 5h.01 M9 12h.01 M15 12h.01 M9 19h.01 M15 19h.01",
26991
- "card": "M3 4h18a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z M1 10h22",
26992
- "bank": "M3 21h18 M3 10h18 M5 6l7-3 7 3 M4 10v11 M20 10v11 M8 14v3 M12 14v3 M16 14v3"
26993
- };
26994
- function iconPath(name) {
26995
- return Object.prototype.hasOwnProperty.call(EXTRA_ICONS, name) ? EXTRA_ICONS[name] : builtInActionIcon(name);
26996
- }
26997
- var IconComponent = class IconComponent {
26998
- constructor() {
26999
- this.name = input.required(...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
27000
- this.tooltip = input("", ...ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []);
27001
- this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
27002
- this.size = input(16, ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
27003
- this.variant = input("default", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
27004
- this.disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
27005
- this.loading = input(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
27006
- this.interactive = input(true, ...ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []);
27007
- this.iconClick = output();
27008
- this.accessibleName = computed(() => this.ariaLabel() || this.tooltip(), ...ngDevMode ? [{ debugName: "accessibleName" }] : /* istanbul ignore next */ []);
27009
- this.path = computed(() => iconPath(this.name()), ...ngDevMode ? [{ debugName: "path" }] : /* istanbul ignore next */ []);
27010
- }
27011
- onClick(event) {
27012
- event.stopPropagation();
27013
- this.iconClick.emit(event);
27014
- }
27015
- static {
27016
- this.ɵfac = i0.ɵɵngDeclareFactory({
27017
- minVersion: "12.0.0",
27018
- version: "22.2.2",
27019
- ngImport: i0,
27020
- type: IconComponent,
27021
- deps: [],
27022
- target: i0.ɵɵFactoryTarget.Component
27023
- });
27024
- }
27025
- static {
27026
- this.ɵcmp = i0.ɵɵngDeclareComponent({
27027
- minVersion: "17.0.0",
27028
- version: "22.2.2",
27029
- type: IconComponent,
27030
- isStandalone: true,
27031
- selector: "ui-icon",
27032
- inputs: {
27033
- name: {
27034
- classPropertyName: "name",
27035
- publicName: "name",
27036
- isSignal: true,
27037
- isRequired: true,
27038
- transformFunction: null
27039
- },
27040
- tooltip: {
27041
- classPropertyName: "tooltip",
27042
- publicName: "tooltip",
27043
- isSignal: true,
27044
- isRequired: false,
27045
- transformFunction: null
27046
- },
27047
- ariaLabel: {
27048
- classPropertyName: "ariaLabel",
27049
- publicName: "ariaLabel",
27050
- isSignal: true,
27051
- isRequired: false,
27052
- transformFunction: null
27053
- },
27054
- size: {
27055
- classPropertyName: "size",
27056
- publicName: "size",
27057
- isSignal: true,
27058
- isRequired: false,
27059
- transformFunction: null
27060
- },
27061
- variant: {
27062
- classPropertyName: "variant",
27063
- publicName: "variant",
27064
- isSignal: true,
27065
- isRequired: false,
27066
- transformFunction: null
27067
- },
27068
- disabled: {
27069
- classPropertyName: "disabled",
27070
- publicName: "disabled",
27071
- isSignal: true,
27072
- isRequired: false,
27073
- transformFunction: null
27074
- },
27075
- loading: {
27076
- classPropertyName: "loading",
27077
- publicName: "loading",
27078
- isSignal: true,
27079
- isRequired: false,
27080
- transformFunction: null
27081
- },
27082
- interactive: {
27083
- classPropertyName: "interactive",
27084
- publicName: "interactive",
27085
- isSignal: true,
27086
- isRequired: false,
27087
- transformFunction: null
27088
- }
27089
- },
27090
- outputs: { iconClick: "iconClick" },
27091
- ngImport: i0,
27092
- template: `
27093
- @if (interactive()) {
27094
- <button type="button" class="icon-btn" [class.danger]="variant() === 'danger'"
27095
- [class.loading]="loading()" [disabled]="disabled() || loading()" [attr.aria-busy]="loading() ? 'true' : null"
27096
- [attr.aria-label]="accessibleName() || null" [uiTooltip]="tooltip()" (click)="onClick($event)">
27097
- <ng-container *ngTemplateOutlet="glyph" />
27098
- </button>
27099
- } @else {
27100
- <span class="icon-static" [class.danger]="variant() === 'danger'" [attr.aria-busy]="loading() ? 'true' : null"
27101
- [attr.role]="accessibleName() ? 'img' : null" [attr.aria-label]="accessibleName() || null" [uiTooltip]="tooltip()" [attr.aria-hidden]="accessibleName() ? null : 'true'">
27102
- <ng-container *ngTemplateOutlet="glyph" />
27103
- </span>
27104
- }
27105
- <ng-template #glyph>
27106
- @if (loading()) {
27107
- <span class="spinner" [style.width.px]="size()" [style.height.px]="size()" aria-hidden="true"></span>
27108
- } @else if (path(); as d) {
27109
- <svg viewBox="0 0 24 24" [attr.width]="size()" [attr.height]="size()" fill="none" stroke="currentColor"
27110
- stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
27111
- <path [attr.d]="d" />
27112
- </svg>
27113
- }
27114
- </ng-template>
27115
- `,
27116
- isInline: true,
27117
- styles: [":host{display:inline-flex}.icon-static{display:inline-flex;align-items:center;justify-content:center;color:inherit}.icon-static.danger{color:#b91c1c}.icon-static svg{display:block}.icon-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:6px;background:transparent;color:#475569;cursor:pointer;-webkit-appearance:none;appearance:none;font:inherit;transition:background .15s ease,color .15s ease}.icon-btn:hover:not(:disabled){background:#f1f5f9;color:#0f172a}.icon-btn.danger{color:#b91c1c}.icon-btn.danger:hover:not(:disabled){background:#fef2f2;color:#991b1b}.icon-btn:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.icon-btn:disabled{opacity:.5;cursor:not-allowed}.icon-btn.loading:disabled{opacity:1;cursor:progress}.spinner{display:block;box-sizing:border-box;border:2px solid rgba(100,116,139,.3);border-top-color:currentColor;border-radius:50%;animation:ui-icon-spin .6s linear infinite}@keyframes ui-icon-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.spinner{animation-duration:2s}}.icon-btn:after{content:\"\";position:absolute;inset:-8px}\n"],
27118
- dependencies: [{
27119
- kind: "directive",
27120
- type: NgTemplateOutlet,
27121
- selector: "[ngTemplateOutlet]",
27122
- inputs: [
27123
- "ngTemplateOutletContext",
27124
- "ngTemplateOutlet",
27125
- "ngTemplateOutletInjector"
27126
- ]
27127
- }, {
27128
- kind: "directive",
27129
- type: TooltipDirective,
27130
- selector: "[uiTooltip]",
27131
- inputs: ["uiTooltip", "tooltipPosition"]
27132
- }],
27133
- changeDetection: i0.ChangeDetectionStrategy.OnPush
27134
- });
27135
- }
27136
- };
27137
- i0.ɵɵngDeclareClassMetadata({
27138
- minVersion: "12.0.0",
27139
- version: "22.2.2",
27140
- ngImport: i0,
27141
- type: IconComponent,
27142
- decorators: [{
27143
- type: Component,
27144
- args: [{
27145
- selector: "ui-icon",
27146
- standalone: true,
27147
- imports: [NgTemplateOutlet, TooltipDirective],
27148
- changeDetection: ChangeDetectionStrategy.OnPush,
27149
- template: `
27150
- @if (interactive()) {
27151
- <button type="button" class="icon-btn" [class.danger]="variant() === 'danger'"
27152
- [class.loading]="loading()" [disabled]="disabled() || loading()" [attr.aria-busy]="loading() ? 'true' : null"
27153
- [attr.aria-label]="accessibleName() || null" [uiTooltip]="tooltip()" (click)="onClick($event)">
27154
- <ng-container *ngTemplateOutlet="glyph" />
27155
- </button>
27156
- } @else {
27157
- <span class="icon-static" [class.danger]="variant() === 'danger'" [attr.aria-busy]="loading() ? 'true' : null"
27158
- [attr.role]="accessibleName() ? 'img' : null" [attr.aria-label]="accessibleName() || null" [uiTooltip]="tooltip()" [attr.aria-hidden]="accessibleName() ? null : 'true'">
27159
- <ng-container *ngTemplateOutlet="glyph" />
27160
- </span>
27161
- }
27162
- <ng-template #glyph>
27163
- @if (loading()) {
27164
- <span class="spinner" [style.width.px]="size()" [style.height.px]="size()" aria-hidden="true"></span>
27165
- } @else if (path(); as d) {
27166
- <svg viewBox="0 0 24 24" [attr.width]="size()" [attr.height]="size()" fill="none" stroke="currentColor"
27167
- stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
27168
- <path [attr.d]="d" />
27169
- </svg>
27170
- }
27171
- </ng-template>
27172
- `,
27173
- styles: [":host{display:inline-flex}.icon-static{display:inline-flex;align-items:center;justify-content:center;color:inherit}.icon-static.danger{color:#b91c1c}.icon-static svg{display:block}.icon-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:6px;background:transparent;color:#475569;cursor:pointer;-webkit-appearance:none;appearance:none;font:inherit;transition:background .15s ease,color .15s ease}.icon-btn:hover:not(:disabled){background:#f1f5f9;color:#0f172a}.icon-btn.danger{color:#b91c1c}.icon-btn.danger:hover:not(:disabled){background:#fef2f2;color:#991b1b}.icon-btn:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.icon-btn:disabled{opacity:.5;cursor:not-allowed}.icon-btn.loading:disabled{opacity:1;cursor:progress}.spinner{display:block;box-sizing:border-box;border:2px solid rgba(100,116,139,.3);border-top-color:currentColor;border-radius:50%;animation:ui-icon-spin .6s linear infinite}@keyframes ui-icon-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.spinner{animation-duration:2s}}.icon-btn:after{content:\"\";position:absolute;inset:-8px}\n"]
27174
- }]
27175
- }],
27176
- propDecorators: {
27177
- name: [{
27178
- type: i0.Input,
27179
- args: [{
27180
- isSignal: true,
27181
- alias: "name",
27182
- required: true
27183
- }]
27184
- }],
27185
- tooltip: [{
27186
- type: i0.Input,
27187
- args: [{
27188
- isSignal: true,
27189
- alias: "tooltip",
27190
- required: false
27191
- }]
27192
- }],
27193
- ariaLabel: [{
27194
- type: i0.Input,
27195
- args: [{
27196
- isSignal: true,
27197
- alias: "ariaLabel",
27198
- required: false
27199
- }]
27200
- }],
27201
- size: [{
27202
- type: i0.Input,
27203
- args: [{
27204
- isSignal: true,
27205
- alias: "size",
27206
- required: false
27207
- }]
27208
- }],
27209
- variant: [{
27210
- type: i0.Input,
27211
- args: [{
27212
- isSignal: true,
27213
- alias: "variant",
27214
- required: false
27215
- }]
27216
- }],
27217
- disabled: [{
27218
- type: i0.Input,
27219
- args: [{
27220
- isSignal: true,
27221
- alias: "disabled",
27222
- required: false
27223
- }]
27224
- }],
27225
- loading: [{
27226
- type: i0.Input,
27227
- args: [{
27228
- isSignal: true,
27229
- alias: "loading",
27230
- required: false
27231
- }]
27232
- }],
27233
- interactive: [{
27234
- type: i0.Input,
27235
- args: [{
27236
- isSignal: true,
27237
- alias: "interactive",
27238
- required: false
27239
- }]
27240
- }],
27241
- iconClick: [{
27242
- type: i0.Output,
27243
- args: ["iconClick"]
27244
- }]
27245
- }
27246
- });
27247
27835
  var TimelineComponent = class TimelineComponent {
27248
27836
  constructor() {
27249
27837
  this.items = input([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
@@ -36511,6 +37099,6 @@ i0.ɵɵngDeclareClassMetadata({
36511
37099
  }]
36512
37100
  }
36513
37101
  });
36514
- export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CalendarComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IconComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, LiveRegionComponent, ModalComponent, MoreMenuComponent, MultiSelectComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SearchInputComponent, SectionHeaderComponent, SelectComponent, ShowComponent, SidePanelComponent, SignaturePadComponent, SkeletonComponent, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, buildDefaultSchedule, builtInActionIcon, businessTimeOptions, createFieldReveal, decodeFilterValues, digitsOnly, downloadBlob, encodeFilterValue, encodeFilterValues, errorContextInterceptor, fileMatchesAccept, formatAddress, formatCurrency, formatFileSize, formatIsoDate, formatIsoDateTime, formatTime, getEligibleIds, getEligibleOptions, getErrorMessage, humanReadableMessage, iconPath, isoKey, issueToErrors, maxLengthIssue, normalizeHexColor, parseBizHours, parseIso, parseTime, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours };
37102
+ export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CalendarComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DEFAULT_PASSWORD_RULES, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IconComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, LiveRegionComponent, ModalComponent, MoreMenuComponent, MultiSelectComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PasswordRequirementsComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SearchInputComponent, SectionHeaderComponent, SelectComponent, ShowComponent, SidePanelComponent, SignaturePadComponent, SkeletonComponent, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, buildDefaultSchedule, builtInActionIcon, businessTimeOptions, createFieldReveal, decodeFilterValues, digitsOnly, downloadBlob, encodeFilterValue, encodeFilterValues, errorContextInterceptor, fileMatchesAccept, formatAddress, formatCurrency, formatFileSize, formatIsoDate, formatIsoDateTime, formatTime, getEligibleIds, getEligibleOptions, getErrorMessage, humanReadableMessage, iconPath, isoKey, issueToErrors, maxLengthIssue, normalizeHexColor, parseBizHours, parseIso, parseTime, passwordMeetsRules, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours };
36515
37103
 
36516
37104
  //# sourceMappingURL=forgeroute-ui.mjs.map