@forgeroute/ui 0.4.54 → 0.4.56
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.
- package/fesm2022/forgeroute-ui.mjs +475 -33
- package/fesm2022/forgeroute-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/forgeroute-ui.d.ts +123 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
|
-
import { ApplicationRef, ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostBinding, HostListener, Injectable, InjectionToken, Injector, Input, NgZone, PLATFORM_ID, Renderer2, TemplateRef, ViewEncapsulation, afterEveryRender, afterNextRender, computed, contentChild, contentChildren, createComponent, effect, forwardRef, inject, input, isDevMode, linkedSignal, makeEnvironmentProviders, model, output, provideEnvironmentInitializer, signal, untracked, viewChild, viewChildren } from "@angular/core";
|
|
2
|
+
import { ApplicationRef, ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostBinding, HostListener, Injectable, InjectionToken, Injector, Input, NgZone, PLATFORM_ID, Renderer2, TemplateRef, ViewEncapsulation, afterEveryRender, afterNextRender, computed, contentChild, contentChildren, createComponent, effect, forwardRef, inject, input, isDevMode, linkedSignal, makeEnvironmentProviders, model, numberAttribute, output, provideEnvironmentInitializer, signal, untracked, viewChild, viewChildren } from "@angular/core";
|
|
3
3
|
import { HttpClient, HttpErrorResponse, HttpParams } from "@angular/common/http";
|
|
4
4
|
import { takeUntilDestroyed, toObservable } from "@angular/core/rxjs-interop";
|
|
5
5
|
import { catchError, debounceTime, distinctUntilChanged, skip, switchMap } from "rxjs/operators";
|
|
@@ -11982,7 +11982,7 @@ var DataTableComponent = class DataTableComponent {
|
|
|
11982
11982
|
label: "Default"
|
|
11983
11983
|
}];
|
|
11984
11984
|
for (const col of this.visibleCols()) {
|
|
11985
|
-
if (!this._isSortable(col)) continue;
|
|
11985
|
+
if (!this._isSortable(col) || this._emptyColumnKeys().has(col.key)) continue;
|
|
11986
11986
|
opts.push({
|
|
11987
11987
|
value: `${col.key}:asc`,
|
|
11988
11988
|
label: `${col.label} ↑`
|
|
@@ -11999,6 +11999,31 @@ var DataTableComponent = class DataTableComponent {
|
|
|
11999
11999
|
cf: this.getColFilter(col)
|
|
12000
12000
|
})).filter((f) => f.cf !== null), ...ngDevMode ? [{ debugName: "_phoneFilterCols" }] : /* istanbul ignore next */ []);
|
|
12001
12001
|
this._showColumnControls = computed(() => !this._error() && (this._items().length > 0 || !!this._sortField() || Object.values(this._colFilterValues()).some((v) => v.length > 0)), ...ngDevMode ? [{ debugName: "_showColumnControls" }] : /* istanbul ignore next */ []);
|
|
12002
|
+
this._emptyColumnKeys = computed(() => {
|
|
12003
|
+
const items = this._items();
|
|
12004
|
+
const out = /* @__PURE__ */ new Set();
|
|
12005
|
+
if (items.length === 0) return out;
|
|
12006
|
+
for (const col of this.visibleCols()) {
|
|
12007
|
+
if (!this._isSortable(col) || this._sortField() === col.key) continue;
|
|
12008
|
+
let hasValue = false;
|
|
12009
|
+
for (const item of items) {
|
|
12010
|
+
let text;
|
|
12011
|
+
try {
|
|
12012
|
+
text = this.cardCellText(col, item);
|
|
12013
|
+
} catch {
|
|
12014
|
+
hasValue = true;
|
|
12015
|
+
break;
|
|
12016
|
+
}
|
|
12017
|
+
const t = text === null || text === void 0 ? "" : String(text).trim();
|
|
12018
|
+
if (t !== "" && t !== "—") {
|
|
12019
|
+
hasValue = true;
|
|
12020
|
+
break;
|
|
12021
|
+
}
|
|
12022
|
+
}
|
|
12023
|
+
if (!hasValue) out.add(col.key);
|
|
12024
|
+
}
|
|
12025
|
+
return out;
|
|
12026
|
+
}, ...ngDevMode ? [{ debugName: "_emptyColumnKeys" }] : /* istanbul ignore next */ []);
|
|
12002
12027
|
this._hasPhoneControls = computed(() => this._phoneSortOptions().length > 1 || this._phoneFilterCols().length > 0, ...ngDevMode ? [{ debugName: "_hasPhoneControls" }] : /* istanbul ignore next */ []);
|
|
12003
12028
|
this._injector = inject(Injector);
|
|
12004
12029
|
this._silentNext = false;
|
|
@@ -12120,6 +12145,9 @@ var DataTableComponent = class DataTableComponent {
|
|
|
12120
12145
|
this.load();
|
|
12121
12146
|
this._fetchCounts();
|
|
12122
12147
|
}
|
|
12148
|
+
_canShowSort(col) {
|
|
12149
|
+
return this._isSortable(col) && this._showColumnControls() && !this._emptyColumnKeys().has(col.key);
|
|
12150
|
+
}
|
|
12123
12151
|
onPhoneSort(value) {
|
|
12124
12152
|
if (!value) {
|
|
12125
12153
|
this._sortField.set(null);
|
|
@@ -13017,11 +13045,11 @@ var DataTableComponent = class DataTableComponent {
|
|
|
13017
13045
|
[style.width]="col.width ?? null"
|
|
13018
13046
|
[style.min-width]="col.width ?? null"
|
|
13019
13047
|
[style.max-width]="col.width ?? null"
|
|
13020
|
-
[attr.aria-sort]="
|
|
13048
|
+
[attr.aria-sort]="_canShowSort(col) ? sortAriaLabel(col.key) : null"
|
|
13021
13049
|
[class.dt-th-sorted]="_sortField() === col.key"
|
|
13022
13050
|
[class.dt-th-actions]="col.cellType === 'actions'">
|
|
13023
13051
|
<div class="dt-th-inner">
|
|
13024
|
-
@if (
|
|
13052
|
+
@if (_canShowSort(col)) {
|
|
13025
13053
|
<button
|
|
13026
13054
|
class="dt-sort-btn"
|
|
13027
13055
|
(click)="onSort(col.key)"
|
|
@@ -14085,11 +14113,11 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
14085
14113
|
[style.width]="col.width ?? null"
|
|
14086
14114
|
[style.min-width]="col.width ?? null"
|
|
14087
14115
|
[style.max-width]="col.width ?? null"
|
|
14088
|
-
[attr.aria-sort]="
|
|
14116
|
+
[attr.aria-sort]="_canShowSort(col) ? sortAriaLabel(col.key) : null"
|
|
14089
14117
|
[class.dt-th-sorted]="_sortField() === col.key"
|
|
14090
14118
|
[class.dt-th-actions]="col.cellType === 'actions'">
|
|
14091
14119
|
<div class="dt-th-inner">
|
|
14092
|
-
@if (
|
|
14120
|
+
@if (_canShowSort(col)) {
|
|
14093
14121
|
<button
|
|
14094
14122
|
class="dt-sort-btn"
|
|
14095
14123
|
(click)="onSort(col.key)"
|
|
@@ -27282,6 +27310,7 @@ const ICON_PATHS = {
|
|
|
27282
27310
|
};
|
|
27283
27311
|
const CALENDAR_PATH = "M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z M16 2v4 M8 2v4 M3 10h18";
|
|
27284
27312
|
const EDIT_PATH = "M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7 M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z";
|
|
27313
|
+
const TRASH_PATH = "M3 6h18 M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2 M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6 M10 11v6 M14 11v6";
|
|
27285
27314
|
const INDICATOR_LABEL = {
|
|
27286
27315
|
high: "High priority",
|
|
27287
27316
|
medium: "Medium priority",
|
|
@@ -27303,10 +27332,19 @@ var CardListItemComponent = class CardListItemComponent {
|
|
|
27303
27332
|
this.viewButton = input(false, ...ngDevMode ? [{ debugName: "viewButton" }] : /* istanbul ignore next */ []);
|
|
27304
27333
|
this.editAriaLabel = input("", ...ngDevMode ? [{ debugName: "editAriaLabel" }] : /* istanbul ignore next */ []);
|
|
27305
27334
|
this.viewAriaLabel = input("", ...ngDevMode ? [{ debugName: "viewAriaLabel" }] : /* istanbul ignore next */ []);
|
|
27335
|
+
this.deletable = input(false, ...ngDevMode ? [{ debugName: "deletable" }] : /* istanbul ignore next */ []);
|
|
27336
|
+
this.deleteLabel = input("Delete", ...ngDevMode ? [{ debugName: "deleteLabel" }] : /* istanbul ignore next */ []);
|
|
27337
|
+
this.deleteTestId = input("", ...ngDevMode ? [{ debugName: "deleteTestId" }] : /* istanbul ignore next */ []);
|
|
27338
|
+
this.actionLabel = input("", ...ngDevMode ? [{ debugName: "actionLabel" }] : /* istanbul ignore next */ []);
|
|
27339
|
+
this.actionTestId = input("", ...ngDevMode ? [{ debugName: "actionTestId" }] : /* istanbul ignore next */ []);
|
|
27340
|
+
this.actionAriaLabel = input("", ...ngDevMode ? [{ debugName: "actionAriaLabel" }] : /* istanbul ignore next */ []);
|
|
27306
27341
|
this.editClick = output();
|
|
27307
27342
|
this.viewClick = output();
|
|
27343
|
+
this.delete = output();
|
|
27344
|
+
this.action = output();
|
|
27308
27345
|
this.calendarPath = CALENDAR_PATH;
|
|
27309
27346
|
this.editPath = EDIT_PATH;
|
|
27347
|
+
this.trashPath = TRASH_PATH;
|
|
27310
27348
|
this.iconPath = computed(() => {
|
|
27311
27349
|
const i = this.icon();
|
|
27312
27350
|
return i ? ICON_PATHS[i] ?? null : null;
|
|
@@ -27421,11 +27459,55 @@ var CardListItemComponent = class CardListItemComponent {
|
|
|
27421
27459
|
isSignal: true,
|
|
27422
27460
|
isRequired: false,
|
|
27423
27461
|
transformFunction: null
|
|
27462
|
+
},
|
|
27463
|
+
deletable: {
|
|
27464
|
+
classPropertyName: "deletable",
|
|
27465
|
+
publicName: "deletable",
|
|
27466
|
+
isSignal: true,
|
|
27467
|
+
isRequired: false,
|
|
27468
|
+
transformFunction: null
|
|
27469
|
+
},
|
|
27470
|
+
deleteLabel: {
|
|
27471
|
+
classPropertyName: "deleteLabel",
|
|
27472
|
+
publicName: "deleteLabel",
|
|
27473
|
+
isSignal: true,
|
|
27474
|
+
isRequired: false,
|
|
27475
|
+
transformFunction: null
|
|
27476
|
+
},
|
|
27477
|
+
deleteTestId: {
|
|
27478
|
+
classPropertyName: "deleteTestId",
|
|
27479
|
+
publicName: "deleteTestId",
|
|
27480
|
+
isSignal: true,
|
|
27481
|
+
isRequired: false,
|
|
27482
|
+
transformFunction: null
|
|
27483
|
+
},
|
|
27484
|
+
actionLabel: {
|
|
27485
|
+
classPropertyName: "actionLabel",
|
|
27486
|
+
publicName: "actionLabel",
|
|
27487
|
+
isSignal: true,
|
|
27488
|
+
isRequired: false,
|
|
27489
|
+
transformFunction: null
|
|
27490
|
+
},
|
|
27491
|
+
actionTestId: {
|
|
27492
|
+
classPropertyName: "actionTestId",
|
|
27493
|
+
publicName: "actionTestId",
|
|
27494
|
+
isSignal: true,
|
|
27495
|
+
isRequired: false,
|
|
27496
|
+
transformFunction: null
|
|
27497
|
+
},
|
|
27498
|
+
actionAriaLabel: {
|
|
27499
|
+
classPropertyName: "actionAriaLabel",
|
|
27500
|
+
publicName: "actionAriaLabel",
|
|
27501
|
+
isSignal: true,
|
|
27502
|
+
isRequired: false,
|
|
27503
|
+
transformFunction: null
|
|
27424
27504
|
}
|
|
27425
27505
|
},
|
|
27426
27506
|
outputs: {
|
|
27427
27507
|
editClick: "editClick",
|
|
27428
|
-
viewClick: "viewClick"
|
|
27508
|
+
viewClick: "viewClick",
|
|
27509
|
+
delete: "delete",
|
|
27510
|
+
action: "action"
|
|
27429
27511
|
},
|
|
27430
27512
|
ngImport: i0,
|
|
27431
27513
|
template: `
|
|
@@ -27473,6 +27555,14 @@ var CardListItemComponent = class CardListItemComponent {
|
|
|
27473
27555
|
@if (viewButton()) {
|
|
27474
27556
|
<button class="cli-chip cli-chip--view" type="button" [attr.aria-label]="viewAriaLabel() || null" (click)="viewClick.emit()">View</button>
|
|
27475
27557
|
}
|
|
27558
|
+
@if (actionLabel()) {
|
|
27559
|
+
<button class="cli-chip cli-chip--action" type="button" [attr.data-testid]="actionTestId() || null" [attr.aria-label]="actionAriaLabel() || null" (click)="action.emit()">{{ actionLabel() }}</button>
|
|
27560
|
+
}
|
|
27561
|
+
@if (deletable()) {
|
|
27562
|
+
<button class="cli-chip cli-chip--delete" type="button" [attr.data-testid]="deleteTestId() || null" [attr.aria-label]="deleteLabel() || 'Delete'" (click)="delete.emit()">
|
|
27563
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path [attr.d]="trashPath" /></svg>
|
|
27564
|
+
</button>
|
|
27565
|
+
}
|
|
27476
27566
|
<ng-content select="[card-list-action]" />
|
|
27477
27567
|
<ng-content />
|
|
27478
27568
|
</div>
|
|
@@ -27480,7 +27570,7 @@ var CardListItemComponent = class CardListItemComponent {
|
|
|
27480
27570
|
<ng-content select="[card-detail]" />
|
|
27481
27571
|
`,
|
|
27482
27572
|
isInline: true,
|
|
27483
|
-
styles: ["ui-card-list-item{position:relative;display:block;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;margin-bottom:8px}ui-card-list-item:last-child{margin-bottom:0}ui-card-list-item .cli-row{display:flex;align-items:flex-start;gap:12px;padding:13px 18px;transition:background .12s}ui-card-list-item .cli-row:hover{background:#f8fafc}@media(prefers-reduced-motion:reduce){ui-card-list-item .cli-row{transition:none}}ui-card-list-item .cli-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}ui-card-list-item .cli-dot:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-dot--high{background:#ef4444}ui-card-list-item .cli-dot--medium{background:#f59e0b}ui-card-list-item .cli-dot--low{background:#94a3b8}ui-card-list-item .cli-dot--blue{background:#3b82f6}ui-card-list-item .cli-dot--green{background:#22c55e}ui-card-list-item .cli-icon-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}ui-card-list-item .cli-icon-circle--call{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--email{background:#dcfce7;color:#16a34a}ui-card-list-item .cli-icon-circle--sms{background:#fef9c3;color:#ca8a04}ui-card-list-item .cli-icon-circle--task{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--doc{background:#ffedd5;color:#ea580c}ui-card-list-item .cli-icon-circle--money{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--deal{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--survey{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--property{background:#fef3c7;color:#d97706}ui-card-list-item .cli-icon-circle--search{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--heart{background:#fce7f3;color:#db2777}ui-card-list-item .cli-icon-circle--calc{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--repeat{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;overflow-wrap:anywhere;word-break:break-word}ui-card-list-item .cli-badges{position:absolute;top:10px;right:12px;display:flex;align-items:center;gap:6px;z-index:1}ui-card-list-item .cli-row--badges .cli-body{padding-right:96px}ui-card-list-item .cli-row--badges-2 .cli-body{padding-right:190px}ui-card-list-item .cli-row--badges .cli-chip{align-self:flex-end}ui-card-list-item .cli-title-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap}ui-card-list-item .cli-title{font-size:.875rem;font-weight:600;color:#1e293b}ui-card-list-item .cli-desc-row{display:flex;align-items:center;gap:8px}ui-card-list-item .cli-desc-row:empty{display:none}ui-card-list-item .cli-description{font-size:.8125rem;color:#64748b;min-width:0}ui-card-list-item .cli-date{display:flex;align-items:center;gap:4px;font-size:.75rem;color:#64748b}ui-card-list-item .cli-chip{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;align-self:center;box-sizing:border-box;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;background:none;cursor:pointer;padding:4px 10px;border-radius:6px;text-decoration:none;transition:background .15s,color .15s,border-color .15s}ui-card-list-item .cli-chip--edit{color:#64748b;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--edit:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--view{color:#2563eb;border:1px solid #dbeafe}ui-card-list-item .cli-chip--view:hover{background:#eff6ff;border-color:#bfdbfe;color:#1d4ed8}ui-card-list-item .cli-chip:focus-visible,ui-card-list-item .cli-inline-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-inline-link{flex-shrink:0;margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:.8rem;font-weight:500;color:#2563eb;text-decoration:none;transition:color .15s}ui-card-list-item .cli-inline-link:hover{color:#1d4ed8}@media(pointer:coarse),(max-width:480px){ui-card-list-item .cli-chip{min-height:44px;padding:4px 14px}}ui-card-list-item [card-stats]{display:flex;align-items:stretch;background:#f8fafc;border-top:1px solid #f1f5f9}ui-card-list-item [card-detail]{background:#f8fafc;border-top:1px solid #e2e8f0}ui-card-list-item .cli-stat{flex:1;display:flex;flex-direction:column;gap:2px;padding:10px 14px}ui-card-list-item .cli-stat-label{font-size:.6875rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:#64748b}ui-card-list-item .cli-stat-value{font-size:.9375rem;font-weight:600;color:#0f172a}ui-card-list-item .cli-stat-divider{width:1px;background:#e2e8f0;margin:8px 0}\n"],
|
|
27573
|
+
styles: ["ui-card-list-item{position:relative;display:block;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;margin-bottom:8px}ui-card-list-item:last-child{margin-bottom:0}ui-card-list-item .cli-row{display:flex;align-items:flex-start;gap:12px;padding:13px 18px;transition:background .12s}ui-card-list-item .cli-row:hover{background:#f8fafc}@media(prefers-reduced-motion:reduce){ui-card-list-item .cli-row{transition:none}}ui-card-list-item .cli-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}ui-card-list-item .cli-dot:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-dot--high{background:#ef4444}ui-card-list-item .cli-dot--medium{background:#f59e0b}ui-card-list-item .cli-dot--low{background:#94a3b8}ui-card-list-item .cli-dot--blue{background:#3b82f6}ui-card-list-item .cli-dot--green{background:#22c55e}ui-card-list-item .cli-icon-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}ui-card-list-item .cli-icon-circle--call{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--email{background:#dcfce7;color:#16a34a}ui-card-list-item .cli-icon-circle--sms{background:#fef9c3;color:#ca8a04}ui-card-list-item .cli-icon-circle--task{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--doc{background:#ffedd5;color:#ea580c}ui-card-list-item .cli-icon-circle--money{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--deal{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--survey{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--property{background:#fef3c7;color:#d97706}ui-card-list-item .cli-icon-circle--search{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--heart{background:#fce7f3;color:#db2777}ui-card-list-item .cli-icon-circle--calc{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--repeat{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;overflow-wrap:anywhere;word-break:break-word}ui-card-list-item .cli-badges{position:absolute;top:10px;right:12px;display:flex;align-items:center;gap:6px;z-index:1}ui-card-list-item .cli-row--badges .cli-body{padding-right:96px}ui-card-list-item .cli-row--badges-2 .cli-body{padding-right:190px}ui-card-list-item .cli-row--badges .cli-chip{align-self:flex-end}ui-card-list-item .cli-title-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap}ui-card-list-item .cli-title{font-size:.875rem;font-weight:600;color:#1e293b}ui-card-list-item .cli-desc-row{display:flex;align-items:center;gap:8px}ui-card-list-item .cli-desc-row:empty{display:none}ui-card-list-item .cli-description{font-size:.8125rem;color:#64748b;min-width:0}ui-card-list-item .cli-date{display:flex;align-items:center;gap:4px;font-size:.75rem;color:#64748b}ui-card-list-item .cli-chip{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;align-self:center;box-sizing:border-box;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;background:none;cursor:pointer;padding:4px 10px;border-radius:6px;text-decoration:none;transition:background .15s,color .15s,border-color .15s}ui-card-list-item .cli-chip--edit{color:#64748b;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--edit:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--view{color:#2563eb;border:1px solid #dbeafe}ui-card-list-item .cli-chip--view:hover{background:#eff6ff;border-color:#bfdbfe;color:#1d4ed8}ui-card-list-item .cli-chip--action{color:#475569;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--action:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--delete{position:relative;justify-content:center;width:28px;height:28px;padding:0;color:#b91c1c;border:1px solid #fecaca}ui-card-list-item .cli-chip--delete:hover{background:#fef2f2;border-color:#fca5a5;color:#991b1b}ui-card-list-item .cli-chip--delete:after{content:\"\";position:absolute;top:50%;left:50%;width:44px;height:44px;transform:translate(-50%,-50%)}ui-card-list-item .cli-chip:focus-visible,ui-card-list-item .cli-inline-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-inline-link{flex-shrink:0;margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:.8rem;font-weight:500;color:#2563eb;text-decoration:none;transition:color .15s}ui-card-list-item .cli-inline-link:hover{color:#1d4ed8}@media(pointer:coarse),(max-width:480px){ui-card-list-item .cli-chip{min-height:44px;padding:4px 14px}ui-card-list-item .cli-chip--delete{min-height:28px;padding:0}}ui-card-list-item [card-stats]{display:flex;align-items:stretch;background:#f8fafc;border-top:1px solid #f1f5f9}ui-card-list-item [card-detail]{background:#f8fafc;border-top:1px solid #e2e8f0}ui-card-list-item .cli-stat{flex:1;display:flex;flex-direction:column;gap:2px;padding:10px 14px}ui-card-list-item .cli-stat-label{font-size:.6875rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:#64748b}ui-card-list-item .cli-stat-value{font-size:.9375rem;font-weight:600;color:#0f172a}ui-card-list-item .cli-stat-divider{width:1px;background:#e2e8f0;margin:8px 0}\n"],
|
|
27484
27574
|
dependencies: [{
|
|
27485
27575
|
kind: "component",
|
|
27486
27576
|
type: BadgeComponent,
|
|
@@ -27555,13 +27645,21 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
27555
27645
|
@if (viewButton()) {
|
|
27556
27646
|
<button class="cli-chip cli-chip--view" type="button" [attr.aria-label]="viewAriaLabel() || null" (click)="viewClick.emit()">View</button>
|
|
27557
27647
|
}
|
|
27648
|
+
@if (actionLabel()) {
|
|
27649
|
+
<button class="cli-chip cli-chip--action" type="button" [attr.data-testid]="actionTestId() || null" [attr.aria-label]="actionAriaLabel() || null" (click)="action.emit()">{{ actionLabel() }}</button>
|
|
27650
|
+
}
|
|
27651
|
+
@if (deletable()) {
|
|
27652
|
+
<button class="cli-chip cli-chip--delete" type="button" [attr.data-testid]="deleteTestId() || null" [attr.aria-label]="deleteLabel() || 'Delete'" (click)="delete.emit()">
|
|
27653
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path [attr.d]="trashPath" /></svg>
|
|
27654
|
+
</button>
|
|
27655
|
+
}
|
|
27558
27656
|
<ng-content select="[card-list-action]" />
|
|
27559
27657
|
<ng-content />
|
|
27560
27658
|
</div>
|
|
27561
27659
|
<ng-content select="[card-stats]" />
|
|
27562
27660
|
<ng-content select="[card-detail]" />
|
|
27563
27661
|
`,
|
|
27564
|
-
styles: ["ui-card-list-item{position:relative;display:block;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;margin-bottom:8px}ui-card-list-item:last-child{margin-bottom:0}ui-card-list-item .cli-row{display:flex;align-items:flex-start;gap:12px;padding:13px 18px;transition:background .12s}ui-card-list-item .cli-row:hover{background:#f8fafc}@media(prefers-reduced-motion:reduce){ui-card-list-item .cli-row{transition:none}}ui-card-list-item .cli-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}ui-card-list-item .cli-dot:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-dot--high{background:#ef4444}ui-card-list-item .cli-dot--medium{background:#f59e0b}ui-card-list-item .cli-dot--low{background:#94a3b8}ui-card-list-item .cli-dot--blue{background:#3b82f6}ui-card-list-item .cli-dot--green{background:#22c55e}ui-card-list-item .cli-icon-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}ui-card-list-item .cli-icon-circle--call{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--email{background:#dcfce7;color:#16a34a}ui-card-list-item .cli-icon-circle--sms{background:#fef9c3;color:#ca8a04}ui-card-list-item .cli-icon-circle--task{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--doc{background:#ffedd5;color:#ea580c}ui-card-list-item .cli-icon-circle--money{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--deal{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--survey{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--property{background:#fef3c7;color:#d97706}ui-card-list-item .cli-icon-circle--search{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--heart{background:#fce7f3;color:#db2777}ui-card-list-item .cli-icon-circle--calc{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--repeat{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;overflow-wrap:anywhere;word-break:break-word}ui-card-list-item .cli-badges{position:absolute;top:10px;right:12px;display:flex;align-items:center;gap:6px;z-index:1}ui-card-list-item .cli-row--badges .cli-body{padding-right:96px}ui-card-list-item .cli-row--badges-2 .cli-body{padding-right:190px}ui-card-list-item .cli-row--badges .cli-chip{align-self:flex-end}ui-card-list-item .cli-title-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap}ui-card-list-item .cli-title{font-size:.875rem;font-weight:600;color:#1e293b}ui-card-list-item .cli-desc-row{display:flex;align-items:center;gap:8px}ui-card-list-item .cli-desc-row:empty{display:none}ui-card-list-item .cli-description{font-size:.8125rem;color:#64748b;min-width:0}ui-card-list-item .cli-date{display:flex;align-items:center;gap:4px;font-size:.75rem;color:#64748b}ui-card-list-item .cli-chip{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;align-self:center;box-sizing:border-box;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;background:none;cursor:pointer;padding:4px 10px;border-radius:6px;text-decoration:none;transition:background .15s,color .15s,border-color .15s}ui-card-list-item .cli-chip--edit{color:#64748b;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--edit:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--view{color:#2563eb;border:1px solid #dbeafe}ui-card-list-item .cli-chip--view:hover{background:#eff6ff;border-color:#bfdbfe;color:#1d4ed8}ui-card-list-item .cli-chip:focus-visible,ui-card-list-item .cli-inline-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-inline-link{flex-shrink:0;margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:.8rem;font-weight:500;color:#2563eb;text-decoration:none;transition:color .15s}ui-card-list-item .cli-inline-link:hover{color:#1d4ed8}@media(pointer:coarse),(max-width:480px){ui-card-list-item .cli-chip{min-height:44px;padding:4px 14px}}ui-card-list-item [card-stats]{display:flex;align-items:stretch;background:#f8fafc;border-top:1px solid #f1f5f9}ui-card-list-item [card-detail]{background:#f8fafc;border-top:1px solid #e2e8f0}ui-card-list-item .cli-stat{flex:1;display:flex;flex-direction:column;gap:2px;padding:10px 14px}ui-card-list-item .cli-stat-label{font-size:.6875rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:#64748b}ui-card-list-item .cli-stat-value{font-size:.9375rem;font-weight:600;color:#0f172a}ui-card-list-item .cli-stat-divider{width:1px;background:#e2e8f0;margin:8px 0}\n"]
|
|
27662
|
+
styles: ["ui-card-list-item{position:relative;display:block;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;margin-bottom:8px}ui-card-list-item:last-child{margin-bottom:0}ui-card-list-item .cli-row{display:flex;align-items:flex-start;gap:12px;padding:13px 18px;transition:background .12s}ui-card-list-item .cli-row:hover{background:#f8fafc}@media(prefers-reduced-motion:reduce){ui-card-list-item .cli-row{transition:none}}ui-card-list-item .cli-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}ui-card-list-item .cli-dot:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-dot--high{background:#ef4444}ui-card-list-item .cli-dot--medium{background:#f59e0b}ui-card-list-item .cli-dot--low{background:#94a3b8}ui-card-list-item .cli-dot--blue{background:#3b82f6}ui-card-list-item .cli-dot--green{background:#22c55e}ui-card-list-item .cli-icon-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}ui-card-list-item .cli-icon-circle--call{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--email{background:#dcfce7;color:#16a34a}ui-card-list-item .cli-icon-circle--sms{background:#fef9c3;color:#ca8a04}ui-card-list-item .cli-icon-circle--task{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--doc{background:#ffedd5;color:#ea580c}ui-card-list-item .cli-icon-circle--money{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--deal{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--survey{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--property{background:#fef3c7;color:#d97706}ui-card-list-item .cli-icon-circle--search{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--heart{background:#fce7f3;color:#db2777}ui-card-list-item .cli-icon-circle--calc{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--repeat{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;overflow-wrap:anywhere;word-break:break-word}ui-card-list-item .cli-badges{position:absolute;top:10px;right:12px;display:flex;align-items:center;gap:6px;z-index:1}ui-card-list-item .cli-row--badges .cli-body{padding-right:96px}ui-card-list-item .cli-row--badges-2 .cli-body{padding-right:190px}ui-card-list-item .cli-row--badges .cli-chip{align-self:flex-end}ui-card-list-item .cli-title-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap}ui-card-list-item .cli-title{font-size:.875rem;font-weight:600;color:#1e293b}ui-card-list-item .cli-desc-row{display:flex;align-items:center;gap:8px}ui-card-list-item .cli-desc-row:empty{display:none}ui-card-list-item .cli-description{font-size:.8125rem;color:#64748b;min-width:0}ui-card-list-item .cli-date{display:flex;align-items:center;gap:4px;font-size:.75rem;color:#64748b}ui-card-list-item .cli-chip{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;align-self:center;box-sizing:border-box;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;background:none;cursor:pointer;padding:4px 10px;border-radius:6px;text-decoration:none;transition:background .15s,color .15s,border-color .15s}ui-card-list-item .cli-chip--edit{color:#64748b;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--edit:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--view{color:#2563eb;border:1px solid #dbeafe}ui-card-list-item .cli-chip--view:hover{background:#eff6ff;border-color:#bfdbfe;color:#1d4ed8}ui-card-list-item .cli-chip--action{color:#475569;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--action:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--delete{position:relative;justify-content:center;width:28px;height:28px;padding:0;color:#b91c1c;border:1px solid #fecaca}ui-card-list-item .cli-chip--delete:hover{background:#fef2f2;border-color:#fca5a5;color:#991b1b}ui-card-list-item .cli-chip--delete:after{content:\"\";position:absolute;top:50%;left:50%;width:44px;height:44px;transform:translate(-50%,-50%)}ui-card-list-item .cli-chip:focus-visible,ui-card-list-item .cli-inline-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-inline-link{flex-shrink:0;margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:.8rem;font-weight:500;color:#2563eb;text-decoration:none;transition:color .15s}ui-card-list-item .cli-inline-link:hover{color:#1d4ed8}@media(pointer:coarse),(max-width:480px){ui-card-list-item .cli-chip{min-height:44px;padding:4px 14px}ui-card-list-item .cli-chip--delete{min-height:28px;padding:0}}ui-card-list-item [card-stats]{display:flex;align-items:stretch;background:#f8fafc;border-top:1px solid #f1f5f9}ui-card-list-item [card-detail]{background:#f8fafc;border-top:1px solid #e2e8f0}ui-card-list-item .cli-stat{flex:1;display:flex;flex-direction:column;gap:2px;padding:10px 14px}ui-card-list-item .cli-stat-label{font-size:.6875rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:#64748b}ui-card-list-item .cli-stat-value{font-size:.9375rem;font-weight:600;color:#0f172a}ui-card-list-item .cli-stat-divider{width:1px;background:#e2e8f0;margin:8px 0}\n"]
|
|
27565
27663
|
}]
|
|
27566
27664
|
}],
|
|
27567
27665
|
propDecorators: {
|
|
@@ -27669,6 +27767,54 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
27669
27767
|
required: false
|
|
27670
27768
|
}]
|
|
27671
27769
|
}],
|
|
27770
|
+
deletable: [{
|
|
27771
|
+
type: i0.Input,
|
|
27772
|
+
args: [{
|
|
27773
|
+
isSignal: true,
|
|
27774
|
+
alias: "deletable",
|
|
27775
|
+
required: false
|
|
27776
|
+
}]
|
|
27777
|
+
}],
|
|
27778
|
+
deleteLabel: [{
|
|
27779
|
+
type: i0.Input,
|
|
27780
|
+
args: [{
|
|
27781
|
+
isSignal: true,
|
|
27782
|
+
alias: "deleteLabel",
|
|
27783
|
+
required: false
|
|
27784
|
+
}]
|
|
27785
|
+
}],
|
|
27786
|
+
deleteTestId: [{
|
|
27787
|
+
type: i0.Input,
|
|
27788
|
+
args: [{
|
|
27789
|
+
isSignal: true,
|
|
27790
|
+
alias: "deleteTestId",
|
|
27791
|
+
required: false
|
|
27792
|
+
}]
|
|
27793
|
+
}],
|
|
27794
|
+
actionLabel: [{
|
|
27795
|
+
type: i0.Input,
|
|
27796
|
+
args: [{
|
|
27797
|
+
isSignal: true,
|
|
27798
|
+
alias: "actionLabel",
|
|
27799
|
+
required: false
|
|
27800
|
+
}]
|
|
27801
|
+
}],
|
|
27802
|
+
actionTestId: [{
|
|
27803
|
+
type: i0.Input,
|
|
27804
|
+
args: [{
|
|
27805
|
+
isSignal: true,
|
|
27806
|
+
alias: "actionTestId",
|
|
27807
|
+
required: false
|
|
27808
|
+
}]
|
|
27809
|
+
}],
|
|
27810
|
+
actionAriaLabel: [{
|
|
27811
|
+
type: i0.Input,
|
|
27812
|
+
args: [{
|
|
27813
|
+
isSignal: true,
|
|
27814
|
+
alias: "actionAriaLabel",
|
|
27815
|
+
required: false
|
|
27816
|
+
}]
|
|
27817
|
+
}],
|
|
27672
27818
|
editClick: [{
|
|
27673
27819
|
type: i0.Output,
|
|
27674
27820
|
args: ["editClick"]
|
|
@@ -27676,6 +27822,14 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
27676
27822
|
viewClick: [{
|
|
27677
27823
|
type: i0.Output,
|
|
27678
27824
|
args: ["viewClick"]
|
|
27825
|
+
}],
|
|
27826
|
+
delete: [{
|
|
27827
|
+
type: i0.Output,
|
|
27828
|
+
args: ["delete"]
|
|
27829
|
+
}],
|
|
27830
|
+
action: [{
|
|
27831
|
+
type: i0.Output,
|
|
27832
|
+
args: ["action"]
|
|
27679
27833
|
}]
|
|
27680
27834
|
}
|
|
27681
27835
|
});
|
|
@@ -27756,26 +27910,44 @@ var NotesComponent = class NotesComponent {
|
|
|
27756
27910
|
return ((parts[0]?.[0] ?? "") + (parts.length > 1 ? parts[parts.length - 1][0] : "")).toUpperCase();
|
|
27757
27911
|
}
|
|
27758
27912
|
tooLong(text) {
|
|
27759
|
-
return text.trim().length >
|
|
27913
|
+
return text.trim().length > this.maxLength();
|
|
27760
27914
|
}
|
|
27761
27915
|
validBody(text) {
|
|
27762
27916
|
const n = text.trim().length;
|
|
27763
|
-
return n > 0 && n <=
|
|
27917
|
+
return n > 0 && n <= this.maxLength();
|
|
27764
27918
|
}
|
|
27765
27919
|
get listUrl() {
|
|
27766
|
-
return `${this.apiBase}/notes/${this.resourceType()}/${this.resourceId()}`;
|
|
27920
|
+
return this.basePath() ? `${this.apiBase}${this.basePath()}` : `${this.apiBase}/notes/${this.resourceType()}/${this.resourceId()}`;
|
|
27921
|
+
}
|
|
27922
|
+
noteUrl(id) {
|
|
27923
|
+
return this.basePath() ? `${this.apiBase}${this.basePath()}/${id}` : `${this.apiBase}/notes/${id}`;
|
|
27924
|
+
}
|
|
27925
|
+
get ready() {
|
|
27926
|
+
return !!this.basePath() || !!this.resourceType() && !!this.resourceId();
|
|
27927
|
+
}
|
|
27928
|
+
payload(text) {
|
|
27929
|
+
return this.basePath() ? { content: text.trim() } : { body: text.trim() };
|
|
27930
|
+
}
|
|
27931
|
+
normalize(n) {
|
|
27932
|
+
return {
|
|
27933
|
+
...n,
|
|
27934
|
+
body: n.body ?? n.content ?? "",
|
|
27935
|
+
updatedAt: n.updatedAt ?? n.createdAt
|
|
27936
|
+
};
|
|
27767
27937
|
}
|
|
27768
27938
|
constructor() {
|
|
27769
27939
|
this.resourceType = input("", ...ngDevMode ? [{ debugName: "resourceType" }] : /* istanbul ignore next */ []);
|
|
27770
27940
|
this.resourceId = input("", ...ngDevMode ? [{ debugName: "resourceId" }] : /* istanbul ignore next */ []);
|
|
27941
|
+
this.basePath = input("", ...ngDevMode ? [{ debugName: "basePath" }] : /* istanbul ignore next */ []);
|
|
27771
27942
|
this.readOnly = input(false, ...ngDevMode ? [{ debugName: "readOnly" }] : /* istanbul ignore next */ []);
|
|
27943
|
+
this.editable = input(true, ...ngDevMode ? [{ debugName: "editable" }] : /* istanbul ignore next */ []);
|
|
27944
|
+
this.maxLength = input(NOTES_MAX_LENGTH, ...ngDevMode ? [{ debugName: "maxLength" }] : /* istanbul ignore next */ []);
|
|
27772
27945
|
this.totalChange = output();
|
|
27773
27946
|
this.http = inject(HttpClient);
|
|
27774
27947
|
this.toast = inject(ToastService);
|
|
27775
27948
|
this.destroyRef = inject(DestroyRef);
|
|
27776
27949
|
this.apiBase = inject(FORGEROUTE_CONFIG, { optional: true })?.baseUrl ?? "/api";
|
|
27777
27950
|
this.pageSize = NOTES_PAGE_SIZE;
|
|
27778
|
-
this.maxLength = NOTES_MAX_LENGTH;
|
|
27779
27951
|
this.notes = signal([], ...ngDevMode ? [{ debugName: "notes" }] : /* istanbul ignore next */ []);
|
|
27780
27952
|
this.loading = signal(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
|
|
27781
27953
|
this.saving = signal(false, ...ngDevMode ? [{ debugName: "saving" }] : /* istanbul ignore next */ []);
|
|
@@ -27788,16 +27960,16 @@ var NotesComponent = class NotesComponent {
|
|
|
27788
27960
|
effect(() => {
|
|
27789
27961
|
const id = this.resourceId();
|
|
27790
27962
|
const type = this.resourceType();
|
|
27791
|
-
if (id && type) untracked(() => this.loadPage(0));
|
|
27963
|
+
if (this.basePath() || id && type) untracked(() => this.loadPage(0));
|
|
27792
27964
|
});
|
|
27793
27965
|
}
|
|
27794
27966
|
loadPage(p) {
|
|
27795
|
-
if (!this.
|
|
27967
|
+
if (!this.ready) return;
|
|
27796
27968
|
this.loading.set(true);
|
|
27797
27969
|
this.http.get(`${this.listUrl}?page=${p}&size=${this.pageSize}`).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
|
|
27798
27970
|
next: (res) => {
|
|
27799
|
-
this.notes.set(res.content);
|
|
27800
|
-
this.page.set(res.page);
|
|
27971
|
+
this.notes.set(res.content.map((n) => this.normalize(n)));
|
|
27972
|
+
this.page.set(res.page ?? res.number ?? p);
|
|
27801
27973
|
this.totalElements.set(res.totalElements);
|
|
27802
27974
|
this.loading.set(false);
|
|
27803
27975
|
this.totalChange.emit(res.totalElements);
|
|
@@ -27811,7 +27983,7 @@ var NotesComponent = class NotesComponent {
|
|
|
27811
27983
|
addNote() {
|
|
27812
27984
|
if (this.readOnly() || !this.validBody(this.newBody) || this.saving()) return;
|
|
27813
27985
|
this.saving.set(true);
|
|
27814
|
-
this.http.post(this.listUrl,
|
|
27986
|
+
this.http.post(this.listUrl, this.payload(this.newBody)).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
|
|
27815
27987
|
next: () => {
|
|
27816
27988
|
this.newBody = "";
|
|
27817
27989
|
this.saving.set(false);
|
|
@@ -27824,7 +27996,7 @@ var NotesComponent = class NotesComponent {
|
|
|
27824
27996
|
});
|
|
27825
27997
|
}
|
|
27826
27998
|
startEdit(note) {
|
|
27827
|
-
if (this.readOnly()) return;
|
|
27999
|
+
if (this.readOnly() || !this.editable()) return;
|
|
27828
28000
|
this.editingId.set(note.id);
|
|
27829
28001
|
this.editBody = note.body;
|
|
27830
28002
|
}
|
|
@@ -27833,11 +28005,11 @@ var NotesComponent = class NotesComponent {
|
|
|
27833
28005
|
this.editBody = "";
|
|
27834
28006
|
}
|
|
27835
28007
|
saveEdit(noteId) {
|
|
27836
|
-
if (this.readOnly() || !this.validBody(this.editBody) || this.saving()) return;
|
|
28008
|
+
if (this.readOnly() || !this.editable() || !this.validBody(this.editBody) || this.saving()) return;
|
|
27837
28009
|
this.saving.set(true);
|
|
27838
|
-
this.http.put(
|
|
28010
|
+
this.http.put(this.noteUrl(noteId), this.payload(this.editBody)).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
|
|
27839
28011
|
next: (updated) => {
|
|
27840
|
-
this.notes.update((arr) => arr.map((n) => n.id === noteId ? updated : n));
|
|
28012
|
+
this.notes.update((arr) => arr.map((n) => n.id === noteId ? this.normalize(updated) : n));
|
|
27841
28013
|
this.editingId.set(null);
|
|
27842
28014
|
this.saving.set(false);
|
|
27843
28015
|
},
|
|
@@ -27855,7 +28027,7 @@ var NotesComponent = class NotesComponent {
|
|
|
27855
28027
|
const id = this.deletingId();
|
|
27856
28028
|
if (this.readOnly() || !id || this.saving()) return;
|
|
27857
28029
|
this.saving.set(true);
|
|
27858
|
-
this.http.delete(
|
|
28030
|
+
this.http.delete(this.noteUrl(id)).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
|
|
27859
28031
|
next: () => {
|
|
27860
28032
|
this.deletingId.set(null);
|
|
27861
28033
|
this.saving.set(false);
|
|
@@ -27900,12 +28072,33 @@ var NotesComponent = class NotesComponent {
|
|
|
27900
28072
|
isRequired: false,
|
|
27901
28073
|
transformFunction: null
|
|
27902
28074
|
},
|
|
28075
|
+
basePath: {
|
|
28076
|
+
classPropertyName: "basePath",
|
|
28077
|
+
publicName: "basePath",
|
|
28078
|
+
isSignal: true,
|
|
28079
|
+
isRequired: false,
|
|
28080
|
+
transformFunction: null
|
|
28081
|
+
},
|
|
27903
28082
|
readOnly: {
|
|
27904
28083
|
classPropertyName: "readOnly",
|
|
27905
28084
|
publicName: "readOnly",
|
|
27906
28085
|
isSignal: true,
|
|
27907
28086
|
isRequired: false,
|
|
27908
28087
|
transformFunction: null
|
|
28088
|
+
},
|
|
28089
|
+
editable: {
|
|
28090
|
+
classPropertyName: "editable",
|
|
28091
|
+
publicName: "editable",
|
|
28092
|
+
isSignal: true,
|
|
28093
|
+
isRequired: false,
|
|
28094
|
+
transformFunction: null
|
|
28095
|
+
},
|
|
28096
|
+
maxLength: {
|
|
28097
|
+
classPropertyName: "maxLength",
|
|
28098
|
+
publicName: "maxLength",
|
|
28099
|
+
isSignal: true,
|
|
28100
|
+
isRequired: false,
|
|
28101
|
+
transformFunction: null
|
|
27909
28102
|
}
|
|
27910
28103
|
},
|
|
27911
28104
|
outputs: { totalChange: "totalChange" },
|
|
@@ -27913,7 +28106,7 @@ var NotesComponent = class NotesComponent {
|
|
|
27913
28106
|
template: `
|
|
27914
28107
|
@if (!readOnly()) {
|
|
27915
28108
|
<div class="note-add">
|
|
27916
|
-
<ui-textarea-input ariaLabel="Add a note" placeholder="Add a note..." [rows]="3" [maxlength]="maxLength" [showErrors]="tooLong(newBody)" [disabled]="saving()" [(ngModel)]="newBody"
|
|
28109
|
+
<ui-textarea-input ariaLabel="Add a note" placeholder="Add a note..." [rows]="3" [maxlength]="maxLength()" [showErrors]="tooLong(newBody)" [disabled]="saving()" [(ngModel)]="newBody"
|
|
27917
28110
|
(keydown.meta.enter)="addNote()" (keydown.control.enter)="addNote()" />
|
|
27918
28111
|
<div class="note-add-footer">
|
|
27919
28112
|
<ui-button variant="primary" size="sm" data-testid="note-add-btn" [loading]="saving()" [disabled]="!validBody(newBody)" (click)="addNote()">Add Note</ui-button>
|
|
@@ -27940,13 +28133,15 @@ var NotesComponent = class NotesComponent {
|
|
|
27940
28133
|
}
|
|
27941
28134
|
@if (!readOnly() && editingId() !== note.id) {
|
|
27942
28135
|
<div class="note-actions">
|
|
27943
|
-
|
|
28136
|
+
@if (editable()) {
|
|
28137
|
+
<ui-icon name="edit" [size]="14" tooltip="Edit note" (iconClick)="startEdit(note)" />
|
|
28138
|
+
}
|
|
27944
28139
|
<ui-icon name="delete" variant="danger" [size]="14" tooltip="Delete note" (iconClick)="confirmDelete(note.id)" />
|
|
27945
28140
|
</div>
|
|
27946
28141
|
}
|
|
27947
28142
|
</div>
|
|
27948
28143
|
@if (editingId() === note.id) {
|
|
27949
|
-
<ui-textarea-input ariaLabel="Edit note" [rows]="3" [maxlength]="maxLength" [showErrors]="tooLong(editBody)" [disabled]="saving()" [(ngModel)]="editBody" />
|
|
28144
|
+
<ui-textarea-input ariaLabel="Edit note" [rows]="3" [maxlength]="maxLength()" [showErrors]="tooLong(editBody)" [disabled]="saving()" [(ngModel)]="editBody" />
|
|
27950
28145
|
<div class="note-item-footer">
|
|
27951
28146
|
<ui-button variant="secondary" size="sm" (click)="cancelEdit()">Cancel</ui-button>
|
|
27952
28147
|
<ui-button variant="primary" size="sm" [loading]="saving()" [disabled]="!validBody(editBody)" (click)="saveEdit(note.id)">Save</ui-button>
|
|
@@ -28156,7 +28351,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
28156
28351
|
template: `
|
|
28157
28352
|
@if (!readOnly()) {
|
|
28158
28353
|
<div class="note-add">
|
|
28159
|
-
<ui-textarea-input ariaLabel="Add a note" placeholder="Add a note..." [rows]="3" [maxlength]="maxLength" [showErrors]="tooLong(newBody)" [disabled]="saving()" [(ngModel)]="newBody"
|
|
28354
|
+
<ui-textarea-input ariaLabel="Add a note" placeholder="Add a note..." [rows]="3" [maxlength]="maxLength()" [showErrors]="tooLong(newBody)" [disabled]="saving()" [(ngModel)]="newBody"
|
|
28160
28355
|
(keydown.meta.enter)="addNote()" (keydown.control.enter)="addNote()" />
|
|
28161
28356
|
<div class="note-add-footer">
|
|
28162
28357
|
<ui-button variant="primary" size="sm" data-testid="note-add-btn" [loading]="saving()" [disabled]="!validBody(newBody)" (click)="addNote()">Add Note</ui-button>
|
|
@@ -28183,13 +28378,15 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
28183
28378
|
}
|
|
28184
28379
|
@if (!readOnly() && editingId() !== note.id) {
|
|
28185
28380
|
<div class="note-actions">
|
|
28186
|
-
|
|
28381
|
+
@if (editable()) {
|
|
28382
|
+
<ui-icon name="edit" [size]="14" tooltip="Edit note" (iconClick)="startEdit(note)" />
|
|
28383
|
+
}
|
|
28187
28384
|
<ui-icon name="delete" variant="danger" [size]="14" tooltip="Delete note" (iconClick)="confirmDelete(note.id)" />
|
|
28188
28385
|
</div>
|
|
28189
28386
|
}
|
|
28190
28387
|
</div>
|
|
28191
28388
|
@if (editingId() === note.id) {
|
|
28192
|
-
<ui-textarea-input ariaLabel="Edit note" [rows]="3" [maxlength]="maxLength" [showErrors]="tooLong(editBody)" [disabled]="saving()" [(ngModel)]="editBody" />
|
|
28389
|
+
<ui-textarea-input ariaLabel="Edit note" [rows]="3" [maxlength]="maxLength()" [showErrors]="tooLong(editBody)" [disabled]="saving()" [(ngModel)]="editBody" />
|
|
28193
28390
|
<div class="note-item-footer">
|
|
28194
28391
|
<ui-button variant="secondary" size="sm" (click)="cancelEdit()">Cancel</ui-button>
|
|
28195
28392
|
<ui-button variant="primary" size="sm" [loading]="saving()" [disabled]="!validBody(editBody)" (click)="saveEdit(note.id)">Save</ui-button>
|
|
@@ -28231,6 +28428,14 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
28231
28428
|
required: false
|
|
28232
28429
|
}]
|
|
28233
28430
|
}],
|
|
28431
|
+
basePath: [{
|
|
28432
|
+
type: i0.Input,
|
|
28433
|
+
args: [{
|
|
28434
|
+
isSignal: true,
|
|
28435
|
+
alias: "basePath",
|
|
28436
|
+
required: false
|
|
28437
|
+
}]
|
|
28438
|
+
}],
|
|
28234
28439
|
readOnly: [{
|
|
28235
28440
|
type: i0.Input,
|
|
28236
28441
|
args: [{
|
|
@@ -28239,6 +28444,22 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
28239
28444
|
required: false
|
|
28240
28445
|
}]
|
|
28241
28446
|
}],
|
|
28447
|
+
editable: [{
|
|
28448
|
+
type: i0.Input,
|
|
28449
|
+
args: [{
|
|
28450
|
+
isSignal: true,
|
|
28451
|
+
alias: "editable",
|
|
28452
|
+
required: false
|
|
28453
|
+
}]
|
|
28454
|
+
}],
|
|
28455
|
+
maxLength: [{
|
|
28456
|
+
type: i0.Input,
|
|
28457
|
+
args: [{
|
|
28458
|
+
isSignal: true,
|
|
28459
|
+
alias: "maxLength",
|
|
28460
|
+
required: false
|
|
28461
|
+
}]
|
|
28462
|
+
}],
|
|
28242
28463
|
totalChange: [{
|
|
28243
28464
|
type: i0.Output,
|
|
28244
28465
|
args: ["totalChange"]
|
|
@@ -40097,6 +40318,10 @@ var CalendarComponent = class CalendarComponent {
|
|
|
40097
40318
|
constructor() {
|
|
40098
40319
|
this.items = input([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
|
|
40099
40320
|
this.loading = input(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
|
|
40321
|
+
this.loadingActions = input(2, {
|
|
40322
|
+
...ngDevMode ? { debugName: "loadingActions" } : /* istanbul ignore next */ {},
|
|
40323
|
+
transform: numberAttribute
|
|
40324
|
+
});
|
|
40100
40325
|
this.view = model("month", ...ngDevMode ? [{ debugName: "view" }] : /* istanbul ignore next */ []);
|
|
40101
40326
|
this.views = input([
|
|
40102
40327
|
"week",
|
|
@@ -40136,6 +40361,24 @@ var CalendarComponent = class CalendarComponent {
|
|
|
40136
40361
|
"Saturday"
|
|
40137
40362
|
];
|
|
40138
40363
|
this.skeletonCells = Array.from({ length: 42 }, (_, i) => i);
|
|
40364
|
+
this.skeletonDays = Array.from({ length: 7 }, (_, i) => i);
|
|
40365
|
+
this.skeletonRows = Array.from({ length: 4 }, (_, i) => i);
|
|
40366
|
+
this.loadPhase = linkedSignal({
|
|
40367
|
+
...ngDevMode ? { debugName: "loadPhase" } : /* istanbul ignore next */ {},
|
|
40368
|
+
source: this.loading,
|
|
40369
|
+
computation: (loading, prev) => {
|
|
40370
|
+
const p = prev?.value ?? "idle";
|
|
40371
|
+
return loading ? p === "idle" ? "first" : p : p === "first" ? "loaded" : p;
|
|
40372
|
+
}
|
|
40373
|
+
});
|
|
40374
|
+
this.showOutline = computed(() => {
|
|
40375
|
+
const phase = this.loadPhase();
|
|
40376
|
+
return this.loading() && phase !== "loaded" && this.items().length === 0;
|
|
40377
|
+
}, ...ngDevMode ? [{ debugName: "showOutline" }] : /* istanbul ignore next */ []);
|
|
40378
|
+
this.loadingActionSlots = computed(() => {
|
|
40379
|
+
const n = Number(this.loadingActions());
|
|
40380
|
+
return Array.from({ length: Number.isFinite(n) ? Math.max(0, Math.min(6, Math.floor(n))) : 0 }, (_, i) => i);
|
|
40381
|
+
}, ...ngDevMode ? [{ debugName: "loadingActionSlots" }] : /* istanbul ignore next */ []);
|
|
40139
40382
|
this.formatHour = formatHour;
|
|
40140
40383
|
this.clockToday = signal(toDateStr(/* @__PURE__ */ new Date()), ...ngDevMode ? [{ debugName: "clockToday" }] : /* istanbul ignore next */ []);
|
|
40141
40384
|
this.todayStr = computed(() => {
|
|
@@ -40467,6 +40710,13 @@ var CalendarComponent = class CalendarComponent {
|
|
|
40467
40710
|
isRequired: false,
|
|
40468
40711
|
transformFunction: null
|
|
40469
40712
|
},
|
|
40713
|
+
loadingActions: {
|
|
40714
|
+
classPropertyName: "loadingActions",
|
|
40715
|
+
publicName: "loadingActions",
|
|
40716
|
+
isSignal: true,
|
|
40717
|
+
isRequired: false,
|
|
40718
|
+
transformFunction: null
|
|
40719
|
+
},
|
|
40470
40720
|
view: {
|
|
40471
40721
|
classPropertyName: "view",
|
|
40472
40722
|
publicName: "view",
|
|
@@ -40606,6 +40856,97 @@ var CalendarComponent = class CalendarComponent {
|
|
|
40606
40856
|
},
|
|
40607
40857
|
ngImport: i0,
|
|
40608
40858
|
template: `
|
|
40859
|
+
@if (showOutline()) {
|
|
40860
|
+
<!-- First load: an outline of the whole page (toolbar, filter bar, grid) built only from decorative skeletons. One status region. -->
|
|
40861
|
+
<div class="cal-outline" data-testid="calendar-skeleton" role="status" aria-busy="true" aria-label="Loading calendar">
|
|
40862
|
+
<div class="cal-header">
|
|
40863
|
+
<div class="cal-toolbar">
|
|
40864
|
+
<div class="toolbar-left">
|
|
40865
|
+
<div class="skel-period-wrap"><ui-skeleton class="skel-period" [height]="40" [radius]="8" /></div>
|
|
40866
|
+
@if (!filters().length) {
|
|
40867
|
+
<div class="nav-controls skel-nav-controls">
|
|
40868
|
+
<ui-skeleton class="skel-nav" [height]="38" width="38px" [radius]="10" />
|
|
40869
|
+
<ui-skeleton class="skel-nav" [height]="38" width="76px" [radius]="10" />
|
|
40870
|
+
<ui-skeleton class="skel-nav" [height]="38" width="38px" [radius]="10" />
|
|
40871
|
+
</div>
|
|
40872
|
+
}
|
|
40873
|
+
</div>
|
|
40874
|
+
<div class="toolbar-center"></div>
|
|
40875
|
+
<div class="toolbar-right">
|
|
40876
|
+
@if (viewTabs().length > 1) {
|
|
40877
|
+
<div class="skel-tabs">
|
|
40878
|
+
@for (t of viewTabs(); track t.key) { <ui-skeleton class="skel-tab" [height]="34" width="72px" [radius]="17" /> }
|
|
40879
|
+
</div>
|
|
40880
|
+
}
|
|
40881
|
+
@if (loadingActionSlots().length) {
|
|
40882
|
+
<div class="toolbar-actions">
|
|
40883
|
+
@for (a of loadingActionSlots(); track a) { <ui-skeleton class="skel-action" [height]="38" width="112px" [radius]="10" /> }
|
|
40884
|
+
</div>
|
|
40885
|
+
}
|
|
40886
|
+
</div>
|
|
40887
|
+
</div>
|
|
40888
|
+
@if (filters().length) {
|
|
40889
|
+
<div class="filter-bar">
|
|
40890
|
+
<div class="filter-main">
|
|
40891
|
+
@if (filterLabel()) { <ui-skeleton class="skel-filter-label" [height]="12" width="80px" [radius]="4" /> }
|
|
40892
|
+
<div class="filter-chips">
|
|
40893
|
+
<ui-skeleton class="skel-chip" [height]="28" width="56px" [radius]="14" />
|
|
40894
|
+
@for (f of filters(); track f.value) { <ui-skeleton class="skel-chip" [height]="28" width="88px" [radius]="14" /> }
|
|
40895
|
+
</div>
|
|
40896
|
+
</div>
|
|
40897
|
+
<div class="filter-nav">
|
|
40898
|
+
<div class="nav-controls skel-nav-controls">
|
|
40899
|
+
<ui-skeleton class="skel-nav" [height]="38" width="38px" [radius]="10" />
|
|
40900
|
+
<ui-skeleton class="skel-nav" [height]="38" width="76px" [radius]="10" />
|
|
40901
|
+
<ui-skeleton class="skel-nav" [height]="38" width="38px" [radius]="10" />
|
|
40902
|
+
</div>
|
|
40903
|
+
</div>
|
|
40904
|
+
</div>
|
|
40905
|
+
}
|
|
40906
|
+
</div>
|
|
40907
|
+
<div class="outline-grid">
|
|
40908
|
+
@if (view() !== 'agenda') {
|
|
40909
|
+
<div class="skel-dow-row">
|
|
40910
|
+
@for (d of weekDayLabels; track d) { <div class="skel-dow"><ui-skeleton [height]="16" width="36px" [radius]="4" /></div> }
|
|
40911
|
+
</div>
|
|
40912
|
+
}
|
|
40913
|
+
@switch (view()) {
|
|
40914
|
+
@case ('month') {
|
|
40915
|
+
<div class="skel-month-grid">
|
|
40916
|
+
@for (i of skeletonCells; track i) {
|
|
40917
|
+
<div class="skel-cell">
|
|
40918
|
+
<ui-skeleton [height]="22" width="22px" [radius]="11" />
|
|
40919
|
+
@if (i % 3 === 0) { <ui-skeleton [height]="14" [radius]="3" /> }
|
|
40920
|
+
@if (i % 5 === 0) { <ui-skeleton [height]="14" width="72%" [radius]="3" /> }
|
|
40921
|
+
</div>
|
|
40922
|
+
}
|
|
40923
|
+
</div>
|
|
40924
|
+
}
|
|
40925
|
+
@case ('week') {
|
|
40926
|
+
<div class="skel-week-grid">
|
|
40927
|
+
@for (i of skeletonDays; track i) {
|
|
40928
|
+
<div class="skel-cell">
|
|
40929
|
+
<ui-skeleton [height]="14" [radius]="3" />
|
|
40930
|
+
@if (i % 2 === 0) { <ui-skeleton [height]="48" [radius]="6" /> }
|
|
40931
|
+
@if (i % 3 === 0) { <ui-skeleton [height]="32" width="72%" [radius]="6" /> }
|
|
40932
|
+
</div>
|
|
40933
|
+
}
|
|
40934
|
+
</div>
|
|
40935
|
+
}
|
|
40936
|
+
@default {
|
|
40937
|
+
<div class="skel-agenda">
|
|
40938
|
+
@for (i of skeletonRows; track i) {
|
|
40939
|
+
<div class="skel-row">
|
|
40940
|
+
<ui-skeleton class="skel-row-date" [height]="40" width="64px" [radius]="6" />
|
|
40941
|
+
<div class="skel-row-body"><ui-skeleton [height]="16" width="60%" [radius]="4" /><ui-skeleton [height]="12" width="35%" [radius]="4" /></div>
|
|
40942
|
+
</div>
|
|
40943
|
+
}
|
|
40944
|
+
</div>
|
|
40945
|
+
}
|
|
40946
|
+
}
|
|
40947
|
+
</div>
|
|
40948
|
+
</div>
|
|
40949
|
+
} @else {
|
|
40609
40950
|
<!-- Previous / Today / Next: right-aligned in the filter row when there is one, else next to the period label -->
|
|
40610
40951
|
<ng-template #navControls>
|
|
40611
40952
|
<div class="nav-controls">
|
|
@@ -40630,7 +40971,7 @@ var CalendarComponent = class CalendarComponent {
|
|
|
40630
40971
|
@if (viewTabs().length > 1) {
|
|
40631
40972
|
<ui-pill-tabs ariaLabel="Calendar view" name="ui-calendar-view" [tabs]="viewTabs()" [activeKey]="view()" (tabChange)="setView($any($event))" />
|
|
40632
40973
|
}
|
|
40633
|
-
<ng-content select="[calendar-actions]"
|
|
40974
|
+
<div class="toolbar-actions"><ng-content select="[calendar-actions]" /></div>
|
|
40634
40975
|
</div>
|
|
40635
40976
|
</div>
|
|
40636
40977
|
|
|
@@ -40820,10 +41161,11 @@ var CalendarComponent = class CalendarComponent {
|
|
|
40820
41161
|
}
|
|
40821
41162
|
}
|
|
40822
41163
|
}
|
|
41164
|
+
}
|
|
40823
41165
|
<ui-toast />
|
|
40824
41166
|
`,
|
|
40825
41167
|
isInline: true,
|
|
40826
|
-
styles: [":host{display:flex;flex-direction:column;gap:0;height:100%;min-height:0}.cal-header{background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 2px #0f172a0a;margin-bottom:12px;flex-shrink:0}.cal-toolbar{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;padding:18px 20px;gap:16px;flex-shrink:0}.toolbar-left{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;column-gap:20px;row-gap:8px;min-width:0}.toolbar-center{display:flex;align-items:center;justify-content:center;gap:10px}.toolbar-right{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.period-label{font-size:2.5rem;font-weight:800;line-height:1.15;letter-spacing:-.025em;color:#0f172a;margin:0;min-width:0}.pl-sub{font-weight:600;color:#64748b}.nav-controls{display:inline-flex;align-items:center}.nav-controls>*+*{margin-left:-1px}.btn-nav{width:38px;height:38px;border:1px solid #cbd5e1;background:#fff;font-family:inherit;position:relative;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#475569;transition:background .12s,color .12s}.nav-controls>.btn-nav:first-child{border-radius:10px 0 0 10px}.nav-controls>.btn-nav:last-child{border-radius:0 10px 10px 0}.btn-today{padding:0 18px;height:38px;border:1px solid #cbd5e1;background:#fff;border-radius:0;font-family:inherit;position:relative;font-size:.9375rem;font-weight:600;color:#1d4ed8;cursor:pointer;transition:background .12s}.btn-nav:hover,.btn-today:hover{background:#eff6ff;color:#1d4ed8;z-index:1}.btn-nav:active,.btn-today:active{background:#dbeafe}.btn-nav:focus-visible,.btn-today:focus-visible,.filter-chip:focus-visible,.event-chip:focus-visible,.more-events:focus-visible,.allday-chip:focus-visible,.timed-event:focus-visible,.agenda-event:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.month-cell:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.slot-add:focus,.slot-add:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.mobile-summary{display:none}.filter-bar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px 16px;padding:12px 20px 14px;border-top:1px solid #eef2f7;background:#f8fafc;border-radius:0 0 12px 12px;flex-shrink:0}.filter-main{display:flex;flex-direction:column;gap:8px;flex:1 1 auto;min-width:0}.filter-nav{margin-left:auto;flex-shrink:0}.filter-bar-label{font-size:.6875rem;font-weight:700;color:#64748b;text-transform:uppercase;letter-spacing:.06em}.filter-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.filter-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 12px;border-radius:20px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s;white-space:nowrap;font-family:inherit}.filter-chip:hover{border-color:#cbd5e1;background:#f8fafc}.filter-chip.active-all{background:#1e293b;color:#fff;border-color:#1e293b}.filter-chip.active-all .chip-count{background:#fff3;color:#fff}.filter-chip.active-type{background:var(--chip-bg, #f1f5f9);color:#1e293b;border-color:var(--chip-color);font-weight:600}.filter-chip.active-type .chip-count{background:var(--chip-color);color:#fff}.chip-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.chip-count{font-size:.6875rem;font-weight:700;background:#f1f5f9;background:color-mix(in srgb,var(--chip-color, #64748b) 14%,#fff);color:#475569;padding:1px 8px;border-radius:999px;min-width:18px;text-align:center;box-sizing:border-box}.cal-skeleton,.month-view,.week-view,.agenda-view{flex:1;display:flex;flex-direction:column;min-height:0;background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.skel-dow-row{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;padding:12px 10px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.skel-dow{display:flex;justify-content:center}.skel-month-grid{display:grid;grid-template-columns:repeat(7,1fr);grid-template-rows:repeat(6,minmax(80px,1fr));flex:1}.skel-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:8px 6px;display:flex;flex-direction:column;gap:6px}.skel-cell:nth-child(7n){border-right:none}.month-grid{display:flex;flex-direction:column;flex:1;min-height:0;overflow:auto}.month-header{display:grid;grid-template-columns:repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;position:sticky;top:0;z-index:1}.month-dow{padding:10px 8px;font-size:.75rem;font-weight:600;color:#6b7280;text-align:center;text-transform:uppercase;letter-spacing:.04em}.dow-short{display:none}.month-row{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));flex:1 0 120px}.month-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:6px 6px 4px;min-height:120px;transition:background .1s;min-width:0;box-sizing:border-box}.month-cell.clickable{cursor:pointer}.month-cell.clickable:hover{background:#f8fafc}.month-cell:nth-child(7n){border-right:none}.month-cell.other-month{background:#fafafa}.month-cell.other-month .day-num{color:#64748b}.month-cell.today{background:#eff6ff}.day-num{display:inline-block;width:26px;height:26px;line-height:26px;text-align:center;border-radius:50%;font-size:.8125rem;font-weight:500;color:#374151;margin-bottom:4px}.today-badge{background:#2563eb;color:#fff;font-weight:700}.cell-events{display:flex;flex-direction:column;gap:2px}.event-chip{display:flex;align-items:center;gap:3px;padding:2px 6px;width:100%;box-sizing:border-box;text-align:left;font-family:inherit;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;cursor:pointer;overflow:hidden}.event-chip:hover{opacity:.85}.event-chip.stacked{flex-direction:column;align-items:flex-start;gap:0}.chip-head{display:inline-flex;align-items:center;gap:3px;flex-shrink:0}.chip-icon{flex-shrink:0}.chip-time{font-weight:700;flex-shrink:0;color:#1e293b}.chip-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#1e293b;min-width:0;max-width:100%}.strike{text-decoration:line-through}.chip-src{font-size:.625rem;font-weight:700;margin-left:auto;flex-shrink:0;color:#1e293b}.more-events{font-size:.6875rem;color:#2563eb;font-weight:600;cursor:pointer;padding:1px 6px;border:0;background:none;text-align:left;font-family:inherit}.more-events:hover{text-decoration:underline}.week-view{overflow:auto}.week-header{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;overflow-y:scroll}.time-gutter{border-right:1px solid #e2e8f0}.week-day-hdr{display:flex;flex-direction:column;align-items:center;padding:10px 4px;border-right:1px solid #f1f5f9}.week-day-hdr.today{background:#eff6ff}.week-day-hdr:last-child{border-right:none}.wdh-dow{font-size:.6875rem;font-weight:600;color:#6b7280;text-transform:uppercase}.wdh-num{width:28px;height:28px;line-height:28px;text-align:center;border-radius:50%;font-size:.9375rem;font-weight:600;color:#374151;margin-top:2px}.wdh-num.today-badge{background:#2563eb;color:#fff;font-weight:700}.allday-row{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;min-height:32px;flex-shrink:0;overflow-y:scroll}.allday-label{font-size:.625rem;color:#64748b;font-weight:600;text-transform:uppercase;display:flex;align-items:center;justify-content:center}.slot-add{position:absolute;top:2px;left:2px;z-index:3;width:1px;height:1px;padding:0;margin:0;overflow:hidden;clip-path:inset(50%);border:0;white-space:nowrap;font-family:inherit}.slot-add:focus,.slot-add:focus-visible{width:auto;height:auto;padding:2px 8px;clip-path:none;background:#1e293b;color:#fff;border-radius:4px;font-size:.75rem;font-weight:600}.allday-cell{position:relative;border-right:1px solid #f1f5f9;padding:3px 4px;display:flex;flex-direction:column;gap:2px;min-width:0}.allday-cell.clickable{cursor:pointer}.allday-cell:last-child{border-right:none}.allday-chip{padding:2px 6px;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;color:#1e293b;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;font-family:inherit}.allday-chip:hover{opacity:.85}.week-body{display:grid;grid-template-columns:60px repeat(7,1fr);flex:1;overflow-y:scroll}.time-col{display:flex;flex-direction:column;border-right:1px solid #e2e8f0;flex-shrink:0}.time-slot-label{height:60px;display:flex;align-items:flex-start;justify-content:flex-end;padding:4px 8px 0 0;font-size:.6875rem;color:#64748b;font-weight:500;border-bottom:1px solid #f1f5f9;flex-shrink:0;box-sizing:border-box}.day-col{position:relative;border-right:1px solid #f1f5f9;min-width:0}.day-col.clickable{cursor:pointer}.day-col:last-child{border-right:none}.day-col.today{background:#fafbff}.time-slot{height:60px;border-bottom:1px solid #f1f5f9;box-sizing:border-box}.day-col.clickable .time-slot:hover{background:#f8fafc}.timed-event{position:absolute;min-height:20px;border:0;border-radius:6px;padding:3px 6px;overflow:hidden;cursor:pointer;box-sizing:border-box;border-left:3px solid transparent;display:flex;flex-direction:column;align-items:flex-start;gap:1px;box-shadow:0 1px 3px #00000014;text-align:left;font-family:inherit}.timed-event:hover{opacity:.85}.te-title{font-size:.6875rem;font-weight:600;color:#1e293b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.te-time{font-size:.625rem;color:#475569}.agenda-view{overflow-y:auto}.agenda-group{display:flex;border-bottom:1px solid #f1f5f9}.agenda-date-hdr{width:100px;flex-shrink:0;padding:16px 12px;display:flex;flex-direction:column;gap:4px;background:#f8fafc;border-right:2px solid #e2e8f0}.ag-dow{font-size:.6875rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.04em}.ag-date{font-size:.8125rem;font-weight:600;color:#374151}.agenda-events{flex:1;display:flex;flex-direction:column;min-width:0}.agenda-event{display:flex;align-items:stretch;padding:10px 12px;cursor:pointer;border:0;border-bottom:1px solid #f8fafc;background:none;text-align:left;width:100%;font-family:inherit;transition:background .1s}.agenda-event:hover{background:#f8fafc}.agenda-event:last-child{border-bottom:none}.ae-color-bar{display:block;width:4px;border-radius:4px;flex-shrink:0;margin-right:12px}.ae-body{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.ae-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.ae-title{font-size:.9375rem;font-weight:600;color:#111827}.ae-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.ae-meta-item{font-size:.8125rem;color:#6b7280}@media(prefers-reduced-motion:reduce){.btn-nav,.btn-today,.filter-chip,.month-cell,.agenda-event{transition:none}}@media(pointer:coarse),(max-width:480px){.btn-nav,.btn-today,.filter-chip,.event-chip,.more-events,.allday-chip,.agenda-event{min-height:44px}.btn-nav{min-width:44px}}@media(max-width:768px){.cal-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 12px}.toolbar-left{flex:1 1 auto}.toolbar-right{flex:0 1 auto;min-width:0;max-width:100%}.toolbar-center{display:none}.period-label{font-size:1.875rem}.toolbar-right{justify-content:flex-end}.mobile-summary{display:block;margin-bottom:4px;flex-shrink:0}.mobile-summary:empty{display:none}.filter-chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;-webkit-overflow-scrolling:touch}.filter-main{flex-basis:100%}.month-view,.cal-skeleton,.week-view{overflow-x:auto;-webkit-overflow-scrolling:touch}.month-grid,.skel-month-grid,.skel-dow-row{min-width:560px}.month-row{flex-basis:80px}.month-cell{min-height:80px}.week-header,.allday-row,.week-body{min-width:640px}.agenda-date-hdr{width:76px;padding:12px 8px}.ae-title{font-size:.875rem}}@media(max-width:640px){.event-chip.stacked.has-head .chip-title{display:none}}@media(max-width:640px){.cal-toolbar{padding:14px}.period-label{font-size:1.625rem}.filter-bar{padding:10px 14px 12px}.filter-nav{width:100%;margin-left:0}.filter-nav .nav-controls{display:flex;width:100%}.filter-nav .btn-today{flex:1 1 auto}.chip-head{flex-wrap:wrap;row-gap:0;flex-shrink:1;min-width:0}.chip-time{white-space:normal;line-height:1.1;flex-shrink:1;min-width:0;overflow-wrap:anywhere}.event-chip.stacked{flex-wrap:nowrap}.month-view,.cal-skeleton{overflow-x:hidden}.month-grid,.skel-month-grid,.skel-dow-row{min-width:0}.month-dow{padding:8px 2px;font-size:.6875rem;letter-spacing:0}.month-row{flex-basis:72px}.month-cell{min-height:72px;padding:3px 2px 2px}.day-num{width:22px;height:22px;line-height:22px;font-size:.75rem;margin-bottom:2px}.cell-events{gap:1px}.event-chip{min-height:24px;padding:1px 3px;font-size:.625rem;gap:2px}.more-events{min-height:24px;padding:1px 3px;font-size:.625rem;white-space:normal;line-height:1.1;max-width:100%}}@media(max-width:480px){.dow-full{display:none}.dow-short{display:inline}}\n"],
|
|
41168
|
+
styles: [":host{display:flex;flex-direction:column;gap:0;height:100%;min-height:0}.cal-header{background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 2px #0f172a0a;margin-bottom:12px;flex-shrink:0}.cal-toolbar{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;padding:18px 20px;gap:16px;flex-shrink:0}.toolbar-left{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;column-gap:20px;row-gap:8px;min-width:0}.toolbar-center{display:flex;align-items:center;justify-content:center;gap:10px}.toolbar-right{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.toolbar-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:nowrap}.toolbar-actions:empty{display:none}ui-pill-tabs+.toolbar-actions:not(:empty){margin-left:4px;padding-left:12px;border-left:1px solid #e2e8f0;align-self:stretch}@media(max-width:480px){.toolbar-actions{flex-wrap:wrap}}.period-label{font-size:2.5rem;font-weight:800;line-height:1.15;letter-spacing:-.025em;color:#0f172a;margin:0;min-width:0}.pl-sub{font-weight:600;color:#64748b}.nav-controls{display:inline-flex;align-items:center}.nav-controls>*+*{margin-left:-1px}.btn-nav{width:38px;height:38px;border:1px solid #cbd5e1;background:#fff;font-family:inherit;position:relative;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#475569;transition:background .12s,color .12s}.nav-controls>.btn-nav:first-child{border-radius:10px 0 0 10px}.nav-controls>.btn-nav:last-child{border-radius:0 10px 10px 0}.btn-today{padding:0 18px;height:38px;border:1px solid #cbd5e1;background:#fff;border-radius:0;font-family:inherit;position:relative;font-size:.9375rem;font-weight:600;color:#1d4ed8;cursor:pointer;transition:background .12s}.btn-nav:hover,.btn-today:hover{background:#eff6ff;color:#1d4ed8;z-index:1}.btn-nav:active,.btn-today:active{background:#dbeafe}.btn-nav:focus-visible,.btn-today:focus-visible,.filter-chip:focus-visible,.event-chip:focus-visible,.more-events:focus-visible,.allday-chip:focus-visible,.timed-event:focus-visible,.agenda-event:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.month-cell:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.slot-add:focus,.slot-add:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.mobile-summary{display:none}.filter-bar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px 16px;padding:12px 20px 14px;border-top:1px solid #eef2f7;background:#f8fafc;border-radius:0 0 12px 12px;flex-shrink:0}.filter-main{display:flex;flex-direction:column;gap:8px;flex:1 1 auto;min-width:0}.filter-nav{margin-left:auto;flex-shrink:0}.filter-bar-label{font-size:.6875rem;font-weight:700;color:#64748b;text-transform:uppercase;letter-spacing:.06em}.filter-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.filter-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 12px;border-radius:20px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s;white-space:nowrap;font-family:inherit}.filter-chip:hover{border-color:#cbd5e1;background:#f8fafc}.filter-chip.active-all{background:#1e293b;color:#fff;border-color:#1e293b}.filter-chip.active-all .chip-count{background:#fff3;color:#fff}.filter-chip.active-type{background:var(--chip-bg, #f1f5f9);color:#1e293b;border-color:var(--chip-color);font-weight:600}.filter-chip.active-type .chip-count{background:var(--chip-color);color:#fff}.chip-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.chip-count{font-size:.6875rem;font-weight:700;background:#f1f5f9;background:color-mix(in srgb,var(--chip-color, #64748b) 14%,#fff);color:#475569;padding:1px 8px;border-radius:999px;min-width:18px;text-align:center;box-sizing:border-box}.cal-skeleton,.outline-grid,.month-view,.week-view,.agenda-view{flex:1;display:flex;flex-direction:column;min-height:0;background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.skel-dow-row{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;padding:12px 10px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.skel-dow{display:flex;justify-content:center}.skel-month-grid{display:grid;grid-template-columns:repeat(7,1fr);grid-template-rows:repeat(6,minmax(80px,1fr));flex:1}.skel-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:8px 6px;display:flex;flex-direction:column;gap:6px}.skel-cell:nth-child(7n){border-right:none}.cal-outline{flex:1;display:flex;flex-direction:column;min-height:0}.cal-outline ui-skeleton{display:block;flex-shrink:0}.skel-period-wrap{width:240px;max-width:100%;min-width:0}.skel-nav-controls{gap:2px}.skel-nav-controls>*+*{margin-left:0}.skel-tabs{display:flex;align-items:center;gap:6px}.skel-tabs+.toolbar-actions:not(:empty){margin-left:4px;padding-left:12px;border-left:1px solid #e2e8f0;align-self:stretch}.skel-week-grid{display:grid;grid-template-columns:repeat(7,1fr);flex:1;min-height:360px}.skel-agenda{display:flex;flex-direction:column;flex:1}.skel-row{display:flex;align-items:center;gap:16px;padding:16px 12px;border-bottom:1px solid #f1f5f9}.skel-row-body{display:flex;flex-direction:column;gap:8px;flex:1;min-width:0}.month-grid{display:flex;flex-direction:column;flex:1;min-height:0;overflow:auto}.month-header{display:grid;grid-template-columns:repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;position:sticky;top:0;z-index:1}.month-dow{padding:10px 8px;font-size:.75rem;font-weight:600;color:#6b7280;text-align:center;text-transform:uppercase;letter-spacing:.04em}.dow-short{display:none}.month-row{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));flex:1 0 120px}.month-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:6px 6px 4px;min-height:120px;transition:background .1s;min-width:0;box-sizing:border-box}.month-cell.clickable{cursor:pointer}.month-cell.clickable:hover{background:#f8fafc}.month-cell:nth-child(7n){border-right:none}.month-cell.other-month{background:#fafafa}.month-cell.other-month .day-num{color:#64748b}.month-cell.today{background:#eff6ff}.day-num{display:inline-block;width:26px;height:26px;line-height:26px;text-align:center;border-radius:50%;font-size:.8125rem;font-weight:500;color:#374151;margin-bottom:4px}.today-badge{background:#2563eb;color:#fff;font-weight:700}.cell-events{display:flex;flex-direction:column;gap:2px}.event-chip{display:flex;align-items:center;gap:3px;padding:2px 6px;width:100%;box-sizing:border-box;text-align:left;font-family:inherit;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;cursor:pointer;overflow:hidden}.event-chip:hover{opacity:.85}.event-chip.stacked{flex-direction:column;align-items:flex-start;gap:0}.chip-head{display:inline-flex;align-items:center;gap:3px;flex-shrink:0}.chip-icon{flex-shrink:0}.chip-time{font-weight:700;flex-shrink:0;color:#1e293b}.chip-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#1e293b;min-width:0;max-width:100%}.strike{text-decoration:line-through}.chip-src{font-size:.625rem;font-weight:700;margin-left:auto;flex-shrink:0;color:#1e293b}.more-events{font-size:.6875rem;color:#2563eb;font-weight:600;cursor:pointer;padding:1px 6px;border:0;background:none;text-align:left;font-family:inherit}.more-events:hover{text-decoration:underline}.week-view{overflow:auto}.week-header{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;overflow-y:scroll}.time-gutter{border-right:1px solid #e2e8f0}.week-day-hdr{display:flex;flex-direction:column;align-items:center;padding:10px 4px;border-right:1px solid #f1f5f9}.week-day-hdr.today{background:#eff6ff}.week-day-hdr:last-child{border-right:none}.wdh-dow{font-size:.6875rem;font-weight:600;color:#6b7280;text-transform:uppercase}.wdh-num{width:28px;height:28px;line-height:28px;text-align:center;border-radius:50%;font-size:.9375rem;font-weight:600;color:#374151;margin-top:2px}.wdh-num.today-badge{background:#2563eb;color:#fff;font-weight:700}.allday-row{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;min-height:32px;flex-shrink:0;overflow-y:scroll}.allday-label{font-size:.625rem;color:#64748b;font-weight:600;text-transform:uppercase;display:flex;align-items:center;justify-content:center}.slot-add{position:absolute;top:2px;left:2px;z-index:3;width:1px;height:1px;padding:0;margin:0;overflow:hidden;clip-path:inset(50%);border:0;white-space:nowrap;font-family:inherit}.slot-add:focus,.slot-add:focus-visible{width:auto;height:auto;padding:2px 8px;clip-path:none;background:#1e293b;color:#fff;border-radius:4px;font-size:.75rem;font-weight:600}.allday-cell{position:relative;border-right:1px solid #f1f5f9;padding:3px 4px;display:flex;flex-direction:column;gap:2px;min-width:0}.allday-cell.clickable{cursor:pointer}.allday-cell:last-child{border-right:none}.allday-chip{padding:2px 6px;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;color:#1e293b;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;font-family:inherit}.allday-chip:hover{opacity:.85}.week-body{display:grid;grid-template-columns:60px repeat(7,1fr);flex:1;overflow-y:scroll}.time-col{display:flex;flex-direction:column;border-right:1px solid #e2e8f0;flex-shrink:0}.time-slot-label{height:60px;display:flex;align-items:flex-start;justify-content:flex-end;padding:4px 8px 0 0;font-size:.6875rem;color:#64748b;font-weight:500;border-bottom:1px solid #f1f5f9;flex-shrink:0;box-sizing:border-box}.day-col{position:relative;border-right:1px solid #f1f5f9;min-width:0}.day-col.clickable{cursor:pointer}.day-col:last-child{border-right:none}.day-col.today{background:#fafbff}.time-slot{height:60px;border-bottom:1px solid #f1f5f9;box-sizing:border-box}.day-col.clickable .time-slot:hover{background:#f8fafc}.timed-event{position:absolute;min-height:20px;border:0;border-radius:6px;padding:3px 6px;overflow:hidden;cursor:pointer;box-sizing:border-box;border-left:3px solid transparent;display:flex;flex-direction:column;align-items:flex-start;gap:1px;box-shadow:0 1px 3px #00000014;text-align:left;font-family:inherit}.timed-event:hover{opacity:.85}.te-title{font-size:.6875rem;font-weight:600;color:#1e293b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.te-time{font-size:.625rem;color:#475569}.agenda-view{overflow-y:auto}.agenda-group{display:flex;border-bottom:1px solid #f1f5f9}.agenda-date-hdr{width:100px;flex-shrink:0;padding:16px 12px;display:flex;flex-direction:column;gap:4px;background:#f8fafc;border-right:2px solid #e2e8f0}.ag-dow{font-size:.6875rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.04em}.ag-date{font-size:.8125rem;font-weight:600;color:#374151}.agenda-events{flex:1;display:flex;flex-direction:column;min-width:0}.agenda-event{display:flex;align-items:stretch;padding:10px 12px;cursor:pointer;border:0;border-bottom:1px solid #f8fafc;background:none;text-align:left;width:100%;font-family:inherit;transition:background .1s}.agenda-event:hover{background:#f8fafc}.agenda-event:last-child{border-bottom:none}.ae-color-bar{display:block;width:4px;border-radius:4px;flex-shrink:0;margin-right:12px}.ae-body{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.ae-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.ae-title{font-size:.9375rem;font-weight:600;color:#111827}.ae-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.ae-meta-item{font-size:.8125rem;color:#6b7280}@media(prefers-reduced-motion:reduce){.btn-nav,.btn-today,.filter-chip,.month-cell,.agenda-event{transition:none}}@media(pointer:coarse),(max-width:480px){.btn-nav,.btn-today,.filter-chip,.event-chip,.more-events,.allday-chip,.agenda-event{min-height:44px}.btn-nav{min-width:44px}}@media(max-width:768px){.cal-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 12px}.toolbar-left{flex:1 1 auto}.toolbar-right{flex:0 1 auto;min-width:0;max-width:100%}.toolbar-center{display:none}.period-label{font-size:1.875rem}.toolbar-right{justify-content:flex-end}.mobile-summary{display:block;margin-bottom:4px;flex-shrink:0}.mobile-summary:empty{display:none}.filter-chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;-webkit-overflow-scrolling:touch}.filter-main{flex-basis:100%}.month-view,.cal-skeleton,.outline-grid,.week-view{overflow-x:auto;-webkit-overflow-scrolling:touch}.month-grid,.skel-month-grid,.skel-week-grid,.skel-dow-row{min-width:560px}.month-row{flex-basis:80px}.month-cell{min-height:80px}.week-header,.allday-row,.week-body{min-width:640px}.agenda-date-hdr{width:76px;padding:12px 8px}.ae-title{font-size:.875rem}}@media(max-width:640px){.event-chip.stacked.has-head .chip-title{display:none}}@media(max-width:640px){.cal-toolbar{padding:14px}.period-label{font-size:1.625rem}.filter-bar{padding:10px 14px 12px}.filter-nav{width:100%;margin-left:0}.filter-nav .nav-controls{display:flex;width:100%}.filter-nav .btn-today{flex:1 1 auto}.chip-head{flex-wrap:wrap;row-gap:0;flex-shrink:1;min-width:0}.chip-time{white-space:normal;line-height:1.1;flex-shrink:1;min-width:0;overflow-wrap:anywhere}.event-chip.stacked{flex-wrap:nowrap}.month-view,.cal-skeleton,.outline-grid{overflow-x:hidden}.month-grid,.skel-month-grid,.skel-week-grid,.skel-dow-row{min-width:0}.month-dow{padding:8px 2px;font-size:.6875rem;letter-spacing:0}.month-row{flex-basis:72px}.month-cell{min-height:72px;padding:3px 2px 2px}.day-num{width:22px;height:22px;line-height:22px;font-size:.75rem;margin-bottom:2px}.cell-events{gap:1px}.event-chip{min-height:24px;padding:1px 3px;font-size:.625rem;gap:2px}.more-events{min-height:24px;padding:1px 3px;font-size:.625rem;white-space:normal;line-height:1.1;max-width:100%}}@media(max-width:480px){.dow-full{display:none}.dow-short{display:inline}}\n"],
|
|
40827
41169
|
dependencies: [
|
|
40828
41170
|
{
|
|
40829
41171
|
kind: "component",
|
|
@@ -40908,6 +41250,97 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
40908
41250
|
ToastComponent
|
|
40909
41251
|
],
|
|
40910
41252
|
template: `
|
|
41253
|
+
@if (showOutline()) {
|
|
41254
|
+
<!-- First load: an outline of the whole page (toolbar, filter bar, grid) built only from decorative skeletons. One status region. -->
|
|
41255
|
+
<div class="cal-outline" data-testid="calendar-skeleton" role="status" aria-busy="true" aria-label="Loading calendar">
|
|
41256
|
+
<div class="cal-header">
|
|
41257
|
+
<div class="cal-toolbar">
|
|
41258
|
+
<div class="toolbar-left">
|
|
41259
|
+
<div class="skel-period-wrap"><ui-skeleton class="skel-period" [height]="40" [radius]="8" /></div>
|
|
41260
|
+
@if (!filters().length) {
|
|
41261
|
+
<div class="nav-controls skel-nav-controls">
|
|
41262
|
+
<ui-skeleton class="skel-nav" [height]="38" width="38px" [radius]="10" />
|
|
41263
|
+
<ui-skeleton class="skel-nav" [height]="38" width="76px" [radius]="10" />
|
|
41264
|
+
<ui-skeleton class="skel-nav" [height]="38" width="38px" [radius]="10" />
|
|
41265
|
+
</div>
|
|
41266
|
+
}
|
|
41267
|
+
</div>
|
|
41268
|
+
<div class="toolbar-center"></div>
|
|
41269
|
+
<div class="toolbar-right">
|
|
41270
|
+
@if (viewTabs().length > 1) {
|
|
41271
|
+
<div class="skel-tabs">
|
|
41272
|
+
@for (t of viewTabs(); track t.key) { <ui-skeleton class="skel-tab" [height]="34" width="72px" [radius]="17" /> }
|
|
41273
|
+
</div>
|
|
41274
|
+
}
|
|
41275
|
+
@if (loadingActionSlots().length) {
|
|
41276
|
+
<div class="toolbar-actions">
|
|
41277
|
+
@for (a of loadingActionSlots(); track a) { <ui-skeleton class="skel-action" [height]="38" width="112px" [radius]="10" /> }
|
|
41278
|
+
</div>
|
|
41279
|
+
}
|
|
41280
|
+
</div>
|
|
41281
|
+
</div>
|
|
41282
|
+
@if (filters().length) {
|
|
41283
|
+
<div class="filter-bar">
|
|
41284
|
+
<div class="filter-main">
|
|
41285
|
+
@if (filterLabel()) { <ui-skeleton class="skel-filter-label" [height]="12" width="80px" [radius]="4" /> }
|
|
41286
|
+
<div class="filter-chips">
|
|
41287
|
+
<ui-skeleton class="skel-chip" [height]="28" width="56px" [radius]="14" />
|
|
41288
|
+
@for (f of filters(); track f.value) { <ui-skeleton class="skel-chip" [height]="28" width="88px" [radius]="14" /> }
|
|
41289
|
+
</div>
|
|
41290
|
+
</div>
|
|
41291
|
+
<div class="filter-nav">
|
|
41292
|
+
<div class="nav-controls skel-nav-controls">
|
|
41293
|
+
<ui-skeleton class="skel-nav" [height]="38" width="38px" [radius]="10" />
|
|
41294
|
+
<ui-skeleton class="skel-nav" [height]="38" width="76px" [radius]="10" />
|
|
41295
|
+
<ui-skeleton class="skel-nav" [height]="38" width="38px" [radius]="10" />
|
|
41296
|
+
</div>
|
|
41297
|
+
</div>
|
|
41298
|
+
</div>
|
|
41299
|
+
}
|
|
41300
|
+
</div>
|
|
41301
|
+
<div class="outline-grid">
|
|
41302
|
+
@if (view() !== 'agenda') {
|
|
41303
|
+
<div class="skel-dow-row">
|
|
41304
|
+
@for (d of weekDayLabels; track d) { <div class="skel-dow"><ui-skeleton [height]="16" width="36px" [radius]="4" /></div> }
|
|
41305
|
+
</div>
|
|
41306
|
+
}
|
|
41307
|
+
@switch (view()) {
|
|
41308
|
+
@case ('month') {
|
|
41309
|
+
<div class="skel-month-grid">
|
|
41310
|
+
@for (i of skeletonCells; track i) {
|
|
41311
|
+
<div class="skel-cell">
|
|
41312
|
+
<ui-skeleton [height]="22" width="22px" [radius]="11" />
|
|
41313
|
+
@if (i % 3 === 0) { <ui-skeleton [height]="14" [radius]="3" /> }
|
|
41314
|
+
@if (i % 5 === 0) { <ui-skeleton [height]="14" width="72%" [radius]="3" /> }
|
|
41315
|
+
</div>
|
|
41316
|
+
}
|
|
41317
|
+
</div>
|
|
41318
|
+
}
|
|
41319
|
+
@case ('week') {
|
|
41320
|
+
<div class="skel-week-grid">
|
|
41321
|
+
@for (i of skeletonDays; track i) {
|
|
41322
|
+
<div class="skel-cell">
|
|
41323
|
+
<ui-skeleton [height]="14" [radius]="3" />
|
|
41324
|
+
@if (i % 2 === 0) { <ui-skeleton [height]="48" [radius]="6" /> }
|
|
41325
|
+
@if (i % 3 === 0) { <ui-skeleton [height]="32" width="72%" [radius]="6" /> }
|
|
41326
|
+
</div>
|
|
41327
|
+
}
|
|
41328
|
+
</div>
|
|
41329
|
+
}
|
|
41330
|
+
@default {
|
|
41331
|
+
<div class="skel-agenda">
|
|
41332
|
+
@for (i of skeletonRows; track i) {
|
|
41333
|
+
<div class="skel-row">
|
|
41334
|
+
<ui-skeleton class="skel-row-date" [height]="40" width="64px" [radius]="6" />
|
|
41335
|
+
<div class="skel-row-body"><ui-skeleton [height]="16" width="60%" [radius]="4" /><ui-skeleton [height]="12" width="35%" [radius]="4" /></div>
|
|
41336
|
+
</div>
|
|
41337
|
+
}
|
|
41338
|
+
</div>
|
|
41339
|
+
}
|
|
41340
|
+
}
|
|
41341
|
+
</div>
|
|
41342
|
+
</div>
|
|
41343
|
+
} @else {
|
|
40911
41344
|
<!-- Previous / Today / Next: right-aligned in the filter row when there is one, else next to the period label -->
|
|
40912
41345
|
<ng-template #navControls>
|
|
40913
41346
|
<div class="nav-controls">
|
|
@@ -40932,7 +41365,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
40932
41365
|
@if (viewTabs().length > 1) {
|
|
40933
41366
|
<ui-pill-tabs ariaLabel="Calendar view" name="ui-calendar-view" [tabs]="viewTabs()" [activeKey]="view()" (tabChange)="setView($any($event))" />
|
|
40934
41367
|
}
|
|
40935
|
-
<ng-content select="[calendar-actions]"
|
|
41368
|
+
<div class="toolbar-actions"><ng-content select="[calendar-actions]" /></div>
|
|
40936
41369
|
</div>
|
|
40937
41370
|
</div>
|
|
40938
41371
|
|
|
@@ -41122,9 +41555,10 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
41122
41555
|
}
|
|
41123
41556
|
}
|
|
41124
41557
|
}
|
|
41558
|
+
}
|
|
41125
41559
|
<ui-toast />
|
|
41126
41560
|
`,
|
|
41127
|
-
styles: [":host{display:flex;flex-direction:column;gap:0;height:100%;min-height:0}.cal-header{background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 2px #0f172a0a;margin-bottom:12px;flex-shrink:0}.cal-toolbar{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;padding:18px 20px;gap:16px;flex-shrink:0}.toolbar-left{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;column-gap:20px;row-gap:8px;min-width:0}.toolbar-center{display:flex;align-items:center;justify-content:center;gap:10px}.toolbar-right{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.period-label{font-size:2.5rem;font-weight:800;line-height:1.15;letter-spacing:-.025em;color:#0f172a;margin:0;min-width:0}.pl-sub{font-weight:600;color:#64748b}.nav-controls{display:inline-flex;align-items:center}.nav-controls>*+*{margin-left:-1px}.btn-nav{width:38px;height:38px;border:1px solid #cbd5e1;background:#fff;font-family:inherit;position:relative;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#475569;transition:background .12s,color .12s}.nav-controls>.btn-nav:first-child{border-radius:10px 0 0 10px}.nav-controls>.btn-nav:last-child{border-radius:0 10px 10px 0}.btn-today{padding:0 18px;height:38px;border:1px solid #cbd5e1;background:#fff;border-radius:0;font-family:inherit;position:relative;font-size:.9375rem;font-weight:600;color:#1d4ed8;cursor:pointer;transition:background .12s}.btn-nav:hover,.btn-today:hover{background:#eff6ff;color:#1d4ed8;z-index:1}.btn-nav:active,.btn-today:active{background:#dbeafe}.btn-nav:focus-visible,.btn-today:focus-visible,.filter-chip:focus-visible,.event-chip:focus-visible,.more-events:focus-visible,.allday-chip:focus-visible,.timed-event:focus-visible,.agenda-event:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.month-cell:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.slot-add:focus,.slot-add:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.mobile-summary{display:none}.filter-bar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px 16px;padding:12px 20px 14px;border-top:1px solid #eef2f7;background:#f8fafc;border-radius:0 0 12px 12px;flex-shrink:0}.filter-main{display:flex;flex-direction:column;gap:8px;flex:1 1 auto;min-width:0}.filter-nav{margin-left:auto;flex-shrink:0}.filter-bar-label{font-size:.6875rem;font-weight:700;color:#64748b;text-transform:uppercase;letter-spacing:.06em}.filter-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.filter-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 12px;border-radius:20px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s;white-space:nowrap;font-family:inherit}.filter-chip:hover{border-color:#cbd5e1;background:#f8fafc}.filter-chip.active-all{background:#1e293b;color:#fff;border-color:#1e293b}.filter-chip.active-all .chip-count{background:#fff3;color:#fff}.filter-chip.active-type{background:var(--chip-bg, #f1f5f9);color:#1e293b;border-color:var(--chip-color);font-weight:600}.filter-chip.active-type .chip-count{background:var(--chip-color);color:#fff}.chip-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.chip-count{font-size:.6875rem;font-weight:700;background:#f1f5f9;background:color-mix(in srgb,var(--chip-color, #64748b) 14%,#fff);color:#475569;padding:1px 8px;border-radius:999px;min-width:18px;text-align:center;box-sizing:border-box}.cal-skeleton,.month-view,.week-view,.agenda-view{flex:1;display:flex;flex-direction:column;min-height:0;background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.skel-dow-row{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;padding:12px 10px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.skel-dow{display:flex;justify-content:center}.skel-month-grid{display:grid;grid-template-columns:repeat(7,1fr);grid-template-rows:repeat(6,minmax(80px,1fr));flex:1}.skel-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:8px 6px;display:flex;flex-direction:column;gap:6px}.skel-cell:nth-child(7n){border-right:none}.month-grid{display:flex;flex-direction:column;flex:1;min-height:0;overflow:auto}.month-header{display:grid;grid-template-columns:repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;position:sticky;top:0;z-index:1}.month-dow{padding:10px 8px;font-size:.75rem;font-weight:600;color:#6b7280;text-align:center;text-transform:uppercase;letter-spacing:.04em}.dow-short{display:none}.month-row{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));flex:1 0 120px}.month-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:6px 6px 4px;min-height:120px;transition:background .1s;min-width:0;box-sizing:border-box}.month-cell.clickable{cursor:pointer}.month-cell.clickable:hover{background:#f8fafc}.month-cell:nth-child(7n){border-right:none}.month-cell.other-month{background:#fafafa}.month-cell.other-month .day-num{color:#64748b}.month-cell.today{background:#eff6ff}.day-num{display:inline-block;width:26px;height:26px;line-height:26px;text-align:center;border-radius:50%;font-size:.8125rem;font-weight:500;color:#374151;margin-bottom:4px}.today-badge{background:#2563eb;color:#fff;font-weight:700}.cell-events{display:flex;flex-direction:column;gap:2px}.event-chip{display:flex;align-items:center;gap:3px;padding:2px 6px;width:100%;box-sizing:border-box;text-align:left;font-family:inherit;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;cursor:pointer;overflow:hidden}.event-chip:hover{opacity:.85}.event-chip.stacked{flex-direction:column;align-items:flex-start;gap:0}.chip-head{display:inline-flex;align-items:center;gap:3px;flex-shrink:0}.chip-icon{flex-shrink:0}.chip-time{font-weight:700;flex-shrink:0;color:#1e293b}.chip-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#1e293b;min-width:0;max-width:100%}.strike{text-decoration:line-through}.chip-src{font-size:.625rem;font-weight:700;margin-left:auto;flex-shrink:0;color:#1e293b}.more-events{font-size:.6875rem;color:#2563eb;font-weight:600;cursor:pointer;padding:1px 6px;border:0;background:none;text-align:left;font-family:inherit}.more-events:hover{text-decoration:underline}.week-view{overflow:auto}.week-header{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;overflow-y:scroll}.time-gutter{border-right:1px solid #e2e8f0}.week-day-hdr{display:flex;flex-direction:column;align-items:center;padding:10px 4px;border-right:1px solid #f1f5f9}.week-day-hdr.today{background:#eff6ff}.week-day-hdr:last-child{border-right:none}.wdh-dow{font-size:.6875rem;font-weight:600;color:#6b7280;text-transform:uppercase}.wdh-num{width:28px;height:28px;line-height:28px;text-align:center;border-radius:50%;font-size:.9375rem;font-weight:600;color:#374151;margin-top:2px}.wdh-num.today-badge{background:#2563eb;color:#fff;font-weight:700}.allday-row{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;min-height:32px;flex-shrink:0;overflow-y:scroll}.allday-label{font-size:.625rem;color:#64748b;font-weight:600;text-transform:uppercase;display:flex;align-items:center;justify-content:center}.slot-add{position:absolute;top:2px;left:2px;z-index:3;width:1px;height:1px;padding:0;margin:0;overflow:hidden;clip-path:inset(50%);border:0;white-space:nowrap;font-family:inherit}.slot-add:focus,.slot-add:focus-visible{width:auto;height:auto;padding:2px 8px;clip-path:none;background:#1e293b;color:#fff;border-radius:4px;font-size:.75rem;font-weight:600}.allday-cell{position:relative;border-right:1px solid #f1f5f9;padding:3px 4px;display:flex;flex-direction:column;gap:2px;min-width:0}.allday-cell.clickable{cursor:pointer}.allday-cell:last-child{border-right:none}.allday-chip{padding:2px 6px;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;color:#1e293b;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;font-family:inherit}.allday-chip:hover{opacity:.85}.week-body{display:grid;grid-template-columns:60px repeat(7,1fr);flex:1;overflow-y:scroll}.time-col{display:flex;flex-direction:column;border-right:1px solid #e2e8f0;flex-shrink:0}.time-slot-label{height:60px;display:flex;align-items:flex-start;justify-content:flex-end;padding:4px 8px 0 0;font-size:.6875rem;color:#64748b;font-weight:500;border-bottom:1px solid #f1f5f9;flex-shrink:0;box-sizing:border-box}.day-col{position:relative;border-right:1px solid #f1f5f9;min-width:0}.day-col.clickable{cursor:pointer}.day-col:last-child{border-right:none}.day-col.today{background:#fafbff}.time-slot{height:60px;border-bottom:1px solid #f1f5f9;box-sizing:border-box}.day-col.clickable .time-slot:hover{background:#f8fafc}.timed-event{position:absolute;min-height:20px;border:0;border-radius:6px;padding:3px 6px;overflow:hidden;cursor:pointer;box-sizing:border-box;border-left:3px solid transparent;display:flex;flex-direction:column;align-items:flex-start;gap:1px;box-shadow:0 1px 3px #00000014;text-align:left;font-family:inherit}.timed-event:hover{opacity:.85}.te-title{font-size:.6875rem;font-weight:600;color:#1e293b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.te-time{font-size:.625rem;color:#475569}.agenda-view{overflow-y:auto}.agenda-group{display:flex;border-bottom:1px solid #f1f5f9}.agenda-date-hdr{width:100px;flex-shrink:0;padding:16px 12px;display:flex;flex-direction:column;gap:4px;background:#f8fafc;border-right:2px solid #e2e8f0}.ag-dow{font-size:.6875rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.04em}.ag-date{font-size:.8125rem;font-weight:600;color:#374151}.agenda-events{flex:1;display:flex;flex-direction:column;min-width:0}.agenda-event{display:flex;align-items:stretch;padding:10px 12px;cursor:pointer;border:0;border-bottom:1px solid #f8fafc;background:none;text-align:left;width:100%;font-family:inherit;transition:background .1s}.agenda-event:hover{background:#f8fafc}.agenda-event:last-child{border-bottom:none}.ae-color-bar{display:block;width:4px;border-radius:4px;flex-shrink:0;margin-right:12px}.ae-body{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.ae-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.ae-title{font-size:.9375rem;font-weight:600;color:#111827}.ae-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.ae-meta-item{font-size:.8125rem;color:#6b7280}@media(prefers-reduced-motion:reduce){.btn-nav,.btn-today,.filter-chip,.month-cell,.agenda-event{transition:none}}@media(pointer:coarse),(max-width:480px){.btn-nav,.btn-today,.filter-chip,.event-chip,.more-events,.allday-chip,.agenda-event{min-height:44px}.btn-nav{min-width:44px}}@media(max-width:768px){.cal-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 12px}.toolbar-left{flex:1 1 auto}.toolbar-right{flex:0 1 auto;min-width:0;max-width:100%}.toolbar-center{display:none}.period-label{font-size:1.875rem}.toolbar-right{justify-content:flex-end}.mobile-summary{display:block;margin-bottom:4px;flex-shrink:0}.mobile-summary:empty{display:none}.filter-chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;-webkit-overflow-scrolling:touch}.filter-main{flex-basis:100%}.month-view,.cal-skeleton,.week-view{overflow-x:auto;-webkit-overflow-scrolling:touch}.month-grid,.skel-month-grid,.skel-dow-row{min-width:560px}.month-row{flex-basis:80px}.month-cell{min-height:80px}.week-header,.allday-row,.week-body{min-width:640px}.agenda-date-hdr{width:76px;padding:12px 8px}.ae-title{font-size:.875rem}}@media(max-width:640px){.event-chip.stacked.has-head .chip-title{display:none}}@media(max-width:640px){.cal-toolbar{padding:14px}.period-label{font-size:1.625rem}.filter-bar{padding:10px 14px 12px}.filter-nav{width:100%;margin-left:0}.filter-nav .nav-controls{display:flex;width:100%}.filter-nav .btn-today{flex:1 1 auto}.chip-head{flex-wrap:wrap;row-gap:0;flex-shrink:1;min-width:0}.chip-time{white-space:normal;line-height:1.1;flex-shrink:1;min-width:0;overflow-wrap:anywhere}.event-chip.stacked{flex-wrap:nowrap}.month-view,.cal-skeleton{overflow-x:hidden}.month-grid,.skel-month-grid,.skel-dow-row{min-width:0}.month-dow{padding:8px 2px;font-size:.6875rem;letter-spacing:0}.month-row{flex-basis:72px}.month-cell{min-height:72px;padding:3px 2px 2px}.day-num{width:22px;height:22px;line-height:22px;font-size:.75rem;margin-bottom:2px}.cell-events{gap:1px}.event-chip{min-height:24px;padding:1px 3px;font-size:.625rem;gap:2px}.more-events{min-height:24px;padding:1px 3px;font-size:.625rem;white-space:normal;line-height:1.1;max-width:100%}}@media(max-width:480px){.dow-full{display:none}.dow-short{display:inline}}\n"]
|
|
41561
|
+
styles: [":host{display:flex;flex-direction:column;gap:0;height:100%;min-height:0}.cal-header{background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 1px 2px #0f172a0a;margin-bottom:12px;flex-shrink:0}.cal-toolbar{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;padding:18px 20px;gap:16px;flex-shrink:0}.toolbar-left{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;column-gap:20px;row-gap:8px;min-width:0}.toolbar-center{display:flex;align-items:center;justify-content:center;gap:10px}.toolbar-right{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.toolbar-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:nowrap}.toolbar-actions:empty{display:none}ui-pill-tabs+.toolbar-actions:not(:empty){margin-left:4px;padding-left:12px;border-left:1px solid #e2e8f0;align-self:stretch}@media(max-width:480px){.toolbar-actions{flex-wrap:wrap}}.period-label{font-size:2.5rem;font-weight:800;line-height:1.15;letter-spacing:-.025em;color:#0f172a;margin:0;min-width:0}.pl-sub{font-weight:600;color:#64748b}.nav-controls{display:inline-flex;align-items:center}.nav-controls>*+*{margin-left:-1px}.btn-nav{width:38px;height:38px;border:1px solid #cbd5e1;background:#fff;font-family:inherit;position:relative;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#475569;transition:background .12s,color .12s}.nav-controls>.btn-nav:first-child{border-radius:10px 0 0 10px}.nav-controls>.btn-nav:last-child{border-radius:0 10px 10px 0}.btn-today{padding:0 18px;height:38px;border:1px solid #cbd5e1;background:#fff;border-radius:0;font-family:inherit;position:relative;font-size:.9375rem;font-weight:600;color:#1d4ed8;cursor:pointer;transition:background .12s}.btn-nav:hover,.btn-today:hover{background:#eff6ff;color:#1d4ed8;z-index:1}.btn-nav:active,.btn-today:active{background:#dbeafe}.btn-nav:focus-visible,.btn-today:focus-visible,.filter-chip:focus-visible,.event-chip:focus-visible,.more-events:focus-visible,.allday-chip:focus-visible,.timed-event:focus-visible,.agenda-event:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.month-cell:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.slot-add:focus,.slot-add:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.mobile-summary{display:none}.filter-bar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px 16px;padding:12px 20px 14px;border-top:1px solid #eef2f7;background:#f8fafc;border-radius:0 0 12px 12px;flex-shrink:0}.filter-main{display:flex;flex-direction:column;gap:8px;flex:1 1 auto;min-width:0}.filter-nav{margin-left:auto;flex-shrink:0}.filter-bar-label{font-size:.6875rem;font-weight:700;color:#64748b;text-transform:uppercase;letter-spacing:.06em}.filter-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.filter-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 12px;border-radius:20px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s;white-space:nowrap;font-family:inherit}.filter-chip:hover{border-color:#cbd5e1;background:#f8fafc}.filter-chip.active-all{background:#1e293b;color:#fff;border-color:#1e293b}.filter-chip.active-all .chip-count{background:#fff3;color:#fff}.filter-chip.active-type{background:var(--chip-bg, #f1f5f9);color:#1e293b;border-color:var(--chip-color);font-weight:600}.filter-chip.active-type .chip-count{background:var(--chip-color);color:#fff}.chip-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.chip-count{font-size:.6875rem;font-weight:700;background:#f1f5f9;background:color-mix(in srgb,var(--chip-color, #64748b) 14%,#fff);color:#475569;padding:1px 8px;border-radius:999px;min-width:18px;text-align:center;box-sizing:border-box}.cal-skeleton,.outline-grid,.month-view,.week-view,.agenda-view{flex:1;display:flex;flex-direction:column;min-height:0;background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.skel-dow-row{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;padding:12px 10px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.skel-dow{display:flex;justify-content:center}.skel-month-grid{display:grid;grid-template-columns:repeat(7,1fr);grid-template-rows:repeat(6,minmax(80px,1fr));flex:1}.skel-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:8px 6px;display:flex;flex-direction:column;gap:6px}.skel-cell:nth-child(7n){border-right:none}.cal-outline{flex:1;display:flex;flex-direction:column;min-height:0}.cal-outline ui-skeleton{display:block;flex-shrink:0}.skel-period-wrap{width:240px;max-width:100%;min-width:0}.skel-nav-controls{gap:2px}.skel-nav-controls>*+*{margin-left:0}.skel-tabs{display:flex;align-items:center;gap:6px}.skel-tabs+.toolbar-actions:not(:empty){margin-left:4px;padding-left:12px;border-left:1px solid #e2e8f0;align-self:stretch}.skel-week-grid{display:grid;grid-template-columns:repeat(7,1fr);flex:1;min-height:360px}.skel-agenda{display:flex;flex-direction:column;flex:1}.skel-row{display:flex;align-items:center;gap:16px;padding:16px 12px;border-bottom:1px solid #f1f5f9}.skel-row-body{display:flex;flex-direction:column;gap:8px;flex:1;min-width:0}.month-grid{display:flex;flex-direction:column;flex:1;min-height:0;overflow:auto}.month-header{display:grid;grid-template-columns:repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;position:sticky;top:0;z-index:1}.month-dow{padding:10px 8px;font-size:.75rem;font-weight:600;color:#6b7280;text-align:center;text-transform:uppercase;letter-spacing:.04em}.dow-short{display:none}.month-row{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));flex:1 0 120px}.month-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:6px 6px 4px;min-height:120px;transition:background .1s;min-width:0;box-sizing:border-box}.month-cell.clickable{cursor:pointer}.month-cell.clickable:hover{background:#f8fafc}.month-cell:nth-child(7n){border-right:none}.month-cell.other-month{background:#fafafa}.month-cell.other-month .day-num{color:#64748b}.month-cell.today{background:#eff6ff}.day-num{display:inline-block;width:26px;height:26px;line-height:26px;text-align:center;border-radius:50%;font-size:.8125rem;font-weight:500;color:#374151;margin-bottom:4px}.today-badge{background:#2563eb;color:#fff;font-weight:700}.cell-events{display:flex;flex-direction:column;gap:2px}.event-chip{display:flex;align-items:center;gap:3px;padding:2px 6px;width:100%;box-sizing:border-box;text-align:left;font-family:inherit;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;cursor:pointer;overflow:hidden}.event-chip:hover{opacity:.85}.event-chip.stacked{flex-direction:column;align-items:flex-start;gap:0}.chip-head{display:inline-flex;align-items:center;gap:3px;flex-shrink:0}.chip-icon{flex-shrink:0}.chip-time{font-weight:700;flex-shrink:0;color:#1e293b}.chip-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#1e293b;min-width:0;max-width:100%}.strike{text-decoration:line-through}.chip-src{font-size:.625rem;font-weight:700;margin-left:auto;flex-shrink:0;color:#1e293b}.more-events{font-size:.6875rem;color:#2563eb;font-weight:600;cursor:pointer;padding:1px 6px;border:0;background:none;text-align:left;font-family:inherit}.more-events:hover{text-decoration:underline}.week-view{overflow:auto}.week-header{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;overflow-y:scroll}.time-gutter{border-right:1px solid #e2e8f0}.week-day-hdr{display:flex;flex-direction:column;align-items:center;padding:10px 4px;border-right:1px solid #f1f5f9}.week-day-hdr.today{background:#eff6ff}.week-day-hdr:last-child{border-right:none}.wdh-dow{font-size:.6875rem;font-weight:600;color:#6b7280;text-transform:uppercase}.wdh-num{width:28px;height:28px;line-height:28px;text-align:center;border-radius:50%;font-size:.9375rem;font-weight:600;color:#374151;margin-top:2px}.wdh-num.today-badge{background:#2563eb;color:#fff;font-weight:700}.allday-row{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;min-height:32px;flex-shrink:0;overflow-y:scroll}.allday-label{font-size:.625rem;color:#64748b;font-weight:600;text-transform:uppercase;display:flex;align-items:center;justify-content:center}.slot-add{position:absolute;top:2px;left:2px;z-index:3;width:1px;height:1px;padding:0;margin:0;overflow:hidden;clip-path:inset(50%);border:0;white-space:nowrap;font-family:inherit}.slot-add:focus,.slot-add:focus-visible{width:auto;height:auto;padding:2px 8px;clip-path:none;background:#1e293b;color:#fff;border-radius:4px;font-size:.75rem;font-weight:600}.allday-cell{position:relative;border-right:1px solid #f1f5f9;padding:3px 4px;display:flex;flex-direction:column;gap:2px;min-width:0}.allday-cell.clickable{cursor:pointer}.allday-cell:last-child{border-right:none}.allday-chip{padding:2px 6px;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;color:#1e293b;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;font-family:inherit}.allday-chip:hover{opacity:.85}.week-body{display:grid;grid-template-columns:60px repeat(7,1fr);flex:1;overflow-y:scroll}.time-col{display:flex;flex-direction:column;border-right:1px solid #e2e8f0;flex-shrink:0}.time-slot-label{height:60px;display:flex;align-items:flex-start;justify-content:flex-end;padding:4px 8px 0 0;font-size:.6875rem;color:#64748b;font-weight:500;border-bottom:1px solid #f1f5f9;flex-shrink:0;box-sizing:border-box}.day-col{position:relative;border-right:1px solid #f1f5f9;min-width:0}.day-col.clickable{cursor:pointer}.day-col:last-child{border-right:none}.day-col.today{background:#fafbff}.time-slot{height:60px;border-bottom:1px solid #f1f5f9;box-sizing:border-box}.day-col.clickable .time-slot:hover{background:#f8fafc}.timed-event{position:absolute;min-height:20px;border:0;border-radius:6px;padding:3px 6px;overflow:hidden;cursor:pointer;box-sizing:border-box;border-left:3px solid transparent;display:flex;flex-direction:column;align-items:flex-start;gap:1px;box-shadow:0 1px 3px #00000014;text-align:left;font-family:inherit}.timed-event:hover{opacity:.85}.te-title{font-size:.6875rem;font-weight:600;color:#1e293b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.te-time{font-size:.625rem;color:#475569}.agenda-view{overflow-y:auto}.agenda-group{display:flex;border-bottom:1px solid #f1f5f9}.agenda-date-hdr{width:100px;flex-shrink:0;padding:16px 12px;display:flex;flex-direction:column;gap:4px;background:#f8fafc;border-right:2px solid #e2e8f0}.ag-dow{font-size:.6875rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.04em}.ag-date{font-size:.8125rem;font-weight:600;color:#374151}.agenda-events{flex:1;display:flex;flex-direction:column;min-width:0}.agenda-event{display:flex;align-items:stretch;padding:10px 12px;cursor:pointer;border:0;border-bottom:1px solid #f8fafc;background:none;text-align:left;width:100%;font-family:inherit;transition:background .1s}.agenda-event:hover{background:#f8fafc}.agenda-event:last-child{border-bottom:none}.ae-color-bar{display:block;width:4px;border-radius:4px;flex-shrink:0;margin-right:12px}.ae-body{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.ae-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.ae-title{font-size:.9375rem;font-weight:600;color:#111827}.ae-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.ae-meta-item{font-size:.8125rem;color:#6b7280}@media(prefers-reduced-motion:reduce){.btn-nav,.btn-today,.filter-chip,.month-cell,.agenda-event{transition:none}}@media(pointer:coarse),(max-width:480px){.btn-nav,.btn-today,.filter-chip,.event-chip,.more-events,.allday-chip,.agenda-event{min-height:44px}.btn-nav{min-width:44px}}@media(max-width:768px){.cal-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 12px}.toolbar-left{flex:1 1 auto}.toolbar-right{flex:0 1 auto;min-width:0;max-width:100%}.toolbar-center{display:none}.period-label{font-size:1.875rem}.toolbar-right{justify-content:flex-end}.mobile-summary{display:block;margin-bottom:4px;flex-shrink:0}.mobile-summary:empty{display:none}.filter-chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;-webkit-overflow-scrolling:touch}.filter-main{flex-basis:100%}.month-view,.cal-skeleton,.outline-grid,.week-view{overflow-x:auto;-webkit-overflow-scrolling:touch}.month-grid,.skel-month-grid,.skel-week-grid,.skel-dow-row{min-width:560px}.month-row{flex-basis:80px}.month-cell{min-height:80px}.week-header,.allday-row,.week-body{min-width:640px}.agenda-date-hdr{width:76px;padding:12px 8px}.ae-title{font-size:.875rem}}@media(max-width:640px){.event-chip.stacked.has-head .chip-title{display:none}}@media(max-width:640px){.cal-toolbar{padding:14px}.period-label{font-size:1.625rem}.filter-bar{padding:10px 14px 12px}.filter-nav{width:100%;margin-left:0}.filter-nav .nav-controls{display:flex;width:100%}.filter-nav .btn-today{flex:1 1 auto}.chip-head{flex-wrap:wrap;row-gap:0;flex-shrink:1;min-width:0}.chip-time{white-space:normal;line-height:1.1;flex-shrink:1;min-width:0;overflow-wrap:anywhere}.event-chip.stacked{flex-wrap:nowrap}.month-view,.cal-skeleton,.outline-grid{overflow-x:hidden}.month-grid,.skel-month-grid,.skel-week-grid,.skel-dow-row{min-width:0}.month-dow{padding:8px 2px;font-size:.6875rem;letter-spacing:0}.month-row{flex-basis:72px}.month-cell{min-height:72px;padding:3px 2px 2px}.day-num{width:22px;height:22px;line-height:22px;font-size:.75rem;margin-bottom:2px}.cell-events{gap:1px}.event-chip{min-height:24px;padding:1px 3px;font-size:.625rem;gap:2px}.more-events{min-height:24px;padding:1px 3px;font-size:.625rem;white-space:normal;line-height:1.1;max-width:100%}}@media(max-width:480px){.dow-full{display:none}.dow-short{display:inline}}\n"]
|
|
41128
41562
|
}]
|
|
41129
41563
|
}],
|
|
41130
41564
|
ctorParameters: () => [],
|
|
@@ -41145,6 +41579,14 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
41145
41579
|
required: false
|
|
41146
41580
|
}]
|
|
41147
41581
|
}],
|
|
41582
|
+
loadingActions: [{
|
|
41583
|
+
type: i0.Input,
|
|
41584
|
+
args: [{
|
|
41585
|
+
isSignal: true,
|
|
41586
|
+
alias: "loadingActions",
|
|
41587
|
+
required: false
|
|
41588
|
+
}]
|
|
41589
|
+
}],
|
|
41148
41590
|
view: [{
|
|
41149
41591
|
type: i0.Input,
|
|
41150
41592
|
args: [{
|